(window.webpackJsonp = window.webpackJsonp || []).push([
["library"], {
"+2Ad": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "setupChartScreenshotHint", (function() {
return o
}));
var s = i("YFKU"),
r = i("FQhm"),
n = i("Eyy1");
function o(e, t) {
const o = Object(s.t)("Link to the chart image copied to clipboard {emoji}").format({
emoji: "👍"
}),
a = Object(s.t)("Chart image copied to clipboard {emoji}").format({
emoji: "👍"
});
r.on("onServerScreenshotCopiedToClipboard", () => h(o), null), r.on(
"onClientScreenshotCopiedToClipboard", () => h(a), null);
let l = null;
const c = e.getContainer();
function h(e) {
l ? l.show(e) : Promise.all([i.e("react"), i.e(84), i.e("chart-screenshot-hint")]).then(
i.bind(null, "USSy")).then(i => {
l || (l = new i.ChartScreenshotHintRenderer(Object(n.ensureNotNull)(c), {
bottomPadding: t.seriesControlBarEnabled
}), l.show(e))
})
}
}
},
"+6II": function(e, t, i) {
"use strict";
var s = i("8+VR");
let r = 0,
n = 0,
o = 0;
function a() {
clearTimeout(r), clearTimeout(n), clearTimeout(o)
}
function l(e, t) {
r = setTimeout(e, t)
}
const c = "tooltip-root-element";
let h;
function u() {
const e = document.getElementById(c);
e ? h = e : (h = document.createElement("div"), h.id = c, document.body.appendChild(h))
}
function d() {
h && (h.innerHTML = "")
}
"interactive" === document.readyState ? u() : document.addEventListener("DOMContentLoaded", u);
var p = i("Eyy1");
const _ = {
default: "",
white: "theme-white",
"round-shadow": "theme-round-shadow"
},
m = Object.keys(_);
var f = i("CPmC"),
g = i("/DW5"),
b = i("gWrr"),
v = i("Ialn"),
S = (i("HbRj"), i("XAms")),
y = i("Hr11"),
w = i("qFKp"),
P = i("Wo0S");
function C(e) {
const t = e.hasAttribute("data-tooltip") ? e.getAttribute("data-tooltip") : e.getAttribute(
"title");
return t && (Object(f.b)(e, "text", t), e.removeAttribute("title")), Object(f.a)(e,
"text") || ""
}
function x(e) {
const t = E.cloneNode(!0),
i = V(t),
{
content: s
} = e;
switch (s.type) {
case "element":
i.innerHTML = "", i.appendChild(s.data);
break;
case "html":
i.innerHTML = s.data;
break;
case "text":
if (e.hotkey) {
const e = D.cloneNode(!0);
e.innerText = s.data, i.appendChild(e)
} else i.innerText = s.data
}
if (e.hotkey) {
const t = "none" !== s.type,
r = k.cloneNode(!0),
n = Object(g.a)(e.hotkey),
o = n.keys.map(e =>
`${e}`);
r.innerHTML = function(e, t) {
return e.replace(/{\d}|{hotkey_\d}/gi, e => {
const i = Number(e.match(/\d/));
return t[i]
})
}(n.text, o).replace(/\s\+\s/g,
`+`), i.classList.add(P[
"common-tooltip__body--with-hotkey"]), t && r.classList.add(P[
"common-tooltip__hotkey-block--divider"]), i.appendChild(r)
}
return t.addEventListener("contextmenu", S.a), t
}
function T(e, t) {
const i = t.rect;
if (!i) return;
! function(e, t) {
const i = m.includes(t) ? _[t] : "";
e.classList.remove(...m.map(e => _[e]).filter(e => !!e)), i && !e.classList.contains(
i) && e.classList.add(i)
}(e, t.colorTheme || "default"), t.addClass && e.classList.add(t.addClass);
const s = V(e),
r = e.querySelector("." + P["common-tooltip__button-container"]);
s.classList.toggle(P["common-tooltip__body--width_wide"], Boolean(t.wide)), s.classList
.toggle(P["common-tooltip__body--no-padding"], Boolean(t.noPadding)), s.classList
.toggle(P["common-tooltip__body--width_narrow"], Boolean(t.narrow)),
s.classList.toggle(P["common-tooltip__body--no-buttons"], !0), s.style.left = M(0), s
.style.width = M(s.clientWidth + (Boolean(t.noPadding) ? 0 : 2));
const n = document.body.clientWidth,
o = w.CheckMobile.iOS() || Object(w.supportTouch)() && Object(w.isMac)() ? window
.innerHeight : document.body.clientHeight,
a = t.vertical,
l = t.extendMargin || a && i.w < 20 || !a && i.h < 20;
e.classList.toggle(P["common-tooltip--farther"], l), e.classList.toggle(P[
"common-tooltip--vertical"], a), e.classList.toggle(P["common-tooltip--horizontal"],
!a);
const c = function(e) {
return e.querySelector("." + P["common-tooltip__ear-holder"])
}(e),
h = e.offsetHeight;
if (a) {
const a = 10,
l = o - 10,
u = 12,
d = a + u,
p = l - u,
_ = Object(y.clamp)(i.y + i.h / 2, d, p) - h / 2,
m = _ + h;
e.style.left = M(i.x + i.w), e.style.top = M(_), _ < a ? s.style.top = r.style.top = M(
a - _) : m > l && (s.style.top = r.style.top = M(l - m));
const {
right: f
} = (e.querySelector(":last-child") || s).getBoundingClientRect(), g = f + 10 > n;
e.classList.toggle(P["common-tooltip--direction_reversed"], g), e.classList.toggle(P[
"common-tooltip--direction_normal"], !g);
let b = g ? "after" : "before";
Object(v.isRtl)() ? (b = t.otr ? "after" : b, b = t.otl ? "before" : b) : (b = t.otr ?
"before" : b, b = t.otl ? "after" : b), c.classList.toggle(P[
"common-tooltip__ear-holder--before"], "before" === b), c.classList.toggle(P[
"common-tooltip__ear-holder--after"], "after" === b), "after" === b && (e.style
.left = "auto", e.style.right = M(n - i.x))
} else {
const a = i.x - (s.offsetWidth - i.w) / 2,
l = n - 10 - e.offsetWidth,
u = Math.max(10, Math.min(a, l));
e.style.left = M(u);
const d = l < a;
e.classList.toggle(P["common-tooltip--direction_reversed"], d), e.classList.toggle(P[
"common-tooltip--direction_normal"], !d);
const p = function(e, t, i, s) {
if (e.above) return B(t, s) ? "above" : "below";
if (e.below) return function(e, t, i) {
return i.y + i.h + t + 10 < e
}(t, i, s) ? "below" : "above";
return B(i, s) ? "above" : "below"
}(t, o, h, i);
"above" === p ? e.style.bottom = M(o - i.y) : e.style.top = M(i.y + i.h), c.classList
.add("above" === p ? P["common-tooltip__ear-holder--above"] : P[
"common-tooltip__ear-holder--below"]);
const {
left: _
} = s.getBoundingClientRect();
let m = Math.trunc(i.x + i.w / 2 - (_ + s.clientWidth / 2));
e.style.left = M(u + m), e.style.width = M(s.clientWidth + r.clientWidth), m = d ? Math
.max(0, m) : Math.min(0, m), r.style.left = M(-m), s.style.left = M(-m)
}
}
function I(e) {
e.classList.toggle(P["common-tooltip--hidden"], !0)
}
function M(e) {
return Math.floor(e) + "px"
}
const O =
`\n\t
\n`,
L = `\n\t\n`,
A = `\n\t\n`,
E = Object(b.b)(O),
k = Object(b.b)(L),
D = Object(b.b)(A);
function V(e) {
return e.querySelector("." + P["common-tooltip__body"])
}
function B(e, t) {
return 10 + e < t.y
}
var R = i("lxNp");
i.d(t, "c", (function() {
return H
})), i.d(t, "b", (function() {
return U
})), i.d(t, "a", (function() {
return G
}));
let N = !1,
j = null,
F = null;
s.mobiletouch || document.addEventListener("mouseover", (function(e) {
var t;
if (null === (t = e.sourceCapabilities) || void 0 === t ? void 0 : t
.firesTouchEvents) return;
const i = e.target,
s = e.currentTarget,
r = function(e, t, i) {
const s = [];
for (; e && e !== t;) e.classList && e.classList.contains(i) && s.push(
e), e = e.parentElement || (r = e.parentNode) && (r.nodeType ===
Node.ELEMENT_NODE ? r : null);
var r;
return s
}(i, s, "apply-common-tooltip");
for (const t of r) {
if ("buttons" in e) {
if (1 & e.buttons) continue
} else if (1 === e.which) continue;
const i = () => H(t);
if (i()) {
const e = e => {
e.target instanceof Element && e.target.contains(t) && s(null, !
0)
},
s = (r, n = !1) => {
t.removeEventListener("common-tooltip-update", i), t
.removeEventListener("mouseleave", s), t
.removeEventListener("mousedown", s), document
.removeEventListener("scroll", e, {
capture: !0
}), F && (F.destroy(), F = null), G(n)
};
t.addEventListener("common-tooltip-update", i), t.addEventListener(
"mouseleave", s), t.addEventListener("mousedown", s), document
.addEventListener("scroll", e, {
capture: !0
}), null === F && (F = Object(R.createGroup)({
desc: "Tooltip"
}), F.add({
desc: "Hide",
hotkey: 27,
handler: s
}));
break
}
}
}), !0);
const W = new MutationObserver(() => {
if (j && j.options.target) {
let e;
e = "isConnected" in j.options.target ? j.options.target.isConnected : document
.body.contains(j.options.target), e || G()
}
}),
H = (e, t = {}) => {
const {
content: i,
...s
} = Y(t), r = function(e) {
const t = C(e),
i = e.getBoundingClientRect(),
s = {
h: i.height,
w: i.width,
x: i.left,
y: i.top
},
r = e.getAttribute("data-color-theme") || "",
n = e.classList.contains("common-tooltip-html"),
o = parseInt(e.getAttribute("data-tooltip-delay") || ""),
a = parseInt(e.getAttribute("data-tooltip-debounce") || "");
let l = {
type: "none"
};
return t && (l = {
type: n ? "html" : "text",
data: t
}), {
above: e.classList.contains("common-tooltip-above"),
below: e.classList.contains("common-tooltip-below"),
otl: e.classList.contains("common-tooltip-otl"),
otr: e.classList.contains("common-tooltip-otr"),
vertical: e.classList.contains("common-tooltip-vertical"),
hotkey: e.getAttribute("data-tooltip-hotkey"),
narrow: e.classList.contains("common-tooltip-narrow"),
wide: e.classList.contains("common-tooltip-wide"),
colorTheme: r,
tooltipDelay: o,
tooltipDebounce: a,
rect: s,
content: l,
target: e
}
}(e), n = Object.assign(r, s);
return "none" !== i.type && (n.content = i), !("none" === n.content.type && !n
.hotkey) && (n.target = e, U(n), !0)
},
U = e => {
const t = Y(e),
i = x(t);
var s;
if (j = {
options: t,
element: i
}, s = i, d(), h && h.appendChild(s), a(), !N) return I(i), void l(() => q(i),
function(e) {
return "number" != typeof e.tooltipDelay || isNaN(e.tooltipDelay) ?
500 : e.tooltipDelay
}(t));
const {
tooltipDebounce: r
} = e;
"number" != typeof r || isNaN(r) ? q(i) : l(() => q(i), r)
};
function z() {
d(), N = !1, j = null
}
const G = e => {
if (a(), W.disconnect(), !j) return;
if (!e && !N) return;
const {
element: t,
options: i
} = j, s = () => {
t.removeEventListener("mouseleave", s), I(t), e ? z() : o = setTimeout(() => {
z()
}, 250)
};
var r, l;
i.tooltipHideDelay ? (r = () => {
t.querySelector(":hover") ? t.addEventListener("mouseleave", s) : s()
}, l = i.tooltipHideDelay, n = setTimeout(r, l)) : s()
};
function q(e) {
const {
options: t
} = Object(p.ensureNotNull)(j);
if (T(e, t), function(e) {
e.classList.toggle(P["common-tooltip--hidden"], !1)
}(e), W.observe(document, {
childList: !0,
subtree: !0
}), N = !0, t.forceHideOnMove) {
const e = () => {
document.removeEventListener("mousemove", e), G()
};
document.addEventListener("mousemove", e)
}
}
function Y(e) {
if (function(e) {
return "content" in e
}(e)) return e;
const {
inner: t,
html: i,
text: s,
...r
} = e;
let n = {
type: "none"
};
return t && (n = {
type: "element",
data: t
}), s && (n = {
type: i ? "html" : "text",
data: s
}), {
content: n,
...r
}
}
},
"+6ja": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "availableTimezones", (function() {
return o
})), i.d(t, "timezoneIsAvailable", (function() {
return a
})), i.d(t, "timezoneTitle", (function() {
return l
}));
i("YFKU");
var s = i("/+9u");
const r = [{
id: "Etc/UTC",
title: window.t("UTC")
}, {
id: "exchange",
title: window.t("Exchange")
}],
n = [{
id: "Africa/Cairo",
title: window.t("Cairo"),
offset: 0
}, {
id: "Africa/Johannesburg",
title: window.t("Johannesburg"),
offset: 0
}, {
id: "Africa/Lagos",
title: window.t("Lagos"),
offset: 0
}, {
id: "America/Argentina/Buenos_Aires",
title: window.t("Buenos Aires"),
offset: 0
}, {
id: "America/Bogota",
title: window.t("Bogota"),
offset: 0
}, {
id: "America/Caracas",
title: window.t("Caracas"),
offset: 0
}, {
id: "America/Chicago",
title: window.t("Chicago"),
offset: 0
}, {
id: "America/El_Salvador",
title: window.t("San Salvador"),
offset: 0
}, {
id: "America/Juneau",
title: window.t("Juneau"),
offset: 0
}, {
id: "America/Lima",
title: window.t("Lima"),
offset: 0
}, {
id: "America/Los_Angeles",
title: window.t("Los Angeles"),
offset: 0
}, {
id: "America/Mexico_City",
title: window.t("Mexico City"),
offset: 0
}, {
id: "America/New_York",
title: window.t("New York"),
offset: 0
}, {
id: "America/Phoenix",
title: window.t("Phoenix"),
offset: 0
}, {
id: "America/Santiago",
title: window.t("Santiago"),
offset: 0
}, {
id: "America/Sao_Paulo",
title: window.t("Sao Paulo"),
offset: 0
}, {
id: "America/Toronto",
title: window.t("Toronto"),
offset: 0
}, {
id: "America/Vancouver",
title: window.t("Vancouver"),
offset: 0
}, {
id: "US/Mountain",
title: window.t("Denver"),
offset: 0
}, {
id: "Asia/Almaty",
title: window.t("Almaty"),
offset: 0
}, {
id: "Asia/Ashkhabad",
title: window.t("Ashkhabad"),
offset: 0
}, {
id: "Asia/Bahrain",
title: window.t("Bahrain"),
offset: 0
}, {
id: "Asia/Bangkok",
title: window.t("Bangkok"),
offset: 0
}, {
id: "Asia/Chongqing",
title: window.t("Chongqing"),
offset: 0
}, {
id: "Asia/Dubai",
title: window.t("Dubai"),
offset: 0
}, {
id: "Asia/Ho_Chi_Minh",
title: window.t("Ho Chi Minh"),
offset: 0
}, {
id: "Asia/Hong_Kong",
title: window.t("Hong Kong"),
offset: 0
}, {
id: "Asia/Jakarta",
title: window.t("Jakarta"),
offset: 0
}, {
id: "Asia/Jerusalem",
title: window.t("Jerusalem"),
offset: 0
}, {
id: "Asia/Kolkata",
title: window.t("Kolkata"),
offset: 0
}, {
id: "Asia/Kuwait",
title: window.t("Kuwait"),
offset: 0
}, {
id: "Asia/Muscat",
title: window.t("Muscat"),
offset: 0
}, {
id: "Asia/Qatar",
title: window.t("Qatar"),
offset: 0
}, {
id: "Asia/Riyadh",
title: window.t("Riyadh"),
offset: 0
}, {
id: "Asia/Seoul",
title: window.t("Seoul"),
offset: 0
}, {
id: "Asia/Shanghai",
title: window.t("Shanghai"),
offset: 0
}, {
id: "Asia/Singapore",
title: window.t("Singapore"),
offset: 0
}, {
id: "Asia/Taipei",
title: window.t("Taipei"),
offset: 0
}, {
id: "Asia/Tehran",
title: window.t("Tehran"),
offset: 0
}, {
id: "Asia/Tokyo",
title: window.t("Tokyo"),
offset: 0
}, {
id: "Atlantic/Reykjavik",
title: window.t("Reykjavik"),
offset: 0
}, {
id: "Australia/Adelaide",
title: window.t("Adelaide"),
offset: 0
}, {
id: "Australia/Brisbane",
title: window.t("Brisbane"),
offset: 0
}, {
id: "Australia/Perth",
title: window.t("Perth"),
offset: 0
}, {
id: "Australia/Sydney",
title: window.t("Sydney"),
offset: 0
}, {
id: "Europe/Amsterdam",
title: window.t("Amsterdam"),
offset: 0
}, {
id: "Europe/Athens",
title: window.t("Athens"),
offset: 0
}, {
id: "Europe/Belgrade",
title: window.t("Belgrade"),
offset: 0
}, {
id: "Europe/Berlin",
title: window.t("Berlin"),
offset: 0
}, {
id: "Europe/Brussels",
title: window.t("Brussels"),
offset: 0
}, {
id: "Europe/Copenhagen",
title: window.t("Copenhagen"),
offset: 0
}, {
id: "Europe/Dublin",
title: window.t("Dublin"),
offset: 0
}, {
id: "Europe/Helsinki",
title: window.t("Helsinki"),
offset: 0
}, {
id: "Europe/Istanbul",
title: window.t("Istanbul"),
offset: 0
}, {
id: "Europe/Lisbon",
title: window.t("Lisbon"),
offset: 0
}, {
id: "Europe/London",
title: window.t("London"),
offset: 0
}, {
id: "Europe/Luxembourg",
title: window.t("Luxembourg"),
offset: 0
}, {
id: "Europe/Madrid",
title: window.t("Madrid"),
offset: 0
}, {
id: "Europe/Malta",
title: window.t("Malta"),
offset: 0
}, {
id: "Europe/Moscow",
title: window.t("Moscow"),
offset: 0
}, {
id: "Europe/Oslo",
title: window.t("Oslo"),
offset: 0
}, {
id: "Europe/Paris",
title: window.t("Paris"),
offset: 0
}, {
id: "Europe/Riga",
title: window.t("Riga"),
offset: 0
}, {
id: "Europe/Rome",
title: window.t("Rome"),
offset: 0
}, {
id: "Europe/Stockholm",
title: window.t("Stockholm"),
offset: 0
}, {
id: "Europe/Tallinn",
title: window.t("Tallinn"),
offset: 0
}, {
id: "Europe/Vilnius",
title: window.t("Vilnius"),
offset: 0
}, {
id: "Europe/Warsaw",
title: window.t("Warsaw"),
offset: 0
}, {
id: "Europe/Zurich",
title: window.t("Zurich"),
offset: 0
}, {
id: "Pacific/Auckland",
title: window.t("New Zealand"),
offset: 0
}, {
id: "Pacific/Chatham",
title: window.t("Chatham Islands"),
offset: 0
}, {
id: "Pacific/Fakaofo",
title: window.t("Tokelau"),
offset: 0
}, {
id: "Pacific/Honolulu",
title: window.t("Honolulu"),
offset: 0
}, {
id: "Pacific/Norfolk",
title: window.t("Norfolk Island"),
offset: 0
}];
for (const e of n) {
const t = Object(s.a)(e.id);
e.title = `(${t.string}) ${e.title}`, e.offset = t.offset
}
n.sort((e, t) => {
const i = e.offset - t.offset;
return 0 !== i ? i : e.title.localeCompare(t.title)
});
const o = r.concat(n);
function a(e) {
for (let t = 0; t < o.length; t++)
if (e === o[t].id) return !0;
return !1
}
function l(e) {
for (const t of o)
if (t.id === e) return t.title;
return e
}
},
"+DwS": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("hY0g"),
r = i.n(s);
function n(e, t) {
const i = new r.a(e()),
s = {};
t.subscribe(s, () => {
i.setValue(e())
});
return i.readonly().spawn(() => t.unsubscribeAll(s))
}
},
"+FzY": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("VymR");
function r(e, t) {
let i = "";
return s.a.parse(e, e => (i = s.a.base + ("svg" === t ? `svg/${e}.svg` : `72x72/${e}.png`),
!1)), i
}
},
"+GxX": function(e, t, i) {
"use strict";
var s = i("VVxS").TVLocalStorage,
r = i("aIyQ");
i("qFKp");
var n = new r;
TradingView.FeatureToggle = {
force_prefix: "forcefeaturetoggle.",
onChanged: new r,
enableFeature: function(e) {
s.setItem(this.force_prefix + e, "true"), n.fire(e)
},
disableFeature: function(e) {
s.setItem(this.force_prefix + e, "false"), n.fire(e)
},
resetFeature: function(e) {
s.removeItem(this.force_prefix + e), n.fire(e)
},
onFeaturesStateChanged: function() {
return n
}
},
TradingView.isFeatureEnabled = function(e) {
function t(e) {
try {
var t = (void 0)(e + function() {
if (window.user && window.user.id) return window.user.id;
var e = s.getItem("featuretoggle_seed");
return null !== e || (e = Math.floor(1e6 * Math.random()), s
.setItem("featuretoggle_seed", e)), e
}());
return new DataView(t).getUint32(0, !0) / 4294967296
} catch (e) {
return .5
}
}
return function(i) {
return !("local" !== window.environment || ! function(e) {
return -1 === ["broker_FXCM_token_v2", "broker_TRADESTATION_V3",
"broker_TRADOVATE_dev", "black_friday_mainpage",
"black_friday_popup", "datawindow",
"trading-fast-renew-oauth-token",
"switching_trial_year_to_month_disabled",
"switching_year_to_month_disabled",
"default_year_billing_cycle_switcher",
"marketing-analytics", "disable_obs_streaming",
"google-ads", "visible_address_fields_by_default",
"slow-support-warning", "hide-trading-floating-toolbar",
"tvcoins_donations", "save-short-streams",
"details_disable_bid_ask", "vat_disabled",
"pro_plan_upgrades_disabled",
"pro_plan_downgrades_disabled", "video-ideas-new-api",
"unit_conversion", "disable_recaptcha_on_signup",
"braintree-trial-implementation",
"braintree-gopro-in-order-dialog", "trial-weekly",
"braintree-apple-pay", "braintree-google-pay",
"braintree-apple-pay-trial", "braintree-google-pay-trial",
"hide_gopro_popup_upgrade_button", "yandex_metric_enabled",
"broker_id_session", "remove_line_tools_from_content",
"chart_storage_with_broker_name",
"autosave_line_tools_immediately",
"log_removing_line_tools_group",
"oanda-european-accounts-warning",
"mobile_show_bottom_panel", "disable_save_settings",
"enable_non_unique_watch_sections",
"desktop_version_notification_enabled", "paperrest_2fa",
"paperrest_preview", "favorites-in-broker-dropdown",
"streams_stats_profile", "hide_ecomonic_events",
"aggregating_page_pings", "hide_alert_counter",
"mobile_menu_alert_button",
"show_reverse_on_active_source_only", "mobile_trading_web",
"mobile_trading_ios", "mobile_trading_android",
"hide_real_brokers_on_mobile",
"percentage_values_for_percentage_scale",
"hide_historical_price_label", "hide_ranges_label_colors",
"new_align_trading_sources"
].indexOf(e) && -1 === e.indexOf("-maintenance") && !1 ===
/broker_[A-Z]+[a-zA-Z0-9_]+_dev/g.test(e)
}(i)) || (!e[i] || -1 !== e[i]) && (!!("true" === s.getItem(TradingView
.FeatureToggle.force_prefix + i) || window.is_authenticated &&
"undefined" != typeof user && user.settings && "true" === user
.settings[TradingView.FeatureToggle.force_prefix + i]) || !(
"false" === s.getItem(TradingView.FeatureToggle.force_prefix + i) ||
window.is_authenticated && "undefined" != typeof user && user
.settings && "false" === user.settings[TradingView.FeatureToggle
.force_prefix + i]) && (!!e[i] && (1 === e[i] || t(i) <= e[i])))
}
}(window.featureToggleState || {}), t.FeatureToggle = TradingView.FeatureToggle, t
.isFeatureEnabled = TradingView.isFeatureEnabled, t.onFeaturesStateChanged = TradingView
.FeatureToggle.onFeaturesStateChanged.bind(TradingView.FeatureToggle)
},
"+PIq": function(e, t, i) {
"use strict";
i.r(t);
var s = i("ocLq");
function r(e, t, i) {
const r = {
slope: NaN,
average: NaN,
intercept: NaN,
stdDev: NaN,
upDev: NaN,
downDev: NaN,
pearsons: NaN
};
return 0 === e.length || (function(e, t) {
let i = 0,
s = 0,
r = 0,
n = 0;
for (let t = 0; t < e.length; ++t) {
const o = e[t],
a = t + 1;
i += a, s += o, r += a * a, n += o * a
}
t.slope = (e.length * n - i * s) / (e.length * r - i * i), t.average = s / e
.length, t.intercept = t.average - t.slope * i / e.length + t.slope
}(e, r), function(e, t, i, r) {
let n = 0,
o = 0,
a = 0,
l = 0,
c = 0,
h = 0,
u = r.intercept;
const d = e.length - 1,
p = r.intercept + r.slope * d / 2;
for (let s = 0; s <= d; ++s) {
let d = t[s] - u;
d > n && (n = d), d = u - i[s], d > o && (o = d), d = e[s];
const _ = d - r.average,
m = u - p;
d -= u, a += d * d, l += _ * _, c += m * m, h += _ * m, u += r.slope
}
r.stdDev = Math.sqrt(a / (0 === d ? 1 : d)), r.pearsons = s.Std.isZero(l) || s
.Std.isZero(c) ? 0 : h / Math.sqrt(l * c), r.upDev = n, r.downDev = o
}(e, t, i, r)), r
}
i.d(t, "regressionTrendStudyItem", (function() {
return n
}));
const n = {
name: "Regression Trend",
metainfo: {
_metainfoVersion: 51,
description: "Regression Trend",
format: {
type: "inherit"
},
id: "RegressionTrend@tv-basicstudies-144",
is_hidden_study: !0,
is_price_study: !0,
shortDescription: "Reg Trend",
defaults: {
inputs: {
"first bar time": 0,
"last bar time": 0,
"lower diviation": -2,
source: "close",
"upper diviation": 2,
"use lower diviation": !0,
"use upper diviation": !0
}
},
inputs: [{
defval: 2,
id: "upper diviation",
max: 500,
min: -500,
name: "Upper Deviation",
type: "float"
}, {
defval: -2,
id: "lower diviation",
max: 500,
min: -500,
name: "Lower Deviation",
type: "float"
}, {
defval: !0,
id: "use upper diviation",
name: "Use Upper Deviation",
type: "bool"
}, {
defval: !0,
id: "use lower diviation",
name: "Use Lower Deviation",
type: "bool"
}, {
defval: 0,
id: "first bar time",
isHidden: !0,
max: 253370764800,
min: -253370764800,
name: "First bar time",
type: "time"
}, {
defval: 0,
id: "last bar time",
isHidden: !0,
max: 253370764800,
min: -253370764800,
name: "Last bar time",
type: "time"
}, {
defval: "close",
id: "source",
name: "Source",
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"],
type: "source"
}],
plots: []
},
constructor: class {
constructor() {
this._resultSent = !1
}
init(e, t) {
this._resultSent = !1, this._data = {
baseLine: {
startPrice: NaN,
endPrice: NaN
},
upLine: {
startPrice: NaN,
endPrice: NaN
},
downLine: {
startPrice: NaN,
endPrice: NaN
},
pearsons: NaN,
startIndex__t: NaN,
endIndex__t: NaN
}
}
main(e, t) {
const i = t(6),
n = e.new_unlimited_var(s.Std.time(e)),
o = e.new_unlimited_var(s.Std.high(e)),
a = e.new_unlimited_var(s.Std.low(e)),
l = e.new_unlimited_var(s.Std[i](e));
if (!e.symbol.isLastBar) return null;
if (this._resultSent) return null;
const c = t(0),
h = t(1),
u = t(2),
d = t(3),
p = t(4),
_ = t(5),
m = n.indexOf(p),
f = n.indexOf(_),
g = [],
b = [],
v = [],
S = [];
for (let e = m; e >= f; --e) g.push(n.get(e)), b.push(o.get(e)), v.push(
a.get(e)), S.push(l.get(e));
return this._updateData(g, u, c, d, h, p, _, r(S, b, v)), this
._resultSent = !0, {
type: "non_series_data",
nonseries: !0,
data: {
data: this._data
}
}
}
_updateData(e, t, i, s, r, n, o, a) {
const l = e.length - 1;
this._data.baseLine.startPrice = a.intercept, this._data.baseLine
.endPrice = a.intercept + a.slope * l;
const c = a.intercept + (t ? a.stdDev * i : a.upDev);
this._data.upLine.startPrice = c, this._data.upLine.endPrice = c + a
.slope * l;
const h = a.intercept + (s ? a.stdDev * r : -a.downDev);
this._data.downLine.startPrice = h, this._data.downLine.endPrice = h + a
.slope * l, this._data.pearsons = a.pearsons, this._data
.startIndex__t = n, this._data.endIndex__t = o
}
}
}
},
"+Qfv": function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("O+9b"),
n = i("ocLq"),
o = i("23IT"),
a = i("KG+6"),
l = i("LxhU"),
c = i("8LSp"),
h = i("iu9X"),
u = i("c7G1"),
d = i("WYmP"),
p = i("hXqA"),
_ = i("WTyR"),
m = i("972a"),
f = i("aR4w");
class g extends f.a {
constructor(e, t, i, s, r, n, o, a, l, c, h, u) {
super(e, t, i, n, o, a, !1, l, c, () => h, u, s, r, !1), this._firstBarTime = s,
this._lastBarTime = r
}
update(e) {
this._supplyRowsLayout(this._ctx), this.timeInRequestedRange(e) && super.update(
e)
}
timeInRequestedRange(e) {
const t = this._timeScale().get(e);
return this._firstBarTime <= t && t < this._lastBarTime
}
}
var b = i("rWtV");
i.d(t, "VolumeProfileFixedRange", (function() {
return v
})), i.d(t, "volumeProfileFixedRangeVbPStudyItem", (function() {
return y
})), i.d(t, "volumeProfileFixedRangeBSStudyItem", (function() {
return w
}));
class v extends r.a {
constructor() {
super(...arguments), this._rowsLayout = "Number Of Rows", this._rowSize = 24,
this._volume = "Up/Down", this._firstBarTime = 0, this._lastBarTime = 0,
this._vaVolumePercent = 70, this._anInt = 0, this._eraseCmds = []
}
nextGraphicsObjId() {
return ++this._anInt
}
pushEraseObjCmd(e, t) {
this._eraseCmds.push(new u.b(e, t))
}
popEraseCmds() {
const e = this._eraseCmds;
return this._eraseCmds = [], e
}
init(e, t) {
this._studyDataUpdate = new p.a(!0), this._hists = new c.a, this._boxPolygons =
new d.a, this._pocLines = new d.a, this._valueAreaHists = new c.a;
const i = new h.b;
i.getObjsContainer("hhists").push(new h.a("histBars2", this._hists)), i
.getObjsContainer("hhists").push(new h.a("histBarsVA", this
._valueAreaHists)), i.getObjsContainer("horizlines").push(new h.a(
"pocLines", this._pocLines)), i.getObjsContainer("polygons").push(new h
.a("histBoxBg", this._boxPolygons)), this._studyDataUpdate.init(i), this
._rowsLayout = t(0), this._rowSize = t(1), this._volume = t(2), this
._firstBarTime = t(3), this._lastBarTime = t(4), this._vaVolumePercent = t(
5), this.verifyRowSizeInput(this._rowSize, this._rowsLayout), this
._originalResolution = l.Interval.parse(e.symbol.interval + e.symbol
.resolution);
const n = this._lastBarTime + this._originalResolution.inMilliseconds(this
._lastBarTime);
0 === this._firstBarTime && 0 === this._lastBarTime ? this._basicResolution =
this._originalResolution : this._basicResolution = this
.findBasicResolutionForFromTo(this._originalResolution, this._firstBarTime,
n, Object(s.ensureDefined)(e.symbol.info)), this._hasSecondarySymbol = !
this._originalResolution.isEqualTo(this._basicResolution), this
._hasSecondarySymbol && e.new_sym(e.symbol.tickerid, this._basicResolution
.value());
const o = this._getRowsLayout(this._rowsLayout, this._rowSize);
this._vbPCheckHaveVolumeExpr = new _.a(this), this._volumeByPriceExpr = new g(
Object(r.c)(this._volume), e, this, this._firstBarTime, n, this._hists,
this._boxPolygons, this._pocLines, this._valueAreaHists, this
._vaVolumePercent, o, Object(r.b)()), this._volumeByPriceExpr
.setIdsGeneratorProxy(this), this._developingPocSeries = new b.a, this
._developingVAHighSeries = new b.a, this._developingVALowSeries = new b.a
}
main(e, t, i) {
this._hasSecondarySymbol && e.select_sym(1), this._timeSeries = e
.new_unlimited_var(), this._openSeries = e.new_unlimited_var(), this
._highSeries = e.new_unlimited_var(), this._lowSeries = e
.new_unlimited_var(), this._closeSeries = e.new_unlimited_var(),
this._volumeSeries = e.new_unlimited_var();
const r = {
type: "composite",
data: []
};
if (i && i.period === this._basicResolution.value() && (this._timeSeries.set(n
.Std.time(e)), this._openSeries.set(n.Std.open(e)), this._highSeries
.set(n.Std.high(e)), this._lowSeries.set(n.Std.low(e)), this
._closeSeries.set(n.Std.close(e)), this._volumeSeries.set(n.Std.volume(
e)), this._developingPocSeries.addHist(n.Std.time(e)), this
._developingVAHighSeries.addHist(n.Std.time(e)), this
._developingVALowSeries.addHist(n.Std.time(e)), this
._vbPCheckHaveVolumeExpr.update(0, e.symbol.isLastBar), this
._volumeByPriceExpr.update(0), this._developingPocSeries
.removeLastIfNaN(), this._developingVAHighSeries.removeLastIfNaN(), this
._developingVALowSeries.removeLastIfNaN(), e.symbol.isLastBar)) {
this._studyDataUpdate.setEraseCmds(this.popEraseCmds()), this
._studyDataUpdate.update();
const e = this._studyDataUpdate.getUpdate();
e.json && r.data.push({
nonseries: !0,
type: "study_graphics",
data: e.json
}), e.jsonUpdate && r.data.push({
nonseries: !0,
type: "study_graphics",
data: e.jsonUpdate
})
}
if (this._hasSecondarySymbol && e.select_sym(0), i && i.period === this
._originalResolution.value()) {
Object(s.assert)(e.symbol.time === i.time);
const t = i.time,
n = t + this._originalResolution.inMilliseconds(t) - 1;
if (t && t >= this._firstBarTime) {
const e = this._developingPocSeries.getLeftOrEqual(n),
t = this._developingVAHighSeries.getLeftOrEqual(n),
i = this._developingVALowSeries.getLeftOrEqual(n);
r.data.push([e, t, i])
} else r.data.push([NaN, NaN, NaN])
}
return r
}
time() {
return this._timeSeries
}
open() {
return this._openSeries
}
high() {
return this._highSeries
}
low() {
return this._lowSeries
}
close() {
return this._closeSeries
}
volume() {
return this._volumeSeries
}
developingPoc() {
return this._developingPocSeries
}
developingVAHigh() {
return this._developingVAHighSeries
}
developingVALow() {
return this._developingVALowSeries
}
}
function S(e) {
return {
constructor: v,
name: e.description,
metainfo: {
_metainfoVersion: 51,
shortDescription: "VPFR",
format: {
type: "volume"
},
is_price_study: !0,
defaults: {
graphics: {
hhists: {
histBars2: {
colors: ["#1592e6", "#fbc123"],
direction: a.a.LeftToRight,
percentWidth: 30,
showValues: !1,
transparencies: [76, 76],
valuesColor: "#424242",
visible: !0
},
histBarsVA: {
colors: ["#1592e6", "#fbc123"],
direction: a.a.LeftToRight,
percentWidth: 30,
showValues: !1,
transparencies: [30, 30],
valuesColor: "#424242",
visible: !0
}
},
horizlines: {
pocLines: {
color: "#ff0000",
style: m.b.Solid,
visible: !0,
width: 2
}
},
polygons: {
histBoxBg: {
color: "#37a6ef",
transparency: 94
}
}
},
inputs: {
first_bar_time: 0,
last_bar_time: 0,
rows: 24,
rowsLayout: "Number Of Rows",
subscribeRealtime: !0,
vaVolume: 70,
volume: "Up/Down"
},
styles: {
developingPoc: {
color: "#ff0000",
linestyle: m.b.Solid,
linewidth: 1,
plottype: o.LineStudyPlotStyle.StepLine,
trackPrice: !1,
transparency: 0,
visible: !1
},
developingVAHigh: {
color: "#0000ff",
linestyle: m.b.Solid,
linewidth: 1,
plottype: o.LineStudyPlotStyle.StepLine,
trackPrice: !1,
transparency: 0,
visible: !1
},
developingVALow: {
color: "#0000ff",
linestyle: m.b.Solid,
linewidth: 1,
plottype: o.LineStudyPlotStyle.StepLine,
trackPrice: !1,
transparency: 0,
visible: !1
}
}
},
graphics: {
hhists: {
histBars2: {
location: a.b.Absolute,
title: "Volume Profile",
titles: ["Up Volume", "Down Volume"]
},
histBarsVA: {
location: a.b.Absolute,
title: "Value Area",
titles: ["Value Area Up", "Value Area Down"]
}
},
horizlines: {
pocLines: {
name: "POC",
showPrice: !0
}
},
polygons: {
histBoxBg: {
mouseTouchable: !1,
name: "Histogram Box",
showBorder: !1
}
}
},
inputs: [{
defval: "Number Of Rows",
id: "rowsLayout",
name: "Rows Layout",
options: ["Number Of Rows", "Ticks Per Row"],
type: "text"
}, {
defval: 24,
id: "rows",
max: 1e6,
min: 1,
name: "Row Size",
type: "integer"
}, {
defval: "Up/Down",
id: "volume",
name: "Volume",
options: ["Up/Down", "Total"],
type: "text"
}, {
defval: 0,
id: "first_bar_time",
isHidden: !0,
max: 253370764800,
min: -253370764800,
name: "First Bar Time",
type: "time"
}, {
defval: 0,
id: "last_bar_time",
isHidden: !0,
max: 253370764800,
min: -253370764800,
name: "Last Bar Time",
type: "time"
}, {
defval: 70,
id: "vaVolume",
max: 100,
min: 0,
name: "Value Area Volume",
type: "integer"
}, {
defval: !0,
id: "subscribeRealtime",
isHidden: !0,
name: "SubscribeRealtime",
type: "bool"
}],
plots: [{
id: "developingPoc",
type: "line"
}, {
id: "developingVAHigh",
type: "line"
}, {
id: "developingVALow",
type: "line"
}],
styles: {
developingPoc: {
histogramBase: 0,
title: "Developing Poc"
},
developingVAHigh: {
histogramBase: 0,
title: "Developing VA High"
},
developingVALow: {
histogramBase: 0,
title: "Developing VA Low"
}
},
...e
}
}
}
const y = S({
id: "VbPFixed@tv-volumebyprice-57",
description: "Volume Profile Fixed Range"
}),
w = S({
id: "VbPFixed@tv-basicstudies-152",
description: "Fixed Range",
is_hidden_study: !0
})
},
"+cnz": function(e, t) {
e.exports =
''
},
"+hLl": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolBrush", (function() {
return o
}));
var s = i("Ocx9"),
r = i("DVnF"),
n = i("j3hX");
class o extends r.a {
constructor(e, t) {
super(e, t || o.createProperties()), this._loadPaneViews(e)
}
properties() {
return super.properties()
}
smooth() {
return this.properties().childs().smooth.value()
}
name() {
return "Brush"
}
hasEditableCoordinates() {
return !1
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolbrush", e);
return o._configureProperties(t), t
}
_loadPaneViews(e) {
i.e("lt-pane-views").then(i.bind(null, "00XE")).then(t => {
this._setPaneViews([new t.BrushPaneView(this, e)])
})
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "ZSes")).then(
e => e.BrushDefinitionsViewModel)
}
static _configureProperties(e) {
r.a._configureProperties(e), e.addChild("backgroundsColors", new n
.LineToolColorsProperty([e.childs().backgroundColor], e.childs()
.fillBackground))
}
}
},
"+jnJ": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return a
}));
i("YFKU");
var s = i("8+VR"),
r = i("m/cY"),
n = i("Vdly");
function o(e) {
return "alwaysOn" === e || "alwaysOff" === e ? e : "visibleOnMouseOver"
}
function a(e, t) {
let i, a;
function l() {
if (!i) {
i = Object(r.a)();
let s = n.getValue(e);
void 0 === s && void 0 !== t && (s = n.getValue(t)), i.setValue(o(s)), i.subscribe(
i, t => {
n.setValue(e, o(t.value()))
})
}
return i
}
return {
property: l,
availableValues: function() {
return [{
id: "visibleOnMouseOver",
value: "visibleOnMouseOver",
title: window.t("Visible on Mouse Over")
}, {
id: "alwaysOn",
value: "alwaysOn",
title: window.t("Always Visible")
}, {
id: "alwaysOff",
value: "alwaysOff",
title: window.t("Always Invisible")
}]
},
actualBehavior: function() {
if (!a) {
a = Object(r.a)();
const e = l(),
t = () => {
let t = e.value();
"alwaysOn" !== t && "alwaysOff" !== t && (t = s.mobiletouch ?
"alwaysOn" : "visibleOnMouseOver"), a && a.setValue(t)
};
e.subscribe(a, t), t()
}
return a
}
}
}
},
"/+9u": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("jCNj");
function r(e, t = Date.now()) {
const i = Object(s.get_timezone)(e).offset_utc(t);
let r = "";
const n = i / 1e3 / 60 / 60;
n % 1 && (r = ":" + n % 1 * 60);
let o = "";
return o = n > 0 ? "+" + (n - n % 1) + r : 0 === n ? "" : String(n - n % 1 + r), {
offset: i,
string: "UTC" + o
}
}
},
"//lZ": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "doAnimate", (function() {
return n
}));
const s = {
from: 0,
duration: 250,
easing: i("9uLv").c.easeOutCubic
};
class r {
constructor(e) {
this._doing = !0, this._completed = !1, this._options = {
...s,
...e
};
const t = performance.now();
window.requestAnimationFrame(e => {
this._animation(t, this._options.from, e)
})
}
stop() {
this._doing = !1
}
completed() {
return this._completed
}
_animation(e, t, i) {
if (!this._doing) return void this._finishAnimation();
const s = (i = !i || i < 1e12 ? performance.now() : i) - e,
r = s >= this._options.duration || t === this._options.to,
n = (o = this._options.from, a = this._options.to, l = this._options.easing(s /
this._options.duration), o * (1 - l) + a * l);
var o, a, l;
const c = r ? this._options.to : n,
h = c - t;
this._options.onStep(h, c), r ? this._finishAnimation() : window
.requestAnimationFrame(t => {
this._animation(e, c, t)
})
}
_finishAnimation() {
this._options.onComplete && this._options.onComplete(), this._completed = !0
}
}
function n(e) {
return new r(e)
}
},
"//lt": function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "PaneCursorType", (function() {
return s
})),
function(e) {
e[e.Default = 0] = "Default", e[e.Pointer = 1] = "Pointer", e[e.Eraser = 2] = "Eraser",
e[e.Dot = 3] = "Dot", e[e.Grabbing = 4] = "Grabbing", e[e.ZoomIn = 5] = "ZoomIn", e[
e.VerticalResize = 6] = "VerticalResize", e[e.HorizontalResize = 7] =
"HorizontalResize", e[e.DiagonalNeSwResize = 8] = "DiagonalNeSwResize", e[e
.DiagonalNwSeResize = 9] = "DiagonalNwSeResize"
}(s || (s = {}))
},
"/3z9": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "isMacKeyboard", (function() {
return r
})), i.d(t, "Modifiers", (function() {
return n
})), i.d(t, "modifiersFromEvent", (function() {
return o
})), i.d(t, "hashFromEvent", (function() {
return a
})), i.d(t, "humanReadableModifiers", (function() {
return l
})), i.d(t, "humanReadableHash", (function() {
return h
}));
var s = i("qFKp");
const r = Object(s.isMac)() || s.CheckMobile.iOS();
var n;
function o(e) {
let t = 0;
return e.shiftKey && (t += 1024), e.altKey && (t += 512), e.ctrlKey && (t += 256), e
.metaKey && (t += 2048), t
}
function a(e) {
return o(e) | e.keyCode
}
function l(e) {
let t = "";
return 256 & e && (t += r ? "^" : "Ctrl + "), 512 & e && (t += r ? "⌥" : "Alt + "), 1024 &
e && (t += r ? "⇧" : "Shift + "), 2048 & e && (t += r ? "⌘" : "Win + "), t
}! function(e) {
e[e.None = 0] = "None", e[e.Alt = 512] = "Alt", e[e.Shift = 1024] = "Shift", e[e.Mod = r ?
2048 : 256] = "Mod", e[e.Control = 256] = "Control", e[e.Meta = 2048] = "Meta"
}(n || (n = {}));
const c = {
9: "⇥",
13: "↵",
27: "Esc",
8: r ? "⌫" : "Backspace",
32: "Space",
35: "End",
36: "Home",
37: "←",
38: "↑",
39: "→",
40: "↓",
45: "Ins",
46: "Del",
188: ",",
191: "/"
};
for (let e = 1; e <= 16; e++) c[e + 111] = "F" + e;
function h(e) {
let t = l(e);
const i = 255 & e;
return t += i in c ? c[i] : String.fromCharCode(i), t
}
},
"/5ju": function(e, t, i) {
"use strict";
i.r(t);
var s = i("Kxc7"),
r = i("hY0g"),
n = i.n(r),
o = i("FQhm"),
a = i("htUT"),
l = i("/z0S"),
c = i("YFKU");
i("HbRj"), i("+GxX");
i("zUrt");
async function h() {
return !0
}
var u = i("fZEr");
class d {
constructor(e, t) {
this._visibility = new n.a(!1), this._chartWidgetCollection = e, this._doSave = t
}
hide() {
var e;
null === (e = this._hide) || void 0 === e || e.call(this), this._visibility
.setValue(!1)
}
visible() {
return this._visibility.readonly()
}
}
class p extends d {
cloneChart() {
this._cloneChart().then(() => this._visibility.setValue(!0))
}
show() {
Object(l.a)(this.cloneChart.bind(this), {
source: "Clone chart"
})
}
async _cloneChart() {
const e = this._chartWidgetCollection,
t = await h(),
i = e.metaInfo.name.value();
t && (this._hide = await Object(u.showRename)({
title: Object(c.t)("Copy Chart Layout"),
text: Object(c.t)("Enter a new chart layout name") + ":",
maxLength: 64,
initValue: Object(c.t)("{title} copy", {
context: "ex: AAPL chart copy"
}).format({
title: e.metaInfo.name.value()
}),
onRename: ({
newValue: t,
dialogClose: r
}) => {
s.enabled("saveload_storage_customization") && (e.metaInfo
.uid.deleteValue(), e.metaInfo.id.deleteValue(), e
.metaInfo.name.setValue(t), this._doSave(void 0,
void 0, () => {
e.metaInfo.name.setValue(i)
})), r()
},
onClose: () => this._visibility.setValue(!1)
}))
}
}
class _ extends d {
show(e, t, i) {
this._saveNewChart(e, t, i).then(() => this._visibility.setValue(!0))
}
async _saveNewChart(e, t, i) {
const s = this._chartWidgetCollection,
r = s.metaInfo.name.value();
await h() && (this._hide = await Object(u.showRename)({
title: Object(c.t)("Save New Chart Layout"),
text: Object(c.t)("Enter a new chart layout name") + ":",
maxLength: 64,
initValue: r,
onRename: ({
newValue: n,
dialogClose: o
}) => {
s.metaInfo.name.setValue(n), this._doSave(e, t, () => {
s.metaInfo.name.setValue(r), null == i || i()
}), o()
},
onClose: () => this._visibility.setValue(!1)
}))
}
}
class m extends d {
show() {
this._renameChart(), this._visibility.setValue(!0)
}
_renameChart() {
Object(l.a)(async () => {
const e = this._chartWidgetCollection,
t = e.metaInfo.name.value();
this._hide = await Object(u.showRename)({
title: Object(c.t)("Rename Chart Layout"),
text: Object(c.t)("Enter a new chart layout name") +
":",
maxLength: 64,
initValue: t,
onRename: ({
newValue: i,
dialogClose: s
}) => {
e.metaInfo.name.setValue(i), this._doSave(
void 0, void 0, () => {
e.metaInfo.name.setValue(t)
}), s()
},
onClose: () => this._visibility.setValue(!1)
})
}, {
source: "Rename chart"
})
}
}
i.d(t, "SaveChartService", (function() {
return f
}));
class f {
constructor(e, t) {
this._autosaveTimer = null, this._watchedAutoSaveEnabled = new n.a, this
._toggleAutoSaveEnabledHandler = this._toggleAutoSaveEnabled.bind(this), this
._doSave = (e, t, i, s) => {
const r = this._chartWidgetCollection;
void 0 !== e && e(), this._chartSaver.saveChartSilently(e => {
var i;
i = r.metaInfo.uid.value(), "/chart/" === location.pathname && (
location.href = "/chart/" + i), void 0 !== t && t(e)
}, () => {
void 0 !== i && i()
}, {
autoSave: Boolean(s)
})
}, this._chartWidgetCollection = e, this._chartSaver = t, this
._createController = new _(e, this._doSave),
this._renameController = new m(e, this._doSave), this._saveAsController = new p(
e, this._doSave), this._chartChangesWatcher = new a.ChartChangesWatcher(e
.undoHistory, t, o), e.saveKeysPressed().subscribe(this, this
.saveChartOrShowTitleDialog), this._chartChangesWatcher.getOnChange()
.subscribe(this, this._onStateChanged)
}
autoSaveEnabled() {
return this._watchedAutoSaveEnabled
}
destroy() {
0
}
getCreateController() {
return this._createController
}
getRenameController() {
return this._renameController
}
getSaveAsController() {
return this._saveAsController
}
cloneChart() {
this._saveAsController.cloneChart()
}
saveChartAs() {
this._saveAsController.show()
}
renameChart() {
this._renameController.show()
}
saveNewChart(e, t, i) {
this._createController.show(e, t, i)
}
saveExistentChart(e, t, i) {
this._doSave(e, t, i)
}
hasChanges() {
return this._chartChangesWatcher.hasChanges()
}
saveChartOrShowTitleDialog(e, t, i) {
const s = window.saver.isSaveInProcess(),
r = this._chartChangesWatcher.hasChanges(),
n = !!this._chartWidgetCollection.metaInfo.id.value();
window.is_authenticated && (s || !r && n) || Object(l.a)(() => {
null != this._chartWidgetCollection.metaInfo.id.value() ? this
.saveExistentChart(e, t, i) : this.saveNewChart(e, t, i)
}, {
source: "Save chart",
sourceMeta: "Chart"
})
}
whenReadyToSave(e) {
this._chartSaver.whenReadyToSave(e)
}
saveToJSON() {
return this._chartSaver.saveToJSON()
}
saveChartSilently(e, t, i) {
this._chartSaver.saveChartSilently(e, t, i)
}
setAutoSaveEnabled(e) {
window.is_authenticated && window.saver.isSaveInProcess() || Object(l.a)(() => {
this._watchedAutoSaveEnabled.setValue(e)
}, {
source: "AutoSave chart"
})
}
saveChartLineTools(e, t) {
return this._chartSaver.saveChartLineTools(e, t)
}
_autoSaveEnabledSettingHandler(e) {
0
}
_toggleAutoSaveEnabled(e) {
0
}
_enableAutoSave() {
0
}
_disableAutoSave() {
0
}
_onStateChanged(e) {
e ? this._startAutosave() : this._stopAutosave()
}
_startAutosave() {
s.enabled("charts_auto_save") && null === this._autosaveTimer && (this
._autosaveTimer = setTimeout(() => {
this._autosaveTimer = null, this._chartWidgetCollection.metaInfo.id
.value() && this._doSave(void 0, void 0, void 0, !0)
}, 6e4))
}
_stopAutosave() {
null !== this._autosaveTimer && (clearInterval(this._autosaveTimer), this
._autosaveTimer = null)
}
}
},
"/DW5": function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return r
})), i.d(t, "a", (function() {
return n
}));
var s = i("CLNU");
function r(e) {
return Object(s.clean)(JSON.stringify(e))
}
function n(e) {
return JSON.parse(Object(s.clean)(e, !0))
}
},
"/DxK": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolHorzLine", (function() {
return l
}));
var s = i("tc+8"),
r = i.n(s),
n = i("Ocx9"),
o = i("Ss5c"),
a = i("p1SQ");
class l extends o.LineDataSource {
constructor(e, t) {
super(e, t || l.createProperties()), this._priceAxisView = new a
.LineToolHorzLinePriceAxisView(this), i.e("lt-pane-views").then(i.bind(null,
"ckl+")).then(({
HorzLinePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
state(e) {
const t = super.state(e);
return t.points && 0 !== t.points.length && (t.points[0].offset = 0), t
}
pointsCount() {
return 1
}
name() {
return "Horizontal Line"
}
priceAxisViews(e, t) {
return this.isSourceHidden() ? null : t === this.priceScale() && this
.properties().showPrice.value() && this._model.paneForSource(this) === e ? [
this._priceAxisView
] : null
}
timeAxisViews() {
return null
}
timeAxisPoints() {
return []
}
updateAllViews() {
super.updateAllViews(), this._priceAxisView.update()
}
canHasAlert() {
return !0
}
template() {
const e = super.template();
return e.text = this.properties().childs().text.value(), e.showLabel = this
.properties().childs().showLabel.value(), e
}
static createProperties(e) {
const t = new n.DefaultProperty("linetoolhorzline", e);
return l._configureProperties(t), t
}
_getAlertPlots() {
return [this.points()[0].price]
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "NEbb")).then(
e => e.HorizontalLineDefinitionsViewModel)
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text ||
""), this.properties().childs().showLabel.setValue(Boolean(e.showLabel))
}
static _configureProperties(e) {
o.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
"text", new r.a("")), e.addExclusion("text"), e.addExclusion(
"showLabel")
}
}
},
"/G2Z": function(e, t, i) {
"use strict";
(function(e) {
i("xdS3");
var t, s = i("Eyy1").assert;
i("fPdn"), i("wZIs"), i("WmDe"), JSON.parse(urlParams.disabledFeatures).forEach((
function(t) {
e.setEnabled(t, !1)
})), JSON.parse(urlParams.enabledFeatures).forEach((function(t) {
e.setEnabled(t, !0)
})), null != (t = window.parent[window.urlParams.uid].settingsAdapter) ? (TVSettings
.setSettingsAdapter(t), TVSettings.sync()) : e.enabled(
"use_localstorage_for_settings") && TVSettings.sync();
var r = i("UlDV").RestrictedToolsetBootloader,
n = i("I4UZ").HeaderToolbarBootloader,
o = i("9zVu").DrawingToolbarBootloader,
a = i("OiSa").isDrawingToolbarVisible;
(0, i("8+VR").setClasses)();
var l = i("EsvI"),
c = i("oiZD").setTheme,
h = i("JcHK"),
u = i("Ery9"),
d = i("lxNp"),
p = i("n0Bl").migrateShortcut,
_ = i("RXmj").ChartSaver,
m = i("/5ju").SaveChartService,
f = i("lA7n").LoadChartService,
g = i("F58L").StudyTemplates,
b = i("54XG").FavoriteStudyTemplateService,
v = i("PT1i").linking,
S = i("FQhm"),
y = i("kcTO").formatterOptions,
w = i("iboI").customFormatters,
P = i("JT5O").StudyMarket,
C = i("FBuY").TVXWindowEvents,
x = i("jofe").createDeferredPromise,
T = i("FIi8").deepExtend,
I = i("e3/o").randomHash,
M = i("/qn+").convertPropertyToWatchedValue,
O = i("1ANp").property,
L = i("RspR").property,
A = i("3t3b").dateFormatProperty,
E = i("UXvI").default,
k = i("LxhU").Interval,
D = i("lW/c").Root,
V = i("NsVT").ChartPage,
B = i("IWXC").destroyQuoteSessions,
R = i("uDHo").TIMEFRAMETYPE,
N = new V(new D(window).allocate()),
j = N.allocate({
areaName: "center"
}),
F = (N.allocate({
areaName: "tradingpanel"
}), window.parent[urlParams.uid].brokerFactory, Boolean(!1)),
W = i("vPbs").CHART_WIDGET_COLLECTION_SERVICE,
H = i("eqEH");
i("Wh/T");
var U = i("/Y2c"),
z = i("g5Qf").createFavoriteDrawingToolbar,
G = i("x5Tw").setupChartEventHint,
q = i("+2Ad").setupChartScreenshotHint,
Y = i("EX27"),
K = i("0YCj"),
J = i("9nLJ");
i("2cgs"), i("vIQA");
var Z = i("K5cv").setSearchRequestDelay,
X = i("dfhE"),
$ = i("ocLq"),
Q = i("qE4g").addBrandingSource,
ee = i("6vtU").setAdditionalSymbolInfoFields,
te = i("kNVT").setSymbolSearchCompleteOverrideFunction,
ie = i("fRER").DropdownApi,
se = window.parent[urlParams.uid].getCustomIndicators,
re = x(),
ne = x(),
oe = e.enabled("left_toolbar");
if (Promise.all([re.promise, ne.promise]).then((function() {
window.ChartApiInstance.start()
})), "function" == typeof se) {
var ae = se($);
ae && ae.then ? ae.then((function(e) {
if (!Array.isArray(e)) return console.warn(
"custom_indicators_getter should be a function that returns a Promise object which result is an array of custom indicators"
), void re.resolve();
JSServer.studyLibrary.push.apply(JSServer.studyLibrary, e), re
.resolve(), console.log("{0} custom indicators loaded.".format(e
.length))
})).catch((function(e) {
console.warn("Error loading custom indicators " + e), re.resolve()
})) : (console.warn(
"custom_indicators_getter should be a function that returns a Promise object"
), re.resolve())
} else re.resolve();
window.widgetReady = function(e) {
S.subscribe("onChartReady", e)
};
var le = urlParams.theme && urlParams.theme.toLowerCase();
function ce(e) {
window.__defaultsOverrides = window.__defaultsOverrides || {}, T(window
.__defaultsOverrides, e), void 0 !== TradingView.defaultProperties &&
void 0 !== TradingView.defaultProperties.chartproperties && (window
.applyDefaultsOverrides(TradingView.defaultProperties.chartproperties),
window.applyDefaultOverridesToLinetools())
}! function(e) {
l.themes[e] && c(e)
}(le), window.applyStudiesOverrides = function(e) {
e && (window.chartWidgetCollection ? window.chartWidgetCollection
.applyStudiesOverrides(e) : K.mergeDefaultsOverrides(e))
}, window.applyOverrides = function(e) {
ce(e), window.chartWidgetCollection && window.chartWidgetCollection
.applyOverrides(e)
}, window.doWhenApiIsReady = function(e) {
window.tradingViewApi ? e() : ne.promise.then(e)
}, window.applyTradingCustomization = function(e) {
for (var t in e.order) TradingView.defaultProperties.linetoolorder[t] = e.order[
t];
for (var t in e.position) TradingView.defaultProperties.linetoolposition[t] = e
.position[t]
}, window.changeTheme = function(e, t) {
var i = l.themes[e.toLowerCase()];
return i ? window.tradingViewApi.themes().setStdTheme(i.name, !0, t && t
.disableUndo) : Promise.resolve()
}, window.getTheme = function() {
return window.tradingViewApi.themes().getCurrentThemeName()
}, window.is_authenticated = !1;
JSON.parse(window.urlParams.brokerConfig);
window.t("charts by TradingView"), window.t("powered by TradingView"), window.t(
"by TradingView");
var he = null,
ue = x(),
de = null,
pe = function() {
if (e.setEnabled("charting_library_debug_mode", "true" === urlParams.debug), e
.setEnabled("chart_property_page_trading", !1), e.enabled(
"remove_library_container_border")) {
var t = document.querySelector("#library-container");
null !== t && (t.style.border = "0px", t.style.padding = "1px")
}
e.enabled("no_min_chart_width") && (window.document.body.style.minWidth =
"0px"), null != urlParams.studiesOverrides && K.mergeDefaultsOverrides(
JSON
.parse(urlParams.studiesOverrides)), s(void 0 === TradingView
.defaultProperties,
"Default properties are inited before applying overrides"),
ce(JSON.parse(urlParams.overrides)), urlParams.numeric_formatting =
urlParams.numeric_formatting && JSON.parse(urlParams.numeric_formatting),
urlParams.numeric_formatting && "string" == typeof urlParams
.numeric_formatting.decimal_sign && (y.decimalSign = urlParams
.numeric_formatting.decimal_sign[0]), window.ChartApiInstance = new Y(
window.parent[urlParams.uid].datafeed), window.parent[urlParams.uid]
.customFormatters && (window.parent[urlParams.uid].customFormatters
.timeFormatter && (w.timeFormatter = window.parent[urlParams.uid]
.customFormatters.timeFormatter), window.parent[urlParams.uid]
.customFormatters.dateFormatter && (w.dateFormatter = window.parent[
urlParams.uid].customFormatters.dateFormatter), window.parent[
urlParams.uid].customFormatters.tickMarkFormatter && (w
.tickMarkFormatter = window.parent[urlParams.uid].customFormatters
.tickMarkFormatter)), window.ChartApiInstance
.setStudiesAccessController(window.ChartApiInstance
.createStudiesAccessController(urlParams.studiesAccess));
var c = urlParams.chartContent ? JSON.parse(urlParams.chartContent).json :
void 0,
u = urlParams.chartContentExtendedData ? JSON.parse(urlParams
.chartContentExtendedData) : c ? c.extendedData : void 0,
d = urlParams.interval || "D",
p = function(e) {
var t = /(\d+)(\w+)/;
return e.map((function(e) {
var i = t.exec(e.text),
s = i[2].toLowerCase(),
r = parseInt(i[1]),
n = "y" === s ? 12 * r + "M" : r + s,
o = k.parse(e.resolution);
return {
text: window.t(e.title) || r + window.t(s, {
context: "dates",
count: r
}),
description: e.description || "",
value: {
value: n.toUpperCase(),
type: R.PeriodBack
},
targetResolution: o.value(),
requiresIntraday: o.isIntraday()
}
}))
}(JSON.parse(urlParams.timeFrames)),
x = {
resizerBridge: j,
padding: e.enabled("border_around_the_chart") ? 2 : 0,
content: c,
widgetOptions: {
addToWatchlistEnabled: !1,
hideIdeas: !0,
addVolume: window.ChartApiInstance.studiesAccessController
.isToolEnabled("Volume"),
muteSessionErrors: !0,
timezone: urlParams.timezone,
defSymbol: urlParams.symbol,
defInterval: d,
compareSymbols: urlParams.compareSymbols && JSON.parse(urlParams
.compareSymbols),
defTimeframe: urlParams.timeframe,
paneContextMenuEnabled: e.enabled("pane_context_menu"),
paneContextMenu: {
mainSeriesTrade: F
},
priceScaleContextMenuEnabled: e.enabled("scales_context_menu"),
currencyConversionEnabled: e.enabled("pricescale_currency"),
unitConversionEnabled: e.enabled("pricescale_unit"),
legendWidgetEnabled: e.enabled("legend_widget"),
legendWidget: {
contextMenu: {
settings: e.enabled("show_chart_property_page"),
showOpenMarketStatus: e.enabled("display_market_status")
}
},
sourceStatusesWidget: {
errorSolution: !1
},
marketStatusWidgetEnabled: e.enabled("display_market_status"),
marketStatusWidget: {
preMarketSolution: !1,
postMarketSolution: !1
},
chartWarningWidget: {
subscriptionFullInfo: !1
},
timeScaleWidget: {
contextMenuEnabled: e.enabled("scales_context_menu"),
timezoneMenuEnabled: e.enabled("timezone_menu"),
priceAxisLabelsOptions: {
showLabels: e.enabled("main_series_scale_menu")
}
},
timeScale: {
preserveBarSpacing: !1,
lockVisibleTimeRangeOnResize: e.enabled(
"lock_visible_time_range_on_resize"),
rightBarStaysOnScroll: e.enabled("right_bar_stays_on_scroll"),
minBarSpacing: urlParams.time_scale && JSON.parse(urlParams
.time_scale).min_bar_spacing
},
goToDateEnabled: e.enabled("go_to_date"),
crossHair: {
menuEnabled: e.enabled("chart_crosshair_menu")
},
handleScale: {
mouseWheel: e.enabled("mouse_wheel_scale"),
pinch: e.enabled("pinch_scale"),
axisPressedMouseMove: {
time: e.enabled("axis_pressed_mouse_move_scale"),
price: e.enabled("axis_pressed_mouse_move_scale")
}
},
handleScroll: {
mouseWheel: e.enabled("mouse_wheel_scroll"),
pressedMouseMove: e.enabled("pressed_mouse_move_scroll"),
horzTouchDrag: e.enabled("horz_touch_drag_scroll"),
vertTouchDrag: e.enabled("vert_touch_drag_scroll")
},
shiftVisibleRangeOnNewBar: e.enabled(
"shift_visible_range_on_new_bar"),
croppedTickMarks: e.enabled("cropped_tick_marks"),
countdownEnabled: e.enabled("countdown"),
indicatorsDialogShortcutEnabled: e.enabled(
"insert_indicator_dialog_shortcut")
},
seriesControlBarEnabled: e.enabled("timeframes_toolbar"),
seriesControlBar: {
timeFramesWidgetEnabled: !0,
timeFramesWidget: {
goToDateEnabled: e.enabled("go_to_date"),
availableTimeFrames: function(e, t) {
return e ? t !== X.STATUS_DELAYED && t !== X
.STATUS_DELAYED_STREAMING && t !== X.STATUS_READY ?
[] : p.filter((function(t) {
return !(t.requiresIntraday && !e
.has_intraday) && !(e
.supported_resolutions && !e
.supported_resolutions.includes(
t.targetResolution))
})) : []
}
},
timeWidgetEnabled: !0,
timeWidget: {
timezoneMenuEnabled: e.enabled("timezone_menu")
},
adjustForDividendsButtonEnabled: !1,
sessionIdButtonEnabled: !1,
percentageScaleButtonEnabled: !0,
logScaleButtonEnabled: !0,
autoScaleButtonEnabled: !0,
fullscreenButtonEnabled: !0,
mobileChangeLayoutEnabled: !1
},
globalEvents: !0,
snapshotUrl: urlParams.snapshotUrl,
mobileForceChartMaximizeEnabled: !1,
saveChartEnabled: e.enabled("save_shortcut")
};
oe && (z(), x.widgetOptions.isDrawingToolbarVisible = a), u && (x.metaInfo = {
id: u.uid,
name: u.name,
description: u.description,
uid: u.uid,
username: "",
tags: ""
}), window.parent[urlParams.uid].additionalSymbolInfoFields && ee(window
.parent[urlParams.uid].additionalSymbolInfoFields), window.parent[
urlParams.uid].symbolSearchComplete && te(window.parent[urlParams.uid]
.symbolSearchComplete);
var T = window.chartWidgetCollection = new U(x);
Q(T), window.studyMarket = new P(T), void 0 !== H && H.registerService(W, T), T
.activeChartWidget.subscribe((function(e) {
S.emit("activeChartChanged", T.getAll().indexOf(e))
})), window.saver = new _(T);
var I = new m(T, window.saver),
M = new f(T);
window.chartWidget = T.activeChartWidget.value(), window.pro = new TradingView
.Pro;
var O = function(t) {
if (!e.enabled("header_widget")) return null;
var s = N.allocate({
areaName: "top"
}),
o = new(0, i("htUT").ChartChangesWatcher)(t.chartWidgetCollection
.undoHistory, window.saver, S),
a = JSON.parse(urlParams.favorites);
a.intervals = a.intervals.map((function(e) {
var t = "" + e;
return t.match(/1[DWMYdwmy]/) && (t = t.slice(1)), t
}));
var l = null;
e.enabled("study_templates") && (l = new b(C, TVSettings), de = new g({
chartWidgetCollection: t.chartWidgetCollection,
favoriteStudyTemplatesService: l
}));
var c = void 0,
h = urlParams.header_widget_buttons_mode;
"fullsize" === h && (c = ["full"]);
"compact" === h && (c = ["small"]);
return new n(new r, {
chartSaver: window.saver,
chartApiInstance: ChartApiInstance,
chartWidgetCollection: t.chartWidgetCollection,
defaultFavoriteStyles: a.chartTypes,
defaultFavoriteIntervals: a.intervals,
hideStudyTemplates: !0,
resizerBridge: s,
studyMarket: window.studyMarket,
studyTemplates: de,
favoriteStudyTemplatesService: l,
allowedModes: c,
saveChartService: t.saveChartService,
loadChartService: t.loadChartService,
chartChangesWatcher: o,
onClick: we,
snapshotUrl: t.snapshotUrl
})
}({
chartWidgetCollection: T,
saveChartService: I,
loadChartService: M,
snapshotUrl: urlParams.snapshotUrl
});
null !== O ? O.load().then((function(e) {
he = e.getComponent(), ue.resolve()
})) : (ue.promise.catch((function() {})), ue.reject(
"header widget is not loaded"));
var L = function(e) {
if (oe) {
var t = urlParams.toolbarbg && /^[0-9a-f]+$/i.test(urlParams
.toolbarbg) ? String(urlParams.toolbarbg) : void 0;
if (t) {
var i = document.createElement("style");
i.textContent =
"body,.chart-controls-bar,#footer-chart-panel{background-color:#" +
t + " !important}", document.head.appendChild(i)
}
return new o({
bgColor: t,
chartWidgetCollection: e,
drawingsAccess: urlParams.drawingsAccess ? JSON.parse(
urlParams.drawingsAccess) : void 0,
resizerBridge: N.allocate({
areaName: "left"
}),
onClick: we
})
}
return null
}(T),
A = null;
window.tradingViewApi = new J({
chartWidgetCollection: T,
chartApiInstance: window.ChartApiInstance,
saveChartService: I,
loadChartService: M
});
if (v.bindToChartWidgetCollection(T), TradingView.isNaN(urlParams
.studyCountLimit) || (TradingView.STUDY_COUNT_LIMIT = Math.max(2, +
urlParams.studyCountLimit)), !TradingView.isNaN(urlParams.ssreqdelay)) {
var D = Math.max(0, +urlParams.ssreqdelay);
Z(D)
}
window.ChartApiInstance.connect(), Promise.all([i.e("react"), i.e(1), i.e(4), i
.e(6), i.e(11), i.e(12), i.e(13), i.e(14), i.e(17), i.e(21), i.e(
22), i.e(24), i.e(28), i.e(33), i.e(41), i.e(48), i.e(51), i.e(
52),
i.e(60), i.e(67), i.e(75), i.e(0), i.e(5), i.e(30), i.e(38), i.e(
"line-tools-icons"), i.e(53), i.e(54), i.e("floating-toolbars")
]).then(i.t.bind(null, "tPkB", 7)).then(({
default: e
}) => {
window.lineToolPropertiesToolbar = new e(T)
});
var V = document.querySelector(".tv-content");
function B() {
L && L.load(), A && A.load().then((function(e) {
window.footerWidget = e.getComponent()
}))
}
null !== V && V.addEventListener("contextmenu", (function(e) {
null !== e.target && "input" !== e.target.tagName
.toLowerCase() && "textarea" !== e.target.tagName
.toLowerCase() && e.preventDefault()
})), ne.resolve(), T.undoHistory.undoStack().onChange().subscribe(null, E((
function() {
S.emit("onAutoSaveNeeded")
}), 1e3 * (urlParams.autoSaveDelay || 5), {
leading: !1,
trailing: !0
})), window.chartWidget.withModel(null, (function() {
if (ChartApiInstance.on("realtime_tick", (function(e) {
S.emit("onTick", e)
})), !l.savedThemeName() && le) {
var t = l.getStdTheme(le);
t && t.content && void 0 === c && T.applyTheme(t.content, !
1, !1, le, !0, !0).then(() => window.applyOverrides(
window.__defaultsOverrides))
}
e.enabled("charting_library_debug_mode") && S.subscribeToAll((
function() {
var e = Array.prototype.slice.call(arguments);
console.log('Event "{0}", arguments: {1}'
.format(e[0], JSON.stringify(e.slice(
1))))
})), G && (G(T), G = null), q && (q(T, {
seriesControlBarEnabled: e.enabled(
"timeframes_toolbar")
}), q = null)
})),
h.isAnyChartWidgetInitialized(T) ? B() : h.waitAnyChartWidgetInitialized(T,
B), S.subscribe("chart_load_requested", (function(e) {
window.tradingViewApi.loadChart({
json: JSON.parse(e.content),
extendedData: e
})
}))
};
window.addEventListener("unload", (function() {
window.ChartApiInstance && window.ChartApiInstance.disconnect(), window
.chartWidgetCollection && (window.chartWidgetCollection.destroy(),
window.chartWidgetCollection = null), B(), window
.ChartApiInstance && (window.ChartApiInstance.destroy(), window
.ChartApiInstance = null)
})), e.enabled("saveload_storage_customization") && (window.parent[urlParams.uid]
.saveLoadAdapter ? u.setCustomAdapter(window.parent[urlParams.uid]
.saveLoadAdapter) : void 0 !== urlParams.chartsStorageUrl && urlParams
.chartsStorageUrl && void 0 !== urlParams.clientId && urlParams.clientId ? u
.initialize(urlParams.clientId, urlParams.userId, urlParams.chartsStorageUrl,
urlParams.chartsStorageVer || "1.0") : (e.setEnabled(
"saveload_storage_customization", !1), e.setEnabled("header_saveload", !
1)));
var _e = x();
function me() {
_e.resolve()
}
window.parent[urlParams.uid].loadLastChart && e.enabled(
"saveload_storage_customization") ? u.getCharts().then((function(e) {
if (0 !== e.length) {
var t = e.sort((function(e, t) {
return t.modified_iso - e.modified_iso
}))[0];
u.getChartContent(t).then((function(e) {
var t = JSON.parse(e.content);
t.extendedData = e, urlParams.chartContent = JSON
.stringify({
json: t
}), me()
})).catch(me)
} else me()
})).catch(me) : me();
var fe, ge, be = x();
Promise.all([be.promise, _e.promise]).then((function() {
var t, i, s, r, n, o, a = document.querySelector(".loading-indicator");
if (a && (a.style.display = "none"), setTimeout(pe, 0), e.enabled(
"14851") && Math.random() <= .02) {
t = window, i = document, s = "script", r = "ga", t
.GoogleAnalyticsObject = r, t.ga = t.ga || function() {
(t.ga.q = t.ga.q || []).push(arguments)
}, t.ga.l = 1 * new Date, n = i.createElement(s), o = i
.getElementsByTagName(s)[0], n.async = 1, n.src =
"//www.google-analytics.com/analytics.js", o.parentNode
.insertBefore(n, o);
var l = document.URL.match(new RegExp("(:?.*://)([^/]+)/.*"))[2];
ga("create", "UA-112911840-1", "auto"), ga("set", "anonymizeIp", !
0), ga("set", {
hostname: l,
page: l,
referrer: l
}), ga("send", "pageview")
}
})), fe = !0, window.parent[urlParams.uid].datafeed.onReady((function(e) {
fe && console.warn(
"`onReady` should return result asynchronously. Use `setTimeout` with 0 interval to execute the callback function."
), window.configurationData = e, be.resolve()
})), fe = !1, window.getFunctionFromArguments = function(e) {
return window.parent[urlParams.uid][e]
}, window.createShortcutAction = (ge = d.createGroup({
desc: "API"
}), function(e, t) {
ge.add({
hotkey: p(e),
handler: t
})
}), window.initializationFinished = function() {
window.chartWidgetCollection.undoHistory.clearStack()
}, window.headerReady = function() {
return ue.promise
}, window.createButton = function(e) {
if (null === he) throw new Error(
"Cannot create button: header widget is not ready or is not loaded - use `headerReady` to wait until header is ready"
);
var t = (e = e || {}).align || "left";
return he.addButton(I(), t)
}, window.createDropdown = function(e) {
if (void 0 === e) throw new Error(
"Cannot create dropdown without any parameters. Please refer to the documentation"
);
void 0 === e.align && (e.align = "left");
const t = I();
return he ? (he.addDropdown(t, e), Promise.resolve(new ie(he, t))) : ue.promise
.then(() => (he.addDropdown(t, e), new ie(he, t)))
}, window.getAllFeatures = function() {
const t = e.getAllFeatures();
return Object.keys(t).forEach((function(e) {
isNaN(parseFloat(e)) || delete t[e]
})), t
};
var ve = null;
window.getNavigationButtonsVisibility = function() {
return null === ve && (ve = M(O())), ve
};
var Se = null;
window.getPaneButtonsVisibility = function() {
return null === Se && (Se = M(L())), Se
};
var ye = null;
function we(e) {
var t = TradingView.bottomWidgetBar;
t && t.turnOffMaximize()
}
window.getDateFormat = function() {
return null === ye && (ye = M(A)), ye
}
}).call(this, i("Kxc7"))
},
"/McG": function(e) {
e.exports = JSON.parse(
'{"content":{"chartProperties":{"scalesProperties":{"textColor":"#131722","lineColor":"rgba(42, 46, 57, 0.14)","backgroundColor":"#ffffff"},"paneProperties":{"vertGridProperties":{"color":"rgba(42, 46, 57, 0.06)"},"horzGridProperties":{"color":"rgba(42, 46, 57, 0.06)"},"crossHairProperties":{"color":"#9598A1"},"background":"#ffffff","backgroundGradientStartColor":"#ffffff","backgroundGradientEndColor":"#ffffff"}},"sessions":{"graphics":{"backgrounds":{"outOfSession":{"color":"#2962FF","transparency":92},"preMarket":{"color":"#FF9800","transparency":92},"postMarket":{"color":"#2962FF","transparency":92}},"vertlines":{"sessBreaks":{"color":"#4985e7","style":2,"width":1}}}},"mainSourceProperties":{"baseLineColor":"#B2B5BE","candleStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#737375","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"haStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#737375","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"barStyle":{"downColor":"#ef5350","upColor":"#26a69a"},"pnfStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae"},"baselineStyle":{"baselineColor":"rgba( 117, 134, 150, 1)","topFillColor1":"rgba( 38, 166, 154, 0.28)","topFillColor2":"rgba( 38, 166, 154, 0.05)","bottomFillColor1":"rgba( 239, 83, 80, 0.05)","bottomFillColor2":"rgba( 239, 83, 80, 0.28)","topLineColor":"rgba( 38, 166, 154, 1)","bottomLineColor":"rgba( 239, 83, 80, 1)"},"areaStyle":{"transparency":100,"color1":"rgba(41, 98, 255, 0.28)","color2":"#2962FF","linecolor":"#2962FF","linewidth":2,"linestyle":0},"renkoStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae","borderUpColorProjection":"#a9dcc3","borderDownColorProjection":"#f5a6ae","wickUpColor":"#26a69a","wickDownColor":"#ef5350"},"lineStyle":{"color":"#2962FF","linewidth":2,"linestyle":0},"kagiStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae"},"pbStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae","borderUpColorProjection":"#a9dcc3","borderDownColorProjection":"#f5a6ae"},"rangeStyle":{"upColor":"#26a69a","downColor":"#ef5350","upColorProjection":"#a9dcc3","downColorProjection":"#f5a6ae"}}}}'
)
},
"/ToI": function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return o
})), i.d(t, "a", (function() {
return a
}));
var s = i("Eyy1"),
r = i("3u3j");
class n extends r.a {
constructor(e, t, i, s) {
super(e, t, s), this._sourcePaneRemoved = !1, this._targetPaneIndex = e.panes()
.indexOf(i)
}
redo() {
const e = this._chartModel.panes()[this._initialPaneIndex],
t = this._chartModel.panes()[this._targetPaneIndex],
i = e !== t,
r = this._targetPriceScale(t),
n = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
._sourceId)),
o = this._chartModel.children(n, !0);
for (const e of o) i ? (this._chartModel.detachSource(e), t.addDataSource(e, r,
!1)) : t.move(e, r);
i ? (this._sourcePaneRemoved = this._chartModel.detachSource(n), t
.addDataSource(n, r, !1)) : t.move(n, r);
const a = t.priceScalePosition(r);
t.movePriceScale(r, a, this._targetPriceScaleIndex(n)), this._chartModel
.fullUpdate()
}
undo() {
this._sourcePaneRemoved && this._chartModel.createPane(this._initialPaneIndex);
const e = this._chartModel.panes()[this._initialPaneIndex],
t = e !== this._chartModel.panes()[this._targetPaneIndex],
i = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
._sourceId));
let r = e.getPriceScaleById(this._initialPriceScaleId);
null === r && (r = e.createPriceScaleAtPosition(this._initialPriceScalePosition,
this._initialPriceScaleIndex));
const n = this._chartModel.children(i, !0);
for (const i of n) t ? (this._chartModel.detachSource(i), e.addDataSource(i, r,
!1)) : e.move(i, r);
t ? (this._chartModel.detachSource(i), e.addDataSource(i, r, !1)) : e.move(i,
r), Object(s.ensureNotNull)(i.priceScale()).restoreState(this
._originalPriceScaleState()), this._chartModel.fullUpdate()
}
}
class o extends n {
constructor(e, t, i, s, r) {
super(e, t, i, r), this._targetPriceScalePosition = s
}
_targetPriceScale(e) {
const t = e.createPriceScaleAtPosition(this._targetPriceScalePosition);
return t.restoreState(this._newPriceScaleState("overlay" === this
._targetPriceScalePosition)), t
}
_targetPriceScaleIndex(e) {
return e === this._chartModel.mainSeries() ? 0 : void 0
}
}
class a extends n {
constructor(e, t, i, s, r) {
super(e, t, i, r), this._targetPriceScaleId = s.id()
}
_targetPriceScale(e) {
return Object(s.ensureNotNull)(e.getPriceScaleById(this._targetPriceScaleId))
}
_targetPriceScaleIndex(e) {}
}
},
"/Y2c": function(e, t, i) {
"use strict";
(function(t) {
var s = i("Eyy1").assert,
r = i("jofe").createDeferredPromise,
n = (i("qFKp").CheckMobile, i("VNzU").layouts),
o = i("Zo2/"),
a = i("qFKp").supportTouch,
l = i("qFKp").isIE,
c = i("qFKp").isEdge,
h = i("x8jL").createUndoHistory,
u = i("mMWL"),
d = i("lxNp"),
p = i("/3z9"),
_ = i("FQhm"),
m = i("PzPU"),
f = i("Kxc7"),
g = i("ijBy").SetChartLayoutCommand,
b = i("hY0g"),
v = i("HySD").ResizerDetacherState,
S = i("HV/F").delegateToPromise,
y = i("sEk5"),
w = i("lJvs"),
P = i("txPx").getLogger("Chart.ChartWidgetCollection"),
C = (i("JWMC").trackEvent, i("wamh").ChangeToolBarsThemeUndoCommand);
const {
getCurrentTheme: x
} = i("EsvI");
var T = i("dfhE"),
I = i("ufwo").rangesAreEqual,
M = i("0psP").GeneralChartPropertiesRenderer,
O = i("NSoL").clientSnapshot,
L = i("pPtI").setLastUsedResolution,
A = i("TCfT").CompareDialogRenderer,
E = i("mNbo").isOnMobileAppPage,
k = i("E3Wt"),
D = k.applyIndicatorsToAllChartsImpl,
V = k.applyIndicatorToAllChartsImpl,
B = k.lineToolsAndGroupsDTOsImpl,
R = k.getStateForChartImpl,
N = k.getAsyncStateForChartImpl,
j = k.resetLineToolsInvalidatedImpl,
F = k.applyLineToolUpdateNotificationImpl,
W = k.createClipboardHandler,
H = k.chartsSymbolsImpl,
U = {
saveChartEnabled: !0,
takeScreenshotEnabled: !0,
publishedChartsEnabled: !0
};
e.exports = function(e) {
var k = this,
z = Object.assign({}, U, e),
G = 1,
q = 2,
Y = 0,
K = 0,
J = new b,
Z = z.readOnly || !1,
X = [],
$ = 0,
Q = new b,
ee = new b,
te = null,
ie = "s",
se = new b,
re = [],
ne = !1,
oe = !1,
ae = !1,
le = new b(!1),
ce = new b(!1),
he = new b(!1),
ue = new b(TVSettings.getBool("chart.syncCrosshair", !0)),
de = d.createGroup({
desc: "Layout"
}),
pe = null,
_e = ue.value();
ue.subscribe((function(e) {
_e = e = !!e, TVSettings.setValue("chart.syncCrosshair", e);
for (var t = 0; t < X.length; ++t) {
var i = X[t].chartWidget;
i.hasModel() && i.model().lightUpdate()
}
}));
var me = new b(ie),
fe = z.resizerBridge.width,
ge = z.resizerBridge.height,
be = null;
void 0 !== z.padding && (q = z.padding), void 0 !== z.topOffset && (G = z
.topOffset), void 0 !== z.edge && (Y = z.edge), void 0 !== z.border && (
K = z.border);
var ve = z.widgetOptions || {},
Se = z.metaInfo || {},
ye = {
id: new b(Se.id || null),
name: new b(Se.name),
description: new b(Se.description),
username: new b(Se.username),
uid: new b(Se.uid),
lastModified: new b(Se.lastModified)
},
we = h();
we.onChange().subscribe(null, (function(e) {
_.emit("undo_redo_state_changed", e)
}));
var Pe = z.resizerBridge.container.value(),
Ce = r(),
xe = new t,
Te = new t,
Ie = new t;
function Me() {
X.forEach((function(e) {
e.chartWidget.onZoom().unsubscribeAll(this)
}))
}
function Oe() {
X.forEach((function(e) {
e.chartWidget.onScroll().unsubscribeAll(this)
}))
}
var Le, Ae = null,
Ee = null,
ke = null;
z.seriesControlBarEnabled && (Le = Y + K + "px", (Ae = document.createElement(
"div")).style.left = Le, Ae.style.right = Le, Ae.style.bottom = Le,
Ae.classList.add("chart-toolbar", "chart-controls-bar"), Pe.appendChild(
Ae), Promise.all([i.e("react"), i.e(1), i.e(6), i.e(8), i.e(11), i
.e(12), i.e(13), i.e(14), i.e(28), i.e(29), i.e(41), i.e(43), i
.e(48), i.e(73), i.e(0), i.e(5), i.e(7), i.e(10), i.e(38), i.e(
"chart-bottom-toolbar")
]).then(i.bind(null, "MfqI")).then(({
BottomToolbarRenderer: e
}) => {
var i = z.resizerBridge,
s = [i.container.spawn(), i.width.spawn(), i.height
.spawn()
],
r = i.container.value(),
n = new t,
o = function() {
n.fire()
};
s.forEach((function(e) {
e.subscribe(o)
})), Ee = new e(Ae, n, (function() {
var e = r.getBoundingClientRect(),
t = Re();
return t.top = e.top + t.top, t.left = e.left +
t.left, t
}), k, ChartApiInstance, ve, z.seriesControlBar), ke =
function() {
null !== Ee && (Ee.destroy(), Ee = null, Ae.remove(),
Ae = null), s.forEach((function(e) {
e.destroy()
})), n.destroy()
}
}));
var De = new M(k),
Ve = new A(k);
function Be() {
return {
undoHistory: we,
chartWidgetsDefs: X,
chartsCountToSave: Ne,
actualLayoutCount: je,
savedChartWidgetOptions: re,
activeChartWidget: J,
options: z,
parent: Pe,
toastsFactory: null
}
}
function Re() {
var e = Y + K,
t = Ae ? Ae.offsetHeight : 0;
return {
width: fe.value() - 2 * e,
height: ge.value() - G - t - e,
top: G,
left: e
}
}
function Ne() {
return je()
}
function je() {
return n[ie].count
}
function Fe(e, t, i, s, r) {
return R(Be(), e, t, i, s, r)
}
function We() {
var e;
e = be ? [be] : X.slice(0, te.count).filter((function(e) {
return !e.hiddenInLayout.value()
}));
for (var t = 0; t < e.length; t++) He(e[t], t, e.length)
}
function He(e, t, i) {
var s = te.sizer(Re(), t, i, q + K);
s.width = Math.max(Math.round(s.width), 0), s.height = Math.max(Math.round(s
.height), 0), s.top = Math.round(s.top), s.left = Math.round(s
.left), e.metrics = s;
var r = e.container.value();
r && (r.style.width = s.width + "px", r.style.height = s.height + "px", r
.style.top = s.top + "px",
r.style.left = s.left + "px"), e.width.setValue(s.width), e.height
.setValue(s.height)
}
function Ue(e) {
return e.rdState.owner.value() !== e
}
function ze() {
return Promise.resolve(null)
}
function Ge(e) {
var t;
e = Object.assign({
chartWidgetCollection: k,
isActive: 0 === X.length,
barsMarksContainersFactory: qe,
undoHistory: we,
readOnly: Z,
initialLoading: ae,
getToasts: ze
}, e || {}), void 0 !== gt && (e.customLegendWidgetFactories = new Map(
gt));
var i = document.createElement("div");
i.classList.add("chart-container"), i.style.position = "absolute", i.style
.overflow = "hidden", Pe.appendChild(i), (l || c) && (i.style
.touchAction = "none", i.style.msTouchAction = "none"), z
.className && i.addClass(z.className);
var s = {
alive: new b(!0),
container: new b(i),
width: new b,
height: new b,
hiddenInLayout: new b(!1),
visible: new b,
rdState: new v,
requestFullscreen: function() {
Q.value() && (Ye(s), J.setValue(s.chartWidget))
},
exitFullscreen: function() {
J.value() === s.chartWidget && Ye(null)
},
detachable: Q,
fullscreenable: Q,
fullscreen: new b
};
function r() {
s.visible.setValue(!s.hiddenInLayout.value() && z.resizerBridge.visible
.value())
}
s.rdState.pushOwner(s), X.push(s), s.hiddenInLayout.subscribe((function() {
s.chartWidget.setVisible(!s.hiddenInLayout.value()), r()
})), z.resizerBridge.visible.subscribe(r), r(),
function(e) {
for (var t = 0, i = 0, s = 0; s < te.count; s++) {
X[s] && Ue(X[s]) || (X[s] === e && (i = t), t++)
}
He(e, i, t)
}(s), Object.assign(e, s.rdState.bridge());
var n = e.content ? e.content.chartId : Je(Ke);
return s.chartWidget = t = new o.ChartWidget(e, n, ye.uid.value()), pe && s
.chartWidget.setSaveChartService(pe), e.containsData ? t
.finishInitWithoutConnect() : t.connect(), t.withModel(null, (
function() {
var e = t.model().model();
ft.forEach((function(t, i) {
e.addCustomSource(i, t.factory, t.layer)
}))
})), et(), tt(), xe.fire(t), t
}
function qe(e) {
var t = [],
i = new y(e);
t.push(i);
var s = new w(e);
return t.push(s), t
}
function Ye(e) {
be !== e && (be = e, Qe(ie))
}
function Ke(e) {
return X.some((function(t) {
return t.chartWidget && t.chartWidget.id() === e
}))
}
function Je(e) {
for (var t = 1; e("" + t);) t++;
return "" + t
}
function Ze() {
X.every(e => e.chartWidget.hasModel()) && (et(), _.emit("layout_changed"))
}
function Xe(e, t) {
const i = Ge(Object.assign({}, ve, re.shift() || function() {
const e = J.value();
if (e) {
const t = e.state();
return t.chartId = Je(Ke), t
.shouldBeSavedEvenIfHidden = !1, {
content: t
}
}
}(), 0 === e || le.value() ? void 0 : {
defSymbol: null
}));
return i.modelCreated().subscribe(null, t || Ze, !0), i
}
function $e(e) {
e.hiddenInLayout.setValue(!0);
const t = e.container.value();
t.parentNode && t.parentNode.removeChild(t), e.fullscreen.setValue(!1)
}
function Qe(e) {
e in n || (e = "s"), Me(), Oe();
var t = ie,
i = n[e].count;
_.emit("layout_about_to_be_changed", e), me.setValue(e), ie = e, te = n[e];
for (var s = i; s < X.length; s++) {
Ue(r = X[s]) && r.rdState.bridge().attach()
}
t !== e && be && (be = null), be && J.setValue(be.chartWidget);
for (s = 0; s < i || s < X.length; s++) {
var r = X[s];
if (be ? be === r : s < i && (!r || !Ue(r))) {
if (r) {
if (Pe.appendChild(r.container.value()), r.hiddenInLayout
.setValue(!1), oe) {
var o = re.shift();
o && (ne = !0, r.chartWidget.loadContent(o.content, ae),
ne = !1)
}
} else Xe(s), r = X[s];
r.container.value().classList.toggle("multiple", i > 1), r
.fullscreen.setValue(be === r)
} else r && $e(r)
}
We(), et(),
function() {
for (var e = te.count, t = e, i = 0; i < e; i++) X[i] && Ue(X[i]) &&
t--;
ee.setValue(t), Q.setValue(t > 1)
}(), Ze(), X.forEach((function(e) {
e.chartWidget.onZoom().subscribe(this, (function(e) {
Te.fire(e)
}))
})), X.forEach((function(e) {
e.chartWidget.onScroll().subscribe(this, (function() {
Ie.fire()
}))
})), ee.value() < 1 && i > 0 && X[i - 1].rdState.bridge().attach()
}
function et() {
var e = Math.min(te.count, X.length) - 1;
if (e < 0) J.deleteValue();
else {
var t = $;
t < 0 && (t = 0), t > e && (t = e), J.setValue(X[t].chartWidget)
}
}
function tt() {
for (var e = X.length; e--;) {
var t = e === $;
X[e].container.value().classList.toggle("active", t), X[e].container
.value().classList.toggle("inactive", !t)
}
}
function it(e) {}
fe.subscribe(We), ge.subscribe(We), this.updateLayout = We;
var st = new t,
rt = new b,
nt = new b,
ot = null;
function at(e) {
var t = e.mainSeries().properties();
t.style.subscribe(null, lt), lt(t.style), e.model()
.onSelectedSourceChanged().subscribe(null, ct), ct(e.selection()
.allSources())
}
function lt(e) {
rt.setValue(e.value())
}
function ct() {
var e = ot.model();
nt.setValue(e.selection().allSources())
}
function ht(e) {
for (var t = !1, i = 0; i < X.length; i++) {
var s = X[i].chartWidget;
if (s.hasModel()) s.model().mainSeries().properties().symbol.value() !==
e && (t || (we.beginUndoMacro("Change Symbol"), t = !0), s
.setSymbol(e))
}
t && we.endUndoMacro()
}
J.subscribe((function(e) {
if (e) {
for (var t, i = X.length; i--;)
if (X[i].chartWidget === e) {
t = i;
break
} if (!isFinite(t)) throw new Error(
"Cannot make detached ChartWidget active");
if ($ !== t) {
be && (Ue(X[t]) || (be = X[t])), $ = t, tt();
for (i = X.length; i--;) X[i].chartWidget !== e && X[i]
.chartWidget.setActive(!1);
yt(), e.setActive(!0)
}! function(e) {
if (ot !== e) {
if (ot && (ot.modelCreated().unsubscribe(null, at),
ot.hasModel())) {
var t = ot.model();
t.mainSeries().properties().style.unsubscribe(
null, lt), t.model()
.onSelectedSourceChanged().unsubscribe(null,
ct), ot = null
}
e && (ot = e, e.hasModel() ? at(e.model()) : e
.modelCreated().subscribe(null, at))
}
}(e)
}
}), {
callWithLast: !0
});
var ut = !1,
dt = !1;
function pt(e) {
var t = Math.max(1, window.devicePixelRatio || 1);
if (e && e.onlyActiveChart || be) return {
layout: "s",
hidpiRatio: t,
theme: x().name,
charts: [J.value().images(e)]
};
for (var i = [], s = te.count, r = {
showCollapsedStudies: (e = e || {}).showCollapsedStudies,
status: e.status
}, n = 0; n < X.length && n < s; n++) i.push(X[n].chartWidget.images(
r));
return {
layout: ie,
hidpiRatio: t,
theme: x().name,
charts: i
}
}
function _t() {
const e = {
snapshotUrl: z.snapshotUrl
};
const t = E("any");
return (t ? m.getImageOfChartSilently : m.copyToClipboardImageOfChart)(k, e)
.then((function(e) {
return _.emit("onScreenshotReady", e), t || _.emit(
"onServerScreenshotCopiedToClipboard"), e
}))
}
function mt(e) {
if (0 !== X.length) {
for (var t = X.length; t--;) X[t].chartWidget.setActive(!1);
X[$].chartWidget.setActive(e)
}
}
Z || (de.add({
desc: "Switch active chart",
hotkey: 9,
handler: function() {}
}), de.add({
desc: "Switch active chart",
hotkey: p.Modifiers.Shift + 9,
handler: function() {}
})), z.takeScreenshotEnabled && (de.add({
desc: "Screenshot server",
hotkey: p.Modifiers.Alt + 83,
handler: function() {
_t()
}
}), E("any") || (de.add({
desc: "Download client screenshot",
hotkey: p.Modifiers.Mod + p.Modifiers.Alt + 83,
handler: function() {
m.downloadClientScreenshot(k)
}
}), de.add({
desc: "Copy client screenshot",
hotkey: p.Modifiers.Mod + p.Modifiers.Shift + 83,
handler: function() {
m.copyToClipboardClientScreenshot(k).then(() => {
_.emit(
"onClientScreenshotCopiedToClipboard"
)
})
}
}))), z.saveChartEnabled && de.add({
desc: "Save Chart Layout",
hotkey: p.Modifiers.Mod + 83,
handler: function() {
st.fire()
}
});
var ft = new Map,
gt = new Map;
const bt = W(Be());
function vt(e) {
if (f.enabled("charting_library_base")) return e;
if ("s" === e || ve.containsData || Z || (void 0)((void 0)
.MULTIPLE_CHARTS) && (void 0)((void 0).MULTIPLE_CHARTS).limit >= n[
e]
.count) return e;
return "s"
}
function St(e, t) {
if (oe = !0, ae = Boolean(t), re = [], e) {
e.charts || (e = {
layout: "s",
charts: [e]
});
var i = new Set;
e.charts.forEach((function(e) {
e.chartId && i.add(e.chartId)
})), e.charts.forEach((function(e) {
if (!e.chartId) {
var t = Je((function(e) {
return i.has(e)
}));
i.add(t), e.chartId = t
}
})), ie = vt(e.layout || "s");
for (var s = 0; s < e.charts.length; s++) {
var r = e.charts[s];
re.push({
content: r
})
}
e.symbolLock && le.setValue(!0), e.intervalLock && ce.setValue(!0), e
.trackTimeLock && he.setValue(!0)
}
Qe(ie), u.init(), u.tool.subscribe(wt), u.tool.subscribe(yt), oe = !1,
ae = !1
}
function yt() {
var e = J.value();
X.forEach((function(t) {
t.chartWidget !== e && t.chartWidget
.updateCrossHairPositionIfNeeded()
})), e && e.updateCrossHairPositionIfNeeded()
}
function wt() {
X.forEach((function(e) {
e.chartWidget.onToolChanged()
}))
}
z.globalEvents && bt.listen(), Object.assign(this, {
createChartWidget: Ge,
getAll: function() {
return X.map((function(e) {
return e.chartWidget
}))
},
destroy: function() {
mt(!1), null !== ke && (ke(), ke = null), Me(), Oe(), X
.forEach((function(e) {
void 0 !== e.timingsMeter && e.timingsMeter
.destroy(), e.chartWidget.destroy()
})), z.resizerBridge.remove(), window
.removeEventListener("resize", We), u.tool.unsubscribe(
yt), u.tool.unsubscribe(wt), Ce.resolve(), Pe
.remove(), ft.clear(), gt.clear(), de.destroy(), bt &&
bt.destroy()
},
layout: me.readonly(),
setLayout: Qe,
activeChartWidget: J,
viewMode: se,
activeChartStyle: rt.readonly(),
setChartStyleToWidget: function(e, t) {
t || (t = J.value()), t && function(e, t) {
var i = e.model(),
s = i.mainSeries().properties().style;
i.setChartStyleProperty(s, t, "Change Series Style")
}(t, e)
},
selectedSources: nt.readonly(),
metaInfo: ye,
state: function(e, t, i, s) {
for (var r = [], n = Ne(), o = 0; o < n; o++) {
var a = Fe(o, e, t, i, s);
a && r.push(a)
}
var l = {
name: k.metaInfo.name.value(),
layout: ie,
charts: r
};
return le.value() && (l.symbolLock = 1), ce.value() && (l
.intervalLock = 1), he.value() && (l.trackTimeLock =
1), l
},
lineToolsAndGroupsDTOs: function() {
return B(Be())
},
resetLineToolsInvalidated: function(e, t) {
return j(Be(), e, t)
},
applyLineToolUpdateNotification: F.bind(null, X),
asyncState: function() {
for (var e, t = [], i = Ne(), s = 0; s < i; s++) t.push((e =
s, N(Be(), e)));
return Promise.all(t).then((function(e) {
for (var t = {
charts: []
}, i = 0; i < e.length; i++) t.charts
.push(e[i]);
return t
}))
},
readOnly: function() {
return Z
},
onZoom: function() {
return Te
},
onScroll: function() {
return Ie
},
lock: {
symbol: le,
setSymbolLockWithUndo: function(e) {
if (e !== le.value()) {
if (we.beginUndoMacro("Symbol Lock"), e)
for (var t = J.value(), i = t.getSymbol(), s =
0; s < X.length; s++) {
var r = X[s].chartWidget;
r !== t && (r.getSymbol() !== i && r
.setSymbol(i))
}
we.setWatchedValue(le, e, "Symbol Lock"), we
.endUndoMacro()
}
},
interval: ce,
setIntervalLockWithUndo: function(e) {
if (e !== ce.value()) {
if (we.beginUndoMacro("Interval Lock"), e)
for (var t = J.value(), i = t.getResolution(),
s = 0; s < X.length; s++) {
var r = X[s].chartWidget;
r !== t && (r.getResolution() !== i && r
.setResolution(i))
}
we.setWatchedValue(ce, e, "Resolution Lock"), we
.endUndoMacro()
}
},
crosshair: ue,
trackTime: he,
setTrackTimeWithUndo: function(e) {
he.value() !== e && we.setWatchedValue(he, e,
"Track Time")
}
},
setSymbol: function(e) {
le.value() ? ht(e) : J.value().setSymbol(e)
},
setResolution: function(e) {
ne || dt || ut || function(e) {
if (L(e), ut = !0, ce.value()) {
for (var t = !1, i = 0; i < X.length; i++) {
var s = X[i].chartWidget;
s.model().mainSeries().properties().interval
.value() !== e && (t || (we
.beginUndoMacro(
"Change Resolution"), t = !0
), s.setResolution(e))
}
t && we.endUndoMacro()
} else J.value().setResolution(e);
ut = !1
}(e)
},
setTimeFrame: function(e) {
if (!ne && !dt) {
if (dt = !0, ce.value())
for (var t = 0; t < X.length; t++) {
var i, s = X[t].chartWidget;
null !== (i = s.model().model()
.appliedTimeFrame().value()) && I(i,
e) || s.loadRange(e)
} else null !== (i = J.value().model().model()
.appliedTimeFrame().value()) && I(i, e) || J
.value().loadRange(e);
dt = !1
}
},
updateLayout: We,
setChartLayoutWithUndo: function(e) {
return e = vt(e), me.value() !== e && (we.pushUndoCommand(
new g(k, e)), !0)
},
images: pt,
clientSnapshot: function(e) {
const t = {
hideResolution: e && e.hideResolution
},
i = e && e.hideResolution;
let s = e;
return O(pt({
showCollapsedStudies: !0,
status: t,
hideResolution: i
}), s)
},
tags: function() {
for (var e = [], t = 0; t < X.length && t < te.count; t++)
e = e.concat(X[t].chartWidget.tags());
return e = (e = Array.from(new Set(e))).map((function(e) {
return e.toLowerCase().replace(/\W+/g, "-")
.replace(/-+/g, "-").replace(/^-|-$/g,
"")
}))
},
syncCrosshair: function(e, t, i, s) {
if (i || _e)
for (var r = te.count, n = 0; n < X.length && n <
r; n++) {
var o = X[n].chartWidget;
o !== t && (X[n].rdState.bridge().visible.value() &&
o.hasModel() && o.model().model()
.setExternalPosition(e, s))
}
},
syncScroll: function(e, t) {
if (he.value()) {
var i = te.count;
we.beginUndoMacro("Sync Time");
for (var s = 0; s < X.length && s < i; s++) {
var r = X[s].chartWidget;
if (r.hasModel()) {
var n = r.model().model();
if (n === t) continue;
n.syncTimeWithModel(t, e)
}
}
we.endUndoMacro()
}
},
setSymbolAll: ht,
clearChartMetaInfo: function() {
ye.id.setValue(null), ye.uid.setValue(void 0), ye.name
.setValue(void 0)
},
takeScreenshot: function() {
var e = {
snapshotUrl: z.snapshotUrl
};
return m.getImageOfChartSilently(k, e).then((function(e) {
return _.emit("onScreenshotReady", e), e
}))
},
takeServerScreenshot: _t,
loadContent: St,
purgeUnusedWidgets: function() {
for (var e = n[ie].count; e < X.length; e++) X[e]
.chartWidget.destroy();
X.splice(n[ie].count)
},
applyOverrides: function(e) {
for (var t = 0; t < X.length; t++) X[t].chartWidget
.applyOverrides(e)
},
applyStudiesOverrides: function(e) {
for (var t = 0; t < X.length; t++) X[t].chartWidget
.applyStudiesOverrides(e)
},
switchChart: it,
startFullscreen: function() {
z.resizerBridge.requestFullscreen()
},
exitFullscreen: function() {
z.resizerBridge.exitFullscreen()
},
destroyPromise: function() {
return Ce.promise()
},
chartWidgetCreated: function() {
return xe
},
saveKeysPressed: function() {
return st
},
getContainer: function() {
return Pe
},
onWidget: ve.onWidget,
applyTheme: function(e, t, i, s, r, n, o) {
void 0 === n && (n = !0);
const a = x().name;
return Promise.all(t ? [J.value()] : X.concat(re).map((e,
t) => e.chartWidget ? e.chartWidget :
new Promise(e => {
const i = Xe(t, () => e(i));
$e(X[t])
}))).then(t => {
o ? (r && new C(a, s, n).redo(), t.forEach((
function(t) {
t.model().model()
.restoreTheme(e, i, o)
}))) : (we.beginUndoMacro(
"Apply Chart Theme"), r && we
.pushUndoCommand(new C(a, s, n)), t
.forEach((function(t) {
t.model().model()
.restoreTheme(e, i)
})), we.endUndoMacro())
})
},
applyIndicatorsToAllCharts: function(e) {
D(Be(), e)
},
applyIndicatorsToAllChartsAvailable: function() {
return !Z && je() > 1
},
applyIndicatorToAllCharts: function(e, t, i, s) {
V(Be(), e, t, i, s)
},
setActive: mt,
inlineChartsCount: ee.readonly(),
revertToInline: function() {
Ye(null);
for (var e = 0; e < X.length; e++) X[e].rdState.bridge()
.attach()
},
chartMarketStatuses: function() {
return X.map((function(e) {
return "-"
}))
},
chartSeriesStatuses: function() {
return X.map((function(e) {
var t = e.chartWidget.hasModel() ? e
.chartWidget.model().mainSeries()
.status() : null;
return (null === t ? "" : T
.SERIES_STATUS_TEXT[t]) + " (" + t +
")"
}))
},
undoHistory: we,
applyPreferencesToAllCharts: function(e) {},
getToasts: ze,
addCustomSource: function(e, t, i) {
s(!ft.has(e),
"Cannot create the same custom source multiple times"
), ft.set(e, {
factory: t,
layer: i
});
for (var r = 0; r < X.length; ++r) {
var n = X[r].chartWidget;
n.hasModel() && n.model().model().addCustomSource(e, t,
i)
}
},
removeCustomSource: function(e) {
s(ft.has(e), "Cannot remove not created custom source"), ft
.delete(e);
for (var t = 0; t < X.length; ++t) {
var i = X[t].chartWidget;
i.hasModel() && i.model().model().removeCustomSource(e)
}
},
addCustomWidgetToLegend: function(e, t) {
s(!gt.has(e),
"Cannot create the same custom widget in legend multiple times"
), gt.set(e, t);
for (var i = 0; i < X.length; ++i) X[i].chartWidget
.addCustomWidgetToLegend(e, t)
},
setViewMode: function(e) {
se.setValue(e)
},
moveActiveChartWithUndo: function(e) {},
activeChartCanBeMoved: function() {
return !1
},
generalPropertiesDefinitions: function() {
return J.value().generalPropertiesDefinitions()
},
reconnectChartApi: function(e) {
(void 0)(e)
},
setBroker: function(e) {
0
},
setSaveChartService: function(e) {
pe = e;
for (var t = 0; t < X.length; ++t) {
X[t].chartWidget.setSaveChartService(e)
}
},
getCompareDialogRenderer: function() {
return Ve
},
getChartPropertiesDialogRenderer: function() {
return De
},
clipboard: bt,
chartsSymbols: function() {
return H(Be())
}
}), St(z.content, !0), me.subscribe((function() {
tt()
})), me.hook = function(e) {
return e === this.value() ? e : vt(e)
}, Z && (me.writeLock = !0), window.addEventListener("resize", We);
var Pt = 0;
function Ct() {
0 === --Pt && _.emitOnce("onChartReady")
}
if (X.forEach((function(e) {
if (e) {
Pt++;
var t = e.chartWidget;
t.withModel(null, (function() {
z.metaInfo && t.model().model()
.setChartSaveTime(1e3 * z.metaInfo
.lastModified);
var e = t.model().mainSeries();
if (e.bars().size() > 0 || e.isStatusBad())
Ct();
else {
var i = e.dataEvents(),
s = function() {
Ct(), i.barReceived()
.unsubscribe(null, s), i
.completed().unsubscribe(
null, s), i.error()
.unsubscribe(null, s)
};
i.barReceived().subscribe(null, s), i
.completed().subscribe(null, s), i
.error().subscribe(null, s)
}
}))
}
})), a()) {
var xt = u.tool.setValue;
u.tool.setValue = function() {
k.selectedSources.value() && k.activeChartWidget.value().model()
.lineBeingCreated() && k.activeChartWidget.value().model()
.cancelCreatingLine(), xt.apply(u.tool, arguments)
}
}
Promise.all(X.map((function(e) {
return S(e.chartWidget.modelCreated()).promise
}))).then((function() {
return Promise.all(X.map((function(e) {
return S(e.chartWidget.model().mainSeries()
.dataEvents().symbolResolved())
.promise
})))
})).then((function() {
window.saver && window.is_authenticated && z.widgetOptions
.justCloned && window.saver.saveChartSilently()
})).catch(P.logError.bind(P))
}
}).call(this, i("aIyQ"))
},
"/YGI": function(e, t, i) {
"use strict";
i.r(t);
var s, r = i("0YCj"),
n = i.n(r);
! function(e) {
e.StudyCannotBeChild = "cannot_be_child", e.StubWasRemoved = "stub_was_removed", e
.CannotGetMetainfo = "cannot_get_metainfo", e.Cancelled = "cancelled", e.Unknown =
"unknown"
}(s || (s = {}));
var o = i("txPx");
i.d(t, "StudyInserter", (function() {
return l
}));
const a = Object(o.getLogger)("Chart.Studies.StudyInserter");
class l {
constructor(e, t, i) {
this._parentSource = void 0, this._propsState = void 0, this._preferredPriceScale =
void 0, this._allowChangeCurrency = !1, this._allowChangeUnit = !1, this
._paneSize = void 0, this._forceOverlay = !1, this._studyMetaInfoRepository = t,
this._inserterImpl = i, this._studyDescriptor = e
}
setParentSource(e) {
this._parentSource = e || void 0
}
setPaneSize(e) {
this._paneSize = e
}
setPreferredPriceScale(e) {
this._preferredPriceScale = e
}
setAllowChangeCurrency(e) {
this._allowChangeCurrency = e
}
setAllowChangeUnit(e) {
this._allowChangeUnit = e
}
setForceOverlay(e) {
this._forceOverlay = e
}
setPropertiesState(e) {
this._propsState = e
}
setTargetPriceScaleMode(e) {
this._targetPriceScaleMode = e
}
async insert(e, t) {
const i = void 0 !== (r = this._inserterImpl).createStub && void 0 !== r
.removeStub ? this._inserterImpl.createStub() : null;
var r;
let n, o = !0;
try {
n = await this._studyMetaInfoRepository.findById(this._studyDescriptor)
} catch (e) {
return a.logWarn("Cannot get study " + JSON.stringify(this._studyDescriptor)),
Promise.reject(s.CannotGetMetainfo)
} finally {
null !== i && (o = this._inserterImpl.removeStub(i))
}
if (!o) return Promise.reject(s.StubWasRemoved);
if (void 0 !== t && t.cancelled) return Promise.reject(s.Cancelled);
if (!this._canApplyStudyToParent(n)) return Promise.reject(s.StudyCannotBeChild);
const l = {
...n.defaults.inputs
},
c = void 0 !== e ? await e(l, n.inputs, n) : {};
if (void 0 !== t && t.cancelled) return Promise.reject(s.Cancelled);
const h = this._insertStudy(n, c);
return null === h ? Promise.reject(s.Unknown) : h
}
_insertStudy(e, t) {
return this._inserterImpl.createStudy(e, t, null, this._propsState, this
._forceOverlay, this._parentSource, this._preferredPriceScale, this
._allowChangeCurrency, this._allowChangeUnit, this._paneSize, this
._targetPriceScaleMode)
}
_canApplyStudyToParent(e) {
return void 0 === this._parentSource || n.a.canBeChild(e)
}
}
},
"/bs+": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
})), i.d(t, "b", (function() {
return n
}));
var s = i("E6p6");
function r(e, t, i) {
if (i.isDays()) return t;
if (e.moveTo(1e3 * t), i.isIntraday()) {
const i = e.indexOfBar(1e3 * t);
if (i < 0) throw new Error(t + " is out of the instrument session ");
return e.endOfBar(i) / 1e3
}
return e.startOfBar(s.SessionStage.LASTBAR_SESSION) / 1e3
}
function n(e, t, i) {
if (i.isDays()) return t;
const s = 1e3 * t - 1;
if (e.moveTo(s), i.isIntraday()) {
const i = e.indexOfBar(s);
if (i < 0) throw new Error(t + " is out of the instrument session ");
return e.startOfBar(i) / 1e3
}
return t = e.startOfBar(0) / 1e3
}
},
"/hKg": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PaneRendererCandles", (function() {
return l
}));
var s = i("Eyy1"),
r = i("VdBB"),
n = i("gAom"),
o = i("Zp/P"),
a = i("ExCE");
class l extends a.a {
constructor(e) {
super(), this._barSpacing = 1, this._barWidth = 1, this._borderVisible = !1,
this._barBorderWidth = 1, this._wickVisible = !1, this._bodyVisible = !0,
this._borderColor = void 0, this._wickColor = void 0, this._hittest =
void 0, e && this.setData(e)
}
setData(e) {
this._bars = e.bars, this._barSpacing = e.barSpacing, this._borderVisible = e
.borderVisible, this._bodyVisible = e.bodyVisible, this._wickVisible = e
.wickVisible, this._borderColor = e.borderColor, this._wickColor = e
.wickColor, this._hittest = e.hittest
}
hitTest(e) {
return this._wickVisible || this._borderVisible || this._bodyVisible ? super
.hitTest(e) : null
}
draw(e, t) {
if (0 === this._bars.length) return;
const i = t.pixelRatio;
if (this._barWidth = Object(o.optimalCandlestickWidth)(this._barSpacing, i),
this._barWidth >= 2) {
Math.floor(i) % 2 != this._barWidth % 2 && this._barWidth--
}
this._wickVisible && this._drawWicks(e, i), this._borderVisible && this
._drawBorder(e, i), this._bodyVisible && this._drawCandles(e, i)
}
_getTolerance() {
return Object(o.interactionTolerance)().series + this._barBorderWidth / 2
}
_getBarSpacing() {
return this._barSpacing
}
_getHitTest() {
return this._hittest || new r.HitTestResult(r.HitTestResult.REGULAR)
}
_isPointAtBar(e, t, i) {
const s = this._bodyVisible || this._borderVisible,
r = this._wickVisible;
if (!s && !r) return !1;
if (s) {
const s = r ? Math.min(e.high, e.low) : Math.min(e.open, e.close),
n = r ? Math.max(e.high, e.low) : Math.max(e.open, e.close);
return s - i <= t && t <= n + i
} {
const s = Math.min(e.open, e.close),
r = Math.max(e.open, e.close);
return e.high - i <= t && t <= s + i || r - i <= t && t <= e.low + i
}
}
_drawWicks(e, t) {
const i = this._bars;
let r = "",
n = Math.min(Math.floor(t), Math.floor(this._barSpacing * t));
n = Math.max(Math.floor(t), Math.min(n, this._barWidth));
const o = Math.floor(.5 * n);
let a = null;
for (const l of i) {
const i = l.wickColor ? l.wickColor : Object(s.ensureDefined)(this
._wickColor);
i !== r && (e.fillStyle = i, r = i);
const c = Math.round(Math.min(l.open, l.close) * t),
h = Math.round(Math.max(l.open, l.close) * t),
u = Math.round(l.high * t),
d = Math.round(l.low * t);
let p = Math.round(t * l.time) - o;
const _ = p + n - 1;
null !== a && (p = Math.max(a + 1, p), p = Math.min(p, _));
const m = _ - p + 1;
e.fillRect(p, u, m, c - u), e.fillRect(p, h + 1, m, d - h), a = _
}
}
_calculateBorderWidth(e) {
let t = Math.floor(1 * e);
this._barWidth <= 2 * t && (t = Math.floor(.5 * (this._barWidth - 1)));
const i = Math.max(Math.floor(e), t);
return this._barWidth <= 2 * i ? Math.max(Math.floor(e), Math.floor(1 * e)) : i
}
_drawBorder(e, t) {
let i = "";
const r = this._calculateBorderWidth(t);
let o = null;
for (const a of this._bars) {
if (a.borderColor !== i && (e.fillStyle = a.borderColor ? a.borderColor :
Object(s.ensureDefined)(this._borderColor), i = a.borderColor), this
._bodyVisible && a.hollow) continue;
let l = Math.round(a.time * t) - Math.floor(.5 * this._barWidth);
const c = l + this._barWidth - 1,
h = Math.round(Math.min(a.open, a.close) * t),
u = Math.round(Math.max(a.open, a.close) * t);
if (null !== o && (l = Math.max(o + 1, l), l = Math.min(l, c)), this
._barSpacing * t > 2 * r) Object(n.fillRectInnerBorder)(e, l, h, c - l +
1, u - h + 1, r);
else {
const t = c - l + 1;
e.fillRect(l, h, t, u - h + 1)
}
o = c
}
}
_drawCandles(e, t) {
let i = "";
const s = this._calculateBorderWidth(t);
for (const r of this._bars) {
if (this._borderVisible && this._barWidth <= 2 * s && !r.hollow) continue;
let o = Math.round(Math.min(r.open, r.close) * t),
a = Math.round(Math.max(r.open, r.close) * t),
l = Math.round(r.time * t) - Math.floor(.5 * this._barWidth),
c = l + this._barWidth - 1;
if (r.color !== i) {
const t = r.color;
e.fillStyle = t, i = t
}
if (r.hollow) e.fillStyle = r.color, Object(n.fillRectInnerBorder)(e, l, o,
c - l + 1, a - o + 1, s);
else {
if (this._borderVisible && (l += s, o += s, c -= s, a -= s), o > a)
continue;
e.fillRect(l, o, c - l + 1, a - o + 1)
}
}
}
}
},
"/kal": function(e, t) {
e.exports =
''
},
"/qn+": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "convertPropertyToWatchedValue", (function() {
return n
}));
var s = i("hY0g"),
r = i.n(s);
function n(e) {
const t = new r.a(e.value());
let i = !1;
e.subscribe(t, () => {
i || (i = !0, t.setValue(e.value()), i = !1)
});
const s = () => {
i || (i = !0, e.setValue(t.value()), i = !1)
};
return t.subscribe(s), t.spawn(() => {
e.unsubscribeAll(t), t.unsubscribe(s)
})
}
},
"/tGj": function(e, t, i) {
"use strict";
function s(e) {
return e.symbolSource() === e
}
i.r(t), i.d(t, "isSymbolSource", (function() {
return s
}))
},
"/z0S": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("Kxc7");
function r(e, t) {
s.enabled("saveload_requires_authentication") ? window.runOrSignIn(e, t) : e()
}
},
"08i5": function(e, t, i) {
"use strict";
var s, r;
i.r(t), i.d(t, "AlertStatus", (function() {
return s
})), i.d(t, "Direction", (function() {
return r
})),
function(e) {
e[e.Waiting = 0] = "Waiting", e[e.Success = 1] = "Success", e[e.Failure = 2] = "Failure"
}(s || (s = {})),
function(e) {
e[e.Up = 1] = "Up", e[e.Down = 2] = "Down"
}(r || (r = {}))
},
"0C7r": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "intervalsVisibilitiesDefaults", (function() {
return s
}));
const s = {
ticks: !0,
seconds: !0,
secondsFrom: 1,
secondsTo: 59,
minutes: !0,
minutesFrom: 1,
minutesTo: 59,
hours: !0,
hoursFrom: 1,
hoursTo: 24,
days: !0,
daysFrom: 1,
daysTo: 366,
weeks: !0,
weeksFrom: 1,
weeksTo: 52,
months: !0,
monthsFrom: 1,
monthsTo: 12,
ranges: !0
}
},
"0F0w": function(e, t, i) {
"use strict";
i.r(t);
var s = i("aIyQ"),
r = i.n(s),
n = i("Eyy1"),
o = i("hY0g"),
a = i.n(o),
l = i("e3/o"),
c = i("txPx");
const h = Object(c.getLogger)("ChartApi.AbstractSession");
var u = i("ogJP");
i.d(t, "ChartSession", (function() {
return d
}));
Object(c.getLogger)("ChartSession");
class d extends class {
constructor(e, t, i) {
this._isConnected = new a.a(!1), this._state = 0, this._isConnectForbidden = !1,
this._sessionId = "", this._sessionIdChanged = new r.a, this._chartApi = e, this
._sessionPrefix = t, this._shouldReconnectAfterCriticalError = i
}
destroy() {
this._logNormal("Destroying session"), this._isConnected.unsubscribe(), this
.disconnect(), this._sessionIdChanged.destroy(), delete this._chartApi, this
._logNormal("Session has been destroyed")
}
isConnected() {
return this._isConnected
}
sessionId() {
return this._sessionId
}
onSessionIdChanged() {
return this._sessionIdChanged
}
connect() {
0 === this._state && (Object(n.assert)(!this._isConnectForbidden,
"Cannot call connect because it is forbidden at this moment"), this
._setSessionId(`${this._sessionPrefix}_${Object(l.randomHash)()}`), this
._logNormal("Connecting session - wait until transport stay connected"),
this._state = 1, this._chartApi.createSession(this._sessionId, this))
}
disconnect() {
0 !== this._state && (Object(n.assert)("" !== this._sessionId,
"sessionId must not be invalid"), this._logNormal(
"Disconnecting session..."), this._forbidConnectWhile(() => {
this._chartApi.connected() && this._sendRemoveSession(), this
._processDestroyingOnServer()
}))
}
onMessage(e) {
switch (e.method) {
case "connected":
return void this._onChartApiConnected();
case "disconnected":
return void this._onChartApiDisconnected();
case "critical_error":
const t = String(e.params[0]),
i = String(e.params[1]);
return void this._onCriticalError(t, i)
}
this._onMessage(e)
}
_getChartApi() {
return this._chartApi
}
_generateLogMessage(e) {
return `[${this._sessionId}] ${e}`
}
_onCriticalError(e, t) {
this._logError(`Critical error. Reason=${e}, info=${t}.`), this._forbidConnectWhile(
() => {
this._processDestroyingOnServer()
}), this._shouldReconnectAfterCriticalError ? (this._logNormal(
"Reconnecting after critical error..."), this.connect()) : this._logNormal(
"Reconnecting after critical error skipped")
}
_onChartApiConnected() {
Object(n.assert)(1 === this._state, "Session is not registered"), this._logNormal(
"Transport is connected. Creating session on the server"), this
._sendCreateSession(), this._state = 2, this._isConnected.setValue(!0)
}
_onChartApiDisconnected() {
this._logNormal("Transport is disconnected. Reconnecting..."), this
._forbidConnectWhile(() => {
this._processDestroyingOnServer()
}), this.connect()
}
_setSessionId(e) {
const t = this._sessionId;
this._logNormal(`Changing sessionId: old=${t}, new=${e}`), this._sessionId = e, this
._sessionIdChanged.fire(e, t)
}
_logNormal(e) {
h.logNormal(this._generateLogMessage(e))
}
_logError(e) {
h.logError(this._generateLogMessage(e))
}
_processDestroyingOnServer() {
this._state = 0, this._isConnected.setValue(!1), this._chartApi.removeSession(this
._sessionId), this._setSessionId("")
}
_forbidConnectWhile(e) {
this._isConnectForbidden = !0, e(), this._isConnectForbidden = !1
}
} {
constructor(e, t = !1) {
super(e, "cs", !1), this._sessionDisabled = !1, this._handler = null, this
._criticalError = new r.a, this._disableStatistics = t
}
destroy() {
this._criticalError.destroy(), this._handler = null, super.destroy()
}
serverTimeOffset() {
return this._getChartApi().serverTimeOffset()
}
switchTimezone(e) {
return this._getChartApi().switchTimezone(this.sessionId(), e)
}
defaultResolutions() {
return this._getChartApi().defaultResolutions()
}
availableCurrencies() {
return this._getChartApi().availableCurrencies()
}
availableUnits() {
return this._getChartApi().availableUnits()
}
resolveSymbol(e, t, i) {
return this._getChartApi().resolveSymbol(this.sessionId(), e, t, i)
}
requestFirstBarTime(e, t, i) {
return this._getChartApi().requestFirstBarTime(this.sessionId(), e, t, i)
}
createSeries(e, t, i, s, r, n, o) {
return this._getChartApi().createSeries(this.sessionId(), e, t, i, s, r, n, o)
}
modifySeries(e, t, i, s, r, n) {
return this._getChartApi().modifySeries(this.sessionId(), e, t, i, s, r, n)
}
removeSeries(e) {
return !!this.isConnected().value() && this._getChartApi().removeSeries(this
.sessionId(), e)
}
requestMoreData(e, t, i) {
return "number" == typeof e ? this._getChartApi().requestMoreData(this.sessionId(),
e) : this._getChartApi().requestMoreData(this.sessionId(), e, t, i)
}
requestMoreTickmarks(e, t, i) {
return Object(u.isNumber)(e) ? this._getChartApi().requestMoreTickmarks(this
.sessionId(), e) : this._getChartApi().requestMoreTickmarks(this
.sessionId(), e, t, i)
}
requestMetadata(e, t) {
(() => {
this._getChartApi().requestMetadata(this.sessionId(), e, t)
})()
}
isCanCreateStudy(e) {
return this._getChartApi().isCanCreateStudy(e)
}
createStudy(e, t, i, s, r, n, o) {
return this._getChartApi().createStudy(this.sessionId(), e, t, i, s, r, n, o)
}
rebindStudy(e, t, i, s, r, n, o) {
return this._getChartApi().rebindStudy(this.sessionId(), e, t, i, s, r, n, o)
}
modifyStudy(e, t, i, s) {
return this._getChartApi().modifyStudy(this.sessionId(), e, t, i, s)
}
removeStudy(e, t) {
return this._getChartApi().removeStudy(this.sessionId(), e, t)
}
createPointset(e, t, i, s, r, n) {
return this._getChartApi().createPointset(this.sessionId(), e, t, i, s, r, n)
}
modifyPointset(e, t, i, s) {
return this._getChartApi().modifyPointset(this.sessionId(), e, t, i, s)
}
removePointset(e) {
return this._getChartApi().removePointset(this.sessionId(), e)
}
setVisibleTimeRange(e, t, i, s, r, n) {
this._getChartApi().setVisibleTimeRange(this.sessionId(), e, t, i, s, !0, r, n)
}
criticalError() {
return this._criticalError
}
connect(e = null) {
null !== e && (this._handler = e), super.connect()
}
setHandler(e) {
this._handler = e
}
connected() {
return this.isConnected().value() && !this._sessionDisabled
}
disable() {
this._sessionDisabled = !0
}
chartApi() {
return this._getChartApi()
}
_sendCreateSession() {
Object.keys(this).forEach(e => {
/^(s|st|symbol_)\d+$/.test(e) && delete this[e]
}), this._getChartApi().chartCreateSession(this.sessionId(), this
._disableStatistics)
}
_sendRemoveSession() {
this._getChartApi().chartDeleteSession(this.sessionId())
}
_onMessage(e) {
this._handler && this._handler(e)
}
_onCriticalError(e, t) {
this._criticalError.fire(e, t), super._onCriticalError(e, t)
}
}
},
"0Pxc": function(e, t, i) {
"use strict";
var s = i("aO4+").Point,
r = i("GEp6").distanceToLine,
n = i("hfHJ"),
o = n.rotationMatrix,
a = n.scalingMatrix,
l = n.translationMatrix,
c = n.transformPoint,
h = i("Ss5c").LineDataSource,
u = i("Ocx9").DefaultProperty,
d = i("j3hX").LineToolColorsProperty;
class p extends h {
constructor(e, t) {
super(e, t || p.createProperties()), this.version = p.version, i.e("lt-pane-views")
.then(i.t.bind(null, "dKqZ", 7)).then(({
ArcPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
startChanging(e, t) {
if (super.startChanging(e, t), 0 === e || 1 === e) {
var i = this.pointToScreenPoint(this._points[0])[0],
n = this.pointToScreenPoint(this._points[1])[0],
o = this.pointToScreenPoint(this._points[2])[0];
this._dist = r(i, n, o).distance;
var a = n.subtract(i),
l = new s(-a.y, a.x),
c = i.add(n).scaled(.5);
o.subtract(c).dotProduct(l) < 0 && (this._dist = -this._dist)
}
}
pointsCount() {
return 3
}
name() {
return "Arc"
}
hasEditableCoordinates() {
return !1
}
setPoint(e, t) {
var i = Object.assign({}, t),
n = this.pointToScreenPoint(this._points[0])[0],
h = this.pointToScreenPoint(this._points[1])[0],
u = this.pointToScreenPoint(this._points[2])[0];
switch (e) {
case 0:
n = this.pointToScreenPoint(i)[0];
var d = h.subtract(n),
p = n.add(h).scaled(.5);
m = (m = new s(-d.y, d.x)).normalized(), u = p.add(m.scaled(this._dist)),
u = this.screenPointToPoint(u), this._points[0] = i, this._points[2] =
u;
break;
case 1:
var _ = r(n, h, u).distance;
d = (h = this.pointToScreenPoint(i)[0]).subtract(n), p = n.add(h).scaled(
.5);
m = (m = new s(-d.y, d.x)).normalized(), u = p.add(m.scaled(this._dist)),
u = this.screenPointToPoint(u), this._points[1] = i, this._points[2] =
u;
break;
case 2:
i = this.pointToScreenPoint(i)[0];
var m;
_ = r(n, h, i).distance, d = h.subtract(n), p = n.add(h).scaled(.5);
m = (m = new s(-d.y, d.x)).normalized(), u = p.add(m.scaled(_));
var f = p.add(m.scaled(-_)),
g = d.length(),
b = d.x / g,
v = d.y / g,
S = Math.acos(b);
v < 0 && (S = -S);
var y = l(-p.x, -p.y);
i = c(y, i);
var w = c(y, u);
y = o(-S), i = c(y, i), w = c(y, w), y = a(1, g / (2 * _)), i = c(y, i), w =
c(y, w);
var P = i.y * w.y >= 0 ? new s(u.x, u.y) : new s(f.x, f.y);
P = this.screenPointToPoint(P), this._points[2] = P
}
this.normalizePoints()
}
migrateVersion(e, t, i) {
if (1 === e && 2 === this._points.length) {
var s = (2 * this._points[0].price + 3 * this._points[1].price) / 5;
this._points.append({
price: s,
index: this._points[1].index
})
}
if (1 === e && 2 === this._timePoint.length) {
var r = {
price: s = (2 * this._timePoint[0].price + 3 * this._timePoint[1]
.price) / 5,
offset: this._timePoint[1].offset,
time_t: this._timePoint[1].time_t
};
this._timePoint.append(r)
}
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D")))
.GeneralFiguresDefinitionsViewModel
}
static createProperties(e) {
var t = new u("linetoolarc", e);
return p._configureProperties(t), t
}
static _configureProperties(e) {
h._configureProperties(e), e.addChild("linesColors", new d([e.color]))
}
}
p.version = 2, t.LineToolArc = p
},
"0YCj": function(e, t, i) {
"use strict";
(function(e, t) {
i("Eyy1").assert;
var s = i("txPx").getLogger("Chart.Study.MetaInfo"),
r = i("9iCb").applyOverridesToStudyDefaults,
n = {};
function o(e) {
TradingView.merge(this, {
palettes: {},
inputs: [],
plots: [],
graphics: {},
defaults: {}
}), TradingView.merge(this, e);
var t = e.fullId || e.id;
TradingView.merge(this, o.parseIdString(t)), this.name = this.id
}
o.VERSION_STUDY_ARG_SOURCE = 41, o.METAINFO_FORMAT_VERSION_SOS_V2 = 42, o
.VERSION_PINE_PROTECT_TV_4164 = 43, o.CURRENT_METAINFO_FORMAT_VERSION = 52, o
.VERSION_NEW_STUDY_PRECISION_FORMAT = 46, o.CHILD_STUDY_ALLOWED_PLOT_TYPES = [
"line"
], o.canPlotBeSourceOfChildStudy = function(e) {
return o.CHILD_STUDY_ALLOWED_PLOT_TYPES.includes(e)
}, o.CHILD_STUDY_EXCLUDE_IDS = ["CorrelationCoefficient@tv-basicstudies",
"Correlation - Log@tv-basicstudies-1"
], o.CHILD_STUDY_PARENT_EXCLUDE_IDS = [], o.FilledArea = {}, o.FilledArea
.TYPE_PLOTS = "plot_plot", o.FilledArea.TYPE_HLINES = "hline_hline", o.versionOf =
function(e) {
var t = "_metainfoVersion" in e && isNumber(e._metainfoVersion) ? e
._metainfoVersion : 0;
return t < 0 && s.logError("Metainfo format version cannot be negative: " + t),
t
}, o.parseIdString = function(e) {
var t = {};
if (-1 === e.indexOf("@")) t.shortId = e, t.packageId = "tv-basicstudies", t
.id = e + "@" + t.packageId, t.version = 1;
else {
var i = e.split("@");
t.shortId = i[0];
var s = i[1].split("-");
if (3 === s.length) t.packageId = s.slice(0, 2).join("-"), t.id = t
.shortId + "@" + t.packageId, t.version = s[2];
else if (1 === s.length && "decisionbar" === s[0]) t.packageId = "les-" + s[
0], t.id = t.shortId + "@" + t.packageId, t.version = 1;
else {
if (1 !== s.length) throw new Error("unexpected study id:" + e);
t.packageId = "tv-" + s[0], t.id = t.shortId + "@" + t.packageId, t
.version = 1
}
}
if (t.fullId = t.id + "-" + t.version, "tv-scripting" === t.packageId) {
var r = t.shortId;
if (0 === r.indexOf("Script$") || 0 === r.indexOf("StrategyScript$")) {
var n = r.indexOf("_");
t.productId = n >= 0 ? r.substring(0, n) : t.packageId
} else t.productId = t.packageId
} else t.productId = t.packageId;
return t
}, o.getPackageName = function(e) {
return (/^[^@]+@([^-]+-[^-]+)/.exec(e || "") || [0, "tv-basicstudies"])[1]
}, o.cutDollarHash = function(e) {
var t = e.indexOf("$"),
i = e.indexOf("@");
return -1 === t ? e : e.substr(0, t) + (i >= 0 ? e.substr(i) : "")
}, o.hasUserIdSuffix = function(e) {
return /^USER;[\d\w]+;\d+$/.test(e)
}, o.isStandardPine = function(e) {
return /^(Strategy)?Script\$STD;.*@tv-scripting$/.test(e)
}, o.getSourceIdByInputs = function(e, t) {
if (!Array.isArray(e) || !t) return null;
for (var i = 0; i < e.length; ++i) {
var s = e[i];
if (o.isSourceInput(s) && "string" == typeof t[s.id]) {
var r = t[s.id];
return ~r.indexOf("$") && (r = r.split("$")[0]), r
}
}
return null
}, o.getSourceInputIds = function(e) {
for (var t = [], i = e.inputs, s = 0; s < i.length; ++s) {
var r = i[s];
o.isSourceInput(r) && t.push(r.id)
}
return t
}, o.setChildStudyMetaInfoPropertiesSourceId = function(t, i, s) {
for (var r = 0; r < t.inputs.length; ++r) {
var n = t.inputs[r];
if (o.isSourceInput(n) && (s instanceof e && s.inputs && s.inputs[n.id])) {
var a = s.inputs[n.id].value();
if (a.indexOf("$") > 0) {
var l = a.replace(/^[^\$]+/, i);
s.inputs[n.id].setValue(l)
}
}
}
}, o.patchChildStudyMetaInfoState = function(e) {
e.state && function e(t) {
if ("object" == typeof t)
for (var i in t) "string" == typeof t[i] && /^[^\$]+\$\d+$/.test(t[
i]) ? t[i] = t[i].replace(/^[^\$]+/, "{pid}") : e(t[i])
}(e.state.inputs), e.state.isChildStudy = !0
}, o.prototype.parseValue = function(e, t) {
return "bool" === e ? TradingView.parseBool(t) : t
}, o.prototype.defaultInputs = function() {
for (var e = [], t = 0; t < this.inputs.length; t++) e.push(this.inputs[t]
.defval);
return e
}, o.prototype.state = function(e) {
var t = {};
for (var i in this) this.hasOwnProperty(i) && (t[i] = this[i], !0 !== e &&
"id" === i && (t[i] += "-" + this.version));
return t
}, o.prototype.symbolInputId = function() {
var e = this.inputs.filter((function(e) {
return "symbol" === e.type
}));
return e.length > 0 ? e[0].id : null
}, o.prototype.createDefaults = function() {
if (this.defaults) {
var e = TradingView.clone(this.defaults);
e.precision = "default";
var t = o.getStudyPropertyRootName(this);
defaults.create(t, e)
}
}, o.prototype.removeDefaults = function() {
defaults.remove(o.getStudyPropertyRootName(this))
}, o.findStudyMetaInfoByDescription = function(e, t) {
if (e) {
for (var i = 0; i < e.length; ++i)
if (e[i].description.toLowerCase() === t.toLowerCase()) return e[i];
throw new Error("unexpected study id:" + t)
}
throw new Error("There is no studies metainfo")
}, o.isParentSourceId = function(e) {
return "string" == typeof e && /^[^\$]+\$\d+$/.test(e)
}, o.isSourceInput = function(e) {
return e.id && (("source" === e.id || "src" === e.id) && ("text" === e.type ||
"source" === e.type) || "source" === e.type)
}, o.getChildSourceInputTitles = function(e, t, i) {
var s = {};
if (t.plots && t.plots.length && e.options && e.options.length)
for (var r, n, a, l = 0; l < e.options.length; ++l) n = (r = e.options[
l]) && +r.split("$")[1], (a = isFinite(n) && t.plots[n]) && ~o
.CHILD_STUDY_ALLOWED_PLOT_TYPES.indexOf(a.type) && (s[r] = t.styles && t
.styles[a.id] && t.styles[a.id].title || a.id, i && (s[r] = i +
": " + s[r]));
return s
};
var a = new Map([
["AnchoredVWAP@tv-basicstudies", "linetoolanchoredvwap"],
["RegressionTrend@tv-basicstudies", "linetoolregressiontrend"]
]);
o.getStudyPropertyRootName = function(e) {
var t = a.get(e.id);
if (void 0 !== t) return t;
var i = "study_" + e.id;
return e.pine && e.pine.version && (i += "_" + e.pine.version.replace(".",
"_")), i
}, o.getStudyPropertyRootNameById = function(e) {
var t = a.get(e);
return void 0 !== t ? t : "study_" + e
}, o.overrideDefaults = function(e) {
0 !== e.length && r(n, e, (function(e) {
return TradingView.defaultProperties[o.getStudyPropertyRootName(
e)] || null
}))
}, o.mergeDefaultsOverrides = function(e) {
TradingView.merge(n, e)
}, o.isScriptStrategy = function(e) {
if (e.extra && e.extra.kind) return e.extra.kind === TVScript.Kinds.STRATEGY;
if (!0 === e.isTVScriptStrategy) return !0;
var t = e.TVScriptSourceCode || e.scriptSource;
return !!t && TVScript.isStrategy(t)
}, o.getOrderedInputIds = function(e) {
for (var t = [], i = e.inputs, s = 0; s < i.length; ++s) {
var r = i[s];
t.push(r.id)
}
return t
}, o.canBeChild = function(e) {
if (e && "string" == typeof e) return !0;
if (!e || e.extra && !o.isAllowedSourceInputsCount(e.extra.sourceInputsCount) ||
!0 === e.canNotBeChild || !1 === e.canBeChild || ~o.CHILD_STUDY_EXCLUDE_IDS
.indexOf(e.id)) return !1;
for (var t = e.inputs, i = 0, s = 0; s < t.length; ++s) o.isSourceInput(t[s]) &&
++i;
return o.isAllowedSourceInputsCount(i)
}, o.isAllowedSourceInputsCount = function(e) {
return 1 === e
}, o.canHaveChildren = function(e) {
if (e) {
if (e.isTVScriptStrategy || e.TVScriptSourceCode && TVScript.isStrategy(e
.TVScriptSourceCode)) return !1;
if (e.id && !~o.CHILD_STUDY_PARENT_EXCLUDE_IDS.indexOf(e.id) && Array
.isArray(e.plots))
for (var t = 0; t < e.plots.length; ++t)
if (~o.CHILD_STUDY_ALLOWED_PLOT_TYPES.indexOf(e.plots[t].type))
return !0
}
return !1
}, TradingView.StudyMetaInfo = o, t && t.exports && (t.exports = o)
}).call(this, i("tc+8"), i("YuTi")(e))
},
"0psP": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "GeneralChartPropertiesRenderer", (function() {
return r
}));
var s = i("sQaR");
class r extends s.a {
constructor(e) {
super(), this._dialog = null, this._subscribe = e => {
this._setVisibility(e)
}, this._chartWidgetCollection = e
}
show() {
const e = this._chartWidgetCollection,
t = e.activeChartWidget.value();
return t.generalPropertiesDefinitions().then(s => Promise.all([i.e("redux"), i
.e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i
.e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i.e(19), i
.e(21), i.e(22), i.e(23), i.e(26), i.e(29), i.e(33), i.e(34), i
.e(35), i.e(36), i.e(39), i.e(45), i.e(68), i.e(87), i.e(0), i
.e(2), i.e(5), i.e(7), i.e(10), i.e(15), i.e(18), i.e(20), i.e(
25), i.e(27), i.e(30), i.e(31), i.e(32), i.e(37), i.e(44), i
.e("general-chart-properties-dialog")
]).then(i.bind(null, "PI1I")).then(i => {
var r, n;
const o = new i.GeneralChartPropertiesDialogRenderer({
chartWidgetCollection: e,
propertyPages: s,
activePageId: this._activePageId,
model: t.model()
});
return null === (r = this._dialog) || void 0 === r || r.hide(),
null === (n = this._dialog) || void 0 === n || n.visible()
.unsubscribe(this._subscribe), this._dialog = o, o.visible()
.subscribe(this._subscribe), o.show(), this._activePageId =
void 0, o
}))
}
hide() {
var e;
null === (e = this._dialog) || void 0 === e || e.hide()
}
isVisible() {
return this.visible().value()
}
focusOnText() {}
setActivePage(e) {
this._activePageId = e
}
}
},
"0qMc": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "lineToolsLocalizedNames", (function() {
return r
}));
i("YFKU");
var s = i("+GxX");
const r = {
LineTool5PointsPattern: window.t("XABCD Pattern"),
LineToolABCD: window.t("ABCD Pattern"),
LineToolArc: window.t("Arc"),
LineToolArrow: window.t("Arrow"),
LineToolArrowMarkDown: window.t("Arrow Mark Down"),
LineToolArrowMarkLeft: window.t("Arrow Mark Left"),
LineToolArrowMarkRight: window.t("Arrow Mark Right"),
LineToolArrowMarkUp: window.t("Arrow Mark Up"),
LineToolBalloon: window.t("Balloon"),
LineToolBarsPattern: window.t("Bars Pattern"),
LineToolBezierCubic: window.t("Double Curve"),
LineToolBezierQuadro: window.t("Curve"),
LineToolBrush: window.t("Brush"),
LineToolCallout: window.t("Callout"),
LineToolCircleLines: window.t("Cyclic Lines"),
LineToolCypherPattern: window.t("Cypher Pattern"),
LineToolDateAndPriceRange: window.t("Date and Price Range"),
LineToolDateRange: window.t("Date Range"),
LineToolDisjointAngle: window.t("Disjoint Channel"),
LineToolElliottCorrection: window.t("Elliott Correction Wave (ABC)"),
LineToolElliottDoubleCombo: window.t("Elliott Double Combo Wave (WXY)"),
LineToolElliottImpulse: window.t("Elliott Impulse Wave (12345)"),
LineToolElliottTriangle: window.t("Elliott Triangle Wave (ABCDE)"),
LineToolElliottTripleCombo: window.t("Elliott Triple Combo Wave (WXYXZ)"),
LineToolEllipse: window.t("Ellipse"),
LineToolExtended: window.t("Extended Line"),
LineToolFibChannel: window.t("Fib Channel"),
LineToolFibCircles: window.t("Fib Circles"),
LineToolFibRetracement: window.t("Fib Retracement"),
LineToolFibSpeedResistanceArcs: window.t("Fib Speed Resistance Arcs"),
LineToolFibSpeedResistanceFan: window.t("Fib Speed Resistance Fan"),
LineToolFibSpiral: window.t("Fib Spiral"),
LineToolFibTimeZone: window.t("Fib Time Zone"),
LineToolFibWedge: window.t("Fib Wedge"),
LineToolFlagMark: window.t("Flag Mark"),
LineToolImage: window.t("Image"),
LineToolFlatBottom: window.t("Flat Top/Bottom"),
LineToolAnchoredVWAP: window.t("Anchored VWAP"),
LineToolGannComplex: window.t("Gann Square"),
LineToolGannFixed: window.t("Gann Square Fixed"),
LineToolGannFan: window.t("Gann Fan"),
LineToolGannSquare: window.t("Gann Box"),
LineToolHeadAndShoulders: window.t("Head and Shoulders"),
LineToolHorzLine: window.t("Horizontal Line"),
LineToolHorzRay: window.t("Horizontal Ray"),
LineToolIcon: window.t("Icon"),
LineToolInsidePitchfork: window.t("Inside Pitchfork"),
LineToolNote: window.t("Note"),
LineToolNoteAbsolute: window.t("Anchored Note"),
LineToolSignpost: window.t("Signpost"),
LineToolParallelChannel: window.t("Parallel Channel"),
LineToolPitchfan: window.t("Pitchfan"),
LineToolPitchfork: window.t("Pitchfork"),
LineToolPolyline: window.t("Polyline"),
LineToolPath: window.t("Path"),
LineToolPrediction: window.t("Forecast"),
LineToolPriceLabel: window.t("Price Label"),
LineToolArrowMarker: window.t("Arrow Marker"),
LineToolPriceRange: window.t("Price Range"),
LineToolProjection: window.t("Projection"),
LineToolRay: window.t("Ray"),
LineToolRectangle: window.t("Rectangle"),
LineToolRegressionTrend: window.t("Regression Trend"),
LineToolRiskRewardLong: window.t("Long Position"),
LineToolRiskRewardShort: window.t("Short Position"),
LineToolFixedRangeVolumeProfile: window.t("Fixed Range Volume Profile"),
LineToolRotatedRectangle: window.t("Rotated Rectangle"),
LineToolSchiffPitchfork: window.t("Modified Schiff Pitchfork"),
LineToolSchiffPitchfork2: window.t("Schiff Pitchfork"),
LineToolSineLine: window.t("Sine Line"),
LineToolText: window.t("Text", {
context: "tool"
}),
LineToolTextAbsolute: window.t("Anchored Text"),
LineToolThreeDrivers: window.t("Three Drives Pattern"),
LineToolTimeCycles: window.t("Time Cycles"),
LineToolTrendAngle: window.t("Trend Angle"),
LineToolTrendBasedFibExtension: window.t("Trend-Based Fib Extension"),
LineToolTrendBasedFibTime: window.t("Trend-Based Fib Time"),
LineToolTrendLine: window.t("Trend Line"),
LineToolInfoLine: window.t("Info Line"),
LineToolTriangle: window.t("Triangle"),
LineToolTrianglePattern: window.t("Triangle Pattern"),
LineToolVertLine: window.t("Vertical Line"),
LineToolCrossLine: window.t("Cross Line"),
LineToolHighlighter: window.t("Highlighter"),
LineToolPriceNote: window.t("Price Note"),
LineToolVbPFixed: window.t("Volume Profile Fixed Range")
};
Object(s.isFeatureEnabled)("remove-line-tool-ghost-feed") || (r.LineToolGhostFeed = window.t(
"Ghost Feed"))
},
"1AAW": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("hY0g"),
r = i.n(s);
function n(e, ...t) {
const i = (...t) => e(...t.map(e => e.value())),
s = new r.a(i(...t)),
n = () => s.setValue(i(...t)),
o = t.map(e => e.spawn());
for (const e of o) e.subscribe(n);
return s.readonly().spawn(() => o.forEach(e => e.destroy()))
}
},
"1ANp": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "navigationButtonsVisibilityKey", (function() {
return r
})), i.d(t, "property", (function() {
return n
})), i.d(t, "availableValues", (function() {
return o
})), i.d(t, "actualBehavior", (function() {
return a
}));
var s = i("+jnJ");
const r = "NavigationButtons.visibility",
{
property: n,
availableValues: o,
actualBehavior: a
} = Object(s.a)(r)
},
"1IXQ": function(e, t, i) {
"use strict";
i("jJ9X");
var s = i("aO4+").Point,
r = i("/3z9"),
n = i("qFKp").CheckMobile,
o = i("7KDR"),
a = o.Action,
l = o.Separator,
c = i("ikwP").hardResizeCanvas,
h = i("S8xo").MouseEventHandler,
u = i("YmeR").ActionBinder,
d = i("T6Of").LimitedPrecisionNumericFormatter,
p = i("HZKX").createLinesAction,
_ = i("xzdg").PriceAxisWidgetBase,
m = i("Kxc7"),
f = window.t("Merge All Scales Into One");
class g extends _ {
constructor(e, t, i, s, r, n, o, a) {
super(e, t, i, r, n, s, a), this._axisInfo = o, this._offset = 0, this
.restoreDefaultCursor(), this.update(), this._mouseEventHandler = new h(this
._topCanvasBinding.canvas, this, {
treatVertTouchDragAsPageScroll: !1,
treatHorzTouchDragAsPageScroll: !0
}), this.contextMenu = null, this.actions = null
}
destroy() {
null !== this.actions && this.actions.reset && this.actions.reset.destroy(), this
._mouseEventHandler.destroy(), super.destroy()
}
dataSourceAtPoint(e, t) {
var i = this._grouppedSources(),
r = i.sources.concat(Array.from(i.topLevelSources)).concat(this._pane.state()
.customSources()),
n = null,
o = null;
if (!this._priceScale) return null;
function a(e, t) {
var i = o ? o.result() : 0;
e.result() > i && (o = e, n = t)
}
for (var l = new s(e, t), c = this._pane.state(), h = r.length - 1; h >= 0; --h) {
var u = r[h],
d = u.priceAxisViews(c, this._priceScale);
if (d && 0 !== d.length)
for (var p = d.length - 1; p >= 0; --p) {
var _ = d[p].renderer();
if (null !== _ && void 0 !== _.hitTest) {
var m = _.hitTest(l, this._size.w, this._isLeft ? "left" : "right");
null !== m && a(m, u)
}
}
}
return n
}
_initActions(e) {
if (this._pane.hasState() && null === this.actions) {
this.actions = {};
var t = this,
s = this._pane.chart().model();
this.actions.reset = new a({
label: window.t("Reset Price Scale"),
icon: i("LdoW"),
shortcut: "Alt+R",
shortcutHint: r.humanReadableHash(r.Modifiers.Alt + 82),
statName: "ResetScale",
onExecute: g.prototype.reset.bind(this)
}), this.actions.setAutoScale = new a({
label: window.t("Auto (Fits Data To Screen)"),
checkable: !0,
checked: !0,
statName: "ToggleAutoScale",
onExecute: function() {
s.togglePriceScaleAutoScaleMode(t.priceScale()), t
._updateScalesActions()
}
}), this.actions.setPercentage = new a({
label: window.t("Percent", {
context: "scale_menu"
}),
checkable: !0,
checked: this.priceScale().isPercentage(),
statName: "TogglePercantage",
onExecute: function() {
s.togglePriceScalePercentageScaleMode(t.priceScale()), t
._updateScalesActions()
}
}), this.actions.setIndexedTo100 = new a({
label: window.t("Indexed to 100", {
context: "scale_menu"
}),
checkable: !0,
checked: this.priceScale().isIndexedTo100(),
statName: "ToggleIndexedTo100",
onExecute: function() {
s.togglePriceScaleIndexedTo100ScaleMode(t.priceScale()), t
._updateScalesActions()
}
}), this.actions.setLog = new a({
label: window.t("Logarithmic", {
context: "scale_menu"
}),
checkable: !0,
checked: this.priceScale().isLog(),
statName: "ToggleLogScale",
onExecute: function() {
s.togglePriceScaleLogScaleMode(t.priceScale()), t
._updateScalesActions()
}
}), this.actions.setRegular = new a({
label: window.t("Regular", {
context: "scale_menu"
}),
checkable: !0,
checked: this.priceScale().isRegular(),
statName: "ToggleRegularScale",
onExecute: function() {
s.setPriceScaleRegularScaleMode(t.priceScale()), t
._updateScalesActions()
}
}), this.actions.alignLabels = new a({
label: window.t("No Overlapping Labels", {
context: "scale_menu"
}),
checkable: !0,
checked: !1,
statName: "TogglePreciseLabels"
}), this.actions.alignLabels.binding = new u(this.actions.alignLabels, this
.priceScale().properties().alignLabels, this._pane.chart().model(),
"No Overlapping Labels"), this.actions.invertScale = new a({
label: window.t("Invert Scale", {
context: "scale_menu"
}),
checkable: !0,
checked: this.priceScale().isInverted(),
statName: "Invert Scale",
onExecute: function() {
s.invertPriceScale(t.priceScale()), t._updateScalesActions()
}
}), this._updateScalesActions()
}
}
_logAction() {
return this._isMainSeriesAxis() ? this._pane.chart().actions().logSeriesScale : this
.actions.setLog
}
_percentageAction() {
return this._isMainSeriesAxis() ? this._pane.chart().actions().percentSeriesScale :
this.actions.setPercentage
}
_indexedTo100Action() {
return this._isMainSeriesAxis() ? this._pane.chart().actions()
.indexedTo100SeriesScale : this.actions.setIndexedTo100
}
_autoScaleAction() {
return this._isMainSeriesAxis() ? this._pane.chart().actions().autoSeriesScale :
this.actions.setAutoScale
}
_regularScaleAction() {
return this._isMainSeriesAxis() ? this._pane.chart().actions().regularSeriesScale :
this.actions.setRegular
}
_lockScaleAction() {
var e = this._pane.chart().actions().lockSeriesScale,
t = v(this.priceScale(), this._pane.chart().model().model()
.mainSeriesScaleRatio());
return e.update({
hint: t
}), e
}
_invertAction() {
return this._isMainSeriesAxis() ? this._pane.chart().actions().invertSeriesScale :
this.actions.invertScale
}
_isMainSeriesAxis() {
return this.priceScale().hasMainSeries()
}
_updateMainSeriesScalesActions() {
this._isMainSeriesAxis() && null !== this.actions && this._updateScalesActions()
}
_updateScalesActions() {
var e = this.priceScale(),
t = this._isMainSeriesAxis(),
i = e.mainSource().properties(),
s = t && e.isLockScale(),
r = t && i.style.value() === TradingView.Series.STYLE_PNF;
this.actions.setRegular.update({
checked: e.isRegular(),
disabled: s || r
}), this.actions.setPercentage.update({
checked: e.isPercentage(),
disabled: s || r
}), this.actions.setIndexedTo100.update({
checked: e.isIndexedTo100(),
disabled: s || r
}), this.actions.setLog.update({
checked: e.isLog(),
disabled: s || r
}), this.actions.setAutoScale.update({
checked: e.isAutoScale(),
disabled: e.properties().autoScaleDisabled.value()
})
}
_createMergeScalesAction() {
var e = this._pane.chart().actions(),
t = this._pane.chart().model().model().priceScaleSlotsCount();
if (t.left + t.right === 1) return 0 === t.left ? e.moveScaleToLeft : e
.moveScaleToRight;
var i = [];
return i.push(e.mergeLeftScalesAction), i.push(e.mergeRightScalesAction), new a({
label: f,
subItems: i
})
}
getContextMenuActions() {
this._initActions();
var e = this._pane.chart().actions(),
t = [];
if (t.push(this.actions.reset, new l, this._autoScaleAction()), this
._isMainSeriesAxis() && t.push(this._lockScaleAction()), t.push(e
.scaleSeriesOnly, this._invertAction(), new l, this._regularScaleAction(),
this._percentageAction(), this._indexedTo100Action(), this._logAction(),
new l), n.any() || (t.push(this._createMergeScalesAction()), t.push(new l)),
!m.enabled("fundamental_widget")) {
t.push(new a({
label: window.t("Labels"),
subItems: [e.showSymbolLabelsAction, e.showSeriesLastValue,
null, null, e.showHighLowPriceLabels, e
.showAverageClosePriceLabel, null, e
.showStudyPlotNamesAction, e.showStudyLastValue, null,
null, this.actions.alignLabels
].filter(Boolean)
}))
}
return t.push(p(this._pane.chart())), this._options.countdownEnabled && t.push(e
.showCountdown), this._options.currencyConversionEnabled && t.push(e
.showCurrency), this._options.unitConversionEnabled && t.push(e.showUnit),
this._pane.chart().model().crossHairSource().isMenuEnabled() && t.push(e
.addPlusButton), !TradingView.onWidget() && m.enabled(
"show_chart_property_page") && m.enabled("chart_property_page_scales") && e
.scalesProperties && t.push(new l, e.scalesProperties), t
}
setSizeAndOffset(e, t) {
if (e.w < 0 || e.h < 0) throw new Error(
"Try to set invalid size to PriceAxisWidget " + JSON.stringify(e));
this._size.equals(e) || (this._size = e, this._canvasBinding.resizeCanvas({
width: e.w,
height: e.h
}), this._topCanvasBinding.resizeCanvas({
width: e.w,
height: e.h
}), this._cell.style.width = e.w + "px", this._cell.style.height = e.h +
"px", this._cell.style.minWidth = e.w + "px"), this._offset !== t && (this
._offset = t, this._cell.style.left = t + "px")
}
getWidth() {
return this._size.w
}
update() {}
hardResetCanvas() {
null !== this._size && (c(this._canvasBinding, this._size), c(this
._topCanvasBinding, this._size))
}
_isMainPane() {
return this._pane.state().containsMainSeries()
}
restoreDefaultCursor() {
this.setCursor("")
}
setCursor(e) {
var t = "";
"grabbing" !== e && "ns-resize" !== e || (t = "price-axis--cursor-" + e), this
._currentCursorClassName !== t && (this._currentCursorClassName && this._cell
.classList.remove(this._currentCursorClassName), t && this._cell.classList
.add(t), this._currentCursorClassName = t, this._cell.style.cursor)
}
axisInfo() {
return this._axisInfo
}
}
function b(e) {
var t = new d(e);
return function(e, i) {
return isNumber(i) && !e.isLog() ? t.format(i) : ""
}
}
var v = b(4);
e.exports = {
PriceAxisWidget: g,
scaleRatioForContextMenuTransformer: b
}
},
"1Wlv": function(e, t, i) {
"use strict";
(function(e) {
var s = i("Yj6H").PriceScaleBase,
r = i("7ktv").PriceDataSource,
n = i("Qb4w").PriceRange,
o = i("e3/o").randomHash,
a = i("3ClC").isStudy,
l = i("TTFo"),
c = l.fromLog,
h = l.toLog;
class u extends s {
constructor(t, i) {
super(i), this._scalesProperties = t, this.m_scrollStartPoint = null;
var s = this;
this._modeChanged = new e, this._properties.isInverted.listeners()
.subscribe(this, u.prototype._onIsInvertedChanged), this._properties
.listeners().subscribe(null, (function() {
if (s.mainSource() && s.mainSource().model()) {
var e = s.mainSource().model().paneForSource(s
.mainSource());
s.mainSource().model().updatePane(e)
}
})), this._scalesProperties.listeners().subscribe(this, (function() {
this._marksCache = null
})), this.setId(o())
}
_convertPriceRangeFromLog(e) {
if (null === e) return null;
var t = c(e.minValue()),
i = c(e.maxValue());
return new n(t, i)
}
_convertPriceRangeToLog(e) {
if (null === e) return null;
var t = h(e.minValue()),
i = h(e.maxValue());
return new n(t, i)
}
_canConvertPriceRangeFromLog(e) {
if (null === e) return !1;
var t = c(e.minValue()),
i = c(e.maxValue());
return isFinite(t) && isFinite(i)
}
mode() {
return {
autoScale: this._properties.autoScale.value(),
lockScale: this._properties.lockScale.value(),
percentage: this._properties.percentage.value(),
indexedTo100: this._properties.indexedTo100.value(),
log: this._properties.log.value()
}
}
setMode(e) {
var t = {},
i = this.mode(),
s = this._properties.state(),
r = null;
void 0 !== e.autoScale && e.autoScale !== s.autoScale && (t.autoScale = e
.autoScale, this._setAutoScaleValueWithDependentProperties(e
.autoScale)), void 0 !== e.lockScale && e.lockScale !== s
.lockScale && (t.lockScale = e.lockScale, this
._setLockScaleValueWithDependentProperties(e.lockScale)), void 0 !==
e.percentage && e.percentage !== s.percentage && (t.percentage = e
.percentage, this._setPercentageValueWithDependentProperties(e
.percentage), this._invalidatedForRange.isValid = !1),
void 0 !== e.indexedTo100 && e.indexedTo100 !== s.indexedTo100 && (t
.indexedTo100 = e.indexedTo100, this
._setIndexedTo100ValueWithDependentProperties(e.indexedTo100), this
._invalidatedForRange.isValid = !1), void 0 !== e.log && e.log !== s
.log && (t.log = e.log, this._setLogValueWithDependentProperties(e
.log)), s.log && !this._properties.log.value() && (this
._canConvertPriceRangeFromLog(this.m_priceRange) ? null !== (r =
this._convertPriceRangeFromLog(this.m_priceRange)) && this
.setPriceRange(r) : this.properties().autoScale.setValue(!0)), !s
.log && this._properties.log.value() && null !== (r = this
._convertPriceRangeToLog(this.m_priceRange)) && this.setPriceRange(
r), s.autoScale !== this._properties.autoScale.value() && this
._properties.autoScale.listeners().fire(this._properties.autoScale), s
.autoScaleDisabled !== this._properties.autoScaleDisabled.value() &&
this._properties.autoScaleDisabled.listeners().fire(this._properties
.autoScaleDisabled), s.lockScale !== this._properties.lockScale
.value() && this._properties.lockScale.listeners().fire(this._properties
.lockScale), s.percentage !== this._properties.percentage.value() &&
(this._properties.percentage.listeners().fire(this._properties
.percentage), this.updateFormatter()), s.indexedTo100 !== this
._properties.indexedTo100.value() && (this._properties.indexedTo100
.listeners().fire(this._properties.indexedTo100), this
.updateFormatter()), s.percentageDisabled !== this._properties
.percentageDisabled.value() && this._properties.percentageDisabled
.listeners().fire(this._properties.percentageDisabled), s.log !== this
._properties.log.value() && this._properties.log.listeners().fire(this
._properties.log), s.logDisabled !== this._properties.logDisabled
.value() && this._properties.logDisabled.listeners().fire(this
._properties.logDisabled), void 0 === t.log && void 0 === t
.percentage && void 0 === t.lockScale && void 0 === t.autoScale &&
void 0 === t.indexedTo100 || this._modeChanged.fire(i, this.mode())
}
modeChanged() {
return this._modeChanged
}
fontSize() {
return this._scalesProperties.fontSize.value()
}
isEmpty() {
return this._makeSureItIsValid(), 0 === this.m_height || !this
.m_priceRange || this.m_priceRange.isEmpty()
}
startScroll(e) {
this.isAutoScale() || null === this.m_scrollStartPoint && null === this
._priceRangeSnapshot && (this.isEmpty() || (this.m_scrollStartPoint = e,
this._priceRangeSnapshot = this.priceRange().clone()))
}
scrollTo(e) {
if (!this.isAutoScale() && null !== this.m_scrollStartPoint) {
var t = this.priceRange().length() / (this.internalHeight() - 1),
i = e - this.m_scrollStartPoint;
this.isInverted() && (i *= -1);
var s = i * t,
r = this._priceRangeSnapshot.clone();
r.shift(s), this.setPriceRange(r, !0), this._marksCache = null
}
}
endScroll() {
this.isAutoScale() || null !== this.m_scrollStartPoint && (this
.m_scrollStartPoint = null, this._priceRangeSnapshot = null)
}
_onIsInvertedChanged() {
this._marksCache = null, this._markBuilder.rebuildTickMarks()
}
canDetachSource(e) {
return this.m_dataSources.some((function(t) {
return t !== e && t instanceof r && !(a(t) && t
.isLinkedToSeries())
}))
}
}
t.PriceScale = u
}).call(this, i("aIyQ"))
},
"1pHB": function(e, t) {
e.exports =
''
},
"2+aH": function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("aO4+"),
n = i("fgLi"),
o = i("hY0g"),
a = i.n(o),
l = i("HGP3"),
c = i("KcY8"),
h = i("Ulff");
class u extends c.a {
constructor(e, t, i) {
super(), this._source = e, this._priceScale = t, this._priceProvider = i
}
setHitTestData(e) {
this._hitTestData = e
}
additionalPadding(e) {
return 0
}
_updateRendererData(e, t, i) {
e.visible = !1, t.visible = !1;
const s = this._priceScale.mainSource(),
r = null !== s ? s.firstValue() : null;
if (!this._isVisible() || this._priceScale.isEmpty() || null === r) return;
const n = this._priceProvider(this._priceScale);
if (null === n) return;
i.background = this._bgColor(), i.textColor = this.generateTextColor(i
.background);
const o = this.additionalPadding(this._priceScale.fontSize());
i.additionalPaddingTop = o, i.additionalPaddingBottom = o, i.coordinate = this
._priceScale.priceToCoordinate(n, r), e.text = this._priceScale.formatPrice(
n, r), e.visible = !0, t.visible = !0, t.hitTestData = this._hitTestData
}
}
const d = {
normalBgColor: l.colorsPalette["color-cold-gray-750"],
hoveredBgColor: l.colorsPalette["color-cold-gray-600"]
},
p = {
normalBgColor: l.colorsPalette["color-cold-gray-900"],
hoveredBgColor: l.colorsPalette["color-cold-gray-650"]
};
class _ extends u {
additionalPadding(e) {
return 2 / 12 * e
}
_isVisible() {
return this._source.visible && null !== this._source.pane
}
_bgColor() {
return this._getThemedColors().normalBgColor
}
_updateRendererData(e, t, i) {
const s = t.visible;
super._updateRendererData(e, t, i), this._source.isHovered() ? t.backgroung = this
._getThemedColors().hoveredBgColor : t.backgroung = void 0, s || (t.visible = s)
}
_getThemedColors() {
return this._source.model().isDark() ? d : p
}
}
class m extends u {
_isVisible() {
return null !== this._source.measurePane()
}
_bgColor() {
return h.a.common
}
}
var f = i("mMWL"),
g = i("YFKU"),
b = i("FQhm"),
v = i("KtbP"),
S = i("JWMC"),
y = (i("7KDR"), i("5VQP")),
w = (i("Kxc7"), i("/tGj"));
function P(e) {
const t = e.priceScale();
return null === t ? 0 : t.isPercentage() || t.isIndexedTo100() ? 2 : 1
}
class C extends v.PanePriceAxisView {
constructor(e, t, i, s, r) {
super(e, t, s), this._crossHairMenuCachedState = null, this._hasActions = !1,
this._tooltipText = null, this._gaOrigin = "CH menu", this
._crosshairPriceAxisView = e, e.setPaneRendererLabelIcon(0), this
._crosshair = t, this._scale = i,
this._options = r
}
_updateImpl(e, t) {
super._updateImpl(e, t);
const i = this._crosshair.y,
s = this._chartModel.properties().scalesProperties.fontSize.value(),
r = this._chartModel.timeScale().width(),
n = this._crosshair.model().priceAxisRendererOptions(),
o = s + 2 * this._crosshairPriceAxisView.additionalPadding(s) + n
.paddingTop + n.paddingBottom,
a = o,
l = i - o / 2,
c = r - a,
h = this._crosshair.pane,
u = this._mainDataSourceOnPane(),
d = u && u.symbolSource(),
p = !!d && (d.isConvertedToOtherCurrency() || d.isConvertedToOtherUnit());
if (null !== u) {
const e = P(u),
t = u.idForAlert(),
i = this._crossHairMenuCachedState;
null !== i && i.id === t && i.priceScale === e && i
.isCurrencyOrUnitConverted === p || (this
._updateTooltipAndActionsAvaliability(u, e, p), this
._crossHairMenuCachedState = {
id: t,
priceScale: e,
isCurrencyOrUnitConverted: p
})
}
const _ = null !== u && Object(w.isSymbolSource)(u) ? u.symbol() : null,
m = Boolean(_) || !1;
this._crosshairPriceAxisView.setPaneLabelVisible(m);
const f = null !== h && 0 !== h.leftPriceScales().length && m,
g = null !== h && 0 !== h.rightPriceScales().length && m,
b = r - a / 2,
v = this._tooltipText ? {
text: this._tooltipText,
rect: {
x: b,
y: l,
w: 0,
h: 0
}
} : void 0;
this._data = {
left: f,
right: g,
xl: 0,
xr: c,
y: l,
containerWidth: a,
containerHeight: o,
clickHandler: this._handleClick.bind(this),
tooltip: v
}, this._crosshairPriceAxisView.setHitTestData(this._data)
}
_priceScale() {
return this._scale
}
_updateTooltipAndActionsAvaliability(e, t, i) {
this._tooltipText = null, this._hasActions = !1;
if (!(1 === t)) return;
const s = !i && !1;
let r = 0;
s && r++;
let n = 0;
1 === r && (s ? (n = 1, this._tooltipText = window.t("Add Alert")) : this
._tooltipText = window.t("Add Horizontal Line")), this
._crosshairPriceAxisView.setPaneRendererLabelIcon(n), this._hasActions =
0 !== r
}
_handleClick(e, t, i) {
Object(S.trackEvent)(this._gaOrigin, "click");
const s = this._mainDataSourceOnPane(),
r = null !== s && Object(w.isSymbolSource)(s) ? s.symbol() : null,
n = {
pageX: i.pageX,
pageY: i.pageY,
clientX: i.clientX,
clientY: i.clientY,
screenX: i.screenX,
screenY: i.screenY,
price: this._crosshair.price,
symbol: r
};
b.emit("onPlusClick", n)
}
_getMenuItems(e) {
return Promise.resolve([])
}
_createAlertMenuItems(e) {
return Promise.resolve([])
}
_createTradingMenuItems() {
return Promise.resolve([])
}
_createAddHorizontalLineMenuItem() {
return []
}
_getActionAddAlert(e) {
return null
}
_getActionAddHorizontalLine(e) {
return null
}
_getValue(e, t) {
const i = e.priceScale(),
s = e.firstValue();
if (null === i || null === s) return null;
return i.isPercentage() || i.isIndexedTo100() ? null : i.coordinateToPrice(t, s)
}
_formatValue(e, t) {
return t.formatter().format(e)
}
_addAlert(e, t) {}
_addHorizontalLineTool(e, t) {}
_showContextMenu(e, t, i, r) {
const n = "left" === r;
setTimeout(() => {
y.ContextMenuManager.createMenu(e).then(e => {
e.show((e, t) => {
const r = Object(s.ensureDefined)(this
._data),
o = Object(s.ensureNotNull)(i.view)
.innerHeight,
a = n ? r.xl : r.xr,
l = i.localX - a,
c = {
left: i.clientX - l,
right: i.clientX - l + r
.containerWidth,
top: i.clientY - r.containerHeight /
2,
bottom: i.clientY + r
.containerHeight / 2
};
return {
clientX: n ? c.left : c.right - e,
clientY: o < c.bottom + t ? c.top - t :
c.bottom
}
})
})
})
}
_mainDataSourceOnPane() {
const e = this._crosshair.pane;
return null !== e ? e.mainDataSource() : null
}
}
var x = i("Tmoa"),
T = i("8Uy/"),
I = i("VaSN"),
M = i("jFln"),
O = i("VdBB"),
L = i("gAom");
class A {
constructor(e) {
this._data = e
}
hitTest(e) {
return void 0 === this._data.clickHandler ? null : new O.HitTestResult(O
.HitTestResult.CUSTOM, {
clickHandler: this._data.clickHandler,
tapHandler: this._data.clickHandler
})
}
draw(e, t) {
const i = t.pixelRatio,
s = this._data.vertLinesVisible,
r = this._data.horzLinesVisible;
if (!s && !r) return;
e.save(), e.lineWidth = Math.max(1, Math.floor(this._data.lineWidth * i)), e
.strokeStyle = this._data.color, e.fillStyle = this._data.color, e.lineCap =
"butt", Object(M.setLineStyle)(e, this._data.lineStyle);
const n = Math.round(this._data.x * i),
o = Math.round(this._data.y * i),
a = Math.ceil(this._data.w * i),
l = Math.ceil(this._data.h * i);
s && n >= 0 && Object(L.drawVerticalLine)(e, n, 0, l), r && o >= 0 && Object(L
.drawHorizontalLine)(e, o, 0, a), this._data.drawCenter && (e.beginPath(), e
.arc(n, o, Math.round(3 * i), 0, 2 * Math.PI, !0), e.fillStyle = this._data
.color, e.fill()), e.restore()
}
}
var E = i("CW80");
const k = l.colorsPalette["color-tv-blue-500"],
D = l.colorsPalette["color-tv-blue-500"];
class V {
constructor(e, t) {
this._rendererData = {}, this._renderer = new A(this._rendererData), this._source =
e, this._pane = t
}
update() {}
renderer(e, t) {
const i = this._source.selectPointMode().value(),
r = this._source.visible && (this._source.areLinesVisible || i) && !this._source
.linesShouldBeHidden(),
n = this._rendererData;
if (!r || null === this._pane) return null;
const o = this._source.paneForPointSelect(),
a = null !== o ? this._source.pane === o && this._pane === o : this._pane ===
this._source.pane;
if (i && this._source.isOnHoveredChartWidget() && a) {
const e = Object(s.ensureNotNull)(this._source.pointToSelect());
n.color = k, n.lineWidth = 1, n.lineStyle = T.LINESTYLE_SOLID, n
.horzLinesVisible = !0, n.vertLinesVisible = !0, n.drawCenter = !0,
"time" === e ? (n.horzLinesVisible = !1, n.drawCenter = !1) : "price" ===
e && (n.vertLinesVisible = !1, n.drawCenter = !1)
} else {
const e = this._source.properties(),
t = this._source.model().currentTool(),
i = Object(I.lastEventIsTouch)() && (Object(E.isLineToolName)(t) || Object(f
.toolIsMeasure)(t));
let s;
s = i ? D : e.childs().color.value();
const r = e.childs().transparency.value();
!i && r > 0 && (s = Object(x.generateColor)(s, r)), n.color = s, n
.horzLinesVisible = this._pane === this._source.pane, n.vertLinesVisible = !
0, n.lineWidth = e.childs().width.value(), n.lineStyle = e.childs().style
.value(), n.drawCenter = i && this._pane === this._source.pane
}
return n.w = this._pane.width(), n.h = this._pane.height(), n.x = void 0 !== this
._source.lockedX && isFinite(this._source.lockedX) && this._source.lockedX ||
this._source.x, n.y = this._source.y, this._renderer
}
}
var B = i("IjC5");
const R = {
backgroundColor: Object(x.generateColor)(l.colorsPalette["color-tv-blue-500"], 70),
borderColor: Object(x.generateColor)(l.colorsPalette["color-tv-blue-500"], 20)
};
class N {
constructor(e) {
this._renderer = new B.RectangleRenderer, this._rectangle = null, this._crosshair =
e
}
update() {
const e = this._crosshair.selection();
null !== e && null !== this._crosshair.pane ? this._rectangle = this._crosshair.pane
.logicalRectToPixels(e) : this._rectangle = null
}
renderer(e, t) {
if (!this._rectangle) return null;
const i = {
backcolor: R.backgroundColor,
color: R.borderColor,
fillBackground: !0,
linewidth: 1,
points: [this._rectangle.min, this._rectangle.max],
extendLeft: !1,
extendRight: !1
};
return this._renderer.setData(i), this._renderer
}
}
var j = i("Ialn"),
F = i("GH0z"),
W = i("5C6T"),
H = i("nda6"),
U = i("nEwK"),
z = i("pJOz"),
G = i("qgcf"),
q = i("Zy3/"),
Y = i("a7Ha"),
K = i("zDbI");
const J = Object(g.t)("{count} bars"),
Z = Object(g.t)("Vol"),
X = new F.PercentageFormatter,
$ = new H.TimeSpanFormatter,
Q = new U.VolumeFormatter,
ee = Object(l.getHexColorByName)("color-tv-blue-500"),
te = {
bgColorPositive: Object(x.generateColor)(ee, 80),
bgColorNegative: "rgba(239,83,80,0.2)",
colorPositive: "#1E53E5",
colorNegative: "#EF5350",
labelBgColorPositive: ee,
labelBgColorNegative: "#EF5350"
};
class ie {
constructor(e, t) {
this._pipFormatter = null, this._lastSymbolInfo = null, this._horzTrenRenderer =
new z.TrendLineRenderer, this._vertTrenRenderer = new z.TrendLineRenderer, this
._bgRenderer = new B.RectangleRenderer, this._labelRenderer = new G
.TextRenderer, this._p1 = null, this._p2 = null, this._label = null, this
._source = e, this._pane = t
}
update() {
const [e, t] = this._source.measurePoints();
if (void 0 === t) return this._p1 = null, void(this._p2 = null);
const i = Object(s.ensureNotNull)(this._source.measurePane()),
n = e.price,
o = t.price,
a = t.price - n,
l = t.index - e.index,
c = Object(j.forceLTRStr)("" + l),
h = Object(s.ensureNotNull)(i.mainDataSource());
let u = Object(s.ensureNotNull)(h.formatter()).format(a);
if (Math.abs(n) > 1e-8) {
const e = a / Math.abs(n);
u += " (" + X.format(100 * e) + ")"
}
const d = Object(j.forceLTRStr)(u);
this._label = d + "\n" + J.format({
count: c
});
const p = Object(s.ensureNotNull)(h.firstValue()),
_ = this._source.model().timeScale().indexToCoordinate(e.index),
m = this._source.model().timeScale().indexToCoordinate(t.index),
f = i.defaultPriceScale().priceToCoordinate(n, p),
g = i.defaultPriceScale().priceToCoordinate(o, p);
this._p1 = new r.Point(_, f), this._p2 = new r.Point(m, g);
const b = this._source.model().timeScale().indexToUserTime(e.index),
v = this._source.model().timeScale().indexToUserTime(t.index);
let S = null;
if (null !== b && null !== v) {
const e = this._pane.model().mainSeries().symbolInfo();
null !== e && e !== this._lastSymbolInfo && (this._pipFormatter = new W
.PipFormatter(e.pricescale, e.minmov, e.type, e.minmove2), this
._lastSymbolInfo = e), S = (v.valueOf() - b.valueOf()) / 1e3
}
const y = this._pipFormatter ? this._pipFormatter.format(a) : null,
w = null !== y ? " , " + y : "",
P = null !== S ? $.format(S) : null,
C = null !== P ? ", " + Object(j.startWithLTR)(P) : "";
this._label = Object(j.forceLTRStr)(d + w) + "\n" + J.format({
count: c
}) + C;
const x = this._source.measureVolume();
Number.isNaN(x) || (this._label += `\n${Z} ${Q.format(x)}`);
const I = o < n ? te.bgColorNegative : te.bgColorPositive,
M = o < n ? te.colorNegative : te.colorPositive,
O = o < n ? te.labelBgColorNegative : te.labelBgColorPositive,
L = {
points: [this._p1, this._p2],
linewidth: 0,
fillBackground: !0,
color: I,
backcolor: I,
extendLeft: !1,
extendRight: !1
};
this._bgRenderer.setData(L);
const A = this._p1.add(this._p2).scaled(.5); {
const e = Math.round(A.y),
t = new r.Point(this._p1.x, e),
i = new r.Point(this._p2.x, e),
s = {
points: [t, i],
color: M,
linewidth: 1,
linestyle: T.LINESTYLE_SOLID,
extendleft: !1,
extendright: !1,
leftend: Y.LineEnd.Normal,
rightend: Math.abs(t.x - i.x) >= 50 ? Y.LineEnd.Arrow : Y.LineEnd.Normal
};
this._horzTrenRenderer.setData(s)
} {
const e = Math.round(A.x),
t = new r.Point(e, this._p1.y),
i = new r.Point(e, this._p2.y),
s = {
points: [t, i],
color: M,
linewidth: 1,
linestyle: T.LINESTYLE_SOLID,
extendleft: !1,
extendright: !1,
leftend: Y.LineEnd.Normal,
rightend: Math.abs(t.y - i.y) >= 50 ? Y.LineEnd.Arrow : Y.LineEnd.Normal
};
this._vertTrenRenderer.setData(s)
}
const E = {
x: 0,
y: 10
},
k = .5 * (this._p1.x + this._p2.x),
D = this._p2.y,
V = new r.Point(k, D),
B = (R = Object(s.ensureNotNull)(this._label), {
points: [V],
text: R,
color: "#FFFFFF",
horzAlign: "center",
vertAlign: "middle",
font: K.CHART_FONT_FAMILY,
offsetX: E.x,
offsetY: E.y,
bold: !1,
italic: !1,
fontsize: 12,
padding: 8,
highlightBorder: !1,
backgroundColor: O,
backgroundTransparency: 10,
backgroundVertInflate: 5,
backgroundHorzInflate: 5,
backgroundRoundRect: 4
});
var R;
this._labelRenderer.setData(B);
const N = this._labelRenderer.measure(),
F = Object(G.calculateLabelPosition)(N, this._p1, this._p2, E, this._pane
.height());
this._labelRenderer.setPoints([F])
}
renderer() {
if (null === this._p1 || null === this._p2) return null;
const e = new q.CompositeRenderer;
return e.append(this._bgRenderer), e.append(this._horzTrenRenderer), e.append(this
._vertTrenRenderer), e.append(this._labelRenderer), e
}
}
var se = i("cPgM");
class re extends se.ScaledPaneRenderer {
constructor(e) {
super(), this._data = e
}
hitTest(e) {
return null
}
_drawImpl(e) {
e.translate(this._data.x - this._data.width / 2, this._data.y - this._data
.height / 2), e.strokeStyle = "rgba(153,153,153,.3)", e.lineWidth = 2, e
.beginPath(), this._drawShackle(e), e.stroke(), e.closePath(), e
.strokeStyle = "rgba(153,153,153,.7)", e.lineWidth = 1, e.beginPath(), e
.rect(0, this._data.height - this._data.bodyHeight + .5, this._data.width,
this._data.bodyHeight), e.closePath(), e.stroke(), e.translate(0, -1), e
.strokeStyle = "#777", e.beginPath(), this._drawShackle(e), e.stroke(), e
.closePath(), e.fillStyle = "rgba(255,255,255,.7)", e.beginPath(), e.rect(1,
this._data.height - this._data.bodyHeight + 1.5, this._data.width - 2,
this._data.bodyHeight - 2), e.fill(), e.beginPath(), e.rect(.5, this
._data.height - this._data.bodyHeight + 1, this._data.width - 1, this
._data.bodyHeight - 1), e.stroke(), e.closePath(), e.fillStyle = "#777",
e.fillRect(this._data.width / 2 - .5, this._data.height - this._data
.bodyHeight / 2, 1, 2)
}
_drawShackle(e) {
const t = (this._data.width - 3) / 2,
i = this._data.height - this._data.bodyHeight;
e.moveTo(1.5, t), e.arc(this._data.width / 2, t, t, Math.PI, 2 * Math.PI), i >
t && (e.moveTo(1.5, t), e.lineTo(1.5, i), e.moveTo(this._data.width - 1.5,
t), e.lineTo(this._data.width - 1.5, i))
}
}
class ne {
constructor(e, t, i) {
this._horzVisible = !1, this._source = e, this._pane = t, this._axis = i || "x"
}
update() {}
renderer(e, t) {
const i = this._source.visible && this._source.areLinesVisible,
r = Object(f.lockTimeAxis)().value(),
n = i && this._horzVisible,
o = i || r;
if ("y" === this._axis && !n || !o) return null;
const a = "y" === this._axis ? this._pane.width() - 4.5 : Object(s.ensureDefined)(
this._source.lockedX) + 1,
l = "y" === this._axis ? this._source.y : this._pane.height() - 5.5 - 1;
return new re({
x: a,
y: l,
width: 9,
height: 11,
bodyHeight: 7
})
}
}
var oe = i("qFKp"),
ae = i("aIyQ"),
le = i.n(ae),
ce = i("GDWD"),
he = i("ivNn"),
ue = i("4miz");
const de = window.t("n/a");
class pe extends ue.b {
constructor(e) {
super(),
this._invalidated = !0, this._dateItem = new ue.a(window.t("Date"), ""),
this._timeItem = new ue.a(window.t("Time"), ""), this._model = e, this
._items.push(this._dateItem), this._items.push(this._timeItem)
}
update() {
this._invalidated = !0
}
items() {
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
._items
}
_updateImpl() {
const e = this._model.mainSeries().isDWM();
if (this._timeItem.setVisible(!e), this._timeItem.setValue(de), this._dateItem
.setValue(de), this._model.timeScale().isEmpty()) return;
let t = this._model.crossHairSource().appliedIndex();
if (!Object(he.isNumber)(t)) {
const e = this._model.mainSeries().data().last();
if (null === e) return;
t = e.index
}
const i = this._model.timeScale().indexToUserTime(t);
null !== i && (this._dateItem.setValue(this._model.dateFormatter().format(i)),
e || this._timeItem.setValue(this._model.timeFormatter().format(i)))
}
}
var _e = i("cgFQ");
class me extends _e.a {
constructor(e, t, i = !1) {
super(e), this._indexProvider = t, this._highlighted = i
}
_getBgColor() {
const e = this._model.isDark();
return this._highlighted ? h.a.common : e ? l.colorsPalette[
"color-cold-gray-750"] : l.colorsPalette["color-cold-gray-900"]
}
_getIndex() {
return this._model.crossHairSource().visible ? this._indexProvider() : null
}
}
var fe = i("585y");
i.d(t, "Crosshair", (function() {
return be
}));
const ge = {
menuEnabled: !1,
menuForMainSourceOnly: !1,
disableTradingMenuActions: !1,
disableDrawHorizLineMenuAction: !1
};
class be extends n.DataSource {
constructor(e, t, i) {
super(), this.pane = null, this.price = NaN, this.index = NaN, this.visible = !
0, this.areLinesVisible = !0, this.x = NaN, this.y = NaN, this
._measuringEnabled = new le.a, this._measurePane = null, this
._startMeasurePoint = null, this._endMeasurePoint = null, this
._lastValidMeasurePoint = null, this._isOnHoveredChartWidget = !1, this
._selectPointMode = new a.a(!1), this._selectionPane = null, this
._selectionView = new N(this), this._selectionStartPoint = null, this
._measurePaneView = null, this._timeLockPaneView = null, this
._priceAxisViews = new Map, this._panePriceAxisViews = new Map, this
._startMeasurePriceAxisViews = new Map, this._endMeasurePriceAxisViews =
new Map, this._originX = NaN, this._originY = NaN, this._subscribed = !1,
this._movedDelegate = new le.a, this._pointSelectedDelegate = new le.a, this
._requestedPoint = null, this._paneForRequestedPoint = null, this
._volumeCalculator = null, this._model = e, this._options = Object
.assign({}, ge, i || {}), this._linesShouldBeHidden = this._model
.readOnly(), this._dataWindowView = new pe(e), this.setSelectionEnabled(!1);
const r = e => t => t === Object(s.ensureNotNull)(this._measurePane)
.defaultPriceScale() ? e() : null;
this._currentPosPriceProvider = e => {
const t = Object(s.ensureNotNull)(this.pane);
if (e === t.defaultPriceScale()) return this.price;
const i = Object(s.ensureNotNull)(t.defaultPriceScale().mainSource())
.firstValue();
if (null === i) return null;
const r = t.defaultPriceScale().priceToCoordinate(this.price, i),
n = Object(s.ensureNotNull)(e.mainSource()).firstValue();
return null === n ? null : e.coordinateToPrice(r, n)
}, this._startMeasurePriceProvider = r(() => Object(s.ensureNotNull)(this
._startMeasurePoint).price),
this._endMeasurePriceProvider = r(() => Object(s.ensureNotNull)(this
._lastMeasurePoint()).price), this._properties = t;
this._timeAxisView = new me(e, () => this.appliedIndex(), !1), this
._startMeasureTimeAxisView = new me(e, () => Object(s.ensureNotNull)(this
._startMeasurePoint).index, !0), this._endMeasureTimeAxisView = new me(
e, () => Object(s.ensureNotNull)(this._lastMeasurePoint()).index, !0), e
.readOnly() || f.cursorTool.subscribe(e => this.areLinesVisible =
"arrow" !== e, {
callWithLast: !0
})
}
destroy() {
null !== this._volumeCalculator && this._volumeCalculator.destroy()
}
moved() {
return this._movedDelegate
}
originX() {
return this._originX
}
originY() {
return this._originY
}
saveOriginCoords(e, t) {
this._originX = e, this._originY = t
}
clearOriginCoords() {
this._originX = NaN, this._originY = NaN
}
currentPoint() {
return new r.Point(this.x, this.y)
}
model() {
return this._model
}
appliedIndex() {
return Number.isFinite(this.lockedIndex) ? this.lockedIndex : this.index
}
startMeasurePoint() {
return this._startMeasurePoint || null
}
endMeasurePoint() {
return this._endMeasurePoint || null
}
measureVolume() {
if (null === this._volumeCalculator) return NaN;
const [e, t] = this.measurePoints();
return void 0 === t ? NaN : this._volumeCalculator.volume(e.index, t.index)
}
measurePane() {
return this._measurePane || null
}
startMeasuring(e, t) {
this._startMeasurePoint = e, this._measurePane = t, this._measuringEnabled.fire(
!0), t.containsMainSeries() && (Object(s.assert)(null === this
._volumeCalculator), this._volumeCalculator = new fe.a(this.model()
.mainSeries()))
}
finishMeasure(e) {
this._endMeasurePoint = e
}
clearMeasure() {
delete this._measurePane, delete this._startMeasurePoint, delete this
._endMeasurePoint, delete this._lastValidMeasurePoint, this._model
.lightUpdate(), null !== this._volumeCalculator && (this._volumeCalculator
.destroy(), this._volumeCalculator = null), this._measuringEnabled.fire(
!1)
}
measuringEnabled() {
return this._measuringEnabled
}
measurePoints() {
this.updateAllViews();
const e = [Object(s.ensureNotNull)(this._startMeasurePoint)],
t = this._lastMeasurePoint();
return null !== t && e.push(t), e
}
startSelection(e) {
this._selectionStartPoint = this.currentLogicalPoint(), this._selectionPane = e
}
clearSelection() {
this._selectionStartPoint = null, this._selectionPane = null
}
selection() {
return this._selectionStartPoint ? {
p1: this._selectionStartPoint,
p2: this.currentLogicalPoint()
} : null
}
currentLogicalPoint() {
return {
index: this.appliedIndex(),
price: this.price
}
}
selectPointMode() {
return this._selectPointMode
}
cancelRequestSelectPoint() {
this._selectPointMode.value() && this._setSelectPointModeState(!1)
}
requestSelectPoint(e, t) {
Object(s.assert)(!this._selectPointMode.value(), "Point already requested"),
t && (Object(s.assert)(-1 !== this._model.panes().indexOf(t),
"Chartmodel doesn't contains specified pane"), this
._paneForRequestedPoint = t, this._model.panesCollectionChanged()
.subscribe(this, this._paneCollectionChanged)), this._requestedPoint =
e, this._setSelectPointModeState(!0)
}
onPointSelected() {
return this._pointSelectedDelegate
}
trySelectCurrentPoint() {
const e = Object(s.ensureNotNull)(this._requestedPoint);
if (!this._model.mainSeries().bars().contains(this.index) && "price" !== e)
return;
const t = Object(s.ensureNotNull)(this.pane);
if (this._paneForRequestedPoint && this._paneForRequestedPoint !== t) return;
let i, r;
if ("price" === e || (i = this._model.timeScale().indexToTimePoint(this.index),
null !== i)) {
if ("time" !== e) {
const e = t.mainDataSource();
if (null === e) return;
const i = e.firstValue(),
s = e.priceScale();
if (null === i || null === s) return;
r = s.coordinateToPrice(this.y, i)
}
this._setSelectPointModeState(!1), this._pointSelectedDelegate.fire({
time: i,
price: r
}, t)
}
}
isOnHoveredChartWidget() {
return this._isOnHoveredChartWidget
}
setOnHoveredChartWidget(e) {
this._isOnHoveredChartWidget = e
}
clearPosition() {
this.visible = !1, this.index = NaN, this.price = NaN, this.x = NaN, this.y =
NaN, this.pane = null, this.clearOriginCoords()
}
setPosition(e, t, i) {
return this._subscribed || (this._model.mainSeries().onRestarted().subscribe(
this, this.clearMeasure), this._subscribed = !0), this
.setLockedPosition(i), this.visible = !0, this._tryToUpdateViews(e, t, i)
}
setLinesShouldBeHidden(e) {
this._linesShouldBeHidden = e
}
linesShouldBeHidden() {
return this._linesShouldBeHidden
}
handleContextMenuEvent(e) {
this._selectPointMode.value() && this._setSelectPointModeState(!1)
}
properties() {
return this._properties
}
priceAxisViews(e, t) {
const i = null === this._requestedPoint || "time" !== this._requestedPoint || !
this._isOnHoveredChartWidget,
s = [];
return this.pane === e && i && s.push(this._createPriceAxisViewOnDemand(this
._priceAxisViews, this._panePriceAxisViews, e, t, this
._currentPosPriceProvider, _, !0)[0]), this._startMeasurePoint && s
.push(this._createPriceAxisViewOnDemand(this._startMeasurePriceAxisViews,
null, e, t, this._startMeasurePriceProvider, m)[0]), this
._lastMeasurePoint() && s.push(this._createPriceAxisViewOnDemand(this
._endMeasurePriceAxisViews, null, e, t, this
._endMeasurePriceProvider, m)[0]), s
}
timeAxisViews() {
const e = [],
t = null === this._requestedPoint || "price" !== this._requestedPoint || !
this._isOnHoveredChartWidget;
return !this._linesShouldBeHidden && (this.visible || Object(f.lockTimeAxis)()
.value()) && t && e.push(this._timeAxisView), this._startMeasurePoint &&
e.push(this._startMeasureTimeAxisView), this._lastMeasurePoint() && e.push(
this._endMeasureTimeAxisView), e
}
paneViews(e) {
if (void 0 === e) return null;
const t = [new V(this, e)];
if (e === this._selectionPane && t.push(this._selectionView), e === this
._measurePane && (null === this._measurePaneView && (this._measurePaneView =
new ie(this, e)), this._measurePaneView.update(), t.push(this
._measurePaneView)), ce.addPlusButtonProperty.value()) {
const i = e === this.pane,
s = !oe.CheckMobile.any() || window.screen.width >= 320,
r = f.tool.value(),
n = Object(E.isLineToolName)(r),
o = null !== this._model.lineBeingEdited() || null !== this._model
.lineBeingCreated() || this._model.sourcesBeingMoved().length > 0 ||
null !== this._model.customSourceBeingMoved() || Object(f.toolIsMeasure)
(r);
if (i && this._isOnHoveredChartWidget && !this._selectPointMode.value() &&
s && !n && !o) {
const i = e.mainDataSource();
if (null !== i) {
const s = i.priceScale();
if (null !== s) {
const i = this._createPriceAxisViewOnDemand(this
._priceAxisViews, this._panePriceAxisViews, e, s, this
._currentPosPriceProvider, _, !0)[1];
null !== i && t.push(i)
}
}
}
}
return Object(f.lockTimeAxis)().value() && (null === this._timeLockPaneView && (
this._timeLockPaneView = new ne(this, e)), t.push(this
._timeLockPaneView)), t
}
dataWindowView() {
return this._dataWindowView
}
updateAllViews() {
this._priceAxisViews.forEach(e => {
e.forEach(e => e.update())
}), this._panePriceAxisViews.forEach(e => {
e.forEach(e => e.update())
}), this._startMeasurePoint && (this._startMeasurePriceAxisViews.forEach(
e => {
e.forEach(e => e.update())
}), this._startMeasureTimeAxisView.update()), this
._lastMeasurePoint() && (this._endMeasurePriceAxisViews.forEach(e => {
e.forEach(e => e.update())
}), this._endMeasureTimeAxisView.update()), this._timeAxisView.update(),
this._selectionView.update(), this._dataWindowView.update()
}
setLockedPosition(e) {
delete this.lockedIndex, delete this.lockedX, e !== this._measurePane && Object(
f.lockTimeAxis)().value() && (this.lockedIndex = this._model.timeScale()
.points().roughIndex(f.lockTimeAxisTime.value()), null !== this
.lockedIndex && (this.lockedX = this._model.timeScale()
.indexToCoordinate(this.lockedIndex)))
}
isMenuEnabled() {
return this._options.menuEnabled
}
isHoveredEnabled() {
return ce.addPlusButtonProperty.value()
}
isHovered() {
return this._model.hoveredSource() === this
}
pointToSelect() {
return this._requestedPoint
}
paneForPointSelect() {
return this._paneForRequestedPoint
}
_lastMeasurePoint() {
return this._endMeasurePoint ? this._endMeasurePoint : (null !== this.pane &&
this._measurePane === this.pane && (this._lastValidMeasurePoint = {
price: this._model.magnet().align(this.price, this.index, this
.pane),
index: this.index
}), this._lastValidMeasurePoint || null)
}
_createPriceAxisViewOnDemand(e, t, i, r, n, o, a = !1) {
let l = e.get(i),
c = null !== t ? t.get(i) : void 0;
void 0 === l && (l = new Map, e.set(i, l), this._options.menuEnabled && null !==
t && (c = new Map, t.set(i, c)), a && i.onDestroyed().subscribe(this,
() => this._onPaneDestroyed(i)));
let h = l.get(r);
if (void 0 === h) {
if (h = new o(this, r, n), l.set(r, h), void 0 !== c) {
const e = new C(h, this, r, this._model, this._options);
c.set(r, e)
}
a && r.lastSourceRemoved().subscribe(this, () => this._onPriceScaleCleared(
r))
}
let u = null;
return void 0 !== c && (u = Object(s.ensureDefined)(c.get(r))), [h, u]
}
_onPaneDestroyed(e) {
e.onDestroyed().unsubscribeAll(this), this._priceAxisViews.delete(e), this
._panePriceAxisViews.delete(e), this._startMeasurePriceAxisViews.delete(e),
this._endMeasurePriceAxisViews.delete(e)
}
_onPriceScaleCleared(e) {
e.lastSourceRemoved().unsubscribeAll(this), this._priceAxisViews.forEach(t => t
.delete(e)), this._panePriceAxisViews.forEach(t => t.delete(e)), this
._startMeasurePriceAxisViews.forEach(t => t.delete(e)), this
._endMeasurePriceAxisViews.forEach(t => t.delete(e))
}
_tryToUpdateViews(e, t, i) {
return !!this._tryToUpdateData(e, t, i) && (this.updateAllViews(), this
._movedDelegate.fire({
index: this.index,
price: this.price
}), !0)
}
_tryToUpdateData(e, t, i) {
const r = this.x,
n = this.y,
o = this.price,
a = this.index,
l = this.pane,
c = this._priceScaleByPane(i);
if (this.index = e, this.x = isNaN(e) ? NaN : this._model.timeScale()
.indexToCoordinate(e), null !== c && null !== i) {
this.pane = i, this.price = t;
const e = Object(s.ensureNotNull)(i.mainDataSource()).firstValue();
this.y = null === e ? NaN : c.priceToCoordinate(t, e)
} else this.pane = null, this.price = NaN, this.y = NaN;
return r !== this.x || n !== this.y || a !== this.index || o !== this.price ||
l !== this.pane
}
_priceScaleByPane(e) {
return e && !e.defaultPriceScale().isEmpty() ? e.defaultPriceScale() : null
}
_setSelectPointModeState(e) {
e || (this._requestedPoint = null, this._paneForRequestedPoint && (this
._paneForRequestedPoint = null, this._model.panesCollectionChanged()
.unsubscribe(this, this._paneCollectionChanged))), this._selectPointMode
.setValue(e), this._model.lightUpdate()
}
_paneCollectionChanged(e) {
const t = this._paneForRequestedPoint;
null !== t && -1 === e.indexOf(t) && this.cancelRequestSelectPoint()
}
}
},
"22xp": function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("9uLv"),
n = i("txPx"),
o = i("//lZ"),
a = i("aIyQ"),
l = i.n(a),
c = i("Kxc7"),
h = i("Hr11"),
u = i("ogJP"),
d = i("FIi8"),
p = i("ZJKN");
class _ {
constructor(e, t) {
Object(s.assert)(e <= t,
"The left value should be greater than or equal to the right value"), this
._left = e, this._right = t
}
left() {
return this._left
}
right() {
return this._right
}
length() {
return this._right - this._left + 1
}
contains(e) {
return this._left <= e && e <= this._right
}
equals(e) {
return this._left === e.left() && this._right === e.right()
}
static compare(e, t) {
return null === e || null === t ? e === t : e.equals(t)
}
}
const m = Object(n.getLogger)("Chart.TimePoints");
class f {
constructor() {
this._zoffset = 0, this._items = []
}
clear() {
this._zoffset = 0, this._items = []
}
size() {
return this._items.length
}
firstIndex() {
return this._offsetToIndex(0)
}
lastIndex() {
return this._offsetToIndex(this._items.length - 1)
}
merge(e, t, i) {
if (0 === i.length) return m.logError(
"merge: 'values' does not contain any time points"), [];
if (t > this._zoffset && e + t > 0) return m.logError(
"merge: when the first time point index is updated, we should fill the time points starting from the first one"
), [];
if (0 === this._items.length) return this._items = i, this._zoffset = t, [{
change: "rebuild",
index: this._validOffsetToIndex(0)
}];
const s = e + this._zoffset;
if (s < 0) {
const r = Math.abs(s);
if (i.length < r) return m.logError(
"merge: 'values' does not contain enough time points to fill in the new items. 'index': " +
e.toString() + ", previous 'zoffset': " + this._zoffset.toString() +
", new 'zoffset': " + t.toString() + ", 'values.length': " + i
.length), [];
this._items = new Array(r).concat(this._items), this._zoffset = t;
for (let s = 0; s < i.length; ++s) this._items[e + s + t] = i[s];
return [{
change: "rebuild",
index: this._validOffsetToIndex(0)
}]
}
const r = [];
let n = s;
for (; n < this._items.length && n - s < i.length; ++n) this._items[n] = i[n - s], r
.push({
change: "update",
index: this._validOffsetToIndex(n),
value: i[n - s]
});
const o = s + i.length;
if (o > this._items.length) {
const e = o - this._items.length;
for (let t = n; t < n + e; ++t) {
const e = this._items.length;
this._items.push(i[t - s]), r.push({
change: "append",
index: this._validOffsetToIndex(e),
value: i[t - s]
})
}
} else {
for (let e = o; e < this._items.length; ++e) r.push({
change: "remove",
index: this._validOffsetToIndex(e),
value: this._items[e]
});
this._items.length = o
}
return this._zoffset = t, r
}
addTail(e, t) {
for (let i = t ? 1 : 0; i < e.length; i++) this._items.push(e[i])
}
remove(e) {
const t = this._indexToOffset(e);
if (null === t) return [];
const i = this._items.splice(t),
s = [];
for (let t = 0; t < i.length; t++) s.push({
change: "remove",
index: e + t,
value: i[t]
});
return s
}
valueAt(e) {
const t = this._indexToOffset(e);
return null !== t ? this._items[t] : null
}
indexOf(e, t) {
if (this._items.length < 1) return null;
if (e > this._items[this._items.length - 1]) return t ? this._validOffsetToIndex(
this._items.length - 1) : null;
for (let i = 0; i < this._items.length; ++i) {
if (e === this._items[i]) return this._validOffsetToIndex(i);
if (e < this._items[i]) return t ? this._validOffsetToIndex(i) : null
}
return null
}
state() {
return {
items: this._items,
zoffset: this._zoffset
}
}
restoreState(e) {
null !== e && (this._items = e.items, this._zoffset = e.zoffset)
}
roughTime(e, t = null) {
const i = this.valueAt(e);
if (null !== i) return i;
const s = this._items;
if (!s.length || s.length < 2) return null;
const r = s.length - 1,
n = this._validOffsetToIndex(0),
o = this._validOffsetToIndex(r),
a = s[0],
l = s[r],
c = (l - a) / (o - n);
if (e < n) {
return a - (n - e) * c
}
if (e > o) {
const i = e - o;
if (i < 500 && null != t) return t(l, i);
return l + i * c
}
return null
}
roughIndex(e, t = null) {
const i = this._items;
if (!i.length || i.length < 2) return null;
const s = i.length - 1,
r = this._validOffsetToIndex(0),
n = this._validOffsetToIndex(s),
o = i[0],
a = i[s];
if (e >= o && e <= a) return this.closestIndexLeft(e);
const l = (a - o) / (n - r);
if (e < o) {
const t = o - e;
return r - Math.round(t / l)
}
if (e > a) {
const i = e - a;
let s = Math.trunc(i / l);
if (s < 500 && null !== t) {
const i = t(a, e);
i.success && (s = i.result)
}
return n + s
}
return null
}
closestIndexLeft(e) {
const t = this._items;
if (!t.length) return null;
if (Number.isNaN(e)) return null;
let i = t.length - 1;
if (e >= t[i]) return this._validOffsetToIndex(i);
let s = 0;
const r = t[s];
if (e < r) return null;
if (e === r) return this._validOffsetToIndex(s);
for (; i > s + 1;) {
const r = s + i >> 1,
n = t[r];
if (n > e) i = r;
else {
if (!(n < e)) return n === e ? this._validOffsetToIndex(r) : null;
s = r
}
}
return this._validOffsetToIndex(s)
}
_validOffsetToIndex(e) {
return e - this._zoffset
}
_offsetToIndex(e) {
return 0 <= e && e < this.size() ? this._validOffsetToIndex(e) : null
}
_indexToOffset(e) {
const t = e + this._zoffset;
return 0 <= t && t < this.size() ? t : null
}
}
var g = i("tc+8"),
b = i.n(g);
const v = new Map([
[0, .1],
[11, .1],
[1, .35],
[9, .35],
[12, .35],
[8, .35]
]);
class S {
constructor(e, t) {
this._styleSpecificRanges = new Map, this._logicalRange = e, this._defaultStyle = t
}
strictRange(e) {
if (null === this._logicalRange) return null;
void 0 === e && (e = this._defaultStyle);
let t = this._styleSpecificRanges.get(e);
if (void 0 === t) {
const i = (v.get(e) || 0) / 2;
t = new p.BarsRange(Math.floor(this._logicalRange.left() + i), Math.ceil(this
._logicalRange.right() - i)), this._styleSpecificRanges.set(e, t)
}
return t
}
logicalRange() {
return this._logicalRange
}
isValid() {
return null !== this._logicalRange
}
static invalid() {
return new S(null, 1)
}
}
var y = i("Ocx9"),
w = i("GhVi"),
P = i("8OdW");
class C {
constructor(e, t = 50) {
this._actualSize = 0, this._usageTick = 1, this._oldestTick = 1, this._cache =
new Map, this._tick2Labels = new Map, this._format = e, this._maxSize = t
}
format(e) {
const t = this._cache.get(e.valueOf());
if (void 0 !== t) return t.string;
if (this._actualSize === this._maxSize) {
const e = this._tick2Labels.get(this._oldestTick);
this._tick2Labels.delete(this._oldestTick), this._cache.delete(Object(s
.ensureDefined)(e)), this._oldestTick++, this._actualSize--
}
const i = this._format(e);
return this._cache.set(e.valueOf(), {
string: i,
tick: this._usageTick
}), this._tick2Labels.set(this._usageTick, e.valueOf()), this._actualSize++,
this._usageTick++, i
}
}
var x = i("iboI"),
T = i("YFKU");
let I;
var M = i("kcTO");
i.d(t, "TimeScale", (function() {
return k
}));
const O = {
preserveBarSpacing: !1,
lockVisibleTimeRangeOnResize: !1,
rightBarStaysOnScroll: !0,
minBarSpacing: .5
},
L = c.enabled("low_density_bars"),
A = L ? 1 : 5,
E = Object(n.getLogger)("Chart.TimeScale");
class k {
constructor(e, t) {
this._width = 0, this._widthChanged = new l.a, this._rightOffset = 10, this
._rightOffsetChanged = new l.a, this._maxRightOffsetChanged = new l.a, this
._defaultRightOffsetProperty = new b.a(10), this._baseIndex = null, this
._leftEdgeIndex = null, this._barSpacingChanged = new l.a, this._barSpacing = 6,
this._visibleBars = S.invalid(), this._visibleBarsInvalidated = !0, this
._visibleBarsChanged = new l.a, this._logicalRangeChanged = new l.a, this
._points = new f, this._tickMarks = new w.Tickmarks, this._onScroll = new l.a,
this._resetDelegate = new l.a, this._scrollStartPoint = null, this
._scaleStartPoint = null, this._commonTransitionStartState = null, this
._formattedBySpan = new Map, this._requestingMoreData = !1, this
._requestedTickmarksCount = 0, this._endOfData = !1, this._options = Object(d
.deepExtend)({}, O, t), this._model = e, this._scalesProperties = e
.properties().scalesProperties, this._defaultRightOffsetProperty.listeners()
.subscribe(this, e => {
this.setRightOffset(e.value())
}), this._options.preserveBarSpacing && (this._barSpacing = this
._scalesProperties.childs().barSpacing.value() || 6), this
._barSpacingChanged.subscribe(this, this._maxRightOffsetOnChanged), this
._widthChanged.subscribe(this, this._maxRightOffsetOnChanged)
}
destroy() {
this._barSpacingChanged.unsubscribeAll(this), this._barSpacingChanged.destroy(),
this._widthChanged.unsubscribeAll(this), this._widthChanged.destroy()
}
isEmpty() {
return 0 === this._width || 0 === this._points.size()
}
update(e, t, i, s) {
this._visibleBarsInvalidated = !0, i.length > 0 && this._points.merge(e, t, i), this
._tickMarks.merge(s), this._correctOffset()
}
addTail(e, t, i) {
this._tickMarks.removeTail(t);
const r = e.params,
n = Object(s.ensureDefined)(this._tickMarks.maxIndex) + (i ? 0 : 1);
for (let e = 0; e < r.marks.length; e++) r.marks[e].index = n + e;
this._tickMarks.addTail(r.marks), this._points.addTail(r.changes, i);
const o = this._rightOffset - r.changes.length;
this._updateRightOffset(o)
}
state(e) {
const t = {
m_barSpacing: this.barSpacing(),
m_rightOffset: e ? this._rightOffset : this._defaultRightOffsetProperty
.value()
};
return e && (t.points = this._points.state(), t.tickmarks = this._tickMarks.state(),
t.width = this._width), t
}
restoreState(e, t) {
if (void 0 === e.m_barSpacing) return void E.logDebug(
"restoreState: invalid state");
if (void 0 === e.m_rightOffset) return void E.logDebug(
"restoreState: invalid state");
let i = e.m_barSpacing;
const s = e.m_rightOffset < 0 && !t ? this.rightOffsetDefaultValue() : e
.m_rightOffset,
r = s < 0 ? this.rightOffsetDefaultValue() : Math.round(s);
this._defaultRightOffsetProperty.setValue(r), this._rightOffset = s, t && (this
._requestedTickmarksCount = 1 / 0, this._endOfData = !0, this._points
.restoreState(e.points || null),
this._tickMarks.restoreState(e.tickmarks || null), e.width && this._width >
0 && (i *= this._width / e.width)), this._tryToUpdateBarSpacing(this
._barSpacing, i), this._correctOffset(), this._rightOffsetChanged.fire(this
._rightOffset)
}
marks() {
if (this.isEmpty()) return null;
const e = this._barSpacing,
t = 5 * ((this._scalesProperties.childs().fontSize.value() || 0) + 4),
i = Math.round(t / e),
r = Object(s.ensureNotNull)(this.visibleBarsStrictRange()),
n = Math.max(r.firstBar(), r.firstBar() - i),
o = Math.max(r.lastBar(), r.lastBar() - i),
a = this._tickMarks.build(e, t),
l = [];
for (const e of a) {
if (!(n <= e.index && e.index <= o)) continue;
const t = this._tickMarks.indexToTime(e.index);
null !== t && l.push({
coord: this.indexToCoordinate(e.index),
label: this.formatLabel(t, e.span),
span: e.span,
major: e.label >= P.DAY_SPAN
})
}
return l
}
visibleBarsStrictRange() {
return this._visibleBarsInvalidated && (this._visibleBarsInvalidated = !1, this
._updateVisibleBars()), this._visibleBars.strictRange()
}
visibleBarsStrictRangeChanged() {
return this._visibleBarsChanged
}
logicalRangeChanged() {
return this._logicalRangeChanged
}
tickMarks() {
return this._tickMarks
}
points() {
return this._points
}
width() {
return this._width
}
setWidth(e, t) {
if (!Number.isFinite(e) || e <= 0) return void E.logWarn(
"setWidth: invalid argument: " + e);
if (this._width === e) return;
if (this._visibleBarsInvalidated = !0, (t || this._options
.lockVisibleTimeRangeOnResize) && this._width) {
const t = this._barSpacing * e / this._width;
this._tryToUpdateBarSpacing(this._barSpacing, t)
}
if (null !== this._leftEdgeIndex) {
if (Object(s.ensureNotNull)(this.visibleBarsStrictRange()).firstBar() <= this
._leftEdgeIndex) {
const t = this._width - e;
this._rightOffset -= Math.round(t / this._barSpacing) + 1
}
}
this._width = e, this._widthChanged.fire(e);
const i = this._rightOffset;
this._correctOffset(), this._rightOffset !== i && this._rightOffsetChanged.fire(this
._rightOffset), this._requestMoreData()
}
setLeftEdgeFix(e) {
this._leftEdgeIndex = e;
const t = this.visibleBarsStrictRange();
if (null === t) return;
const i = t.firstBar() - e;
if (i < 0) {
const e = this._rightOffset - i - 1;
this.scrollToOffsetAnimated(e, 500)
}
}
indexToCoordinate(e) {
if (this.isEmpty()) return 0;
if (!Object(u.isInteger)(e)) return 0;
const t = this.baseIndex() + this._rightOffset - e;
return this._width - (t + .5) * this._barSpacing - 1
}
indexToUserTime(e) {
return this._tickMarks.indexToTime(e)
}
timePointToIndex(e) {
return this._points.indexOf(e, !0)
}
indexToTimePoint(e) {
return this._points.valueAt(e)
}
timeToCoordinate(e) {
const t = this._points.closestIndexLeft(e);
if (null === t) return null;
const i = Object(s.ensureNotNull)(this._points.valueAt(t)),
r = this.indexToCoordinate(t);
if (r <= 0 || r >= this._width) return null;
const n = this.barSpacing(),
o = this.baseIndex(),
a = r + (e - i) / (Object(s.ensureNotNull)(this._points.valueAt(o)) - Object(s
.ensureNotNull)(this._points.valueAt(o - 1))) * n + 1;
return a <= 0 || a >= this._width ? null : a
}
barIndexesToCoordinates(e) {
const t = this.baseIndex();
for (const i of e) {
const e = i.time,
s = t + this._rightOffset - e,
r = this._width - (s + .5) * this._barSpacing - 1;
i.time = r, i.exactTime = r
}
}
timedValuesToCoordinates(e) {
const t = this.baseIndex() + this._rightOffset,
i = this._width - t * this._barSpacing - .5 * this._barSpacing - 1;
for (const t of e) t.x = i + t.x * this._barSpacing
}
indexesToCoordinates(e, t) {
if (this.isEmpty()) return;
void 0 === t && (t = e.length);
const i = this.baseIndex() + this._rightOffset,
s = this._width - i * this._barSpacing - .5 * this._barSpacing - 1,
r = this._barSpacing,
n = e;
for (let i = 0; i < t; ++i) Object(u.isInteger)(e[i]) ? n[i] = s + e[i] * r : n[i] =
0
}
rightOffsetForTimePoint(e) {
const t = this.timeToCoordinate(e);
return null === t ? null : this._rightOffsetForCoordinate(t)
}
scrollToRealtime(e, t) {
let i = this._defaultRightOffsetProperty.value();
i < 0 && (i = this.rightOffsetDefaultValue());
const s = () => {
void 0 !== t && t(), this._requestMoreData()
};
if (e) {
const e = this._rightOffset,
t = this.maxRightOffset();
t > 0 && i > t && (i = t);
const n = this._model;
Object(o.doAnimate)({
from: e,
to: i,
duration: 1e3,
easing: r.c.easeInOutQuint,
onComplete: s,
onStep: (e, t) => {
this._visibleBarsInvalidated = !0, this._updateRightOffset(
t), n.recalculateAllPanes(), n.lightUpdate(), n
.recalcVisibleRangeStudies()
}
})
} else this._visibleBarsInvalidated = !0, this._updateRightOffset(i), s()
}
scrollToOffsetAnimated(e, t) {
if (!isFinite(e)) throw new RangeError(
"offset is required and must be finite number");
const i = void 0 === t ? 400 : t;
if (!isFinite(i) || i <= 0) throw new RangeError(
"animationDuration (optional) must be finite positive number");
const s = this._rightOffset,
r = Date.now(),
n = () => {
this._visibleBarsInvalidated = !0;
const t = (Date.now() - r) / i;
if (t >= 1) return this._updateRightOffset(e), this
._visibleBarsInvalidated = !0, this._model.recalculateAllPanes(),
void this._model.lightUpdate();
const o = s + (e - s) * t;
this._updateRightOffset(o), this._model.recalculateAllPanes(), setTimeout(n,
20)
};
n()
}
defaultRightOffsetProperty() {
return this._defaultRightOffsetProperty
}
rightOffsetDefaultValue() {
return 10
}
barSpacing() {
return this._barSpacing
}
setBarSpacing(e) {
Number.isFinite(e) ? (e = this.getValidBarSpacing(e), this._tryToUpdateBarSpacing(
this._barSpacing, e) && (this._correctOffset(), this._options
.preserveBarSpacing && (Object(y.saveDefaultProperties)(!0), this
._scalesProperties.childs().barSpacing.setValue(this._barSpacing),
Object(y.saveDefaultProperties)(!1)))) : E.logWarn(
"setBarSpacing: invalid argument: " + e)
}
barSpacingChanged() {
return this._barSpacingChanged
}
getValidBarSpacing(e) {
return null == e && (e = this.barSpacing()), e < this.minBarSpacing() ? this
.minBarSpacing() : e > this.maxBarSpacing() ? this.maxBarSpacing() : e
}
isValidBarSpacing(e) {
return e >= this.minBarSpacing() && e <= this.maxBarSpacing()
}
preserveBarSpacing() {
return this._options.preserveBarSpacing
}
normalizeBarIndex(e) {
let t = 0,
i = 0;
const r = this.baseIndex(),
n = Object(s.ensureNotNull)(this._points.firstIndex());
return e < n ? (t = Object(s.ensureNotNull)(this._points.valueAt(n)), i = e - n) :
e > r ? (t = Object(s.ensureNotNull)(this._points.valueAt(r)), i = e - r) : (t =
Object(s.ensureNotNull)(this._points.valueAt(e)), i = 0), {
time_t: t,
offset: i
}
}
denormalizeTimePoint(e) {
const t = this._points.indexOf(e.time_t, !1);
if (null !== t) return t + e.offset
}
rightOffset() {
return this._rightOffset
}
rightOffsetChanged() {
return this._rightOffsetChanged
}
minRightOffset() {
const e = this.points().firstIndex(),
t = this._baseIndex;
if (null === e || null === t) return null;
if (null !== this._leftEdgeIndex) {
const e = this.width() / this._barSpacing;
return this._leftEdgeIndex - t + e - 1
}
return e - t - 1 + A
}
maxRightOffset() {
return this.width() / this._barSpacing - A
}
maxRightOffsetChanged() {
return this._maxRightOffsetChanged
}
onReset() {
return this._resetDelegate
}
scrollStartPoint() {
return this._scrollStartPoint
}
baseIndex() {
return this._baseIndex || 0
}
zoom(e, t, i) {
if (!Number.isFinite(e) || !Number.isFinite(t)) return void E.logWarn(
`zoom: invalid arguments: ${e}, ${t}, ${i}`);
const s = this.coordinateToIndex(e),
r = this.barSpacing(),
n = r + t * (r / 10);
this.setBarSpacing(n);
(void 0 !== i ? !i : this._options.rightBarStaysOnScroll) || this.setRightOffset(
this.rightOffset() - .5 + (s - this._coordinateToFloatIndex(e))), this
._requestMoreData()
}
zoomToBarsRange(e, t) {
if (null !== this._leftEdgeIndex && (e = Math.max(e, this._leftEdgeIndex)), t <= e)
return;
const i = this.baseIndex(),
s = this._rightOffset;
this._rightOffset = t - i;
const r = Math.max(t - e + 1, A);
this.setBarSpacing(this.width() / r), this._visibleBarsInvalidated = !0, this
._correctOffset(), this._rightOffset !== s && this._rightOffsetChanged.fire(this
._rightOffset), this._requestMoreData()
}
coordinateToIndex(e) {
return Math.ceil(this._coordinateToFloatIndex(e))
}
coordinateToVisibleIndex(e) {
let t;
if (0 === e) {
const e = this._coordinateToFloatIndex(-1);
t = Math.floor(e) + 1
} else t = this.coordinateToIndex(e);
const i = this.visibleBarsStrictRange();
return null === i || i.contains(t) || (t = Math.min(Math.max(i.firstBar(), t), i
.lastBar())), t
}
canZoomIn() {
return this.barSpacing() < this.maxBarSpacing()
}
canZoomOut() {
return this.barSpacing() > this._options.minBarSpacing
}
minBarSpacing() {
return this._options.minBarSpacing
}
maxBarSpacing() {
return L ? this.width() : 50
}
resetRightOffset() {
this.setRightOffset(this._defaultRightOffsetProperty.value())
}
reset() {
this._visibleBarsInvalidated = !0, this._points = new f, this._scrollStartPoint =
null, this._scaleStartPoint = null, this._clearCommonTransitionsStartState(),
this._tickMarks.reset(), this._leftEdgeIndex = null, this._resetDelegate.fire(),
this.disconnect()
}
disconnect() {
this._requestingMoreData = !1, this._requestedTickmarksCount = 0, this
._endOfData = !1
}
setBaseIndex(e) {
Number.isFinite(e) ? (this._visibleBarsInvalidated = !0, this._baseIndex = e, this
._correctOffset()) : E.logDebug("setBaseIndex: invalid argument: " + e)
}
setRightOffset(e) {
Number.isFinite(e) ? (this._visibleBarsInvalidated = !0, this._updateRightOffset(
e)) : E.logWarn("setRightOffset: invalid argument: " + e)
}
correctBarSpacing() {
this.isEmpty() || this.points().size() < this.width() / this.barSpacing() && (this
.setRightOffset(this._defaultRightOffsetProperty.value()), this
.setBarSpacing(this.width() / (this.points().size() + this.rightOffset())))
}
logicalRange() {
return this._visibleBarsInvalidated && (this._visibleBarsInvalidated = !1, this
._updateVisibleBars()), this._visibleBars.logicalRange()
}
restoreDefault() {
this._visibleBarsInvalidated = !0, this.setBarSpacing(6), this.resetRightOffset(),
this._requestMoreData()
}
restoreRightOffsetPropertyToDefault() {
this._defaultRightOffsetProperty.setValue(this.rightOffsetDefaultValue())
}
startScale(e) {
this._scrollStartPoint && this.endScroll(),
null === this._scaleStartPoint && null === this._commonTransitionStartState && (
this.isEmpty() || (this._scaleStartPoint = e, this
._saveCommonTransitionsStartState()))
}
scaleTo(e) {
if (null === this._commonTransitionStartState) return;
const t = Object(h.clamp)(this._width - e, 0, this._width),
i = Object(h.clamp)(this._width - Object(s.ensureNotNull)(this
._scaleStartPoint), 0, this._width);
0 !== t && 0 !== i && this.setBarSpacing(this._commonTransitionStartState
.barSpacing * t / i)
}
endScale() {
null !== this._scaleStartPoint && (this._scaleStartPoint = null, this
._clearCommonTransitionsStartState(), this._requestMoreData())
}
startScroll(e) {
null === this._scrollStartPoint && null === this._commonTransitionStartState && (
this.isEmpty() || (this._scrollStartPoint = e, this
._saveCommonTransitionsStartState()))
}
scrollTo(e) {
if (this._visibleBarsInvalidated = !0, null === this._scrollStartPoint) return;
const t = (this._scrollStartPoint - e) / this.barSpacing(),
i = Object(s.ensureNotNull)(this._commonTransitionStartState).rightOffset + t;
this._updateRightOffset(i), this._onScroll.fire()
}
endScroll() {
null !== this._scrollStartPoint && (this._scrollStartPoint = null, this
._clearCommonTransitionsStartState(), this._requestMoreData())
}
formatLabel(e, t) {
let i = this._formattedBySpan.get(t);
return void 0 === i && (i = new C(e => this.formatLabelImpl(e, t)), this
._formattedBySpan.set(t, i)), i.format(new Date(e))
}
formatLabelImpl(e, t) {
if (!(e && e instanceof Date)) return "incorrect time";
const i = function(e, t) {
if (e < P.MINUTE_SPAN && t) return "TimeWithSeconds";
if (e < P.DAY_SPAN && t) return "Time";
if (e < P.WEEK_SPAN) return "DayOfMonth";
if (e < P.MONTH_SPAN) return "DayOfMonth";
if (e < P.YEAR_SPAN) return "Month";
return "Year"
}(t, !this._model.mainSeries().isDWM());
return null !== x.customFormatters.tickMarkFormatter ? x.customFormatters
.tickMarkFormatter(e, i) : function(e, t) {
switch (t) {
case "TimeWithSeconds":
return Object(M.numberToStringWithLeadingZero)(e.getUTCHours(), 2) +
":" + Object(M.numberToStringWithLeadingZero)(e.getUTCMinutes(),
2) + ":" + Object(M.numberToStringWithLeadingZero)(e
.getUTCSeconds(), 2);
case "Time":
return Object(M.numberToStringWithLeadingZero)(e.getUTCHours(), 2) +
":" + Object(M.numberToStringWithLeadingZero)(e.getUTCMinutes(),
2);
case "DayOfMonth":
return e.getUTCDate().toString();
case "Month":
return (void 0 === I && (I = [Object(T.t)("Jan"), Object(T.t)(
"Feb"), Object(T.t)("Mar"), Object(T.t)("Apr"),
Object(T.t)("May", {
context: "short"
}), Object(T.t)("Jun"), Object(T.t)("Jul"), Object(T
.t)("Aug"), Object(T.t)("Sep"), Object(T.t)(
"Oct"), Object(T.t)("Nov"), Object(T.t)("Dec")
]), I)[e.getUTCMonth()];
case "Year":
return e.getUTCFullYear().toString()
}
}(e, i)
}
onScroll() {
return this._onScroll
}
invalidateVisibleBars() {
this._visibleBarsInvalidated = !0
}
onTimeScaleCompleted(e) {
if (this._requestingMoreData = !1, this._endOfData = e, c.enabled(
"fix_left_edge") && this._endOfData) {
const e = this._points.firstIndex();
null !== e && this.setLeftEdgeFix(e)
}
this._requestMoreData()
}
requestMoreHistoryPoints(e) {
this._requestHistoryPoints(e)
}
_requestMoreData() {
this._requestFutureTickmarksIfNeeded(), this._requestHistoryPointsIfNeeded()
}
_requestFutureTickmarksIfNeeded() {
if (this.isEmpty() || !this._model.chartApi().isConnected().value()) return;
const e = this.visibleBarsStrictRange();
if (null === e) return;
const t = e.lastBar() - Object(s.ensureNotNull)(this._points.lastIndex());
if (t <= this._requestedTickmarksCount) return;
const i = t - this._requestedTickmarksCount;
this._requestedTickmarksCount = t, this._model.chartApi().requestMoreTickmarks(i)
}
_requestHistoryPointsIfNeeded() {
if (this.isEmpty()) return;
if (this._endOfData) return void E.logNormal(
"Skipping loading more data due end of data state");
const e = this.visibleBarsStrictRange();
if (null === e) return;
const t = Object(s.ensureNotNull)(this._points.firstIndex()) - e.firstBar();
t <= 0 || this._requestHistoryPoints(t)
}
_requestHistoryPoints(e) {
this._model.chartApi().isConnected().value() && (this._requestingMoreData ? E
.logNormal("Skipping loading more data due active loading") : (this
._requestingMoreData = !0, this._model.chartApi().requestMoreData(e)))
}
_updateVisibleBars() {
const e = this._visibleBars;
if (this.isEmpty()) return void(this._visibleBars.isValid() && (this._visibleBars =
S.invalid(), this._visibleBarsChanged.fire(null, e.strictRange()),
this._logicalRangeChanged.fire(null, e.logicalRange())));
const t = this.baseIndex(),
i = this.width() / this._barSpacing,
s = this._rightOffset + t,
r = s - i + 1;
Number.isFinite(r) && Number.isFinite(s) ? (this._visibleBars = new S(new _(r, s),
this._model.mainSeries().style()), p.BarsRange.compare(e.strictRange(),
this._visibleBars.strictRange()) || this._visibleBarsChanged.fire(this
._visibleBars.strictRange(), e.strictRange()), _.compare(e
.logicalRange(), this._visibleBars.logicalRange()) || this
._logicalRangeChanged.fire(this._visibleBars.logicalRange(), e
.logicalRange())) : E.logWarn(
`updateVisibleBars error: baseIndex: ${t}, barSpacing: ${this._barSpacing}, rightOffset: ${this._rightOffset}`
)
}
_rightOffsetForCoordinate(e) {
return (this._width - 1 - e) / this._barSpacing
}
_correctOffset() {
const e = this.maxRightOffset();
this._rightOffset > e && (this._rightOffset = e, this._visibleBarsInvalidated = !0);
const t = this.minRightOffset();
null !== t && this._rightOffset < t && (this._rightOffset = t, this
._visibleBarsInvalidated = !0)
}
_tryToUpdateBarSpacing(e, t) {
return e !== t && (this._visibleBarsInvalidated = !0, this._barSpacing = t, this
._barSpacingChanged.fire(t), !0)
}
_coordinateToFloatIndex(e) {
const t = this._rightOffsetForCoordinate(e),
i = this.baseIndex() + this.rightOffset() - t;
return Math.round(1e6 * i) / 1e6
}
_saveCommonTransitionsStartState() {
this._commonTransitionStartState = {
barSpacing: this.barSpacing(),
rightOffset: this.rightOffset()
}
}
_clearCommonTransitionsStartState() {
this._commonTransitionStartState = null
}
_maxRightOffsetOnChanged() {
this._maxRightOffsetChanged.fire(this.maxRightOffset())
}
_updateRightOffset(e) {
const t = this._rightOffset;
this._rightOffset = e, this._correctOffset(), this._rightOffset !== t && this
._rightOffsetChanged.fire(this._rightOffset)
}
}
},
"23IT": function(e, t, i) {
"use strict";
var s, r;
function n(e) {
return "line" === e.type
}
function o(e) {
return "shapes" === e.type
}
function a(e) {
return "chars" === e.type
}
function l(e) {
return "arrows" === e.type
}
function c(e) {
return "dataoffset" === e.type
}
function h(e) {
return "ohlc_open" === e.type
}
function u(e) {
return "ohlc_high" === e.type
}
function d(e) {
return "ohlc_low" === e.type
}
function p(e) {
return "ohlc_close" === e.type
}
function _(e) {
return h(e) || u(e) || d(e) || p(e)
}
function m(e) {
return "colorer" === e.type
}
function f(e) {
return "bar_colorer" === e.type
}
function g(e) {
return "bg_colorer" === e.type
}
function b(e) {
return "text_colorer" === e.type
}
function v(e) {
return "ohlc_colorer" === e.type
}
function S(e) {
return "wick_colorer" === e.type
}
function y(e) {
return "border_colorer" === e.type
}
function w(e) {
return "up_colorer" === e.type
}
function P(e) {
return "down_colorer" === e.type
}
function C(e) {
return "alertcondition" === e.type
}
function x(e) {
return "Plot" !== e
}
function T(e) {
return "ohlc_bars" === e.plottype
}
function I(e) {
return "ohlc_candles" === e.plottype
}
function M(e) {
return m(e) || f(e) || g(e) || c(e) || v(e) || C(e) || w(e) || P(e) || y(e) || S(e) || b(e)
}
function O(e) {
return m(e) || b(e) || f(e) || c(e) || v(e) || S(e) || y(e) || w(e) || P(e) || C(e)
}
i.r(t), i.d(t, "LineStudyPlotStyle", (function() {
return s
})), i.d(t, "isLinePlot", (function() {
return n
})), i.d(t, "isShapesPlot", (function() {
return o
})), i.d(t, "isCharsPlot", (function() {
return a
})), i.d(t, "isArrowsPlot", (function() {
return l
})), i.d(t, "isDataOffsetPlot", (function() {
return c
})), i.d(t, "isOhlcOpenPlot", (function() {
return h
})), i.d(t, "isOhlcHighPlot", (function() {
return u
})), i.d(t, "isOhlcLowPlot", (function() {
return d
})), i.d(t, "isOhlcClosePlot", (function() {
return p
})), i.d(t, "isOhlcPlot", (function() {
return _
})), i.d(t, "isColorerPlot", (function() {
return m
})), i.d(t, "isBarColorerPlot", (function() {
return f
})), i.d(t, "isBgColorerPlot", (function() {
return g
})), i.d(t, "isTextColorerPlot", (function() {
return b
})), i.d(t, "isOhlcColorerPlot", (function() {
return v
})), i.d(t, "isCandleWickColorerPlot", (function() {
return S
})), i.d(t, "isCandleBorderColorerPlot", (function() {
return y
})), i.d(t, "isUpColorerPlot", (function() {
return w
})), i.d(t, "isDownColorerPlot", (function() {
return P
})), i.d(t, "isAlertConditionPlot", (function() {
return C
})), i.d(t, "isPlotTitleDefined", (function() {
return x
})), i.d(t, "isOhlcPlotStyleBars", (function() {
return T
})), i.d(t, "isOhlcPlotStyleCandles", (function() {
return I
})), i.d(t, "PlotSymbolSize", (function() {
return r
})), i.d(t, "isPlotWithTechnicalValues", (function() {
return M
})), i.d(t, "isNonVisualPlot", (function() {
return O
})),
function(e) {
e[e.Line = 0] = "Line", e[e.Histogram = 1] = "Histogram", e[e.Cross = 3] = "Cross", e[e
.Area = 4] = "Area", e[e.Columns = 5] = "Columns", e[e.Circles = 6] = "Circles",
e[e.LineWithBreaks = 7] = "LineWithBreaks", e[e.AreaWithBreaks = 8] =
"AreaWithBreaks", e[e.StepLine = 9] = "StepLine", e[e.StepLineWithDiamonds = 10] =
"StepLineWithDiamonds"
}(s || (s = {})),
function(e) {
e.Auto = "auto", e.Tiny = "tiny", e.Small = "small", e.Normal = "normal", e.Large =
"large", e.Huge = "huge"
}(r || (r = {}))
},
"25b6": function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return n
})), i.d(t, "d", (function() {
return o
})), i.d(t, "c", (function() {
return a
})), i.d(t, "a", (function() {
return l
}));
const s = /[<"'&>]/g,
r = e => `${e.charCodeAt(0)};`;
function n(e) {
return e.replace(s, r)
}
function o(e = "") {
return e.replace(/(<([^>]+)>)/gi, "")
}
function a(e = "") {
return e.replace(/\s+/g, "")
}
function l(e = "") {
return e.replace(/\b\w/g, e => e.toUpperCase())
}
},
"29fS": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PaneRendererBars", (function() {
return n
}));
var s = i("Zp/P"),
r = i("ExCE");
class n extends r.a {
constructor(e) {
super(), this._bars = e.bars, this._barSpacing = e.barSpacing, this
._dontDrawOpen = e.dontDrawOpen, this._thinBars = e.thinBars
}
draw(e, t) {
e.save();
const i = t.pixelRatio;
if (this._barWidth = this._calcBarWidth(i), this._barWidth >= 2) {
Math.max(1, Math.floor(i)) % 2 != this._barWidth % 2 && this._barWidth--
}
this._barLineWidth = this._thinBars ? Math.min(this._barWidth, Math.floor(i)) :
this._barWidth;
let s = null;
const r = this._barLineWidth <= this._barWidth && this._barSpacing >= Math
.floor(1.5 * t.pixelRatio);
for (const t of this._bars) {
s !== t.color && (e.fillStyle = t.color, s = t.color);
const n = Math.floor(.5 * this._barLineWidth),
o = Math.round(t.time * i),
a = o - n,
l = this._barLineWidth,
c = a + l - 1,
h = Math.min(t.high, t.low),
u = Math.max(t.high, t.low),
d = Math.round(h * i) - n,
p = Math.round(u * i) + n,
_ = Math.max(p - d, this._barLineWidth);
e.fillRect(a, d, l, _);
const m = Math.ceil(1.5 * this._barWidth);
if (r) {
const s = o - m,
r = o + m,
h = Math.min(a - s, r - c);
if (!this._dontDrawOpen) {
let r = Math.max(d, Math.round(t.open * i) - n),
o = r + l - 1;
o > d + _ - 1 && (o = d + _ - 1, r = o - l + 1), e.fillRect(s, r, h,
o - r + 1)
}
let u = Math.max(d, Math.round(t.close * i) - n),
p = u + l - 1;
p > d + _ - 1 && (p = d + _ - 1, u = p - l + 1), e.fillRect(c + 1, u, h,
p - u + 1)
}
}
e.restore()
}
_getTolerance() {
const e = this._calcBarWidth(1),
t = this._thinBars ? Math.min(e, 1) : e;
return Object(s.interactionTolerance)().series + t / 2
}
_getBarSpacing() {
return this._barSpacing
}
_calcBarWidth(e) {
const t = Math.floor(e);
return Math.max(t, Math.floor(Object(s.optimalBarWidth)(this._barSpacing, e)))
}
}
},
"2EnG": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StandardPivotPointsImageCache", (function() {
return n
}));
var s = i("ikwP"),
r = i("Eyy1");
class n {
constructor(e, t, i, r) {
this._priceAxisFontSize = 11, this._prices = [], this._labelWidth = 0, this
._paneRenderParams = e, this._recreateCanvasAndContext(new s.Size(0, 0)), this
.reset({
font: t,
fontSize: i,
backColors: r
})
}
destroy() {
delete this._canvas, delete this._cache
}
canvas() {
return this._canvas
}
reset(e) {
this._renderParams = e, this._prices = [], this._cache.font = e.fontSize + "px " + e
.font, this._labelWidth = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4",
"S5", "R5", "/"
].reduce((e, t) => {
const i = this._cache.measureText(t).width;
return Math.max(i, e)
}, 0)
}
rowHeight() {
return this._priceAxisFontSize + 4
}
labelRectByIndex(e) {
return {
left: 0,
top: Math.round(this._topByIndex(e)),
width: Math.round(this._labelWidth + 4),
height: Math.round(this._renderParams.fontSize + 8)
}
}
setPrices(e) {
let t = !1;
const i = (e, t) => {
const i = void 0 === e,
s = void 0 === t;
return (!i && !s || i === s) && Object(r.ensureDefined)(e).formatted ===
Object(r.ensureDefined)(t).formatted
};
if (e.length !== this._prices.length) t = !0;
else
for (let s = 0; s < this._prices.length; s++)
if (!i(this._prices[s], e[s])) {
t = !0;
break
} if (t) {
const t = this._labelWidth + 6,
i = this._renderParams.fontSize,
r = Math.max(e.length, 22) * (i + 8);
this._recreateCanvasAndContext(new s.Size(t, r)), this._prices = e, this._cache
.save(), Object(s.drawScaled)(this._cache, this._paneRenderParams
.pixelRatio, () => {
this._cache.translate(.5, .5),
this._cache.font = this._renderParams.fontSize + "px " + this
._renderParams.font, this._cache.textBaseline = "middle";
for (let e = 0; e < this._prices.length; e++) {
if (!this._prices[e]) continue;
const t = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4",
"S5", "R5"
][e];
this._cache.fillStyle = this._renderParams.backColors[e], this
._cache.fillText(t, 0, this._centerByIndex(e)), this._cache
.fillText("/", 0, this._centerByIndex(e + 11))
}
}), this._cache.restore(), this._prices = e
}
}
_recreateCanvasAndContext(e) {
this._canvas = document.createElement("canvas"), this._canvas.width = e.w * this
._paneRenderParams.pixelRatio, this._canvas.height = e.h * this
._paneRenderParams.pixelRatio, this._cache = Object(r.ensureNotNull)(this
._canvas.getContext("2d"))
}
_centerByIndex(e) {
return Math.round((e + .5) * (this._renderParams.fontSize + 8))
}
_topByIndex(e) {
return Math.round(e * (this._renderParams.fontSize + 8))
}
}
},
"2bPF": function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("7KDR").Action,
n = i("Ocx9").DefaultProperty,
o = i("k9/m").PlotRowSearchMode,
a = i("Ye2/").LineToolBarsPatternMode;
class l extends s {
constructor(e, t) {
var s = t || l.createProperties();
super(e, s), s.mirrored.listeners().subscribe(this, l.prototype.mirror), s.flipped
.listeners().subscribe(this, l.prototype.flip), this._scaleCoeff = 1, this
.version = l.version, this._pattern = [], this._properties.mode.listeners()
.subscribe(this, l.prototype.onModeChanged), i.e("lt-pane-views").then(i.t.bind(
null, "c6sA", 7)).then(({
BarsPatternPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
isSynchronizable() {
return !1
}
onModeChanged() {
var e = this.patternPriceDiff();
e *= this._pressCoeff, this._points[1].price = this._timePoint[1].price = this
._points[0].price + e
}
additionalActions(e) {
var t = this;
return [new r({
checked: this.properties().mirrored.value(),
checkable: !0,
label: window.t("Mirrored"),
payload: {
target: this
},
onExecute: function(t) {
var i = t.getPayload().target;
e.setProperty(i.properties().mirrored, !i.properties()
.mirrored.value(), "Bats Pattern Mirroring"), i
.updateAllViews(), i._model.updateSource(i)
}
}), new r({
checked: this.properties().flipped.value(),
checkable: !0,
label: window.t("Flipped"),
payload: {
target: this
},
onExecute: function(t) {
var i = t.getPayload().target;
e.setProperty(i.properties().flipped, !i.properties()
.flipped.value(), "Bats Pattern Flipping"), i
.updateAllViews(), i._model.updateSource(i)
}
}), new r({
checkable: !0,
label: window.t("Restore Size"),
onExecute: function(i) {
var s = t.points()[0],
r = t.patternPriceDiff(),
n = s.price + r,
o = s.index + t._pattern.length - 1;
e.startChangingLinetool(t, {
price: n,
index: o
}, 1, {}), e.changeLinePoint({
price: n,
index: o
}, {}), e.endChangingLinetool()
}
})]
}
pointsCount() {
return 2
}
_preparePoint(e, t) {
e = this._alignPointToRangeOfActualData(e);
var i = this._model.mainSeries();
this.properties().mode.value() === a.Bars ? e.price = i.bars().valueAt(e.index)[
TradingView.HIGH_PLOT] : e.price = i.bars().valueAt(e.index)[TradingView
.CLOSE_PLOT];
var r = this.priceScale(),
n = this.ownerSource().firstValue(),
o = .05 * r.height(),
l = r.priceToCoordinate(e.price, n) - o;
return e.price = r.coordinateToPrice(l, n), s.prototype._preparePoint.call(this, e,
t)
}
state(e) {
var t = s.prototype.state.call(this, e);
return t.pattern = this._pattern, t
}
restoreData(e) {
e.pattern && (this._pattern = e.pattern)
}
name() {
return "Bars Pattern"
}
hasEditableCoordinates() {
return !1
}
cloneData(e) {
this._pattern = TradingView.clone(e._pattern)
}
mirror() {
for (var e = this._pattern, t = e[0][TradingView.HIGH_PLOT], i = Math.min(e[0][
TradingView.LOW_PLOT
], e[0][TradingView.HIGH_PLOT]), s = Math.max(e[0][TradingView.LOW_PLOT], e[
0][TradingView.HIGH_PLOT]), r = 1; r < e.length; r++) i = Math.min(i, e[r][
TradingView.LOW_PLOT
]), s = Math.max(s, e[r][TradingView.HIGH_PLOT]);
if (i < s) {
var n = (i + s) / 2,
o = function(e) {
return n - (e - n)
};
for (r = 0; r < e.length; r++) e[r][TradingView.HIGH_PLOT] = o(e[r][TradingView
.HIGH_PLOT
]), e[r][TradingView.LOW_PLOT] = o(e[r][TradingView.LOW_PLOT]), e[r][
TradingView.OPEN_PLOT
] = o(e[r][TradingView.OPEN_PLOT]), e[r][TradingView.CLOSE_PLOT] = o(e[r][
TradingView.CLOSE_PLOT
])
}
var a = e[0][TradingView.HIGH_PLOT] - t,
l = e[e.length - 1][TradingView.LOW_PLOT] - e[0][TradingView.HIGH_PLOT];
this._points[0].price += a, this._points[1].price = this._points[0].price + l, this
.updateAllViews()
}
flip() {
this._points[0].price = this._points[1].price;
for (var e = 0; e < this._pattern.length / 2; e++) {
var t = this._pattern[e];
this._pattern[e] = this._pattern[this._pattern.length - e - 1], this._pattern[
this._pattern.length - e - 1] = t
}
var i = this._pattern[this._pattern.length - 1][TradingView.LOW_PLOT] - this
._pattern[0][TradingView.HIGH_PLOT];
this._points[1].price = this._points[0].price + i, this.updateAllViews()
}
firstPatternPrice() {
var e = parseInt(this.properties().mode.value(), 10);
if (e === a.LineHL2) return (this._pattern[0][TradingView.HIGH_PLOT] + this
._pattern[0][TradingView.LOW_PLOT]) / 2;
var t = {
0: TradingView.HIGH_PLOT,
1: TradingView.CLOSE_PLOT,
2: TradingView.OPEN_PLOT,
3: TradingView.OPEN_PLOT,
4: TradingView.HIGH_PLOT,
5: TradingView.LOW_PLOT
} [e];
return this._pattern[0][t]
}
lastPatternPrice() {
var e = parseInt(this.properties().mode.value(), 10);
if (e === a.LineHL2) return (this._pattern[this._pattern.length - 1][TradingView
.HIGH_PLOT
] + this._pattern[this._pattern.length - 1][TradingView.LOW_PLOT]) / 2;
var t = {
0: TradingView.LOW_PLOT,
1: TradingView.CLOSE_PLOT,
2: TradingView.CLOSE_PLOT,
3: TradingView.OPEN_PLOT,
4: TradingView.HIGH_PLOT,
5: TradingView.LOW_PLOT
} [e];
return this._pattern[this._pattern.length - 1][t]
}
patternPriceDiff() {
return this.lastPatternPrice() - this.firstPatternPrice()
}
pressCoeff() {
var e = this.patternPriceDiff(),
t = this.points()[0].price,
i = (this.points()[1].price - t) / e;
return this._pressCoeff = i, i
}
addPoint(e, t) {
var i = s.prototype.addPoint.call(this, e, t, !0);
if (i) {
var r = Math.min(this.points()[0].index, this.points()[1].index),
n = Math.max(this.points()[0].index, this.points()[1].index),
a = this._model.mainSeries().nearestIndex(r, o.NearestRight),
l = this._model.mainSeries().nearestIndex(n, o.NearestLeft);
this.points()[0].index > this.points()[1].index && (this._points[0].price = this
._points[1].price), this._pattern = [];
for (var c = a; c <= l; c++) {
var h = this._model.mainSeries().data().valueAt(c);
this._pattern.push(TradingView.clone(h))
}
if (this._pattern.length > 0) {
var u = this.patternPriceDiff();
this._points[1].price = this._points[0].price + u,
this._points[1].index = this._points[0].index + (l - a), this
.normalizePoints(), this.createServerPoints()
}
}
return i
}
setPoint(e, t, i) {
1 === e && t.index <= this._points[0].index && (t.index = this._points[0].index +
1), 0 === e && t.index >= this._points[1].index && (t.index = this._points[
1]
.index - 1), super.setPoint(e, t, i)
}
migrateVersion(e, t, i) {
if (1 === e && this._pattern.length > 0) {
var s = this.patternPriceDiff();
2 === this._timePoint.length && (this._timePoint[1].price = this._timePoint[0]
.price + s), 2 === this._points.length && (this._points[1].price = this
._points[0].price + s)
}
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "8ioM")))
.BarsPatternDefinitionsViewModel
}
static createProperties(e) {
var t = new n("linetoolbarspattern", e);
return l._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e), e.addExclusion("mirrored"), e.addExclusion("flipped")
}
}
l.version = 2, t.LineToolBarsPattern = l
},
"2cgs": function(e, t, i) {
"use strict";
var s = i("ocLq");
JSServer.studyLibrary = [{
name: "Accumulation/Distribution",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Accumulation/Distribution",
shortDescription: "Accum/Dist",
is_price_study: !1,
inputs: [],
id: "Accumulation/Distribution@tv-basicstudies-1",
scriptIdPart: "",
name: "Accumulation/Distribution",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function(e, t, i, r) {
return s.Std.or(s.Std.and(s.Std.eq(e, t), s.Std.eq(e, i)), s.Std.eq(
t, i)) ? 0 : (2 * e - i - t) / (t - i) * r
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this.f_0(s.Std.close(this._context), s.Std.high(this
._context), s.Std.low(this._context), s.Std.volume(this
._context));
return [s.Std.cum(i, this._context)]
}
}
}, {
name: "Accumulative Swing Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "ASI",
histogramBase: 0,
joinPoints: !1
}
},
description: "Accumulative Swing Index",
shortDescription: "ASI",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "Limit Move Value",
defval: 10,
type: "float",
min: .1,
max: 1e5
}],
id: "Accumulative Swing Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Accumulative Swing Index",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function(e, t) {
var i = t.new_var(s.Std.open(t)),
r = t.new_var(s.Std.high(t)),
n = t.new_var(s.Std.low(t)),
o = t.new_var(s.Std.close(t)),
a = s.Std.abs(r - o.get(1)),
l = s.Std.abs(n - o.get(1)),
c = s.Std.abs(r - n),
h = s.Std.abs(o.get(1) - i.get(1)),
u = s.Std.max(a, l),
d = s.Std.iff(a >= s.Std.max(l, c), a - .5 * l + .25 * h, s.Std
.iff(l >= s.Std.max(a, c), l - .5 * a + .25 * h, c + .25 *
h));
return s.Std.iff(0 === d, 0, (o - o.get(1) + .5 * (o - i) + .25 * (o
.get(1) - i.get(1))) / d * u / e * 50)
}, this.f_1 = function(e, t) {
var i = this.f_0(e, t);
return s.Std.cum(i, t)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0);
return [this.f_1(i, this._context)]
}
}
}, {
name: "Advance/Decline",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Advance/Decline",
shortDescription: "AD",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "length",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}],
id: "Advance/Decline@tv-basicstudies-1",
scriptIdPart: "",
name: "Advance/Decline",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return s.Std.gt(e, t)
}, this.f_1 = function(e, t) {
return s.Std.lt(e, t)
}, this.f_2 = function(e, t) {
return 0 === t ? e : e / t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this.f_0(s.Std.close(this._context), s.Std.open(this
._context)),
n = this._context.new_var(r),
o = s.Std.sum(n, i, this._context),
a = this.f_1(s.Std.close(this._context), s.Std.open(this
._context)),
l = this._context.new_var(a),
c = s.Std.sum(l, i, this._context);
return [this.f_2(o, c)]
}
}
}, {
name: "Arnaud Legoux Moving Average",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 9,
in_1: .85,
in_2: 6
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Arnaud Legoux Moving Average",
shortDescription: "ALMA",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Window Size",
defval: 9,
type: "integer",
min: 0,
max: 5e3
}, {
id: "in_1",
name: "Offset",
defval: .85,
type: "float",
min: -1e12,
max: 1e12
}, {
id: "in_2",
name: "Sigma",
defval: 6,
type: "float",
min: -1e12,
max: 1e12
}],
id: "Arnaud Legoux Moving Average@tv-basicstudies-1",
scriptIdPart: "",
name: "Arnaud Legoux Moving Average",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._input(1),
o = this._input(2),
a = this._context.new_var(i);
return [s.Std.alma(a, r, n, o)]
}
}
}, {
name: "Aroon",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FB8C00"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "Upper",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Lower",
histogramBase: 0,
joinPoints: !1
}
},
description: "Aroon",
shortDescription: "Aroon",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "length",
defval: 14,
type: "integer",
min: 1,
max: 2e3
}],
id: "Aroon@tv-basicstudies-1",
scriptIdPart: "",
name: "Aroon",
format: {
precision: 2,
type: "percent"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return 100 * (e + t) / t
},
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = s.Std.high(this._context),
n = i + 1,
o = this._context.new_var(r),
a = s.Std.highestbars(o, n, this._context),
l = this.f_0(a, i),
c = s.Std.low(this._context),
h = this._context.new_var(c),
u = s.Std.lowestbars(h, n, this._context);
return [l, this.f_0(u, i)]
}
}
}, {
name: "Average Price",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
id: "AveragePrice@tv-basicstudies-1",
scriptIdPart: "",
name: "Average Price",
description: "Average Price",
shortDescription: "Average Price",
is_price_study: !0,
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#2196F3"
}
},
inputs: {}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [],
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
return this._context = e, this._input = t, [s.Std.ohlc4(this
._context)]
}
}
}, {
name: "Average Directional Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF5252"
}
},
inputs: {
in_0: 14,
in_1: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "ADX",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Average Directional Index",
shortDescription: "ADX",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "ADX Smoothing",
defval: 14,
type: "integer",
min: -1e12,
max: 1e12
}, {
id: "in_1",
name: "DI Length",
defval: 14,
type: "integer",
min: -1e12,
max: 1e12
}],
id: "average_directional_Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Average Directional Index",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e) {
var t = this._context.new_var(s.Std.high(this._context)),
i = s.Std.change(t),
r = this._context.new_var(s.Std.low(this._context)),
n = -s.Std.change(r),
o = this._context.new_var(s.Std.tr(void 0, this._context)),
a = s.Std.rma(o, e, this._context),
l = this._context.new_var(s.Std.and(s.Std.gt(i, n), s.Std.gt(i,
0)) ? i : 0),
c = s.Std.fixnan(100 * s.Std.rma(l, e, this._context) / a, this
._context),
h = this._context.new_var(s.Std.and(s.Std.gt(n, i), s.Std.gt(n,
0)) ? n : 0);
return [c, s.Std.fixnan(100 * s.Std.rma(h, e, this._context) / a,
this._context)]
}, this.f_1 = function(e, t) {
var i = this.f_0(e),
r = i[0],
n = i[1],
o = r + n,
a = this._context.new_var(s.Std.abs(r - n) / (s.Std.eq(o, 0) ?
1 : o));
return [100 * s.Std.rma(a, t, this._context)]
}, this.main = function(e, t) {
return this._context = e, this._input = t, this._context
.setMinimumAdditionalDepth(this._input(0) + this._input(1)),
this.f_1(this._input(0), this._input(1))
}
}
}, {
name: "Average True Range",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#B71C1C"
}
},
inputs: {
in_0: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Average True Range",
shortDescription: "ATR",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "length",
defval: 14,
type: "integer",
min: 1,
max: 2e3
}],
id: "Average True Range@tv-basicstudies-1",
scriptIdPart: "",
name: "Average True Range",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = s.Std.tr(this._context),
n = this._context.new_var(r);
return [s.Std.rma(n, i, this._context)]
}
}
}, {
name: "Awesome Oscillator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 1,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#000080"
}
},
palettes: {
palette_0: {
colors: {
0: {
color: "#F44336",
width: 1,
style: 0
},
1: {
color: "#009688",
width: 1,
style: 0
}
}
}
},
inputs: {}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
palette: "palette_0",
target: "plot_0",
type: "colorer"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Awesome Oscillator",
shortDescription: "AO",
is_price_study: !1,
palettes: {
palette_0: {
colors: {
0: {
name: "Color 0"
},
1: {
name: "Color 1"
}
}
}
},
inputs: [],
id: "Awesome Oscillator@tv-basicstudies-1",
scriptIdPart: "",
name: "Awesome Oscillator",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e - t
}, this.f_1 = function(e) {
return s.Std.le(e, 0) ? 0 : 1
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.hl2(this._context),
r = this._context.new_var(i),
n = s.Std.sma(r, 5, this._context),
o = this._context.new_var(i),
a = s.Std.sma(o, 34, this._context),
l = this.f_0(n, a),
c = l,
h = this._context.new_var(l),
u = s.Std.change(h);
return [c, this.f_1(u)]
}
}
}, {
name: "Balance of Power",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF5252"
}
},
inputs: {}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Balance of Power",
shortDescription: "Balance of Power",
is_price_study: !1,
inputs: [],
id: "Balance of Power@tv-basicstudies-1",
scriptIdPart: "",
name: "Balance of Power",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t, i, s) {
return (e - t) / (i - s)
}, this.main = function(e, t) {
return this._context = e, this._input = t, [this.f_0(s.Std.close(
this._context), s.Std.open(this._context), s.Std
.high(this._context), s.Std.low(this._context))]
}
}
}, {
name: "Bollinger Bands",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 95,
visible: !0
}
},
inputs: {
in_0: 20,
in_1: 2
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "Median",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Upper",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Lower",
histogramBase: 0,
joinPoints: !1
}
},
description: "Bollinger Bands",
shortDescription: "BB",
is_price_study: !0,
filledAreas: [{
id: "fill_0",
objAId: "plot_1",
objBId: "plot_2",
type: "plot_plot",
title: "Plots Background"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 20,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_1",
name: "mult",
defval: 2,
type: "float",
min: .001,
max: 50
}],
id: "Bollinger Bands@tv-basicstudies-1",
scriptIdPart: "",
name: "Bollinger Bands",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e * t
}, this.f_1 = function(e, t) {
return e + t
}, this.f_2 = function(e, t) {
return e - t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._input(1),
o = this._context.new_var(i),
a = s.Std.sma(o, r, this._context),
l = this._context.new_var(i),
c = s.Std.stdev(l, r, this._context),
h = this.f_0(n, c);
return [a, this.f_1(a, h), this.f_2(a, h)]
}
}
}, {
name: "Bollinger Bands %B",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#26A69A"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 1
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
filledAreasStyle: {
fill_0: {
color: "#26A69A",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 20,
in_1: 2
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Bollinger Bands %B",
shortDescription: "BB %B",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 20,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_1",
name: "mult",
defval: 2,
type: "float",
min: .001,
max: 50
}],
id: "Bollinger Bands %B@tv-basicstudies-1",
scriptIdPart: "",
name: "Bollinger Bands %B",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e * t
}, this.f_1 = function(e, t) {
return e + t
}, this.f_2 = function(e, t) {
return e - t
}, this.f_3 = function(e, t, i) {
return (e - t) / (i - t)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._input(1),
o = this._context.new_var(i),
a = s.Std.sma(o, r, this._context),
l = this._context.new_var(i),
c = s.Std.stdev(l, r, this._context),
h = this.f_0(n, c),
u = this.f_1(a, h),
d = this.f_2(a, h);
return [this.f_3(i, d, u)]
}
}
}, {
name: "Bollinger Bands Width",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
}
},
inputs: {
in_0: 20,
in_1: 2
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Bollinger Bands Width",
shortDescription: "BBW",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "length",
defval: 20,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_1",
name: "mult",
defval: 2,
type: "float",
min: .001,
max: 50
}],
id: "Bollinger Bands Width@tv-basicstudies-1",
scriptIdPart: "",
name: "Bollinger Bands Width",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e * t
}, this.f_1 = function(e, t) {
return e + t
}, this.f_2 = function(e, t) {
return e - t
}, this.f_3 = function(e, t, i) {
return (e - t) / i
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._input(1),
o = this._context.new_var(i),
a = s.Std.sma(o, r, this._context),
l = this._context.new_var(i),
c = s.Std.stdev(l, r, this._context),
h = this.f_0(n, c),
u = this.f_1(a, h),
d = this.f_2(a, h);
return [this.f_3(u, d, a)]
}
}
}, {
name: "Chaikin Money Flow",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#43A047"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
in_0: 20
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Chaikin Money Flow",
shortDescription: "CMF",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "Zero"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}],
id: "Chaikin Money Flow@tv-basicstudies-1",
scriptIdPart: "",
name: "Chaikin Money Flow",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t, i, r) {
return s.Std.or(s.Std.and(s.Std.eq(e, t), s.Std.eq(e, i)), s.Std.eq(
t, i)) ? 0 : (2 * e - i - t) / (t - i) * r
}, this.f_1 = function(e, t) {
return e / t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this.f_0(s.Std.close(this._context), s.Std.high(this
._context), s.Std.low(this._context), s.Std.volume(this
._context)),
n = this._context.new_var(r),
o = s.Std.sum(n, i, this._context),
a = s.Std.volume(this._context),
l = this._context.new_var(a),
c = s.Std.sum(l, i, this._context);
return [this.f_1(o, c)]
}
}
}, {
name: "Chaikin Oscillator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#EC407A"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
in_0: 3,
in_1: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Chaikin Oscillator",
shortDescription: "Chaikin Osc",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "Zero"
}],
inputs: [{
id: "in_0",
name: "short",
defval: 3,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "long",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}],
id: "Chaikin Oscillator@tv-basicstudies-1",
scriptIdPart: "",
name: "Chaikin Oscillator",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e - t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = s.Std.accdist(this._context),
o = this._context.new_var(n),
a = s.Std.ema(o, i, this._context),
l = this._context.new_var(n),
c = s.Std.ema(l, r, this._context);
return [this.f_0(a, c)]
}
}
}, {
name: "Chaikin Volatility",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !1,
id: "Chaikin Volatility@tv-basicstudies-1",
scriptIdPart: "",
name: "Chaikin Volatility",
description: "Chaikin Volatility",
shortDescription: "Chaikin Volatility",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#AB47BC"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
periods: 10,
rocLookback: 10
}
},
styles: {
plot_0: {
title: "Plot"
}
},
bands: [{
id: "hline_0",
name: "Zero"
}],
inputs: [{
id: "periods",
type: "integer",
name: "Periods"
}, {
id: "rocLookback",
type: "integer",
name: "Rate of Change Lookback"
}],
format: {
type: "volume"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.period = this._input(0),
this.rocLookback = this._input(1)
}, this.main = function(e, t) {
this._context = e, this._input = t, this._context
.setMinimumAdditionalDepth(this.period + this.rocLookback);
var i = this._context.new_var(s.Std.high(this._context) - s.Std.low(
this._context)),
r = this._context.new_var(s.Std.ema(i, this.period, this
._context));
return [s.Std.roc(r, this.rocLookback)]
}
}
}, {
name: "Chande Kroll Stop",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
}
},
inputs: {
in_0: 10,
in_1: 1,
in_2: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "Long",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Short",
histogramBase: 0,
joinPoints: !1
}
},
description: "Chande Kroll Stop",
shortDescription: "Chande Kroll Stop",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "p",
defval: 10,
type: "integer",
min: 1,
max: 4999
}, {
id: "in_1",
name: "x",
defval: 1,
type: "integer",
min: 1,
max: 1e12
}, {
id: "in_2",
name: "q",
defval: 9,
type: "integer",
min: 1,
max: 1e12
}],
id: "Chande Kroll Stop@tv-basicstudies-1",
scriptIdPart: "",
name: "Chande Kroll Stop",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t, i) {
return e - t * i
}, this.f_1 = function(e, t, i) {
return e + t * i
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = this._input(2),
o = s.Std.high(this._context),
a = this._context.new_var(o),
l = s.Std.highest(a, i, this._context),
c = s.Std.atr(i, this._context),
h = this.f_0(l, r, c),
u = this._context.new_var(o),
d = s.Std.lowest(u, i, this._context),
p = this.f_1(d, r, c),
_ = this._context.new_var(h),
m = s.Std.highest(_, n, this._context),
f = this._context.new_var(p);
return [s.Std.lowest(f, n, this._context), m]
}
}
}, {
name: "Chande Momentum Oscillator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Chande Momentum Oscillator",
shortDescription: "ChandeMO",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "length",
defval: 9,
type: "integer",
min: 1,
max: 2e3
}],
id: "Chande Momentum Oscillator@tv-basicstudies-1",
scriptIdPart: "",
name: "Chande Momentum Oscillator",
format: {
type: "price",
precision: 2
}
},
constructor: function() {
this.f_0 = function(e) {
return s.Std.ge(e, 0) ? e : 0
},
this.f_1 = function(e) {
return s.Std.ge(e, 0) ? 0 : -e
}, this.f_2 = function(e, t) {
return 100 * e / t
}, this.f_3 = function(e, t) {
return this.f_2(e - t, e + t)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = s.Std.close(this._context),
n = this._context.new_var(r),
o = s.Std.change(n),
a = this.f_0(o),
l = this.f_1(o),
c = this._context.new_var(a),
h = s.Std.sum(c, i, this._context),
u = this._context.new_var(l),
d = s.Std.sum(u, i, this._context);
return [this.f_3(h, d)]
}
}
}, {
name: "Chop Zone",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 5,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#000080"
}
},
palettes: {
palette_0: {
colors: {
0: {
color: "#26C6DA",
width: 1,
style: 0
},
1: {
color: "#43A047",
width: 1,
style: 0
},
2: {
color: "#A5D6A7",
width: 1,
style: 0
},
3: {
color: "#009688",
width: 1,
style: 0
},
4: {
color: "#D50000",
width: 1,
style: 0
},
5: {
color: "#E91E63",
width: 1,
style: 0
},
6: {
color: "#FF6D00",
width: 1,
style: 0
},
7: {
color: "#FFB74D",
width: 1,
style: 0
},
8: {
color: "#FDD835",
width: 1,
style: 0
}
}
}
},
inputs: {}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
palette: "palette_0",
target: "plot_0",
type: "colorer"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Chop Zone",
shortDescription: "Chop Zone",
is_price_study: !1,
palettes: {
palette_0: {
colors: {
0: {
name: "Color 0"
},
1: {
name: "Color 1"
},
2: {
name: "Color 2"
},
3: {
name: "Color 3"
},
4: {
name: "Color 4"
},
5: {
name: "Color 5"
},
6: {
name: "Color 6"
},
7: {
name: "Color 7"
},
8: {
name: "Color 8"
}
},
valToIndex: {
0: 0,
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
6: 6,
7: 7,
8: 8
}
}
},
inputs: [],
id: "chop_zone@tv-basicstudies-1",
scriptIdPart: "",
name: "Chop Zone",
format: {
precision: 0,
type: "price"
}
},
constructor: function() {
this.f_0 = function() {
var e = s.Std.close(this._context),
t = s.Std.hlc3(this._context),
i = this._context.new_var(s.Std.high(this._context)),
r = s.Std.highest(i, 30, this._context),
n = s.Std.lowest(i, 30, this._context),
o = 25 / (r - n) * n,
a = this._context.new_var(e),
l = this._context.new_var(s.Std.ema(a, 34, this._context)),
c = (l.get(1) - l.get(0)) / t * o,
h = s.Std.sqrt(1 + c * c),
u = s.Std.round(180 * s.Std.acos(1 / h) / 3.141592653589793),
d = s.Std.iff(s.Std.gt(c, 0), -u, u),
p = s.Std.and(s.Std.gt(d, -2.14), s.Std.le(d, -.71)) ? 7 : 8,
_ = s.Std.and(s.Std.gt(d, -3.57), s.Std.le(d, -2.14)) ? 6 : p,
m = s.Std.and(s.Std.gt(d, -5), s.Std.le(d, -3.57)) ? 5 : _,
f = s.Std.le(d, -5) ? 4 : m,
g = s.Std.and(s.Std.lt(d, 2.14), s.Std.ge(d, .71)) ? 3 : f,
b = s.Std.and(s.Std.lt(d, 3.57), s.Std.ge(d, 2.14)) ? 2 : g,
v = s.Std.and(s.Std.lt(d, 5), s.Std.ge(d, 3.57)) ? 1 : b;
return [1, s.Std.ge(d, 5) ? 0 : v]
}, this.main = function(e, t) {
return this._context = e, this._input = t, this.f_0()
}
}
}, {
name: "Choppiness Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 61.8
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 38.2
}],
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Choppiness Index",
shortDescription: "CHOP",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 14,
type: "integer",
min: 1,
max: 2e3
}],
id: "Choppiness Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Choppiness Index",
format: {
type: "price",
precision: 2
}
},
constructor: function() {
this.f_0 = function(e, t, i, r) {
return 100 * s.Std.log10(e / (t - i)) / r
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = s.Std.atr(1, this._context),
n = this._context.new_var(r),
o = s.Std.sum(n, i, this._context),
a = s.Std.high(this._context),
l = this._context.new_var(a),
c = s.Std.highest(l, i, this._context),
h = s.Std.low(this._context),
u = this._context.new_var(h),
d = s.Std.lowest(u, i, this._context),
p = s.Std.log10(i);
return [this.f_0(o, c, d, p)]
}
}
}, {
name: "Commodity Channel Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
smoothedMA: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !1
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 100
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: -100
}],
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 20,
smoothingLine: "SMA",
smoothingLength: 20
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "smoothedMA",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
},
smoothedMA: {
title: "Smoothed MA",
histogramBase: 0,
joinPoints: !1
}
},
description: "Commodity Channel Index",
shortDescription: "CCI",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}, {
id: "smoothingLine",
name: "Smoothing Line",
defval: "SMA",
type: "text",
options: ["SMA", "EMA", "WMA"]
}, {
id: "smoothingLength",
name: "Smoothing Length",
defval: 20,
type: "integer",
min: 1,
max: 1e4
}],
id: "Commodity Channel Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Commodity Channel Index",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t, i) {
return (e - t) / (.015 * i)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.hlc3(this._context),
r = this._input(0),
n = this._input(1),
o = this._input(2);
this._context.setMinimumAdditionalDepth(r + o);
var a, l = this._context.new_var(i),
c = s.Std.sma(l, r, this._context),
h = this._context.new_var(i),
u = s.Std.dev(h, r, this._context),
d = this.f_0(i, c, u),
p = this._context.new_var(d);
return "EMA" === n ? a = s.Std.ema(p, o, this._context) : "WMA" ===
n ? a = s.Std.wma(p, o, this._context) : "SMA" === n && (a = s
.Std.sma(p, o, this._context)), [d, a]
}
}
}, {
name: "Connors RSI",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 70
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 30
}],
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 3,
in_1: 2,
in_2: 100
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "CRSI",
histogramBase: 0,
joinPoints: !1
}
},
description: "Connors RSI",
shortDescription: "CRSI",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "in_0",
name: "RSI Length",
defval: 3,
type: "integer",
min: 1
}, {
id: "in_1",
name: "UpDown Length",
defval: 2,
type: "integer",
min: 1
}, {
id: "in_2",
name: "ROC Length",
defval: 100,
type: "integer",
min: 1
}],
id: "Connors RSI@tv-basicstudies-1",
scriptIdPart: "",
name: "Connors RSI",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
var e;
this.f_1 = function(e, t, i) {
var r = i.new_var(s.Std.max(s.Std.change(e), 0));
return s.Std.rma(r, t, i)
}, this.f_2 = function(e, t, i) {
var r = i.new_var(-s.Std.min(s.Std.change(e), 0));
return s.Std.rma(r, t, i)
}, this.f_3 = (e = 0, function(t) {
var i = t.get(0),
r = t.get(1);
return e = i === r ? 0 : i > r ? s.Std.nz(e) <= 0 ? 1 : s.Std
.nz(e) + 1 : s.Std.nz(e) >= 0 ? -1 : s.Std.nz(e) - 1, this
._context.new_var(e)
}), this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._context.new_var(i),
n = this._input(0),
o = this._input(1),
a = this._input(2);
this._context.setMinimumAdditionalDepth(a);
var l = s.Std.rsi(this.f_1(r, n, this._context), this.f_2(r, n, this
._context)),
c = this.f_3(r),
h = s.Std.rsi(this.f_1(c, o, this._context), this.f_2(c, o, this
._context)),
u = this._context.new_var(s.Std.roc(r, 1)),
d = s.Std.percentrank(u, a);
return [s.Std.avg(l, h, d)]
}
}
}, {
name: "Coppock Curve",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 10,
in_1: 14,
in_2: 11
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Coppock Curve",
shortDescription: "Coppock Curve",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "WMA Length",
defval: 10,
type: "integer",
min: -1e12,
max: 5e3
}, {
id: "in_1",
name: "Long RoC Length",
defval: 14,
type: "integer",
min: 1,
max: 4999
}, {
id: "in_2",
name: "Short RoC Length",
defval: 11,
type: "integer",
min: 1,
max: 4999
}],
id: "Coppock Curve@tv-basicstudies-1",
scriptIdPart: "",
name: "Coppock Curve",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e + t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = this._input(2);
this._context.setMinimumAdditionalDepth(i + Math.max(r, n));
var o = s.Std.close(this._context),
a = this._context.new_var(o),
l = s.Std.roc(a, r),
c = this._context.new_var(o),
h = s.Std.roc(c, n),
u = this.f_0(l, h),
d = this._context.new_var(u);
return [s.Std.wma(d, i, this._context)]
}
}
}, {
name: "Correlation Coeff",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 4,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: "AAPL",
in_1: 20
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Correlation Coefficient",
shortDescription: "CC",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "sym",
defval: "AAPL",
type: "symbol"
}, {
id: "in_1",
name: "length",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}],
id: "Correlation Coeff@tv-basicstudies-1",
scriptIdPart: "",
name: "Correlation Coeff",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this._context.new_sym(this
._input(0), s.Std.period(this._context))
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._context.new_unlimited_var(this._context.symbol.time),
r = (this._input(0), s.Std.period(this._context), s.Std.close(
this._context)),
n = this._input(1);
this._context.select_sym(1);
var o = this._context.new_unlimited_var(this._context.symbol.time),
a = s.Std.close(this._context),
l = this._context.new_unlimited_var(a);
this._context.select_sym(0);
var c = l.adopt(o, i, 0),
h = this._context.new_var(r),
u = this._context.new_var(c);
return [s.Std.correlation(h, u, n, this._context)]
}
}
}, {
name: "Correlation - Log",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !1,
id: "Correlation - Log@tv-basicstudies-1",
scriptIdPart: "",
name: "Correlation - Log",
description: "Correlation - Log",
shortDescription: "Correlation - Log",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#2196F3"
}
},
inputs: {
instrument: "INTC",
instrument2: "AMZN",
periods: 25
}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [{
id: "instrument",
name: "Instrument 1",
type: "symbol",
defval: "INTC",
confirm: !0
}, {
id: "instrument2",
name: "Instrument 2",
type: "symbol",
defval: "AMZN",
confirm: !0
}, {
id: "periods",
name: "Periods",
type: "integer",
defval: 25
}],
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this._context.new_sym(this
._input(0), s.Std.period(this._context)), this._context
.new_sym(this._input(1), s.Std.period(this._context)), this
.period = this._input(2)
}, this.correlationLog = function(e, t, i, r) {
var n = s.Std.sma(e, i, r),
o = s.Std.sma(t, i, r),
a = r.new_var(e.get() * t.get());
return (s.Std.sma(a, i, r) - n * o) / Math.sqrt(s.Std.variance2(e,
n, i) * s.Std.variance2(t, o, i))
}, this.main = function(e, t) {
this._context = e, this._input = t, this._context.select_sym(1);
var i = this._context.new_var(this._context.symbol.time);
this._context.select_sym(2);
var r = this._context.new_var(s.Std.close(this._context)),
n = this._context.new_var(s.Std.log(r.get() / r.get(1))),
o = this._context.new_var(this._context.symbol.time);
this._context.select_sym(1);
var a = this._context.new_var(s.Std.close(this._context)),
l = this._context.new_var(s.Std.log(a.get() / a.get(1))),
c = this._context.new_var(n.adopt(o, i, 0)),
h = this.correlationLog(l, c, this.period, this._context);
return [s.Std.round(1e3 * h) / 1e3]
}
}
}, {
name: "Detrended Price Oscillator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#43A047"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
in_0: 21,
in_1: !1
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "DPO",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Detrended Price Oscillator",
shortDescription: "DPO",
is_price_study: !1,
is_hidden_study: !1,
id: "detrended_price_oscillator@tv-basicstudies-1",
bands: [{
id: "hline_0",
name: "Zero",
isHidden: !1
}],
inputs: [{
id: "in_0",
name: "Period",
defval: 21,
type: "integer",
min: 1,
max: 1e12
}, {
id: "in_1",
name: "isCentered",
defval: !1,
type: "bool"
}],
scriptIdPart: "",
name: "Detrended Price Oscillator",
format: {
type: "price",
precision: 2
}
},
constructor: function() {
this.f_0 = function() {
var e = this._input(0),
t = this._input(1),
i = Math.floor(e / 2 + 1);
this._context.setMinimumAdditionalDepth(e + i);
var r = this._context.new_var(s.Std.close(this._context)),
n = this._context.new_var(s.Std.sma(r, e, this._context)),
o = this._context.new_var(s.Std.close(this._context)).get(i) -
n,
a = s.Std.close(this._context) - n.get(i);
return [t ? o : a, t ? -i : 0]
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this.f_0();
return [{
value: i[0],
offset: i[1]
}]
}
}
}, {
name: "Directional Movement Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#F50057"
}
},
inputs: {
in_0: 14,
in_1: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "+DI",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "-DI",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "ADX",
histogramBase: 0,
joinPoints: !1
}
},
description: "Directional Movement",
shortDescription: "DMI",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "DI Length",
defval: 14,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "ADX Smoothing",
defval: 14,
type: "integer",
min: 1,
max: 50
}],
id: "Directional Movement Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Directional Movement Index",
format: {
precision: 4,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e) {
return -e
}, this.f_1 = function(e, t) {
return s.Std.and(s.Std.gt(e, t), s.Std.gt(e, 0)) ? e : 0
}, this.f_2 = function(e, t) {
return 100 * e / t
}, this.f_3 = function(e, t) {
return e + t
}, this.f_4 = function(e, t, i) {
return s.Std.abs(e - t) / (s.Std.eq(i, 0) ? 1 : i)
}, this.f_5 = function(e) {
return 100 * e
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1);
this._context.setMinimumAdditionalDepth(i + r);
var n = s.Std.high(this._context),
o = this._context.new_var(n),
a = s.Std.change(o),
l = s.Std.low(this._context),
c = this._context.new_var(l),
h = s.Std.change(c),
u = this.f_0(h),
d = s.Std.tr(this._context),
p = this._context.new_var(d),
_ = s.Std.rma(p, i, this._context),
m = this.f_1(a, u),
f = this._context.new_var(m),
g = s.Std.rma(f, i, this._context),
b = this.f_2(g, _),
v = s.Std.fixnan(b, this._context),
S = this.f_1(u, a),
y = this._context.new_var(S),
w = s.Std.rma(y, i, this._context),
P = this.f_2(w, _),
C = s.Std.fixnan(P, this._context),
x = this.f_3(v, C),
T = this.f_4(v, C, x),
I = this._context.new_var(T),
M = s.Std.rma(I, r, this._context);
return [v, C, this.f_5(M)]
}
}
}, {
name: "Donchian Channels",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
}
},
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 95,
visible: !0
}
},
inputs: {
in_0: 20
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "Lower",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Upper",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Basis",
histogramBase: 0,
joinPoints: !1
}
},
description: "Donchian Channels",
shortDescription: "DC",
is_price_study: !0,
filledAreas: [{
id: "fill_0",
objAId: "plot_1",
objBId: "plot_0",
type: "plot_plot",
title: "Plots Background"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}],
id: "Donchian Channels@tv-basicstudies-1",
scriptIdPart: "",
name: "Donchian Channels",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = s.Std.low(this._context),
n = this._context.new_var(r),
o = s.Std.lowest(n, i, this._context),
a = s.Std.high(this._context),
l = this._context.new_var(a),
c = s.Std.highest(l, i, this._context);
return [o, c, s.Std.avg(c, o)]
}
}
}, {
name: "Double Exponential Moving Average",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#43A047"
}
},
inputs: {
in_0: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Double EMA",
shortDescription: "DEMA",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "length",
defval: 9,
type: "integer",
min: 1,
max: 1e4
}],
id: "Double Exponential Moving Average@tv-basicstudies-1",
scriptIdPart: "",
name: "Double Exponential Moving Average",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return 2 * e - t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0);
this._context.setMinimumAdditionalDepth(2 * i);
var r = s.Std.close(this._context),
n = this._context.new_var(r),
o = s.Std.ema(n, i, this._context),
a = this._context.new_var(o),
l = s.Std.ema(a, i, this._context);
return [this.f_0(o, l)]
}
}
}, {
name: "Ease of Movement",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#43A047"
}
},
inputs: {
in_0: 1e4,
in_1: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Ease Of Movement",
shortDescription: "EOM",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "Divisor",
defval: 1e4,
type: "integer",
min: 1,
max: 1e9
}, {
id: "in_1",
name: "length",
defval: 14,
type: "integer",
min: 1,
max: 2e3
}],
id: "Ease of Movement@tv-basicstudies-1",
scriptIdPart: "",
name: "Ease of Movement",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function(e, t, i, s, r) {
return e * t * (i - s) / r
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = s.Std.hl2(this._context),
o = this._context.new_var(n),
a = s.Std.change(o),
l = this.f_0(i, a, s.Std.high(this._context), s.Std.low(this
._context), s.Std.volume(this._context)),
c = this._context.new_var(l);
return [s.Std.sma(c, r, this._context)]
}
}
}, {
name: "Elders Force Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#F44336"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
in_0: 13
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Elder's Force Index",
shortDescription: "EFI",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "Zero"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 13,
type: "integer",
min: 1,
max: 2e3
}],
id: "Elders Force Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Elders Force Index",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e * t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = s.Std.close(this._context),
n = this._context.new_var(r),
o = s.Std.change(n),
a = this.f_0(o, s.Std.volume(this._context)),
l = this._context.new_var(a);
return [s.Std.ema(l, i, this._context)]
}
}
}, {
name: "EMA Cross",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#43A047"
},
plot_2: {
linestyle: 0,
linewidth: 4,
plottype: 3,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 9,
in_1: 26
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "Short",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Long",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Crosses",
histogramBase: 0,
joinPoints: !1
}
},
description: "EMA Cross",
shortDescription: "EMA Cross",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Short",
defval: 9,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "Long",
defval: 26,
type: "integer",
min: 1,
max: 2e3
}],
id: "EMA Cross@tv-basicstudies-1",
scriptIdPart: "",
name: "EMA Cross",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e ? t : s.Std.na()
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = s.Std.close(this._context),
o = this._context.new_var(n),
a = s.Std.ema(o, i, this._context),
l = this._context.new_var(n),
c = s.Std.ema(l, r, this._context),
h = a,
u = c,
d = s.Std.cross(a, c, this._context);
return [h, u, this.f_0(d, a)]
}
}
}, {
name: "Envelopes",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 95,
visible: !0
}
},
inputs: {
in_0: 20,
in_1: 10,
in_2: 10,
in_3: "Simple",
in_4: "close"
}
},
plots: [{
id: "plot_1",
type: "line"
}, {
id: "plot_0",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "Average",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Upper",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Lower",
histogramBase: 0,
joinPoints: !1
}
},
description: "Envelopes",
shortDescription: "Envelopes",
is_price_study: !0,
filledAreas: [{
id: "fill_0",
objAId: "plot_1",
objBId: "plot_2",
type: "plot_plot",
title: "Plots Background"
}],
inputs: [{
id: "in_0",
name: "Length",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "Upper Percentage",
defval: 2,
type: "float",
min: 0
}, {
id: "in_2",
name: "Lower Percentage",
defval: 2,
type: "float",
min: 0
}, {
id: "in_3",
name: "Method",
type: "text",
defval: "Simple",
options: ["Simple", "Exponential", "Weighted"]
}, {
id: "in_4",
name: "Source",
defval: "close",
type: "source",
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
}],
id: "Envelope@tv-basicstudies-1",
scriptIdPart: "",
name: "Envelopes",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e * (1 + t)
}, this.f_1 = function(e, t) {
return e * (1 - t)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._context.new_var(s.Std[this._input(4)](this._context)),
r = s.Std.sma(i, this._input(0), this._context);
return "Exponential" === this._input(3) ? r = s.Std.ema(i, this
._input(0), this._context) : "Weighted" === this._input(
3) && (r = s.Std.wma(i, this._input(0), this._context)), [
this
.f_0(r, this._input(1) / 100), r, this.f_1(r, this._input(
2) / 100)
]
}
}
}, {
name: "Standard Error",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !1,
id: "Standard Error@tv-basicstudies-1",
scriptIdPart: "",
name: "Standard Error",
description: "Standard Error",
shortDescription: "Standard Error",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#FF6D00"
}
},
inputs: {
length: 14
}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [{
id: "length",
type: "integer",
name: "Length"
}],
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.period = this._input(0)
}, this.main = function(e, t) {
this._context = e, this._input = t;
for (var i, r, n = this._context.new_var(s.Std.close(this
._context)), o = 0, a = 0, l = 0; l < this.period; l++) o +=
l + 1, a += n.get(l);
i = o / this.period, r = a / this.period;
var c = 0,
h = 0,
u = 0;
for (l = 0; l < this.period; l++) u += Math.pow(r - n.get(l), 2),
h += (i - l - 1) * (r - n.get(l)), c += Math.pow(i - l - 1, 2);
return h = Math.pow(h, 2), [Math.sqrt((u - h / c) / (this.period -
2))]
}
}
}, {
name: "Standard Error Bands",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !0,
id: "Standard Error Bands@tv-basicstudies-1",
scriptIdPart: "",
name: "Standard Error Bands",
description: "Standard Error Bands",
shortDescription: "Standard Error Bands",
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
transparency: 0,
trackPrice: !1,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
visible: !0,
linewidth: 1,
transparency: 0,
plottype: 0,
trackPrice: !1,
color: "#FF6D00"
},
plot_2: {
linestyle: 0,
visible: !0,
linewidth: 1,
transparency: 0,
plottype: 0,
trackPrice: !1,
color: "#2196F3"
}
},
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 95,
visible: !0
}
},
inputs: {
periods: 21,
errors: 2,
method: "Simple",
averagePeriods: 3
}
},
styles: {
plot_0: {
title: "Plot 1"
},
plot_1: {
title: "Plot 2"
},
plot_2: {
title: "Plot 3"
}
},
filledAreas: [{
id: "fill_0",
objAId: "plot_0",
objBId: "plot_2",
type: "plot_plot",
title: "Background"
}],
inputs: [{
id: "periods",
type: "integer",
name: "Periods"
}, {
id: "errors",
type: "float",
name: "Standard Errors"
}, {
id: "method",
name: "Method",
type: "text",
defval: "Simple",
options: ["Simple", "Exponential", "Weighted"]
}, {
id: "averagePeriods",
type: "integer",
name: "Averaging Periods"
}],
format: {
type: "inherit"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.period = this._input(0),
this.errorDeviation = this._input(1), this.maMethod = this
._input(2), this.averagePeriod = this._input(3)
}, this.main = function(e, t) {
this._context = e, this._input = t;
for (var i, r, n = this._context.new_var(s.Std.close(this
._context)), o = 0, a = 0, l = 0; l < this.period; l++) o +=
l + 1, a += n.get(l);
i = o / this.period, r = a / this.period;
var c = 0,
h = 0,
u = 0;
for (l = 0; l < this.period; l++) u += Math.pow(r - n.get(l), 2),
h += (i - l - 1) * (r - n.get(l)), c += Math.pow(i - l - 1, 2);
h = Math.pow(h, 2);
var d, p, _, m = Math.sqrt((u - h / c) / (this.period - 2)),
f = s.Std.linreg(n, this.period, 0),
g = this._context.new_var(f + this.errorDeviation * m),
b = this._context.new_var(f),
v = this._context.new_var(f - this.errorDeviation * m);
return "Simple" === this.maMethod ? (d = s.Std.sma(g, this
.averagePeriod, this._context), p = s.Std.sma(b, this
.averagePeriod, this._context), _ = s.Std.sma(v, this
.averagePeriod, this._context)) : "Exponential" === this
.maMethod ? (d = s.Std.ema(g, this.averagePeriod, this
._context), p = s.Std.ema(b, this.averagePeriod, this
._context), _ = s.Std.ema(v, this.averagePeriod, this
._context)) : (d = s.Std.wma(g, this.averagePeriod, this
._context), p = s.Std.wma(b, this.averagePeriod, this
._context), _ = s.Std.wma(v, this.averagePeriod, this
._context)), [d, p, _]
}
}
}, {
name: "Fisher Transform",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
}
},
bands: [{
color: "#E91E63",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 1.5
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: .75
}, {
color: "#E91E63",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: -.75
}, {
color: "#E91E63",
linestyle: 2,
linewidth: 1,
visible: !0,
value: -1.5
}],
inputs: {
in_0: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "Fisher",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
},
plot_1: {
title: "Trigger",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Fisher Transform",
shortDescription: "Fisher",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "Level",
isHidden: !1
}, {
id: "hline_1",
name: "Level",
isHidden: !1
}, {
id: "hline_2",
name: "Level",
isHidden: !1
}, {
id: "hline_3",
name: "Level",
isHidden: !1
}, {
id: "hline_4",
name: "Level",
isHidden: !1
}],
inputs: [{
id: "in_0",
name: "Length",
defval: 9,
type: "integer",
min: 1,
max: 1e12
}],
id: "fisher_transform@tv-basicstudies-1",
scriptIdPart: "",
name: "Fisher Transform",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e) {
var t = s.Std.lt(e, -.99) ? -.999 : e;
return [s.Std.gt(e, .99) ? .999 : t]
}, this.f_1 = function() {
var e = this._input(0),
t = this._context.new_var(s.Std.hl2(this._context)),
i = s.Std.highest(t, e, this._context),
r = this._context.new_var(s.Std.hl2(this._context)),
n = s.Std.lowest(r, e, this._context),
o = this._context.new_var(),
a = this.f_0(.66 * ((s.Std.hl2(this._context) - n) / s.Std.max(
i - n, .001) - .5) + .67 * s.Std.nz(o.get(1)));
o.set(a[0]);
var l = this._context.new_var();
l.set(.5 * s.Std.log((1 + o.get(0)) / s.Std.max(1 - o.get(0),
.001)) + .5 * s.Std.nz(l.get(1)));
var c = l.get(1);
return [l.get(0), c]
}, this.main = function(e, t) {
return this._context = e, this._input = t, this.f_1()
}
}
}, {
name: "Historical Volatility",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Historical Volatility",
shortDescription: "HV",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "length",
defval: 10,
type: "integer",
min: 1,
max: 1e12
}],
id: "historical_volatility@tv-basicstudies-1",
scriptIdPart: "",
name: "Historical Volatility",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function() {
var e = this._input(0),
t = s.Std.or(s.Std.isintraday(this._context), s.Std.and(s.Std
.isdaily(this._context), s.Std.eq(s.Std.interval(this
._context), 1))) ? 1 : 7,
i = this._context.new_var(s.Std.close(this._context)),
r = this._context.new_var(s.Std.log(s.Std.close(this._context) /
i.get(1)));
return [100 * s.Std.stdev(r, e, this._context) * s.Std.sqrt(365 /
t)]
}, this.main = function(e, t) {
return this._context = e, this._input = t, this.f_0()
}
}
}, {
name: "Hull MA",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Hull Moving Average",
shortDescription: "HMA",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "length",
defval: 9,
type: "integer",
min: 1,
max: 1e4
}],
id: "Hull MA@tv-basicstudies-1",
scriptIdPart: "",
name: "Hull MA",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return 2 * e - t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = r / 2;
this._context.setMinimumAdditionalDepth(Math.ceil(r + n));
var o = this._context.new_var(i),
a = s.Std.wma(o, n, this._context),
l = this._context.new_var(i),
c = s.Std.wma(l, r, this._context),
h = this.f_0(a, c),
u = s.Std.sqrt(r),
d = s.Std.round(u),
p = this._context.new_var(h);
return [s.Std.wma(p, d, this._context)]
}
}
}, {
name: "Ichimoku Cloud",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#B71C1C"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#43A047"
},
plot_3: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#A5D6A7"
},
plot_4: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#EF9A9A"
}
},
palettes: {
palette_0: {
colors: {
0: {
color: "#43A047",
width: 1,
style: 0
},
1: {
color: "#F44336",
width: 1,
style: 0
}
}
}
},
filledAreasStyle: {
fill_0: {
color: "#000080",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 9,
in_1: 26,
in_2: 52,
in_3: 26
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}, {
id: "plot_3",
type: "line"
}, {
id: "plot_4",
type: "line"
}, {
id: "plot_5",
palette: "palette_0",
target: "fill_0",
type: "colorer"
}],
styles: {
plot_0: {
title: "Conversion Line",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
},
plot_1: {
title: "Base Line",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
},
plot_2: {
title: "Lagging Span",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
},
plot_3: {
title: "Lead 1",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
},
plot_4: {
title: "Lead 2",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Ichimoku Cloud",
shortDescription: "Ichimoku",
is_price_study: !0,
is_hidden_study: !1,
id: "Ichimoku Cloud@tv-basicstudies-1",
palettes: {
palette_0: {
colors: {
0: {
name: "Color 0"
},
1: {
name: "Color 1"
}
},
valToIndex: {
0: 0,
1: 1
}
}
},
filledAreas: [{
id: "fill_0",
objAId: "plot_3",
objBId: "plot_4",
type: "plot_plot",
title: "Plots Background",
isHidden: !1,
palette: "palette_0"
}],
inputs: [{
id: "in_0",
name: "Conversion Line Periods",
defval: 9,
type: "integer",
min: 1,
max: 1e12
}, {
id: "in_1",
name: "Base Line Periods",
defval: 26,
type: "integer",
min: 1,
max: 1e12
}, {
id: "in_2",
name: "Lagging Span 2 Periods",
defval: 52,
type: "integer",
min: 1,
max: 1e12
}, {
id: "in_3",
name: "Displacement",
defval: 26,
type: "integer",
min: 1,
max: 1e12
}],
scriptIdPart: "",
name: "Ichimoku Cloud",
format: {
type: "inherit"
}
},
constructor: function() {
this.donchian = function(e) {
var t = this._context.new_var(s.Std.low(this._context)),
i = this._context.new_var(s.Std.high(this._context));
return s.Std.avg(s.Std.lowest(t, e, this._context), s.Std.highest(i,
e, this._context))
}, this.f_1 = function() {
var e = this._input(0),
t = this._input(1),
i = this._input(2),
r = this._input(3),
n = this.donchian(e),
o = this.donchian(t),
a = s.Std.avg(n, o),
l = this.donchian(i);
return [n, o, s.Std.close(this._context), a, l, 1 - r, r - 1, r - 1,
s.Std.gt(a, l) ? 0 : 1
]
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this.f_1();
return [i[0], i[1], {
value: i[2],
offset: i[5]
}, {
value: i[3],
offset: i[6]
}, {
value: i[4],
offset: i[7]
}, i[8]]
}
}
}, {
name: "Keltner Channels",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 95,
visible: !0
}
},
inputs: {
in_0: !0,
in_1: 20,
in_2: 1
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "Upper",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Middle",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Lower",
histogramBase: 0,
joinPoints: !1
}
},
description: "Keltner Channels",
shortDescription: "KC",
is_price_study: !0,
filledAreas: [{
id: "fill_0",
objAId: "plot_0",
objBId: "plot_2",
type: "plot_plot",
title: "Plots Background"
}],
inputs: [{
id: "in_0",
name: "useTrueRange",
defval: !0,
type: "bool"
}, {
id: "in_1",
name: "length",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_2",
name: "mult",
defval: 1,
type: "float",
min: -1e12,
max: 1e12
}],
id: "Keltner Channels@tv-basicstudies-1",
scriptIdPart: "",
name: "Keltner Channels",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t, i, s) {
return e ? t : i - s
}, this.f_1 = function(e, t, i) {
return e + t * i
}, this.f_2 = function(e, t, i) {
return e - t * i
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._input(1),
o = this._input(2),
a = this._context.new_var(i),
l = s.Std.ema(a, n, this._context),
c = this.f_0(r, s.Std.tr(this._context), s.Std.high(this
._context), s.Std.low(this._context)),
h = this._context.new_var(c),
u = s.Std.ema(h, n, this._context);
return [this.f_1(l, u, o), l, this.f_2(l, u, o)]
}
}
}, {
name: "Klinger Oscillator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#43A047"
}
},
inputs: {}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Signal",
histogramBase: 0,
joinPoints: !1
}
},
description: "Klinger Oscillator",
shortDescription: "Klinger Oscillator",
is_price_study: !1,
inputs: [],
id: "Klinger Oscillator@tv-basicstudies-1",
scriptIdPart: "",
name: "Klinger Oscillator",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return s.Std.ge(e, 0) ? t : -t
}, this.f_1 = function(e, t) {
return e - t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.hlc3(this._context);
this._context.setMinimumAdditionalDepth(66);
var r = this._context.new_var(i),
n = s.Std.change(r),
o = this.f_0(n, s.Std.volume(this._context)),
a = this._context.new_var(o),
l = s.Std.ema(a, 34, this._context),
c = this._context.new_var(o),
h = s.Std.ema(c, 55, this._context),
u = this.f_1(l, h),
d = this._context.new_var(u);
return [u, s.Std.ema(d, 13, this._context)]
}
}
}, {
name: "Know Sure Thing",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#009688"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#F44336"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
in_0: 10,
in_1: 15,
in_2: 20,
in_3: 30,
in_4: 10,
in_5: 10,
in_6: 10,
in_7: 15,
in_8: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "KST",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Signal",
histogramBase: 0,
joinPoints: !1
}
},
description: "Know Sure Thing",
shortDescription: "KST",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "Zero"
}],
inputs: [{
id: "in_0",
name: "roclen1",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "roclen2",
defval: 15,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_2",
name: "roclen3",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_3",
name: "roclen4",
defval: 30,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_4",
name: "smalen1",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_5",
name: "smalen2",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_6",
name: "smalen3",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_7",
name: "smalen4",
defval: 15,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_8",
name: "siglen",
defval: 9,
type: "integer",
min: 1,
max: 2e3
}],
id: "Know Sure Thing@tv-basicstudies-1",
scriptIdPart: "",
name: "Know Sure Thing",
format: {
type: "price",
precision: 4
}
},
constructor: function() {
this.f_0 = function(e, t, i, s) {
return e + 2 * t + 3 * i + 4 * s
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = this._input(2),
o = this._input(3),
a = this._input(4),
l = this._input(5),
c = this._input(6),
h = this._input(7),
u = this._input(8);
this._context.setMinimumAdditionalDepth(Math.max(a + i, l + r, c +
n, h + o) + u);
var d = s.Std.close(this._context),
p = i,
_ = this._context.new_var(d),
m = s.Std.roc(_, p),
f = a,
g = this._context.new_var(m),
b = s.Std.sma(g, f, this._context),
v = r,
S = this._context.new_var(d),
y = s.Std.roc(S, v),
w = l,
P = this._context.new_var(y),
C = s.Std.sma(P, w, this._context),
x = n,
T = this._context.new_var(d),
I = s.Std.roc(T, x),
M = c,
O = this._context.new_var(I),
L = s.Std.sma(O, M, this._context),
A = o,
E = this._context.new_var(d),
k = s.Std.roc(E, A),
D = h,
V = this._context.new_var(k),
B = s.Std.sma(V, D, this._context),
R = this.f_0(b, C, L, B),
N = this._context.new_var(R);
return [R, s.Std.sma(N, u, this._context)]
}
}
}, {
name: "Least Squares Moving Average",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 25,
in_1: 0
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Least Squares Moving Average",
shortDescription: "LSMA",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Length",
defval: 25,
type: "integer",
min: 1,
max: 1e12
}, {
id: "in_1",
name: "Offset",
defval: 0,
type: "integer",
min: -1e12,
max: 1e12
}],
id: "Least Squares Moving Average@tv-basicstudies-1",
scriptIdPart: "",
name: "Least Squares Moving Average",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = s.Std.close(this._context),
o = this._context.new_var(n);
return [s.Std.linreg(o, i, r)]
}
}
}, {
name: "Linear Regression Curve",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Linear Regression Curve",
shortDescription: "LRC",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Length",
defval: 9,
type: "integer",
min: 1,
max: 2e3
}],
id: "Linear Regression Curve@tv-basicstudies-1",
scriptIdPart: "",
name: "Linear Regression Curve",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._context.new_var(i);
return [s.Std.linreg(n, r, 0)]
}
}
}, {
name: "Linear Regression Slope",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !1,
id: "Linear Regression Slope@tv-basicstudies-1",
scriptIdPart: "",
name: "Linear Regression Slope",
description: "Linear Regression Slope",
shortDescription: "Linear Regression Slope",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#FF5252"
}
},
inputs: {
periods: 14
}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [{
id: "periods",
type: "integer",
name: "Periods"
}],
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.period = this._input(0)
}, this.linregSlope = function(e, t, i) {
var s, r, n, o = 0,
a = 0,
l = 0,
c = 0;
for (s = 0; s < t; ++s) o += n = t - 1 - s + 1, a += r = e.get(s),
l += n * n, c += r * n;
return (t * c - o * a) / (t * l - o * o)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._context.new_var(s.Std.close(this._context));
return [this.linregSlope(i, this.period, 0)]
}
}
}, {
name: "MA Cross",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#43A047"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
},
plot_2: {
linestyle: 0,
linewidth: 4,
plottype: 3,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 9,
in_1: 26
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "Short",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Long",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Crosses",
histogramBase: 0,
joinPoints: !1
}
},
description: "MA Cross",
shortDescription: "MA Cross",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Short",
defval: 9,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "Long",
defval: 26,
type: "integer",
min: 1,
max: 2e3
}],
id: "MA Cross@tv-basicstudies-1",
scriptIdPart: "",
name: "MA Cross",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e ? t : s.Std.na()
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = s.Std.close(this._context),
o = this._context.new_var(n),
a = s.Std.sma(o, i, this._context),
l = this._context.new_var(n),
c = s.Std.sma(l, r, this._context),
h = a,
u = c,
d = s.Std.cross(a, c, this._context);
return [h, u, this.f_0(d, a)]
}
}
}, {
name: "MA with EMA Cross",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#43A047"
},
plot_2: {
linestyle: 0,
linewidth: 4,
plottype: 3,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 10,
in_1: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "MA",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "EMA",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Crosses",
histogramBase: 0,
joinPoints: !1
}
},
description: "MA with EMA Cross",
shortDescription: "MA/EMA Cross",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Length MA",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "Length EMA",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}],
id: "MA with EMA Cross@tv-basicstudies-1",
scriptIdPart: "",
name: "MA with EMA Cross",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e ? t : s.Std.na()
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = s.Std.close(this._context),
o = this._context.new_var(n),
a = s.Std.sma(o, i, this._context),
l = this._context.new_var(n),
c = s.Std.ema(l, r, this._context),
h = a,
u = c,
d = s.Std.cross(a, c, this._context);
return [h, u, this.f_0(d, a)]
}
}
}, {
name: "Mass Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Mass Index",
shortDescription: "Mass Index",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "length",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}],
id: "Mass Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Mass Index",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e - t
}, this.f_1 = function(e, t) {
return e / t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this.f_0(s.Std.high(this._context), s.Std.low(this
._context)),
n = this._context.new_var(r),
o = s.Std.ema(n, 9, this._context),
a = this._context.new_var(o),
l = s.Std.ema(a, 9, this._context),
c = this.f_1(o, l),
h = this._context.new_var(c);
return [s.Std.sum(h, i, this._context)]
}
}
}, {
name: "McGinley Dynamic",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "McGinley Dynamic",
shortDescription: "McGinley Dynamic",
is_price_study: !0,
is_hidden_study: !1,
id: "mcginley_dynamic@tv-basicstudies-1",
inputs: [{
id: "in_0",
name: "length",
defval: 14,
type: "integer",
min: 1,
max: 1e12
}],
scriptIdPart: "",
name: "McGinley Dynamic",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function() {
var e = this._input(0),
t = s.Std.close(this._context),
i = this._context.new_var(t),
r = s.Std.ema(i, e, this._context),
n = this._context.new_var(),
o = n.get(1) + (t - n.get(1)) / (e * s.Std.pow(t / n.get(1),
4));
return n.set(s.Std.na(n.get(1)) ? r : o), [n.get(0)]
}, this.main = function(e, t) {
return this._context = e, this._input = t, this.f_0()
}
}
}, {
name: "Median Price",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
id: "Median Price@tv-basicstudies-1",
scriptIdPart: "",
name: "Median Price",
description: "Median Price",
shortDescription: "Median Price",
is_price_study: !0,
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#FF6D00"
}
},
inputs: {}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [],
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
return this._context = e, this._input = t, [s.Std.hl2(this
._context)]
}
}
}, {
name: "Momentum",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 10,
in_1: "close"
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Mom",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Momentum",
shortDescription: "Mom",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "Length",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "Source",
defval: "close",
type: "source",
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
}],
id: "Momentum@tv-basicstudies-1",
scriptIdPart: "",
name: "Momentum",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = s.Std[this._input(1)](this._context),
n = this._context.new_var(r).get(i);
return [n ? r - n : null]
}
}
}, {
name: "Money Flow Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#7E57C2"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 80
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 20
}],
filledAreasStyle: {
fill_0: {
color: "#7E57C2",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Money Flow Index",
shortDescription: "MFI",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "in_0",
name: "Length",
defval: 14,
type: "integer",
min: 1,
max: 2e3
}],
id: "Money Flow@tv-basicstudies-1",
scriptIdPart: "",
name: "Money Flow Index",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t, i) {
return e * (s.Std.le(t, 0) ? 0 : i)
}, this.f_1 = function(e, t, i) {
return e * (s.Std.ge(t, 0) ? 0 : i)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = s.Std.hlc3(this._context),
n = this._context.new_var(r),
o = s.Std.change(n),
a = this.f_0(s.Std.volume(this._context), o, r),
l = this._context.new_var(a),
c = s.Std.sum(l, i, this._context),
h = this.f_1(s.Std.volume(this._context), o, r),
u = this._context.new_var(h),
d = s.Std.sum(u, i, this._context);
return [s.Std.rsi(c, d)]
}
}
}, {
name: "Moving Average",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
smoothedMA: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !1
}
},
inputs: {
length: 9,
source: "close",
offset: 0,
smoothingLine: "SMA",
smoothingLength: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "smoothedMA",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
},
smoothedMA: {
title: "Smoothed MA",
histogramBase: 0,
joinPoints: !1
}
},
description: "Moving Average",
shortDescription: "MA",
is_price_study: !0,
inputs: [{
id: "length",
name: "Length",
defval: 9,
type: "integer",
min: 1,
max: 1e4
}, {
id: "source",
name: "Source",
defval: "close",
type: "source",
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
}, {
id: "offset",
name: "Offset",
defval: 0,
type: "integer",
min: -1e4,
max: 1e4
}, {
id: "smoothingLine",
name: "Smoothing Line",
defval: "SMA",
type: "text",
options: ["SMA", "EMA", "WMA"]
}, {
id: "smoothingLength",
name: "Smoothing Length",
defval: 9,
type: "integer",
min: 1,
max: 1e4
}],
id: "Moving Average@tv-basicstudies-1",
scriptIdPart: "",
name: "Moving Average",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std[this._input(1)](this._context),
r = this._input(0),
n = this._input(2),
o = this._input(3),
a = this._input(4);
this._context.setMinimumAdditionalDepth(r + a);
var l, c = this._context.new_var(i),
h = s.Std.sma(c, r, this._context),
u = this._context.new_var(h);
return "EMA" === o ? l = s.Std.ema(u, a, this._context) : "WMA" ===
o ? l = s.Std.wma(u, a, this._context) : "SMA" === o && (l = s
.Std.sma(u, a, this._context)), [{
value: h,
offset: n
}, {
value: l,
offset: n
}]
}
}
}, {
name: "Moving Average Channel",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
}
},
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 20,
in_1: 20,
in_2: 0,
in_3: 0
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "Upper",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Lower",
histogramBase: 0,
joinPoints: !1
}
},
filledAreas: [{
id: "fill_0",
objAId: "plot_0",
objBId: "plot_1",
type: "plot_plot",
title: "Plots Background"
}],
description: "Moving Average Channel",
shortDescription: "MAC",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Upper Length",
defval: 20,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_1",
name: "Lower Length",
defval: 20,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_2",
name: "Upper Offset",
defval: 0,
type: "integer",
min: -1e4,
max: 1e4
}, {
id: "in_3",
name: "Lower Offset",
defval: 0,
type: "integer",
min: -1e4,
max: 1e4
}],
id: "Moving Average Channel@tv-basicstudies-1",
scriptIdPart: "",
name: "Moving Average Channel",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.high(this._context),
r = s.Std.low(this._context),
n = this._input(0),
o = this._input(1),
a = this._input(2),
l = this._input(3),
c = this._context.new_var(i),
h = this._context.new_var(r);
return [{
value: s.Std.sma(c, n, this._context),
offset: a
}, {
value: s.Std.sma(h, o, this._context),
offset: l
}]
}
}
}, {
name: "Moving Average Convergence/Divergence",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 5,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF5252"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
}
},
palettes: {
palette_0: {
colors: {
0: {
color: "#26A69A",
width: 1,
style: 0
},
1: {
color: "#B2DFDB",
width: 1,
style: 0
},
2: {
color: "#FFCDD2",
width: 1,
style: 0
},
3: {
color: "#FF5252",
width: 1,
style: 0
}
}
}
},
inputs: {
in_0: 12,
in_1: 26,
in_3: "close",
in_2: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}, {
id: "plot_3",
palette: "palette_0",
target: "plot_0",
type: "colorer"
}],
styles: {
plot_0: {
title: "Histogram",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "MACD",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Signal",
histogramBase: 0,
joinPoints: !1
}
},
description: "MACD",
shortDescription: "MACD",
is_price_study: !1,
palettes: {
palette_0: {
colors: {
0: {
name: "Color 0"
},
1: {
name: "Color 1"
},
2: {
name: "Color 2"
},
3: {
name: "Color 3"
}
}
}
},
inputs: [{
id: "in_0",
name: "fastLength",
defval: 12,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "slowLength",
defval: 26,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_3",
name: "Source",
defval: "close",
type: "source",
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
}, {
id: "in_2",
name: "signalLength",
defval: 9,
type: "integer",
min: 1,
max: 50
}],
id: "Moving Average Convergence/Divergence@tv-basicstudies-1",
scriptIdPart: "",
name: "MACD",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e - t
}, this.f_1 = function(e) {
var t = e > 0 ? 1 : 3,
i = s.Std.change(this._context.new_var(e));
return t - (s.Std.le(i, 0) ? 0 : 1)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std[this._input(2)](this._context),
r = this._input(0),
n = this._input(1),
o = this._input(3);
this._context.setMinimumAdditionalDepth(Math.max(r, n) + o);
var a = this._context.new_var(i),
l = s.Std.ema(a, r, this._context),
c = this._context.new_var(i),
h = s.Std.ema(c, n, this._context),
u = this.f_0(l, h),
d = this._context.new_var(u),
p = s.Std.ema(d, o, this._context),
_ = this.f_0(u, p);
return [_, u, p, this.f_1(_)]
}
}
}, {
name: "Moving Average Exponential",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
smoothedMA: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !1
}
},
inputs: {
length: 9,
source: "close",
offset: 0,
smoothingLine: "SMA",
smoothingLength: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "smoothedMA",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
},
smoothedMA: {
title: "Smoothed MA",
histogramBase: 0,
joinPoints: !1
}
},
description: "Moving Average Exponential",
shortDescription: "EMA",
is_price_study: !0,
inputs: [{
id: "length",
name: "Length",
defval: 9,
type: "integer",
min: 1,
max: 1e4
}, {
id: "source",
name: "Source",
defval: "close",
type: "source",
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
}, {
id: "offset",
name: "Offset",
defval: 0,
type: "integer",
min: -1e4,
max: 1e4
}, {
id: "smoothingLine",
name: "Smoothing Line",
defval: "SMA",
type: "text",
options: ["SMA", "EMA", "WMA"]
}, {
id: "smoothingLength",
name: "Smoothing Length",
defval: 9,
type: "integer",
min: 1,
max: 1e4
}],
id: "Moving Average Exponential@tv-basicstudies-1",
scriptIdPart: "",
name: "Moving Average Exponential",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std[this._input(1)](this._context),
r = this._input(0),
n = this._input(2),
o = this._input(3),
a = this._input(4);
this._context.setMinimumAdditionalDepth(r + a);
var l, c = this._context.new_var(i),
h = s.Std.ema(c, r, this._context),
u = this._context.new_var(h);
return "EMA" === o ? l = s.Std.ema(u, a, this._context) : "WMA" ===
o ? l = s.Std.wma(u, a, this._context) : "SMA" === o && (l = s
.Std.sma(u, a, this._context)), [{
value: h,
offset: n
}, {
value: l,
offset: n
}]
}
}
}, {
name: "Moving Average Weighted",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 9,
in_1: "close",
in_2: 0
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Moving Average Weighted",
shortDescription: "WMA",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Length",
defval: 9,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "Source",
defval: "close",
type: "source",
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
}, {
id: "in_2",
name: "Offset",
defval: 0,
type: "integer",
min: -1e4,
max: 1e4
}],
id: "Moving Average Weighted@tv-basicstudies-1",
scriptIdPart: "",
name: "Moving Average Weighted",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std[this._input(1)](this._context),
r = this._input(0),
n = this._input(2),
o = this._context.new_var(i);
return [{
value: s.Std.wma(o, r, this._context),
offset: n
}]
}
}
}, {
name: "Moving Average Double",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
id: "Moving Average Double@tv-basicstudies-1",
scriptIdPart: "",
name: "Moving Average Double",
description: "Moving Average Double",
shortDescription: "Moving Average Double",
is_price_study: !0,
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#FF6D00"
},
plot_1: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#2196F3"
}
},
inputs: {
firstPeriods: 14,
secondPeriods: 21,
method: "Simple"
}
},
styles: {
plot_0: {
title: "Plot 1"
},
plot_1: {
title: "Plot 2"
}
},
inputs: [{
id: "firstPeriods",
name: "1st Period",
type: "integer",
defval: 14,
min: 1,
max: 1e4
}, {
id: "secondPeriods",
name: "2nd Period",
type: "integer",
defval: 21,
min: 1,
max: 1e4
}, {
id: "method",
name: "Method",
type: "text",
defval: "Simple",
options: ["Simple", "Exponential", "Weighted"]
}],
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i, r, n = this._context.new_var(s.Std.close(this._context));
return "Exponential" === this._input(2) ? (i = s.Std.ema(n, this
._input(0), this._context), r = s.Std.ema(n, this
._input(1), this._context)) : "Weighted" === this._input(
2) ? (i = s.Std.wma(n, this._input(0), this._context), r = s
.Std
.wma(n, this._input(1), this._context)) : (i = s.Std.sma(n,
this._input(0), this._context), r = s.Std.sma(n, this
._input(1), this._context)), [i, r]
}
}
}, {
name: "Moving Average Triple",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !0,
id: "Moving Average Triple@tv-basicstudies-1",
scriptIdPart: "",
name: "Moving Average Triple",
description: "Moving Average Triple",
shortDescription: "Moving Average Triple",
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
transparency: 0,
trackPrice: !1,
color: "#FF6D00"
},
plot_1: {
linestyle: 0,
visible: !0,
linewidth: 1,
transparency: 0,
plottype: 0,
trackPrice: !1,
color: "#2196F3"
},
plot_2: {
linestyle: 0,
visible: !0,
linewidth: 1,
transparency: 0,
plottype: 0,
trackPrice: !1,
color: "#26C6DA"
}
},
inputs: {
firstPeriods: 14,
secondPeriods: 21,
thirdPeriods: 35,
method: "Simple"
}
},
styles: {
plot_0: {
title: "Plot 1"
},
plot_1: {
title: "Plot 2"
},
plot_2: {
title: "Plot 3"
}
},
inputs: [{
id: "firstPeriods",
name: "1st Period",
type: "integer",
defval: 14,
min: 1,
max: 1e4
}, {
id: "secondPeriods",
name: "2nd Period",
type: "integer",
defval: 21,
min: 1,
max: 1e4
}, {
id: "thirdPeriods",
name: "3rd Period",
type: "integer",
defval: 35,
min: 1,
max: 1e4
}, {
id: "method",
name: "Method",
type: "text",
defval: "Simple",
options: ["Simple", "Exponential", "Weighted"]
}],
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i, r, n, o = this._context.new_var(s.Std.close(this._context));
return "Exponential" === this._input(3) ? (i = s.Std.ema(o, this
._input(0), this._context), r = s.Std.ema(o, this
._input(1), this._context), n = s.Std.ema(o, this
._input(2), this._context)) : "Weighted" === this._input(
3) ? (i = s.Std.wma(o, this._input(0), this._context), r = s
.Std
.wma(o, this._input(1), this._context), n = s.Std.wma(o,
this._input(2), this._context)) : (i = s.Std.sma(o, this
._input(0), this._context), r = s.Std.sma(o, this
._input(1), this._context), n = s.Std.sma(o, this
._input(2), this._context)), [i, r, n]
}
}
}, {
name: "Moving Average Adaptive",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !0,
id: "Moving Average Adaptive@tv-basicstudies-1",
scriptIdPart: "",
name: "Moving Average Adaptive",
description: "Moving Average Adaptive",
shortDescription: "Moving Average Adaptive",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
transparency: 0,
trackPrice: !1,
color: "#AB47BC"
}
},
inputs: {
periods: 10
}
},
styles: {
plot_0: {
title: "Plot 1"
}
},
inputs: [{
id: "periods",
name: "Period",
type: "integer",
defval: 10,
min: 1,
max: 1e4
}],
format: {
type: "inherit"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.periods = this._input(0)
}, this.ama = function(e, t) {
var i = this.periods,
r = this._context.new_var(),
n = e.get(),
o = s.Std.stdev(t, i, this._context),
a = s.Std.log(n / e.get(i)) / (o * Math.sqrt(i)),
l = .1 * Math.abs(a),
c = (n - r.get(1)) * l + r.get(1);
return r.set(isNaN(c) ? n : c), c
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._context.new_var(s.Std.close(this._context)),
r = this._context.new_var(s.Std.log(i.get() / i.get(1)));
return [this.ama(i, r)]
}
}
}, {
name: "Moving Average Hamming",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !0,
id: "Moving Average Hamming@tv-basicstudies-1",
scriptIdPart: "",
name: "Moving Average Hamming",
description: "Moving Average Hamming",
shortDescription: "Moving Average Hamming",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
transparency: 0,
trackPrice: !1,
color: "#4CAF50"
}
},
inputs: {
periods: 10
}
},
styles: {
plot_0: {
title: "Plot 1"
}
},
inputs: [{
id: "periods",
name: "Period",
type: "integer",
defval: 10,
min: 1,
max: 1e4
}],
format: {
type: "inherit"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.periods = this._input(0);
for (var i = [], s = 0, r = 1; r <= this.periods; ++r) {
var n = Math.sin((1 + r) / this.periods * Math.PI / 2);
i.unshift(n), s += n
}
this.hmaFactors = i, this.hmaFactorsSum = s
}, this.hma = function(e) {
for (var t = this.periods, i = 0, s = 0; s < t; ++s) i += e.get(t -
s - 1) * this.hmaFactors[s];
return i /= this.hmaFactorsSum
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._context.new_var(s.Std.close(this._context));
return [this.hma(i)]
}
}
}, {
name: "Moving Average Multiple",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !0,
id: "Moving Average Multiple@tv-basicstudies-1",
scriptIdPart: "",
name: "Moving Average Multiple",
description: "Moving Average Multiple",
shortDescription: "Moving Average Multiple",
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}, {
id: "plot_3",
type: "line"
}, {
id: "plot_4",
type: "line"
}, {
id: "plot_5",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
transparency: 0,
trackPrice: !1,
color: "#9C27B0"
},
plot_1: {
linestyle: 0,
visible: !0,
linewidth: 1,
transparency: 0,
plottype: 0,
trackPrice: !1,
color: "#FF6D00"
},
plot_2: {
linestyle: 0,
visible: !0,
linewidth: 1,
transparency: 0,
plottype: 0,
trackPrice: !1,
color: "#43A047"
},
plot_3: {
linestyle: 0,
visible: !0,
linewidth: 1,
transparency: 0,
plottype: 0,
trackPrice: !1,
color: "#26C6DA"
},
plot_4: {
linestyle: 0,
visible: !0,
linewidth: 1,
transparency: 0,
plottype: 0,
trackPrice: !1,
color: "#F50057"
},
plot_5: {
linestyle: 0,
visible: !0,
linewidth: 1,
transparency: 0,
plottype: 0,
trackPrice: !1,
color: "#2196F3"
}
},
inputs: {
firstPeriods: 14,
secondPeriods: 21,
thirdPeriods: 35,
fourthPeriods: 50,
fifthPeriods: 100,
sixthPeriods: 200,
method: "Simple"
}
},
styles: {
plot_0: {
title: "Plot 1"
},
plot_1: {
title: "Plot 2"
},
plot_2: {
title: "Plot 3"
},
plot_3: {
title: "Plot 4"
},
plot_4: {
title: "Plot 5"
},
plot_5: {
title: "Plot 6"
}
},
inputs: [{
id: "firstPeriods",
name: "1st Period",
type: "integer",
defval: 14,
min: 1,
max: 1e4
}, {
id: "secondPeriods",
name: "2nd Period",
type: "integer",
defval: 21,
min: 1,
max: 1e4
}, {
id: "thirdPeriods",
name: "3rd Period",
type: "integer",
defval: 35,
min: 1,
max: 1e4
}, {
id: "fourthPeriods",
name: "4th Period",
type: "integer",
defval: 50,
min: 1,
max: 1e4
}, {
id: "fifthPeriods",
name: "5th Period",
type: "integer",
defval: 100,
min: 1,
max: 1e4
}, {
id: "sixthPeriods",
name: "6th Period",
type: "integer",
defval: 200,
min: 1,
max: 1e4
}, {
id: "method",
name: "Method",
type: "text",
defval: "Simple",
options: ["Simple", "Exponential", "Weighted"]
}],
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i, r, n, o, a, l, c = this._context.new_var(s.Std.close(this
._context));
return "Exponential" === this._input(6) ? (i = s.Std.ema(c, this
._input(0), this._context), r = s.Std.ema(c, this
._input(1), this._context), n = s.Std.ema(c, this
._input(2), this._context), o = s.Std.ema(c, this
._input(3), this._context), a = s.Std.ema(c, this
._input(4), this._context), l = s.Std.ema(c, this
._input(5), this._context)) : "Weighted" === this._input(
6) ? (i = s.Std.wma(c, this._input(0), this._context), r = s
.Std
.wma(c, this._input(1), this._context), n = s.Std.wma(c,
this._input(2), this._context), o = s.Std.wma(c, this
._input(3), this._context), a = s.Std.wma(c, this
._input(4), this._context), l = s.Std.wma(c, this
._input(5), this._context)) : (i = s.Std.sma(c, this
._input(0), this._context), r = s.Std.sma(c, this
._input(1), this._context), n = s.Std.sma(c, this
._input(2), this._context), o = s.Std.sma(c, this
._input(3), this._context), a = s.Std.sma(c, this
._input(4), this._context), l = s.Std.sma(c, this
._input(5), this._context)), [i, r, n, o, a, l]
}
}
}, {
name: "Majority Rule",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !1,
id: "Majority Rule@tv-basicstudies-1",
scriptIdPart: "",
name: "Majority Rule",
description: "Majority Rule",
shortDescription: "Majority Rule",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#FF5252"
}
},
inputs: {
rollingPeriod: 14
}
},
styles: {
plot_0: {
title: "Majority Rule"
}
},
inputs: [{
id: "rollingPeriod",
type: "integer",
name: "Rolling Period"
}],
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.rollingPeriod = this
._input(0)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i, r = s.Std.close(this._context);
return i = r > this._context.new_var(r).get(1) ? 1 : 0, [100 * s.Std
.sma(this._context.new_var(i), this.rollingPeriod, this
._context)
]
}
}
}, {
name: "Net Volume",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Net Volume",
shortDescription: "Net Volume",
is_price_study: !1,
inputs: [],
id: "Net Volume@tv-basicstudies-1",
scriptIdPart: "",
name: "Net Volume",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function(e, t, i) {
return s.Std.gt(e, 0) ? t : s.Std.lt(i, 0) ? -t : 0 * t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._context.new_var(i),
n = s.Std.change(r);
return [this.f_0(n, s.Std.volume(this._context), n)]
}
}
}, {
name: "On Balance Volume",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
smoothedMA: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !1
}
},
inputs: {
smoothingLine: "SMA",
smoothingLength: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "smoothedMA",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
},
smoothedMA: {
title: "Smoothed MA",
histogramBase: 0,
joinPoints: !1
}
},
description: "On Balance Volume",
shortDescription: "OBV",
is_price_study: !1,
inputs: [{
id: "smoothingLine",
name: "Smoothing Line",
defval: "SMA",
type: "text",
options: ["SMA", "EMA", "WMA"]
}, {
id: "smoothingLength",
name: "Smoothing Length",
defval: 9,
type: "integer",
min: 1,
max: 1e4
}],
id: "On Balance Volume@tv-basicstudies-1",
scriptIdPart: "",
name: "On Balance Volume",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function(e, t, i) {
return s.Std.gt(e, 0) ? t : s.Std.lt(i, 0) ? -t : 0 * t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = s.Std.close(this._context),
o = this._context.new_var(n),
a = s.Std.change(o),
l = this.f_0(a, s.Std.volume(this._context), a),
c = s.Std.cum(l, this._context);
this._context.setMinimumAdditionalDepth(r);
var h, u = this._context.new_var(c);
return "EMA" === i ? h = s.Std.ema(u, r, this._context) : "WMA" ===
i ? h = s.Std.wma(u, r, this._context) : "SMA" === i && (h = s
.Std.sma(u, r, this._context)), [c, h]
}
}
}, {
name: "Parabolic SAR",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 3,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: .02,
in_1: .02,
in_2: .2
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Parabolic SAR",
shortDescription: "SAR",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "start",
defval: .02,
type: "float",
min: -1e12,
max: 1e12
}, {
id: "in_1",
name: "increment",
defval: .02,
type: "float",
min: -1e12,
max: 1e12
}, {
id: "in_2",
name: "maximum",
defval: .2,
type: "float",
min: -1e12,
max: 1e12
}],
id: "Parabolic SAR@tv-basicstudies-1",
scriptIdPart: "",
name: "Parabolic SAR",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = this._input(2);
return [s.Std.sar(i, r, n, this._context)]
}
}
}, {
name: "Price Channel",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#F50057"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#F50057"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 20,
in_1: 0
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "Highprice Line",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Lowprice Line",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Centerprice Line",
histogramBase: 0,
joinPoints: !1
}
},
description: "Price Channel",
shortDescription: "PC",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Length",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "Offset Length",
defval: 0,
type: "integer",
min: 1,
max: 2e3
}],
id: "Price Channel@tv-basicstudies-1",
scriptIdPart: "",
name: "Price Channel",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.high(this._context),
r = this._context.new_var(i),
n = s.Std.low(this._context),
o = this._context.new_var(n),
a = this._input(0),
l = this._input(1),
c = s.Std.highest(r, a, this._context),
h = s.Std.lowest(o, a, this._context);
return [{
value: c,
offset: l
}, {
value: h,
offset: l
}, {
value: s.Std.avg(c, h),
offset: l
}]
}
}
}, {
name: "Price Oscillator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#009688"
}
},
inputs: {
in_0: 10,
in_1: 21
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Price Oscillator",
shortDescription: "PPO",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "shortlen",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "longlen",
defval: 21,
type: "integer",
min: 1,
max: 2e3
}],
id: "Price Oscillator@tv-basicstudies-1",
scriptIdPart: "",
name: "Price Oscillator",
format: {
type: "price",
precision: 2
}
},
constructor: function() {
this.f_0 = function(e, t) {
return (e - t) / t * 100
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._input(1),
o = this._context.new_var(i),
a = s.Std.sma(o, r, this._context),
l = this._context.new_var(i),
c = s.Std.sma(l, n, this._context);
return [this.f_0(a, c)]
}
}
}, {
name: "Price Volume Trend",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "PVT",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Price Volume Trend",
shortDescription: "PVT",
is_price_study: !1,
is_hidden_study: !1,
id: "price_volume_trend@tv-basicstudies-1",
inputs: [],
scriptIdPart: "",
name: "Price Volume Trend",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function() {
var e = this._context.new_var(s.Std.close(this._context));
return [s.Std.cum(s.Std.change(e) / e.get(1) * s.Std.volume(this
._context), this._context)]
}, this.main = function(e, t) {
return this._context = e, this._input = t, [this.f_0()[0]]
}
}
}, {
name: "Rate Of Change",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
in_0: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "ROC",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Rate Of Change",
shortDescription: "ROC",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "Zero Line",
isHidden: !1
}],
inputs: [{
id: "in_0",
name: "length",
defval: 9,
type: "integer",
min: 1,
max: 1e12
}],
id: "rate_of_change@tv-basicstudies-1",
scriptIdPart: "",
name: "Rate Of Change",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._context.new_var(s.Std.close(this._context)),
r = this._input(0);
return [100 * (i.get(0) - i.get(r)) / i.get(r)]
}
}
}, {
name: "Relative Strength Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#7E57C2"
},
smoothedMA: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !1
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 70
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 30
}],
filledAreasStyle: {
fill_0: {
color: "#7E57C2",
transparency: 90,
visible: !0
}
},
inputs: {
length: 14,
smoothingLine: "SMA",
smoothingLength: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "smoothedMA",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
},
smoothedMA: {
title: "Smoothed MA",
histogramBase: 0,
joinPoints: !1
}
},
description: "Relative Strength Index",
shortDescription: "RSI",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "length",
name: "Length",
defval: 14,
type: "integer",
min: 1,
max: 2e3
}, {
id: "smoothingLine",
name: "Smoothing Line",
defval: "SMA",
type: "text",
options: ["SMA", "EMA", "WMA"]
}, {
id: "smoothingLength",
name: "Smoothing Length",
defval: 14,
type: "integer",
min: 1,
max: 1e4
}],
id: "Relative Strength Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Relative Strength Index",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e) {
return s.Std.max(e, 0)
}, this.f_1 = function(e) {
return -s.Std.min(e, 0)
}, this.f_2 = function(e, t) {
return s.Std.eq(e, 0) ? 100 : s.Std.eq(t, 0) ? 0 : 100 - 100 / (1 +
t / e)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._input(1),
o = this._input(2);
this._context.setMinimumAdditionalDepth(r + o);
var a, l = this._context.new_var(i),
c = s.Std.change(l),
h = this.f_0(c),
u = this._context.new_var(h),
d = s.Std.rma(u, r, this._context),
p = this.f_1(c),
_ = this._context.new_var(p),
m = s.Std.rma(_, r, this._context),
f = this.f_2(m, d),
g = this._context.new_var(f);
return "EMA" === n ? a = s.Std.ema(g, o, this._context) : "WMA" ===
n ? a = s.Std.wma(g, o, this._context) : "SMA" === n && (a = s
.Std.sma(g, o, this._context)), [{
value: f
}, {
value: a
}]
}
}
}, {
name: "Relative Vigor Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#009688"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#F44336"
}
},
inputs: {
in_0: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "RVGI",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Signal",
histogramBase: 0,
joinPoints: !1
}
},
description: "Relative Vigor Index",
shortDescription: "RVGI",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "Length",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}],
id: "Relative Vigor Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Relative Vigor Index",
format: {
precision: 4,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e - t
}, this.f_1 = function(e, t) {
return e / t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this.f_0(s.Std.close(this._context), s.Std.open(this
._context)),
n = this._context.new_var(r),
o = s.Std.swma(n, this._context),
a = this._context.new_var(o),
l = s.Std.sum(a, i, this._context),
c = this.f_0(s.Std.high(this._context), s.Std.low(this
._context)),
h = this._context.new_var(c),
u = s.Std.swma(h, this._context),
d = this._context.new_var(u),
p = s.Std.sum(d, i, this._context),
_ = this.f_1(l, p),
m = this._context.new_var(_);
return [_, s.Std.swma(m, this._context)]
}
}
}, {
name: "Relative Volatility Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#7E57C2"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 80
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 20
}],
filledAreasStyle: {
fill_0: {
color: "#7E57C2",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Relative Volatility Index",
shortDescription: "RVI",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 10,
type: "integer",
min: 1,
max: 2e3
}],
id: "Relative Volatility Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Relative Volatility Index",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return s.Std.le(e, 0) ? 0 : t
}, this.f_1 = function(e, t) {
return s.Std.gt(e, 0) ? 0 : t
}, this.f_2 = function(e, t) {
return e / (e + t) * 100
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0);
this._context.setMinimumAdditionalDepth(i + 12);
var r = s.Std.close(this._context),
n = this._context.new_var(r),
o = s.Std.stdev(n, i, this._context),
a = this._context.new_var(r),
l = s.Std.change(a),
c = this.f_0(l, o),
h = this._context.new_var(c),
u = s.Std.ema(h, 14, this._context),
d = this.f_1(l, o),
p = this._context.new_var(d),
_ = s.Std.ema(p, 14, this._context);
return [this.f_2(u, _)]
}
}
}, {
name: "SMI Ergodic Indicator/Oscillator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 1,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF5252"
}
},
inputs: {
in_0: 5,
in_1: 20,
in_2: 5
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "Indicator",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Signal",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Oscillator",
histogramBase: 0,
joinPoints: !1
}
},
description: "SMI Ergodic Indicator/Oscillator",
shortDescription: "SMIIO",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "shortlen",
defval: 5,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "longlen",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_2",
name: "siglen",
defval: 5,
type: "integer",
min: 1,
max: 2e3
}],
id: "SMI Ergodic Indicator/Oscillator@tv-basicstudies-1",
scriptIdPart: "",
name: "SMI Ergodic Indicator/Oscillator",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return e - t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = this._input(2);
this._context.setMinimumAdditionalDepth(i + r + n);
var o = s.Std.close(this._context),
a = this._context.new_var(o),
l = s.Std.tsi(a, i, r, this._context),
c = this._context.new_var(l),
h = s.Std.ema(c, n, this._context);
return [l, h, this.f_0(l, h)]
}
}
}, {
name: "Smoothed Moving Average",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#673AB7"
}
},
inputs: {
in_0: 7,
in_1: "close"
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Smoothed Moving Average",
shortDescription: "SMMA",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Length",
defval: 7,
type: "integer",
min: 1,
max: 1e12
}, {
id: "in_1",
name: "Source",
defval: "close",
type: "source",
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"]
}],
id: "smoothed_moving_average@tv-basicstudies-1",
scriptIdPart: "",
name: "Smoothed Moving Average",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function() {
var e = this._input(0),
t = s.Std[this._input(1)](this._context);
return [s.Std.smma(t, e, this._context)]
}, this.main = function(e, t) {
return this._context = e, this._input = t, this.f_0()
}
}
}, {
name: "Standard Deviation",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
id: "Standard Deviation@tv-basicstudies-1",
scriptIdPart: "",
name: "Standard Deviation",
description: "Standard Deviation",
shortDescription: "Standard Deviation",
is_price_study: !1,
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#009688"
}
},
inputs: {
periods: 5,
deviations: 1
}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [{
id: "periods",
name: "Periods",
type: "integer"
}, {
id: "deviations",
name: "Deviations",
type: "float"
}],
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = this._context.new_var(s.Std.close(this._context));
return [s.Std.stdev(n, i, this._context) * r]
}
}
}, {
name: "Stochastic",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 80
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 20
}],
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 14,
in_1: 1,
in_2: 3
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "%K",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "%D",
histogramBase: 0,
joinPoints: !1
}
},
description: "Stochastic",
shortDescription: "Stoch",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "in_0",
name: "K",
defval: 14,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_1",
name: "D",
defval: 1,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_2",
name: "smooth",
defval: 3,
type: "integer",
min: 1,
max: 1e4
}],
id: "Stochastic@tv-basicstudies-1",
scriptIdPart: "",
name: "Stochastic",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = this._input(2);
this._context.setMinimumAdditionalDepth(i + r + n);
var o = s.Std.close(this._context),
a = s.Std.high(this._context),
l = s.Std.low(this._context),
c = this._context.new_var(o),
h = this._context.new_var(a),
u = this._context.new_var(l),
d = s.Std.stoch(c, h, u, i, this._context),
p = this._context.new_var(d),
_ = s.Std.sma(p, r, this._context),
m = this._context.new_var(_);
return [_, s.Std.sma(m, n, this._context)]
}
}
}, {
name: "Stochastic RSI",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#FF6D00"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 80
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 20
}],
filledAreasStyle: {
fill_0: {
color: "#2196F3",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 14,
in_1: 14,
in_2: 3,
in_3: 3
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "%K",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "%D",
histogramBase: 0,
joinPoints: !1
}
},
description: "Stochastic RSI",
shortDescription: "Stoch RSI",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "in_0",
name: "lengthRSI",
defval: 14,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_1",
name: "lengthStoch",
defval: 14,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_2",
name: "smoothK",
defval: 3,
type: "integer",
min: 1,
max: 1e4
}, {
id: "in_3",
name: "smoothD",
defval: 3,
type: "integer",
min: 1,
max: 1e4
}],
id: "Stochastic RSI@tv-basicstudies-1",
scriptIdPart: "",
name: "Stochastic RSI",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_1 = function(e, t, i) {
var r = i.new_var(s.Std.max(s.Std.change(e), 0));
return s.Std.rma(r, t, i)
}, this.f_2 = function(e, t, i) {
var r = i.new_var(-s.Std.min(s.Std.change(e), 0));
return s.Std.rma(r, t, i)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._input(1),
o = this._input(2),
a = this._input(3);
e.setMinimumAdditionalDepth(r + n + o + a);
var l = this._context.new_var(i),
c = s.Std.rsi(this.f_1(l, r, this._context), this.f_2(l, r, this
._context)),
h = this._context.new_var(c),
u = this._context.new_var(c),
d = this._context.new_var(c),
p = s.Std.stoch(h, u, d, n, this._context),
_ = this._context.new_var(p),
m = s.Std.sma(_, o, this._context),
f = this._context.new_var(m);
return [m, s.Std.sma(f, a, this._context)]
}
}
}, {
name: "TRIX",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#F44336"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
in_0: 18
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "TRIX",
histogramBase: 0,
joinPoints: !1
}
},
description: "TRIX",
shortDescription: "TRIX",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "Zero"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 18,
type: "integer",
min: 1,
max: 2e3
}],
id: "TRIX@tv-basicstudies-1",
scriptIdPart: "",
name: "TRIX",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e) {
return s.Std.log(e)
}, this.f_1 = function(e) {
return 1e4 * e
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0);
e.setMinimumAdditionalDepth(3 * i);
var r = this.f_0(s.Std.close(this._context)),
n = this._context.new_var(r),
o = s.Std.ema(n, i, this._context),
a = this._context.new_var(o),
l = s.Std.ema(a, i, this._context),
c = this._context.new_var(l),
h = s.Std.ema(c, i, this._context),
u = this._context.new_var(h),
d = s.Std.change(u);
return [this.f_1(d)]
}
}
}, {
name: "Triple EMA",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 9
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Triple EMA",
shortDescription: "TEMA",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "length",
defval: 9,
type: "integer",
min: 1,
max: 1e4
}],
id: "Triple EMA@tv-basicstudies-1",
scriptIdPart: "",
name: "Triple EMA",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function(e, t, i) {
return 3 * (e - t) + i
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0);
this._context.setMinimumAdditionalDepth(3 * i);
var r = s.Std.close(this._context),
n = this._context.new_var(r),
o = s.Std.ema(n, i, this._context),
a = this._context.new_var(o),
l = s.Std.ema(a, i, this._context),
c = this._context.new_var(l),
h = s.Std.ema(c, i, this._context);
return [this.f_0(o, l, h)]
}
}
}, {
name: "True Strength Indicator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#E91E63"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
in_0: 25,
in_1: 13,
in_2: 13
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "True Strength Indicator",
shortDescription: "True Strength Indicator",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "Zero"
}],
inputs: [{
id: "in_0",
name: "long",
defval: 25,
type: "integer",
min: 1,
max: 4999
}, {
id: "in_1",
name: "short",
defval: 13,
type: "integer",
min: 1,
max: 4999
}, {
id: "in_2",
name: "siglen",
defval: 13,
type: "integer",
min: 1,
max: 4999
}],
id: "True Strength Indicator@tv-basicstudies-1",
scriptIdPart: "",
name: "True Strength Indicator",
format: {
precision: 4,
type: "price"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = this._input(2);
this._context.setMinimumAdditionalDepth(this._input(0) + this
._input(1) + this._input(2));
var o = s.Std.close(this._context),
a = this._context.new_var(o),
l = s.Std.tsi(a, r, i, this._context),
c = this._context.new_var(l);
return [l, s.Std.ema(c, n, this._context)]
}
}
}, {
name: "Trend Strength Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !1,
id: "Trend Strength Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Trend Strength Index",
description: "Trend Strength Index",
shortDescription: "Trend Strength Index",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#FF5252"
}
},
inputs: {
periods: 14
}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [{
id: "periods",
type: "integer",
name: "Periods"
}],
format: {
type: "inherit"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.period = this._input(0),
this.invertedPeriod = 1 / this.period, this.sumX = (this
.period - 1) * this.period / 2, this.sumXX = (this.period -
1) * this.period * (2 * this.period - 1) / 6, this
.invertedPeriodSumXSumX = this.invertedPeriod * this.sumX * this
.sumX
}, this.trendStrengthIndex = function() {
for (var e = this._context.new_var(s.Std.close(this._context)), t =
s.Std.sum(e, this.period, this._context), i = 0, r = 0, n =
0; n < this.period; n++) {
var o = e.get(n);
r += (this.period - 1 - n) * o, i += o * o
}
var a = r - this.invertedPeriod * this.sumX * t,
l = (this.sumXX - this.invertedPeriodSumXSumX) * (i - this
.invertedPeriod * t * t);
return l < 0 ? 0 == a ? 0 : a > 0 ? 1 : -1 : a / (l = Math.sqrt(l))
}, this.main = function(e, t) {
return this._context = e, this._input = t, [this
.trendStrengthIndex()
]
}
}
}, {
name: "Typical Price",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
id: "TypicalPrice@tv-basicstudies-1",
scriptIdPart: "",
name: "Typical Price",
description: "Typical Price",
shortDescription: "Typical Price",
is_price_study: !0,
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#FF6D00"
}
},
inputs: {}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [],
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
return this._context = e, this._input = t, [s.Std.hlc3(this
._context)]
}
}
}, {
name: "Ultimate Oscillator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#F44336"
}
},
inputs: {
in_0: 7,
in_1: 14,
in_2: 28
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "UO",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Ultimate Oscillator",
shortDescription: "UO",
is_price_study: !1,
inputs: [{
id: "in_0",
name: "length7",
defval: 7,
type: "integer",
min: 1,
max: 1e12
}, {
id: "in_1",
name: "length14",
defval: 14,
type: "integer",
min: 1,
max: 1e12
}, {
id: "in_2",
name: "length28",
defval: 28,
type: "integer",
min: 1,
max: 1e12
}],
id: "ultimate_oscillator@tv-basicstudies-1",
scriptIdPart: "",
name: "Ultimate Oscillator",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t, i) {
var r = this._context.new_var(e),
n = this._context.new_var(t);
return [s.Std.sum(r, i, this._context) / s.Std.sum(n, i, this
._context)]
}, this.f_1 = function() {
var e = this._input(0),
t = this._input(1),
i = this._input(2),
r = this._context.new_var(s.Std.close(this._context)),
n = s.Std.max(s.Std.high(this._context), r.get(1)),
o = this._context.new_var(s.Std.close(this._context)),
a = s.Std.min(s.Std.low(this._context), o.get(1)),
l = s.Std.close(this._context) - a,
c = n - a,
h = this.f_0(l, c, e),
u = this.f_0(l, c, t),
d = this.f_0(l, c, i);
return [100 * (4 * h[0] + 2 * u[0] + d[0]) / 7]
}, this.main = function(e, t) {
return this._context = e, this._input = t, this.f_1()
}
}
}, {
name: "Volatility Close-to-Close",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !1,
id: "Volatility Close-to-Close@tv-basicstudies-1",
scriptIdPart: "",
name: "Volatility Close-to-Close",
description: "Volatility Close-to-Close",
shortDescription: "Volatility Close-to-Close",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#2196F3"
}
},
inputs: {
periods: 10,
daysPerYear: 252
}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [{
id: "periods",
name: "Periods",
type: "integer",
defval: 10
}, {
id: "daysPerYear",
name: "Days Per Year",
type: "integer",
defval: 252
}],
format: {
precision: 2,
type: "percent"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.period = this._input(0),
this.daysPerYear = this._input(1)
}, this.stdev = function(e, t, i) {
var r = this.variance(e, t, i);
return s.Std.sqrt(r)
}, this.variance = function(e, t, i) {
var r = s.Std.sma(e, t, i);
return this.variance2(e, r, t)
}, this.variance2 = function(e, t, i) {
var s, r, n = 0;
for (s = 0; s < i; s++) n += (r = e.get(s) - t) * r;
return n / (i - 1)
}, this.standardHistVol = function() {
var e = this._context.new_var(s.Std.close(this._context)),
t = this._context.new_var(s.Std.log(e.get() / e.get(1)));
return 100 * this.stdev(t, this.period, this._context) * s.Std.sqrt(
this.daysPerYear)
}, this.main = function(e, t) {
return this._context = e, this._input = t, [this.standardHistVol()]
}
}
}, {
name: "Volatility Zero Trend Close-to-Close",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !1,
id: "Volatility Zero Trend Close-to-Close@tv-basicstudies-1",
scriptIdPart: "",
name: "Volatility Zero Trend Close-to-Close",
description: "Volatility Zero Trend Close-to-Close",
shortDescription: "Volatility Zero Trend Close-to-Close",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#2196F3"
}
},
inputs: {
periods: 10,
daysPerYear: 252
}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [{
id: "periods",
name: "Periods",
type: "integer",
min: 0,
max: 1e4
}, {
id: "daysPerYear",
name: "Days Per Year",
type: "integer"
}],
format: {
precision: 2,
type: "percent"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.period = this._input(0),
this.daysPerYear = this._input(1)
}, this.volatliityZTCTC = function() {
this._context.setMinimumAdditionalDepth(this._input(0) + 1);
for (var e = this._context.new_var(s.Std.close(this._context)), t =
this._context.new_var(e.symbol.time), i = Math.sqrt((t.get(
0) - t.get(1)) / 864e5 / this.daysPerYear), r = Math
.log(s.Std.close(this._context) / e.get(1)), n = this
._context.new_var(r / i), o = this._context.new_var(Math
.pow(n, 2)), a = 0, l = 0; l < this.period; l++) a += o
.get(l);
return 100 * Math.sqrt(a / this.period)
}, this.main = function(e, t) {
return this._context = e, this._input = t, [this.volatliityZTCTC()]
}
}
}, {
name: "Volatility O-H-L-C",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !1,
id: "Volatility O-H-L-C@tv-basicstudies-1",
scriptIdPart: "",
name: "Volatility O-H-L-C",
description: "Volatility O-H-L-C",
shortDescription: "Volatility O-H-L-C",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#FF5252"
}
},
inputs: {
periods: 10,
marketClosedPercentage: 0,
daysPerYear: 252
}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [{
id: "periods",
type: "integer",
name: "Periods"
}, {
id: "marketClosedPercentage",
type: "float",
name: "Market Closed Percentage",
min: 0,
max: .999
}, {
id: "daysPerYear",
type: "integer",
name: "Days Per Year"
}],
format: {
precision: 2,
type: "percent"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.period = this._input(0),
this.marketClosedPercentage = this._input(1), this.daysPerYear =
this._input(2), this.secondsPerYear = 86400 * this.daysPerYear
}, this.square = function(e) {
return e * e
}, this.volatilityOHLC = function() {
var e = this._context.new_var(Math.log(s.Std.open(this._context))),
t = this._context.new_var(Math.log(s.Std.high(this._context))),
i = this._context.new_var(Math.log(s.Std.low(this._context))),
r = this._context.new_var(Math.log(s.Std.close(this._context))),
n = this._context.new_var(s.Std.close(this._context)),
o = this._context.new_var(n.symbol.time),
a = (o.get(0) - o.get(1)) / 1e3,
l = .5 * this.square(t.get() - i.get());
l -= (Math.log(4) - 1) * this.square(r.get() - e.get()), this
.marketClosedPercentage > 0 && (l = .12 * this.square(e.get() -
r.get(1)) / this.marketClosedPercentage + .88 * l / (1 -
this.marketClosedPercentage)), l /= a, l *= this
.secondsPerYear;
var c = this._context.new_var(l);
return 100 * Math.sqrt(s.Std.sum(c, this.period, this._context) /
this.period)
}, this.main = function(e, t) {
return this._context = e, this._input = t, [this.volatilityOHLC()]
}
}
}, {
name: "Volatility Index",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
is_price_study: !0,
id: "Volatility Index@tv-basicstudies-1",
scriptIdPart: "",
name: "Volatility Index",
description: "Volatility Index",
shortDescription: "Volatility Index",
plots: [{
id: "plot_0",
type: "line"
}],
defaults: {
styles: {
plot_0: {
linestyle: 0,
visible: !0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
color: "#FF5252"
}
},
inputs: {
periods: 10,
atrMult: 3,
method: "Wilder Smoothing"
}
},
styles: {
plot_0: {
title: "Plot"
}
},
inputs: [{
id: "periods",
name: "Periods",
type: "integer"
}, {
id: "atrMult",
name: "ATR Mult",
type: "float"
}, {
id: "method",
name: "Method",
type: "text",
defval: "Exponential",
options: ["Exponential", "Wilder Smoothing"]
}],
format: {
type: "inherit"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._input = t, this.period = this._input(0),
this.atrMult = this._input(1), this.maMethod = this._input(2),
this.nextsar = null, this.position = null, this.sic = null, this
.bars = [], this.count = 0, this.lastSar = null, this._context
.setMinimumAdditionalDepth("Exponential" === this.maMethod ? 2 *
this.period + 2 : this.period)
}, this.computeATR = function() {
var e = s.Std.high(this._context) - s.Std.low(this._context),
t = s.Std.high(this._context) - this.bars[this.bars.length - 2],
i = this.bars[this.bars.length - 2] - s.Std.low(this._context);
return this.tr = Math.max(e, t, i), "Exponential" === this
.maMethod ? this.atr = s.Std.ema(this._context.new_var(this.tr),
this.period, this._context) : this.atr = this.tr / this
.period + (1 - 1 / this.period) * this.atr,
this.atr * this.atrMult
}, this.calculateVolatility = function() {
if (s.Std.close(this._context) === this.bars[this.bars.length - 1])
return this.lastSar;
if (this.bars.push(s.Std.close(this._context)), 1 === this.count)
this.atr = s.Std.high(this._context) - s.Std.low(this._context),
this.sic = s.Std.close(this._context);
else if (this.count < this.period) {
var e = s.Std.high(this._context) - s.Std.low(this._context),
t = s.Std.high(this._context) - this.bars[this.bars.length -
2],
i = this.bars[this.bars.length - 2] - s.Std.low(this
._context);
this.atr += Math.max(e, t, i), s.Std.close(this._context) > this
.sic && (this.sic = s.Std.close(this._context))
} else if (this.count === this.period) {
e = s.Std.high(this._context) - s.Std.low(this._context), t = s
.Std.high(this._context) - this.bars[this.bars.length - 2],
i = this.bars[this.bars.length - 2] - s.Std.low(this
._context);
this.atr += Math.max(e, t, i), this.atr *= 1 / this.period, s
.Std.close(this._context) > this.sic && (this.sic = s.Std
.close(this._context)), this.position = "LONG", this
.nextsar = this.sic - this.atr * this.atrMult
} else {
var r = this.nextsar;
"LONG" === this.position ? s.Std.close(this._context) < r ? (
this.position = "SHORT", this.sic = s.Std.close(this
._context), this.nextsar = this.sic + this
.computeATR()) : (this.position = "LONG", this.sic =
Math.max(s.Std.close(this._context), this.sic), this
.nextsar = this.sic - this.computeATR()) : "SHORT" ===
this.position && (s.Std.close(this._context) > r ? (this
.position = "LONG", this.sic = s.Std.close(this
._context), this.nextsar = this.sic - this
.computeATR()) : (this.position = "SHORT", this
.sic = Math.min(s.Std.close(this._context), this
.sic), this.nextsar = this.sic + this
.computeATR())), this.lastSar = r
}
return this.count++, r
}, this.main = function(e, t) {
return this._context = e, this._input = t, this._context.select_sym(
0), [this.calculateVolatility()]
}
}
}, {
name: "VWAP",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: 0,
transparency: 0,
visible: !0,
color: "#2196F3"
}
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "VWAP",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "VWAP",
shortDescription: "VWAP",
is_price_study: !0,
inputs: [],
id: "VWAP@tv-basicstudies-1",
scriptIdPart: "",
name: "VWAP",
format: {
type: "inherit"
}
},
constructor: function() {
this.f_1 = function(e) {
e.hist = null, e.add_hist()
}, this.init = function(e, t) {
this._isNewSession = null
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = e.new_var(),
r = e.new_var(),
n = this._context.symbol.time;
return n && (null === this._isNewSession && (this._isNewSession = s
.Std.createNewSessionCheck(e)), this._isNewSession(n) &&
(this.f_1(i), this.f_1(r))), i.set(s.Std.nz(i.get(1)) + s
.Std.hlc3(this._context) * s.Std.volume(this._context)), r
.set(s.Std.nz(r.get(1)) + s.Std.volume(this._context)), [i.get(
0) / r.get(0)]
}
}
}, {
name: "VWMA",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 20
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "VWMA",
shortDescription: "VWMA",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "len",
defval: 20,
type: "integer",
min: 1,
max: 1e4
}],
id: "VWMA@tv-basicstudies-1",
scriptIdPart: "",
name: "VWMA",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.close(this._context),
r = this._input(0),
n = this._context.new_var(i);
return [s.Std.vwma(n, r, this._context)]
}
}
}, {
name: "Volume Oscillator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: 0
}],
inputs: {
in_0: 5,
in_1: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Volume Oscillator",
shortDescription: "Volume Osc",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "Zero"
}],
inputs: [{
id: "in_0",
name: "shortlen",
defval: 5,
type: "integer",
min: 1,
max: 4999
}, {
id: "in_1",
name: "longlen",
defval: 10,
type: "integer",
min: 1,
max: 4999
}],
id: "Volume Oscillator@tv-basicstudies-1",
scriptIdPart: "",
name: "Volume Oscillator",
format: {
precision: 2,
type: "percent"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return 100 * (e - t) / t
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = s.Std.volume(this._context),
o = this._context.new_var(n),
a = s.Std.ema(o, i, this._context),
l = this._context.new_var(n),
c = s.Std.ema(l, r, this._context);
return [this.f_0(a, c)]
}
}
}, {
name: "Vortex Indicator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#E91E63"
}
},
inputs: {
in_0: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}],
styles: {
plot_0: {
title: "VI +",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
},
plot_1: {
title: "VI -",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "Vortex Indicator",
shortDescription: "VI",
is_price_study: !1,
is_hidden_study: !1,
id: "vortex_indicator@tv-basicstudies-1",
inputs: [{
id: "in_0",
name: "Period",
defval: 14,
type: "integer",
min: 2,
max: 1e12
}],
scriptIdPart: "",
name: "Vortex Indicator",
format: {
precision: 4,
type: "price"
}
},
constructor: function() {
this.f_0 = function() {
var e = this._input(0),
t = this._context.new_var(s.Std.low(this._context)),
i = this._context.new_var(s.Std.abs(s.Std.high(this._context) -
t.get(1))),
r = s.Std.sum(i, e, this._context),
n = this._context.new_var(s.Std.high(this._context)),
o = this._context.new_var(s.Std.abs(s.Std.low(this._context) - n
.get(1))),
a = s.Std.sum(o, e, this._context),
l = this._context.new_var(s.Std.atr(1, this._context)),
c = s.Std.sum(l, e, this._context);
return [r / c, a / c]
}, this.main = function(e, t) {
return this._context = e, this._input = t, this.f_0()
}
}
}, {
name: "Willams %R",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#7E57C2"
}
},
bands: [{
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: -20
}, {
color: "#787B86",
linestyle: 2,
linewidth: 1,
visible: !0,
value: -80
}],
filledAreasStyle: {
fill_0: {
color: "#7E57C2",
transparency: 90,
visible: !0
}
},
inputs: {
in_0: 14
}
},
plots: [{
id: "plot_0",
type: "line"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Williams %R",
shortDescription: "%R",
is_price_study: !1,
bands: [{
id: "hline_0",
name: "UpperLimit"
}, {
id: "hline_1",
name: "LowerLimit"
}],
filledAreas: [{
id: "fill_0",
objAId: "hline_0",
objBId: "hline_1",
type: "hline_hline",
title: "Hlines Background"
}],
inputs: [{
id: "in_0",
name: "length",
defval: 14,
type: "integer",
min: 1,
max: 2e3
}],
id: "Willams %R@tv-basicstudies-1",
scriptIdPart: "",
name: "Willams %R",
format: {
precision: 2,
type: "price"
}
},
constructor: function() {
this.f_0 = function(e, t, i) {
return 100 * (e - t) / (t - i)
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = s.Std.high(this._context),
n = this._context.new_var(r),
o = s.Std.highest(n, i, this._context),
a = s.Std.low(this._context),
l = this._context.new_var(a),
c = s.Std.lowest(l, i, this._context);
return [this.f_0(s.Std.close(this._context), o, c)]
}
}
}, {
name: "Williams Alligator",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
},
plot_1: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#E91E63"
},
plot_2: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#66BB6A"
}
},
inputs: {
in_0: 21,
in_1: 13,
in_2: 8,
in_3: 8,
in_4: 5,
in_5: 3
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
type: "line"
}, {
id: "plot_2",
type: "line"
}],
styles: {
plot_0: {
title: "Jaw",
histogramBase: 0,
joinPoints: !1
},
plot_1: {
title: "Teeth",
histogramBase: 0,
joinPoints: !1
},
plot_2: {
title: "Lips",
histogramBase: 0,
joinPoints: !1
}
},
description: "Williams Alligator",
shortDescription: "Alligator",
is_price_study: !0,
inputs: [{
id: "in_0",
name: "Jaw Length",
defval: 21,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_1",
name: "Teeth Length",
defval: 13,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_2",
name: "Lips Length",
defval: 8,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_3",
name: "Jaw Offset",
defval: 8,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_4",
name: "Teeth Offset",
defval: 5,
type: "integer",
min: 1,
max: 2e3
}, {
id: "in_5",
name: "Lips Offset",
defval: 3,
type: "integer",
min: 1,
max: 2e3
}],
id: "Williams Alligator@tv-basicstudies-1",
scriptIdPart: "",
name: "Williams Alligator",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = this._input(2),
o = this._input(3),
a = this._input(4),
l = this._input(5),
c = s.Std.hl2(this._context);
return [{
value: s.Std.smma(c, i, this._context),
offset: o
}, {
value: s.Std.smma(c, r, this._context),
offset: a
}, {
value: s.Std.smma(c, n, this._context),
offset: l
}]
}
}
}, {
name: "Williams Fractals",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
defaults: {
styles: {
plot_0: {
plottype: "shape_triangle_down",
visible: !0,
location: "BelowBar",
transparency: 0,
color: "#F44336"
},
plot_1: {
plottype: "shape_triangle_up",
visible: !0,
location: "AboveBar",
transparency: 0,
color: "#009688"
}
},
inputs: {
in_0: 2
}
},
plots: [{
id: "plot_0",
type: "shapes"
}, {
id: "plot_1",
type: "shapes"
}],
styles: {
plot_0: {
title: "Down fractals",
isHidden: !1
},
plot_1: {
title: "Up fractals",
isHidden: !1
}
},
description: "Williams Fractal",
shortDescription: "Fractals",
is_price_study: !0,
is_hidden_study: !1,
id: "Williams Fractals@tv-basicstudies-1",
inputs: [{
id: "in_0",
name: "Periods",
defval: 2,
type: "integer",
min: 2,
max: 1e12
}],
scriptIdPart: "",
name: "Williams Fractals",
isCustomIndicator: !0,
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function() {
for (var e = this._input(0), t = this._context.new_var(s.Std.high(
this._context)), i = !0, r = !0, n = !0, o = !0, a = !0,
l = !0, c = 1; c <= e; c++) i = s.Std.and(i, s.Std.lt(t.get(
e - c), t.get(e))), r = s.Std.and(r, s.Std.lt(t.get(e + c),
t.get(e))), n = s.Std.and(n, s.Std.and(s.Std.le(t.get(e +
1), t.get(e)), s.Std.lt(t.get(e + c + 1), t.get(e)))), o = s
.Std.and(o, s.Std.and(s.Std.le(t.get(e + 1), t.get(e)), s.Std
.and(s.Std.le(t.get(e + 2), t.get(e)), s.Std.lt(t.get(
e + c + 2), t.get(e))))), a = s.Std.and(a, s.Std.and(s
.Std.le(t.get(e + 1), t.get(e)), s.Std.and(s.Std.le(t
.get(e + 2), t.get(e)), s.Std.and(s.Std.le(t
.get(e + 3), t.get(e)), s.Std.lt(t.get(e +
c + 3), t.get(e)))))), l = s.Std.and(l, s.Std.and(s.Std
.le(t.get(e + 1), t.get(e)), s.Std.and(s.Std.le(t.get(
e + 2), t.get(e)), s.Std.and(s.Std.le(t.get(e +
3), t.get(e)), s.Std.and(s.Std.le(t.get(e +
4), t.get(e)), s.Std.lt(t.get(e + c +
4), t.get(e)))))));
var h = s.Std.or(r, s.Std.or(n, s.Std.or(o, s.Std.or(a, l)))),
u = s.Std.and(i, h),
d = this._context.new_var(s.Std.low(this._context)),
p = 1,
_ = 1,
m = 1,
f = 1,
g = 1,
b = 1;
for (c = 1; c <= e; c++) p = s.Std.and(p, s.Std.gt(d.get(e - c), d
.get(e))), _ = s.Std.and(_, s.Std.gt(d.get(e + c), d.get(
e))), m = s.Std.and(m, s.Std.and(s.Std.ge(d.get(e + 1), d
.get(e)), s.Std.gt(d.get(e + c + 1), d.get(e)))), f = s.Std
.and(f, s.Std.and(s.Std.ge(d.get(e + 1), d.get(e)), s.Std.and(s
.Std.ge(d.get(e + 2), d.get(e)), s.Std.gt(d.get(e +
c + 2), d.get(e))))), g = s.Std.and(g, s.Std.and(s.Std
.ge(d.get(e + 1), d.get(e)), s.Std.and(s.Std.ge(d.get(
e + 2), d.get(e)), s.Std.and(s.Std.ge(d.get(e +
3), d.get(e)), s.Std.gt(d.get(e + c + 3), d
.get(e)))))), b = s.Std.and(b, s.Std.and(s.Std.ge(d.get(
e + 1), d.get(e)), s.Std.and(s.Std.ge(d.get(e + 2),
d.get(e)), s.Std.and(s.Std.ge(d.get(e + 3), d
.get(e)), s.Std.and(s.Std.ge(d.get(e + 4), d
.get(e)), s.Std.gt(d.get(e + c + 4), d
.get(e)))))));
var v = s.Std.or(_, s.Std.or(m, s.Std.or(f, s.Std.or(g, b))));
return [s.Std.and(p, v), u]
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this.f_0();
return [{
value: i[0],
offset: -this._input(0)
}, {
value: i[1],
offset: -this._input(0)
}]
}
}
}, {
name: "Guppy Multiple Moving Average",
metainfo: {
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
description: "Guppy Multiple Moving Average",
shortDescription: "GMMA",
is_price_study: !0,
id: "Guppy Multiple Moving Average@tv-basicstudies-1",
_metainfoVersion: 52,
format: {
type: "inherit"
},
defaults: {
inputs: {
traderEMA1Length: 3,
traderEMA2Length: 5,
traderEMA3Length: 8,
traderEMA4Length: 10,
traderEMA5Length: 12,
traderEMA6Length: 15,
investorEMA1Length: 30,
investorEMA2Length: 35,
investorEMA3Length: 40,
investorEMA4Length: 45,
investorEMA5Length: 50,
investorEMA6Length: 60
},
styles: {
traderEMA1: {
color: "#00FFFF",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 15,
visible: !0
},
traderEMA2: {
color: "#00FFFF",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 12,
visible: !0
},
traderEMA3: {
color: "#00FFFF",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 9,
visible: !0
},
traderEMA4: {
color: "#00FFFF",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 6,
visible: !0
},
traderEMA5: {
color: "#00FFFF",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 3,
visible: !0
},
traderEMA6: {
color: "#00FFFF",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0
},
investorEMA1: {
color: "#FF0000",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 15,
visible: !0
},
investorEMA2: {
color: "#FF0000",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 12,
visible: !0
},
investorEMA3: {
color: "#FF0000",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 9,
visible: !0
},
investorEMA4: {
color: "#FF0000",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 6,
visible: !0
},
investorEMA5: {
color: "#FF0000",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 3,
visible: !0
},
investorEMA6: {
color: "#FF0000",
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0
}
}
},
inputs: [{
defval: 3,
id: "traderEMA1Length",
max: 1e3,
min: 1,
name: "Trader EMA 1 length",
type: "integer"
}, {
defval: 5,
id: "traderEMA2Length",
max: 1e3,
min: 1,
name: "Trader EMA 2 length",
type: "integer"
}, {
defval: 8,
id: "traderEMA3Length",
max: 1e3,
min: 1,
name: "Trader EMA 3 length",
type: "integer"
}, {
defval: 10,
id: "traderEMA4Length",
max: 1e3,
min: 1,
name: "Trader EMA 4 length",
type: "integer"
}, {
defval: 12,
id: "traderEMA5Length",
max: 1e3,
min: 1,
name: "Trader EMA 5 length",
type: "integer"
}, {
defval: 15,
id: "traderEMA6Length",
max: 1e3,
min: 1,
name: "Trader EMA 6 length",
type: "integer"
}, {
defval: 30,
id: "investorEMA1Length",
max: 1e3,
min: 1,
name: "Investor EMA 1 length",
type: "integer"
}, {
defval: 35,
id: "investorEMA2Length",
max: 1e3,
min: 1,
name: "Investor EMA 2 length",
type: "integer"
}, {
defval: 40,
id: "investorEMA3Length",
max: 1e3,
min: 1,
name: "Investor EMA 3 length",
type: "integer"
}, {
defval: 45,
id: "investorEMA4Length",
max: 1e3,
min: 1,
name: "Investor EMA 4 length",
type: "integer"
}, {
defval: 50,
id: "investorEMA5Length",
max: 1e3,
min: 1,
name: "Investor EMA 5 length",
type: "integer"
}, {
defval: 60,
id: "investorEMA6Length",
max: 1e3,
min: 1,
name: "Investor EMA 6 length",
type: "integer"
}],
plots: [{
id: "traderEMA1",
type: "line"
}, {
id: "traderEMA2",
type: "line"
}, {
id: "traderEMA3",
type: "line"
}, {
id: "traderEMA4",
type: "line"
}, {
id: "traderEMA5",
type: "line"
}, {
id: "traderEMA6",
type: "line"
}, {
id: "investorEMA1",
type: "line"
}, {
id: "investorEMA2",
type: "line"
}, {
id: "investorEMA3",
type: "line"
}, {
id: "investorEMA4",
type: "line"
}, {
id: "investorEMA5",
type: "line"
}, {
id: "investorEMA6",
type: "line"
}],
styles: {
traderEMA1: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Trader EMA 1"
},
traderEMA2: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Trader EMA 2"
},
traderEMA3: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Trader EMA 3"
},
traderEMA4: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Trader EMA 4"
},
traderEMA5: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Trader EMA 5"
},
traderEMA6: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Trader EMA 6"
},
investorEMA1: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Investor EMA 1"
},
investorEMA2: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Investor EMA 2"
},
investorEMA3: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Investor EMA 3"
},
investorEMA4: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Investor EMA 4"
},
investorEMA5: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Investor EMA 5"
},
investorEMA6: {
histogramBase: 0,
isHidden: !1,
joinPoints: !1,
title: "Investor EMA 6"
}
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._context.new_var(s.Std.close(this._context)),
r = this._input(0),
n = this._input(1),
o = this._input(2),
a = this._input(3),
l = this._input(4),
c = this._input(5),
h = s.Std.ema(i, r, this._context),
u = s.Std.ema(i, n, this._context),
d = s.Std.ema(i, o, this._context),
p = s.Std.ema(i, a, this._context),
_ = s.Std.ema(i, l, this._context),
m = s.Std.ema(i, c, this._context),
f = this._input(6),
g = this._input(7),
b = this._input(8),
v = this._input(9),
S = this._input(10),
y = this._input(11);
return [h, u, d, p, _, m, s.Std.ema(i, f, this._context), s.Std.ema(
i, g, this._context), s.Std.ema(i, b, this._context), s
.Std.ema(i, v, this._context), s.Std.ema(i, S, this
._context), s.Std.ema(i, y, this._context)
]
}
}
}]
},
"2ijp": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("l4sv"),
r = i("8Uy/");
class n {
constructor() {
this._lineRendererData = {
y: 0,
color: "rgba(0, 0, 0, 0)",
linewidth: 1,
linestyle: r.LINESTYLE_SOLID,
visible: !1
}, this._lineRenderer = new s.HorizontalLineRenderer, this._invalidated = !0,
this._lineRenderer.setData(this._lineRendererData)
}
update() {
this._invalidated = !0
}
renderer() {
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
._lineRenderer
}
}
},
"2jXJ": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "supportedLineTools", (function() {
return s
}));
const s = {
cursor: {
name: "cursor",
onlySelectable: !0
},
dot: {
name: "dot",
onlySelectable: !0
},
arrow_cursor: {
name: "arrow",
onlySelectable: !0
},
eraser: {
name: "eraser",
onlySelectable: !0
},
measure: {
name: "measure",
onlySelectable: !0
},
zoom: {
name: "zoom",
onlySelectable: !0
},
brush: {
name: "LineToolBrush"
},
highlighter: {
name: "LineToolHighlighter"
},
text: {
name: "LineToolText"
},
anchored_text: {
name: "LineToolTextAbsolute"
},
note: {
name: "LineToolNote"
},
anchored_note: {
name: "LineToolNoteAbsolute"
},
signpost: {
name: "LineToolSignpost"
},
callout: {
name: "LineToolCallout"
},
balloon: {
name: "LineToolBalloon"
},
arrow_up: {
name: "LineToolArrowMarkUp"
},
arrow_down: {
name: "LineToolArrowMarkDown"
},
arrow_left: {
name: "LineToolArrowMarkLeft"
},
arrow_right: {
name: "LineToolArrowMarkRight"
},
price_label: {
name: "LineToolPriceLabel"
},
price_note: {
name: "LineToolPriceNote"
},
arrow_marker: {
name: "LineToolArrowMarker"
},
flag: {
name: "LineToolFlagMark"
},
vertical_line: {
name: "LineToolVertLine"
},
horizontal_line: {
name: "LineToolHorzLine"
},
cross_line: {
name: "LineToolCrossLine"
},
horizontal_ray: {
name: "LineToolHorzRay"
},
trend_line: {
name: "LineToolTrendLine"
},
info_line: {
name: "LineToolInfoLine"
},
trend_angle: {
name: "LineToolTrendAngle"
},
arrow: {
name: "LineToolArrow"
},
ray: {
name: "LineToolRay"
},
extended: {
name: "LineToolExtended"
},
parallel_channel: {
name: "LineToolParallelChannel"
},
disjoint_angle: {
name: "LineToolDisjointAngle"
},
flat_bottom: {
name: "LineToolFlatBottom"
},
pitchfork: {
name: "LineToolPitchfork"
},
schiff_pitchfork_modified: {
name: "LineToolSchiffPitchfork"
},
schiff_pitchfork: {
name: "LineToolSchiffPitchfork2"
},
inside_pitchfork: {
name: "LineToolInsidePitchfork"
},
pitchfan: {
name: "LineToolPitchfan"
},
gannbox: {
name: "LineToolGannSquare"
},
gannbox_square: {
name: "LineToolGannComplex"
},
gannbox_fixed: {
name: "LineToolGannFixed"
},
gannbox_fan: {
name: "LineToolGannFan"
},
fib_retracement: {
name: "LineToolFibRetracement"
},
fib_trend_ext: {
name: "LineToolTrendBasedFibExtension"
},
fib_speed_resist_fan: {
name: "LineToolFibSpeedResistanceFan"
},
fib_timezone: {
name: "LineToolFibTimeZone"
},
fib_trend_time: {
name: "LineToolTrendBasedFibTime"
},
fib_circles: {
name: "LineToolFibCircles"
},
fib_spiral: {
name: "LineToolFibSpiral"
},
fib_speed_resist_arcs: {
name: "LineToolFibSpeedResistanceArcs"
},
fib_wedge: {
name: "LineToolFibWedge"
},
fib_channel: {
name: "LineToolFibChannel"
},
xabcd_pattern: {
name: "LineTool5PointsPattern"
},
cypher_pattern: {
name: "LineToolCypherPattern"
},
abcd_pattern: {
name: "LineToolABCD"
},
triangle_pattern: {
name: "LineToolTrianglePattern"
},
"3divers_pattern": {
name: "LineToolThreeDrivers"
},
head_and_shoulders: {
name: "LineToolHeadAndShoulders"
},
elliott_impulse_wave: {
name: "LineToolElliottImpulse"
},
elliott_triangle_wave: {
name: "LineToolElliottTriangle"
},
elliott_triple_combo: {
name: "LineToolElliottTripleCombo"
},
elliott_correction: {
name: "LineToolElliottCorrection"
},
elliott_double_combo: {
name: "LineToolElliottDoubleCombo"
},
cyclic_lines: {
name: "LineToolCircleLines"
},
time_cycles: {
name: "LineToolTimeCycles"
},
sine_line: {
name: "LineToolSineLine"
},
long_position: {
name: "LineToolRiskRewardLong"
},
short_position: {
name: "LineToolRiskRewardShort"
},
forecast: {
name: "LineToolPrediction"
},
date_range: {
name: "LineToolDateRange"
},
price_range: {
name: "LineToolPriceRange"
},
date_and_price_range: {
name: "LineToolDateAndPriceRange"
},
bars_pattern: {
name: "LineToolBarsPattern"
},
ghost_feed: {
name: "LineToolGhostFeed"
},
projection: {
name: "LineToolProjection"
},
rectangle: {
name: "LineToolRectangle"
},
rotated_rectangle: {
name: "LineToolRotatedRectangle"
},
ellipse: {
name: "LineToolEllipse"
},
triangle: {
name: "LineToolTriangle"
},
polyline: {
name: "LineToolPolyline"
},
path: {
name: "LineToolPath"
},
curve: {
name: "LineToolBezierQuadro"
},
double_curve: {
name: "LineToolBezierCubic"
},
arc: {
name: "LineToolArc"
},
icon: {
name: "LineToolIcon"
},
regression_trend: {
name: "LineToolRegressionTrend"
},
fixed_range_volume_profile: {
name: "LineToolFixedRangeVolumeProfile"
}
}
},
"2jby": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "reorderCollection", (function() {
return S
})), i.d(t, "reorderDataSourcesStateZOrder", (function() {
return y
})), i.d(t, "reorderDataSourcesZOrder", (function() {
return w
})), i.d(t, "newLineToolZOrder", (function() {
return x
})), i.d(t, "newLineToolStateZOrder", (function() {
return T
})), i.d(t, "newStudyZOrder", (function() {
return I
})), i.d(t, "isReorderRequired", (function() {
return L
})),
i.d(t, "moveAtIndex", (function() {
return E
})), i.d(t, "moveAfterItem", (function() {
return k
})), i.d(t, "moveBeforeItem", (function() {
return D
})), i.d(t, "moveAfterSource", (function() {
return V
})), i.d(t, "moveBeforeSource", (function() {
return B
})), i.d(t, "moveAfterSourceState", (function() {
return R
})), i.d(t, "moveBeforeSourceState", (function() {
return N
}));
var s = i("CW80"),
r = i("3ClC"),
n = i("qJq3"),
o = i("s1Gx"),
a = i("Vs8b"),
l = i("Y7w9");
function c(e) {
return e instanceof n.Series
}
function h(e) {
return Object(s.isLineTool)(e) && !e.isSpeciallyZOrderedSource()
}
function u(e) {
return Object(r.isStudy)(e) && !e.isSpeciallyZOrderedSource()
}
function d(e, t) {
return e.zorder - t.zorder
}
function p(e, t) {
return e.zorder() - t.zorder()
}
function _(e, t) {
Object(a.isMainSeriesState)(e) ? e.zorder = 0 : e.zorder = t
}
function m(e, t) {
e.setZorder(t)
}
function f(e) {
return e.zorder
}
function g(e) {
return e.zorder()
}
function b(e, t, i, s, r, n, o) {
let a = 0;
for (let l = t; l >= 0; --l) {
const t = e[l];
void 0 !== o && o(t) || (n(t) ? (r(t, i), a = Math.max(a, M(i)), s = i - 1, i -= 1e4,
0 === s && (i -= 1e4)) : (r(t, s), a = Math.max(a, O(s)), s -= 1))
}
return a
}
function v(e, t, i, s, r, n, o) {
let a = 0;
for (let l = t; l < e.length; ++l) {
const t = e[l];
void 0 !== o && o(t) || (n(t) ? (r(t, i), a = Math.max(a, M(i)), s = i + 1, 0 === (i +=
1e4) && (s += 1e4)) : (r(t, s), a = Math.max(a, O(s)), s += 1))
}
return a
}
function S(e, t, i, s, r, n) {
let o = null;
const a = [];
for (const r of e) t(r) ? (a.push(r), o = r) : (i(r) || s(r)) && a.push(r);
a.sort(n), null !== o && r(o, 0);
const l = null === o ? -1 : a.indexOf(o),
c = b(a, l - 1, -1e4, -1, r, i),
h = v(a, l + 1, 1e4, 1, r, i);
return Math.max(c, h) < .7
}
function y(e) {
return S(e, a.isMainSeriesState, a.isStudyState, a.isLineToolState, _, d)
}
function w(e) {
return S(e, c, u, h, m, p)
}
function P(e, t) {
const i = Math.floor(e / 1e4);
let s = t.get(i);
return void 0 === s && (s = [], t.set(i, s)), s
}
function C(e, t, i, s, r, n) {
let o = -1 / 0,
a = 1 / 0,
l = 0;
const c = new Map;
for (let s = 0; s < e.length; ++s) {
const n = e[s],
h = r(n);
t(n) ? (o = Math.max(o, h), P(h, c).push(n)) : i(n) && (h < 0 && (a = Math.min(a, h)),
l = Math.max(l, h))
}
if (n) {
return Math.max(l, o) + 1
}
if (o === -1 / 0) return a === 1 / 0 ? -1 : a - 1;
if (o > 0 || o % 1e4 < -1) return o + 1;
for (const e of P(o, c)) s(e, r(e) - 1);
return o
}
function x(e, t) {
return C(e, h, u, m, g, t)
}
function T(e, t) {
return C(e, a.isLineToolState, a.isStudyState, _, f, t)
}
function I(e) {
let t = -1e4;
for (const i of e) u(i) && (t = Math.min(t, i.zorder() - 1e4));
return 0 === t ? -1e4 : t
}
function M(e) {
return Math.abs(e / o.specialZOrderBase)
}
function O(e) {
return Math.abs(e % 1e4 / 1e4)
}
function L(e, t) {
return null !== e && M(e) >= .7 || null !== t && O(t) > .7
}
function A(e, t) {
const i = 1e4 * ((s = e / 1e4) >= 0 ? Math.ceil(s) : Math.floor(s));
var s;
return i === e ? i + 1e4 * t : i
}
function E(e, t, i, s, r, n, a, c, h) {
if (s(t[0])) return void(i < e.length && c(e[i]) < 0 ? v(e, i, 1e4, 1, a, r, s) : b(e, Math
.max(0, Math.min(i - 1, e.length - 1)), -1e4, -1, a, r, s));
const {
newItems: u,
movedItemsStartIndex: d
} = i > 0 ? Object(l.moveAfter)(e, t, i - 1) : Object(l.moveBefore)(e, t, 0), p = d, _ = d +
t.length - 1, m = p > 0 ? c(u[p - 1]) : c(u[p]) - 1, f = _ < e.length - 1 ? c(u[_ +
1]) : c(u[_]) + 1;
if (m >= 0 && f > 0) v(u, p, A(m, 1), m + 1, a, r, s);
else if (f <= 0 && m < 0) b(u, _, A(f, -1), f - 1, a, r, s);
else {
let e = -o.specialZOrderBase;
for (const t of u) s(t) ? e = 1 : (a(t, e), e += 1);
S(u, s, r, n, a, h)
}
}
function k(e, t, i, s, r, n, o, a, l) {
const c = e.indexOf(i) + 1;
E(e, t, c, s, r, n, o, a, l)
}
function D(e, t, i, s, r, n, o, a, l) {
const c = e.indexOf(i);
E(e, t, c, s, r, n, o, a, l)
}
function V(e, t, i) {
k(e, t, i, c, u, h, m, g, p)
}
function B(e, t, i) {
D(e, t, i, c, u, h, m, g, p)
}
function R(e, t, i) {
k(e, t, i, a.isMainSeriesState, a.isStudyState, a.isLineToolState, _, f, d)
}
function N(e, t, i) {
D(e, t, i, a.isMainSeriesState, a.isStudyState, a.isLineToolState, _, f, d)
}
},
"2kV1": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyStatusView", (function() {
return r
}));
var s = i("nBJD");
class r extends s.a {
constructor(e) {
super(e.statusProvider())
}
color() {
return this._statusProvider.color()
}
getSplitTitle() {
return this._statusProvider.getSplitTitle()
}
update() {
this._text = this._statusProvider.text()
}
}
},
"2uTr": function(e, t, i) {
"use strict";
function s(e) {
return e + "…"
}
i.r(t), i.d(t, "appendEllipsis", (function() {
return s
}))
},
"3/8U": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("HGP3"),
r = i("Tmoa");
const n = Object(r.generateColor)(s.colorsPalette["color-tv-blue-500"], 75)
},
"38az": function(e, t, i) {
"use strict";
var s = i("k9/m").PlotRowSearchMode,
r = i("Tmoa").rgbaFromInteger;
function n() {
this.backColorers = []
}
function o(e) {
n.call(this), this._series = e
}
function a(e, t) {
n.call(this), this._study = e, this._plotIndex = t
}
n.prototype.barStyle = function(e, t, i) {
for (var s = {}, r = this.backColorers.length - 1; r >= 0; r--) this.backColorers[r]
.applyBarStyle(e, t, s, i);
return this.applyBarStyle(e, t, s, i), s
}, n.prototype.pushBackBarColorer = function(e) {
this.backColorers.push(e)
}, n.prototype.applyBarStyle = function(e, t, i) {
throw new Error("This function is supposed to be reimplemented in a subclass")
}, inherit(o, n), o.upColor = function(e, t) {
switch (e.style.value()) {
case TradingView.Series.STYLE_LINE:
return e.lineStyle.color.value();
case TradingView.Series.STYLE_AREA:
return e.areaStyle.linecolor.value();
case TradingView.Series.STYLE_BARS:
return e.barStyle.upColor.value();
case TradingView.Series.STYLE_CANDLES:
return e.candleStyle.upColor.value();
case TradingView.Series.STYLE_HOLLOW_CANDLES:
return e.hollowCandleStyle.upColor.value();
case TradingView.Series.STYLE_HEIKEN_ASHI:
return e.haStyle.upColor.value();
case TradingView.Series.STYLE_BASELINE:
return e.baselineStyle.topLineColor.value();
case TradingView.Series.STYLE_HILO:
return e.hiloStyle.color.value()
}
throw new Error("Unknown series style")
}, o.downColor = function(e, t) {
switch (e.style.value()) {
case TradingView.Series.STYLE_LINE:
return e.lineStyle.color.value();
case TradingView.Series.STYLE_AREA:
return e.areaStyle.linecolor.value();
case TradingView.Series.STYLE_BARS:
return e.barStyle.downColor.value();
case TradingView.Series.STYLE_CANDLES:
return e.candleStyle.downColor.value();
case TradingView.Series.STYLE_HOLLOW_CANDLES:
return e.hollowCandleStyle.downColor.value();
case TradingView.Series.STYLE_HEIKEN_ASHI:
return e.haStyle.downColor.value();
case TradingView.Series.STYLE_BASELINE:
return e.baselineStyle.bottomLineColor.value();
case TradingView.Series.STYLE_HILO:
return e.hiloStyle.color.value()
}
throw new Error("Unknown series style")
}, o.prototype._applyLineStyle = function(e, t, i, s, r) {
i.barColor = o.upColor(r)
}, o.prototype._applyAreaStyle = function(e, t, i, s, r) {
i.barColor = o.upColor(r)
}, o.prototype._applyBarStyle = function(e, t, i, s, r) {
var n = o.upColor(r),
a = o.downColor(r),
l = this.findBar(e, !1, s);
if (r.barStyle.barColorsOnPrevClose.value()) {
var c = this.findPrevBar(e, !1, s);
i.barColor = c[TradingView.CLOSE_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a, i
.barBorderColor = c[TradingView.CLOSE_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a
} else i.barColor = l[TradingView.OPEN_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a, i
.barBorderColor = l[TradingView.OPEN_PLOT] <= l[TradingView.CLOSE_PLOT] ? n : a
}, o.prototype._applyCandleStyle = function(e, t, i, s, r) {
var n, a = o.upColor(r, t),
l = o.downColor(r, t),
c = r.candleStyle.borderUpColor ? r.candleStyle.borderUpColor.value() : r
.candleStyle.borderColor.value(),
h = r.candleStyle.borderDownColor ? r.candleStyle.borderDownColor.value() : r
.candleStyle.borderColor.value(),
u = r.candleStyle.wickUpColor ? r.candleStyle.wickUpColor.value() : r.candleStyle
.wickColor.value(),
d = r.candleStyle.wickDownColor ? r.candleStyle.wickDownColor.value() : r
.candleStyle.wickColor.value(),
p = this.findBar(e, !1, s);
r.candleStyle.barColorsOnPrevClose.value() ? n = this.findPrevBar(e, !1, s)[TradingView
.CLOSE_PLOT] <= p[TradingView.CLOSE_PLOT] : n = p[TradingView.OPEN_PLOT] <= p[
TradingView.CLOSE_PLOT];
i.barColor = n ? a : l, i.barBorderColor = n ? c : h, i.barWickColor = n ? u : d
}, o.prototype._applyHollowCandleStyle = function(e, t, i, s, r) {
var n = o.upColor(r, t),
a = o.downColor(r, t),
l = r.hollowCandleStyle.borderUpColor ? r.hollowCandleStyle.borderUpColor.value() :
r.hollowCandleStyle.borderColor.value(),
c = r.hollowCandleStyle.borderDownColor ? r.hollowCandleStyle.borderDownColor
.value() : r.hollowCandleStyle.borderColor.value(),
h = r.hollowCandleStyle.wickUpColor ? r.hollowCandleStyle.wickUpColor.value() : r
.hollowCandleStyle.wickColor.value(),
u = r.hollowCandleStyle.wickDownColor ? r.hollowCandleStyle.wickDownColor.value() :
r.hollowCandleStyle.wickColor.value(),
d = this.findBar(e, !1, s);
this.findPrevBar(e, !1, s)[TradingView.CLOSE_PLOT] <= d[TradingView.CLOSE_PLOT] ? (i
.barColor = n, i.barBorderColor = l, i.barWickColor = h) : (i.barColor = a, i
.barBorderColor = c, i.barWickColor = u), i.isBarHollow = d[TradingView
.OPEN_PLOT] <= d[TradingView.CLOSE_PLOT]
}, o.prototype._applyHAStyle = function(e, t, i, s, r) {
var n, a = o.upColor(r, t),
l = o.downColor(r, t),
c = r.haStyle.borderUpColor.value(),
h = r.haStyle.borderDownColor.value(),
u = r.haStyle.wickUpColor.value(),
d = r.haStyle.wickDownColor.value(),
p = this.findBar(e, t, s);
r.haStyle.barColorsOnPrevClose.value() ? n = this.findPrevBar(e, t, s)[TradingView
.CLOSE_PLOT] <= p[TradingView.CLOSE_PLOT] : n = p[TradingView.OPEN_PLOT] <= p[
TradingView.CLOSE_PLOT];
i.barColor = n ? a : l, i.barBorderColor = n ? c : h, i.barWickColor = n ? u : d
}, o.prototype._applyBaseLineStyle = function(e, t, i, s, r) {
var n = this.findBar(e, t, s),
a = r.baselineStyle,
l = this._series.priceScale(),
c = Math.round(l.height() * (Math.abs(100 - a.baseLevelPercentage.value()) / 100)),
h = this._series.firstValue(),
u = l.coordinateToPrice(c, h);
n[TradingView.CLOSE_PLOT] > u ? i.barColor = o.upColor(r, t) : i.barColor = o.downColor(
r, t)
}, o.prototype._applyHiLoStyle = function(e, t, i, s, r) {
i.barColor = o.upColor(r, t), i.barBorderColor = r.hiloStyle.borderColor.value()
}, o.prototype.applyBarStyle = function(e, t, i, s) {
i || (i = {}),
i.barColor = null, i.barBorderColor = null, i.barWickColor = null, i.isBarHollow =
null, i.isBarUp = null, i.upColor = null, i.downColor = null, i.isTwoColorBar =
null, i.isMergedBar = null;
var r = this._series.properties();
switch (r.style.value()) {
case TradingView.Series.STYLE_LINE:
this._applyLineStyle(e, t, i, s, r);
break;
case TradingView.Series.STYLE_AREA:
this._applyAreaStyle(e, t, i, s, r);
break;
case TradingView.Series.STYLE_BARS:
this._applyBarStyle(e, t, i, s, r);
break;
case TradingView.Series.STYLE_CANDLES:
this._applyCandleStyle(e, t, i, s, r);
break;
case TradingView.Series.STYLE_HOLLOW_CANDLES:
this._applyHollowCandleStyle(e, t, i, s, r);
break;
case TradingView.Series.STYLE_HEIKEN_ASHI:
this._applyHAStyle(e, t, i, s, r);
break;
case TradingView.Series.STYLE_BASELINE:
this._applyBaseLineStyle(e, t, i, s, r);
break;
case TradingView.Series.STYLE_HILO:
this._applyHiLoStyle(e, t, i, s, r)
}
return i
}, o.prototype.getSeriesBars = function(e) {
return e ? this._series.nsBars() : this._series.bars()
}, o.prototype._findBarFieldValue = function(e, t, i) {
var s = this.getSeriesBars(i).valueAt(e);
if (null !== s) return s[t]
}, o.prototype.findBar = function(e, t, i) {
return i ? i.value : this.getSeriesBars(t).valueAt(e) || []
}, o.prototype.findPrevBar = function(e, t, i) {
if (i && i.previousValue) return i.previousValue;
var r = this._series.bars().search(e - 1, s.NearestLeft, TradingView.CLOSE_PLOT);
return null !== r ? r.value : []
}, inherit(a, n), a.prototype.getBars = function() {
return this._study.series().bars()
}, a.prototype.firstColoredBar = function(e) {
for (var t = e, i = 0; i < this.backColorers.length; i++) t = Math.min(t, this
.backColorers[i].firstColoredBar(e));
var s = this.getOffset(this._plotIndex);
t = Math.min(t, e + s);
var r = this.getBars().firstIndex();
return Math.max(t, r)
}, a.prototype.getOffset = function() {
var e = this._study.metaInfo().plots[this._plotIndex];
return this._study.offset(e.id)
}, a.prototype.applyBarStyle = function(e, t, i) {
if (i || (i = {}), t) return i;
var s = this._study.properties();
if (!s.visible.value()) return i;
var n = this._study.metaInfo(),
o = this._study.data();
if (!o || 0 === o.size()) return i;
var a = n.plots[this._plotIndex],
l = this.getOffset();
if (this._study.getMinFirstBarIndexForPlot(a.id) > e + l) return i;
var c = s.styles[a.id];
if (c.visible && !c.visible.value()) return i;
var h = o.valueAt(e - l);
if (null === h) return i;
var u = h[this._plotIndex + 1];
if (null == u) return i;
if (u = Math.round(u), n.isRGB) i.barColor = r(u), i.upColor = i.barColor, i.downColor =
i.barColor;
else {
var d = n.plots[this._plotIndex].palette,
p = s.palettes[d],
_ = n.palettes[d].valToIndex ? n.palettes[d].valToIndex[u] : u,
m = p.colors[_].color.value();
i.barColor = m, i.upColor = m.color, i.downColor = m.color
}
return i
}, t.SeriesBarColorer = o, t.StudyBarColorer = a
},
"3ClC": function(e, t, i) {
"use strict";
i.r(t);
var s = i("0YCj"),
r = i.n(s),
n = i("GVHu"),
o = i("PL0c"),
a = i("cKqi"),
l = i("YzC7"),
c = i("TMWk"),
h = i("8sOK");
class u extends n.Study {
constructor(e, t, i, s) {
super(e, t, i, s), this.properties().styles.vol_ma.visible.listeners()
.subscribe(this, () => this.invalidateTitleCache())
}
base() {
return 1
}
destroy() {
this.properties().styles.vol_ma.visible.listeners().unsubscribeAll(this), super
.destroy()
}
_titleInputs() {
const e = {
symbolsForDisplay: !0,
skipHiddenInputs: !0,
fakeInputsForDisplay: !0,
asObject: !1
};
return this.properties().styles.vol_ma.visible.value() ? this.inputs(e) : this
.inputs({
...e,
skippedInputs: ["length"]
})
}
}
var d = i("Eyy1"),
p = i("Qb4w");
class _ extends n.Study {
priceRange(e, t) {
let i = !1;
this.graphics().hhists().forEach((e, t) => {
i = i || this.properties().child("graphics").child("hhists").child(
t).child("showValues").value()
});
const s = function(e, t, i, s) {
let r = null;
return e.forEach((e, s) => {
e.forEach(e => {
e.firstBarTime <= i && e.lastBarTime >= t && (
null === r ? r = {
low: {
l: e.priceLow,
h: e.priceHigh
},
high: {
h: e.priceHigh
}
} : (e.priceLow < r.low.l && (r.low.l =
e.priceLow, r.low.h = e
.priceHigh), r.high.h = Math
.max(r.high.h, e.priceHigh)))
})
}), null === r ? null : s ? new p.PriceRange(r.low.l - .8 * (r.low
.h - r.low.l), r.high.h) : new p.PriceRange(r.low.l, r.high.h)
}(this.graphics().hhists(), e, t, i);
if (null === s) return null;
const r = Object(d.ensureNotNull)(this.priceScale());
return r.isLog() ? new p.PriceRange(r.priceToLogical(s.minValue()), r
.priceToLogical(s.maxValue())) : s
}
}
function m(e, t = "shift", i) {
return {
studyConstructor: e,
colorRotationMode: t,
colorRotationComparator: i
}
}
i.d(t, "isStudy", (function() {
return g
})), i.d(t, "isStudyStrategy", (function() {
return b
})), i.d(t, "isStudyStub", (function() {
return v
})), i.d(t, "isFundamentalStudy", (function() {
return S
})), i.d(t, "isESDStudy", (function() {
return y
})), i.d(t, "isFundamentalStudyMetaInfo", (function() {
return w
})), i.d(t, "createStudy", (function() {
return C
})), i.d(t, "studyColorRotationMode", (function() {
return x
})), i.d(t, "useSameColorRotationComparator", (function() {
return I
}));
const f = {
study_PivotPointsStandard: m(o.study_PivotPointsStandard),
study_Overlay: m(a.study_Overlay, "loop"),
study_Compare: m(l.a, "loop"),
study_Volume: m(u),
study_VbPVisible: m(class extends _ {}),
study_ScriptWithDataOffset: m(c.study_ScriptWithDataOffset)
};
for (const e in f) f.hasOwnProperty(e) && (TradingView[e] = f[e].studyConstructor);
function g(e) {
return e instanceof n.Study
}
function b(e) {
return !1
}
function v(e) {
return e instanceof h.StudyStub
}
function S(e) {
return e instanceof Fundamental
}
function y(e) {
return !1
}
function w(e) {
return "study_Internal$STD;Fund_" === P(e)
}
function P(e) {
const t = "study_" + (e.classId || e.shortId);
return t.startsWith("study_Internal$STD;Fund_") ? "study_Internal$STD;Fund_" : t
}
function C(e, t, i, s, r) {
const o = P(s),
a = new(o in f ? f[o].studyConstructor : n.Study)(e, t, i, s);
return void 0 !== r && a.setId(r), a
}
function x(e) {
const t = P(e);
return t in f ? f[t].colorRotationMode : void 0 === e.pine || r.a.isStandardPine(e.id) ?
1 !== e.plots.length ? "shift" : "loop" : null
}
function T(e, t) {
return e.id === t.id && (s = t, ((i = e).pine ? i.pine.version : void 0) === (s.pine ? s
.pine.version : void 0));
var i, s
}
function I(e) {
const t = P(e);
if (t in f) {
const e = f[t].colorRotationComparator;
if (void 0 !== e) return e
}
return T
}
},
"3UA0": function(e, t) {
e.exports.tzData = {
"America/New_York": {
time: [-2717668562, -1633298400, -1615154400, -1601848800, -1583704800, -1570399200,
-1551650400, -1536530400, -1523224800, -1504476e3, -1491775200, -1473026400,
-1459720800, -1441576800, -1428271200, -1410127200, -1396821600, -
1378677600, -1365372e3, -1347228e3, -1333922400, -1315173600, -1301868e3, -
1283724e3, -1270418400, -1252274400, -1238968800, -1220824800, -1207519200,
-1189375200, -1176069600, -1157320800, -114462e4, -1125871200, -1112565600,
-1094421600, -1081116e3, -1062972e3, -1049666400, -1031522400, -1018216800,
-1000072800, -986767200, -968018400, -955317600, -936568800, -923263200, -
905119200, -891813600, -880236e3, -76941e4, -765410400, -747266400, -
733960800, -715816800, -702511200, -684367200, -671061600, -652917600, -
639612e3, -620863200, -608162400, -589413600, -576108e3, -557964e3, -
544658400, -526514400, -513208800, -495064800, -481759200, -463615200, -
447285600, -431560800, -415836e3, -400111200, -384386400, -368661600, -
352936800, -337212e3, -321487200, -305762400, -289432800, -273708e3, -
257983200, -242258400, -226533600, -210808800, -195084e3, -179359200, -
163634400, -147909600, -13158e4, -11646e4, -100130400, -84405600, -68680800,
-52956e3, -37231200, -21506400, -5781600, 9943200, 25668e3, 41392800,
57722400, 73447200, 89172e3, 104896800, 120621600, 126669600, 152071200,
162352800, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600,
278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200,
388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600,
499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4,
607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200,
719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3,
828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200,
941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800,
1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600,
1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3,
1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600,
1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400,
1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3,
1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800,
1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400,
1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200,
1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800,
1888452e3, 1899338400, 1919901600, 1930788e3
],
offset: [-17762, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3,
-14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
18e3, -14400, -18e3
]
},
"America/Los_Angeles": {
time: [-2717668378, -1633298400, -1615154400, -1601848800, -1583704800, -880236e3, -
769420800, -765410400, -687995940, -662680800, -620866800, -608162400, -
589417200, -576108e3, -557967600, -544658400, -526518e3, -513208800, -
495068400, -481759200, -463618800, -450309600, -431564400, -418255200, -
400114800, -386805600, -368665200, -355356e3, -337215600, -323906400, -
305766e3, -292456800, -273711600, -261007200, -242262e3, -226533600, -
210812400, -195084e3, -179362800, -163634400, -147913200, -13158e4, -
116463600, -100130400, -84405600, -68680800, -52956e3, -37231200, -21506400,
-5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3,
104896800, 120621600, 126669600, 152071200, 162352800, 183520800, 199245600,
215575200, 230695200, 247024800, 262749600, 278474400, 294199200, 309924e3,
325648800, 341373600, 357098400, 372823200, 388548e3, 404877600, 419997600,
436327200, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3,
544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200,
657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800,
765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3,
877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800,
986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600,
1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200,
1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800,
1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400,
1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200,
1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800,
1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400,
1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200,
1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800,
1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600,
1930788e3
],
offset: [-28378, -28800, -25200, -28800, -25200, -28800, -25200, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800
]
},
"America/Chicago": {
time: [-2717668236, -1633298400, -1615154400, -1601848800, -1583704800, -1563746400,
-1551650400, -1538949600, -1520200800, -1504476e3, -1491775200, -1473026400,
-1459720800, -1441576800, -1428271200, -1410127200, -1396821600, -
1378677600, -1365372e3, -1347228e3, -1333922400, -1315173600, -1301868e3, -
1283724e3, -1270418400, -1252274400, -1238968800, -1220824800, -1207519200,
-1189375200, -1176069600, -1157320800, -114462e4, -1125871200, -1112565600,
-1094421600, -1081116e3, -1067810400, -1045432800, -1031522400, -1018216800,
-1000072800, -986767200, -968018400, -955317600, -936568800, -923263200, -
905119200, -891813600, -880236e3, -769413600, -765410400, -747266400, -
733960800, -715816800, -702511200, -684367200, -671061600, -652917600, -
639612e3, -620863200, -608162400, -589413600, -576108e3, -557964e3, -
544658400, -526514400, -513208800, -495064800, -481759200, -463615200, -
447285600, -431560800, -415836e3, -400111200, -384386400, -368661600, -
352936800, -337212e3, -321487200, -305762400, -289432800, -273708e3, -
257983200, -242258400, -226533600, -210808800, -195084e3, -179359200, -
163634400, -147909600, -13158e4, -11646e4, -100130400, -84405600, -68680800,
-52956e3, -37231200, -21506400, -5781600, 9943200, 25668e3, 41392800,
57722400, 73447200, 89172e3, 104896800, 120621600, 126669600, 152071200,
162352800, 183520800, 199245600, 215575200, 230695200, 247024800, 262749600,
278474400, 294199200, 309924e3, 325648800, 341373600, 357098400, 372823200,
388548e3, 404877600, 419997600, 436327200, 452052e3, 467776800, 483501600,
499226400, 514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4,
607485600, 625629600, 638935200, 657079200, 670989600, 688528800, 702439200,
719978400, 733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3,
828842400, 846381600, 860292e3, 877831200, 891741600, 909280800, 923191200,
941335200, 954640800, 972784800, 986090400, 1004234400, 1018144800,
1035684e3, 1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600,
1130637600, 1143943200, 1162087200, 1173578400, 1194141600, 1205028e3,
1225591200, 1236477600, 1257040800, 1268532e3, 1289095200, 1299981600,
1320544800, 1331431200, 1351994400, 1362880800, 1383444e3, 1394330400,
1414893600, 142578e4, 1446343200, 1457834400, 1478397600, 1489284e3,
1509847200, 1520733600, 1541296800, 1552183200, 1572746400, 1583632800,
1604196e3, 1615687200, 1636250400, 1647136800, 16677e5, 1678586400,
1699149600, 1710036e3, 1730599200, 1741485600, 1762048800, 1772935200,
1793498400, 1804989600, 1825552800, 1836439200, 1857002400, 1867888800,
1888452e3, 1899338400, 1919901600, 1930788e3
],
offset: [-21036, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600,
-18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -
21600, -18e3, -21600
]
},
"America/Phoenix": {
time: [-2717670498, -1633298400, -1615154400, -1601848800, -1583704800, -880236e3, -
820540740, -812678340, -796867140, -84405600, -68680800, 1924966800
],
offset: [-26898, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200, -21600, -25200
]
},
"America/Toronto": {
time: [-2366755200, -1632088800, -1615154400, -1601771400, -1583712e3, -1567375200,
-1554681600, -1534716e3, -1524088800, -1503266400, -149238e4, -1471816800, -
1460930400, -1440972e3, -1428876e3, -1409522400, -1397426400, -1378072800, -
1365976800, -1346623200, -1333922400, -1315173600, -1301868e3, -1283724e3, -
1270418400, -1252274400, -1238968800, -1220824800, -1207519200, -1188770400,
-1176069600, -1157320800, -1144015200, -1125871200, -1112565600, -
1094421600, -1081116e3, -1062972e3, -1049666400, -1031522400, -1018216800, -
1000072800, -986767200, -968018400, -955317600, -936568800, -880232400, -
76941e4, -765410400, -747266400, -733960800, -715824e3, -702518400, -
684374400, -671068800, -652924800, -634176e3, -620863200, -602719200, -
589413600, -576108e3, -557964e3, -544658400, -526514400, -513208800, -
495064800, -481759200, -463615200, -450309600, -431560800, -418255200, -
400111200, -384386400, -368661600, -352936800, -337212e3, -321487200, -
305762400, -289432800, -273708e3, -257983200, -242258400, -226533600, -
210808800, -195084e3, -179359200, -163634400, -147909600, -13158e4, -
11646e4, -100130400, -84405600, -68680800, -52956e3, -37231200, -21506400, -
5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800,
120621600, 136346400, 152071200, 167796e3, 183520800, 199245600, 215575200,
230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800,
341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200,
452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3, 544586400,
562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200,
670989600, 688528800, 702439200, 719978400, 733888800, 752032800, 765338400,
783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200,
891741600, 909280800, 923191200, 941335200, 954640800, 972784800, 986090400,
1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3,
1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400,
1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3,
1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800,
1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400,
1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200,
1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800,
16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600,
1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200,
1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3
],
offset: [-19052, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3,
-14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -14400, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -
14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3
]
},
"America/Vancouver": {
time: [-2713910400, -1632088800, -1615154400, -880236e3, -769420800, -765410400, -
747266400, -733960800, -715816800, -702511200, -684367200, -671061600, -
652917600, -639612e3, -620863200, -608162400, -589413600, -576108e3, -
557964e3, -544658400, -526514400, -513208800, -495064800, -481759200, -
463615200, -450309600, -431560800, -418255200, -400111200, -386805600, -
368661600, -355356e3, -337212e3, -323906400, -305762400, -292456800, -
273708e3, -261007200, -242258400, -226533600, -210808800, -195084e3, -
179359200, -163634400, -147909600, -13158e4, -11646e4, -100130400, -
84405600, -68680800, -52956e3, -37231200, -21506400, -5781600, 9943200,
25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800, 120621600,
136346400, 152071200, 167796e3, 183520800, 199245600, 215575200, 230695200,
247024800, 262749600, 278474400, 294199200, 309924e3, 325648800, 341373600,
357098400, 372823200, 388548e3, 404877600, 419997600, 436327200, 452052e3,
467776800, 483501600, 499226400, 514951200, 530676e3, 544586400, 562125600,
576036e3, 59418e4, 607485600, 625629600, 638935200, 657079200, 670989600,
688528800, 702439200, 719978400, 733888800, 752032800, 765338400, 783482400,
796788e3, 814932e3, 828842400, 846381600, 860292e3, 877831200, 891741600,
909280800, 923191200, 941335200, 954640800, 972784800, 986090400,
1004234400, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3,
1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1173578400,
1194141600, 1205028e3, 1225591200, 1236477600, 1257040800, 1268532e3,
1289095200, 1299981600, 1320544800, 1331431200, 1351994400, 1362880800,
1383444e3, 1394330400, 1414893600, 142578e4, 1446343200, 1457834400,
1478397600, 1489284e3, 1509847200, 1520733600, 1541296800, 1552183200,
1572746400, 1583632800, 1604196e3, 1615687200, 1636250400, 1647136800,
16677e5, 1678586400, 1699149600, 1710036e3, 1730599200, 1741485600,
1762048800, 1772935200, 1793498400, 1804989600, 1825552800, 1836439200,
1857002400, 1867888800, 1888452e3, 1899338400, 1919901600, 1930788e3
],
offset: [-29548, -28800, -25200, -28800, -25200, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800
]
},
"America/Argentina/Buenos_Aires": {
time: [-2372112e3, -1567468800, -1233446400, -1222992e3, -1205971200, -1194048e3, -
117288e4, -1162512e3, -1141344e3, -1130976e3, -1109808e3, -109944e4, -
1078272e3, -1067817600, -1046649600, -1036281600, -1015113600, -1004745600,
-983577600, -973209600, -952041600, -941587200, -931046400, -900892800, -
890352e3, -83376e4, -82728e4, -752284800, -733795200, -197337600, -
190857600, -184204800, -164505600, -152668800, -132969600, -121132800, -
101433600, -86832e3, -71107200, -54777600, -39052800, -23328e3, -7603200,
128131200, 136598400, 596937600, 605059200, 624412800, 636508800, 656467200,
667958400, 687916800, 699408e3, 719366400, 731462400, 938908800, 952041600,
1198972800, 1205625600, 1224374400, 1237075200, 1924981200
],
offset: [-14028, -15408, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -7200, -
10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -
10800, -10800, -10800, -7200, -10800, -7200, -10800
]
},
"America/El_Salvador": {
time: [-1546300800, 546998400, 559699200, 578448e3, 591148800, 1924970400],
offset: [-21408, -21600, -18e3, -21600, -18e3, -21600]
},
"America/Sao_Paulo": {
time: [-1767225600, -1206968400, -1191369600, -1175385600, -1159833600, -633830400,
-622076400, -602294400, -59184e4, -570758400, -560217600, -539136e3, -
53136e4, -195436800, -184204800, -155174400, -150076800, -128908800, -
121132800, -99964800, -89596800, -68428800, -57974400, 499737600, 511228800,
530582400, 540259200, 562118400, 571190400, 592963200, 602035200, 624412800,
634694400, 656467200, 666748800, 687916800, 697593600, 719971200, 728438400,
750816e3, 761702400, 782265600, 793152e3, 813715200, 823996800, 84456e4,
856051200, 876096e3, 888710400, 908064e3, 919555200, 938908800, 951609600,
970963200, 982454400, 1003017600, 1013904e3, 1036281600, 1045353600,
1066521600, 1076803200, 1099353600, 1108857600, 1129420800, 1140307200,
1162684800, 1172361600, 119232e4, 1203206400, 1224374400, 1234656e3,
1255824e3, 1266710400, 1287273600, 129816e4, 1318723200, 1330214400,
1350777600, 1361059200, 1382227200, 1392508800, 1413676800, 1424563200,
1445126400, 1456012800, 1476576e3, 1487462400, 1508025600, 1518912e3,
1541289600, 1550361600, 1924981200
],
offset: [-11188, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800,
-7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -7200, -10800, -
7200, -10800
]
},
"America/Bogota": {
time: [-2707689600, -1739059200, 704851200, 733881600, 1924974e3],
offset: [-17776, -17776, -18e3, -14400, -18e3]
},
"America/Caracas": {
time: [-2524521600, -1826755200, -157766400, 1197169200, 1462069800, 1924977600],
offset: [-16064, -16060, -16200, -14400, -16200, -14400]
},
"Europe/Moscow": {
time: [-2840140800, -1688256e3, -165681e4, -1641340800, -1627956e3, -1618700400, -
1596416400, -1593804521, -1589846400, -1542416400, -1539478800, -1525305600,
-1522713600, -1491177600, -1247529600, 354931200, 370742400, 386467200,
402278400, 418003200, 433814400, 449625600, 465361200, 481082400, 496810800,
512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600, 606880800,
622609200, 638330400, 654663600, 670384800, 686113200, 695786400, 701834400,
717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600,
828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400,
941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600,
1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200,
1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4,
1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1414288800,
1925002800
],
offset: [9017, 9017, 9079, 12679, 9079, 16279, 12679, 16279, 14400, 10800, 14400,
18e3, 14400, 10800, 7200, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400,
10800, 14400, 10800, 10800, 7200, 10800, 14400, 10800, 14400, 10800, 14400,
10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400,
10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
14400, 10800
]
},
"Europe/Athens": {
time: [-2344636800, -1686095940, -1182988800, -1178150400, -906854400, -904867200, -
85725e4, -844473600, -828230400, -812419200, -552355200, -541641600,
166492800, 186195600, 198036e3, 213764400, 228880800, 244090800, 260330400,
275457600, 291805200, 307418400, 323395200, 338947200, 354682800, 370411200,
386132400, 401860800, 417582e3, 433310400, 449031600, 465364800, 481086e3,
496814400, 512535600, 528264e3, 543985200, 559713600, 575434800, 591163200,
606884400, 622612800, 638334e3, 654667200, 670388400, 686116800, 701838e3,
717566400, 733287600, 749016e3, 764737200, 780465600, 796186800, 811915200,
828241200, 846388800, 859690800, 877838400, 891140400, 909288e3, 92259e4,
941342400, 954039600, 972792e3, 985489200, 1004241600, 1017543600,
1035691200, 1048993200, 1067140800, 1080442800, 1099195200, 1111892400,
1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3, 1206846e3,
1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301194800,
1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396148400,
1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5, 1490497200,
1509249600, 1521946800, 1540699200, 1554001200, 1572148800, 1585450800,
1603598400, 1616900400, 1635652800, 164835e4, 1667102400, 1679799600,
1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200, 1774753200,
1792900800, 1806202800, 1824955200, 1837652400, 1856404800, 1869102e3,
1887854400, 1901156400, 1919304e3, 1932606e3
],
offset: [5692, 5692, 7200, 10800, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200
]
},
"Europe/Belgrade": {
time: [-2713910400, -905821200, -85725e4, -844552800, -828219600, -812498400, -
79677e4, -777938400, -766616400, 417578400, 433306800, 449028e3, 465361200,
481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200,
591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200,
701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200,
811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400,
922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4,
1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800,
1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400,
122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200,
1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800,
1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600,
1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200,
1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3,
1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600,
1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400,
1887850800, 1901152800, 1919300400, 1932602400
],
offset: [4920, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Europe/Berlin": {
time: [-2422051200, -1693702800, -1680476400, -1663452e3, -1650142800, -1632002400,
-1618693200, -938901600, -85725e4, -844552800, -828219600, -812498400, -
79677e4, -781048800, -776556e3, -765925200, -761173200, -748476e3, -
733266e3, -717627600, -714603600, -71037e4, -701902800, -684972e3, -
670453200, -654127200, -639003600, 323834400, 338958e3, 354679200,
370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200,
481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200,
591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200,
701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200,
811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400,
922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4,
1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800,
1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400,
122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200,
1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800,
1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600,
1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200,
1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3,
1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600,
1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400,
1887850800, 1901152800, 1919300400, 1932602400
],
offset: [3208, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 10800, 7200, 3600, 7200, 3600, 7200, 10800, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Europe/London": {
time: [-3852662400, -1691964e3, -1680469200, -1664143200, -1650142800, -1633903200,
-1617483600, -1601848800, -1586034e3, -1570399200, -1552165200, -1538344800,
-152253e4, -15075e5, -1490562e3, -1473631200, -1460926800, -1442786400, -
1428872400, -1410732e3, -1396213200, -1379282400, -1364763600, -1348437600,
-1333314e3, -1315778400, -1301259600, -1284328800, -126981e4, -1253484e3, -
1238360400, -1221429600, -1206910800, -118998e4, -1175461200, -1159135200, -
1143406800, -1126476e3, -1111957200, -1095631200, -1080507600, -1063576800,
-1049058e3, -1032127200, -1017608400, -1001282400, -986158800, -969228e3, -
950475600, -942012e3, -904514400, -896043600, -875484e3, -864594e3, -
844034400, -832539600, -812584800, -798066e3, -781048800, -772059600, -
764802e3, -748476e3, -733352400, -719445600, -717026400, -706741200, -
699483600, -687996e3, -668034e3, -654732e3, -636584400, -622072800, -
605739600, -590623200, -57429e4, -558568800, -542235600, -527119200, -
512600400, -496274400, -481150800, -46422e4, -449701200, -432165600, -
417646800, -401320800, -386197200, -369266400, -354747600, -337816800, -
323298e3, -306972e3, -291848400, -276732e3, -257979600, -245282400, -
22653e4, -213228e3, -195080400, -182383200, -163630800, -150933600, -
132181200, -119484e3, -100731600, -88034400, -68677200, -59004e3, -37238400,
57726e3, 69818400, 89175600, 101268e3, 120625200, 132717600, 152074800,
164167200, 183524400, 196221600, 214974e3, 227671200, 246423600, 259120800,
278478e3, 290570400, 309927600, 32202e4, 341377200, 354675600, 372823200,
386125200, 404272800, 417574800, 435722400, 449024400, 467776800, 481078800,
499226400, 512528400, 530676e3, 543978e3, 562125600, 575427600, 593575200,
606877200, 625629600, 638326800, 657079200, 670381200, 688528800, 701830800,
719978400, 733280400, 751428e3, 76473e4, 782877600, 796179600, 814327200,
828234e3, 846381600, 859683600, 877831200, 891133200, 909280800, 922582800,
941335200, 954032400, 972784800, 985482e3, 1004234400, 1017536400,
1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3, 1111885200,
1130637600, 1143334800, 1162087200, 1174784400, 1193536800, 1206838800,
1224986400, 1238288400, 1256436e3, 1269738e3, 1288490400, 1301187600,
131994e4, 1332637200, 1351389600, 1364691600, 1382839200, 1396141200,
1414288800, 1427590800, 1445738400, 1459040400, 1477792800, 149049e4,
1509242400, 1521939600, 1540692e3, 1553994e3, 1572141600, 1585443600,
1603591200, 1616893200, 1635645600, 1648342800, 1667095200, 1679792400,
1698544800, 1711846800, 1729994400, 1743296400, 1761444e3, 1774746e3,
1792893600, 1806195600, 1824948e3, 1837645200, 1856397600, 1869094800,
1887847200, 1901149200, 1919296800, 1932598800
],
offset: [-75, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
0, 3600, 0, 3600, 7200, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600,
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 3600,
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0
]
},
"Europe/Luxembourg": {
time: [-2069712e3, -1692493200, -1680476400, -1662339600, -165015e4, -1632002400, -
1618693200, -1612656e3, -1604278800, -1585515600, -1574038800, -1552255200,
-1539997200, -1520546400, -1507510800, -1490569200, -1473642e3, -1459116e3,
-1444006800, -142767e4, -1411866e3, -1396220400, -1379293200, -1364770800, -
1348448400, -1333321200, -1316394e3, -1301266800, -1284339600, -126981e4, -
1253484e3, -1238360400, -1221429600, -1206910800, -1191189600, -1175461200,
-1160344800, -1143406800, -1127685600, -1111957200, -1096840800, -
1080507600, -1063576800, -1049058e3, -1033336800, -1017608400, -1002492e3, -
986158800, -969228e3, -950475600, -942012e3, -935182800, -85725e4, -
844552800, -828219600, -812498400, -797979600, -781048800, -766616400, -
745452e3, -733266e3, 228880800, 244004400, 260330400, 276058800, 29178e4,
307508400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200,
417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3,
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3,
749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200,
859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3,
972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400,
1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3,
1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800,
1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400,
1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200,
1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800,
1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400,
1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200,
1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800,
1919300400, 1932602400
],
offset: [1476, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 0, 3600, 0, 3600, 0, 3600,
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600
]
},
"Europe/Madrid": {
time: [-2177453684, -1631926800, -1616886e3, -1601168400, -158535e4, -1442451600, -
142767e4, -1379293200, -1364770800, -1348448400, -1333321200, -1316390400, -
1301266800, -1284339600, -1269817200, -1026954e3, -1017615600, -1001898e3, -
999478800, -986083200, -951433200, -940208400, -873075600, -862614e3, -
842835600, -828313200, -811386e3, -796863600, -779936400, -765414e3, -
748486800, -733964400, -652323600, -639010800, 135126e3, 150253200,
166575600, 181702800, 196815600, 212547600, 22887e4, 243997200, 260330400,
276058800, 29178e4, 307508400, 323834400, 338958e3, 354679200, 370407600,
386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400,
496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600,
606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400,
717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600,
828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400,
941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600,
1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200,
1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4,
1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600,
1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400,
1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3,
1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800,
1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400,
1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200,
1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800,
1901152800, 1919300400, 1932602400
],
offset: [-884, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 7200, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Europe/Paris": {
time: [-2486678340, -1855958340, -1689814800, -1680393600, -1665363600, -1648339200,
-1635123600, -1616889600, -1604278800, -158544e4, -1574038800, -1552262400,
-1539997200, -1520553600, -1507510800, -1490572800, -1470618e3, -1459123200,
-1444006800, -1427673600, -1411952400, -1396224e3, -1379293200, -1364774400,
-1348448400, -1333324800, -1316394e3, -1301270400, -1284339600, -1269820800,
-1253494800, -1238371200, -1221440400, -1206921600, -1191200400, -1175472e3,
-1160355600, -1143417600, -1127696400, -1111968e3, -1096851600, -1080518400,
-1063587600, -1049068800, -1033347600, -1017619200, -1002502800, -986169600,
-969238800, -950486400, -942012e3, -932432400, -85725e4, -844552800, -
828219600, -812498400, -800064e3, -796258800, -781048800, -766616400,
196822800, 212547600, 228880800, 244004400, 260330400, 276058800, 29178e4,
307508400, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200,
417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3,
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3,
749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200,
859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3,
972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400,
1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3,
1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800,
1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400,
1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200,
1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800,
1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400,
1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200,
1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800,
1919300400, 1932602400
],
offset: [561, 561, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Europe/Rome": {
time: [-3252096e3, -2403562204, -1690761600, -168048e4, -1664755200, -1648944e3, -
163512e4, -1616889600, -1604275200, -1585526400, -1571011200, -1555286400, -
932428800, -85725e4, -844552800, -828219600, -812498400, -798066e3, -
781048800, -76671e4, -750895200, -733352400, -719452800, -70191e4, -
689205600, -670453200, -114048e3, -103161600, -81993600, -71708400, -
50544e3, -40258800, -18489600, -8204400, 1296e4, 23245200, 43804800,
54694800, 75859200, 86749200, 107913600, 118198800, 138758400, 149648400,
170812800, 181098e3, 202262400, 212547600, 233107200, 243997200, 265161600,
276051600, 296611200, 307501200, 323834400, 338958e3, 354679200, 370407600,
386128800, 401857200, 417578400, 433306800, 449028e3, 465361200, 481082400,
496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200, 591159600,
606880800, 622609200, 638330400, 654663600, 670384800, 686113200, 701834400,
717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600,
828237600, 846385200, 859687200, 877834800, 891136800, 909284400, 922586400,
941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600,
1048989600, 1067137200, 1080439200, 1099191600, 1111888800, 1130641200,
1143338400, 1162090800, 1174788e3, 1193540400, 1206842400, 122499e4,
1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200, 1319943600,
1332640800, 1351393200, 1364695200, 1382842800, 1396144800, 1414292400,
1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3,
1521943200, 1540695600, 1553997600, 1572145200, 1585447200, 1603594800,
1616896800, 1635649200, 1648346400, 1667098800, 1679796e3, 1698548400,
1711850400, 1729998e3, 17433e5, 1761447600, 1774749600, 1792897200,
1806199200, 1824951600, 1837648800, 1856401200, 1869098400, 1887850800,
1901152800, 1919300400, 1932602400
],
offset: [2996, 2996, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Europe/Warsaw": {
time: [-2840140800, -1717027200, -1693702800, -1680476400, -1663452e3, -1650142800,
-1632002400, -1618693200, -1600466400, -1587157200, -1501718400, -931730400,
-85725e4, -844552800, -828219600, -812498400, -796600800, -778723200, -
762652800, -748483200, -733266e3, -715212e3, -701902800, -684972e3, -
670453200, -654127200, -639003600, -397090800, -386805600, -371084400, -
355356e3, -334191600, -323301600, -307580400, -291852e3, -271292400, -
260402400, -239842800, -228952800, -208393200, -197503200, -176338800, -
166053600, 228877200, 244000800, 260326800, 276055200, 291776400, 307504800,
323830800, 338954400, 354675600, 370404e3, 386125200, 401853600, 417574800,
433303200, 449024400, 465357600, 481078800, 496807200, 512528400, 528256800,
543978e3, 559706400, 575431200, 591159600, 606880800, 622609200, 638330400,
654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400,
764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200,
877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400,
985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200,
1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800,
1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600,
1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200,
1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3,
1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600,
1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200,
1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3,
17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600,
1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400,
1932602400
],
offset: [5040, 5040, 3600, 7200, 3600, 7200, 3600, 7200, 7200, 10800, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Europe/Istanbul": {
time: [-2840140800, -1869868800, -1693699200, -168048e4, -1570406400, -1552176e3, -
1538352e3, -1522540800, -1507507200, -1490572800, -1440201600, -1428019200,
-1409702400, -1396483200, -931046400, -922665600, -917827200, -892425600, -
875836800, -764726400, -744336e3, -733795200, -716428800, -701913600, -
684979200, -670464e3, -654134400, -639014400, -62208e4, -60696e4, -
590025600, -575510400, -235612800, -194832e3, -177724800, -165715200,
107917200, 121226400, 133927200, 152676e3, 164685600, 184125600, 196221600,
215575200, 228880800, 245815200, 260330400, 267926400, 428464800, 433908e3,
468122400, 482806800, 496720800, 512528400, 528256800, 543978e3, 559706400,
575427600, 591156e3, 606877200, 622605600, 638326800, 65466e4, 670381200,
686109600, 701830800, 717559200, 733280400, 749008800, 764125200, 780458400,
796179600, 811908e3, 828234e3, 846381600, 859683600, 877831200, 891133200,
909280800, 922582800, 941335200, 954032400, 972784800, 985482e3, 1004234400,
1017536400, 1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3,
1111885200, 1130637600, 1143334800, 1162087200, 1174791600, 1193544e3,
1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600,
1301281200, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400,
1396234800, 1414296e3, 1427598e3, 1446955200, 1459047600, 1473206400,
1925002800
],
offset: [6952, 7016, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 10800, 14400, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 10800
]
},
"Europe/Zurich": {
time: [-3675196800, -2385244800, -904431600, -891122400, -872982e3, -859672800,
354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3,
465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4,
575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800,
686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3,
796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800,
909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3,
101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600,
1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400,
1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3,
1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800,
1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400,
1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200,
1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800,
1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600,
1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200,
1869098400, 1887850800, 1901152800, 1919300400, 1932602400
],
offset: [2048, 1786, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Australia/Sydney": {
time: [-2364076800, -1672531140, -1665352800, -883605600, -876088800, -860364e3, -
844639200, -828309600, -813189600, 57722400, 68007600, 89172e3, 100062e3,
120621600, 131511600, 152071200, 162961200, 183520800, 195015600, 215575200,
226465200, 247024800, 257914800, 278474400, 289364400, 309924e3, 320814e3,
341373600, 352263600, 372823200, 386737200, 404877600, 415767600, 436327200,
447217200, 467776800, 478666800, 499226400, 511326e3, 530071200, 542775600,
562125600, 57483e4, 59418e4, 606279600, 625629600, 636519600, 657079200,
667969200, 688528800, 699418800, 719978400, 731473200, 752032800, 762922800,
783482400, 794372400, 814932e3, 828241200, 846381600, 859690800, 877831200,
891140400, 909280800, 92259e4, 941335200, 954039600, 967341600, 985489200,
1004234400, 1017543600, 1035684e3, 1048993200, 1067133600, 1080442800,
1099188e3, 1111892400, 1130637600, 1143946800, 1162087200, 1174791600,
1193536800, 1207450800, 1223172e3, 1238900400, 1254621600, 127035e4,
1286071200, 1301799600, 1317520800, 1333249200, 1349575200, 1365303600,
1381024800, 1396753200, 1412474400, 1428202800, 1443924e3, 1459652400,
1475373600, 1491102e3, 1506823200, 1522551600, 1538877600, 1554606e3,
1570327200, 1586055600, 1601776800, 1617505200, 1633226400, 1648954800,
1664676e3, 1680404400, 1696125600, 1712458800, 172818e4, 1743908400,
1759629600, 1775358e3, 1791079200, 1806807600, 1822528800, 1838257200,
1853978400, 1869706800, 1886032800, 1901761200, 1917482400, 1933210800
],
offset: [36292, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600
]
},
"Australia/Brisbane": {
time: [-2366755200, -1672531140, -1665352800, -883605600, -876088800, -860364e3, -
844639200, -828309600, -813189600, 57722400, 68007600, 625629600, 636519600,
657079200, 667969200, 688528800, 699418800, 1925028e3
],
offset: [36728, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3
]
},
"Australia/Adelaide": {
time: [-2364076800, -2230156800, -1672531140, -1665352800, -883605600, -876088800, -
860364e3, -844639200, -828309600, -813189600, 57722400, 68007600, 89172e3,
100062e3, 120621600, 131511600, 152071200, 162961200, 183520800, 195015600,
215575200, 226465200, 247024800, 257914800, 278474400, 289364400, 309924e3,
320814e3, 341373600, 352263600, 372823200, 384318e3, 404877600, 415767600,
436327200, 447217200, 467776800, 478666800, 499226400, 511326e3, 530071200,
542775600, 562125600, 57483e4, 59418e4, 606279600, 625629600, 637729200,
657079200, 667969200, 688528800, 701233200, 719978400, 731473200, 752032800,
764132400, 783482400, 796186800, 814932e3, 828241200, 846381600, 859690800,
877831200, 891140400, 909280800, 92259e4, 941335200, 954039600, 972784800,
985489200, 1004234400, 1017543600, 1035684e3, 1048993200, 1067133600,
1080442800, 1099188e3, 1111892400, 1130637600, 1143946800, 1162087200,
1174791600, 1193536800, 1207450800, 1223172e3, 1238900400, 1254621600,
127035e4, 1286071200, 1301799600, 1317520800, 1333249200, 1349575200,
1365303600, 1381024800, 1396753200, 1412474400, 1428202800, 1443924e3,
1459652400, 1475373600, 1491102e3, 1506823200, 1522551600, 1538877600,
1554606e3, 1570327200, 1586055600, 1601776800, 1617505200, 1633226400,
1648954800, 1664676e3, 1680404400, 1696125600, 1712458800, 172818e4,
1743908400, 1759629600, 1775358e3, 1791079200, 1806807600, 1822528800,
1838257200, 1853978400, 1869706800, 1886032800, 1901761200, 1917482400,
1933210800
],
offset: [33260, 32400, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200,
37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800,
34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800, 34200, 37800
]
},
"Australia/ACT": {
time: [-2364076800, -1672531140, -1665352800, -883605600, -876088800, -860364e3, -
844639200, -828309600, -813189600, 57722400, 68007600, 89172e3, 100062e3,
120621600, 131511600, 152071200, 162961200, 183520800, 195015600, 215575200,
226465200, 247024800, 257914800, 278474400, 289364400, 309924e3, 320814e3,
341373600, 352263600, 372823200, 386737200, 404877600, 415767600, 436327200,
447217200, 467776800, 478666800, 499226400, 511326e3, 530071200, 542775600,
562125600, 57483e4, 59418e4, 606279600, 625629600, 636519600, 657079200,
667969200, 688528800, 699418800, 719978400, 731473200, 752032800, 762922800,
783482400, 794372400, 814932e3, 828241200, 846381600, 859690800, 877831200,
891140400, 909280800, 92259e4, 941335200, 954039600, 967341600, 985489200,
1004234400, 1017543600, 1035684e3, 1048993200, 1067133600, 1080442800,
1099188e3, 1111892400, 1130637600, 1143946800, 1162087200, 1174791600,
1193536800, 1207450800, 1223172e3, 1238900400, 1254621600, 127035e4,
1286071200, 1301799600, 1317520800, 1333249200, 1349575200, 1365303600,
1381024800, 1396753200, 1412474400, 1428202800, 1443924e3, 1459652400,
1475373600, 1491102e3, 1506823200, 1522551600, 1538877600, 1554606e3,
1570327200, 1586055600, 1601776800, 1617505200, 1633226400, 1648954800,
1664676e3, 1680404400, 1696125600, 1712458800, 172818e4, 1743908400,
1759629600, 1775358e3, 1791079200, 1806807600, 1822528800, 1838257200,
1853978400, 1869706800, 1886032800, 1901761200, 1917482400, 1933210800
],
offset: [36292, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3,
39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600,
36e3, 39600, 36e3, 39600, 36e3, 39600, 36e3, 39600
]
},
"Asia/Almaty": {
time: [-1441152e3, -1247529600, 354931200, 370742400, 386467200, 402278400,
418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3,
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
638330400, 654663600, 670384800, 686113200, 695786400, 701834400, 717562800,
733284e3, 749012400, 764733600, 780462e3, 796183200, 811911600, 828237600,
846385200, 859687200, 877834800, 891136800, 909284400, 922586400, 941338800,
954036e3, 972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
1067137200, 1080439200, 1099191600, 1925013600
],
offset: [18468, 18e3, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600,
25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200,
21600, 21600, 18e3, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200,
21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600,
25200, 21600, 25200, 21600, 25200, 21600, 25200, 21600
]
},
"Asia/Ashkhabad": {
time: [-1441152e3, -1247529600, 354931200, 370742400, 386467200, 402278400,
418003200, 433814400, 449625600, 465361200, 481082400, 496810800, 512532e3,
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
638330400, 654663600, 670384800, 686113200, 695786400, 192501e4
],
offset: [14012, 14400, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3,
21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600, 18e3, 21600,
18e3, 18e3, 14400, 18e3
]
},
"Asia/Tokyo": {
time: [-2587678861, -683769600, -672274800, -654739200, -640825200, -620265600, -
609375600, -588816e3, -577926e3, 1925024400
],
offset: [33539, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400]
},
"Asia/Taipei": {
time: [-2335219200, -1017792e3, -766191600, -745804800, -733795200, -716860800, -
699580800, -683856e3, -670636800, -65232e4, -639100800, -620784e3, -
607564800, -589248e3, -576028800, -562896e3, -541728e3, -528681600, -
510192e3, -497145600, -478656e3, -465609600, -449798400, -433987200, -
418176e3, -402451200, -38664e4, -370915200, -355104e3, -339379200, -
323568e3, -302486400, -291945600, -270950400, -260409600, 134006400,
149817600, 165542400, 181353600, 299635200, 307584e3, 1925020800
],
offset: [29160, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800
]
},
"Asia/Singapore": {
time: [-2177452800, -2038176e3, -1167609600, -1073001600, -894153600, -879638400, -
766972800, 378691200, 1925020800
],
offset: [24925, 24925, 25200, 26400, 26400, 27e3, 32400, 27e3, 28800]
},
"Asia/Shanghai": {
time: [-2177452800, -1600646400, -1585872e3, -933638400, -922060800, -908841600, -
888796800, -881020800, -767836800, -745804800, -733795200, -716860800, -
699580800, -683856e3, -670636800, -65232e4, -649987200, 515556e3, 527047200,
545191200, 558496800, 577245600, 589946400, 608695200, 622000800, 640144800,
653450400, 671594400, 6849e5, 1925020800
],
offset: [29143, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800
]
},
"Asia/Seoul": {
time: [-1948752e3, -1830384e3, -767318400, -681177600, -672192e3, -654739200, -
640828800, -623376e3, -609379200, -588816e3, -577929600, -498096e3, -
462672e3, -451699200, -429753600, -418262400, -399513600, -387417600, -
368064e3, -355968e3, -336614400, -324518400, -305164800, -293068800, -
264902400, 547610400, 560919600, 57906e4, 592369200, 1925024400
],
offset: [30472, 30600, 32400, 32400, 36e3, 32400, 36e3, 32400, 36e3, 32400, 36e3,
32400, 30600, 34200, 30600, 34200, 30600, 34200, 30600, 34200, 30600, 34200,
30600, 34200, 30600, 32400, 36e3, 32400, 36e3, 32400
]
},
"Asia/Tehran": {
time: [-1704153600, -757382400, 247190400, 259286400, 277776e3, 283996800,
290822400, 306547200, 322444800, 338515200, 673228800, 685497600, 701222400,
71712e4, 732758400, 748656e3, 764294400, 780192e3, 795830400, 811728e3,
827366400, 843264e3, 858988800, 874886400, 890524800, 906422400, 922060800,
937958400, 953596800, 969494400, 985219200, 1001116800, 1016755200,
1032652800, 1048291200, 1064188800, 1079827200, 1095724800, 1111449600,
1127347200, 1206057600, 1221955200, 123768e4, 1253577600, 1269216e3,
1285113600, 1300752e3, 1316649600, 1332288e3, 1348185600, 1363910400,
1379808e3, 1395446400, 1411344e3, 1426982400, 144288e4, 1458518400,
1474416e3, 1490140800, 1506038400, 1521676800, 1537574400, 1553212800,
1569110400, 1584748800, 1600646400, 1616371200, 1632268800, 1647907200,
1663804800, 1679443200, 1695340800, 1710979200, 1726876800, 1742601600,
1758499200, 1774137600, 1790035200, 1805673600, 1821571200, 1837209600,
1853107200, 1868745600, 1884643200, 1900368e3, 1916265600, 1931904e3
],
offset: [12344, 12344, 12600, 14400, 18e3, 14400, 12600, 16200, 12600, 16200, 12600,
16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200,
12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600,
16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200,
12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600,
16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200,
12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600,
16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600, 16200, 12600
]
},
"Asia/Dubai": {
time: [-1577923200, 1925006400],
offset: [13272, 14400]
},
"Asia/Kolkata": {
time: [-3645216e3, -3155673600, -2019686400, -891561600, -872035200, -862617600, -
764121600, 1925011800
],
offset: [21208, 21200, 19270, 19800, 23400, 19800, 23400, 19800]
},
"Asia/Hong_Kong": {
time: [-2056663398, -900882e3, -891547200, -884217600, -761176800, -747878400, -
728508600, -717021e3, -697059e3, -683757e3, -668028600, -654726600, -
636579e3, -623277e3, -605129400, -591827400, -573679800, -559773e3, -
541625400, -528323400, -510179400, -498083400, -478729800, -466633800, -
446675400, -435184200, -415225800, -403129800, -383776200, -371680200, -
352326600, -340230600, -320877e3, -308781e3, -288822600, -277331400, -
257373e3, -245881800, -225923400, -213827400, -194473800, -182377800, -
163024200, -148509e3, -132784200, -117059400, -101334600, -85609800, -
69280200, -53555400, -37830600, -22105800, -6381e3, 9343800, 25068600,
40793400, 56518200, 72243e3, 88572600, 104297400, 120022200, 126070200,
151471800, 167196600, 182921400, 198646200, 214371e3, 295414200, 309324600,
1925020800
],
offset: [27402, 28800, 32400, 30600, 32400, 28800, 32400, 28800, 32400, 28800,
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
28800, 32400, 28800, 32400, 28800
]
},
"Asia/Bangkok": {
time: [-2840140800, -1570060800, 1925017200],
offset: [24124, 24124, 25200]
},
"Asia/Chongqing": {
time: [-2177452800, -1600646400, -1585872e3, -933638400, -922060800, -908841600, -
888796800, -881020800, -767836800, -745804800, -733795200, -716860800, -
699580800, -683856e3, -670636800, -65232e4, -649987200, 515556e3, 527047200,
545191200, 558496800, 577245600, 589946400, 608695200, 622000800, 640144800,
653450400, 671594400, 6849e5, 1925020800
],
offset: [29143, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400,
28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800
]
},
"Asia/Jerusalem": {
time: [-2840140800, -1640995200, -933638400, -857347200, -844293600, -825811200, -
812678400, -794188800, -779846400, -762645600, -748303200, -731116800, -
681955200, -673228800, -667951200, -65232e4, -636415200, -62208e4, -
608936400, -59184e4, -572475600, -558568800, -542840400, -527724e3, -
514414800, -490838400, -482976e3, -459468e3, -451526400, -428544e3, -
418251600, -400024800, -387417600, 142387200, 150854400, 167184e3,
178675200, 334022400, 337654800, 452563200, 462243600, 482284800, 495590400,
516758400, 526435200, 545443200, 558489600, 576633600, 589334400, 609897600,
620784e3, 638323200, 651628800, 669772800, 683683200, 701827200, 715737600,
733708800, 747187200, 765158400, 778032e3, 796608e3, 810086400, 826848e3,
842832e3, 858902400, 874195200, 890352e3, 90504e4, 923018400, 936324e3,
955677600, 970794e3, 986778e3, 1001293200, 1017363600, 1033952400,
1048813200, 1065142800, 1081299600, 1095814800, 1112320800, 1128823200,
1143770400, 1159668e3, 117522e4, 1189908e3, 1206669600, 1223172e3,
1238119200, 1254016800, 1269568800, 1284256800, 1301623200, 1317520800,
1333072800, 1348365600, 1364522400, 1382839200, 1395972e3, 1414288800,
1427421600, 1445738400, 1458871200, 1477792800, 1490320800, 1509242400,
1521770400, 1540692e3, 1553824800, 1572141600, 1585274400, 1603591200,
1616724e3, 1635645600, 1648173600, 1667095200, 1679623200, 1698544800,
1711677600, 1729994400, 1743127200, 1761444e3, 1774576800, 1792893600,
1806026400, 1824948e3, 1837476e3, 1856397600, 1868925600, 1887847200,
190098e4, 1919296800, 1932429600
],
offset: [8454, 8440, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 14400, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200
]
},
"Asia/Kuwait": {
time: [-719625600, 1925002800],
offset: [11212, 10800]
},
"Asia/Muscat": {
time: [-1577923200, 1925006400],
offset: [13272, 14400]
},
"Asia/Qatar": {
time: [-1577923200, 76204800, 1925002800],
offset: [12368, 14400, 10800]
},
"Asia/Riyadh": {
time: [-719625600, 1925002800],
offset: [11212, 10800]
},
"Pacific/Auckland": {
time: [-3192393600, -1330293600, -1320012e3, -1300658400, -1287352800, -1269208800,
-1255903200, -1237759200, -1224453600, -1206309600, -1192399200, -117486e4,
-1160949600, -1143410400, -1125871200, -1112565600, -1094421600, -1081116e3,
-1062972e3, -1049666400, -1031522400, -1018216800, -1000072800, -986767200,
-968018400, -955317600, -936568800, -923263200, -757382400, 152676e3,
162356400, 183520800, 195015600, 215575200, 226465200, 247024800, 257914800,
278474400, 289364400, 309924e3, 320814e3, 341373600, 352263600, 372823200,
384318e3, 404877600, 415767600, 436327200, 447217200, 467776800, 478666800,
499226400, 510116400, 530676e3, 541566e3, 562125600, 573620400, 59418e4,
60507e4, 623815200, 637729200, 655264800, 669178800, 686714400, 700628400,
718164e3, 732682800, 749613600, 764132400, 781063200, 795582e3, 812512800,
827031600, 844567200, 858481200, 876016800, 889930800, 907466400, 921985200,
938916e3, 953434800, 970365600, 984884400, 100242e4, 1016334e3, 1033869600,
1047783600, 1065319200, 1079838e3, 1096768800, 1111287600, 1128218400,
1142737200, 1159668e3, 1174186800, 1191117600, 1207450800, 1222567200,
1238900400, 1254016800, 127035e4, 1285466400, 1301799600, 1316916e3,
1333249200, 1348970400, 1365303600, 138042e4, 1396753200, 1411869600,
1428202800, 1443319200, 1459652400, 1474768800, 1491102e3, 1506218400,
1522551600, 1538272800, 1554606e3, 1569722400, 1586055600, 1601172e3,
1617505200, 1632621600, 1648954800, 1664071200, 1680404400, 1695520800,
1712458800, 1727575200, 1743908400, 1759024800, 1775358e3, 1790474400,
1806807600, 1821924e3, 1838257200, 1853373600, 1869706800, 1885428e3,
1901761200, 1916877600, 1933210800
],
offset: [41944, 41400, 45e3, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200,
41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400, 43200, 41400,
43200, 41400, 43200, 41400, 43200, 41400, 43200, 43200, 46800, 43200, 46800,
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800,
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800,
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800,
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800,
43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200,
46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800, 43200, 46800
]
},
"Pacific/Chatham": {
time: [-3192393600, -757382400, 152678700, 162359100, 183523500, 195018300,
215577900, 226467900, 247027500, 257917500, 278477100, 289367100, 309926700,
320816700, 341376300, 352266300, 372825900, 384320700, 404880300, 415770300,
436329900, 447219900, 467779500, 478669500, 499229100, 510119100, 530678700,
541568700, 562128300, 573623100, 594182700, 605072700, 623817900, 637731900,
655267500, 669181500, 686717100, 700631100, 718166700, 732685500, 749616300,
764135100, 781065900, 795584700, 812515500, 827034300, 844569900, 858483900,
876019500, 889933500, 907469100, 921987900, 938918700, 953437500, 970368300,
984887100, 1002422700, 1016336700, 1033872300, 1047786300, 1065321900,
1079840700, 1096771500, 1111290300, 1128221100, 1142739900, 1159670700,
1174189500, 1191120300, 1207453500, 1222569900, 1238903100, 1254019500,
1270352700, 1285469100, 1301802300, 1316918700, 1333251900, 1348973100,
1365306300, 1380422700, 1396755900, 1411872300, 1428205500, 1443321900,
1459655100, 1474771500, 1491104700, 1506221100, 1522554300, 1538275500,
1554608700, 1569725100, 1586058300, 1601174700, 1617507900, 1632624300,
1648957500, 1664073900, 1680407100, 1695523500, 1712461500, 1727577900,
1743911100, 1759027500, 1775360700, 1790477100, 1806810300, 1821926700,
1838259900, 1853376300, 1869709500, 1885430700, 1901763900, 1916880300,
1933213500
],
offset: [44028, 44100, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500,
45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900, 49500, 45900,
49500, 45900, 49500, 45900, 49500, 45900, 49500
]
},
"Pacific/Fakaofo": {
time: [-2177452800, 1325203200, 1925038800],
offset: [-41096, -39600, 46800]
},
"Pacific/Honolulu": {
time: [-2334139200, -1157320800, -1155470400, -880236e3, -769429800, -765410400, -
712188e3, 1924956e3
],
offset: [-37886, -37800, -34200, -37800, -34200, -34200, -37800, -36e3]
},
"America/Mexico_City": {
time: [-1514763396, -1343091600, -1234828800, -1220317200, -1207180800, -1191369600,
-975283200, -963187200, -917136e3, -907372800, -821923200, -810086400, -
627523200, -613008e3, 828842400, 846381600, 860292e3, 877831200, 891741600,
909280800, 923191200, 941335200, 954640800, 972784800, 989114400,
1001815200, 1018144800, 1035684e3, 1049594400, 1067133600, 1081044e3,
1099188e3, 1112493600, 1130637600, 1143943200, 1162087200, 1175392800,
1193536800, 1207447200, 1224986400, 1238896800, 1256436e3, 1270346400,
1288490400, 1301796e3, 131994e4, 1333245600, 1351389600, 13653e5,
1382839200, 1396749600, 1414288800, 1428199200, 1445738400, 1459648800,
1477792800, 1491098400, 1509242400, 1522548e3, 1540692e3, 1554602400,
1572141600, 1586052e3, 1603591200, 1617501600, 1635645600, 1648951200,
1667095200, 1680400800, 1698544800, 1712455200, 1729994400, 1743904800,
1761444e3, 1775354400, 1792893600, 1806804e3, 1824948e3, 1838253600,
1856397600, 1869703200, 1887847200, 1901757600, 1919296800, 1933207200
],
offset: [-23796, -25200, -21600, -25200, -21600, -25200, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -18e3, -21600, -
18e3, -21600, -18e3, -21600, -18e3, -21600
]
},
"Africa/Cairo": {
time: [-2185401600, -929836800, -923097600, -906163200, -892857600, -875836800, -
857779200, -844300800, -825811200, -812678400, -794188800, -779846400, -
762652800, -399081600, -38664e4, -368323200, -355104e3, -336783600, -
323643600, -305161200, -292021200, -273625200, -260485200, -242089200, -
228949200, -210553200, -197413200, -178930800, -165790800, -147394800, -
134254800, -115858800, -102632400, -84322800, -71096400, -52700400, -
39474e3, -21164400, -7938e3, 10371600, 23598e3, 41907600, 55134e3, 7353e4,
86756400, 105066e3, 118292400, 136602e3, 149828400, 168138e3, 181364400,
199760400, 212986800, 231296400, 244522800, 262832400, 276058800, 294368400,
307594800, 325990800, 339217200, 357526800, 370753200, 396406800, 402289200,
426819600, 433825200, 452221200, 465447600, 483757200, 496983600, 515293200,
528519600, 546829200, 560055600, 578451600, 591678e3, 610419600, 623214e3,
641523600, 65475e4, 673059600, 686286e3, 704682e3, 717908400, 736218e3,
749444400, 767754e3, 780980400, 799027200, 812332800, 830476800, 843782400,
861926400, 875232e3, 893376e3, 906681600, 925430400, 938736e3, 95688e4,
970185600, 988329600, 1001635200, 1019779200, 1033084800, 1051228800,
1064534400, 1083283200, 1096588800, 1114732800, 1128038400, 1146182400,
1158883200, 1177632e3, 1189123200, 1209081600, 1219968e3, 1240531200,
1250812800, 1272585600, 1281484800, 1284076800, 1285891200, 1400198400,
1403827200, 1406851200, 1411689600, 1924999200
],
offset: [7509, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200
]
},
"Africa/Johannesburg": {
time: [-2458166400, -2109283200, -860968800, -845244e3, -829519200, -813794400,
1924999200
],
offset: [6720, 5400, 7200, 10800, 7200, 10800, 7200]
},
"Asia/Kathmandu": {
time: [-1577923200, 504921600, 1925012700],
offset: [20476, 19800, 20700]
},
"US/Mountain": {
time: [-2717668796, -1633298400, -1615154400, -1601848800, -1583704800, -1570399200,
-1551650400, -1538949600, -1534111200, -880236e3, -769417200, -765410400, -
147909600, -13158e4, -11646e4, -100130400, -84405600, -68680800, -52956e3, -
37231200, -21506400, -5781600, 9943200, 25668e3, 41392800, 57722400,
73447200, 89172e3, 104896800, 120621600, 126669600, 152071200, 162352800,
183520800, 199245600, 215575200, 230695200, 247024800, 262749600, 278474400,
294199200, 309924e3, 325648800, 341373600, 357098400, 372823200, 388548e3,
404877600, 419997600, 436327200, 452052e3, 467776800, 483501600, 499226400,
514951200, 530676e3, 544586400, 562125600, 576036e3, 59418e4, 607485600,
625629600, 638935200, 657079200, 670989600, 688528800, 702439200, 719978400,
733888800, 752032800, 765338400, 783482400, 796788e3, 814932e3, 828842400,
846381600, 860292e3, 877831200, 891741600, 909280800, 923191200, 941335200,
954640800, 972784800, 986090400, 1004234400, 1018144800, 1035684e3,
1049594400, 1067133600, 1081044e3, 1099188e3, 1112493600, 1130637600,
1143943200, 1162087200, 1173578400, 1194141600, 1205028e3, 1225591200,
1236477600, 1257040800, 1268532e3, 1289095200, 1299981600, 1320544800,
1331431200, 1351994400, 1362880800, 1383444e3, 1394330400, 1414893600,
142578e4, 1446343200, 1457834400, 1478397600, 1489284e3, 1509847200,
1520733600, 1541296800, 1552183200, 1572746400, 1583632800, 1604196e3,
1615687200, 1636250400, 1647136800, 16677e5, 1678586400, 1699149600,
1710036e3, 1730599200, 1741485600, 1762048800, 1772935200, 1793498400,
1804989600, 1825552800, 1836439200, 1857002400, 1867888800, 1888452e3,
1899338400, 1919901600, 1930788e3
],
offset: [-25196, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200, -21600, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -
21600, -25200, -21600, -25200, -21600, -25200, -21600, -25200, -21600, -
25200
]
},
"Europe/Helsinki": {
time: [-2890252800, -1535932800, -875664e3, -859762800, 354679200, 370407600,
386128800, 401857200, 417582e3, 433310400, 449031600, 465364800, 481086e3,
496814400, 512535600, 528264e3, 543985200, 559713600, 575434800, 591163200,
606884400, 622612800, 638334e3, 654667200, 670388400, 686116800, 701838e3,
717566400, 733287600, 749016e3, 764737200, 780465600, 796186800, 811915200,
828241200, 846388800, 859690800, 877838400, 891140400, 909288e3, 92259e4,
941342400, 954039600, 972792e3, 985489200, 1004241600, 1017543600,
1035691200, 1048993200, 1067140800, 1080442800, 1099195200, 1111892400,
1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3, 1206846e3,
1224993600, 1238295600, 1256443200, 1269745200, 1288497600, 1301194800,
1319947200, 1332644400, 1351396800, 1364698800, 1382846400, 1396148400,
1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5, 1490497200,
1509249600, 1521946800, 1540699200, 1554001200, 1572148800, 1585450800,
1603598400, 1616900400, 1635652800, 164835e4, 1667102400, 1679799600,
1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200, 1774753200,
1792900800, 1806202800, 1824955200, 1837652400, 1856404800, 1869102e3,
1887854400, 1901156400, 1919304e3, 1932606e3
],
offset: [5989, 5989, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200
]
},
"Europe/Stockholm": {
time: [-2871676800, -2208988800, -1692493200, -1680476400, 323834400, 338958e3,
354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3,
465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4,
575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800,
686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3,
796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800,
909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3,
101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600,
1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400,
1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3,
1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800,
1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400,
1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200,
1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800,
1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600,
1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200,
1869098400, 1887850800, 1901152800, 1919300400, 1932602400
],
offset: [4332, 3614, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Europe/Copenhagen": {
time: [-2524521600, -2398291200, -1692493200, -1680483600, -935107200, -85725e4, -
844552800, -828219600, -812498400, -79677e4, -781048800, -769381200, -
747007200, -736376400, -715212e3, -706741200, -683157600, -675291600,
323834400, 338958e3, 354679200, 370407600, 386128800, 401857200, 417578400,
433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3, 528260400,
543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400,
654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400,
764733600, 780462e3, 796183200, 811911600, 828237600, 846385200, 859687200,
877834800, 891136800, 909284400, 922586400, 941338800, 954036e3, 972788400,
985485600, 1004238e3, 101754e4, 1035687600, 1048989600, 1067137200,
1080439200, 1099191600, 1111888800, 1130641200, 1143338400, 1162090800,
1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3, 1256439600,
1269741600, 1288494e3, 1301191200, 1319943600, 1332640800, 1351393200,
1364695200, 1382842800, 1396144800, 1414292400, 1427594400, 1445742e3,
1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200, 1540695600,
1553997600, 1572145200, 1585447200, 1603594800, 1616896800, 1635649200,
1648346400, 1667098800, 1679796e3, 1698548400, 1711850400, 1729998e3,
17433e5, 1761447600, 1774749600, 1792897200, 1806199200, 1824951600,
1837648800, 1856401200, 1869098400, 1887850800, 1901152800, 1919300400,
1932602400
],
offset: [3020, 3020, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Atlantic/Reykjavik": {
time: [-1956614400, -1668214800, -1647212400, -1636678800, -161343e4, -1605142800, -
1581894e3, -1539565200, -153135e4, -968029200, -952293600, -942012e3, -
920239200, -909961200, -888789600, -877906800, -857944800, -846457200, -
826495200, -815007600, -795045600, -783558e3, -762991200, -752108400, -
731541600, -717634800, -700092e3, -686185200, -668642400, -654735600, -
636588e3, -623286e3, -605743200, -591836400, -573688800, -559782e3, -
542239200, -528332400, -510789600, -496882800, -47934e4, -465433200, -
447890400, -433983600, -415836e3, -401929200, -384386400, -370479600, -
352936800, -33903e4, -321487200, -307580400, -290037600, -276130800, -
258588e3, -244681200, -226533600, -212626800, -195084e3, -181177200, -
163634400, -149727600, -132184800, -118278e3, -100735200, -86828400, -
68680800, -54774e3, 1924992e3
],
offset: [-5280, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600,
0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -
3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600,
0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0, -
3600, 0, -3600, 0, -3600, 0, -3600, 0, -3600, 0
]
},
"Europe/Tallinn": {
time: [-2840140800, -1638316800, -1632002400, -1618693200, -1593820800, -1535932800,
-927936e3, -892944e3, -85725e4, -844552800, -828219600, -812498400, -
797644800, 354931200, 370742400, 386467200, 402278400, 418003200, 433814400,
449625600, 465361200, 481082400, 496810800, 512532e3, 528260400, 543981600,
55971e4, 575431200, 591159600, 606880800, 622609200, 638330400, 654663600,
670384800, 686113200, 701834400, 717562800, 733284e3, 749012400, 764733600,
780462e3, 796183200, 811911600, 828237600, 846385200, 859687200, 877834800,
891136800, 909288e3, 92259e4, 941342400, 1017543600, 1035691200, 1048993200,
1067140800, 1080442800, 1099195200, 1111892400, 1130644800, 1143342e3,
1162094400, 1174791600, 1193544e3, 1206846e3, 1224993600, 1238295600,
1256443200, 1269745200, 1288497600, 1301194800, 1319947200, 1332644400,
1351396800, 1364698800, 1382846400, 1396148400, 1414296e3, 1427598e3,
1445745600, 1459047600, 14778e5, 1490497200, 1509249600, 1521946800,
1540699200, 1554001200, 1572148800, 1585450800, 1603598400, 1616900400,
1635652800, 164835e4, 1667102400, 1679799600, 1698552e3, 1711854e3,
1730001600, 1743303600, 1761451200, 1774753200, 1792900800, 1806202800,
1824955200, 1837652400, 1856404800, 1869102e3, 1887854400, 1901156400,
1919304e3, 1932606e3
],
offset: [5940, 5940, 3600, 7200, 3600, 5940, 7200, 10800, 7200, 3600, 7200, 3600,
7200, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400,
10800, 14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200
]
},
"Europe/Riga": {
time: [-2840140800, -1632002400, -1618693200, -1601676e3, -1597266e3, -1377302400, -
928022400, -899510400, -85725e4, -844552800, -828219600, -812498400, -
79677e4, -795830400, 354931200, 370742400, 386467200, 402278400, 418003200,
433814400, 449625600, 465361200, 481082400, 496810800, 512532e3, 528260400,
543981600, 55971e4, 575431200, 591159600, 606880800, 622609200, 638330400,
654663600, 670384800, 686113200, 701834400, 717562800, 733284e3, 749012400,
764733600, 780462e3, 796183200, 811911600, 828237600, 843966e3, 859690800,
877838400, 891140400, 909288e3, 92259e4, 941342400, 985489200, 1004241600,
1017543600, 1035691200, 1048993200, 1067140800, 1080442800, 1099195200,
1111892400, 1130644800, 1143342e3, 1162094400, 1174791600, 1193544e3,
1206846e3, 1224993600, 1238295600, 1256443200, 1269745200, 1288497600,
1301194800, 1319947200, 1332644400, 1351396800, 1364698800, 1382846400,
1396148400, 1414296e3, 1427598e3, 1445745600, 1459047600, 14778e5,
1490497200, 1509249600, 1521946800, 1540699200, 1554001200, 1572148800,
1585450800, 1603598400, 1616900400, 1635652800, 164835e4, 1667102400,
1679799600, 1698552e3, 1711854e3, 1730001600, 1743303600, 1761451200,
1774753200, 1792900800, 1806202800, 1824955200, 1837652400, 1856404800,
1869102e3, 1887854400, 1901156400, 1919304e3, 1932606e3
],
offset: [5794, 5794, 9394, 5794, 9394, 5794, 7200, 10800, 7200, 3600, 7200, 3600,
7200, 3600, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200
]
},
"Europe/Vilnius": {
time: [-2840140800, -1672531200, -1585094400, -1561248e3, -1553558400, -928195200, -
900115200, -85725e4, -844552800, -828219600, -812498400, -802137600,
354931200, 370742400, 386467200, 402278400, 418003200, 433814400, 449625600,
465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4,
575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800,
686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3,
796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891140400,
909284400, 922586400, 941338800, 1048993200, 1067140800, 1080442800,
1099195200, 1111892400, 1130644800, 1143342e3, 1162094400, 1174791600,
1193544e3, 1206846e3, 1224993600, 1238295600, 1256443200, 1269745200,
1288497600, 1301194800, 1319947200, 1332644400, 1351396800, 1364698800,
1382846400, 1396148400, 1414296e3, 1427598e3, 1445745600, 1459047600,
14778e5, 1490497200, 1509249600, 1521946800, 1540699200, 1554001200,
1572148800, 1585450800, 1603598400, 1616900400, 1635652800, 164835e4,
1667102400, 1679799600, 1698552e3, 1711854e3, 1730001600, 1743303600,
1761451200, 1774753200, 1792900800, 1806202800, 1824955200, 1837652400,
1856404800, 1869102e3, 1887854400, 1901156400, 1919304e3, 1932606e3
],
offset: [6076, 5040, 5736, 3600, 7200, 3600, 10800, 7200, 3600, 7200, 3600, 7200,
10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800, 14400, 10800,
14400, 10800, 14400, 10800, 14400, 10800, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 7200, 3600, 7200, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800,
7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200, 10800, 7200,
10800, 7200, 10800, 7200, 10800, 7200
]
},
"America/Lima": {
time: [-2524521600, -1938556800, -1009843200, -1002067200, -986774400, -971049600, -
955324800, -9396e5, 504921600, 512697600, 536457600, 544233600, 631152e3,
638928e3, 757382400, 765158400, 1924974e3
],
offset: [-18492, -18516, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400,
-18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3
]
},
"America/Santiago": {
time: [-2524521600, -1892678400, -1688428800, -1619222400, -1593820800, -1336003200,
-13176e5, -1304380800, -1286064e3, -1272844800, -1254528e3, -1241308800, -
1222992e3, -1209772800, -1191369600, -1178150400, -870566400, -865296e3, -
740534400, -736387200, -718070400, -713667600, -36633600, -23932800, -
3369600, 7516800, 24451200, 37756800, 55900800, 69206400, 87955200,
100656e3, 118195200, 132105600, 150854400, 163555200, 182304e3, 195609600,
213753600, 227059200, 245203200, 258508800, 277257600, 289958400, 308707200,
321408e3, 340156800, 353462400, 371606400, 384912e3, 403056e3, 416361600,
434505600, 447811200, 46656e4, 479260800, 498009600, 510710400, 529459200,
545184e3, 560908800, 574214400, 592358400, 605664e3, 624412800, 637113600,
653443200, 668563200, 687312e3, 700617600, 718761600, 732067200, 750211200,
763516800, 781660800, 794966400, 813715200, 826416e3, 845164800, 85968e4,
876614400, 88992e4, 906854400, 923184e3, 939513600, 952819200, 971568e3,
984268800, 1003017600, 1015718400, 1034467200, 1047168e3, 1065916800,
1079222400, 1097366400, 1110672e3, 1128816e3, 1142121600, 1160870400,
1173571200, 119232e4, 1206835200, 1223769600, 1237075200, 1255219200,
1270339200, 1286668800, 1304812800, 1313884800, 1335657600, 1346544e3,
1367107200, 1378598400, 1398556800, 1410048e3, 1463270400, 1471132800,
149472e4, 1502582400, 1526169600, 1534032e3, 1554595200, 1567900800,
1586044800, 1599350400, 1617494400, 16308e5, 1648944e3, 1662249600,
1680393600, 1693699200, 1712448e3, 1725753600, 1743897600, 1757203200,
1775347200, 1788652800, 1806796800, 1820102400, 1838246400, 1851552e3,
1870300800, 1883001600, 1901750400, 1915056e3, 19332e5
],
offset: [-16966, -16966, -18e3, -16966, -14400, -16966, -14400, -18e3, -14400, -
18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -18e3, -14400, -
10800, -14400, -18e3, -14400, -10800, -14400, -10800, -14400, -10800, -
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -
14400, -10800, -14400, -10800, -14400, -10800, -14400, -10800, -14400, -
10800
]
},
"Asia/Bahrain": {
time: [-1577923200, 76204800, 1925002800],
offset: [12368, 14400, 10800]
},
"Asia/Jakarta": {
time: [-3231273600, -1451693568, -117288e4, -876614400, -766022400, -683856e3, -
620784e3, -189388800, 1925017200
],
offset: [25632, 25632, 26400, 27e3, 32400, 27e3, 28800, 27e3, 25200]
},
"Africa/Lagos": {
time: [-1588464e3, 1924995600],
offset: [816, 3600]
},
"Pacific/Norfolk": {
time: [-2177452800, -599616e3, 152071200, 162961200, 1443924e3, 1570327200,
1586055600, 1601776800, 1617505200, 1633226400, 1648954800, 1664676e3,
1680404400, 1696125600, 1712458800, 172818e4, 1743908400, 1759629600,
1775358e3, 1791079200, 1806807600, 1822528800, 1838257200, 1853978400,
1869706800, 1886032800, 1901761200, 1917482400, 1933210800
],
offset: [40312, 40320, 41400, 45e3, 41400, 39600, 43200, 39600, 43200, 39600, 43200,
39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600, 43200, 39600,
43200, 39600, 43200, 39600, 43200, 39600, 43200
]
},
"America/Juneau": {
time: [-3225169588, -2188987200, -880236e3, -769420800, -765410400, -21506400, -
5781600, 9943200, 25668e3, 41392800, 57722400, 73447200, 89172e3, 104896800,
120621600, 126669600, 152071200, 162352800, 183520800, 199245600, 215575200,
230695200, 247024800, 262749600, 278474400, 294199200, 309924e3, 325648800,
341373600, 357098400, 372823200, 388548e3, 404877600, 419997600, 436327200,
438998400, 452052e3, 467776800, 483501600, 499226400, 514951200, 530676e3,
544586400, 562125600, 576036e3, 59418e4, 607485600, 625629600, 638935200,
657079200, 670989600, 688528800, 702439200, 719978400, 733888800, 752032800,
765338400, 783482400, 796788e3, 814932e3, 828842400, 846381600, 860292e3,
877831200, 891741600, 909280800, 923191200, 941335200, 954640800, 972784800,
986090400, 1004234400, 1018144800, 1035684e3, 1049594400, 1067133600,
1081044e3, 1099188e3, 1112493600, 1130637600, 1143943200, 1162087200,
1173578400, 1194141600, 1205028e3, 1225591200, 1236477600, 1257040800,
1268532e3, 1289095200, 1299981600, 1320544800, 1331431200, 1351994400,
1362880800, 1383444e3, 1394330400, 1414893600, 142578e4, 1446343200,
1457834400, 1478397600, 1489284e3, 1509847200, 1520733600, 1541296800,
1552183200, 1572746400, 1583632800, 1604196e3, 1615687200, 1636250400,
1647136800, 16677e5, 1678586400, 1699149600, 1710036e3, 1730599200,
1741485600, 1762048800, 1772935200, 1793498400, 1804989600, 1825552800,
1836439200, 1857002400, 1867888800, 1888452e3, 1899338400, 1919901600,
1930788e3
],
offset: [54139, -32261, -28800, -25200, -25200, -28800, -25200, -28800, -25200, -
28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -
25200, -28800, -25200, -28800, -25200, -28800, -25200, -28800, -25200, -
28800, -28800, -28800, -25200, -28800, -25200, -28800, -25200, -32400, -
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -
28800, -32400, -28800, -32400, -28800, -32400, -28800, -32400, -28800, -
32400, -28800, -32400, -28800, -32400
]
},
"Asia/Ho_Chi_Minh": {
time: [-2004048e3, -1851552e3, -852080400, -782614800, -767836800, -718070400, -
457747200, -315622800, 171849600, 1925017200
],
offset: [25600, 25590, 25200, 28800, 32400, 25200, 28800, 25200, 28800, 25200]
},
"Australia/Perth": {
time: [-2337897600, -1672531140, -1665352800, -883605600, -876088800, -860364e3, -
844639200, 152071200, 162961200, 436327200, 447217200, 690343200, 699418800,
1165111200, 1174791600, 1193536800, 1206846e3, 1224986400, 1238295600,
1925020800
],
offset: [27804, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800,
32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800, 32400, 28800
]
},
"Europe/Malta": {
time: [-2403475200, -1690761600, -168048e4, -1664755200, -1648944e3, -163512e4, -
1616889600, -1604275200, -1585526400, -1571011200, -1555286400, -932428800,
-85725e4, -844552800, -828219600, -812584800, -798066e3, -781048800, -
76671e4, -750895200, -733352400, -719452800, -70191e4, -689205600, -
670453200, -114048e3, -103161600, -81993600, -71708400, -50544e3, -40258800,
-18489600, -8204400, 1296e4, 23245200, 43804800, 54694800, 75859200,
86749200, 102384e3, 118112400, 135734400, 148525200, 167191200, 180496800,
198640800, 211946400, 230090400, 243396e3, 26154e4, 274845600, 292989600,
306295200, 323316e3, 338349600, 354679200, 370407600, 386128800, 401857200,
417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3,
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3,
749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200,
859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3,
972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400,
1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3,
1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800,
1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400,
1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200,
1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800,
1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400,
1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200,
1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800,
1919300400, 1932602400
],
offset: [3484, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Europe/Amsterdam": {
time: [-4260211200, -1693699200, -168048e4, -1663452e3, -1650142800, -1633212e3, -
1617483600, -1601157600, -1586034e3, -1569708e3, -1554584400, -1538258400, -
1523134800, -15075e5, -1490562e3, -1470175200, -1459112400, -1443996e3, -
1427662800, -1406671200, -1396213200, -1376949600, -1364763600, -1345413600,
-1333314e3, -1313791200, -1301259600, -1282255200, -126981e4, -1250719200, -
1238360400, -1219183200, -1206910800, -1186956e3, -1175461200, -1156024800,
-1143406800, -1124488800, -1111957200, -1092952800, -1080507600, -
1061330400, -1049058e3, -1029189600, -1025740800, -1017608400, -998258400, -
986158800, -966722400, -954104400, -935020800, -85725e4, -844552800, -
828219600, -812498400, -79677e4, -781048800, -766616400, 228880800,
244004400, 260330400, 276058800, 29178e4, 307508400, 323834400, 338958e3,
354679200, 370407600, 386128800, 401857200, 417578400, 433306800, 449028e3,
465361200, 481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4,
575431200, 591159600, 606880800, 622609200, 638330400, 654663600, 670384800,
686113200, 701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3,
796183200, 811911600, 828237600, 846385200, 859687200, 877834800, 891136800,
909284400, 922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3,
101754e4, 1035687600, 1048989600, 1067137200, 1080439200, 1099191600,
1111888800, 1130641200, 1143338400, 1162090800, 1174788e3, 1193540400,
1206842400, 122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3,
1301191200, 1319943600, 1332640800, 1351393200, 1364695200, 1382842800,
1396144800, 1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400,
1490493600, 1509246e3, 1521943200, 1540695600, 1553997600, 1572145200,
1585447200, 1603594800, 1616896800, 1635649200, 1648346400, 1667098800,
1679796e3, 1698548400, 1711850400, 1729998e3, 17433e5, 1761447600,
1774749600, 1792897200, 1806199200, 1824951600, 1837648800, 1856401200,
1869098400, 1887850800, 1901152800, 1919300400, 1932602400
],
offset: [1172, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172,
4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172,
4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172,
4772, 1172, 4772, 1172, 4772, 1172, 4772, 1172, 4772, 4800, 1200, 4800,
1200, 4800, 1200, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
},
"Europe/Brussels": {
time: [-2840140800, -2450994150, -1740355200, -1693699200, -1680476400, -1663452e3,
-1650142800, -1632002400, -1618693200, -1613822400, -1604278800, -
1585526400, -1574038800, -1552262400, -1539997200, -1520553600, -1507510800,
-1490572800, -1473642e3, -1459123200, -1444006800, -1427673600, -1411952400,
-1396224e3, -1379293200, -1364774400, -1348448400, -1333324800, -1316394e3,
-1301259600, -1284328800, -126981e4, -1253484e3, -1238360400, -1221429600, -
1206910800, -1191189600, -1175461200, -1160344800, -1143406800, -1127685600,
-1111957200, -1096840800, -1080507600, -1063576800, -1049058e3, -1033336800,
-1017608400, -1002492e3, -986158800, -969228e3, -950475600, -942012e3, -
934664400, -85725e4, -844552800, -828219600, -812498400, -798066e3, -
781048800, -766616400, -745452e3, -733266e3, 228880800, 244004400,
260330400, 276058800, 29178e4, 307508400, 323834400, 338958e3, 354679200,
370407600, 386128800, 401857200, 417578400, 433306800, 449028e3, 465361200,
481082400, 496810800, 512532e3, 528260400, 543981600, 55971e4, 575431200,
591159600, 606880800, 622609200, 638330400, 654663600, 670384800, 686113200,
701834400, 717562800, 733284e3, 749012400, 764733600, 780462e3, 796183200,
811911600, 828237600, 846385200, 859687200, 877834800, 891136800, 909284400,
922586400, 941338800, 954036e3, 972788400, 985485600, 1004238e3, 101754e4,
1035687600, 1048989600, 1067137200, 1080439200, 1099191600, 1111888800,
1130641200, 1143338400, 1162090800, 1174788e3, 1193540400, 1206842400,
122499e4, 1238292e3, 1256439600, 1269741600, 1288494e3, 1301191200,
1319943600, 1332640800, 1351393200, 1364695200, 1382842800, 1396144800,
1414292400, 1427594400, 1445742e3, 1459044e3, 1477796400, 1490493600,
1509246e3, 1521943200, 1540695600, 1553997600, 1572145200, 1585447200,
1603594800, 1616896800, 1635649200, 1648346400, 1667098800, 1679796e3,
1698548400, 1711850400, 1729998e3, 17433e5, 1761447600, 1774749600,
1792897200, 1806199200, 1824951600, 1837648800, 1856401200, 1869098400,
1887850800, 1901152800, 1919300400, 1932602400
],
offset: [1050, 1050, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 0, 3600, 0, 3600,
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200,
3600, 7200, 3600
]
},
"Europe/Lisbon": {
time: [-1830386205, -1689555600, -1677798e3, -1667437200, -1647734400, -1635814800,
-1616198400, -1604365200, -1584662400, -1572742800, -155304e4, -1541206800,
-1521504e3, -1442451600, -1426809600, -1379293200, -1364774400, -1348448400,
-1333324800, -1316394e3, -1301270400, -1284339600, -1269820800, -1221440400,
-1206921600, -1191200400, -1175472e3, -1127696400, -1111968e3, -1096851600,
-1080518400, -1063587600, -1049068800, -1033347600, -1017619200, -
1002502800, -986169600, -969238800, -950486400, -942022800, -922665600, -
906944400, -891129600, -877309200, -873680400, -864e6, -857952e3, -
845859600, -842835600, -831340800, -825897600, -81441e4, -810781200, -
799891200, -794448e3, -782960400, -779331600, -768441600, -762998400, -
749091600, -733363200, -717631200, -701902800, -686181600, -670453200, -
654732e3, -639003600, -591832800, -575499600, -559778400, -54405e4, -
528328800, -512600400, -496879200, -481150800, -465429600, -449701200, -
43398e4, -417646800, -401925600, -386197200, -370476e3, -354747600, -
339026400, -323298e3, -307576800, -291848400, -276127200, -260398800, -
244677600, -228344400, -212623200, -196894800, -181173600, -165445200, -
149724e3, -133995600, -118274400, 212547600, 228268800, 243997200,
260323200, 276051600, 291772800, 307504800, 323222400, 338954400, 354675600,
370404e3, 386125200, 401853600, 417578400, 433303200, 449024400, 465357600,
481078800, 496807200, 512528400, 528256800, 543978e3, 559706400, 575427600,
591156e3, 606877200, 622605600, 638326800, 65466e4, 670381200, 686109600,
701830800, 717559200, 733284e3, 749012400, 764733600, 780462e3, 796183200,
811911600, 828237600, 846381600, 859683600, 877831200, 891133200, 909280800,
922582800, 941335200, 954032400, 972784800, 985482e3, 1004234400,
1017536400, 1035684e3, 1048986e3, 1067133600, 1080435600, 1099188e3,
1111885200, 1130637600, 1143334800, 1162087200, 1174784400, 1193536800,
1206838800, 1224986400, 1238288400, 1256436e3, 1269738e3, 1288490400,
1301187600, 131994e4, 1332637200, 1351389600, 1364691600, 1382839200,
1396141200, 1414288800, 1427590800, 1445738400, 1459040400, 1477792800,
149049e4, 1509242400, 1521939600, 1540692e3, 1553994e3, 1572141600,
1585443600, 1603591200, 1616893200, 1635645600, 1648342800, 1667095200,
1679792400, 1698544800, 1711846800, 1729994400, 1743296400, 1761444e3,
1774746e3, 1792893600, 1806195600, 1824948e3, 1837645200, 1856397600,
1869094800, 1887847200, 1901149200, 1919296800, 1932598800
],
offset: [-2205, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 7200, 3600, 0,
3600, 7200, 3600, 0, 3600, 7200, 3600, 0, 3600, 7200, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0
]
},
"Europe/Dublin": {
time: [-2821651200, -1691964e3, -1680469200, -1664143200, -1650142800, -1633903200,
-1617483600, -1601848800, -1586034e3, -1570399200, -1552165200, -1538344800,
-152253e4, -15075e5, -1490562e3, -1473631200, -1460926800, -1442786400, -
1428872400, -1410732e3, -1396213200, -1379282400, -1364763600, -1348437600,
-1333314e3, -1315778400, -1301259600, -1284328800, -126981e4, -1253484e3, -
1238360400, -1221429600, -1206910800, -118998e4, -1175461200, -1159135200, -
1143406800, -1126476e3, -1111957200, -1095631200, -1080507600, -1063576800,
-1049058e3, -1032127200, -1017608400, -1001282400, -986158800, -969228e3, -
950475600, -942012e3, -733352400, -719445600, -699483600, -684972e3, -
668034e3, -654732e3, -636584400, -622072800, -605739600, -590623200, -
57429e4, -558568800, -542235600, -527119200, -512600400, -496274400, -
481150800, -46422e4, -449701200, -432165600, -417646800, -401320800, -
386197200, -369266400, -354747600, -337816800, -323298e3, -306972e3, -
291848400, -276732e3, -257979600, -245282400, -22653e4, -213228e3, -
195080400, -182383200, -163630800, -150933600, -132181200, -119484e3, -
100731600, -88034400, -68677200, -59004e3, 57726e3, 69818400, 89175600,
101268e3, 120625200, 132717600, 152074800, 164167200, 183524400, 196221600,
214974e3, 227671200, 246423600, 259120800, 278478e3, 290570400, 309927600,
32202e4, 341377200, 354675600, 372823200, 386125200, 404272800, 417574800,
435722400, 449024400, 467776800, 481078800, 499226400, 512528400, 530676e3,
543978e3, 562125600, 575427600, 593575200, 606877200, 625629600, 638326800,
657079200, 670381200, 688528800, 701830800, 719978400, 733280400, 751428e3,
76473e4, 782877600, 796179600, 814327200, 828234e3, 846381600, 859683600,
877831200, 891133200, 909280800, 922582800, 941335200, 954032400, 972784800,
985482e3, 1004234400, 1017536400, 1035684e3, 1048986e3, 1067133600,
1080435600, 1099188e3, 1111885200, 1130637600, 1143334800, 1162087200,
1174784400, 1193536800, 1206838800, 1224986400, 1238288400, 1256436e3,
1269738e3, 1288490400, 1301187600, 131994e4, 1332637200, 1351389600,
1364691600, 1382839200, 1396141200, 1414288800, 1427590800, 1445738400,
1459040400, 1477792800, 149049e4, 1509242400, 1521939600, 1540692e3,
1553994e3, 1572141600, 1585443600, 1603591200, 1616893200, 1635645600,
1648342800, 1667095200, 1679792400, 1698544800, 1711846800, 1729994400,
1743296400, 1761444e3, 1774746e3, 1792893600, 1806195600, 1824948e3,
1837645200, 1856397600, 1869094800, 1887847200, 1901149200, 1919296800,
1932598800
],
offset: [-1500, -1521, 2079, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600,
0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0, 3600, 0,
3600, 0, 3600, 0, 3600, 0
]
},
"Europe/Oslo": {
time: [-2366755200, -1691881200, -1680566400, -927507600, -85725e4, -844552800, -
828219600, -812498400, -79677e4, -781048800, -765320400, -340840800, -
324507600, -308786400, -293058e3, -277336800, -261608400, -245887200, -
230158800, -214437600, -198709200, -182988e3, -166654800, -147909600, -
135205200, 323834400, 338958e3, 354679200, 370407600, 386128800, 401857200,
417578400, 433306800, 449028e3, 465361200, 481082400, 496810800, 512532e3,
528260400, 543981600, 55971e4, 575431200, 591159600, 606880800, 622609200,
638330400, 654663600, 670384800, 686113200, 701834400, 717562800, 733284e3,
749012400, 764733600, 780462e3, 796183200, 811911600, 828237600, 846385200,
859687200, 877834800, 891136800, 909284400, 922586400, 941338800, 954036e3,
972788400, 985485600, 1004238e3, 101754e4, 1035687600, 1048989600,
1067137200, 1080439200, 1099191600, 1111888800, 1130641200, 1143338400,
1162090800, 1174788e3, 1193540400, 1206842400, 122499e4, 1238292e3,
1256439600, 1269741600, 1288494e3, 1301191200, 1319943600, 1332640800,
1351393200, 1364695200, 1382842800, 1396144800, 1414292400, 1427594400,
1445742e3, 1459044e3, 1477796400, 1490493600, 1509246e3, 1521943200,
1540695600, 1553997600, 1572145200, 1585447200, 1603594800, 1616896800,
1635649200, 1648346400, 1667098800, 1679796e3, 1698548400, 1711850400,
1729998e3, 17433e5, 1761447600, 1774749600, 1792897200, 1806199200,
1824951600, 1837648800, 1856401200, 1869098400, 1887850800, 1901152800,
1919300400, 1932602400
],
offset: [2580, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600,
7200, 3600, 7200, 3600, 7200, 3600, 7200, 3600
]
}
}
},
"3t3b": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "dateFormatProperty", (function() {
return a
})), i.d(t, "restoreDateFormatSettingsValue", (function() {
return l
}));
var s = i("Vdly"),
r = i("m/cY"),
n = i("e1ZQ");
function o() {
return s.getValue("date_format", Object(n.c)())
}
const a = Object(r.a)(o());
function l() {
a.setValue(Object(n.c)()), s.remove("date_format")
}
s.onSync.subscribe(null, () => a.setValue(o())), a.listeners().subscribe(null, () => s.setValue(
"date_format", a.value()))
},
"3u3j": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("Eyy1"),
r = i("RDU5");
class n extends r.UndoCommand {
constructor(e, t, i) {
super(i), this._chartModel = e, this._sourceId = t.id();
const r = Object(s.ensureNotNull)(t.priceScale());
this._initialPriceScaleId = r.id(), this._initialPriceScaleState = Object(s
.ensureNotNull)(t.priceScale()).state();
const n = Object(s.ensureNotNull)(e.paneForSource(t));
this._initialPriceScalePosition = n.priceScalePosition(r), this
._initialPriceScaleIndex = n.priceScaleIndex(r, this
._initialPriceScalePosition), this._initialPaneIndex = e.panes()
.indexOf(n)
}
_newPriceScaleState(e) {
const t = {
...this._initialPriceScaleState
};
return delete t.m_isLockScale, delete t.id, delete t.m_topMargin, delete t
.m_bottomMargin, t
}
_originalPriceScaleState() {
return this._initialPriceScaleState
}
}
},
"4GHa": function(e, t) {
e.exports =
''
},
"4TVt": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolPriceAxisView", (function() {
return o
}));
var s = i("Eyy1"),
r = i("KcY8"),
n = i("Ulff");
class o extends r.a {
constructor(e, t) {
super(), this._active = !1, this._source = e, this._data = t
}
setActive(e) {
this._active = e
}
_updateRendererData(e, t, i) {
e.visible = !1;
const s = this._source.model();
if (!s.timeScale() || s.timeScale().isEmpty()) return;
const r = this._source.priceScale();
if (null === r || r.isEmpty()) return;
if (!s.selection().isSelected(this._source) && !this._source
.isForcedDrawPriceAxisLabel()) return;
if (null === s.timeScale().visibleBarsStrictRange()) return;
const o = this._source.priceAxisPoints(),
a = this._data.pointIndex;
if (o.length <= a) return;
const l = o[a];
if (!isFinite(l.price)) return;
const c = this._source.ownerSource(),
h = null !== c ? c.firstValue() : null;
if (null === h) return;
let u = this._active ? n.a.active : n.a.common;
this._data.backgroundProperty ? u = this._data.backgroundProperty.value() : this
._data.backgroundPropertyGetter && (u = this._data
.backgroundPropertyGetter()), i.background = u, i.borderColor =
"#2E84A6", i
.textColor = this.generateTextColor(u), i.coordinate = r.priceToCoordinate(l
.price, h), e.text = this._formatPrice(l.price, h), e.visible = !0
}
_formatPrice(e, t) {
return Object(s.ensureNotNull)(this._source.priceScale()).formatPrice(e, t)
}
}
},
"4bfY": function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX"),
o = n.LineToolWidthsProperty,
a = n.LineToolColorsProperty;
class l extends s {
constructor(e, t) {
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"FzRY", 7)).then(({
FibCirclesPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return l.LevelsCount
}
pointsCount() {
return 2
}
name() {
return "Fib Circles"
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
static createProperties(e) {
var t = new r("linetoolfibcircles", e, !1, {
range: [1, 11]
});
return l._configureProperties(t), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "6U6r")))
.FibCirclesDefinitionsViewModel
}
_snapTo45DegreesAvailable() {
return !0
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline")
.child("color")
], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child(
"linewidth")), i.push(e.child("level" + r).child("color"));
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
}
}
l.LevelsCount = 11, t.LineToolFibCircles = l
},
"4kQX": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "TimeFormatter", (function() {
return n
}));
var s = i("iboI"),
r = i("kcTO");
class n {
constructor(e) {
this._formatStr = e || "%h:%m:%s"
}
format(e) {
return s.customFormatters.timeFormatter ? s.customFormatters.timeFormatter.format(
e) : this._formatStr.replace("%h", Object(r.numberToStringWithLeadingZero)(e
.getUTCHours(), 2)).replace("%m", Object(r.numberToStringWithLeadingZero)(e
.getUTCMinutes(), 2)).replace("%s", Object(r.numberToStringWithLeadingZero)(
e.getUTCSeconds(), 2))
}
formatLocal(e) {
return s.customFormatters.timeFormatter ? s.customFormatters.timeFormatter
.formatLocal ? s.customFormatters.timeFormatter.formatLocal(e) : s
.customFormatters.timeFormatter.format(e) : this._formatStr.replace("%h",
Object(r.numberToStringWithLeadingZero)(e.getHours(), 2)).replace("%m",
Object(r.numberToStringWithLeadingZero)(e.getMinutes(), 2)).replace("%s",
Object(r.numberToStringWithLeadingZero)(e.getSeconds(), 2))
}
}
},
"4miz": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
})), i.d(t, "b", (function() {
return r
}));
class s {
constructor(e, t) {
this._visible = !0, this._title = e, this._value = t
}
title() {
return this._title
}
setTitle(e) {
this._title = e
}
text() {
return this._value
}
value() {
return this._value
}
setValue(e) {
this._value = e
}
visible() {
return this._visible
}
setVisible(e) {
this._visible = e
}
color() {
return this._color
}
setColor(e) {
this._color = e
}
}
class r {
constructor() {
this._items = [], this._header = "", this._title = ""
}
header() {
return this._header
}
title() {
return this._title
}
items() {
return this._items
}
update() {}
}
},
"4o++": function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "MagnetMode", (function() {
return s
})),
function(e) {
e[e.WeakMagnet = 0] = "WeakMagnet", e[e.StrongMagnet = 1] = "StrongMagnet"
}(s || (s = {}))
},
"4u8j": function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX"),
o = n.LineToolWidthsProperty,
a = n.LineToolColorsProperty;
class l extends s {
constructor(e, t) {
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"ZJWf", 7)).then(({
GannFanPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return l.LevelsCount
}
pointsCount() {
return 2
}
name() {
return "Gann Fan"
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "ASG6")))
.GannFanDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetoolgannfan", e, !1, {
range: [1, 9]
});
return l._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [], i = [], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r)
.child("linewidth")), i.push(e.child("level" + r).child("color"));
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
}
}
l.LevelsCount = 9, t.LineToolGannFan = l
},
"4vW/": function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "ColorType", (function() {
return s
})),
function(e) {
e.Solid = "solid", e.Gradient = "gradient"
}(s || (s = {}))
},
"53h+": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "findSuitableResolutionToBuildFrom", (function() {
return a
}));
var s = i("LxhU");
function r(e) {
throw console.error(e), e
}
function n(e, t) {
const i = t.multiplier();
for (let s = e.length - 1; s >= 0; s--) {
const r = Number(e[s]);
if (i % r == 0) return `${r}${t.letter()}`
}
return null
}
function o(e, t) {
const i = n(e, t);
if (null !== i) return i;
r(`Misconfiguration error: it is trying to request ${t.value()} but we cannot build it from lower resolution`)
}
function a(e, t) {
const i = s.Interval.parse(e);
if ((i.isWeeks() || i.isMonths()) && t.has_weekly_and_monthly) {
let e = ["1"];
i.isWeeks() && void 0 !== t.weekly_multipliers && (e = t.weekly_multipliers), i
.isMonths() && void 0 !== t.monthly_multipliers && (e = t.monthly_multipliers);
const s = n(e, i);
if (null !== s) return s
}
if (i.isDWM() && (void 0 === t.has_daily || t.has_daily)) return i.isDays() && void 0 !== t
.daily_multipliers ? o(t.daily_multipliers, i) : (void 0 === t.daily_multipliers ||
t.daily_multipliers.includes("1") || r(
"Misconfiguration error: it is trying to request a resolution but symbol does not support it"
), "1D");
if (i.isDWM() && r(
`Misconfiguration error: it is trying to request ${i.value()} but we cannot build it from lower resolution`
), i.isMinutes() && !t.has_intraday && r(
"Misconfiguration error: it is trying to request intraday resolution but symbol does not support it"
), i.isSeconds() && !t.has_seconds && r(
"Misconfiguration error: it is trying to request seconds resolution but symbol does not support it"
), i.isTicks()) return (!t.has_ticks || i.multiplier() > 1) && r(
`Misconfiguration error: it is trying to request ${i.multiplier()} ticks resolution but symbol does not support it`
), "1T";
const a = i.isSeconds() ? t.seconds_multipliers : t.intraday_multipliers;
return void 0 !== a ? o(a, i) : i.value()
}
},
"54XG": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "FavoriteStudyTemplateService", (function() {
return r
}));
var s = i("ulZB");
class r extends s.b {
constructor(e, t) {
super(e, t, "FAVORITE_STUDY_TEMPLATES_CHANGED", "StudyTemplates.quicks", [])
}
remove(e) {
this.set(this.get().filter(t => t !== e))
}
}
},
"585y": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
class s {
constructor(e) {
this._value = null, this._series = e, this._series.dataEvents().dataUpdated()
.subscribe(this, this._onSeriesUpdated)
}
destroy() {
this._series.dataEvents().dataUpdated().unsubscribeAll(this)
}
volume(e, t) {
if (null !== this._value && this._value.from === e && this._value.to === t)
return this._value.value;
let i = 0;
const s = this._series.data().bars(),
r = s.firstIndex(),
n = s.lastIndex();
if (null !== r && e < r && t < r || null !== n && e > n && t > n) i = NaN;
else {
const s = this._series.data().bars().rangeIterator(Math.min(e, t), Math.max(e,
t));
for (; s.hasNext();) {
const e = s.next().value[5];
if (void 0 === e) {
i = NaN;
break
}
i += e
}
}
return this._value = {
from: e,
to: t,
value: i
}, i
}
_onSeriesUpdated(e, t) {
if (null === this._value) return;
if (t) return void(this._value = null);
const i = this._series.data().bars().lastIndex();
(null === i || i <= this._value.to) && (this._value = null)
}
}
},
"5B3K": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyError", (function() {
return s
}));
class s extends Error {
constructor(e) {
super(e), this.studyError = !0
}
}
},
"5C6T": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PipFormatter", (function() {
return r
}));
var s = i("kcTO");
class r extends s.PriceFormatter {
constructor(e, t, i, s) {
t || (t = 1), "forex" !== i && "cfd" !== i || !s ? (super(1),
this._isForex = !1) : (super(s), this._isForex = !0), this
._pipPriceScale = e, this._pipMinMove = t, this._pipMinMove2 = s
}
format(e, t, i) {
let s = this._isForex ? this._pipMinMove2 : this._pipMinMove;
return void 0 === s && (s = NaN), super.format(e * this._pipPriceScale / s, t,
i)
}
}
},
"5JMW": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "isLineToolRiskReward", (function() {
return a
})), i.d(t, "LineDataSourceApi", (function() {
return c
}));
var s = i("Eyy1"),
r = i("ogJP");
const n = new Map([
["LineToolRiskRewardLong", 2],
["LineToolRiskRewardShort", 2],
["LineToolBezierQuadro", 3],
["LineToolBezierCubic", 4]
]);
function o(e) {
const t = n.get(e.toolname);
if (void 0 !== t) return t;
const i = e.pointsCount();
return -1 === i ? e.points().length : i
}
function a(e) {
return "LineToolRiskRewardLong" === e || "LineToolRiskRewardShort" === e
}
const l = ["alwaysShowStats", "entryPrice", "inputs.first bar time", "inputs.last bar time",
"interval", "linesWidths", "points", "snapTo45Degrees", "stopPrice", "symbol",
"symbolStateVersion", "currencyId", "unitId", "targetPrice", "zOrderVersion"
];
class c {
constructor(e, t, i) {
this._source = e, this._model = t, this._pointsConverter = i
}
isSelectionEnabled() {
return this._source.isSelectionEnabled()
}
setSelectionEnabled(e) {
this._source.setSelectionEnabled(e)
}
isSavingEnabled() {
return this._source.isSavedInChart()
}
setSavingEnabled(e) {
this._source.setSavingInChartEnabled(e)
}
isShowInObjectsTreeEnabled() {
return this._source.showInObjectTree()
}
setShowInObjectsTreeEnabled(e) {
this._source.setShowInObjectsTreeEnabled(e)
}
isUserEditEnabled() {
return this._source.userEditEnabled()
}
setUserEditEnabled(e) {
this._source.setUserEditEnabled(e)
}
bringToFront() {
this._model.bringToFront([this._source])
}
sendToBack() {
this._model.sendToBack([this._source])
}
getProperties() {
return this._source.properties().state(l, !0)
}
setProperties(e) {
this._setProps(this._source.properties(), e, "")
}
getPoints() {
let e = this._source.points();
const t = o(this._source);
return e.length > t && (Object(s.assert)(a(this._source.toolname)), e = e.slice(0,
t)), this._pointsConverter.dataSourcePointsToPriced(e)
}
setPoints(e) {
if (this._source.isFixed()) return;
const t = o(this._source);
if (t !== e.length) throw new Error(
`Wrong points count. Required: ${t}, provided: ${e.length}`);
const i = this._pointsConverter.apiPointsToDataSource(e);
this._model.startChangingLinetool(this._source), this._model.changeLinePoints(this
._source, i), this._model.endChangingLinetool(!0), this._source
.createServerPoints()
}
ownerSourceId() {
return Object(s.ensureNotNull)(this._source.ownerSource()).id()
}
changePoint(e, t) {
if (this._source.isFixed()) return;
const i = this._pointsConverter.apiPointsToDataSource([e])[0];
this._model.startChangingLinetool(this._source, {
...i
}, t), this._model.changeLinePoint({
...i
}), this._model.endChangingLinetool(!1), this._source.createServerPoints()
}
isHidden() {
return this._source.isSourceHidden()
}
getRawPoints() {
return this._source.points()
}
setRawPoint(e, t) {
this._model.startChangingLinetool(this._source, {
...t
}, e), this._model.changeLinePoint({
...t
}), this._model.endChangingLinetool(!1)
}
move(e, t) {
this._model.startMovingSources([this._source], {
logical: e
}, null, new Map), this._model.moveSources({
logical: t
}, new Map), this._model.endMovingSources(!1)
}
dataAndViewsReady() {
return this._source.dataAndViewsReady()
}
zorder() {
return this._source.zorder()
}
symbol() {
return this._source.properties().symbol.value()
}
currency() {
return this._source.properties().currencyId.value()
}
unit() {
return this._source.properties().unitId.value()
}
_setProps(e, t, i) {
for (const s in t) {
if (!t.hasOwnProperty(s)) continue;
const n = 0 === i.length ? s : `${i}.${s}`;
if (e.hasOwnProperty(s)) {
const i = t[s];
Object(r.isHashObject)(i) ? this._setProps(e[s], i, n) : e[s].setValue(i)
} else console.warn(`Unknown property "${n}"`)
}
}
}
},
"5VQP": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ContextMenuManager", (function() {
return s
}));
var s, r = i("tWVy");
! function(e) {
const t = [];
function s() {
Object(r.b)()
}
e.createMenu = async function(e, r = {}, n) {
const o = new((await Promise.all([i.e("react"), i.e(6), i.e(11), i.e(21), i.e(
22), i.e(24), i.e(28), i.e(48), i.e(52), i.e(60), i.e(
0), i.e(5), i.e(54), i.e("context-menu-renderer")]).then(i.bind(
null, "cbq4"))).ContextMenuRenderer)(e, r, () => {
const e = t.indexOf(o); - 1 !== e && t.splice(e, 1), void 0 !== n &&
n()
}, s);
return t.push(o), o
}, e.hideAll = s, e.getShown = function() {
for (let e = 0; e < t.length; e++)
if (t[e].isShown()) return t[e];
return null
}
}(s || (s = {}))
},
"5ZUI": function(e, t, i) {
"use strict";
var s = i("WPQD").LineToolTrendLine,
r = i("Ocx9").DefaultProperty;
class n extends s {
constructor(e, t) {
super(e, t || n.createProperties())
}
name() {
return "Ray"
}
static createProperties(e) {
var t = new r("linetoolray", e);
return n._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
t.LineToolRay = n
},
"5fI3": function(e, t, i) {
"use strict";
function s(e) {
return function(e) {
return "=" + JSON.stringify(e)
}(e)
}
function r(e) {
return "=" === e[0]
}
function n(e) {
if (!r(e)) return {
symbol: e
};
try {
return JSON.parse(e.slice(1))
} catch (t) {
return {
symbol: e
}
}
}
i.r(t), i.d(t, "encodeExtendedSymbolOrGetSimpleSymbolString", (function() {
return s
})), i.d(t, "isEncodedExtendedSymbol", (function() {
return r
})), i.d(t, "decodeExtendedSymbol", (function() {
return n
}))
},
"5mo2": function(e, t, i) {
"use strict";
i.r(t);
var s = i("jCNj"),
r = i("Y7w9"),
n = i("txPx"),
o = i("OBgQ");
const a = Object(n.getLogger)("Chart.Model.SessionSpec");
function l(e) {
return e >= 48 && e <= 57
}
class c {
constructor() {
this.entries = [], this.firstDayOfWeek = s.MONDAY, this.weekEndsCount = -1, this
.maxTradingDayLength = 0
}
parseSessions(e, t) {
var i;
if (this._clear(), this.timezone = e, "24x7" === (t = this._parseFirstDayOfWeek(t))
.toLowerCase())
for (const e of u) this.entries.push(c._createSessionEntry(e, 0, 0, 0, 0));
else {
let e = !1;
const i = new Map;
for (const s of t.split("|")) {
const t = s.split(":");
if (1 !== t.length && 2 !== t.length) {
a.logError("Bad session section: " + s);
continue
}
const r = 1 === t.length;
if (r) {
if (e) {
a.logError("Duplicated default section: " + s);
continue
}
e = !0
}
const n = r ? h : c._parseWorkingDays(t[1]);
for (const e of n) r && i.has(e) || i.set(e, t[0])
}
for (const e of u) {
const t = i.get(e);
if (void 0 !== t)
for (const i of t.split(",")) this.entries.push(c._parseSessionEntry(e,
i))
}
}
this.entries.sort(p);
const s = new Map;
for (const e of this.entries) {
const t = e.dayOfWeek();
s.set(t, e.length() + (null !== (i = s.get(t)) && void 0 !== i ? i : 0))
}
this.maxTradingDayLength = 0, s.forEach(e => {
this.maxTradingDayLength = Math.max(this.maxTradingDayLength, e)
}), this.weekEndsCount = 7 - s.size
}
static parseHolidaysAndCorrections(e, t, i) {
const r = new Map,
n = new Map,
o = e => {
const t = this._parseDay(e),
i = t.toString(),
s = n.get(i);
return void 0 !== s ? s : (n.set(i, t), t)
};
if ("" !== t) {
const e = [];
for (const i of t.split(",")) {
if (8 !== i.length) throw new Error("bad holiday date: " + i);
const t = o(i);
r.set(t, e)
}
}
if ("" === i) return r;
const a = s.get_timezone("Etc/UTC");
for (const e of i.split(";")) {
const t = e.split(":");
if (2 !== t.length) throw new Error("bad correction section: " + e);
const i = [];
if ("dayoff" !== t[0])
for (const e of t[0].split(",")) i.push(this._parseSessionEntry(1, e));
for (const e of t[1].split(",")) {
if (8 !== e.length) throw new Error("bad correction date: " + e);
const t = o(e),
n = s.get_day_of_week(s.get_cal(a, t.year, t.month - 1, t.day)),
l = [];
for (const e of i) l.push(new _(n, e.startOffset(), e.length()));
r.set(t, l)
}
}
return r
}
_clear() {
this.entries = [], this.timezone = "", this.firstDayOfWeek = s.MONDAY, this
.weekEndsCount = -1
}
_parseFirstDayOfWeek(e) {
const t = e.split(";");
if (t.length > 2) return a.logError(
"Only one `first day` specification expected @ session " + e), e;
if (1 === t.length) return e;
let i = 1;
let r = t[0].indexOf("-") >= 0 ? NaN : parseInt(t[0]);
return isNaN(r) && (i = 0, r = parseInt(t[1])), r < s.SUNDAY || r > s.SATURDAY ? (a
.logError(`Unexpected day index @ session: ${e}; day index ${r}`), e) : (
this.firstDayOfWeek = r, t[i])
}
static _parseDay(e) {
const t = parseInt(e.substring(0, 4)),
i = parseInt(e.substring(4, 6)),
s = parseInt(e.substring(6, 8));
return new o.a(t, i, s)
}
static _parseSessionEntry(e, t) {
let i = t.split("-");
2 !== i.length && (a.logError("Bad sessions entry: " + t), i = ["0000", "0000"]);
let s = 0,
r = i[0];
if (r.includes("F")) {
const e = r.split("F");
r = e[0], s = "" !== e[1] ? parseInt(e[1]) : 1
}
let n = 0,
o = i[1];
if (o.includes("F")) {
const e = o.split("F");
o = e[0], n = "" !== e[1] ? parseInt(e[1]) : 1
}
if (!this._isCorrectSession(r) || !this._isCorrectSession(o)) throw new Error(
"Incorrect entry syntax: " + t);
const l = r,
h = o;
return this._createSessionEntry(e, c._minutesFromHHMM(l), c._minutesFromHHMM(h), s,
n)
}
static _isCorrectSession(e) {
return 4 === e.length && l(e.charCodeAt(0)) && l(e.charCodeAt(1)) && l(e.charCodeAt(
2)) && l(e.charCodeAt(3))
}
static _parseWorkingDays(e) {
const t = [];
for (let i = 0; i < e.length; i++) {
const s = +e[i]; - 1 === t.indexOf(s) && t.push(s)
}
return t
}
static _minutesFromHHMM(e) {
return s.get_minutes_from_hhmm(e)
}
static _createSessionEntry(e, t, i, r, n) {
0 === i && (i = s.minutesPerDay), r === n && i <= t && (r += 1), r > 0 && (t -= r *
s.minutesPerDay), n > 0 && (i -= n * s.minutesPerDay);
return new _(e, t, i - t)
}
}
i.d(t, "workingDays", (function() {
return h
})), i.d(t, "workingDaysAndWeekEnds", (function() {
return u
})), i.d(t, "compareSessionEntries", (function() {
return p
})), i.d(t, "SessionEntry", (function() {
return _
})), i.d(t, "EntryIndex", (function() {
return m
})), i.d(t, "SessionSpec", (function() {
return g
}));
const h = [s.MONDAY, s.TUESDAY, s.WEDNESDAY, s.THURSDAY, s.FRIDAY],
u = [s.SUNDAY, s.MONDAY, s.TUESDAY, s.WEDNESDAY, s.THURSDAY, s.FRIDAY, s.SATURDAY];
function d(e, t) {
return e.compareTo(t) < 0
}
function p(e, t) {
return e.compareTo(t)
}
class _ {
constructor(e, t, i) {
this._dayOfWeek = e,
this._start = t, this._length = i
}
start() {
return this._start + s.minutesPerDay * this.sessionStartDaysOffset()
}
startOffset() {
return this._start
}
sessionStartDaysOffset() {
return this._start >= 0 ? 0 : this._start % s.minutesPerDay == 0 ? -Math.ceil(this
._start / s.minutesPerDay) : -Math.floor(this._start / s.minutesPerDay)
}
sessionEndDaysOffset() {
const e = this._start + this._length;
return e >= 0 ? 0 : e % s.minutesPerDay == 0 ? -Math.ceil(e / s.minutesPerDay) : -
Math.floor(e / s.minutesPerDay)
}
isOvernight() {
return this._start < 0
}
dayOfWeek() {
return this._dayOfWeek
}
sessionStartDayOfWeek() {
let e = this._dayOfWeek - this.sessionStartDaysOffset();
return e < s.SUNDAY && (e += 7), e
}
sessionEndDayOfWeek() {
let e = this.sessionStartDayOfWeek() + this.sessionEndDaysOffset();
return e > s.SATURDAY && (e = 1), e
}
length() {
return this._length
}
weight() {
return this._dayOfWeek * s.minutesPerDay + this._start
}
compareTo(e) {
const t = this.weight(),
i = t + this._length,
s = e.weight(),
r = s + e._length;
return t <= s && s < i || s <= t && t < r ? 0 : t > s ? 1 : -1
}
contains(e) {
const t = 60 * s.get_hours(e) + s.get_minutes(e);
let i = s.get_day_of_week(e) - this._dayOfWeek;
i > 0 && (i -= 7);
const r = i * s.minutesPerDay + t;
return r >= this._start && r < this._start + this._length
}
}
class m {
constructor(e, t, i) {
this.weekIndex = e, this.entryIndex = t, this.entries = i
}
getEntry() {
return this.entries[this.entryIndex]
}
}
function f(e, t) {
const i = Object(r.lowerbound)(e, t, (e, t) => -1 === e.day.compareTo(t));
return i === e.length ? null : e[i]
}
class g {
constructor(e = "Etc/UTC", t = "0000-0000", i = "", r = "") {
this._entries = [], this._firstDayOfWeek = s.MONDAY, this._entriesHash = new Map,
this._holidayAndCorrectionMap = new Map, this._holidaySessions = [];
const n = new c;
n.parseSessions(e, t), this._entries = n.entries, this._timezone = n.timezone, this
._firstDayOfWeek = n.firstDayOfWeek, this._weekEndsCount = n.weekEndsCount, this
._maxTradingDayLength = n.maxTradingDayLength;
const o = c.parseHolidaysAndCorrections(e, i, r),
a = s.get_timezone(e);
this._isThereCorrections = "" !== i || "" !== r, o.forEach((e, t) => {
this._holidayAndCorrectionMap.set(t.toString(), e), this
._holidaySessions.push({
day: t,
sessions: e
});
const i = this.getWeekIndex(t.toCalendar(a));
this._entriesHash.set(i, null)
}), this._holidaySessions.sort((e, t) => e.day.compareTo(t.day))
}
entries() {
return this._entries
}
timezone() {
return this._timezone
}
firstDayOfWeek() {
return this._firstDayOfWeek
}
addSessionEntry(e, t, i, r, n) {
0 === i && (i = s.minutesPerDay), r === n && i <= t && (r += 1), r > 0 && (t -= r *
s.minutesPerDay), n > 0 && (i -= n * s.minutesPerDay);
const o = i - t;
this._entries.push(new _(e, t, o))
}
longestSessionLength() {
let e = 0,
t = 0;
for (const t of this._holidaySessions) t.sessions.forEach(t => {
e = Math.max(e, t.length())
});
return this._entries.forEach(e => {
t = Math.max(t, e.length())
}), Math.max(e, t)
}
isWeekEnd(e) {
const t = Object(r.lowerbound)(this._entries, new _(e, 0, 0), (e, t) => e
.dayOfWeek() < t.dayOfWeek());
return t > this._entries.length - 1 || this._entries[t].dayOfWeek() !== e
}
isCalWeekEnd(e) {
const t = s.get_day_of_week(e);
if (!this._isThereCorrections) return this.isWeekEnd(t);
const i = o.a.fromCalendar(e),
r = this._holidayAndCorrectionMap.get(i.toString());
return void 0 === r ? this.isWeekEnd(t) : 0 === r.length
}
hasWeekEnds() {
return this.weekEndsCount() > 0
}
weekEndsCount() {
return this._weekEndsCount
}
maxTradingDayLength() {
return this._maxTradingDayLength
}
holidaysFromYearStart(e) {
if (!this._isThereCorrections) return 0;
const t = s.get_timezone(this._timezone),
i = new o.a(s.get_year(e), s.JANUARY, 1),
r = o.a.fromCalendar(e);
let n = 0;
const a = this._selectHolidays(i, r);
for (let e = 0; e < a.length; e++) {
const i = a[e].day.toCalendar(t);
this.isWeekEnd(s.get_day_of_week(i)) ? n += 0 === a[e].sessions.length ? 0 : -
1 : n += 0 === a[e].sessions.length ? 1 : 0
}
return n
}
intradayCanBeBuiltFrom24x7(e) {
return this._entries.every(t => t.start() % e == 0 && t.length() % e == 0)
}
indexOfSession(e, t, i) {
const n = this._getEntriesForWeek(e);
let o = Object(r.lowerbound)(n, new _(t, i, 0), d);
if (o !== n.length) return new m(e, o, n);
let a = e;
const l = 7 - t + this._firstDayOfWeek - 1;
for (i = -(s.minutesPerDay - i + l * s.minutesPerDay);;) {
a++;
const e = this._getEntriesForWeek(a);
if (0 !== e.length) return o = Object(r.lowerbound)(e, new _(this
._firstDayOfWeek, i, 0), d), new m(a, o, e)
}
}
findSession(e, t, i, s = 0) {
const r = this.indexOfSession(e, t, i),
n = r.entries;
let o = r.entryIndex;
if (0 !== s) {
const e = n[o].dayOfWeek(),
t = s > 0 ? 1 : -1;
for (;;) {
const i = o + t;
if (i < 0 || i >= n.length || n[i].dayOfWeek() !== e) break;
o = i
}
}
return new m(r.weekIndex, o, n)
}
getWeekIndex(e) {
if (!this._isThereCorrections) return 0;
const t = s.get_day_of_week(e) - s.SUNDAY,
i = s.get_timezone("Etc/UTC"),
r = s.get_cal(i, s.get_year(e), s.get_month(e), s.get_day_of_month(e) - t);
return Math.floor((r.getTime() + 621672192e5) / 1e3 / 86400 / 7)
}
correctTradingDay(e) {
const t = s.get_day_of_week(e),
i = 60 * s.get_hours(e) + s.get_minutes(e),
r = this.getWeekIndex(e),
n = this.findSession(r, t, i, 0),
o = n.getEntry().dayOfWeek() - t + 7 * (n.weekIndex - r);
return 0 !== o && s.add_date(e, o), e
}
alignToSessionStart(e, t = 0) {
const i = s.get_day_of_week(e),
r = 60 * s.get_hours(e) + s.get_minutes(e),
n = this.getWeekIndex(e),
o = this.findSession(n, i, r, t),
a = o.getEntry(),
l = a.dayOfWeek() - i + 7 * (o.weekIndex - n);
0 !== l && s.add_date(e, l);
const c = a.startOffset();
return s.set_hms(e, c / 60, c % 60, 0, 0, s.get_timezone(this._timezone)), a
.length()
}
businessDaysToCalendarDays(e, t) {
let i = this.getWeekIndex(e),
r = s.get_day_of_week(e),
n = 0,
o = 0;
for (; o < t;) {
const e = this._getEntriesForWeek(i);
let a = 0;
for (let i = r; i <= s.SATURDAY; i++) {
n++;
let s = !0;
for (; a < e.length && !(e[a].dayOfWeek() > i);) e[a].dayOfWeek() < i ||
s && (s = !1, o++), a++;
if (o >= t) return n
}
i++, r = s.SUNDAY
}
return n
}
calendarDaysToBusinessDays(e, t) {
let i = this.getWeekIndex(e),
r = s.get_day_of_week(e),
n = 0,
o = 0;
for (; n < t;) {
const e = this._getEntriesForWeek(i);
let a = 0;
for (let i = r; i <= s.SATURDAY; i++) {
n++;
let s = !0;
for (; a < e.length && !(e[a].dayOfWeek() > i);) e[a].dayOfWeek() < i ||
s && (s = !1, o++), a++;
if (n >= t) return o
}
i++, r = s.SUNDAY
}
return o
}
alignToNearestSessionStart(e, t) {
return this._alignToNearestSessionValue(e, t, this._entrySessionStart.bind(this))
}
alignToNearestSessionEnd(e, t) {
return this._alignToNearestSessionValue(e, t, this._entrySessionEnd.bind(this))
}
leftBorderOfDailyBar(e) {
const t = this._getEntriesForDay(e);
return 0 === t.length ? null : (t.sort(p), this._getLeftEntryBorder(e, t[0]))
}
bordersOfDailyBar(e) {
const t = this._getEntriesForDay(e);
if (0 === t.length) return null;
t.sort(p);
const i = this._getLeftEntryBorder(e, t[0]),
r = t[t.length - 1],
n = s.clone(e);
let o = 60 * (r.startOffset() + r.length()) - 1;
const a = Math.floor(o / 3600);
return o -= 3600 * a, s.set_hms(n, a, o / 60, o % 60, 0, s.get_timezone(this
._timezone)), {
from: i,
to: n
}
}
getEntriesForWeekByCalendar(e) {
const t = this.getWeekIndex(e);
return this._getEntriesForWeek(t)
}
_getEntriesForWeek(e) {
let t = this._entriesHash.get(e);
if (void 0 === t) return this._entries;
if (null !== t) return t;
const i = s.get_timezone(this._timezone);
t = this._entries.slice();
const r = this._weekIndexToCalendar(e),
n = this._weekIndexToCalendar(e + 1),
a = o.a.fromCalendar(r),
l = o.a.fromCalendar(n),
c = this._selectHolidays(a, l);
for (const e of c) {
const r = e.day.toCalendar(i),
n = s.get_day_of_week(r);
t = t.filter(e => e.dayOfWeek() !== n), t = t.concat(e.sessions)
}
return t.sort(p), this._entriesHash.set(e, t), t
}
_selectHolidays(e, t) {
const i = [];
let s = e;
for (;;) {
const e = f(this._holidaySessions, s);
if (null === e) return i;
if (!e.day.before(t)) return i;
i.push(e), s = e.day.addDays(1)
}
}
_weekIndexToCalendar(e) {
const t = 1e3 * (86400 * e * 7 + 86400) - 621672192e5,
i = s.get_cal_from_unix_timestamp_ms(s.get_timezone("Etc/UTC"), t),
r = s.get_timezone("Etc/UTC");
return s.get_cal(r, s.get_year(i), s.get_month(i), s.get_day_of_month(i))
}
_alignToNearestSessionValue(e, t, i) {
const r = s.get_day_of_week(e),
n = 60 * s.get_hours(e) + s.get_minutes(e),
o = this.getWeekIndex(e);
let a = this.findSession(o, r, n);
if (a.getEntry().contains(e) && o === a.weekIndex || 1 === t) return i(a, s.clone(
e), t);
let l = a.entryIndex - 1;
if (l < 0) {
let e = a.weekIndex,
t = a.entries;
for (; l < 0;) e--, t = this._getEntriesForWeek(e), l += t.length;
a = new m(e, l, t)
} else a = new m(a.weekIndex, l, a.entries);
return i(a, s.clone(e), t)
}
_entrySessionStart(e, t, i) {
return this._entrySessionValue(e, t, i, e => 60 * e.start())
}
_entrySessionEnd(e, t, i) {
return this._entrySessionValue(e, t, i, e => 60 * (e.start() + e.length()) - 1)
}
_entrySessionValue(e, t, i, r) {
let n = s.get_day_of_week(t);
const o = e.getEntry();
let a = o.dayOfWeek() - o.sessionStartDaysOffset();
const l = this.getWeekIndex(t);
let c = e.weekIndex - l,
h = !1;
if (a < s.SUNDAY && (c <= 0 ? h = !0 : c--, a += 7), (c > 0 && i >= 0 || c < 0 &&
i < 0) && s.add_date(t, 7 * c), !o.contains(t)) {
let e = a - n;
h && i < 0 && (e = -(7 - a + n)), s.add_date(t, e), n = s.get_day_of_week(t)
}
o.isOvernight() && n === o.dayOfWeek() && s.add_date(t, -o
.sessionStartDaysOffset());
let u = r(o);
const d = Math.floor(u / 3600);
return u -= 3600 * d, s.set_hms(t, d, u / 60, u % 60, 0, s.get_timezone(this
._timezone)), t
}
_getEntriesForDay(e) {
const t = s.get_day_of_week(e);
return this._getEntriesForWeek(this.getWeekIndex(e)).filter(e => e.dayOfWeek() ===
t)
}
_getLeftEntryBorder(e, t) {
const i = s.clone(e),
r = t.startOffset();
return s.set_hms(i, r / 60, r % 60, 0, 0, s.get_timezone(this._timezone)), i
}
}
},
"5rJj": function(e, t, i) {
"use strict";
(function(t) {
var s = i("ogJP").isSameType,
r = i("Ocx9").DefaultProperty;
function n(e, t, i, s) {
this._map = Object.assign({}, this._map, s), t && (t = this.unpackLevels(t)), r
.call(this, e, t, i)
}
inherit(n, r), n.prototype.state = function(e, i) {
e = e || [];
var s = t.prototype.state.call(this, e);
return i ? s : this.packLevels(s)
}, n.prototype.clone = function() {
for (var e = this.state(), t = new n(this._defaultName, e), i = 0; i < this
._exclusions.length; ++i) t.addExclusion(this._exclusions[i]);
return t
}, n.prototype.merge = function(e, i) {
return t.prototype.merge.call(this, this.unpackLevels(e), i)
}, n.prototype._map = {
prefixes: [""],
range: [0, 0],
names: ["coeff", "color", "visible", "linestyle", "linewidth"],
typecheck: {
pack: Object,
unpack: Array
}
}, n.prototype._packLvlTpl = function() {
return []
}, n.prototype._unpackLvlTpl = function() {
return {}
}, n.prototype._packLvlFill = function(e, t, i, s) {
return s.push(i[t]), s
}, n.prototype._unpackLvlFill = function(e, t, i, s) {
return s[t] = i[e], s
}, n.prototype._iterateLevels = function(e, t) {
for (var i in this._map.prefixes)
for (var r = (this._map.prefixes[i] || "") + "level", n = this._map.range[
0]; n <= this._map.range[1]; n++)
if (e[r + n] && s(e[r + n], t.typecheck())) {
var o = t.tpl();
for (var a in this._map.names) o = t.fill(a, this._map.names[a], e[
r + n], o);
e[r + n] = o
} return e
}, n.prototype.packLevels = function(e) {
return this._iterateLevels(e, {
tpl: this._packLvlTpl,
fill: this._packLvlFill,
typecheck: this._map.typecheck.pack
})
}, n.prototype.unpackLevels = function(e) {
return this._iterateLevels(e, {
tpl: this._unpackLvlTpl,
fill: this._unpackLvlFill,
typecheck: this._map.typecheck.unpack
})
}, n.prototype.saveDefaults = function() {
TradingView.saveDefaults(this._defaultName, this.state(this._exclusions, !0))
}, e.exports = n
}).call(this, i("tc+8"))
},
"5vwb": function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return n
})), i.d(t, "a", (function() {
return o
}));
var s = i("tqok"),
r = i("hsV8");
function n(e, t) {
for (const i of e.points) {
if (i.index >= t.length) return null;
if (t[i.index] === s.INVALID_TIME_POINT_INDEX) return null
}
return {
points: e.points.map(e => ({
index: t[e.index],
offset: e.offset,
level: e.level
}))
}
}
function o(e, t, i) {
return {
id: t,
points: e.points.map(e => ({
...e,
index: Object(r.ensureTimePointIndexIndex)(i.indexOf(e.index))
}))
}
}
},
"68at": function(e, t, i) {
"use strict";
var s = i("5rJj"),
r = i("7ADh").LineToolFibWedgeBase,
n = i("j3hX").LineToolColorsProperty;
class o extends r {
constructor(e, t) {
super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"jlk4", 7)).then(({
ProjectionLinePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return 1
}
name() {
return "Projection"
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "LzAw")))
.ProjectionDefinitionsViewModel
}
static createProperties(e) {
var t = new s("linetoolprojection", e, !1, {
range: [1, 1]
});
return o._configureProperties(t), t
}
static _configureProperties(e) {
r._configureProperties(e), e.addChild("linesColors", new n([e.trendline.color]))
}
}
t.LineToolProjection = o
},
"6I19": function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return w
})), i.d(t, "c", (function() {
return P
})), i.d(t, "a", (function() {
return C
}));
var s = i("Eyy1"),
r = i("ivNn"),
n = i("eJTA"),
o = i("YFKU"),
a = i("qFKp"),
l = i("Tmoa"),
c = i("Ialn"),
h = i("k9/m"),
u = i("CW80"),
d = i("mMWL"),
p = i("GH0z"),
_ = i("38az"),
m = i("7qT/"),
f = i("xCUR");
const g = a.CheckMobile.any(),
b = g && !0,
v = new p.PercentageFormatter,
S = window.t("n/a"),
y = `${S} (${S}%)`;
function w(e, t) {
const i = Object(n.parseRgb)(t),
s = Object(n.parseRgb)(e);
return Object(n.distanceRgb)(i, s) < 70 ? Object(n.rgbToHexString)(Object(n.invertRgb)(i)) :
t
}
function P(e) {
if (null === e) return null;
const t = e.properties().child("background");
return void 0 === t ? null : t.value()
}
class C {
constructor(e, t) {
this._series = e, this._model = t, this._emptyValues = [{
title: Object(o.t)("Open"),
visible: !1,
value: "",
index: 0,
id: ""
}, {
title: Object(o.t)("High"),
visible: !1,
value: "",
index: 1,
id: ""
}, {
title: Object(o.t)("Low"),
visible: !1,
value: "",
index: 2,
id: ""
}, {
title: Object(o.t)("Close"),
visible: !1,
value: "",
index: 3,
id: ""
}, {
title: "",
visible: !1,
value: "",
index: 4,
id: ""
}, {
title: "",
visible: !1,
value: "",
index: 5,
id: ""
}, {
title: Object(o.t)("Change"),
visible: !1,
value: "",
index: 6,
id: ""
}]
}
getItems() {
return this._emptyValues
}
getValues(e) {
const t = this._showLastPriceAndChangeOnly(),
i = this._emptyValues.map(e => ({
...e,
visible: !t
}));
i[0].value = S, i[1].value = S, i[2].value = S, i[3].value = S, i[6].value = y, i[5]
.visible = !1;
const n = i[4];
if (n.value = S, n.visible = !1, this._model.timeScale().isEmpty() || 0 === this
._series.bars().size() || this._series.priceScale().isEmpty()) return i;
Object(r.isNumber)(e) || (e = Object(s.ensureNotNull)(this._series.data().last())
.index);
const o = this._series.nearestIndex(e, h.PlotRowSearchMode.NearestLeft);
if (void 0 === o) return i;
const a = this._series.data().valueAt(o),
u = P(this._series.model().paneForSource(this._series));
if (null === a || null === u) return i;
const d = a[1],
p = a[2],
m = a[3],
g = a[4];
if (null == d || null == p || null == m || null == g) return i;
const {
values: C
} = this._changesData(g, o, t), x = Object(f.a)(this._series);
if (Object(f.b)(this._series)) i[6].value = "";
else if (void 0 !== C) {
const e = this._series.formatter();
i[6].value = Object(c.forceLTRStr)(
`${e.format(C.change, !0)} (${v.format(C.percentChange, !0)})`)
}
t ? (i[5].value = x(g), i[5].visible = !0, i[6].visible = !0) : (i[0].value = x(d),
i[1].value = x(p), i[2].value = x(m), i[3].value = x(g), i[4].value = x(this
._series.barFunction()(a)));
let T = null;
if (t && !b) T = void 0 === C || C.change >= 0 ? _.SeriesBarColorer.upColor(this
._series.properties()) : _.SeriesBarColorer.downColor(this._series
.properties());
else {
const e = this._series.barColorer().barStyle(o, !1);
T = w(u, null != e.barBorderColor ? e.barBorderColor : e.barColor)
}
T = Object(l.resetTransparency)(w(u, T));
for (const e of i) e.color = T;
return i
}
_showLastPriceAndChangeOnly() {
return g && (null === this._model.crossHairSource().pane || Object(u.isLineToolName)
(d.tool.value()) || null !== this._model.lineBeingEdited())
}
_changesData(e, t, i) {
var s;
if (i && !b) {
const e = this._series.quotes();
if (null !== e) return {
values: {
change: e.change,
percentChange: e.change_percent
}
}
} else {
const i = this._series.data().search(t - 1, h.PlotRowSearchMode.NearestLeft),
r = null !== (s = null == i ? void 0 : i.value[4]) && void 0 !== s ? s :
null;
if (null !== r) return {
values: {
change: e - r,
percentChange: Object(m.a)(r, e)
}
}
}
return {}
}
}
},
"6KAu": function(e, t, i) {
"use strict";
function s() {
return Promise.all([i.e("react"), i.e(1), i.e(3), i.e(16), i.e(93), i.e(0), i.e(2), i.e(15),
i.e("change-interval-dialog")
]).then(i.bind(null, "iT0o"))
}
i.d(t, "a", (function() {
return s
}))
},
"6ctS": function(e, t) {
e.exports =
''
},
"6sst": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "OverlayStudyPriceLineAxisView", (function() {
return r
}));
var s = i("TmNs");
class r extends s.PriceLineAxisView {
constructor(e) {
super(), this._study = e
}
_value() {
return this._study.lastValueData("", !0)
}
_priceLineColor(e) {
return e
}
_lineWidth() {
return 1
}
_isVisible() {
const e = this._study.model().properties().scalesProperties.showSeriesLastValue
.value();
return this._study.properties().childs().showPriceLine.value() && e
}
}
},
"6vtU": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "setAdditionalSymbolInfoFields", (function() {
return r
})), i.d(t, "getAdditionalSymbolInfoFields", (function() {
return n
}));
let s = [];
function r(e) {
s = e
}
function n() {
return s
}
},
"704P": function(e, t, i) {
"use strict";
(function(e) {
var s = i("Ss5c").LineDataSource,
r = i("jkoZ"),
n = i("Ocx9").DefaultProperty,
o = i("k9/m").PlotRowSearchMode,
a = i("s1Gx").sortSourcesPreOrdered.LineToolExecution;
class l {
constructor(e, t) {
this._pane = e, this._timeScale = t
}
static recreateOrderedByBarsSourcesCache(e) {
l.clearOrderedByBarsSourcesCache();
for (var t = l.prototype, i = e.sourcesByGroup().all(), s = 0; s < i
.length; ++s) {
var r = i[s];
if (r._adapter && void 0 !== r._adapter._index) {
var n = t._cachedByBarIndexOrderedExecutions[r._adapter._index];
t._cachedByBarIndexOrderedExecutions[r._adapter._index] = n || [], t
._cachedByBarIndexOrderedExecutions[r._adapter._index].push(r)
}
}
}
static clearOrderedByBarsSourcesCache() {
l.prototype._cachedByBarIndexOrderedExecutions = {}
}
getXYCoordinate(e, t, i) {
var s = 0,
r = e.getDirection(),
n = "buy" === r,
a = this._pane.model().mainSeries();
if (a.bars) {
var l = n ? 10 : -10,
c = a.bars().search(i, o.NearestLeft);
if (null !== c) {
i = c.index;
var u = n ? c.value[TradingView.LOW_PLOT] : c.value[TradingView
.HIGH_PLOT],
d = a.priceScale(),
p = a.firstValue();
s = d.priceToCoordinate(u, p) + l
}
}
e._index = i;
var _ = t.visibleBarsStrictRange();
if (!isFinite(i) || null === _ || i > _.lastBar() || i < _.firstBar())
return {
x: -1,
y: -1
};
for (var m = this._cachedByBarIndexOrderedExecutions[i] || this._pane
.sourcesByGroup().all(), f = m.length - 1; f >= 0; --f) {
var g = m[f];
if (g instanceof h && g._adapter._index === i && g._adapter
.getDirection() === r) {
if (g === e._line) break;
var b = g._adapter._height();
s = n ? s + b : s - b
}
}
return {
x: t.indexToCoordinate(i),
y: s
}
}
}
l.prototype._cachedByBarIndexOrderedExecutions = {};
class c {
constructor(e) {
this._line = e
}
_height() {
var e = this.getArrowHeight(),
t = this.getArrowSpacing();
this.getText() && r.fontHeight(this.getFont());
return e + t + 0 + 10
}
getIndex() {
return this._line._model.timeScale().baseIndex() - this._line.points()[0]
.index
}
setIndex(e) {
var t = this._line._model.timeScale().baseIndex() - Math.abs(e);
this._line.startMoving({
logical: this._line.points()[0]
});
var i = TradingView.merge({}, this._line.points()[0]);
return i.index = t, this._line.move({
logical: i
}), this._line.endMoving(), this
}
getTime() {
return this._unixtime
}
setTime(e) {
return this._unixtime = e, this._line.restorePoints([{
offset: 0,
price: this.getPrice(),
time_t: this._unixtime
}], []), this._line.createServerPoints(), this
}
getPrice() {
return this._line.points().length > 0 ? this._line.points()[0].price : this
._line._timePoint.length > 0 ? this._line._timePoint[0].price : void 0
}
setPrice(e) {
return this._line.points().length > 0 && (this._line.points()[0].price = e),
this._line._timePoint.length > 0 && (this._line._timePoint[0].price =
e), this
}
getText() {
return this._line.properties().text.value()
}
setText(e) {
return this._line.properties().text.setValue(e || ""), this._line
.updateAllViewsAndRedraw(), this
}
getArrowHeight() {
return this._line.properties().arrowHeight.value()
}
setArrowHeight(e) {
return this._line.properties().arrowHeight.setValue(e || 5), this
}
getArrowSpacing() {
return this._line.properties().arrowSpacing.value()
}
setArrowSpacing(e) {
return this._line.properties().arrowSpacing.setValue(e || 1), this
}
getDirection() {
return this._line.properties().direction.value()
}
setDirection(e) {
return this._line.properties().direction.setValue(e || "buy"), this
}
getArrowColor() {
var e = this._line.properties();
return "buy" === this.getDirection() ? e.arrowBuyColor.value() : e
.arrowSellColor.value()
}
setArrowColor(e) {
return "buy" === this.getDirection() ? this.setArrowBuyColor(e) : this
.setArrowSellColor(e), this
}
setArrowBuyColor(e) {
return this._line.properties().arrowBuyColor.setValue(e), this
}
setArrowSellColor(e) {
return this._line.properties().arrowSellColor.setValue(e), this
}
getTextColor() {
return r.getColorFromProperties(this._line.properties().textColor, this
._line.properties().textTransparency)
}
setTextColor(e) {
return r.setColorToProperties(e, this._line.properties().textColor, this
._line.properties().textTransparency), this
}
getFont() {
return r.getFontFromProperties(this._line.properties().fontFamily, this
._line.properties().fontSize, this._line.properties().fontBold, this
._line.properties().fontItalic)
}
setFont(e) {
return r.setFontToProperties(e, this._line.properties().fontFamily, this
._line.properties().fontSize, this._line.properties().fontBold, this
._line.properties().fontItalic), this
}
setTooltip(e) {
return null == e ? e = "" : e += "", this._line.properties().tooltip
.setValue(e), this
}
getTooltip() {
return this._line.properties().tooltip.value()
}
remove() {
this._line._model.removeSource(this._line), delete this._line
}
getPoints() {
return this._line.points()
}
}
class h extends s {
constructor(e, t) {
super(e, t || h.createProperties()), this._adapter = new c(this), this
.customization.forcePriceAxisLabel = !1, this.customization
.disableErasing = !0, this.customization.showInObjectTree = !1, this
.setSelectionEnabled(!1), i.e("lt-pane-views").then(i.t.bind(null,
"tjxb", 7)).then(({
ExecutionPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
zorder() {
return a
}
isSpeciallyZOrderedSource() {
return !0
}
pointsCount() {
return h.POINTS_COUNT
}
name() {
return "Execution"
}
hasContextMenu() {
return !1
}
state() {
return null
}
updateAllViews() {
return this._isVisible() ? s.prototype.updateAllViews.call(this) : null
}
priceAxisViews(e, t) {
return this._isVisible() ? s.prototype.priceAxisViews.call(this, e, t) :
null
}
_isVisible() {
return this._model.properties().tradingProperties.showExecutions.value()
}
paneViews() {
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
null : this._model.properties().tradingProperties.showExecutions
.value() ? s.prototype.paneViews.call(this) : null
}
userEditEnabled() {
return !1
}
showInObjectTree() {
return !1
}
cloneable() {
return !1
}
copiable() {
return !1
}
isSynchronizable() {
return !1
}
static createProperties(e) {
var t = new n("linetoolexecution", e, !1, !1);
return h._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
h.POINTS_COUNT = 1, t.ExecutionsPositionController = l, t.LineToolExecution = h
}).call(this, i("Kxc7"))
},
"7ADh": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolFibWedgeBase", (function() {
return o
}));
var s = i("Eyy1"),
r = i("aO4+"),
n = i("Ss5c");
class o extends n.LineDataSource {
pointsCount() {
return 3
}
hasEditableCoordinates() {
return !1
}
setPoint(e, t) {
if (super.setPoint(e, t), !this._recursiveGuard) try {
if (this._recursiveGuard = !0, 2 === e) {
const e = this.pointToScreenPoint(this._points[0])[0];
let t = this.pointToScreenPoint(this._points[1])[0];
const i = this.pointToScreenPoint(this._points[2])[0].subtract(e)
.length();
let s = t.subtract(e);
s.length() <= 0 && (s = new r.Point(1, 0)), t = e.add(s.normalized()
.scaled(i));
const n = this.screenPointToPoint(t),
o = this._pointsProperty.childs().points[1];
o.childs().price.setValue(n.price), o.childs().bar.setValue(n.index)
} else {
const e = this.pointToScreenPoint(this._points[0])[0],
t = this.pointToScreenPoint(this._points[1])[0];
let i = this.pointToScreenPoint(this._points[2])[0];
const s = t.subtract(e).length();
let n = i.subtract(e);
n.length() <= 0 && (n = new r.Point(1, 0)), i = e.add(n.normalized()
.scaled(s));
const o = this.screenPointToPoint(i),
a = this._pointsProperty.childs().points[2];
a.childs().price.setValue(o.price), a.childs().bar.setValue(o.index)
}
} finally {
this._recursiveGuard = !1
}
}
addPoint(e) {
if (2 === this._points.length) {
const t = this.pointToScreenPoint(this._points[0])[0],
i = this.pointToScreenPoint(this._points[1])[0];
let r = this.pointToScreenPoint(e)[0];
const n = i.subtract(t).length(),
o = r.subtract(t).normalized();
r = t.add(o.scaled(n));
const a = Object(s.ensureNotNull)(this.ownerSource()),
l = Object(s.ensureNotNull)(a.firstValue()),
c = Object(s.ensureNotNull)(this.priceScale()).coordinateToPrice(r.y,
l);
e = {
index: Math.round(this._model.timeScale().coordinateToIndex(r.x)),
price: c
}
}
return n.LineDataSource.prototype.addPoint.call(this, e)
}
}
},
"7ETO": function(e, t, i) {
"use strict";
i.r(t);
var s = i("ocLq");
class r {
main(e) {
const t = e.new_var(s.Std.open(e)),
i = e.new_var(s.Std.close(e)),
r = t.get(1),
n = i.get(1),
o = s.Std.ohlc4(e),
a = s.Std.na(t.get(1)) ? (s.Std.open(e) + s.Std.close(e)) / 2 : (r + n) / 2;
t.set(a), i.set(o);
const l = s.Std.max(s.Std.high(e), s.Std.max(a, o)),
c = s.Std.min(s.Std.low(e), s.Std.min(a, o)),
h = s.Std.volume(e),
u = e.symbol;
return [u.time, a, l, c, o, h, u.updatetime, u.isBarClosed]
}
}
function n(e) {
if (0 === e.type.indexOf("BarSetHeikenAshi@tv-basicstudies-")) return new r;
const t = "unknown builder type: " + e.type;
throw console.error(t), new Error(t)
}
i.d(t, "getChartStyleStudy", (function() {
return n
}))
},
"7Fue": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
})), i.d(t, "b", (function() {
return n
}));
const s = ["horizlines", "vertlines", "lines", "hlines", "textmarks", "shapemarks",
"backgrounds", "polygons", "trendchannels", "hhists", "dwglabels", "dwglines",
"dwgboxes", "dwgtables", "dwgtablecells"
];
function r(e) {
return !s.some(t => e[t]().size > 0)
}
function n(e) {
const t = new Map;
return e.forEach((e, i) => {
e.forEach(e => {
const s = {
...e,
styleId: i
},
r = e.firstBarTime;
let n = t.get(r);
void 0 === n && (n = new Set, t.set(r, n)), n.add(s)
})
}), t
}
},
"7KDR": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "Action", (function() {
return l
})), i.d(t, "ActionAsync", (function() {
return c
})), i.d(t, "Separator", (function() {
return h
})), i.d(t, "Loader", (function() {
return u
}));
var s = i("zRdu"),
r = i("aIyQ"),
n = i.n(r),
o = i("/3z9"),
a = i("e3/o");
class l {
constructor(e, t = a.guid()) {
this.type = s.a.Action, this._destroyed = !1, this._binding = null, this.id = t,
this._onUpdate = new n.a, this._options = e, this.update(e)
}
execute() {
this._options.checkable && this.update({
checked: !this._options.checked
}), this._options.onExecute && this._options.onExecute(this)
}
getLabel() {
return this._options.label || ""
}
getSubItems() {
return this._options.subItems || []
}
isDisabled() {
return !0 === this._options.disabled
}
isActive() {
return !0 === this._options.active
}
isCheckable() {
return !0 === this._options.checkable
}
isChecked() {
return !0 === this._options.checked
}
getPayload() {
return this._options.payload
}
update(e) {
this._destroyed || (this._unbindShortcut(), e.hotkeyHash && (this._options
.shortcutHint = Object(o.humanReadableHash)(e.hotkeyHash)), this
._options = Object.assign(this._options, e), this._bindShortcut(), this
._onUpdate.fire(this))
}
onUpdate() {
return this._onUpdate
}
getState() {
return {
label: this.getLabel(),
disabled: this.isDisabled(),
active: this.isActive(),
subItems: this.getSubItems(),
checkable: this.isCheckable(),
checked: this.isChecked(),
doNotCloseOnClick: this._options.doNotCloseOnClick || !1,
shortcutHint: this._options.shortcutHint,
hint: this._options.hint,
icon: this._options.icon,
iconChecked: this._options.iconChecked,
toolbox: this._options.toolbox,
showToolboxOnHover: this._options.showToolboxOnHover || !1,
statName: this._options.statName,
name: this._options.name,
fullWidthLabel: this._options.fullWidthLabel,
invisibleHotkey: this._options.invisibleHotkey
}
}
getBinding() {
return this._binding
}
setBinding(e) {
this._binding = e
}
destroy() {
this._destroyed = !0, this._onUpdate.destroy(), null !== this._binding && this
._binding.destroy(), this._unbindShortcut()
}
options() {
return this._options
}
_bindShortcut() {
if (!this._options.hotkeyGroup || !this._options.hotkeyHash) return;
const e = "string" == typeof this._options.label ? this._options.label : this
._options.name;
this._hotkeyAction = this._options.hotkeyGroup.add({
hotkey: this._options.hotkeyHash,
desc: e,
handler: () => this.execute(),
isDisabled: () => this.isDisabled()
})
}
_unbindShortcut() {
this._hotkeyAction && (this._hotkeyAction.destroy(), delete this._hotkeyAction)
}
}
class c extends l {
constructor(e, t) {
super({}, t), this.type = s.a.ActionAsync, this._loader = e, this._loaded = !1
}
loadOptions() {
return this._loadingPromise || (this._loadingPromise = this._loader().then(e => {
this.update(e), this._loaded = !0
})),
this._loadingPromise
}
isLoaded() {
return this._loaded
}
}
class h {
constructor(e, t = a.guid()) {
this.type = s.a.Separator, this.id = t, this._hint = e
}
getHint() {
return this._hint
}
}
class u {
constructor(e = a.guid()) {
this.type = s.a.Loader, this.id = e
}
}
},
"7MWe": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PriceScaleChangeUndoCommand", (function() {
return a
}));
var s = i("Eyy1"),
r = i("txPx"),
n = i("RDU5");
const o = Object(r.getLogger)("Chart.ChartUndoModel");
class a extends n.UndoCommand {
constructor(e, t, i, s, r) {
super("Scale price", !1), this._newPriceScaleState = null, this._model = e, this
._paneIndex = e.panes().indexOf(t), this._priceScaleId = i.id(), this
._state = s, this._timestamp = r ? performance.now() : null
}
undo() {
if (null !== this._newPriceScaleState) return void o.logDebug(
"PriceScaleChangeUndoCommand.undo: Command is already undone");
const [e, t] = this._paneAndScale();
this._newPriceScaleState = t.state(), this._model.restorePriceScaleState(e, t,
this._state)
}
redo() {
if (null === this._newPriceScaleState) return void o.logDebug(
"PriceScaleChangeUndoCommand.redo: Command is not undone");
const [e, t] = this._paneAndScale();
this._model.restorePriceScaleState(e, t, this._newPriceScaleState), this
._newPriceScaleState = null
}
canMerge(e) {
return e instanceof a && null !== this._timestamp && null !== e._timestamp &&
null === this._newPriceScaleState && e._model === this._model && e
._paneIndex === this._paneIndex && e._priceScaleId === this._priceScaleId &&
Math.abs(e._timestamp - this._timestamp) < 1e3
}
merge(e) {
this._timestamp = e._timestamp
}
_paneAndScale() {
const e = this._model.panes()[this._paneIndex],
t = Object(s.ensureNotNull)(e.getPriceScaleById(this._priceScaleId));
return [e, t]
}
}
},
"7RN7": function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return s
})), i.d(t, "a", (function() {
return r
}));
const s = 52,
r = 5
},
"7dm8": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
})), i.d(t, "b", (function() {
return n
})), i.d(t, "c", (function() {
return o
})), i.d(t, "d", (function() {
return a
})), i.d(t, "e", (function() {
return l
}));
var s = i("ocLq");
class r {
init(e, t) {
e.new_sym(t(1), s.Std.period(e)), this._source = t(0), this._scaleFactor1 = 1, this
._scaleFactor2 = 1
}
main(e, t) {
const i = e.symbol.time,
r = s.Std[this._source](e);
e.select_sym(1);
const n = s.Std[this._source](e),
o = e.new_unlimited_var(n),
a = e.new_unlimited_var(e.symbol.time);
if (e.select_sym(0), isNaN(i)) return null;
let l = a.indexOf(i); - 1 !== l && a.get(l) !== i && (l = -1);
const c = l < 0 ? NaN : o.get(l);
return [this._doCalculation(this._scaleFactor1, r, this._scaleFactor2, c)]
}
}
const n = {
styles: {
plot1: {
linestyle: 0,
linewidth: 2,
plottype: 0,
trackPrice: !1,
transparency: 35,
visible: !0,
color: "#800080"
}
},
precision: 2,
inputs: {
source: "close",
symbol2: ""
}
},
o = [{
defval: "close",
id: "source",
name: "Source",
options: ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"],
type: "text"
}, {
id: "symbol2",
name: "Symbol",
type: "symbol",
confirm: !0
}],
a = [{
id: "plot1",
type: "line"
}],
l = {
plot1: {
title: "Plot",
histogramBase: 0
}
}
},
"7ktv": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PriceDataSource", (function() {
return a
}));
var s = i("fgLi"),
r = i("aIyQ"),
n = i.n(r),
o = i("/tGj");
class a extends s.DataSource {
constructor(e) {
super(), this._formatterChanged = new n.a, this._priceStepChanged = new n.a,
this._currencyChanged = new n.a, this._unitChanged = new n.a, this
._priceRangeReadyChanged = new n.a, this._metaInfo = null, this._priceStep =
null, this._priceRangeReady = !0, this._model = e
}
barColorer() {
return null
}
base() {
return 0
}
model() {
return this._model
}
currencyChanged() {
return this._currencyChanged
}
isCurrencySource() {
return !0
}
unitChanged() {
return this._unitChanged
}
isUnitSource() {
return !0
}
priceRange(e, t) {
return null
}
isDraggable() {
return !this._metaInfo || !this._metaInfo.linkedToSeries
}
priceLineColor(e) {
return e
}
formatterChanged() {
return this._formatterChanged
}
priceStep(e) {
return this._priceStep
}
priceStepChanged() {
return this._priceStepChanged
}
hasStateForAlert() {
return !1
}
isIncludedInAutoScale() {
return !0
}
correctScaleMargins(e) {
return e
}
priceRangeReady() {
return this._priceRangeReady
}
priceRangeReadyChanged() {
return this._priceRangeReadyChanged
}
disablePriceRangeReady() {
const e = this.priceScale();
null === e || e.isAutoScale() || e.mainSource() !== this || (this
._priceRangeReady = !1, e.recalculatePriceRangeOnce()), this
._priceRangeReadyChanged.fire(!1)
}
_enablePriceRangeReady() {
this._priceRangeReady = !0, this._priceRangeReadyChanged.fire(!0)
}
_onSourceCurrencyChanged() {
Object(o.isSymbolSource)(this) || this._currencyChanged.fire()
}
_onSourceUnitChanged() {
Object(o.isSymbolSource)(this) || this._unitChanged.fire()
}
_onSourcePriceRangeReadyChanged(e) {
Object(o.isSymbolSource)(this) || e || this.disablePriceRangeReady()
}
}
},
"7nsU": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "showConfirmInputsDialog", (function() {
return r
}));
var s = i("YFKU");
async function r(e, t, r, n, o = "default") {
let a = !1,
l = !1;
try {
const s = await Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i
.e(6), i.e(8), i.e(9), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i.e(
19), i.e(21), i.e(23), i.e(26), i.e(33), i.e(34), i.e(35), i.e(36),
i.e(39), i.e(50), i.e(59), i.e(95), i.e(0), i.e(2), i.e(5), i.e(7), i.e(
10), i.e(15), i.e(18), i.e(20), i.e(25), i.e(30), i.e(31), i.e(32),
i.e(37), i.e(46), i.e(55), i.e("new-confirm-inputs-dialog")
]).then(i.bind(null, "T4SC"));
a = await s.selectInputValuesOnChart(e, t, o)
} catch (e) {
l = !0
}
l ? n() : a ? r(t.defaults.inputs || {}) : Promise.all([i.e("redux"), i.e("react"), i.e(
1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(12), i.e(13), i.e(14), i
.e(16), i.e(17), i.e(19), i.e(21), i.e(23), i.e(26), i.e(33), i.e(34), i.e(
35), i.e(36), i.e(39), i.e(50), i.e(59), i.e(95), i.e(0), i.e(2), i.e(
5), i.e(7), i.e(10), i.e(15), i.e(18), i.e(20), i.e(25), i.e(30), i.e(
31), i
.e(32), i.e(37), i.e(46), i.e(55), i.e("new-confirm-inputs-dialog")
]).then(i.bind(null, "iqv3")).then(i => {
const a = new i.ConfirmInputsDialogRenderer(function(e) {
if ("symbol" === e) return Object(s.t)("Add Symbol");
return Object(s.t)("Confirm Inputs")
}(o), t, e.model(), o, r, n);
return a.show(), a
})
}
},
"7qI1": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolRectangle", (function() {
return c
}));
var s = i("aO4+"),
r = i("Ocx9"),
n = i("tc+8"),
o = i.n(n),
a = i("Ss5c"),
l = i("j3hX");
class c extends a.LineDataSource {
constructor(e, t) {
const s = t || c.createProperties();
super(e, s), i.e("lt-pane-views").then(i.bind(null, "GW0y")).then(({
RectanglePaneView: t
}) => {
const i = [new t(this, e)];
this._setPaneViews(i)
})
}
pointsCount() {
return 2
}
textColorsProperty() {
return this.properties().childs().showLabel.value() ? super
.textColorsProperty() : null
}
properties() {
return super.properties()
}
name() {
return "Rectangle"
}
setPoint(e, t, i) {
if (e < 2 && super.setPoint(e, t, i), i && i.shift()) {
const i = this._getAnchorPointForIndex(e);
if (e >= 4) return this._correctMiddlePoints(e, t, i), void this
.normalizePoints();
this._snapPoint45Degree(t, i)
}
switch (e) {
case 2:
this._points[1].price = t.price, this._points[0].index = t.index;
break;
case 3:
this._points[0].price = t.price, this._points[1].index = t.index;
break;
case 4:
this._points[0].index = t.index;
break;
case 5:
this._points[1].index = t.index;
break;
case 6:
this._points[0].price = t.price;
break;
case 7:
this._points[1].price = t.price
}
this.normalizePoints()
}
getPoint(e) {
return e < 2 ? super.getPoint(e) : this._getAnchorPointForIndex(e)
}
template() {
const e = super.template();
return e.text = this.properties().childs().text.value(), e
}
static createProperties(e) {
const t = new r.DefaultProperty("linetoolrectangle", e);
return c._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "K4wI")).then(
e => e.RectangleDefinitionsViewModel)
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
}
_snapPoint45Degree(e, t, i) {
const s = this.m_priceScale,
r = this.ownerSource();
if (null === s || null === r) return;
const n = r.firstValue();
if (null === n) return;
const o = this._model.timeScale(),
a = this.pointToScreenPoint(e)[0],
l = this.pointToScreenPoint(t)[0],
c = a.x - l.x,
h = a.y - l.y,
u = c < 0 ? -1 : 1,
d = h < 0 ? -1 : 1,
p = Math.max(Math.abs(c), Math.abs(h)),
_ = Math.round(o.coordinateToIndex(l.x + p * u)),
m = Math.abs(o.indexToCoordinate(_) - l.x),
f = s.coordinateToPrice(l.y + m * d, n);
e.index = _, e.price = f
}
_correctMiddlePoints(e, t, i) {
e < 6 ? this._correctRightLeftMiddlePoint(e, t, i) : this
._correctTopBottomMiddlePoint(e, t, i)
}
_correctRightLeftMiddlePoint(e, t, i) {
const r = this.pointToScreenPoint(t)[0],
n = this.pointToScreenPoint(i)[0],
o = this.pointToScreenPoint(this._points[0])[0],
a = this.pointToScreenPoint(this._points[1])[0];
let l = r.x - n.x;
if (0 === l) return;
const c = o.x < a.x ? 1 : -1,
h = o.y < a.y ? 1 : -1;
switch (l *= c, e) {
case 4: {
const e = a.y - h * l / 2,
t = this.screenPointToPoint(new s.Point(a.x, e));
this._points[1].price = t.price;
const i = this.screenPointToPoint(new s.Point(o.x + c * l, o.y + h * l /
2));
this._points[0].price = i.price, this._points[0].index = i.index;
break
}
case 5: {
const e = o.y - h * l / 2,
t = this.screenPointToPoint(new s.Point(o.x, e));
this._points[0].price = t.price;
const i = this.screenPointToPoint(new s.Point(a.x + c * l, a.y + h * l /
2));
this._points[1].price = i.price, this._points[1].index = i.index;
break
}
}
}
_correctTopBottomMiddlePoint(e, t, i) {
const r = this.m_priceScale,
n = this.ownerSource();
if (null === r || null === n) return;
const o = this._model.timeScale(),
a = n.firstValue();
if (null === a) return;
const l = this.pointToScreenPoint(t)[0],
c = this.pointToScreenPoint(i)[0],
h = this.pointToScreenPoint(this._points[0])[0],
u = this.pointToScreenPoint(this._points[1])[0],
d = l.y - c.y,
p = d < 0 ? -1 : 1,
_ = h.x < u.x ? 1 : -1,
m = h.y < u.y ? 1 : -1;
switch (e) {
case 6: {
const e = Math.floor(u.x - _ * d / 2),
t = this.screenPointToPoint(new s.Point(e, u.y)),
i = Math.abs(this._points[1].index - t.index),
n = _ * m * p * Math.ceil(i / 2);
if (0 === n) return;
this._points[1].index = this._points[1].index - n;
const l = p * Math.abs(o.indexToCoordinate(this._points[1].index) - u
.x);
this._points[0].price = r.coordinateToPrice(h.y + l, a), this._points[0]
.index = this._points[0].index + n;
break
}
case 7: {
const e = Math.floor(h.x - _ * d / 2),
t = this.screenPointToPoint(new s.Point(e, h.y)),
i = Math.abs(this._points[0].index - t.index),
n = _ * m * p * Math.ceil(i / 2);
if (0 === n) return;
this._points[0].index = this._points[0].index - n;
const l = p * Math.abs(o.indexToCoordinate(this._points[0].index) - h
.x);
this._points[1].price = r.coordinateToPrice(u.y + l, a), this._points[1]
.index = this._points[1].index + n;
break
}
}
}
_snapTo45DegreesAvailable() {
return !0
}
static _configureProperties(e) {
a.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
"text", new o.a("")), e.addExclusion("text"), e.addChild("linesColors",
new l.LineToolColorsProperty([e.childs().color])), e.addChild(
"textsColors", new l.LineToolColorsProperty([e.childs().textColor], e
.childs().showLabel))
}
_getAnchorPointForIndex(e) {
const t = this.points(),
i = t[0],
s = t[1];
let r = 0,
n = 0;
switch (e) {
case 0:
r = i.price, n = i.index;
break;
case 1:
r = s.price, n = s.index;
break;
case 2:
r = s.price, n = i.index;
break;
case 3:
r = i.price, n = s.index;
break;
case 4:
r = (s.price + i.price) / 2, n = i.index;
break;
case 5:
r = (s.price + i.price) / 2, n = s.index;
break;
case 6:
r = i.price, n = (s.index + i.index) / 2;
break;
case 7:
r = s.price, n = (s.index + i.index) / 2
}
return {
index: n,
price: r
}
}
}
},
"7qT/": function(e, t, i) {
"use strict";
function s(e, t) {
return 100 * (t - e) / Math.abs(e)
}
i.d(t, "a", (function() {
return s
}))
},
"8LSp": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
class s {
constructor() {
this._stable = [], this._variable = null, this._owner = null
}
addStable(e) {
e.setOwner(this), this._stable.push(e)
}
setVariable(e) {
this._variable = e, null !== this._variable && this._variable.setOwner(this)
}
primitivesData(e) {
const t = [];
return this._forEach(i => t.push(...i.primitivesData(e))), t
}
deleteErasedItems() {
this._forEach(e => e.deleteErasedItems())
}
markPostedItems() {
this._forEach(e => e.markPostedItems())
}
isNaN() {
return this._all(e => e.isNaN())
}
dirty() {
null !== this._owner && this._owner.dirty()
}
setOwner(e) {
this._owner = e
}
_forEach(e) {
for (const t of this._stable) e(t);
null !== this._variable && e(this._variable)
}
_all(e) {
for (const t of this._stable)
if (!e(t)) return !1;
return null === this._variable || e(this._variable)
}
}
},
"8OdW": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "MINUTE_SPAN", (function() {
return s
})), i.d(t, "HOUR_SPAN", (function() {
return r
})), i.d(t, "DAY_SPAN", (function() {
return n
})), i.d(t, "WEEK_SPAN", (function() {
return o
})), i.d(t, "MONTH_SPAN", (function() {
return a
})), i.d(t, "YEAR_SPAN", (function() {
return l
})), i.d(t, "DEFAULT_BAR_SPACING", (function() {
return c
}));
const s = 20,
r = 30,
n = 40,
o = 50,
a = 60,
l = 70,
c = 6
},
"8Uy/": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LINESTYLE_SOLID", (function() {
return s
})), i.d(t, "LINESTYLE_DOTTED", (function() {
return r
})), i.d(t, "LINESTYLE_DASHED", (function() {
return n
})), i.d(t, "LINESTYLE_LARGE_DASHED", (function() {
return o
})),
i.d(t, "LINESTYLE_SPARSE_DOTTED", (function() {
return a
})), i.d(t, "LINESTYLE_SMALL_DASHED", (function() {
return l
}));
const s = 0,
r = 1,
n = 2,
o = 3,
a = 4,
l = 5
},
"8gnj": function(e, t, i) {
"use strict";
var s = i("LxhU").Interval,
r = i("OLhd").isAlignmentEnabled,
n = i("7ETO").getChartStyleStudy,
o = i("5fI3").decodeExtendedSymbol,
a = i("53h+").findSuitableResolutionToBuildFrom,
l = function() {
var e = i("ocLq"),
t = e.StudyEngine,
l = e.BarBuilder,
c = e.BarSet;
function h(e) {
this.host = e, this.cache = {}
}
function u(e) {
throw console.error(e), e
}
h.prototype.getCache = function(e) {
return this.cache[e]
}, h.prototype.putCache = function(e, t) {
this.cache[e] = t
}, h.prototype.subscribe = function(e, t, i, s, r, n, o, a, l, c) {
var h = l(o),
u = function(e, t, i, s, r, n, o, a) {
var l = r.has_empty_bars ? "_" : "";
return n + e + s + (t || "") + (i || "") + l + "_" + o.countBack + "_" +
o.to + "_" + Boolean(a)
}(e, t, i, s, o, a, h, c),
d = this.getCache(u);
return d || (d = this.createItem(e, t, i, s, o, h, a, c), this.putCache(u, d)),
d.listeners.addListener(r, n), {
key: u,
listener: r
}
}, h.prototype.unsubscribe = function(e) {
var t = this.getCache(e.key);
t && t.listeners.removeListener(e.listener)
}, h.prototype.removeUnused = function() {
var e = [];
for (var t in this.cache) {
if (this.cache[t]) 0 === this.cache[t].listeners.listenersCount() && e.push(
t)
}
if (0 !== e.length) {
for (var i = 0; i < e.length; i++) {
var s = e[i],
r = this.cache[s];
this.cache[s] = null, r.stop()
}
this.removeUnused()
}
}, h.prototype.rebuildFrom = function(e, t) {
return a(e, t)
};
var d = s.parse("1M").inMilliseconds(0);
h.prototype.createItem = function(e, t, i, a, c, h, f, g) {
var b = new m,
v = o(e),
S = "string" != typeof v.symbol ? v.symbol : v;
t = S["currency-id"] || t, i = S["unit-id"] || i;
var y = S.symbol,
w = S.session && "extended" !== S.session;
if ("type" in v) {
var P = Object.assign({}, c);
return c.has_empty_bars && (P.has_empty_bars = !1), new _(b, y, t, i, a, n(
v), P, h, f)
}
g && !r() && u("Internal error: rebuilding is requested but it is disabled."), !
g && c.has_empty_bars && u(
'Misconfiguration error: attempt to request data for symbol with "has_empty_bars" flag, but "disable_resolution_rebuild" featureset is enabled'
);
var C, x, T = this.rebuildFrom(a, c);
if (!s.isTicks(a) && (!s.isEqual(a, T) || g)) {
r() || u(
'Misconfiguration error: remove "disable_resolution_rebuild" featureset or provide ' +
a + " data by yourself");
var I = c.has_empty_bars;
P = Object.assign({}, c);
c.has_empty_bars && (P.has_empty_bars = !1);
var M = Math.ceil((C = s.parse(a), x = s.parse(T), C.kind() === x.kind() ? C
.multiplier() / x.multiplier() : (C.isMonths() ? C
.multiplier() * d : C.inMilliseconds()) / (x.isMonths() ? x
.multiplier() * d : x.inMilliseconds())));
return h = Object.assign({}, h, {
countBack: h.countBack * M
}), new _(b, y, t, i, T, new l(a, I), P, h, f)
}
return new p(b, y, {
currency: t,
unit: i
}, a, w, this.host, c, h)
};
var p = function(e, t, i, s, r, n, o, a) {
this.listeners = e, this.host = n;
var l = this;
this.host.resolve(t, i, (function(e) {
r && e.regular_session && (e.session = e.regular_session), l
.subs = l.host.subscribe(e, s, a, (function(e) {
l.listeners.fire(e)
}), (function(e) {
l.listeners.onError(e)
}))
}), (function(e) {
l.listeners.onError(e)
}))
};
p.prototype.stop = function() {
this.subs && this.host.unsubscribe(this.subs)
};
var _ = function(e, i, s, r, n, o, a, l, c) {
this.listeners = e, this.isRecalculated = !1, this.symbolInfo = a;
var h = this;
this.engine = new t({
tickerid: i,
currencyCode: s,
unitId: r,
period: n,
body: o,
sessionId: c,
symbolInfo: a,
dataRange: l,
forceAlignBars: !1,
recalc: function(e, t) {
h._recalc(t)
},
out: function(e, t) {
h._out(e, t)
},
nonseriesOut: function(e, t) {
h._nonseriesOut(e, t)
},
setNoMoreData: function() {
h.barset && (h.barset.endOfData = !0)
},
onErrorCallback: function(e) {
h.listeners.onError(e)
}
})
};
_.prototype.stop = function() {
this.engine ? this.engine.stop() : console.error("Internal library error 0x1")
}, _.prototype._recalc = function(e) {
this.isRecalculated && console.error("recalc called twice!"), this.barset || (
this.barset = new c(this.symbolInfo)), e && (this.barset
.firstLoadedTimeMs = e.firstLoadedTimeMs, this.barset.endOfData = e
.endOfData), this.listeners.fire(this.barset), this.isRecalculated = !0
}, _.prototype._nonseriesOut = function(e, t) {
var i = Object.assign({}, t);
i.nonseries = !0, i.data = t.bars, delete i.bars, i.barsetSize = this.barset ?
this.barset.count() : 0, i.lastBar = this.barset ? this.barset.bar(this
.barset.count() - 1) : null, this.listeners.fire(i, !0)
}, _.prototype._out = function(e, t) {
var i = t[0];
if (!isNaN(i)) {
var s = {
time: i,
open: t[1],
high: t[2],
low: t[3],
close: t[4],
volume: t[5],
updatetime: t[6]
},
r = t[7];
this.barset || (this.barset = new c(e.info));
var n = t[8];
if (n instanceof Array)
for (var o = 0; o < n.length; o++) {
var a = t[9],
l = n[o],
h = {
time: l,
open: a,
high: a,
low: a,
close: a,
volume: 0,
updatetime: l
};
this.barset.add(h, !0), this.isRecalculated && this.listeners.fire(
this.barset)
}
this.barset.add(s, r), this.barset.isBarClosed = r, this.isRecalculated &&
this.listeners.fire(this.barset)
}
};
var m = function() {
this.listeners = []
};
return m.prototype.listenersCount = function() {
return this.listeners.reduce((function(e, t) {
return e + (t ? 1 : 0)
}), 0)
}, m.prototype.addListener = function(e, t) {
this.listeners.push({
dataListener: e,
onErrorCallback: t
}), this.barset && e(this.barset), this.errorMsg && t(this.errorMsg)
}, m.prototype.removeListener = function(e) {
var t = this.listeners.filter((function(t) {
return t.dataListener === e
}));
if (0 !== t.length) {
var i = this.listeners.indexOf(t[0]);
delete this.listeners[i]
}
}, m.prototype.onError = function(e) {
this.errorMsg = e || "unspecified error";
for (var t = this.listeners, i = t.length, s = 0; s < i; s++) {
var r = t[s];
r && r.onErrorCallback && r.onErrorCallback(e)
}
}, m.prototype.fire = function(e, t) {
t || (this.barset = e);
for (var i = this.listeners, s = i.length, r = 0; r < s; r++) {
var n = i[r];
n && n.dataListener(e)
}
}, {
setupFeed: function(t) {
h.instance = new h(t), e.setupFeed(h.instance)
},
unsubscribeUnused: function() {
h.instance.removeUnused()
}
}
}();
e.exports = l
},
"8pII": function(e) {
e.exports = JSON.parse(
'{"content":{"chartProperties":{"scalesProperties":{"textColor":"#B2B5BE","lineColor":"rgba(240, 243, 250, 0.12)","backgroundColor":"#ffffff"},"paneProperties":{"vertGridProperties":{"color":"rgba(240, 243, 250, 0.06)"},"horzGridProperties":{"color":"rgba(240, 243, 250, 0.06)"},"crossHairProperties":{"color":"#9598A1"},"background":"#131722","backgroundGradientStartColor":"#181C27","backgroundGradientEndColor":"#131722","backgroundType":"gradient"}},"sessions":{"graphics":{"backgrounds":{"outOfSession":{"color":"#2962FF","transparency":92},"preMarket":{"color":"#FF9800","transparency":92},"postMarket":{"color":"#2962FF","transparency":92}},"vertlines":{"sessBreaks":{"color":"#4985e7","style":2,"width":1}}}},"mainSourceProperties":{"baseLineColor":"#5d606b","candleStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#B5B5B8","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"haStyle":{"borderColor":"#378658","upColor":"#26a69a","wickColor":"#B5B5B8","wickUpColor":"#26a69a","wickDownColor":"#ef5350","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350"},"barStyle":{"downColor":"#ef5350","upColor":"#26a69a"},"pnfStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#336854","downColorProjection":"#7f323f"},"baselineStyle":{"baselineColor":"rgba( 117, 134, 150, 1)","topFillColor1":"rgba( 38, 166, 154, 0.28)","topFillColor2":"rgba( 38, 166, 154, 0.05)","bottomFillColor1":"rgba( 239, 83, 80, 0.05)","bottomFillColor2":"rgba( 239, 83, 80, 0.28)","topLineColor":"rgba( 38, 166, 154, 1)","bottomLineColor":"rgba( 239, 83, 80, 1)"},"areaStyle":{"transparency":100,"color1":"rgba(41, 98, 255, 0.28)","color2":"#2962FF","linecolor":"#2962FF","linewidth":2,"linestyle":0},"renkoStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#336854","downColorProjection":"#7f323f","borderUpColorProjection":"#336854","borderDownColorProjection":"#7f323f","wickUpColor":"#26a69a","wickDownColor":"#ef5350"},"lineStyle":{"color":"#2962FF","linewidth":2,"linestyle":0},"kagiStyle":{"downColor":"#ef5350","upColor":"#26a69a","upColorProjection":"#336854","downColorProjection":"#7f323f"},"pbStyle":{"upColor":"#26a69a","downColor":"#ef5350","borderUpColor":"#26a69a","borderDownColor":"#ef5350","upColorProjection":"#336854","downColorProjection":"#7f323f","borderUpColorProjection":"#336854","borderDownColorProjection":"#7f323f"},"rangeStyle":{"upColor":"#26a69a","downColor":"#ef5350","upColorProjection":"#336854","downColorProjection":"#7f323f"}}}}'
)
},
"8sOK": function(e, t, i) {
"use strict";
i.r(t);
var s = i("2kV1"),
r = i("7ktv"),
n = i("kcTO"),
o = i("aIyQ"),
a = i.n(o),
l = i("tc+8"),
c = i.n(l),
h = i("ww0J");
class u extends h.a {
text() {
return this._source.isActualInterval() ?
`${this._source.title()} ${this.sourceStatusText()}` : this._source.title()
}
}
var d = i("bmVy");
i.d(t, "StudyStub", (function() {
return m
}));
class p {
getItems() {
return []
}
getValues(e) {
return []
}
}
const _ = new a.a;
class m extends r.PriceDataSource {
constructor(e, t, i) {
super(e), this._priceStep = .01, this._status = {
type: d.StudyStatusType.Undefined
}, this._statusChanged = new a.a, this._formatter = new n.PriceFormatter(
100), this._origState = t, this._title = i;
this._properties = new c.a({
visible: !0
}), this._statusView = new s.StudyStatusView(this)
}
properties() {
return this._properties
}
statusView() {
return this._statusView
}
legendView() {
return null
}
state(e) {
return this._origState
}
setStatus(e) {
this._status = e, this._statusChanged.fire()
}
formatter() {
return this._formatter
}
title() {
return this._title
}
titleInParts() {
return [this._title]
}
isFailed() {
return this._status.type === d.StudyStatusType.Error
}
isLoading() {
return this._status.type === d.StudyStatusType.Loading
}
setFailed(e) {
this.setStatus({
type: d.StudyStatusType.Error,
errorDescription: {
error: e
}
}), this._model.updateSource(this)
}
isSymbolInvalid() {
return !1
}
isActualInterval() {
return !0
}
onIsActualIntervalChange() {
return _
}
start() {}
status() {
return this._status
}
onStatusChanged() {
return this._statusChanged
}
firstValue() {
return null
}
currency() {
return null
}
sessionId() {
return this._model.mainSeries().sessionId()
}
sessionIdChanged() {
return this._model.mainSeries().sessionIdChanged()
}
unit() {
return null
}
symbolSource() {
return this._model.mainSeries()
}
valuesProvider() {
return new p
}
statusProvider(e) {
return new u(this, this._model.properties().scalesProperties.textColor)
}
}
},
"8woN": function(e, t, i) {
"use strict";
var s = i("Kxc7"),
r = [{
d: "E-Mini S&P 500",
t: "ES"
}, {
d: "E-Mini Nasdaq 100",
t: "NQ"
}, {
d: "Gold",
t: "GC"
}, {
d: "Silver",
t: "SI"
}, {
d: "Crude Oil WTI",
t: "CL"
}, {
d: "Natural Gas",
t: "NG"
}, {
d: "Australian Dollar",
t: "6A"
}, {
d: "Australian Dollar (Floor)",
t: "AD"
}, {
d: "Euro FX",
t: "6E"
}, {
d: "Euro FX (Floor)",
t: "EC"
}, {
d: "Corn",
t: "ZC"
}, {
d: "Corn (Floor)",
t: "C"
}, {
d: "Eurodollar",
t: "GE"
}, {
d: "Eurodollar (Floor)",
t: "ED"
}],
n = function() {
var e = [{
pattern: "(",
ctor: o
}, {
pattern: ")",
ctor: a
}, {
pattern: "+",
ctor: c
}, {
pattern: "-",
ctor: h
}, {
pattern: "*",
ctor: u
}, {
pattern: "/",
ctor: d
}, {
pattern: "^",
ctor: p
}, {
pattern: /\d+(?:\.\d*|(?![a-zA-Z0-9_!:.&]))|\.\d+/,
ctor: g
}, {
pattern: /\./,
ctor: S
}, {
pattern: s.enabled("charting_library_base") ?
/[a-zA-Z0-9_\u0370-\u1FFF_\u2E80-\uFFFF^][a-zA-Z0-9_\u0020\u0370-\u1FFF_\u2E80-\uFFFF_!:.&]*|'.+?'/ :
/[a-zA-Z0-9_\u0370-\u1FFF_\u2E80-\uFFFF][a-zA-Z0-9_\u0020\u0370-\u1FFF_\u2E80-\uFFFF_!|:.&]*|'.+?'/,
ctor: f
}, {
pattern: /'[^']*/,
ctor: v
}, {
pattern: /[\0-\x20\s]+/,
ctor: n
}];
function t(e, t) {
var i = function() {};
return i.prototype = t.prototype, e.prototype = new i, e
}
function i() {}
function n(e) {
this.value = e
}
function o() {}
function a() {}
function l() {}
function c() {}
function h() {}
function u() {}
function d() {}
function p() {}
i.prototype.toString = function() {
return this.value
}, t(n, i), t(o, i), o.prototype.value = "(", t(a, i), a.prototype.value = ")", t(l,
i), t(c, l), c.prototype.value = "+", c.prototype.precedence = 0, c.prototype
.commutative = !0, t(h, l), h.prototype.value = "-", h.prototype.precedence = 0, h
.prototype.commutative = !1, t(u, l), u.prototype.value = "*", u.prototype
.precedence = 1, u.prototype.commutative = !0, t(d, l), d.prototype.value = "/", d
.prototype.precedence = 1, d.prototype.commutative = !1, t(p, l),
p.prototype.value = "^", p.prototype.precedence = 2, p.prototype.commutative = !1;
var _ = /^'?(?:([A-Z0-9_]+):)?(.*?)'?$/i,
m = /[+\-/*]/;
function f(e) {
this.value = e
}
function g(e) {
this.value = e
}
function b(e) {
this.value = e
}
function v() {
f.apply(this, arguments)
}
function S() {
g.apply(this, arguments)
}
t(f, i), f.prototype.toString = function() {
if (this.hasOwnProperty("_ticker")) {
var e = m.test(this._ticker) ? "'" : "";
return e + (this._exchange ? this._exchange + ":" : "") + this._ticker + e
}
return this.value
}, f.prototype.parse = function() {
var e = _.exec(this.value);
e[1] && (this._exchange = e[1]), this._ticker = e[2]
}, f.prototype.parseAsFutures = function() {
this.hasOwnProperty("_ticker") || this.parse();
for (var e = function(e) {
return r.some((function(t) {
return t.t === e
}))
}, t = 2; t >= 1; --t) {
var i = this._ticker.slice(0, t);
if (e(i)) {
this._root = i, this._contract = this._ticker.slice(t);
break
}
}
}, f.prototype.exchange = function(e) {
if (this.hasOwnProperty("_ticker") || this.parse(), !(arguments.length > 0))
return this._exchange;
null == e ? delete this._exchange : this._exchange = e + ""
}, f.prototype.ticker = function(e) {
if (this.hasOwnProperty("_ticker") || this.parse(), !(arguments.length > 0))
return this._ticker;
null == e ? delete this._ticker : this._ticker = e + "", delete this._root,
delete this._contract
}, f.prototype.root = function(e) {
if (this.hasOwnProperty("_root") || this.parseAsFutures(), !(arguments.length >
0)) return this._root;
null == e ? delete this._root : (this._root = e + "", this._root && (this
._ticker = this._root + (this._contract || "")))
}, f.prototype.contract = function(e) {
if (this.hasOwnProperty("_contract") || this.parseAsFutures(), !(arguments
.length > 0)) return this._root;
null == e ? delete this._contract : (this._contract = e + "", this._root && (
this._ticker = this._root + this._contract))
}, t(g, i), g.prototype.toString = function() {
return this.hasOwnProperty("_normalizedValue") ? this._normalizedValue : this
.value
}, g.prototype.parse = function() {
this._normalizedValue = this.value.replace(/^0+|\.0*$/g, "").replace(
/(\.\d*?)0+$/, "$1").replace(/^(\.|$)/, "0$1")
}, b.prototype.toString = function() {
return this.value
}, t(v, f), v.prototype.isIncomplete = !0, v.prototype.incompleteSuggest =
function() {
if ("'" !== this.value) return String("'")
}, t(S, g), S.prototype.isIncomplete = !0;
var y = new RegExp(e.map((function(e) {
return "(" + ("string" == typeof e.pattern ? e.pattern.replace(
/[\^$()[\]{}*+?|\\]/g, "\\$&") : e.pattern.source) + ")"
})).concat(".").join("|"), "g");
function w(t, i) {
var s, r = [];
e: for (; s = y.exec(t);) {
for (var o = e.length; o--;)
if (s[o + 1]) {
if (e[o].ctor) {
var a = new e[o].ctor(s[o + 1]);
a._offset = s.index, r.push(a)
}
continue e
} var l = new b(s[0]);
l._offset = s.index, r.push(l)
}
if (i && i.recover) {
var c;
for (o = r.length; o--;) {
var h = r[o];
if (h instanceof g || h instanceof f) {
if (void 0 !== c) {
var u = new f(""),
d = r.splice(o, c - o + 1, u);
u.value = d.map((function(e) {
return e.value
})).join("")
}
c = o
} else h instanceof n || (c = void 0)
}
}
return r
}
function P(e) {
for (var t = [], i = 0; i < e.length; i++) e[i] instanceof n || t.push(e[i]);
return t
}
function C(e) {
e = P(e);
for (var t, i = [], s = [], r = 0; r < e.length; r++) {
var n = e[r];
if (n instanceof l) s.length && s[s.length - 1].minPrecedence > n.precedence &&
(s[s.length - 1].minPrecedence = n.precedence);
else if (n instanceof o) s.push(t = {
minPrecedence: 1 / 0,
openBraceIndex: r
});
else if (n instanceof a) {
var c = e[(t = s.pop()).openBraceIndex - 1],
h = e[r + 1];
h instanceof l && !(h.precedence <= t.minPrecedence) || !(!(
c instanceof l) || c.precedence < t.minPrecedence || c
.precedence === t.minPrecedence && c.commutative) || (i.unshift(t
.openBraceIndex), i.push(r), s.length && s[s.length - 1]
.minPrecedence > t.minPrecedence && (s[s.length - 1].minPrecedence =
t.minPrecedence))
}
}
for (r = i.length; r--;) e.splice(i[r], 1);
return e
}
function x(e) {
if ("string" != typeof e) throw new TypeError("expression must be a string");
return (e = w(e)).filter((function(e) {
return e instanceof f
})).map((function(e) {
return e.exchange()
})).filter((function(e) {
return e
}))
}
function T(e) {
return 1 !== (e = x(e)).length ? null : e[0]
}
function I(e, t) {
return (e = x(e)).some((function(e) {
return t.includes((e || "").toUpperCase())
}))
}
function M(e) {
return e.join("")
}
return {
tokenize: w,
validate: function(e) {
if (s.enabled("charting_library_base")) return {
currentState: "var"
};
for (var t = "init", i = {
warnings: [],
errors: [],
isEmpty: !0
}, r = [], c = 0; c < e.length; c++) {
if (!((u = e[c]) instanceof n)) {
if (delete i.isEmpty, u.isIncomplete) {
var h = {
status: "incomplete",
reason: "incomplete_token",
offset: u._offset,
token: u
};
if (u.incompleteSuggest && (h.recover = {
append: u.incompleteSuggest()
}), i.warnings.push(h), c !== e.length - 1) {
h.status = "error";
continue
}
}
if (u instanceof f || u instanceof g) {
if ("var" === t) {
i.errors.push({
status: "error",
reason: "unexpected_token",
offset: u._offset,
token: u
});
continue
}
t = "var"
} else if (u instanceof l) {
if ("var" !== t) {
i.errors.push({
status: "error",
reason: "unexpected_token",
offset: u._offset,
token: u
});
continue
}
t = "operator"
} else if (u instanceof o) {
if ("var" === t) {
i.errors.push({
status: "error",
reason: "unexpected_token",
offset: u._offset,
token: u
});
continue
}
r.push(u), t = "init"
} else if (u instanceof a) {
if ("var" !== t) {
i.errors.push({
status: "error",
reason: "unexpected_token",
offset: u._offset,
token: u
});
continue
}
r.pop() || i.errors.push({
status: "error",
reason: "unbalanced_brace",
offset: u._offset,
token: u,
recover: {
prepend: new o
}
}), t = "var"
} else u instanceof b && i.errors.push({
status: "error",
reason: "unparsed_entity",
offset: u._offset,
token: u
})
}
}
for (i.braceBalance = r.length, "var" !== t && i.warnings.push({
status: "incomplete"
}); r.length;) {
var u;
h = {
status: "incomplete",
reason: "unbalanced_brace",
offset: (u = r.pop())._offset,
token: u
};
"var" === t && (h.recover = {
append: new a
}), i.warnings.push(h)
}
return i.currentState = t, 0 === i.warnings.length && delete i.warnings,
0 === i.errors.length && delete i.errors, i
},
factorOutBraces: C,
normalizeTokens: function(e) {
for (var t = 0; t < e.length; t++) e[t].parse && e[t].parse();
return e
},
flip: function(e) {
var t = function(e) {
for (var t, i = 0, s = 0, r = 0; r < e.length; r++) {
var c = e[r];
if (!(c instanceof n)) switch (i) {
case 0:
if (!(c instanceof g && 1 == +c.value)) return !1;
i = 1;
break;
case 1:
if (!(1 === i && c instanceof d)) return !1;
i = 2, t = r + 1;
break;
case 2:
if (c instanceof o) i = 3, s = 1;
else if (c instanceof l) return !1;
break;
case 3:
c instanceof o ? s++ : c instanceof a && --s <= 0 &&
(i = 2)
}
}
return e.slice(t)
}(e);
return C(t || [new g("1"), new d, new o].concat(e).concat(new a))
},
hasBatsSymbols: function(e) {
return I(e, ["BATS"])
},
hasEodSymbols: function(e) {
return (e = T(e)) && -1 !== e.toUpperCase().indexOf("_EOD")
},
hasChxjpySymbols: function(e) {
return I(e, ["CHXJPY"])
},
hasFreeDelaySymbols: function(e) {
return I(e, pro.getProductsByType(pro.PRODUCT_TYPES.exchange).map((function(
e) {
return e.exchange.toUpperCase() + "_DLY"
})))
},
getExchange: T,
getExchanges: x,
isExchange: function(e, t) {
return !!(e = T(e)) && e.substr(0, t.length) === t
},
SymbolToken: f,
IncompleteSymbolToken: v,
NumberToken: g,
BinaryOperatorToken: l,
OpenBraceToken: o,
CloseBraceToken: a,
ticker: function(e) {
return new f(e).ticker()
},
shortName: function(e) {
if ("string" != typeof e) throw new TypeError(
"expression must be a string");
var t = C(P(w(e)));
return t.forEach((function(e) {
e instanceof f && e.exchange(null)
})), M(t)
},
normalize: function(e) {
if ("string" != typeof e) throw new TypeError(
"expression must be a string");
return M(C(P(w(e))))
}
}
}();
e.exports = n
},
"96Yh": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "lineToolEntityInfo", (function() {
return o
})), i.d(t, "studyEntityInfo", (function() {
return a
})), i.d(t, "seriesEntityInfo", (function() {
return l
})), i.d(t, "entityForDataSource", (function() {
return c
}));
var s = i("3ClC"),
r = i("2jXJ"),
n = i("CW80");
function o(e) {
return {
id: e.id(),
name: (t = e.toolname, Object.keys(r.supportedLineTools).find(e => r.supportedLineTools[
e].name === t) || null)
};
var t
}
function a(e) {
return {
id: e.id(),
name: e.metaInfo().description
}
}
function l(e) {
return {
id: e.id(),
name: "Main Series"
}
}
function c(e, t) {
return t === e.mainSeries() ? l(e.mainSeries()) : Object(s.isStudy)(t) ? a(t) : Object(n
.isLineTool)(t) ? o(t) : null
}
},
"972a": function(e, t, i) {
"use strict";
var s, r, n, o;
i.d(t, "c", (function() {
return s
})), i.d(t, "a", (function() {
return r
})), i.d(t, "b", (function() {
return o
})),
function(e) {
e.AboveBar = "AboveBar", e.BelowBar = "BelowBar", e.Top = "Top", e.Bottom = "Bottom", e
.Right = "Right", e.Left = "Left", e.Absolute = "Absolute", e.AbsoluteUp =
"AbsoluteUp", e.AbsoluteDown = "AbsoluteDown"
}(s || (s = {})),
function(e) {
e.Left = "left", e.Center = "center", e.Right = "right"
}(r || (r = {})),
function(e) {
e.Top = "top", e.Middle = "middle", e.Bottom = "bottom"
}(n || (n = {})),
function(e) {
e[e.Solid = 0] = "Solid", e[e.Dotted = 1] = "Dotted", e[e.Dashed = 2] = "Dashed"
}(o || (o = {}))
},
"99ZO": function(e, t, i) {
"use strict";
var s, r;
i.r(t), i.d(t, "WeekDays", (function() {
return s
})), i.d(t, "Months", (function() {
return r
})),
function(e) {
e[e.SUNDAY = 1] = "SUNDAY", e[e.MONDAY = 2] = "MONDAY", e[e.TUESDAY = 3] = "TUESDAY", e[
e.WEDNESDAY = 4] = "WEDNESDAY", e[e.THURSDAY = 5] = "THURSDAY", e[e.FRIDAY =
6] = "FRIDAY", e[e.SATURDAY = 7] = "SATURDAY"
}(s || (s = {})),
function(e) {
e[e.JANUARY = 0] = "JANUARY", e[e.FEBRUARY = 1] = "FEBRUARY", e[e.MARCH = 2] = "MARCH",
e[e.APRIL = 3] = "APRIL", e[e.MAY = 4] = "MAY", e[e.JUNE = 5] = "JUNE", e[e.JULY =
6] = "JULY", e[e.AUGUST = 7] = "AUGUST", e[e.SEPTEMBER = 8] = "SEPTEMBER", e[e
.OCTOBER = 9] = "OCTOBER", e[e.NOVEMBER = 10] = "NOVEMBER", e[e.DECEMBER = 11] =
"DECEMBER"
}(r || (r = {}))
},
"9Jkk": function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("XlJ7"),
n = i("x0JF"),
o = i("Y7w9"),
a = i("Zp/P"),
l = i("VdBB"),
c = i("cPgM");
class h extends c.ScaledPaneRenderer {
constructor() {
super(...arguments),
this._data = null, this._barWidth = null
}
setData(e) {
this._data = e, this._barWidth = Math.max(1, Math.round(Object(a
.optimalHiLoWidth)(e.barSpacing)))
}
hitTest(e) {
if (null === this._data || null === this._barWidth) return null;
const t = this._data.bars,
i = .5 * this._data.barSpacing;
if (0 === t.length) return null;
if (e.x < t[0].time - i) return null;
if (e.x > t[t.length - 1].time + i) return null;
const s = t[Object(o.lowerbound)(t, e.x - i, (e, t) => e.time < t)];
if (e.x < s.time - i || e.x > s.time + i) return null;
const r = Object(a.interactionTolerance)().series + this._barWidth / 2,
n = Math.min(s.high, s.low),
c = Math.max(s.high, s.low),
h = this._data.fontSize;
return n - r - h <= e.y && e.y <= n + r || c - r <= e.y && e.y <= c + r + h ?
new l.HitTestResult(l.HitTestResult.REGULAR) : null
}
_drawImpl(e) {
if (null === this._data || null === this._barWidth) return;
e.save(), e.translate(.5, .5), e.textAlign = "center", e.fillStyle = this._data
.labelColor, e.font = Object(r.makeFont)(this._data.fontSize, this._data
.font);
const t = this._data.bars,
i = this._data.inverted;
for (let s = 0; s < t.length; ++s) {
const r = t[s],
n = Math.min(r.high, r.low),
o = Math.max(r.high, r.low);
e.fillText(i ? r.lowLabel : r.highLabel, r.time, n - this._data
.labelsPadding), e.fillText(i ? r.highLabel : r.lowLabel, r.time,
o + this._data.labelsPadding + this._data.fontSize)
}
e.restore()
}
}
var u = i("/hKg"),
d = i("Zy3/"),
p = i("vq8G"),
_ = i("u+0B"),
m = i("zDbI");
function f(e) {
return null != e
}
i.d(t, "SeriesHiLoPaneView", (function() {
return g
}));
class g extends n.SeriesBarCandlesPaneView {
constructor(e, t) {
super(e, t), this._widthsCache = new _.TextWidthCache, this._labelsRenderer =
new h, this._candlesRenderer = new u.PaneRendererCandles, this._canvas =
document.createElement("canvas"), this._context = Object(s.ensureNotNull)(
this._canvas.getContext("2d"));
const i = e.properties();
this._context.font = Object(r.makeFont)(i.hiloStyle.fontSize.value(), m
.CHART_FONT_FAMILY)
}
renderer(e, t, i) {
if (this._invalidated) {
const e = this._series().formatter(),
t = this._needLabels();
this._updateImpl(this._barUpdater.bind(this, e, t)), this._invalidated = !1
}
const s = this._series().properties().hiloStyle,
r = this._model().timeScale().barSpacing(),
n = this._needLabels() && this._bars().every(e => e.highLabelWidth <= r && e
.lowLabelWidth <= r),
o = {
bars: this._bars(),
wickVisible: !1,
bodyVisible: s.drawBody.value(),
barSpacing: r,
borderVisible: s.showBorders.value(),
barWidth: Object(a.optimalHiLoWidth)(r),
font: m.CHART_FONT_FAMILY,
fontSize: s.fontSize.value(),
labelColor: s.labelColor.value(),
inverted: this._series().priceScale().isInverted(),
labelsPadding: 3
},
l = new d.CompositeRenderer;
return this._candlesRenderer.setData(o), l.append(this._candlesRenderer), n && (
this._labelsRenderer.setData(o), l.append(this._labelsRenderer)), this
._model().selection().isSelected(this._series()) && this
._isMarkersEnabled && l.append(new p.SelectionRenderer(this
._selectionData)), l
}
topPixelMargin() {
return this._margin()
}
bottomPixelMargin() {
return this._margin()
}
_margin() {
const e = this._series().properties().hiloStyle;
return e.showLabels.value() ? e.fontSize.value() + 6 : 0
}
_barUpdater(e, t, i, s) {
const r = i[2],
n = i[3];
return !(!f(r) || !f(n)) && (s.high = s.open = r, s.low = s.close = n, t && (s
.highLabel = e.format(r),
s.highLabelWidth = this._getLabelWidth(s.highLabel), s.lowLabel = e
.format(n), s.lowLabelWidth = this._getLabelWidth(s.lowLabel)), !0)
}
_needLabels() {
const e = this._model().timeScale().barSpacing();
return this._series().properties().hiloStyle.showLabels.value() && e > 5
}
_getLabelWidth(e) {
return this._widthsCache.measureText(this._context, e)
}
}
},
"9QkW": function(e, t, i) {
"use strict";
var s = i("7ADh").LineToolFibWedgeBase,
r = i("5rJj"),
n = i("j3hX"),
o = n.LineToolWidthsProperty,
a = n.LineToolColorsProperty;
class l extends s {
constructor(e, t) {
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"1SUO", 7)).then(({
FibWedgePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
isSynchronizable() {
return !1
}
levelsCount() {
return l.LevelsCount
}
name() {
return "Fib Wedge"
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
static createProperties(e) {
var t = new r("linetoolfibwedge", e, !1, {
range: [1, 11]
});
return l._configureProperties(t), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "6mGk")))
.FibWedgeDefinitionsViewModel
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline")
.child("color")
], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child(
"linewidth")), i.push(e.child("level" + r).child("color"));
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
}
}
l.LevelsCount = 11, t.LineToolFibWedge = l
},
"9dnG": function(e, t) {
e.exports =
''
},
"9iCb": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "applyOverridesToStudy", (function() {
return h
})), i.d(t, "applyOverridesToStudyDefaults", (function() {
return u
}));
var s = i("Eyy1"),
r = i("23IT"),
n = i("txPx");
const o = Object(n.getLogger)("Chart.Model.StudyPropertiesOverrider");
var a, l;
function c(e, t, i, s) {
const r = i.split(".");
if (0 === r.length || 0 === r[0].length) return;
const n = function(e) {
const t = e.split(":");
return {
name: t[0],
type: 2 === t.length ? t[1] : null
}
}(r[0]),
c = n.name,
h = n.type,
u = null !== h,
d = !u || "band" === h,
p = !u || "area" === h,
_ = !u || "input" === h,
m = !u || "plot" === h ? l.getPlotIdByTitle(e, c) : null,
f = d ? l.getBandIndexByName(e, c) : null,
g = p ? l.getFilledAreaIdByTitle(e, c) : null,
b = _ ? l.getInputByName(e, c) : null,
v = t.hasOwnProperty(c);
if ((null !== m ? 1 : 0) + (null !== f ? 1 : 0) + (null !== g ? 1 : 0) + (null !== b ? 1 :
0) + (v ? 1 : 0) > 1) return void o.logWarn(
`Study '${e.description}' has ambiguous identifier '${c}'`);
const S = r[1];
if (null !== m) {
if (1 === r.length) return void o.logWarn(
`Path of sub-property of '${c}' plot for study '${e.description}' must be not empty`
);
const i = r.slice(1);
a.applyPlotProperty(e, t, m, i, s)
} else if (null !== b) a.applyInputValue(t, b, s);
else if (null !== f) {
if (void 0 === S) return void o.logWarn(
`Property name of '${c}' band for study '${e.description}' must be set`);
a.applyBandProperty(t, f, S, s)
} else if (null !== g) {
if (void 0 === S) return void o.logWarn(
`Property name of '${c}' area for study '${e.description}' must be set`);
a.applyFilledAreaProperty(t, g, S, s)
} else v ? a.setRootProperty(t, r, s) : o.logWarn(
`Study '${e.description}' has no plot or input '${c}'`)
}
function h(e, t) {
const i = e.properties(),
s = i.state();
for (const i in t) t.hasOwnProperty(i) && c(e.metaInfo(), s, i, t[i]);
i.mergeAndFire(s)
}
function u(e, t, i) {
for (const s in e) {
if (!e.hasOwnProperty(s)) continue;
const r = s.indexOf(".");
if (-1 === r) continue;
const n = s.substr(0, r),
a = l.getMetaInfoByDescription(t, n);
if (null === a) {
o.logWarn("There is no such study " + n);
continue
}
const h = i(a);
null !== h ? c(a, h, s.substr(r + 1), e[s]) : o.logWarn(
"Cannot apply overrides for study " + n)
}
}! function(e) {
const t = {
line: r.LineStudyPlotStyle.Line,
histogram: r.LineStudyPlotStyle.Histogram,
cross: r.LineStudyPlotStyle.Cross,
area: r.LineStudyPlotStyle.Area,
columns: r.LineStudyPlotStyle.Columns,
circles: r.LineStudyPlotStyle.Circles,
line_with_breaks: r.LineStudyPlotStyle.LineWithBreaks,
area_with_breaks: r.LineStudyPlotStyle.AreaWithBreaks
};
e.applyPlotProperty = function(e, i, n, a, l) {
if (void 0 === i.styles) return void o.logWarn("Study does not have styles");
const c = a[0];
if ("color" === c) {
return void
function(e, t, i, r, n) {
if (void 0 !== e.styles)
if (null === t && !isNaN(r) && r > 0) o.logWarn(
"Study plot does not have color #" + r);
else {
if (0 === r || isNaN(r)) {
Object(s.ensureDefined)(e.styles[i]).color = String(n), r = 0
}
null !== t && (Object(s.ensureDefined)(t.colors[r]).color = String(
n))
}
else o.logWarn("Study does not have styles")
}(i, function(e, t, i) {
if (void 0 === e.plots) return null;
for (const s of e.plots) {
if (!Object(r.isColorerPlot)(s) || void 0 === t.palettes) continue;
const e = t.palettes[s.palette];
if (s.target === i && void 0 !== e) return e
}
return null
}(e, i, n), n, a.length > 1 ? parseInt(a[1]) : NaN, l)
}
const h = i.styles[n];
if (void 0 !== h && h.hasOwnProperty(c)) {
if ("plottype" === c) {
const e = t[String(l)];
if (void 0 === e) return void o.logWarn("Unsupported plot type for plot: " +
l);
l = e
}
h[c] = l
} else o.logWarn(`Study plot does not have property '${c}'`)
}, e.applyBandProperty = function(e, i, s, r) {
if (void 0 === e.bands) return void o.logWarn("Study does not have bands");
const n = e.bands[i];
if (void 0 !== n && n.hasOwnProperty(s)) {
if ("plottype" === s) {
const e = t[String(r)];
if (void 0 === e) return void o.logWarn("Unsupported plot type for band: " +
r);
r = e
}
n[s] = r
} else o.logWarn(`Study band does not have property '${s}'`)
}, e.applyFilledAreaProperty = function(e, t, i, s) {
if (void 0 === e.filledAreasStyle) return void o.logWarn(
"Study does not have areas");
const r = e.filledAreasStyle[t];
void 0 !== r && r.hasOwnProperty(i) ? r[i] = s : o.logWarn(
`Study area does not have property '${i}'`)
}, e.applyInputValue = function(e, t, i) {
void 0 !== e.inputs && e.inputs.hasOwnProperty(t) ? e.inputs[t] = i : o.logWarn(
`Study does not have input '${t}'`)
}, e.setRootProperty = function(e, t, i) {
if (0 === t.length) return;
let s = e;
for (const e of t.slice(0, -1)) {
if (null == s || !s.hasOwnProperty(e)) break;
s = s[e]
}
const r = t[t.length - 1];
null != s && s.hasOwnProperty(r) ? s[r] = i : o.logWarn(
"Study does not have property " + t.join("."))
}
}(a || (a = {})),
function(e) {
e.getInputByName = function(e, t) {
if (void 0 === e.inputs) return null;
t = t.toLowerCase();
for (const i of e.inputs)
if (i.name.toLowerCase() === t) return i.id;
return null
}, e.getPlotIdByTitle = function(e, t) {
if (void 0 === e.styles) return null;
t = t.toLowerCase();
for (const i in e.styles) {
const s = e.styles[i];
if ((void 0 !== s && void 0 !== s.title ? s.title : i).toLowerCase() === t)
return i
}
return null
}, e.getFilledAreaIdByTitle = function(e, t) {
if (void 0 === e.filledAreas) return null;
t = t.toLowerCase();
for (const i of e.filledAreas)
if (i.title.toLowerCase() === t) return i.id;
return null
}, e.getBandIndexByName = function(e, t) {
if (void 0 === e.bands) return null;
t = t.toLowerCase();
for (let i = 0; i < e.bands.length; ++i)
if (e.bands[i].name.toLowerCase() === t) return i;
return null
}, e.getMetaInfoByDescription = function(e, t) {
t = t.toLowerCase();
for (const i of e)
if (i.description.toLowerCase() === t || i.shortDescription.toLowerCase() === t)
return i;
return null
}
}(l || (l = {}))
},
"9nLJ": function(e, t, i) {
"use strict";
(function(t, s) {
var r = i("PT1i").linking,
n = (i("jofe").createDeferredPromise, i("Q19o")),
o = i("VNzU").layouts,
a = i("FQhm"),
l = i("5VQP").ContextMenuManager,
c = i("mMWL"),
h = i("pPtI"),
u = i("zUrt").backend,
d = i("txPx"),
p = i("fZEr").showWarning,
_ = i("fZEr").showConfirm,
m = i("2jXJ"),
f = i("sJA2").ThemesApi,
g = i("ZjKI").CLOSE_POPUPS_AND_DIALOGS_COMMAND,
b = i("LxhU").Interval,
v = i("Ocx9").saveDefaultProperties,
S = i("htUT").ChartChangesWatcher,
y = i("xt3Q").TradingViewApiBase,
w = i("0YCj"),
P = i("pZDF").getStudyInputsInfo;
e.exports = class extends y {
constructor(e) {
const {
chartWidgetCollection: i,
chartApiInstance: s = null,
saveChartService: r,
loadChartService: n,
alertsDispatcher: o,
supportTicketData: a,
favoriteServices: l,
studyMarket: c = null,
financialsDialog: h = null
} = e;
super({
chartApiInstance: s,
chartWidgetCollection: i,
studyMarket: c,
financialsDialog: h,
saveChartService: r,
loadChartService: n
}), this._chartApiInstance = s, this._loadChartService = n, this
._alertsDispatcher = o, this._supportTicketData = a, this
._favoriteServices = l, this._proxyWatchListChangedDelegate = null,
this._lockDrawingsWatchedValue = null, this
._hideDrawingsWatchedValue = null, this
._hideIndicatorsWatchedValue = null, this
._magnetEnabledWatchedValue = null, this._magnetModeWatchedValue =
null, this._replayApi = null, this._chartChangesWatcher = null, this
._hasChartChangesWatchedValue = null, this._getDataSourceHub =
function() {
return i.activeChartWidget.value().model().model()
}, this._chartWidgetCollection.getResizerDetacher = function() {
return i.activeChartWidget.value().getResizerDetacher()
}, this._alertService = this._alertsDispatcher ? new(void 0)(this
._alertsDispatcher, this._getDataSourceHub) : null, this
._activeChangedChangedDelegate = new t, this._chartWidgetCollection
.activeChartWidget.subscribe(function() {
this._activeChangedChangedDelegate.fire()
}.bind(this)), this._chartWidgets = new WeakMap, this
._activateChart = function(e) {
i.activeChartWidget.setValue(e)
}
}
subscribe(e, t) {
a.subscribe(e, t)
}
unsubscribe(e, t) {
a.unsubscribe(e, t)
}
onContextMenu(e) {
a.subscribe("onContextMenu", (function(t) {
t.callback(e(t.unixtime, t.price))
}))
}
onGrayedObjectClicked(e) {
a.subscribe("onGrayedObjectClicked", e)
}
activeChart() {
return this._getChartWidgetApi(this._chartWidgetCollection
.activeChartWidget.value())
}
_getChartWidgetApi(e) {
var t = this._chartWidgets.get(e);
return void 0 === t && (t = new n(e, this._activateChart.bind(null, e)),
this._chartWidgets.set(e, t)), t
}
onActiveChartChanged() {
return this._activeChangedChangedDelegate
}
changeSymbol(e, t, i) {
r.interval.setValue(b.normalize(t)), r.symbol.setValue(e), i && this
.activeChart().onDataLoaded().subscribe(null, i, !0)
}
setLayout(e) {
this._chartWidgetCollection.setLayout(e)
}
layout() {
return this._chartWidgetCollection.layout.value()
}
layoutName() {
return this._chartWidgetCollection.metaInfo.name.value()
}
layoutNameWatchedValue() {
return this._chartWidgetCollection.metaInfo.name.readonly()
}
layoutSettingsDrawer() {
throw new Error("not implemented")
}
chartsCount() {
return o[this.layout()].count
}
viewMode() {
throw new Error("not implemented")
}
viewModeWatchedValue() {
throw new Error("not implemented")
}
setForceFullscreenMode() {
throw new Error("not implemented")
}
setMultichartMode() {
throw new Error("not implemented")
}
setActiveChart(e) {
throw new Error("not implemented")
}
chart(e) {
if (void 0 === e && (e = 0), e < 0 || e >= this.chartsCount())
throw Error("Incorrect index: " + e);
return this._getChartWidgetApi(this._chartWidgetCollection.getAll()[e])
}
getSymbolInterval(e) {
var t = {
symbol: r.symbol.value(),
interval: r.interval.value()
};
return e && e(t), t
}
saveChart(e) {
if (this._saveChartService) {
var t = this;
this._saveChartService.whenReadyToSave((function() {
var i = t._saveChartService.saveToJSON();
return e && e(JSON.parse(i.content))
}))
}
}
loadChart(e) {
this._chartApiInstance.disconnect(), this._chartWidgetCollection
.loadContent(e.json), this._chartWidgetCollection
.purgeUnusedWidgets(), e.extendedData && (this
._chartWidgetCollection.metaInfo.id.setValue(e.extendedData
.uid), this._chartWidgetCollection.metaInfo.uid.setValue(e
.extendedData.uid), this._chartWidgetCollection.metaInfo
.name.setValue(e.extendedData.name)), this._chartApiInstance
.connect(), r.symbol.setValue(this.activeChart().symbol()), a.emit(
"chart_loaded")
}
getStudiesList() {
return this._chartApiInstance.allStudiesMetadata().filter((function(e) {
return !e.is_hidden_study
})).map((function(e) {
return e.description
}))
}
getStudyInputs(e) {
{
const t = w.findStudyMetaInfoByDescription(this._chartApiInstance
.allStudiesMetadata(), e);
return P(t)
}
}
getSavedCharts(e) {
u.getCharts().then(e)
}
loadChartFromServer(e) {
u.loadChart(e)
}
saveChartToServer(e, t, i) {
this._saveChartService && this._saveChartService.saveChartSilently(e, t,
i)
}
setAutosave(e) {
this._saveChartService && this._saveChartService.autoSaveEnabled()
.setValue(e)
}
removeChartFromServer(e, t) {
u.removeChart(e).then(t)
}
getIntervals() {
var e = [],
t = h.getCustomResolutions();
return null !== this._chartApiInstance && (e = this._chartApiInstance
.defaultResolutions()), h.mergeResolutions(e, t)
}
closePopupsAndDialogs() {
for (var e = document.querySelectorAll("._tv-dialog-title-close"), t =
0; t < e.length; t++) e[t].click();
l.hideAll(), a.emit(g)
}
selectLineTool(e) {
m.supportedLineTools[e] && (e = m.supportedLineTools[e].name, c.tool
.value() !== e && c.tool.setValue(e))
}
selectedLineTool() {
for (var e = Object.keys(m.supportedLineTools), t = c.tool.value(), i =
0; i < e.length; ++i)
if (m.supportedLineTools[e[i]].name === t) return e[i];
return ""
}
lockAllDrawingTools() {
return null === this._lockDrawingsWatchedValue && (this
._lockDrawingsWatchedValue = new s(c.lockDrawings().value()),
this._lockDrawingsWatchedValue.subscribe((function(e) {
c.lockDrawings().setValue(e)
})), c.lockDrawings().subscribe(this, (function() {
this._lockDrawingsWatchedValue.setValue(c
.lockDrawings().value())
}))), this._lockDrawingsWatchedValue
}
hideAllDrawingTools() {
return null === this._hideDrawingsWatchedValue && (this
._hideDrawingsWatchedValue = new s(c.hideAllDrawings().value()),
this._hideDrawingsWatchedValue.subscribe((function(e) {
c.hideAllDrawings().setValue(e)
})), c.hideAllDrawings().subscribe(this, (function() {
this._hideDrawingsWatchedValue.setValue(c
.hideAllDrawings().value())
}))), this._hideDrawingsWatchedValue
}
hideAllIndicators() {
return null === this._hideIndicatorsWatchedValue && (this
._hideIndicatorsWatchedValue = new s(c.hideAllIndicators()
.value()), this._hideIndicatorsWatchedValue.subscribe((
function(e) {
c.hideAllIndicators().setValue(e)
})), c.hideAllIndicators().subscribe(this, (function() {
this._hideIndicatorsWatchedValue.setValue(c
.hideAllIndicators().value())
}))), this._hideIndicatorsWatchedValue
}
magnetEnabled() {
return null === this._magnetEnabledWatchedValue && (this
._magnetEnabledWatchedValue = new s(c.properties().magnet
.value()), this._magnetEnabledWatchedValue.subscribe((
function(
e) {
v(!0), c.properties().magnet.setValue(e), v(!1)
})), c.properties().magnet.subscribe(this, (function() {
this._magnetEnabledWatchedValue.setValue(c
.properties().magnet.value())
}))), this._magnetEnabledWatchedValue
}
magnetMode() {
return null === this._magnetModeWatchedValue && (this
._magnetModeWatchedValue = new s(c.properties().magnetMode
.value()), this._magnetModeWatchedValue.subscribe((function(
e) {
v(!0), c.properties().magnetMode.setValue(e), v(!1)
})), c.properties().magnetMode.subscribe(this, (function() {
this._magnetModeWatchedValue.setValue(c.properties()
.magnetMode.value())
}))), this._magnetModeWatchedValue
}
mainSeriesPriceFormatter() {
return this._chartWidgetCollection.activeChartWidget.value().model()
.mainSeries().priceScale().formatter()
}
showNoticeDialog(e) {
p({
title: (e = e || {}).title,
text: e.body || "",
onClose: e.callback
})
}
showConfirmDialog(e) {
if (!(e = e || {}).callback) throw Error("callback must be exist");
var t = e.callback;
function i(e) {
t && (t(e), t = null)
}
_({
title: e.title,
text: e.body || "",
onClose: function() {
i(!1)
},
onConfirm: function(e) {
i(!0), e.dialogClose()
}
})
}
logs() {
return {
getLogHistory: d.getLogHistory,
enable: d.loggingOn,
disable: d.loggingOff
}
}
watchlist() {
throw new Error("not implemented")
}
setWatchlistApiPromise(e) {
throw new Error("not implemented")
}
news() {
throw new Error("not implemented")
}
setNewsApiPromise(e) {
throw new Error("not implemented")
}
showLoadChartDialog() {
var e = this._loadChartService;
e && e.showLoadDialog()
}
showSaveAsChartDialog() {
var e = this._saveChartService;
e && window.runOrSignIn((function() {
e.saveChartAs()
}), {
source: "Save as chart dialogue"
})
}
drawOnAllCharts(e) {
return c.drawOnAllCharts().setValue(e)
}
themes() {
return new f({
chartWidgetCollection: this._chartWidgetCollection
})
}
undoRedoState() {
return this._chartWidgetCollection.undoHistory.state()
}
clearUndoHistory() {
return this._chartWidgetCollection.undoHistory.clearStack()
}
undo() {
return this._chartWidgetCollection.undoHistory.undo()
}
redo() {
return this._chartWidgetCollection.undoHistory.redo()
}
trading() {
throw new Error("Not implemented")
}
waitTrading() {
throw new Error("Not implemented")
}
symbolSearch() {
throw new Error("Not implemented")
}
saveChartOrShowTitleDialog(e, t, i) {
throw new Error("Not implemented")
}
showRenameChartDialog() {
throw new Error("Not implemented")
}
setUserInfo(e) {
throw new Error("Not implemented")
}
connect() {
throw new Error("Not implemented")
}
disconnect() {
throw new Error("Not implemented")
}
loginRequired() {
throw new Error("Not implemented")
}
onConnectionStatusChanged(e) {
throw new Error("Not implemented")
}
isConnected() {
throw new Error("Not implemented")
}
showCreateAlertDialog() {
throw new Error("Not implemented")
}
alertService() {
throw new Error("Not implemented")
}
publishChart(e) {
throw new Error("Not implemented")
}
setPublishChartOptions(e) {
throw new Error("Not implemented")
}
showSupportDialog() {
throw new Error("Not implemented")
}
openMobileChartPicker() {
throw new Error("Not implemented")
}
closeMobileChartPicker() {
throw new Error("Not implemented")
}
replayApi() {
throw new Error("Not implemented")
}
takeScreenshot() {
return this._chartWidgetCollection.takeScreenshot()
}
setSymbolSearchUI(e) {
throw new Error("Not implemented")
}
setIntervalLinkingEnabled(e) {
this._chartWidgetCollection.lock.interval.setValue(e)
}
setTimeFrame(e) {
this._chartWidgetCollection.setTimeFrame(e)
}
symbolSync() {
return this._chartWidgetCollection.lock.symbol
}
intervalSync() {
return this._chartWidgetCollection.lock.interval
}
crosshairSync() {
return this._chartWidgetCollection.lock.crosshair
}
timeSync() {
return this._chartWidgetCollection.lock.trackTime
}
startFullscreen() {
return this._chartWidgetCollection.startFullscreen()
}
exitFullscreen() {
return this._chartWidgetCollection.exitFullscreen()
}
takeClientScreenshot(e) {
return this._chartWidgetCollection.clientSnapshot(e)
}
getFavoriteIntervalsService() {
throw new Error("not implemented")
}
getFavoriteChartStylesService() {
throw new Error("not implemented")
}
getLinetoolsFavoritesStore() {
throw new Error("not implemented")
}
supportTicketData() {
return this._supportTicketData
}
hasChartChanges() {
return null === this._chartChangesWatcher && null === this
._hasChartChangesWatchedValue && (this._chartChangesWatcher = new S(
this._chartWidgetCollection.undoHistory, window.saver, a),
this._hasChartChangesWatchedValue = new s(this
._chartChangesWatcher.hasChanges()), this
._chartChangesWatcher.getOnChange().subscribe(this, (
function() {
this._hasChartChangesWatchedValue.setValue(this
._chartChangesWatcher.hasChanges())
}))), this._hasChartChangesWatchedValue
}
}
}).call(this, i("aIyQ"), i("hY0g"))
},
"9uLv": function(e, t, i) {
"use strict";
var s = i("K9GE");
i.d(t, "a", (function() {
return s.a
})), i.d(t, "b", (function() {
return s.b
})), i.d(t, "c", (function() {
return s.c
}))
},
"9zVu": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "DrawingToolbarBootloader", (function() {
return a
}));
var s = i("OiSa"),
r = i("7RN7"),
n = i("cZRT"),
o = i("YuHv");
class a extends n.a {
constructor(e) {
super(), this._opts = e, s.isDrawingToolbarVisible.value() && (this._opts
.resizerBridge.negotiateWidth(r.b), this._opts.resizerBridge.container
.value().appendChild(Object(o.a)()))
}
_startLoading() {
return Promise.all([i.e("react"), i.e(1), i.e(4), i.e(6), i.e(11), i.e(12), i.e(
24), i.e(29), i.e(67), i.e(70), i.e(77), i.e(0), i.e(5), i.e(7),
i.e(10), i.e("line-tools-icons"), i.e(53), i.e(57), i.e(
"drawing-toolbar")
]).then(i.bind(null, "5f7t")).then(e => new e.DrawingToolbarRenderer(this
._opts.resizerBridge.container.value(), {
...this._opts
}))
}
}
},
AE9l: function(e, t, i) {},
"AWC/": function(e, t, i) {
e.exports = {
container: "container-e6Js9pSl",
inner: "inner-e6Js9pSl",
"border-left": "border-left-e6Js9pSl",
"border-right": "border-right-e6Js9pSl",
"border-top": "border-top-e6Js9pSl",
"border-bottom": "border-bottom-e6Js9pSl",
"top-right-radius": "top-right-radius-e6Js9pSl",
"top-left-radius": "top-left-radius-e6Js9pSl",
"bottom-right-radius": "bottom-right-radius-e6Js9pSl",
"bottom-left-radius": "bottom-left-radius-e6Js9pSl"
}
},
"Aba+": function(e, t, i) {},
ApcL: function(e, t, i) {
"use strict";
i.r(t);
var s = i("ogJP"),
r = i("vTIA");
var n = i("txPx"),
o = i("oXaB"),
a = i("wZIs"),
l = i("sDZI"),
c = i("FIi8"),
h = i("4vW/");
i.d(t, "gridPreferencesDefault", (function() {
return d
})), i.d(t, "crossHairPreferencesDefault", (function() {
return p
})), i.d(t, "legendPreferencesDefault", (function() {
return _
})), i.d(t, "priceScalePreferencesDefault", (function() {
return m
})), i.d(t, "panePreferencesDefault", (function() {
return f
})), i.d(t, "scalesPreferencesBaseDefault", (function() {
return g
})), i.d(t, "scalesPreferencesToApplyDefault", (function() {
return b
})), i.d(t, "chartEventsSourceBreaksPreferencesDefault", (function() {
return v
})), i.d(t, "chartEventsSourcePreferencesDefault", (function() {
return S
})), i.d(t, "timeScalePreferencesDefault", (function() {
return y
})), i.d(t, "statusViewPreferencesDefault", (function() {
return w
})), i.d(t, "highLowAvgPreferencesDefault", (function() {
return P
})), i.d(t, "mainSeriesPreferencesDefault", (function() {
return C
})), i.d(t, "chartPreferencesBaseDefault", (function() {
return x
})), i.d(t, "chartPreferencesToApplyDefault", (function() {
return T
})), i.d(t, "chartPreferencesToRestoreDefault", (function() {
return I
})), i.d(t, "createPreferencesObject", (function() {
return M
})), i.d(t, "preferencesByWhiteList", (function() {
return O
})), i.d(t, "defaultsPreferencesByWhiteList", (function() {
return L
}));
const u = Object(n.getLogger)("Chart.ApplyPreferencesToAllCharts"),
d = {
color: "",
style: 0
},
p = {
color: "",
style: 0,
transparency: 0,
width: 0
},
_ = {
showStudyArguments: !1,
showStudyTitles: !1,
showStudyValues: !1,
showSeriesTitle: !1,
showSeriesOHLC: !1,
showLegend: !1,
showBarChange: !0,
showBackground: !0,
backgroundTransparency: 0,
wrapText: !1
},
m = {
autoScale: !1,
autoScaleDisabled: !1,
lockScale: !1,
percentage: !1,
percentageDisabled: !1,
log: !1,
logDisabled: !1,
alignLabels: !1,
isInverted: !1,
indexedTo100: !1
},
f = {
backgroundType: h.ColorType.Solid,
background: "",
backgroundGradientStartColor: "",
backgroundGradientEndColor: "",
topMargin: 0,
bottomMargin: 0,
rightOffset: 0,
horzGridProperties: Object(c.deepExtend)({}, d),
vertGridProperties: Object(c.deepExtend)({}, d),
crossHairProperties: Object(c.deepExtend)({}, p),
legendProperties: Object(c.deepExtend)({}, _),
axisProperties: Object(c.deepExtend)({}, m)
},
g = {
lineColor: "",
textColor: "",
fontSize: 0,
scaleSeriesOnly: !1,
showSeriesLastValue: !1,
seriesLastValueMode: o.PriceAxisLastValueMode.LastValueAccordingToScale,
showSeriesPrevCloseValue: !1,
showStudyLastValue: !1,
showSymbolLabels: !1,
showStudyPlotLabels: !1,
showBidAskLabels: !1,
showPrePostMarketPriceLabel: !0,
showFundamentalLastValue: !1,
showFundamentalNameLabel: !1,
showCurrency: !0,
showUnit: !0
},
b = {
...g
},
v = {
color: "",
visible: !1,
style: 0,
width: 0
},
S = {
visible: !1,
futureOnly: !1,
breaks: Object(c.deepExtend)({}, v)
},
y = {
defaultRightOffset: 0
},
w = {
fontSize: 16,
showExchange: !0,
showInterval: !0,
symbolTextSource: "description"
},
P = {
highLowPriceLinesVisible: !1,
highLowPriceLabelsVisible: !1,
averageClosePriceLineVisible: !1,
averageClosePriceLabelVisible: !1
},
C = {
style: 0,
minTick: 0,
showPriceLine: !1,
priceLineWidth: 0,
priceLineColor: "",
showPrevClosePriceLine: !1,
showCountdown: !0,
prevClosePriceLineWidth: 0,
sessionId: "regular",
prevClosePriceLineColor: "",
esdShowDividends: !1,
esdShowSplits: !1,
esdShowEarnings: !1,
esdShowBreaks: !1,
dividendsAdjustment: !1,
statusViewStyle: Object(c.deepExtend)({}, w),
priceAxisProperties: Object(c.deepExtend)({}, m),
highLowAvgPrice: Object(c.deepExtend)({}, P),
candleStyle: Object(c.deepExtend)({}, {
upColor: "",
downColor: "",
drawWick: !1,
drawBorder: !1,
drawBody: !0,
borderColor: "",
borderUpColor: "",
borderDownColor: "",
wickColor: "",
wickUpColor: "",
wickDownColor: "",
barColorsOnPrevClose: !1
}),
hollowCandleStyle: Object(c.deepExtend)({}, {
upColor: "",
downColor: "",
drawWick: !1,
drawBorder: !1,
drawBody: !0,
borderColor: "",
borderUpColor: "",
borderDownColor: "",
wickColor: "",
wickUpColor: "",
wickDownColor: ""
}),
barStyle: Object(c.deepExtend)({}, {
upColor: "",
downColor: "",
barColorsOnPrevClose: !1,
dontDrawOpen: !1,
thinBars: !0
}),
lineStyle: Object(c.deepExtend)({}, {
color: "",
linestyle: 0,
linewidth: 0,
styleType: 0
}),
areaStyle: Object(c.deepExtend)({}, {
color1: "",
color2: "",
linecolor: "",
linestyle: 0,
linewidth: 0,
transparency: 0
}),
baselineStyle: Object(c.deepExtend)({}, {
topFillColor1: "",
topFillColor2: "",
bottomFillColor1: "",
bottomFillColor2: "",
topLineColor: "",
bottomLineColor: "",
topLineWidth: 0,
bottomLineWidth: 0,
transparency: 0,
baseLevelPercentage: 0
}),
hiloStyle: Object(c.deepExtend)({}, {
color: "",
showBorders: !1,
borderColor: "",
showLabels: !1,
labelColor: "",
fontSize: 0,
drawBody: !0
}),
haStyle: Object(c.deepExtend)({}, {
upColor: "",
downColor: "",
drawWick: !1,
drawBorder: !1,
drawBody: !0,
borderColor: "",
borderUpColor: "",
borderDownColor: "",
wickColor: "",
wickUpColor: "",
wickDownColor: "",
showRealLastPrice: !1,
barColorsOnPrevClose: !1,
inputs: {}
}),
renkoStyle: Object(c.deepExtend)({}, {
upColor: "",
downColor: "",
borderUpColor: "",
borderDownColor: "",
upColorProjection: "",
downColorProjection: "",
borderUpColorProjection: "",
borderDownColorProjection: "",
wickUpColor: "",
wickDownColor: "",
inputs: {
boxSize: 0,
style: "",
atrLength: 0,
wicks: !1,
sources: "",
source: ""
}
}),
pbStyle: Object(c.deepExtend)({}, {
upColor: "",
downColor: "",
borderUpColor: "",
borderDownColor: "",
upColorProjection: "",
downColorProjection: "",
borderUpColorProjection: "",
borderDownColorProjection: "",
inputs: {
source: "",
lb: 0
}
}),
kagiStyle: Object(c.deepExtend)({}, {
upColor: "",
downColor: "",
upColorProjection: "",
downColorProjection: "",
inputs: {
style: "",
atrLength: 0,
reversalAmount: 0
}
}),
pnfStyle: Object(c.deepExtend)({}, {
upColor: "",
downColor: "",
upColorProjection: "",
downColorProjection: "",
inputs: {
reversalAmount: 0,
boxSize: 0,
style: "",
atrLength: 0
}
}),
rangeStyle: Object(c.deepExtend)({}, {
upColor: "",
downColor: "",
upColorProjection: "",
downColorProjection: "",
thinBars: !1,
inputs: {
range: 0,
phantomBars: !1
}
})
},
x = {
priceScaleSelectionStrategyName: "auto",
timeScale: Object(c.deepExtend)({}, y),
mainSeries: Object(c.deepExtend)({}, C),
sessions: Object(c.deepExtend)({}, l.sessionsPreferencesDefault),
paneProperties: Object(c.deepExtend)({}, f),
chartEventsSourceProperties: Object(c.deepExtend)({}, S),
tradingProperties: Object(c.deepExtend)({}, r.tradingPreferencesDefault)
},
T = {
timezone: "",
scalesProperties: Object(c.deepExtend)({}, b),
...x
},
I = {
scalesProperties: Object(c.deepExtend)({}, g),
...x
};
function M(e, t, i, r, n = !0) {
if (void 0 === t[e]) return u.logDebug(
`We haven't had this property ${r}.${e} yet, please, remove it from whiteList`),
null;
if (Object(s.isObject)(i[e])) {
const s = Object.keys(i[e]);
let o = "";
return s.map(s => ({
[s]: M(s, t[e], i[e], `${r}.${e}`, n)
})).reduce((e, t) => (o = Object.keys(t)[0], e[o] = t[o], e), {})
}
return n ? t[e].value() : t[e]
}
function O(e, t, i = T) {
const s = {
timezone: "",
priceScaleSelectionStrategyName: "auto",
timeScale: {
defaultRightOffset: e.timeScale().defaultRightOffsetProperty().value()
},
mainSeries: {},
sessions: {},
paneProperties: {},
scalesProperties: {},
chartEventsSourceProperties: {},
tradingProperties: {}
},
r = ["timeScale", "mainSeries", "sessions"],
n = i.mainSeries,
o = Object.keys(i),
a = Object.keys(n),
l = t.properties(),
c = e.properties(),
h = i.sessions,
u = Object.keys(h),
d = e.sessions().properties();
return a.forEach(e => {
s.mainSeries[e] = M(e, l, n, "mainSeries")
}), u.forEach(e => {
s.sessions[e] = M(e, d, h, "sessions")
}), o.forEach(e => {
r.includes(e) || (s[e] = M(e, c, i, "preferences"))
}), s
}
function L(e, t, i = I) {
const s = {
timeScale: {
defaultRightOffset: e.timeScale().rightOffsetDefaultValue()
},
mainSeries: {},
sessions: Object(c.deepExtend)({}, l.sessionsPreferencesDefault),
paneProperties: {},
scalesProperties: {},
chartEventsSourceProperties: {},
tradingProperties: {},
priceScaleSelectionStrategyName: "auto"
},
r = ["timeScale", "mainSeries", "sessions"],
n = i.mainSeries,
o = Object.keys(i),
h = Object.keys(n),
u = Object(a.factoryDefaults)("chartproperties.mainSeriesProperties"),
d = Object(a.factoryDefaults)("chartproperties");
return h.forEach(e => {
s.mainSeries[e] = M(e, u, n, "mainSeries", !1)
}), o.forEach(e => {
r.includes(e) || (s[e] = M(e, d, i, "preferences", !1))
}), s
}
},
Az04: function(e, t, i) {
"use strict";
var s = i("aO4+").Point,
r = i("GEp6").distanceToLine,
n = i("Ss5c").LineDataSource,
o = i("Ocx9").DefaultProperty,
a = i("j3hX").LineToolColorsProperty;
class l extends n {
constructor(e, t) {
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"lZ9F", 7)).then(({
RotatedRectanglePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
startChanging(e, t) {
if (super.startChanging(e, t), 0 === e || 1 === e) {
var i = this._getPaneViews()[0],
s = i._points[0],
n = i._points[1],
o = i._points[2];
this._distance = r(s, n, o).distance
}
}
setPoint(e, t, i) {
if (super.setPoint(e, t, i), 0 === e || 1 === e) {
var r = this._getPaneViews()[0];
r.update();
var n = r._points[0],
o = r._points[1].subtract(n),
a = new s(o.y, -o.x).normalized().scaled(this._distance),
l = n.add(a),
c = this.screenPointToPoint(l);
this._points[2] = c
}
}
endChanging(e, t) {
delete this._distance, super.endChanging(e, t)
}
pointsCount() {
return 3
}
name() {
return "Rotated Rectangle"
}
hasEditableCoordinates() {
return !1
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D")))
.GeneralFiguresDefinitionsViewModel
}
_snapTo45DegreesAvailable() {
return !0
}
static createProperties(e) {
var t = new o("linetoolrotatedrectangle", e);
return l._configureProperties(t), t
}
static _configureProperties(e) {
n._configureProperties(e), e.addChild("linesColors", new a([e.color]))
}
}
t.LineToolRotatedRectangle = l
},
"B4/o": function(e, t, i) {
"use strict";
(function(e) {
var s = i("QIuV").LineToolTrading,
r = i("4TVt").LineToolPriceAxisView,
n = i("jkoZ"),
o = i("Ss5c").LineDataSource,
a = i("Ocx9").DefaultProperty,
l = i("s1Gx").sortSourcesPreOrdered.LineToolOrder;
function c(e) {
return null == e ? e = "" : e += "", e
}
class h {
constructor(e) {
this._line = e, this._data = {
bodyText: "order",
quantityText: "0"
}, this._editable = !0, this._cancellable = !0, this._mode = "", this
._direction = "buy", this._active = !0
}
setMode(e) {
return this._mode = e, this._line.updateAllViewsAndRedraw(), this
}
setDirection(e) {
return this._direction = e, this._line.updateAllViewsAndRedraw(), this
}
setActive(e) {
return this._active = e, this._line.updateAllViewsAndRedraw(), this
}
setEditable(e) {
return this._editable = e, this._line.updateAllViewsAndRedraw(), this
}
getEditable() {
return this._editable
}
setCancellable(e) {
return this._cancellable = e, this._line.updateAllViewsAndRedraw(), this
}
getCancellable() {
return this._cancellable
}
hasMoveCallback() {
return this.isFunction(this._onMoveCallback)
}
hasModifyCallback() {
return this.isFunction(this._onModifyCallback)
}
getPrice() {
return this._line.points().length > 0 ? this._line.points()[0].price : this
._line._timePoint.length > 0 ? this._line._timePoint[0].price : void 0
}
setPrice(e) {
if (this._line.points().length > 0) {
var t = this._line.points()[0];
t.price = e, this._line._points[0] = t, this._line.normalizePoints(),
this._line.updateAllViewsAndRedraw()
}
return this._line._timePoint.length > 0 && (this._line._timePoint[0].price =
e), this
}
getText() {
return this._data.bodyText
}
setText(e) {
return this._data.bodyText = e || "", this._line.updateAllViewsAndRedraw(),
this
}
setTooltip(e) {
return this._line.properties().tooltip.setValue(c(e)), this
}
getTooltip() {
return this._line.properties().tooltip.value()
}
setModifyTooltip(e) {
return this._line.properties().modifyTooltip.setValue(c(e)), this
}
getModifyTooltip() {
return this._line.properties().modifyTooltip.value()
}
setCancelTooltip(e) {
return this._line.properties().cancelTooltip.setValue(c(e)), this
}
getCancelTooltip() {
return this._line.properties().cancelTooltip.value()
}
getQuantity() {
return this._data.quantityText
}
setQuantity(e) {
return this._data.quantityText = e || "", this._line
.updateAllViewsAndRedraw(), this
}
getExtendLeft() {
var e = this._line.properties().extendLeft.value();
return "inherit" === e ? this._line._model.properties().tradingProperties
.extendLeft.value() : e
}
setExtendLeft(e) {
return this._line.properties().extendLeft.setValue(e), this
}
getLineLength() {
var e = this._line.properties().lineLength.value();
return "inherit" === e ? this._line._model.properties().tradingProperties
.lineLength.value() : e
}
setLineLength(e) {
return this._line.properties().lineLength.setValue(Math.max(0, Math.min(e,
100))), this
}
getLineColor() {
var e = this._line.properties();
return "buy" === this._direction ? this._active ? e.lineActiveBuyColor
.value() : e.lineInactiveBuyColor.value() : this._active ? e
.lineActiveSellColor.value() : e.lineInactiveSellColor.value()
}
setLineColor(e) {
return "buy" === this._direction ? this._active ? this
.setLineActiveBuyColor(e) : this.setLineInactiveBuyColor(e) : this
._active ? this.setLineActiveSellColor(e) : this
.setLineInactiveSellColor(e), this
}
setLineActiveBuyColor(e) {
return this._line.properties().lineActiveBuyColor.setValue(e), this
}
setLineInactiveBuyColor(e) {
return this._line.properties().lineInactiveBuyColor.setValue(e), this
}
setLineActiveSellColor(e) {
return this._line.properties().lineActiveSellColor.setValue(e), this
}
setLineInactiveSellColor(e) {
return this._line.properties().lineInactiveSellColor.setValue(e), this
}
getLineStyle() {
var e = this._line.properties().lineStyle.value();
return "inherit" === e ? this._line._model.properties().tradingProperties
.lineStyle.value() : e
}
setLineStyle(e) {
return this._line.properties().lineStyle.setValue(e), this
}
getLineWidth() {
var e = this._line.properties().lineWidth.value();
return "inherit" === e ? this._line._model.properties().tradingProperties
.lineWidth.value() : e
}
setLineWidth(e) {
return this._line.properties().lineWidth.setValue(e), this
}
getBodyBorderColor() {
var e = this._line.properties();
return "buy" === this._direction ? this._active ? e.bodyBorderActiveBuyColor
.value() : e.bodyBorderInactiveBuyColor.value() : this._active ? e
.bodyBorderActiveSellColor.value() : e.bodyBorderInactiveSellColor
.value()
}
setBodyBorderColor(e) {
return "buy" === this._direction ? this._active ? this
.setBodyBorderActiveBuyColor(e) : this.setBodyBorderInactiveBuyColor(
e) : this._active ? this.setBodyBorderActiveSellColor(e) : this
.setBodyBorderInactiveSellColor(e), this
}
setBodyBorderActiveBuyColor(e) {
return this._line.properties().bodyBorderActiveBuyColor.setValue(e), this
}
setBodyBorderInactiveBuyColor(e) {
return this._line.properties().bodyBorderInactiveBuyColor.setValue(e), this
}
setBodyBorderActiveSellColor(e) {
return this._line.properties().bodyBorderActiveSellColor.setValue(e), this
}
setBodyBorderInactiveSellColor(e) {
return this._line.properties().bodyBorderInactiveSellColor.setValue(e), this
}
getBodyBackgroundColor() {
return n.getColorFromProperties(this._line.properties().bodyBackgroundColor,
this._line.properties().bodyBackgroundTransparency)
}
setBodyBackgroundColor(e) {
return n.setColorToProperties(e, this._line.properties()
.bodyBackgroundColor, this._line.properties()
.bodyBackgroundTransparency), this
}
getBodyTextColor() {
var e = this._line.properties();
return "limit" === this._mode ? this._active ? e.bodyTextActiveLimitColor
.value() : e.bodyTextInactiveLimitColor.value() : "stop" === this
._mode ? this._active ? e.bodyTextActiveStopColor.value() : e
.bodyTextInactiveStopColor.value() : "buy" === this._direction ? this
._active ? e.bodyTextActiveBuyColor.value() : e.bodyTextInactiveBuyColor
.value() : this._active ? e.bodyTextActiveSellColor.value() : e
.bodyTextInactiveSellColor.value()
}
setBodyTextColor(e) {
return "limit" === this._mode ? this._active ? this
.setBodyTextActiveLimitColor(e) : this.setBodyTextInactiveLimitColor(
e) : "stop" === this._mode ? this._active ? this
.setBodyTextActiveStopColor(e) : this.setBodyTextInactiveStopColor(e) :
"buy" === this._direction ? this._active ? this
.setBodyTextActiveBuyColor(e) : this.setBodyTextInactiveBuyColor(e) :
this._active ? this.setBodyTextActiveSellColor(e) : this
.setBodyTextInactiveSellColor(e), this
}
setBodyTextInactiveLimitColor(e) {
return this._line.properties().bodyTextInactiveLimitColor.setValue(e), this
}
setBodyTextActiveLimitColor(e) {
return this._line.properties().bodyTextActiveLimitColor.setValue(e), this
}
setBodyTextInactiveStopColor(e) {
return this._line.properties().bodyTextInactiveStopColor.setValue(e), this
}
setBodyTextActiveStopColor(e) {
return this._line.properties().bodyTextActiveStopColor.setValue(e), this
}
setBodyTextInactiveBuyColor(e) {
return this._line.properties().bodyTextInactiveBuyColor.setValue(e), this
}
setBodyTextActiveBuyColor(e) {
return this._line.properties().bodyTextActiveBuyColor.setValue(e), this
}
setBodyTextInactiveSellColor(e) {
return this._line.properties().bodyTextInactiveSellColor.setValue(e), this
}
setBodyTextActiveSellColor(e) {
return this._line.properties().bodyTextActiveSellColor.setValue(e), this
}
getBodyFont() {
return n.getFontFromProperties(this._line.properties().bodyFontFamily, this
._line.properties().bodyFontSize, this._line.properties()
.bodyFontBold, this._line.properties().bodyFontItalic)
}
setBodyFont(e) {
return n.setFontToProperties(e, this._line.properties().bodyFontFamily, this
._line.properties().bodyFontSize, this._line.properties()
.bodyFontBold, this._line.properties().bodyFontItalic), this
}
getQuantityBorderColor() {
var e = this._line.properties();
return "buy" === this._direction ? this._active ? e
.quantityBorderActiveBuyColor.value() : e.quantityBorderInactiveBuyColor
.value() : this._active ? e.quantityBorderActiveSellColor.value() : e
.quantityBorderInactiveSellColor.value()
}
setQuantityBorderColor(e) {
return "buy" === this._direction ? this._active ? this
.setQuantityBorderActiveBuyColor(e) : this
.setQuantityBorderInactiveBuyColor(e) : this._active ? this
.setQuantityBorderActiveSellColor(e) : this
.setQuantityBorderInactiveSellColor(e), this
}
setQuantityBorderActiveBuyColor(e) {
return this._line.properties().quantityBorderActiveBuyColor.setValue(e),
this
}
setQuantityBorderInactiveBuyColor(e) {
return this._line.properties().quantityBorderInactiveBuyColor.setValue(e),
this
}
setQuantityBorderActiveSellColor(e) {
return this._line.properties().quantityBorderActiveSellColor.setValue(e),
this
}
setQuantityBorderInactiveSellColor(e) {
return this._line.properties().quantityBorderInactiveSellColor.setValue(e),
this
}
getQuantityBackgroundColor() {
var e = this._line.properties();
return "buy" === this._direction ? this._active ? e
.quantityBackgroundActiveBuyColor.value() : e
.quantityBackgroundInactiveBuyColor.value() : this._active ? e
.quantityBackgroundActiveSellColor.value() : e
.quantityBackgroundInactiveSellColor.value()
}
setQuantityBackgroundColor(e) {
return "buy" === this._direction ? this._active ? this
.setQuantityBackgroundActiveBuyColor(e) : this
.setQuantityBackgroundInactiveBuyColor(e) : this._active ? this
.setQuantityBackgroundActiveSellColor(e) : this
.setQuantityBackgroundInactiveSellColor(e), this
}
setQuantityBackgroundActiveBuyColor(e) {
return this._line.properties().quantityBackgroundActiveBuyColor.setValue(e),
this
}
setQuantityBackgroundInactiveBuyColor(e) {
return this._line.properties().quantityBackgroundInactiveBuyColor.setValue(
e), this
}
setQuantityBackgroundActiveSellColor(e) {
return this._line.properties().quantityBackgroundActiveSellColor.setValue(
e), this
}
setQuantityBackgroundInactiveSellColor(e) {
return this._line.properties().quantityBackgroundInactiveSellColor.setValue(
e), this
}
getQuantityTextColor() {
return n.getColorFromProperties(this._line.properties().quantityTextColor,
this._line.properties().quantityTextTransparency)
}
setQuantityTextColor(e) {
return n.setColorToProperties(e, this._line.properties().quantityTextColor,
this._line.properties().quantityTextTransparency), this
}
getQuantityFont() {
return n.getFontFromProperties(this._line.properties().quantityFontFamily,
this._line.properties().quantityFontSize, this._line.properties()
.quantityFontBold, this._line.properties().quantityFontItalic)
}
setQuantityFont(e) {
return n.setFontToProperties(e, this._line.properties().quantityFontFamily,
this._line.properties().quantityFontSize, this._line.properties()
.quantityFontBold, this._line.properties().quantityFontItalic), this
}
getCancelButtonBorderColor() {
var e = this._line.properties();
return "buy" === this._direction ? this._active ? e
.cancelButtonBorderActiveBuyColor.value() : e
.cancelButtonBorderInactiveBuyColor.value() : this._active ? e
.cancelButtonBorderActiveSellColor.value() : e
.cancelButtonBorderInactiveSellColor.value()
}
setCancelButtonBorderColor(e) {
return "buy" === this._direction ? this._active ? this
.setCancelButtonBorderActiveBuyColor(e) : this
.setCancelButtonBorderInactiveBuyColor(e) : this._active ? this
.setCancelButtonBorderActiveSellColor(e) : this
.setCancelButtonBorderInactiveSellColor(e), this
}
setCancelButtonBorderActiveBuyColor(e) {
return this._line.properties().cancelButtonBorderActiveBuyColor.setValue(e),
this
}
setCancelButtonBorderInactiveBuyColor(e) {
return this._line.properties().cancelButtonBorderInactiveBuyColor.setValue(
e), this
}
setCancelButtonBorderActiveSellColor(e) {
return this._line.properties().cancelButtonBorderActiveSellColor.setValue(
e), this
}
setCancelButtonBorderInactiveSellColor(e) {
return this._line.properties().cancelButtonBorderInactiveSellColor.setValue(
e), this
}
getCancelButtonBackgroundColor() {
return n.getColorFromProperties(this._line.properties()
.cancelButtonBackgroundColor, this._line.properties()
.cancelButtonBackgroundTransparency)
}
setCancelButtonBackgroundColor(e) {
return n.setColorToProperties(e, this._line.properties()
.cancelButtonBackgroundColor, this._line.properties()
.cancelButtonBackgroundTransparency), this
}
getCancelButtonIconColor() {
var e = this._line.properties();
return "buy" === this._direction ? this._active ? e
.cancelButtonIconActiveBuyColor.value() : e
.cancelButtonIconInactiveBuyColor.value() : this._active ? e
.cancelButtonIconActiveSellColor.value() : e
.cancelButtonIconInactiveSellColor.value()
}
setCancelButtonIconColor(e) {
return "buy" === this._direction ? this._active ? this
.setCancelButtonIconActiveBuyColor(e) : this
.setCancelButtonIconInactiveBuyColor(e) : this._active ? this
.setCancelButtonIconActiveSellColor(e) : this
.setCancelButtonIconInactiveSellColor(e), this
}
setCancelButtonIconActiveBuyColor(e) {
return this._line.properties().cancelButtonIconActiveBuyColor.setValue(e),
this
}
setCancelButtonIconInactiveBuyColor(e) {
return this._line.properties().cancelButtonIconInactiveBuyColor.setValue(e),
this
}
setCancelButtonIconActiveSellColor(e) {
return this._line.properties().cancelButtonIconActiveSellColor.setValue(e),
this
}
setCancelButtonIconInactiveSellColor(e) {
return this._line.properties().cancelButtonIconInactiveSellColor.setValue(
e), this
}
block() {
this._blocked = !0, this._line.updateAllViewsAndRedraw()
}
unblock() {
this._blocked = !1, this._line.updateAllViewsAndRedraw()
}
getBlocked() {
return this._blocked
}
isFunction(e) {
return "function" == typeof e
}
onCancel(e, t) {
return t ? this.isFunction(t) && (this._onCancelData = e, this
._onCancelCallback = t) : this.isFunction(e) && (this
._onCancelCallback = e), this
}
callOnCancel() {
this.isFunction(this._onCancelCallback) && this._onCancelCallback.call(this,
this._onCancelData)
}
isOnCancelCallbackPresent() {
return this.isFunction(this._onCancelCallback)
}
onModify(e, t) {
return t ? this.isFunction(t) && (this._onModifyData = e, this
._onModifyCallback = t) : this.isFunction(e) && (this
._onModifyCallback = e), this
}
callOnModify() {
this.isFunction(this._onModifyCallback) && this._onModifyCallback.call(this,
this._onModifyData)
}
onMove(e, t) {
return t ? this.isFunction(t) && (this._onMoveData = e, this
._onMoveCallback = t) : this.isFunction(e) && (this
._onMoveCallback = e), this
}
callOnMove() {
this.isFunction(this._onMoveCallback) && this._onMoveCallback.call(this,
this._onMoveData)
}
onContextMenu(e, t) {
return t ? this.isFunction(t) && (this._onContextMenuData = e, this
._onContextMenuCallback = t) : this.isFunction(e) && (this
._onContextMenuCallback = e), this
}
shouldShowContextMenu() {
return this.isFunction(this._onContextMenuCallback)
}
callOnContextMenu() {
if (this.isFunction(this._onContextMenuCallback)) return this
._onContextMenuCallback.call(this, this._onContextMenuData)
}
remove() {
this._line._model.removeSource(this._line), delete this._line
}
}
class u extends s {
constructor(e, t) {
super(e, t || u.createProperties()), this._adapter = new h(this), this
.setSelectionEnabled(!0), i.e("lt-pane-views").then(i.bind(null,
"LMGK")).then(({
OrderPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
zorder() {
return l
}
isSpeciallyZOrderedSource() {
return !0
}
setPoint(e, t, i) {
this._points[e] = t, this.normalizePoints()
}
addPoint(e, t) {
return this._points.push(e), this._lastPoint = null, this.normalizePoints(),
this.createServerPoints(), !0
}
name() {
return "Order"
}
endMoving(e) {
var t = this._startMovingPoint && this._currentMovingPoint && this
._startMovingPoint.logical.price !== this._currentMovingPoint.logical
.price;
super.endMoving(), !e && t && this._adapter.callOnMove()
}
createPriceAxisView(e) {
var t = {
pointIndex: e,
backgroundPropertyGetter: () => this._adapter.getLineColor()
};
return this._priceAxisView = new r(this, t), this._priceAxisView
}
paneViews() {
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
null : this._model.properties().tradingProperties.showOrders.value() ? o
.prototype.paneViews.call(this) : null
}
priceAxisViews(t, i) {
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
null : this._model.properties().tradingProperties.showOrders.value() ? o
.prototype.priceAxisViews.call(this, t, i) : null
}
adapter() {
return this._adapter
}
hasContextMenu() {
return this._adapter.shouldShowContextMenu()
}
contextMenuItems() {
return this._adapter.callOnContextMenu()
}
movable() {
return Boolean(this._adapter._onMoveCallback)
}
static createProperties(e) {
var t = new a("linetoolorder", e, !1, !1);
return u._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
t.LineToolOrder = u
}).call(this, i("Kxc7"))
},
BBCR: function(e, t) {
e.exports =
''
},
BOPY: function(e, t, i) {
"use strict";
var s = i("aO4+").Point,
r = i("f6yo").pointInCircle,
n = i("VdBB").HitTestResult,
o = i("zDbI").CHART_FONT_FAMILY,
a = i("cPgM").ScaledPaneRenderer;
class l extends a {
constructor(e, t) {
super(), this._barWidth = e.barWidth, this._plates = e.plates, this._tooltip = e
.tooltip, this._model = t
}
_drawImpl(e) {
e.save();
for (var t = 0; t < this._plates.length; t++)
if (this._plates[t].highlightByAuthor) {
this._highlightByAuthor = !0;
break
} this._plates.forEach(this._drawItem.bind(this, e)), this._tooltip.draw(this
._plates.map(function(e) {
return this._plateTransform(e)
}.bind(this)), e), this._tooltip.endDraw(), e.restore()
}
_drawItem(e, t) {
e.save(), this._highlightByAuthor && !t.highlightByAuthor && (e.globalAlpha = .4);
var i = this._dotTransform(t);
i.mine ? this._drawTriangle(e, i) : this._drawDot(e, i), e.restore()
}
_commonTransform(e) {
var t = Math.max(1.4 * e.minSize, this._barWidth + 4),
i = {
up: -1,
down: 1
} [e.direction] * (e.yInverted ? -1 : 1) * (t * (e.order + .6) + .25 * t),
s = e.y + i,
r = TradingView.clone(e.overridedTheme || this.themes[e.theme]);
return r.dotBorderWidth = e.hovered || e.highlightByAuthor ? 4 : 2, {
id: e.id,
theme: r,
themeName: e.theme,
x: Math.round(e.x + 1),
y: Math.round(s),
yInverted: e.yInverted,
pinned: e.pinned,
hovered: e.hovered
}
}
_dotTransform(e) {
var t = this._commonTransform(e);
return t.radius = Math.max(e.minSize / 2, .4 * this._barWidth), t.label = e.label, t
.labelFontColor = e.labelFontColor, t.labelFontSize = Math.ceil(Math.max(10,
Math.min(t.radius, 20))), this._model.updateDotData(e, t)
}
_plateTransform(e) {
var t = this._commonTransform(e);
return this._model.updatePlateData(e, t)
}
_drawTriangle(e, t) {
e.strokeStyle = t.theme.border, e.fillStyle = t.theme.background, e.lineWidth = t
.theme.dotBorderWidth;
var i = t,
s = t.radius,
r = Math.cos(Math.PI / 6) * s,
n = Math.sin(Math.PI / 6) * s;
e.translate(i.x, i.y), "up" === t.direction !== t.yInverted && e.rotate(Math.PI), t
.public || (e.lineWidth /= 2), e.beginPath(), e.moveTo(0, -s), e.lineTo(r, n), e
.lineTo(-r, n), e.lineTo(0, -s), e.closePath(), e.stroke(), t.public && e.fill()
}
_drawDot(e, t) {
e.strokeStyle = t.theme.border, e.fillStyle = t.theme.background, e.lineWidth = t
.theme.dotBorderWidth, e.beginPath(), e.arc(t.x, t.y, t.radius, 0, 2 * Math.PI,
!0), e.closePath(), e.stroke(), e.fill(), t.label && t.radius >= 7 && (e
.textAlign = "center", e.textBaseline = "middle", e.font = "bold " + t
.labelFontSize + "px " + o, e.fillStyle = t.labelFontColor, e.fillText(t
.label, t.x, t.y))
}
hitTest(e) {
for (var t, i = this._plates.length - 1; i >= 0; --i)
if (t = this._hitTestDot(this._plates[i], e)) return t;
return null
}
_hitTestDot(e, t) {
var i = this._dotTransform(e),
o = new s(i.x, i.y);
return r(t, o, Math.max(i.radius, 8)) ? new n(n.REGULAR, e) : null
}
}
l.prototype.themes = {
green: {
border: "#78C143",
background: "#8DDD54"
},
red: {
border: "#CC4545",
background: "#ED5A5A"
},
neutral: {
border: "#EAC300",
background: "#FFD400"
},
yellow: {
border: "#EAC300",
background: "#FFD400"
},
blue: {
border: "#047ACE",
background: "#0496FF"
}
}, t.BarsMarksContainerPaneView = class {
constructor(e, t) {
this.source = e, this._rendererFactory = t
}
update() {}
renderer(e, t) {
return this._rendererFactory(this.source)
}
}, t.BarsMarksContainerRenderer = l
},
BZtw: function(e, t, i) {
"use strict";
var s = i("Eyy1"),
r = i("ogJP"),
n = i("5fI3"),
o = i("LxhU"),
a = i("XPit"),
l = i("hsV8"),
c = i("YWnQ"),
h = i("aIyQ"),
u = i.n(h);
class d {
constructor() {
this._loading = new u.a, this._completed = new u.a, this._error = new u.a, this
._symbolError = new u.a, this._symbolResolved = new u.a, this._seriesError =
new u.a, this._symbolNotPermitted = new u.a, this._symbolGroupNotPermitted =
new u.a, this._chartTypeNotPermitted = new u.a, this
._intradaySpreadNotPermitted = new u.a, this._intradayExchangeNotPermitted =
new u.a, this._customIntervalNotPermitted = new u.a, this
._secondsIntervalNotPermitted = new u.a, this._tickMarksRangeChanged = new u.a,
this._barReceived = new u.a, this._seriesTimeFrame = new u.a, this
._dataUpdated = new u.a
}
destroy() {
this._loading.destroy(), this._completed.destroy(), this._error.destroy(), this
._symbolError.destroy(), this._symbolResolved.destroy(), this._seriesError
.destroy(), this._symbolNotPermitted.destroy(), this._symbolGroupNotPermitted
.destroy(), this._chartTypeNotPermitted.destroy(), this
._intradaySpreadNotPermitted.destroy(), this._intradayExchangeNotPermitted
.destroy(), this._customIntervalNotPermitted.destroy(), this
._secondsIntervalNotPermitted.destroy(), this._tickMarksRangeChanged.destroy(),
this._barReceived.destroy(), this._seriesTimeFrame.destroy(), this._dataUpdated
.destroy()
}
loading() {
return this._loading
}
completed() {
return this._completed
}
error() {
return this._error
}
symbolError() {
return this._symbolError
}
symbolResolved() {
return this._symbolResolved
}
seriesError() {
return this._seriesError
}
symbolNotPermitted() {
return this._symbolNotPermitted
}
symbolGroupNotPermitted() {
return this._symbolGroupNotPermitted
}
chartTypeNotPermitted() {
return this._chartTypeNotPermitted
}
intradaySpreadNotPermitted() {
return this._intradaySpreadNotPermitted
}
intradayExchangeNotPermitted() {
return this._intradayExchangeNotPermitted
}
customIntervalNotPermitted() {
return this._customIntervalNotPermitted
}
secondsIntervalNotPermitted() {
return this._secondsIntervalNotPermitted
}
tickMarksRangeChanged() {
return this._tickMarksRangeChanged
}
barReceived() {
return this._barReceived
}
seriesTimeFrame() {
return this._seriesTimeFrame
}
dataUpdated() {
return this._dataUpdated
}
fireCompleted(e, t) {
this._completed.fire(e, t)
}
fireLoading(e) {
this._loading.fire(e)
}
fireError() {
this._error.fire()
}
fireSymbolError(e) {
this._symbolError.fire(e), this.fireError()
}
fireSymbolResolved(e) {
this._symbolResolved.fire(e)
}
fireSeriesError(e) {
this._seriesError.fire(e), this.fireError()
}
fireSymbolNotPermitted(e) {
this._symbolNotPermitted.fire(e), this.fireError()
}
fireSymbolGroupNotPermitted(e) {
this._symbolGroupNotPermitted.fire(e), this.fireError()
}
fireChartTypeNotPermitted(e) {
this._chartTypeNotPermitted.fire(e), this.fireError()
}
fireIntradaySpreadNotPermitted() {
this._intradaySpreadNotPermitted.fire(), this.fireError()
}
fireIntradayExchangeNotPermitted() {
this._intradayExchangeNotPermitted.fire(), this.fireError()
}
fireCustomIntervalNotPermitted() {
this._customIntervalNotPermitted.fire(), this.fireError()
}
fireSecondsIntervalNotPermitted() {
this._secondsIntervalNotPermitted.fire(), this.fireError()
}
fireTickMarksRangeChanged(e) {
this._tickMarksRangeChanged.fire(e)
}
fireBarReceived(e) {
this._barReceived.fire(e)
}
fireSeriesTimeFrame(e, t, i, s, r) {
this._seriesTimeFrame.fire(e, t, i, s, r)
}
fireDataUpdated(e, t) {
this._dataUpdated.fire(e, t)
}
}
var p = i("txPx");
i.d(t, "a", (function() {
return b
}));
const _ = Object(p.getLogger)("Chart.SeriesDataSource");
var m;
! function(e) {
e[e.Idle = 0] = "Idle", e[e.AwaitingConnection = 1] = "AwaitingConnection", e[e
.AwaitingFirstDataUpdate = 2] = "AwaitingFirstDataUpdate", e[e.Active = 3] =
"Active"
}(m || (m = {}));
let f = 1;
let g = 1;
class b {
constructor(e, t, i) {
var r;
this._instanceId = null, this._symbolInstanceId = null, this._symbol = null, this
._resolution = null, this._timeFrame = null, this._data = new a.SeriesData, this
._dataEvents = new d, this._status = m.Idle, this._turnaroundCounter = 1, this
._boundOnGatewayIsConnectedChanged = this._onGatewayIsConnectedChanged.bind(
this), this._ongoingDataUpdate = Promise.resolve(), this._gateway = e, this
._turnaroundPrefix = t, this._createSeriesParams = (r = null != i ? i : {
count: 300
}).startDate ? r.endDate || r.count ? r.endDate ? ["from_to", r.startDate, r
.endDate
] : ["bar_count", r.startDate, Object(s.ensure)(r.count)] : ["from_to", r
.startDate
] : r.count || 300, this._gateway.isConnected().subscribe(this
._boundOnGatewayIsConnectedChanged)
}
destroy() {
this.stop(), this._gateway.isConnected().unsubscribe(this
._boundOnGatewayIsConnectedChanged)
}
modifySeries(e, t, i = null, n = !1) {
n && (_.logNormal(
"Due to force flag clearing symbol & resolution to force re-requesting data."
), this._symbol = null, this._resolution = null);
const a = this._symbol,
l = this._resolution;
if (this._symbol = e, this._resolution = t, null === this._instanceId) return void(
this._timeFrame = i);
const c = !Object(r.deepEquals)(a, e)[0],
h = null === l || !o.Interval.isEqual(l, t);
(c || h || null !== i) && (this._timeFrame = null, (c || h) && this
._turnaroundCounter++, c && this._resolveSymbol(), this._gateway.modifySeries(
this._instanceId, this.turnaround(), Object(s.ensureNotNull)(this
._symbolInstanceId), this._resolution, i, this._onMessage.bind(this)))
}
requestMoreData(e) {
null !== this._instanceId && this._gateway.requestMoreData(this._instanceId, e, this
._onMessage.bind(this))
}
requestMoreTickmarks(e) {
null !== this._instanceId && this._gateway.requestMoreTickmarks(this._instanceId, e,
this._onMessage.bind(this))
}
isStarted() {
return this._status !== m.Idle
}
isActive() {
return this._status === m.Active
}
start() {
this.isStarted() ? _.logNormal(
"start: data source is already started, nothing to do") : (Object(s.assert)(
null !== this._symbol, "symbol must be set before start"), Object(s
.assert)(null !== this._resolution,
"resolution must be set before start"), this._gateway.isConnected()
.value() ? this._createSeries() : this._changeStatusTo(m.AwaitingConnection)
)
}
stop() {
this.isStarted() ? (null !== this._instanceId && (this._gateway.removeSeries(this
._instanceId), this._instanceId = null), this._changeStatusTo(m.Idle)) : _
.logNormal("stop: data source is already stopped, nothing to do")
}
instanceId() {
return this._instanceId
}
data() {
return this._data
}
clearData() {
this.isStarted() ? this._enqueueUpdate(() => this._clearDataImpl()) : this
._clearDataImpl()
}
dataEvents() {
return this._dataEvents
}
turnaround() {
return `${this._turnaroundPrefix}${this._turnaroundCounter}`
}
symbolInstanceId() {
return this._symbolInstanceId
}
moveData(e) {
this._enqueueUpdate(() => this._data.moveData(e))
}
_clearDataImpl() {
this._data.clear()
}
_resolveSymbol() {
null !== this._symbol && (this._symbolInstanceId = "sds_sym_" + f++, this._gateway
.resolveSymbol(this._symbolInstanceId, Object(n
.encodeExtendedSymbolOrGetSimpleSymbolString)(this._symbol), this
._onMessage.bind(this)))
}
_changeStatusTo(e) {
Object(s.assert)(this._status !== e,
"Source and destination status should be distinct"), _.logNormal(
`Status changed from ${m[this._status]} to ${m[e]}`), this._status = e
}
_createSeries() {
Object(s.assert)(this._status !== m.Active,
'Status should not be "Active" when creating a study'), this._instanceId =
"sds_" + g++, this._resolveSymbol(), this._gateway.createSeries(this
._instanceId, this.turnaround(), Object(s.ensureNotNull)(this
._symbolInstanceId), Object(s.ensureNotNull)(this._resolution), this
._createSeriesParams, this._timeFrame, this._onMessage.bind(this)), this
._timeFrame = null, this._changeStatusTo(m.AwaitingFirstDataUpdate)
}
_onGatewayIsConnectedChanged(e) {
e ? this._onGatewayConnected() : this._onGatewayDisconnected()
}
_onGatewayConnected() {
this._status === m.AwaitingConnection && this._createSeries()
}
_onGatewayDisconnected() {
this._status !== m.Idle && this._status !== m.AwaitingConnection && (this
._instanceId = null, this._changeStatusTo(m.AwaitingConnection)), this
._turnaroundCounter = 1
}
_onMessage(e) {
this._enqueueUpdate(() => this._onMessageImpl(e))
}
async _onMessageImpl(e) {
switch (e.method) {
case "symbol_resolved": {
const [t, i] = e.params;
if (t !== this._symbolInstanceId) {
_.logNormal(
`Resolve for old symbol, expected: ${this._symbolInstanceId}, actual ${e.params[0]}`
);
break
}
this._onSymbolResolved(i);
break
}
case "symbol_error":
if (e.params[0] !== this._symbolInstanceId) {
_.logNormal(
`Symbol error for old symbol, expected: ${this._symbolInstanceId}, actual ${e.params[0]}`
);
break
}
this._onSymbolError(e);
break;
case "series_timeframe": {
const [t, i, s, r, n, o, a] = e.params;
if (!this._checkTurnaround(t, i)) {
_.logNormal(
`Time frame for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${t} (${i})`
);
break
}
this._onSeriesTimeFrame(s, r, n, o, a);
break
}
case "series_error": {
const [t, i] = e.params;
if (!this._checkTurnaround(t, i)) {
_.logNormal(
`Series error for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${t} (${i})`
);
break
}
this._onSeriesError(e.params[2]);
break
}
case "series_loading": {
const [t, i] = e.params;
if (!this._checkTurnaround(t, i)) break;
this._onSeriesLoading(e.time);
break
}
case "series_completed": {
const [t, i, s] = e.params;
if (!this._checkTurnaround(t, s)) {
_.logNormal(
`Series completed for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${t} (${s})`
);
break
}
this._onSeriesCompleted(i, e.time);
break
}
case "data_update":
if (!this._checkTurnaround(e.params.customId, e.params.turnaround)) {
_.logNormal(
`Data update for old data, expected: ${this._symbolInstanceId} (${this.turnaround()}), actual ${e.params.customId} (${e.params.turnaround})`
);
break
}
await this._onDataUpdate(e.params.plots, e.params.nonseries, e.params
.lastBar);
break;
case "clear_data":
if (e.params.turnaround !== this.turnaround()) {
_.logNormal(
`Clear data for old data, expected: ${this.turnaround()}, actual ${e.params.turnaround}`
);
break
}
this._clearDataImpl(), this._dataEvents.fireDataUpdated(void 0, !1)
}
}
_onSeriesError(e) {
let t, i;
if ("string" == typeof e) i = {
error: e
}, t = e;
else if (i = e, e.ctx) {
const i = {};
Object.entries(e.ctx).forEach(([e, t]) => {
i[e] = t.toString()
}), t = e.error.format(i)
} else t = e.error;
if (t.startsWith("study_not_auth:")) {
const e = t.split(":", 2)[1].split("@", 2)[0];
["BarSetRenko", "BarSetPriceBreak", "BarSetKagi", "BarSetPnF"].includes(e) ?
this._dataEvents.fireChartTypeNotPermitted(e) : "BarSetSpread" === e ? this
._dataEvents.fireIntradaySpreadNotPermitted() : "BarSetRange" === e && this
._dataEvents.fireCustomIntervalNotPermitted()
} else "resolution_not_entitled" === t ? this._dataEvents
.fireIntradayExchangeNotPermitted() : "custom_resolution" === t ? this
._dataEvents.fireCustomIntervalNotPermitted() : "seconds_not_entitled" === t &&
this._dataEvents.fireSecondsIntervalNotPermitted();
this._dataEvents.fireSeriesError(i)
}
_onSeriesTimeFrame(e, t, i, s, r) {
this._dataEvents.fireSeriesTimeFrame(e, t, i, null == s || s, r)
}
_onSymbolError(e) {
if (e.params[1] === c.permissionDenied) switch (e.params[2]) {
case c.SymbolErrorPermissionDeniedReason.Symbol:
this._dataEvents.fireSymbolNotPermitted(e.params[3]);
break;
case c.SymbolErrorPermissionDeniedReason.GroupPermission:
this._dataEvents.fireSymbolGroupNotPermitted(e.params[3]);
break;
default:
this._dataEvents.fireSymbolNotPermitted(e.params[2])
}
this._dataEvents.fireSymbolError(e.params[1])
}
_onSymbolResolved(e) {
this._dataEvents.fireSymbolResolved(e)
}
async _onDataUpdate(e, t, i) {
this._onDataUnpacked(e, i, await async function(e) {
if (void 0 === e) return {
projectionPlots: [],
boxSize: null
};
if ("" === e.d || "nochange" === e.indexes) return null;
const t = await Object(l.unpackNonSeriesData)(e.d);
if (null === t || t.indexes_replace) return null;
const i = e.indexes,
{
bars: s,
price: r,
boxSize: n,
reversalAmount: o
} = t.data,
a = (s || []).map(e => {
let t;
return "factor" in e ? t = e.factor :
"additionalPrice" in e && (t = e.additionalPrice), {
index: i[e.time],
value: [0, e.open, e.high, e.low, e.close, e
.volume, t
]
}
});
return {
lastPrice: r,
projectionPlots: a,
reversalAmount: o,
boxSize: n
}
}(t))
}
_enqueueUpdate(e) {
return this._ongoingDataUpdate = this._ongoingDataUpdate.then(e, e), this
._ongoingDataUpdate
}
_onDataUnpacked(e, t, i) {
if (this._status === m.Idle) return;
this._status === m.AwaitingFirstDataUpdate && (this._changeStatusTo(m.Active), this
._clearDataImpl());
const s = this._data.bars().size(),
r = this._data.bars().firstIndex(),
n = this._data.bars().merge(e);
null !== i && (this._data.nsBars().clear(), this._data.nsBars().merge(i
.projectionPlots), this._data.lastProjectionPrice = i.lastPrice,
null !== i.boxSize && (this._data.boxSize = i.boxSize), this._data
.reversalAmount = i.reversalAmount);
const o = null === r || null !== n && n.index < r;
this._dataEvents.fireDataUpdated(t, o), s !== this._data.bars().size() && null !==
n && this._dataEvents.fireBarReceived(n)
}
_onSeriesLoading(e) {
this._dataEvents.fireLoading(e)
}
_onSeriesCompleted(e, t) {
this._dataEvents.fireCompleted(e, t)
}
_checkTurnaround(e, t) {
return this._instanceId === e && (void 0 === t || t === this.turnaround())
}
}
},
Bt3k: function(e, t, i) {
"use strict";
function s(e, t) {
this.tooltips = {}, this.tooltipFactory = e, this.source = t
}
function r(e, t) {
this.renderer = e, this._tooltip = t, this.visible = !1
}
s.prototype.findOrCreateTooltip = function(e) {
var t = this.tooltips[e.id];
return null == t && (e.hovered || e.pinned) && (t = this._createTooltip(), this
.tooltips[e.id] = t), t
}, s.prototype.showPlate = function(e, t) {
var i = this.findOrCreateTooltip(e);
null != i && (i._drawPlate(e, t), i.plateData = e)
}, s.prototype.draw = function(e, t) {
this.hoveredId = null;
for (var i = 0; i < e.length; i++) e[i].hovered && (this.hoveredId = e[i].id);
e.forEach(function(e) {
this.showPlate(e, t)
}.bind(this))
}, s.prototype.endDraw = function() {
for (var e in this.tooltips)
if (this.tooltips.hasOwnProperty(e)) {
var t = this.tooltips[e];
t.toggleVisibility(), this.hoveredId && t.plateData.id !== this.hoveredId && !t
.plateData.pinned && (t.remove(), delete this.tooltips[e])
}
}, s.prototype.removeAll = function() {
for (var e in this.tooltips) {
if (this.tooltips.hasOwnProperty(e)) this.tooltips[e].remove()
}
this.tooltips = {}
}, s.prototype.removeTooltip = function(e) {
delete this.tooltips[e]
}, s.prototype._createTooltip = function() {
return new r(this, this.tooltipFactory())
}, r.prototype._drawPlate = function(e, t) {
var i = this;
this.visible = !0, this._tooltip.setSource(this.renderer.source), this._tooltip
.showPlate(e, t), e.hovered || e.pinned || this._tooltip.hide((function() {
i.renderer.removeTooltip(e.id)
}))
}, r.prototype.remove = function() {
this._tooltip._removeLayout()
}, r.prototype.toggleVisibility = function() {
this._tooltip._toggleLayout(this.visible), this.visible = !1
}, t.TooltipRenderer = s
},
CCPt: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1");
function r(e, t, i) {
return new Promise(s => {
i && e.classList.remove(i), e.classList.add(t);
const r = i => {
i.target === e && i.animationName === t && (e.removeEventListener(i
.type, r), s(i))
};
e.addEventListener("animationend", r, !1), e.addEventListener(
"webkitAnimationEnd", r, !1), e.addEventListener("MSAnimationEnd", r, !
1)
})
}
function n(e) {
return r(e, "tv-transition--fade-in", "tv-transition--fade-out")
}
i.d(t, "UserDefinedBarsMarksTooltip", (function() {
return o
}));
class o extends class {
constructor() {
this._source = null, this._tooltipHovered = !1, this._layout = null, this
._container = null, this._context = null, this._plateArrowSize = 14
}
showPlate(e, t) {
if (this._currentId !== e.id || !this._layout || null === this._layout.parentNode) {
this._currentId = e.id, this._createLayout();
const i = Object(s.ensureNotNull)(this._layout);
this._getContainer(t).appendChild(i), i.addEventListener("mouseenter", () => {
this._tooltipHovered = !0, n(Object(s.ensureNotNull)(this._layout))
}), i.addEventListener("mouseleave", () => {
this._tooltipHovered = !1
})
}
const i = Object(s.ensureNotNull)(this._layout);
let r = Math.round(e.barWidth / 2);
r > 15 && (r = 15), r < 10 && (r = 10), this._updatePlate(e);
const o = t.canvas.getBoundingClientRect(),
a = e.x - i.offsetWidth < this._plateArrowSize;
let l = o.width - e.x + Math.round(e.barWidth / 2 + r);
a && (l -= i.offsetWidth + 2 * this._plateArrowSize);
const c = o.height,
h = Math.min(Math.max(e.y, 20), c - i.offsetHeight - 10) + "px";
i.classList.toggle("right", a), i.style.display = "block", i.style.top = h, i.style
.right = l + "px", i.style.fontSize = r + "px"
}
hide(e) {
const t = Object(s.ensureNotNull)(this._layout);
var i;
this._tooltipHovered ? n(t) : (i = t, r(i, "tv-transition--fade-out",
"tv-transition--fade-in")).then(() => {
t.remove(), e()
})
}
setSource(e) {
this._source = e
}
_getContainer(e) {
return this._container && this._context === e || (this._context = e, this
._container = e.canvas.parentElement), Object(s.ensureNotNull)(this
._container)
}
_removeLayout() {
var e;
this._tooltipHovered || null === (e = this._layout) || void 0 === e || e.remove()
}
_toggleLayout(e) {
Object(s.ensureNotNull)(this._layout).style.visibility = e ? "visible" : "hidden"
}
} {
constructor() {
super(...arguments), this._layoutText = null
}
_createLayout() {
this._layout = document.createElement("div"), this._layout.classList.add(
"bar-mark-tooltip"), this._layoutText = document.createElement("div"), this
._layoutText.classList.add("text"), this._layout.appendChild(this._layoutText)
}
_updatePlate(e) {
this._currentId = e.id;
const t = Object(s.ensureNotNull)(this._layout);
t.style.borderColor = e.theme.border, t.style.marginTop = e.tooltipMargin + "px";
const i = Object(s.ensureNotNull)(this._layoutText);
i.innerHTML = e.text, t.appendChild(i)
}
}
},
CHw2: function(e, t, i) {
"use strict";
var s = i("WPQD").LineToolTrendLine,
r = i("Ocx9").DefaultProperty;
class n extends s {
constructor(e, t) {
super(e, t || n.createProperties())
}
name() {
return "Extended Line"
}
static createProperties(e) {
var t = new r("linetoolextended", e);
return n._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
t.LineToolExtended = n
},
CJIV: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("p1SQ").LineToolHorzLinePriceAxisView,
n = i("tc+8"),
o = i("Ocx9").DefaultProperty;
class a extends s {
constructor(e, t) {
super(e, t || a.createProperties()), this._priceAxisView = new r(this), i.e(
"lt-pane-views").then(i.t.bind(null, "1oDZ", 7)).then(({
HorzRayPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 1
}
name() {
return "Horizontal Ray"
}
priceAxisViews(e, t) {
return this.isSourceHidden() ? null : t === this.priceScale() && this.properties()
.showPrice.value() && this._model.paneForSource(this) === e ? [this
._priceAxisView
] : null
}
updateAllViews() {
super.updateAllViews(), this._priceAxisView.update()
}
canHasAlert() {
return !0
}
_getAlertPlots() {
var e = this._points[0],
t = {
index: e.index + 1,
price: e.price
};
return [this._linePointsToAlertPlot([e, t], null, !1, !0)]
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "e0H+")))
.HorizontalRayDefinitionsViewModel
}
template() {
var e = s.prototype.template.call(this);
return e.text = this.properties().childs().text.value(), e
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
}
static createProperties(e) {
var t = new o("linetoolhorzray", e);
return a._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e), e.hasChild("text") || e.addChild("text", new n("")), e
.addExclusion("text")
}
}
t.LineToolHorzRay = a
},
CLNU: function(e, t, i) {
(function(e) {
TradingView.cleanButAmpersand = function(e, t) {
var i = t ? ["&"] : ["&"];
return TradingView.clean(e, t, i)
}, TradingView.strip_tags = function(e) {
return e && e.replace ? e.replace(/(<([^>]+)>)/gi, "") : e
}, TradingView.encodeSpread = function(e) {
return encodeURIComponent(e)
}, TradingView.clean = function(e, t, i) {
var s = [
["&", "&"],
["<", "<"],
[">", ">"],
['"', """],
["'", "'"],
["'", "'"]
],
r = e;
if (!e || !e.replace) return r;
for (var n = 0; n < s.length; n++) {
var o = s[n][0],
a = s[n][1];
i && i.indexOf && -1 !== i.indexOf(t ? a : o) || (r = t ? r.replace(
new RegExp(a, "g"), o) : r.replace(new RegExp(o, "g"), a))
}
return r
}, e && e.exports && (e.exports = {
clean: TradingView.clean,
cleanButAmpersand: TradingView.cleanButAmpersand,
stripTags: TradingView.strip_tags
})
}).call(this, i("YuTi")(e))
},
CPmC: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
})), i.d(t, "b", (function() {
return n
}));
const s = new WeakMap;
function r(e, t) {
const i = s.get(e);
return i instanceof Function ? i(t) : i && i[t]
}
function n(e, t, i) {
if (i instanceof Function) return void s.set(e, i);
const r = s.get(e),
n = void 0 === r || r instanceof Function ? {} : r;
n[t] = i, s.set(e, n)
}
},
CW80: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("aO4+"),
n = i("MSvv"),
o = i("Ss5c"),
a = i("OH2X"),
l = i("gf4d"),
c = i("USzt"),
h = i("cBZt");
const u = Object(h.studyIdString)("VbPFixed", "tv-basicstudies");
class d extends c.a {
constructor(e, t, i, s) {
const r = i || e.studyMetaInfoRepository().findByIdSync({
type: "java",
studyId: u
});
super(e, t, r, s)
}
calcIsActualSymbol() {
n.StudyLineDataSource.prototype.calcIsActualSymbol.apply(this)
}
boundToSymbol() {
return !0
}
isSynchronizable() {
return this.priceScale() === this._model.mainSeries().priceScale()
}
static studyId() {
return u
}
static createProperties(e) {
const t = super._createPropertiesFromStudyIdAndState(u, e);
return c.a._configureProperties(t), t
}
}
var p = i("e92V"),
_ = i("QIuV");
i.d(t, "setNewToolProperties", (function() {
return g
})), i.d(t, "unsetNewToolProperties", (function() {
return b
})), i.d(t, "getNewToolProperties", (function() {
return v
})), i.d(t, "createLineTool", (function() {
return S
})), i.d(t, "prepareLineToolPropertiesByOwnerSource", (function() {
return y
})), i.d(t, "createLineToolProperties", (function() {
return w
})), i.d(t, "createStudyLineToolProperties", (function() {
return P
})), i.d(t, "supportsPhantomMode", (function() {
return C
})), i.d(t, "isLineTool", (function() {
return x
})), i.d(t, "isStudyLineTool", (function() {
return T
})), i.d(t, "isTrading", (function() {
return I
})), i.d(t, "tryFindStudyLineToolNameByStudyId", (function() {
return M
})), i.d(t, "cloneLineTool", (function() {
return O
})), i.d(t, "lineToolByLinkKey", (function() {
return L
})), i.d(t, "isLineToolName", (function() {
return p.isLineToolName
})), i.d(t, "isStudyLineToolName", (function() {
return p.isStudyLineToolName
})), i.d(t, "isLineDrawnWithPressedButton", (function() {
return p.isLineDrawnWithPressedButton
}));
function m(e) {
for (const t of Object.keys(e)) TradingView[t] = e[t]
}
m(a), m({
LineToolRegressionTrend: l.LineToolRegressionTrend,
LineToolVbPFixed: c.a,
LineToolFixedRangeVolumeProfile: d
});
let f = null;
function g(e, t) {
return null !== f && f.tool === e && f.toolData === t || (f = {
properties: w(e),
tool: e,
toolData: t
}), f.properties
}
function b() {
f = null
}
function v(e) {
return null !== f && f.tool === e ? f.properties : null
}
function S(e, t, i, r, n) {
let o;
if (Object(s.assert)(Object(p.isLineToolName)(e), "Unknown line tool: " + e), n || i || (i =
v(e) || void 0), "LineToolVbPFixed" === e) o = new c.a(t, i, Object(s.ensureDefined)
(r), t.mainSeries());
else if ("LineToolFixedRangeVolumeProfile" === e) o = new d(t, i, Object(s.ensureDefined)(
r), t.mainSeries());
else if ("LineToolRegressionTrend" === e) o = new l.LineToolRegressionTrend(t, i, Object(s
.ensureDefined)(r));
else {
o = new(Object(s.ensureDefined)(a[e]))(t, i, n)
}
return o.toolname = e, b(), o
}
function y(e, t) {
const i = Object(s.ensureNotNull)(t.symbolSource());
e.childs().symbol.setValue(i.symbol()), e.childs().currencyId.setValue(i.currency()), e
.childs().unitId.setValue(i.unit()), e.childs().symbolStateVersion.setValue(2), e
.childs().zOrderVersion.setValue(2)
}
function w(e, t) {
if (Object(s.assert)(Object(p.isLineToolName)(e), e + " should be name of the line tool"),
"LineToolVbPFixed" === e) return c.a.createProperties(t);
if ("LineToolFixedRangeVolumeProfile" === e) return d.createProperties(t);
if ("LineToolRegressionTrend" === e) return l.LineToolRegressionTrend.createProperties(t);
return Object(s.ensureDefined)(a[e]).createProperties(t)
}
function P(e, t, i, r, n) {
if (Object(s.assert)(Object(p.isStudyLineToolName)(e), e +
" should be name of the study line tool"), "LineToolVbPFixed" === e) return c.a
.createPropertiesFromStudyMetaInfoAndState(t, i, r, n);
if ("LineToolFixedRangeVolumeProfile" === e) return d
.createPropertiesFromStudyMetaInfoAndState(t, i, r, n);
if ("LineToolRegressionTrend" === e) return l.LineToolRegressionTrend
.createPropertiesFromStudyMetaInfoAndState(t, i, r, n);
throw new Error("Property creation is not implemented for study line tool " + e)
}
function C(e) {
Object(s.assert)(Object(p.isLineToolName)(e), e + " should be name of the line tool");
const t = a[e];
return void 0 !== t && Boolean(t.supportPhantomMode)
}
function x(e) {
return e instanceof o.LineDataSource
}
function T(e) {
return e instanceof n.StudyLineDataSource
}
function I(e) {
return e instanceof _.LineToolTrading
}
function M(e) {
let t = null;
return e === l.LineToolRegressionTrend.studyId() ? t = "LineToolRegressionTrend" : e === c.a
.studyId() ? t = "LineToolVbPFixed" : e === d.studyId() && (t =
"LineToolFixedRangeVolumeProfile"), t
}
function O(e, t, i, n) {
const o = t.toolname,
a = w(t.toolname, t.properties().state());
a.childs().visible.setValue(!0);
const l = Object(s.ensureNotNull)(t.ownerSource()),
c = S(o, e, a);
void 0 !== n && c.setId(n), c.setOwnerSource(l), c.toolname = o;
const h = c.clonePositionOffset(),
u = t.fixedPoints();
(i ? u.map(e => e.add(new r.Point(h.xCoordOffset, h.yCoordOffset))) : u).forEach(e => c
.addFixedPoint(e));
const d = t.normalizedPoints(),
p = i ? function(e, t, i) {
const r = Object(s.ensureNotNull)(t.priceScale()),
n = Object(s.ensureNotNull)(t.firstValue());
return e.map(e => {
const t = e.price,
s = r.priceToCoordinate(t, n) + i.yCoordOffset,
o = r.coordinateToPrice(s, n);
return {
time_t: e.time_t,
price: o,
offset: e.offset + i.barOffset
}
})
}(d, l, h) : d,
_ = t.points();
return c.restorePoints(p, _), c.cloneData && c.cloneData(t), c.checkAlert && c.checkAlert(),
c
}
function L(e, t) {
return e.dataSources().find(e => x(e) && e.linkKey().value() === t) || null
}
},
Cf1E: function(e, t, i) {
"use strict";
function s(e) {
if (void 0 === e) return "";
if (e instanceof Error) {
let t = e.message;
return e.stack && (t += " " + e.stack), t
}
return "string" == typeof e ? e.toString() : JSON.stringify(e)
}
i.d(t, "a", (function() {
return s
}))
},
CsKN: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SetScaleRatioPropertiesCommand", (function() {
return n
}));
var s = i("RDU5"),
r = i("Ocx9");
class n extends s.UndoCommand {
constructor(e, t, i, s) {
super(i), this._property = e, this._newValue = t, this._model = s, this
._priceScale = this._model.mainSeries().priceScale(), this._oldValue = this
._property.value(), this._oldMode = this._priceScale.mode()
}
redo() {
this._oldValue = this._property.value(), this._oldMode = this._priceScale
.mode(), Object(r.saveDefaultProperties)(!0), this._priceScale.setMode({
autoScale: !1,
percentage: !1,
log: !1
}), this._property.setValue(this._newValue), Object(r.saveDefaultProperties)
(!1), this._model.recalculateAllPanes(), this._model.lightUpdate()
}
undo() {
Object(r.saveDefaultProperties)(!0), this._property.setValue(this._oldValue),
this._priceScale.setMode(this._oldMode), Object(r.saveDefaultProperties)(!
1), this._model.recalculateAllPanes(), this._model.lightUpdate()
}
}
},
CwKc: function(e, t) {
e.exports =
''
},
CxTi: function(e, t, i) {
e.exports = {
css_value_currency_label_top: "6",
css_value_currency_label_radius: "4",
css_value_currency_label_text_horizontal_padding: "4",
css_value_border_color_light: "#D1D4DC",
css_value_border_color_dark: "#363A45",
"price-axis-currency-label-wrapper": "price-axis-currency-label-wrapper-25tFaE37",
"price-axis-currency-label": "price-axis-currency-label-25tFaE37",
readonly: "readonly-25tFaE37",
multiline: "multiline-25tFaE37",
"price-axis-currency-label-dropdown": "price-axis-currency-label-dropdown-25tFaE37",
"price-axis-currency-label-text": "price-axis-currency-label-text-25tFaE37",
"price-axis-currency-label-arrow-down": "price-axis-currency-label-arrow-down-25tFaE37"
}
},
DVnF: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("Ss5c");
class r extends s.LineDataSource {
constructor() {
super(...arguments), this._finished = !1
}
pointsCount() {
return -1
}
finished() {
return this._finished
}
finish() {
this._finished = !0, this._lastPoint = null, this.normalizePoints(), this
.createServerPoints()
}
hasEditableCoordinates() {
return !1
}
addPoint(e, t, i) {
if (this._finished) return !0;
if (this._lastPoint = null, this._points.length > 0) {
const t = this._points[this._points.length - 1],
i = this.pointToScreenPoint(t)[1];
if (this.pointToScreenPoint(e)[1].subtract(i).length() < 2) return this
._finished
}
return super.addPoint(e), this._finished
}
restorePoints(e, t, i) {
super.restorePoints(e, t, i), this._finished = !0
}
}
},
Daqx: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return o
}));
const s = ["Z", "Y", "X", "W", "V", "U", "T", "S"],
r = ["A", "B", "C", "D", "E", "F", "G", "H"];
class n {
constructor(e) {
this.label = e
}
equals(e) {
return null !== e && this.label === e.label
}
}
function o(e, t) {
const i = "left" === e ? s : r;
return new n(t < i.length ? i[t] : "")
}
},
Dq3s: function(e) {
e.exports = JSON.parse(
'{"4":["v",["h",0,2],["h",1,3]],"6":["v",["h",0,2,4],["h",1,3,5]],"8":["v",["h",0,2,4,6],["h",1,3,5,7]],"2h":["h",0,1],"2v":["v",0,1],"2-1":["v",["h",0,2],1],"3s":["h",0,["v",1,2]],"3h":["h",0,1,2],"3v":["v",0,1,2],"1-2":["v",0,["h",1,2]],"3r":["h",["v",0,1],2],"4h":["h",0,1,2,3],"4v":["v",0,1,2,3],"4s":["h",0,["v",1,2,3]],"1-3":["v",0,["h",1,2,3]],"2-2":["v",["h",0,1],["v",2,3]],"1-4":["v",0,["h",1,2,3,4]],"5s":["h",0,["v",1,2,3,4]],"6c":["v",["h",0,1],["h",2,3],["h",4,5]],"8c":["v",["h",0,1],["h",2,3],["h",4,5],["h",6,7]],"s":0}'
)
},
E3Wt: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("YFKU"),
n = i("RDU5");
class o extends n.UndoCommand {
constructor(e, t) {
super(""), this._chartModel = e, this._targetIndex = t
}
redo() {
const e = this._chartModel.createPane(this._targetIndex, void 0, this._paneId);
this._paneId = e.id()
}
undo() {
const e = Object(s.ensureDefined)(this._paneId),
t = this._chartModel.panes().find(t => t.id() === e);
void 0 !== t && this._chartModel.removePane(t)
}
createdPaneId() {
return this._paneId
}
}
var a = i("txPx"),
l = i("25b6"),
c = i("qHEz");
const h = Object(a.getLogger)("Clipboard");
class u {
constructor(e) {
this._e = e
}
write(e) {
return Object(c.a)(this._toRaw(e), this._e)
}
_toRaw(e) {
const t = {
files: []
};
t.text = e.text, void 0 !== e.app ? t.html = this._serializeAppData(e.app, e.text) :
e.html && (t.html = e.html);
for (const i of e.files || []) t.files.push(i);
return t
}
_serializeAppData(e, t) {
return `${t ? Object(l.b)(t.slice(0, 256)) : "📈"}`
}
}
class d {
constructor(e) {
this._e = e
}
async read() {
this._e && 0 === this._e.eventPhase && (h.logWarn(
"Cannot use an already dispatched ClipboardEvent for reading"), this
._e = null);
const e = this._e ? this._readUsingEvent(this._e) : await this._readUsingApi();
return this._fromRaw(e)
}
_readUsingEvent(e) {
const t = Object(s.ensure)(e.clipboardData);
e.preventDefault();
const i = {
files: []
};
for (let e = 0; e < t.files.length; e++) i.files.push(t.files[e]);
for (let e = 0; e < t.items.length; e++) {
const s = t.items[e];
"string" === s.kind && ("text/plain" === s.type ? i.text = t.getData(s.type) :
"text/html" === s.type ? i.html = t.getData(s.type) : i.files.push(
new Blob([t.getData(s.type)], {
type: s.type
})))
}
return i
}
async _readUsingApi() {
if (!navigator.clipboard || !navigator.clipboard.read) throw new DOMException(
"ClipboardApi is not supported", "NotSupportedError");
let e, t;
const i = [],
s = await navigator.clipboard.read();
for (const r of s)
for (const s of r.types) "text/html" === s ? e = r.getType(s).then(this
._readBlobAsText) : "text/plain" === s ? t = r.getType(s).then(this
._readBlobAsText) : i.push(r.getType(s));
return {
text: await t,
html: await e,
files: await Promise.all(i)
}
}
_fromRaw(e) {
const t = {};
if (void 0 !== e.text && (t.text = e.text), void 0 !== e.html) {
const i = this._parseAppData(e.html);
i ? t.app = i : t.html = e.html
}
return e.files.length > 0 && (t.files = e.files), t
}
_parseAppData(e) {
if (-1 === e.slice(0, 1024).indexOf("data-tradingview-clip")) return;
const t = (new DOMParser).parseFromString(e, "text/html").querySelector(
"[data-tradingview-clip]");
return t ? t.getAttribute("data-tradingview-clip") || "" : void 0
}
_readBlobAsText(e) {
return new Promise((t, i) => {
const s = new FileReader;
s.onloadend = () => {
t(s.result)
}, s.onerror = () => {
i(s.error)
}, s.readAsText(e)
})
}
}
var p = i("d700");
function _(e) {
const t = e.target;
return null !== t && 1 === t.nodeType && Object(p.b)(t)
}
function m(e) {
const t = e.target;
if (null === t) return !1;
const i = (t.ownerDocument || t).getSelection();
return null !== i && !i.isCollapsed
}
class f extends class {
constructor(e) {
this._callbacks = Object.assign({}, e), this._boundOnCopy = this._onCopyEv.bind(
this), this._boundOnCut = this._onCutEv.bind(this), this._boundOnPaste =
this._onPasteEv.bind(this)
}
listen() {
document.addEventListener("copy", this._boundOnCopy), document.addEventListener(
"cut", this._boundOnCut), document.addEventListener("paste", this
._boundOnPaste)
}
async peek() {
if ("granted" !== (await navigator.permissions.query({
name: "clipboard-read"
})).state) throw new Error("clipboard-read is not granted");
return new d(null).read()
}
uiRequestCopy(e) {
this._callbacks.copyRequested && this._callbacks.copyRequested(new u(null), e)
}
uiRequestCut(e) {
this._callbacks.cutRequested && this._callbacks.cutRequested(new u(null), e)
}
uiRequestPaste(e) {
this._callbacks.pasteRequested && this._callbacks.pasteRequested(new d(null), e)
}
destroy() {
document.removeEventListener("copy", this._boundOnCopy), document
.removeEventListener("cut", this._boundOnCut), document.removeEventListener(
"paste", this._boundOnPaste)
}
_onCopyEv(e) {
e.defaultPrevented || this._callbacks.copyRequested && this._callbacks
.copyRequested(new u(e))
}
_onCutEv(e) {
e.defaultPrevented || this._callbacks.cutRequested && this._callbacks.cutRequested(
new u(e))
}
_onPasteEv(e) {
e.defaultPrevented || this._callbacks.pasteRequested && this._callbacks
.pasteRequested(new d(e))
}
} {
_onCopyEv(e) {
if (!_(e) && !m(e)) return super._onCopyEv(e)
}
_onCutEv(e) {
if (!_(e) && !m(e)) return super._onCutEv(e)
}
_onPasteEv(e) {
if (!_(e)) return super._onPasteEv(e)
}
}
i.d(t, "applyIndicatorsToAllChartsImpl", (function() {
return g
})), i.d(t, "applyIndicatorToAllChartsImpl", (function() {
return b
})), i.d(t, "lineToolsAndGroupsDTOsImpl", (function() {
return S
})), i.d(t, "getStateForChartImpl", (function() {
return y
})), i.d(t, "getAsyncStateForChartImpl", (function() {
return w
})), i.d(t, "resetLineToolsInvalidatedImpl", (function() {
return P
})), i.d(t, "applyLineToolUpdateNotificationImpl", (function() {
return C
})), i.d(t, "createClipboardHandler", (function() {
return x
})), i.d(t, "setBrokerImpl", (function() {
return T
})), i.d(t, "chartsSymbolsImpl", (function() {
return I
}));
Object(r.t)(
"Please give us a clipboard writing permission in your browser or press {keystroke}");
function g(e, t) {
const i = t.model().model().studyTemplate();
e.undoHistory.beginUndoMacro("Apply Indicators to Entire Layout");
for (let s = 0; s < e.chartWidgetsDefs.length; s++) {
const r = e.chartWidgetsDefs[s].chartWidget;
r !== t && (r.hasModel() && r.model().applyStudyTemplate(i, ""))
}
e.undoHistory.endUndoMacro()
}
function b(e, t, i, r, n) {
e.undoHistory.beginUndoMacro(n);
for (let a = 0; a < e.chartWidgetsDefs.length; a++) {
const l = e.chartWidgetsDefs[a].chartWidget;
if (l !== t && l.hasModel()) {
const t = l.model();
let a;
if (r.isOnMainPane) a = Object(s.ensureNotNull)(t.model().paneForSource(l.model()
.model().mainSeries()));
else {
const i = new o(t.model(), r.paneIndex);
e.undoHistory.pushUndoCommand(i);
const n = Object(s.ensureDefined)(i.createdPaneId());
a = Object(s.ensureDefined)(t.model().panes().find(e => e.id() === n))
}
const c = t.pasteSourceFromClip(a, i, !0);
if (c && 1 === c.length) {
const e = c[0];
if (r.asCompare) {
const i = Object(s.ensureNotNull)(t.mainSeries().priceScale());
t.moveToScale(e, Object(s.ensureDefined)(a), i, n), t.setPriceScaleMode({
percentage: !0
}, i, "")
}
}
t.model().lightUpdate()
}
}
e.undoHistory.endUndoMacro()
}
function v(e) {
let t = 1;
for (; e.has("" + t);) t++;
return "" + t
}
function S(e) {
const t = new Map,
i = e.chartsCountToSave(),
s = new Set;
for (let r = 0; r < i; r++)
if (r < e.chartWidgetsDefs.length) {
const i = e.chartWidgetsDefs[r].chartWidget,
n = i.id(),
o = i.lineToolsAndGroupsDTO();
t.set(n, o), s.add(n)
} else {
const i = e.savedChartWidgetOptions[r - e.chartWidgetsDefs.length].content;
i.chartId || (i.chartId = v(s)),
t.set(i.chartId, extractLineToolsDTOFromChartState(i)), s.add(i.chartId)
} return t
}
function y(e, t, i, s, r, n) {
if (t < e.chartWidgetsDefs.length) {
const o = e.chartWidgetsDefs[t].chartWidget;
return t < e.actualLayoutCount() || o.shouldBeSavedEvenIfHidden() ? o.state(i, s, r,
n) : null
}
const o = e.savedChartWidgetOptions[t - e.chartWidgetsDefs.length].content;
return o
}
function w(e, t) {
return t < e.chartWidgetsDefs.length ? e.chartWidgetsDefs[t].chartWidget.asyncState() :
Promise.resolve({})
}
function P(e, t, i) {
const s = e.chartsCountToSave();
for (let r = 0; r < s; r++)
if (r < e.chartWidgetsDefs.length) {
const s = e.chartWidgetsDefs[r].chartWidget,
n = s.id(),
o = i.get(n);
s.resetLineToolsInvalidated(t, o)
} else 0
}
function C(e, t, i) {
var s;
null === (s = e.map(e => e.chartWidget).find(e => e.id() === t)) || void 0 === s || s
.applyLineToolUpdateNotification(i)
}
function x(e) {
return new f({
copyRequested: (t, i) => {
e.activeChartWidget.value().model().clipboardCopy(t, i)
},
cutRequested: (t, i) => {
e.activeChartWidget.value().model().clipboardCut(t, i)
},
pasteRequested: (t, i) => {
(i ? i.model().undoModel() : e.activeChartWidget.value().model())
.clipboardPaste(t, i)
}
})
}
function T(e, t) {
0
}
function I(e) {
const t = {};
return e.chartWidgetsDefs.map(e => e.chartWidget).forEach(e => t[e.id()] = function(e) {
var t, i;
const s = {},
r = e.model().mainSeries(),
n = r.properties(),
o = r.symbolInfo();
s.resolution = r.properties().interval.value(), s.symbol_type = null !== o && o
.type || "", s.exchange = null !== o && o.exchange || "", s
.listed_exchange = null !== o && o.listed_exchange || "";
const a = null !== (t = null == o ? void 0 : o.legs) && void 0 !== t ? t : [];
if (null !== o && r.isSpread()) {
const e = a[0];
let t = o.base_name[0];
t = t.split(":")[1], s.symbol = e, s.short_name = t, s.expression = o
.full_name
} else s.symbol = null !== o && o.ticker || n.symbol.value(), s.short_name = n
.shortName.value();
const l = null !== (i = null == o ? void 0 : o.base_name) && void 0 !== i ? i :
[];
return s.legs = a.map((e, t) => ({
symbol: e,
pro_symbol: l[t]
})), s
}(e)), t
}
},
E6p6: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "SessionStage", (function() {
return s
})),
function(e) {
e[e.PRE_SESSION = -1] = "PRE_SESSION", e[e.POST_SESSION = -2] = "POST_SESSION", e[e
.LASTBAR_SESSION = -3] = "LASTBAR_SESSION"
}(s || (s = {}))
},
EJcV: function(e, t, i) {
"use strict";
var s = i("rQHv"),
r = i("ocLq"),
n = i("8gnj"),
o = i("XRI5").SymbolExtrapolator,
a = i("ViuT").SessionTimeScale,
l = i("gzUS").PointsetsManager,
c = i("IiTo"),
h = i("OLhd").createDwmAligner,
u = i("LxhU").Interval,
d = i("FQhm"),
p = i("TlGQ").visitObject,
_ = i("ogJP").isObject;
i("2cgs"), i("MrEN");
var m = i("WIS0").DatafeedRequestsCachedProcessor,
f = i("+6ja").timezoneIsAvailable,
g = i("OLhd").isAlignmentEnabled,
b = i("5fI3"),
v = b.isEncodedExtendedSymbol,
S = b.decodeExtendedSymbol,
y = i("n5al").extractSymbolNameFromSymbolInfo,
w = i("dUJ+").replaceGraphicsTimesWithTimePointIndexIndex,
P = i("Kxc7");
function C(e) {
var t = e.findIndex((function(e) {
return -5e6 !== e.index
}));
return -1 === t ? [] : 0 === t ? e : e.slice(t)
}
function x(e, t) {
return e + "_" + t
}
var T = function(e) {
var t = this;
this._studiesCache = {}, this._objectsDataCache = {}, this._studiesNonSeriesTimes = {},
this._metainfoCache = [], this._barsCoefficientsCache = {}, this._externalDatafeed =
e,
e.getVolumeProfileResolutionForPeriod && r
.overwriteVolumeProfileResolutionForPeriodGetter((function(t, i, s, r) {
return e.getVolumeProfileResolutionForPeriod(t, i, s, r)
})), this._datafeedConfiguration = null, this._marketStatusWatchers = {}, this
._resolveRequests = {}, this._resolvePromisesBySymbolId = new Map, this
._symbolIdToSymbolRequestString = new Map, this._callbacks = {}, this
._serverTimeOffset = 0, t._logMessage("Datafeed settings received: {0}".format(JSON
.stringify(window.configurationData))), t._datafeedConfiguration = t
._adoptConfigurationData(window.configurationData), t._fireEvent(
"configuration_received"), t._externalDatafeed.getServerTime && t
._externalDatafeed.getServerTime((function(e) {
t._serverTimeOffset = e - (new Date).valueOf() / 1e3
})), this._invalidatedPointsetSessions = new Set, this._refreshPointsetsTimerId =
null, this._pointsetsManagers = {}, this._quotesInfo = [], this._depthInfo = [],
this._endOfData = {}, this._computeStudyCounter = 0, this._symbolExtrapolators = {},
this._timeScales = {}, this._cachedDatafeed = new m(e, this.serverTimeOffset.bind(
this), this._datafeedConfiguration.reset_cache_timeout), n.setupFeed({
resolve: function(e, i, s, r) {
t._resolveSymbolByName(e, i, s, r)
},
subscribe: function(e, i, s, r, n) {
return t._cachedDatafeed.subscribe(e, i, s, function(e, i, s) {
var r = new c.SessionInfo(e.timezone, e.session, e
.session_holidays, e.corrections),
n = c.newBarBuilder(i, r, r);
return function(e) {
if (e && e.count()) {
var i = 1e3 * t.getCurrentUTCTime();
n.moveTo(i), n.indexOfBar(i) >= 0 && e
.setLastBarClosed(!1)
}
s(e)
}
}(e, i, r), n)
},
unsubscribe: function(e) {
return t._cachedDatafeed.unsubscribe(e)
}
})
};
function I(e, t) {
return e + "_" + t
}
function M(e, t, i) {
return e + (t ? "_#_" + t : "") + (i ? "_#_" + i : "")
}
T.prototype._getSymbolExtrapolator = function(e, t, i) {
var s = u.normalize(i),
r = function(e, t, i) {
return e + "," + t.full_name + "," + i
}(e, t, s),
n = this._symbolExtrapolators[r];
return void 0 === n && (n = new o(t, s), this._symbolExtrapolators[r] = n), n
}, T.prototype._barsCoefficients = function(e, t) {
if (void 0 === S(e).type) return {};
var i = e + t;
return this._barsCoefficientsCache[i] || (this._barsCoefficientsCache[i] = {}), this
._barsCoefficientsCache[i]
}, T.prototype.destroy = function() {
this._cachedDatafeed.destroy(), this._externalDatafeed = null, Object.keys(this
._pointsetsManagers).forEach((function(e) {
this._pointsetsManagers[e].destroy()
}), this), this._pointsetsManagers = {}
}, T.prototype.purgeCache = function() {
this._endOfData = {}, this._resolveRequests = {}, this._objectsDataCache = {}, this
._studiesNonSeriesTimes = {}, this._studiesCache = {}, this
._resolvePromisesBySymbolId.clear(), this._symbolIdToSymbolRequestString.clear(),
Object.keys(this._pointsetsManagers).forEach((function(e) {
this._pointsetsManagers[e].destroy()
}), this), this._pointsetsManagers = {}, Object.keys(this._timeScales).forEach((
function(e) {
this._timeScales[e].destroy()
}), this), this._timeScales = {}, Object.keys(this._symbolExtrapolators)
.forEach((function(e) {
this._symbolExtrapolators[e].destroy()
}), this), this._symbolExtrapolators = {}
}, T.prototype.purgeDataCache = function() {
this._cachedDatafeed.purgeCache()
}, T.prototype._logMessage = function(e) {
P.enabled("charting_library_debug_mode") && console.log(e)
},
T.prototype.on = function(e, t) {
return this._callbacks.hasOwnProperty(e) || (this._callbacks[e] = []), this._callbacks[
e].push(t), this
}, T.prototype._fireEvent = function(e, t, i) {
if (this._callbacks.hasOwnProperty(e)) {
for (var s = this._callbacks[e], r = 0; r < s.length; ++r) s[r](t);
i || (this._callbacks[e] = [])
}
}, T.prototype._adoptConfigurationData = function(e) {
var t = TradingView.merge({}, e),
i = t.supported_resolutions;
if (!i || 0 === i.length) return t.supported_resolutions = void 0, t;
for (var s = [], r = 0; r < i.length; r++) {
var n = i[r];
if (-1 !== s.indexOf(n)) throw new Error("Duplicating resolution `" + n + "`");
s.push(n)
}
return t.supported_resolutions = s, t
}, T.prototype.supportedResolutions = function() {
return this._datafeedConfiguration.supported_resolutions
}, T.prototype.supportedCurrencies = function() {
return this._datafeedConfiguration.currency_codes || []
}, T.prototype.supportedUnits = function() {
return this._datafeedConfiguration.units || []
}, T.prototype.supportedSymbolsTypes = function() {
return this._datafeedConfiguration.symbols_types || []
}, T.prototype.supportedExchangesList = function() {
return this._datafeedConfiguration.exchanges || []
}, T.prototype.symbolsGrouping = function() {
return this._datafeedConfiguration.symbols_grouping || {
futures: /$a/
}
}, T.prototype._findStudyObject = function(e) {
e.endsWith("!") && (e = e.slice(0, -1));
var t = e.split("@")[0],
i = JSServer.studyLibrary.filter((function(i) {
return i.metainfo.id === e || i.metainfo.shortDescription === t
}));
return 0 === i.length ? null : i[0]
}, T.prototype.getMarks = function(e, t, i, s, r) {
var n = {
red: 6,
green: 5,
blue: 4,
yellow: 3
};
if (this._externalDatafeed.getMarks && this._datafeedConfiguration.supports_marks) {
this._logMessage(
"Requesting bars marks: symbol {0}, resolution {1}, range [{2} ... {3}]"
.format(e.full_name, r, new Date(1e3 * t).toUTCString(), new Date(1e3 * i)
.toUTCString()));
var o = this;
this._externalDatafeed.getMarks(e, t, i, (function(t) {
var i = t.map((function(e) {
return e.time = parseInt(e.time), e
}));
o._logMessage(
"Received bars marks: symbol {0}, resolution {1}, marks {2}"
.format(e.full_name, r, JSON.stringify(i)));
var a = h(r, e),
l = P.enabled("two_character_bar_marks_labels"),
c = i.map((function(e) {
return e.tickmark = null !== a ? a
.timeToSessionStart(1e3 * e.time) / 1e3 : e
.time, e.direction = n[e.color], e.onClicked =
function() {
d.emit("onMarkClick", e.id)
}, e.label = !!e.label && (l ? e.label.slice(0,
2) : e.label[0]), e
}));
s(c)
}), r)
}
}, T.prototype.getTimescaleMarks = function(e, t, i, s, r) {
if (this._externalDatafeed.getTimescaleMarks && this._datafeedConfiguration
.supports_timescale_marks) {
this._logMessage(
"Requesting timescale marks: symbol {0}, resolution {1}, range [{2} ... {3}]"
.format(e.full_name, r, new Date(1e3 * t).toUTCString(), new Date(1e3 * i)
.toUTCString()));
var n = this;
this._externalDatafeed.getTimescaleMarks(e, t, i, (function(t) {
n._logMessage(
"Received timescale marks: symbol {0}, resolution {1}, marks {2}"
.format(e.full_name, r, JSON.stringify(t)));
var i = h(r, e),
o = t.map((function(e) {
return e.tickmark = null !== i ? i
.timeToSessionStart(1e3 * e.time) / 1e3 : e
.time, e
}));
s(o)
}), r)
}
}, T.prototype.getSeriesLastBarTime = function(e, t) {
var i = this._getSeriesData(e, t);
return null === i || 0 === i.length ? null : i[i.length - 1].timeMs
}, T.prototype.getSeriesInterval = function(e, t) {
var i = this._studiesCache[e][t];
return i ? i.resolution : null
}, T.prototype.getSeriesSymbolInfo = function(e, t) {
var i = this._studiesCache[e][t];
return i ? i.symbolInfo : null
}, T.prototype.getSeriesInterval = function(e, t) {
var i = this._studiesCache[e][t];
return i ? i.resolution : null
}, T.prototype.getSeriesSymbolInfo = function(e, t) {
var i = this._studiesCache[e][t];
return i ? i.symbolInfo : null
}, T.prototype._getSeriesData = function(e, t) {
return this._objectsDataCache[I(e, t)] || null
}, T.prototype._computeStudy = async function(e, t, i, s, n, o, a, l, c, d) {
var p = !0,
_ = [];
null !== l && (this._objectsDataCache[l] = null);
var m = this._computeStudyCounter++;
function f(e, t) {
if (e < c()) return -5e6;
if (0 === t) return 0;
var i = _[t - 1].index;
return -5e6 === i ? 0 : i + 1
}
var b = new Map;
var v = !1,
S = this,
y = function() {
return S._studiesCache[e] && S._studiesCache[e][n] && S._studiesCache[e][n]
.activeResolve === m
};
S._studiesCache[e][n].activeResolve = m;
var w, C, T = this._resolvePromisesBySymbolId.get(x(e, i));
if (void 0 === T) throw new Error("This should never happen");
try {
var I = await T;
w = I.symbolInfo, C = I.requestedSymbol
} catch (e) {
return void(y() && d.onSymbolErrorCallback(e))
}
y() && function(i, c) {
if (!u.parse(s).isIntraday() || i.has_intraday) {
if (u.isDWM(s) && void 0 !== a.to) {
var m = h(s, i);
null !== m && (a.to = m.timeToExchangeTradingDay(a.to))
}
try {
var y = new r.StudyEngine({
tickerid: c,
symbolInfo: i,
period: s,
body: t,
sessionId: e,
onErrorCallback: d.onErrorCallback,
dataRange: a,
forceAlignBars: !P.enabled(
"disable_sameinterval_aligning") && g(),
input: function(e) {
return o[e]
},
out: function(e, t) {
! function(e, t, i) {
for (var s = e.time, r = "number" ==
typeof t ? [t] : t, n = 0; n < r
.length; ++n) {
var o = r[n];
o && "object" == typeof o && (b.set(n, o
.offset), o = o.value),
"number" == typeof o && isNaN(o) &&
(o = void 0), r[n] = o
}
var a = _.length - 1,
l = a < 0 || s > _[a].timeMs;
l ? _.push({
index: f(s, _.length),
value: [s / 1e3].concat(r),
timeMs: s
}) : (_[a].index = f(s, a), _[a]
.value = [s / 1e3].concat(r), _[a]
.timeMs = s), p || d
.onRealtimeCallback([_[_.length - 1]],
l, _.length, b, i)
}(e, t, i)
},
nonseriesOut: function(e, t) {
d.onNonSeriesDataUpdate(t, i)
},
setNoMoreData: function() {
v = !0
},
recalc: function(e, s) {
p = !1, _.endOfData = v, t.error && null !== t
.error() || (null !== l && (S
._objectsDataCache[l] = _), d
.onDataReadyCallback(_, b, i, s))
}
});
if (!S._studiesCache[e] || !S._studiesCache[e][n]) throw Error(
"This should never happen");
S._studiesCache[e][n].engine = y
} catch (e) {
if (!e.studyError) throw e;
d.onErrorCallback(e.message)
}
} else d.onErrorCallback(
"Unsupported resolution. Did you forget to set has_intraday to true?"
)
}(w, C)
}, T.prototype._createStudy = function(e, t, i, s, r, n, o, a) {
var l = this;
function c(e, t, i) {
e = C(e), l._timeScales[s].fillIndexesInRows(e), TradingView
.ChartapiMessagerInstances[s].onDataUpdate(r, n, e, t), TradingView
.ChartapiMessagerInstances[s].onStudyCompleted(r, n)
}
function h(e) {
var t = {};
if (0 !== e.size) {
var i = {},
n = l._studiesCache[s][r].metainfo;
e.forEach((function(e, t) {
i[n.plots[t].id] = e
})), t.data = {
offsets: i
}
}
return t
}
a = function(e) {
if (Array.isArray(e)) return e;
for (var t = [], i = l._studiesCache[s][r].metainfo.inputs, n = 0; n < i
.length; n++) t[n] = e[i[n].id];
return t
}(a), TradingView.ChartapiMessagerInstances[s].onStudyLoading(r, n);
var u = null,
d = !1;
l._computeStudy(s, i, e, t, r, a, this._seriesDataRange(s, o), null, (function() {
if (null === u) {
var e = l._getSeriesData(s, o)[0];
if (void 0 === e) return 1 / 0;
u = e.timeMs
}
return u
}), {
onDataReadyCallback: function(e, t, i) {
d && 0 === e.length || c(e, h(t))
},
onRealtimeCallback: function(e, t, i, o, a) {
e = C(e), l._timeScales[s].fillIndexesInRows(e), TradingView
.ChartapiMessagerInstances[s].onDataUpdate(r, n, e, h(o))
},
onSymbolErrorCallback: function() {
TradingView.ChartapiMessagerInstances[s].onStudyError(r, n,
"error in series")
},
onErrorCallback: function(e) {
TradingView.ChartapiMessagerInstances[s].onStudyError(r, n, e)
},
onNonSeriesDataUpdate: function(e, t) {
switch (d = !0, e.type) {
case "projection":
break;
case "study_graphics":
var i = {
data: e.data,
indexes: []
},
n = w(i);
l._studiesNonSeriesTimes[s][r] = n, i.indexes = l
._timeScales[s].convertTimesToIndexes(n), c([], i);
break;
case "non_series_data":
n = function(e) {
var t = {};
p(e, (function(e) {
_(e) && Object.keys(e).forEach((
function(i) {
i.endsWith(
"__t"
) &&
(t[e[i]] = !
0)
}))
}), {
visitInstances: !0
});
var i = Object.keys(t).map(Number).sort((
function(e, t) {
return e - t
}));
return i.forEach((function(e, i) {
t[e] = i
})), Object.assign(e, p(e, (function(e) {
return _(e) && Object.keys(
e).forEach((
function(i) {
i.endsWith(
"__t"
) &&
(e[i.slice(0,
-
3
)] =
t[e[
i
]]
)
})), e
}), {
visitInstances: !0
})), i
}(i = {
data: e.data,
indexes: []
});
l._studiesNonSeriesTimes[s][r] = n, i.indexes = l
._timeScales[s].convertTimesToIndexes(n), c([], i);
break;
default:
console.warn(
"unsupported non-series data type for study " +
e.type)
}
}
})
}, T.prototype.onSessionSeriesError = function(e) {
this.stopSources(e);
var t = this._mainSeriesRecord(e);
null !== t && (t.error = !0), this._applyTimeScaleUpdate(e, this._timeScales[e]
.clearTimeScale())
}, T.prototype.modifySeries = function(e, t, i, s, r) {
var n = this._mainSeriesRecord(e);
if (null === n || n.guid !== t) {
if (null !== n && n.error) return this._studiesCache[e][t].symbolId = i, this
._studiesCache[e][t].resolution = s, void(this._studiesCache[e][t]
.turnaround = r);
for (var o in this._stopSourcesTree(e, t), this.createSeries(e, t, r, i, s, {
countBack: 0
}, !0), this._studiesCache[e]) {
var a = this._studiesCache[e][o];
if (a && "study" === a.type && a.parentId === t) {
this._studiesNonSeriesTimes[e][o] = null;
var l = this._studiesCache[e][a.parentId];
this._createStudy(l.symbolId, l.resolution, a.studyObject, e, o, a
.turnaround, a.parentId, a.inputs)
}
}
} else this._modifyMainSeries(e, i, s, r)
}, T.prototype._modifyMainSeries = function(e, t, i, s) {
this.stopSources(e);
var r = this._mainSeriesRecord(e);
for (var n in this._studiesCache[e]) {
(o = this._studiesCache[e][n]) && "series" === o.type && (o.guid === r.guid ?
this.createSeries(e, r.guid, s, t, i, {
countBack: 0
}, !0) : this.createSeries(e, o.guid, o.turnaround, o.symbolId, i, {
countBack: 0
}, !0))
}
for (var n in this._studiesCache[e]) {
var o;
if ((o = this._studiesCache[e][n]) && "study" === o.type) {
this._studiesNonSeriesTimes[e][n] = null;
var a = this._studiesCache[e][o.parentId];
this._createStudy(a.symbolId, a.resolution, o.studyObject, e, n, o
.turnaround, o.parentId, o.inputs)
}
}
this._applyTimeScaleUpdate(e, this._timeScales[e].clearTimeScale())
}, T.prototype.stopSources = function(e) {
for (var t in this._studiesCache[e]) {
var i = this._studiesCache[e][t];
i && "series" === i.type && this._stopSourcesTree(e, t)
}
}, T.prototype._stopSourcesTree = function(e, t) {
for (var i in this._studiesCache[e]) {
var s = this._studiesCache[e][i];
s && (("series" === s.type && i === t || "study" === s.type && s.parentId ===
t) && (s.engine && s.engine.isStarted() && s.engine.stop(), s
.activeResolve = -1))
}
n.unsubscribeUnused()
}, T.prototype._recreateSourcesForDataRange = function(e, t) {
var i = [];
for (var s in this._studiesCache[e]) {
(r = this._studiesCache[e][s]) && "series" === r.type && !this._isEndOfData(e,
s, r.turnaround) && (this._stopSourcesTree(e, s), i.push(s))
}
for (var s in i.forEach((function(i) {
this._startSourcesTree(e, i, Object.assign({}, t))
}), this), this._studiesCache[e]) {
var r;
"series" === (r = this._studiesCache[e][s]).type && this._isEndOfData(e, s, r
.turnaround) && TradingView.ChartapiMessagerInstances[e]
.onSeriesCompleted(s, r.turnaround, r.engine.runner.host.symbolInfo
.data_status)
}
this._updateTimeScaleState(e)
}, T.prototype._startSourcesTree = function(e, t, i) {
var s = this._studiesCache[e][t];
for (var r in this.createSeries(e, t, s.turnaround, s.symbolId, s.resolution, i, !
0), this._studiesCache[e]) {
var n = this._studiesCache[e][r];
n && "study" === n.type && n.parentId === t && this._createStudy(s.symbolId, s
.resolution, n.studyObject, e, r, n.turnaround, n.parentId, n.inputs)
}
}, T.prototype.removeStudy = function(e, t) {
this._studiesCache[e] && this._studiesCache[e][t] && this._studiesCache[e][t]
.engine && (this._studiesCache[e][t].engine.stop(), n.unsubscribeUnused()),
delete this._studiesCache[e][t], delete this._studiesNonSeriesTimes[e][t]
}, T.prototype.removeSeries = function(e, t) {
this._stopSourcesTree(e, t), delete this._studiesCache[e][t], this
._updateMainTsBuilder(e), this._timeScales[e].isCompleted() && this._timeScales[
e].setCompleted(!1);
var i = this._timeScales[e].setSeriesBarsTimes(t, []);
this._applyTimeScaleUpdate(e, i), this._updateTimeScaleState(e)
}, T.prototype.modifyStudy = function(e, t, i, s) {
var r = this._studiesCache[e][t];
if (!r) throw Error("This should never happen");
var o = this._studiesCache[e][r.parentId];
r.inputs = s, r.turnaround = i, r.engine && (r.engine.stop(), n
.unsubscribeUnused()), this._studiesNonSeriesTimes[e][t] = null, this
._createStudy(o
.symbolId, o.resolution, r.studyObject, e, t, i, r.parentId, s)
}, T.prototype.createStudy = function(e, t, i, s, r, n) {
var o = this._studiesCache[e][i],
a = this._findStudyObject(r);
if (null === a) return console.warn("Study does not exist: " + r), void TradingView
.ChartapiMessagerInstances[e].onStudyError(t, s, "unknown study name");
var l = new a.constructor;
this._studiesCache[e] = this._studiesCache[e] || {}, this._studiesCache[e][t] = {
studyObject: l,
guid: t,
type: "study",
inputs: n,
metainfo: a.metainfo,
turnaround: s,
parentId: i
}, this._studiesNonSeriesTimes[e][t] = null, this._createStudy(o.symbolId, o
.resolution, l, e, t, s, i, n)
}, T.prototype.sessionTimeScale = function(e) {
return this._timeScales[e] || null
}, T.prototype.isTimeScaleExtendedTo = function(e, t) {
var i = this._mainSeriesRecord(e);
if (u.isDWM(i.resolution) && null != i.symbolInfo) {
var s = h(i.resolution, i.symbolInfo);
null !== s && (t = s.timeToSessionStart(t))
}
var r = this._timeScales[e].indexOfTime(t);
return null !== r && r.index >= 0
}, T.prototype.ensureExtendedTo = function(e, t, i) {
if (!this._studiesCache[t][e]) throw Error("This should never happen");
var s = this;
setTimeout((function() {
s._recreateSourcesForDataRange(t, {
to: i
})
}), 0)
}, T.prototype.extendSeriesRange = function(e, t) {
var i = this._timeScales[e].firstSeriesBarTime();
if (null !== i) {
var s = this._mainSeriesRecord(e);
if (u.isDWM(s.resolution) && null != s.symbolInfo) {
var r = h(s.resolution, s.symbolInfo);
null !== r && (i = r.timeToExchangeTradingDay(i))
}
var n = this._symbolIdToSymbolRequestString.get(x(e, s.symbolId)),
o = this._barsCoefficients(n, s.resolution),
a = o.barsCoefficient || 1;
if (!o.barsCoefficient) {
var l = this._getSeriesData(e, s.guid);
null !== l && (o.expectedBarsCount = l.length + t)
}
var c = this;
setTimeout((function() {
c._recreateSourcesForDataRange(e, {
to: i,
countBack: (t + 2) * a
})
}), 0)
} else this._logMessage("Nothing to extend - there is no points on time scale")
}, T.prototype.seriesTurnaround = function(e, t) {
return this._studiesCache[e] && this._studiesCache[e][t] && this._studiesCache[e][t]
.turnaround
}, T.prototype._seriesDataRange = function(e, t) {
var i = this._studiesCache[e][t];
return null !== i.firstLoadedTimeMs ? {
to: i.firstLoadedTimeMs,
countBack: 0
} : i.dataRange
}, T.prototype._applyTimeScaleUpdate = function(e, t) {
if (null !== t) {
var i = [];
for (var s in this._studiesCache[e]) {
var r = this._studiesCache[e][s];
if (r && "study" === r.type) {
var n = this._studiesNonSeriesTimes[e][s];
if (n) {
var o = {
indexes: this._timeScales[e].convertTimesToIndexes(n),
data: {
indexes_replace: !0
}
};
i.push({
objId: s,
turnaround: r.turnaround,
data: [],
nonSeriesData: o
})
}
}
}
TradingView.ChartapiMessagerInstances[e].onTimescaleUpdate(t, i), Promise
.resolve().then(function() {
var t = this._mainSeriesRecord(e);
if (null !== t && null != t.symbolInfo) {
var i = this._getSymbolExtrapolator(e, t.symbolInfo, t
.resolution);
this._pointsetsManagers[e].getUpdatesForSymbol(t.symbolInfo
.full_name, t.resolution, i, this._timeScales[e])
.forEach((function(t, i) {
TradingView.ChartapiMessagerInstances[e]
.onPointsetDataUpdate(i, null, t)
}))
}
}.bind(this))
}
}, T.prototype._updateMainTsBuilder = function(e) {
var t = this._mainSeriesRecord(e);
if (null !== t && null != t.symbolInfo) {
var i = this._getSymbolExtrapolator(e, t.symbolInfo, t.resolution);
this._timeScales[e].setMainSymbolExtrapolator(i)
}
}, T.prototype._updateTimeScaleState = function(e) {
var t = !0,
i = !0;
for (var s in this._studiesCache[e]) {
var r = this._studiesCache[e][s];
"series" === r.type && (i = i && this._isEndOfData(e, s, r.turnaround), t = t &&
r.completed)
}
this._timeScales[e].isCompleted() !== t && (this._timeScales[e].setCompleted(t),
t && TradingView.ChartapiMessagerInstances[e].onTimescaleCompleted(i))
}, T.prototype._mainSeriesRecord = function(e) {
var t = null,
i = null;
for (var s in this._studiesCache[e]) {
var r = this._studiesCache[e][s];
if ("series" === r.type && (null === t && (t = r), r.isMain)) {
i = r;
break
}
}
return null === i && (i = t), null !== i && (i.isMain = !0), i
}, T.prototype._seriesCount = function(e) {
var t = 0;
for (var i in this._studiesCache[e]) {
"series" === this._studiesCache[e][i].type && (t += 1)
}
return t
}, T.prototype._prepareSeriesNonSeriesData = function(e, t, i) {
var s = i.data[i.data.length - 1],
r = this._getSeriesData(e, t),
n = null === r ? [] : i.data;
return {
data: {
data: {
reversalAmount: i.reversalAmount,
boxSize: i.boxSize,
price: s ? s[4] : i.price,
bars: n.map((function(e, t) {
return {
time: t,
open: e[1],
high: e[2],
low: e[3],
close: e[4],
volume: e[5],
factor: e[6],
additionalPrice: e[6]
}
}))
}
},
indexes: this._timeScales[e].convertTimesToIndexes(n.map((function(e) {
var t = e[0] || 0;
return t < 0 ? r[r.length + t].timeMs : i.projectionTime + t
})))
}
}, T.prototype.createSeries = function(e, t, i, s, n, o, a) {
this._setEndOfData(e, t, i, !1);
var l = new r.OHLCV;
this._studiesCache[e] = this._studiesCache[e] || {};
var c = this._getSeriesData(e, t),
h = this._studiesCache[e][t],
d = this._seriesCount(e),
p = this._mainSeriesRecord(e);
if (!h || u.isEqual(h.resolution, n) && h.symbolId === s) void 0 !== o.countBack &&
null !== c && 0 !== c.length && (o.to = c[0].timeMs), h && null != h
.firstLoadedTimeMs ? o.to = void 0 !== o.to ? Math.min(h.firstLoadedTimeMs, o
.to) : h.firstLoadedTimeMs : h || 0 === d || null !== p && (null != p
.firstLoadedTimeMs ? (o.to = p.firstLoadedTimeMs, o.countBack = 0) : o =
Object.assign({}, p.dataRange));
else if (1 === d) void 0 !== o.countBack && null !== c && (o.countBack += c.length);
else {
var _ = this._timeScales[e].firstSeriesBarTime();
(void 0 === o.to || null !== _ && _ < o.to) && (o.to = _, o.countBack = 0)
}
if (void 0 === o.countBack && (o.countBack = 0), void 0 === o.to && 0 === o
.countBack && (o.countBack = 100), this._studiesCache[e][t] = {
symbolId: s,
resolution: n,
studyObject: l,
guid: t,
type: "series",
turnaround: i,
dataRange: o,
firstLoadedTimeMs: null,
symbolInfo: null,
isMain: h && h.isMain || 0 === d,
completed: !1
}, null === p || p.guid === t || !p.error) {
this._updateMainTsBuilder(e), this._updateTimeScaleState(e), TradingView
.ChartapiMessagerInstances[e].onSeriesLoading(t, i);
var m = this;
this._computeStudy(e, l, s, n, t, [], o, I(e, t), (function() {
return -1 / 0
}), {
onDataReadyCallback: function(r, o, l, c) {
var h = m._studiesCache[e][t];
if (!h) throw Error("This should never happen");
if (h.symbolInfo = l, h.firstLoadedTimeMs = c
.firstLoadedTimeMs, h.completed = !0, m
._updateMainTsBuilder(e), a && m._pointsetsManagers[e]
.invalidatePointsetsForSymbol(l.full_name, n), 0 !== r
.length) {
var u = m._symbolIdToSymbolRequestString.get(x(e, s)),
d = m._barsCoefficients(u, n);
d.expectedBarsCount && d.barsCount && (d
.barsCoefficient = Math.min(Math.max(d
.barsCoefficient || 1, parseInt(d
.expectedBarsCount / (r.length - d
.barsCount) + .5)), 100)), d
.barsCount = r.length, m._clearSeriesData(e, t)
} else !c.endOfData && h.isMain && setTimeout((function() {
m._studiesCache[e] && m
._recreateSourcesForDataRange(e, {
countBack: 10
})
}), 0);
f(l), c.endOfData && (m._logMessage(
"Series has no more data on server: {0}".format(
l.full_name)), m._setEndOfData(e, t, i)), 0 ===
r.length && m._clearSeriesData(e, t), TradingView
.ChartapiMessagerInstances[e].onSeriesCompleted(t, i, l
.data_status), m._updateTimeScaleState(e)
},
onRealtimeCallback: function(s, r, n, o, a) {
f(a, s), m._timeScales[e].fillIndexesInRows(s);
var l = s[s.length - 1];
if (r) {
if (!m._studiesCache[e][t]) throw Error(
"This should never happen");
m._logMessage("New bar arrived: symbol {0}, bar {1}"
.format(a.full_name, JSON.stringify(l)))
} else m._logMessage("Last bar update: symbol {0}, bar {1}"
.format(a.full_name, JSON.stringify(l))),
TradingView.ChartapiMessagerInstances[e].onDataUpdate(t,
i, s, null);
m._fireEvent("realtime_tick", s[s.length - 1], !0)
},
onSymbolErrorCallback: function(t) {
m._logMessage("Series symbol resolve error"), TradingView
.ChartapiMessagerInstances[e].onSymbolError(s, t ||
"resolve error"), g(t || "resolve error")
},
onErrorCallback: function(e) {
m._logMessage("Series error: " + e), g(e)
},
onNonSeriesDataUpdate: function(s, r) {
if ("projection" !== s.type) throw new Error(
"unexpected non-series data type for series " +
s.type);
var n = m._getSeriesData(e, t);
if (null !== n) f(r, 0 === n.length ? void 0 : [n[n.length -
1]], s);
else {
s = m._prepareSeriesNonSeriesData(e, t, s);
TradingView.ChartapiMessagerInstances[e].onDataUpdate(t,
i, [], s)
}
}
})
}
function f(s, r, o) {
var a = [];
if (void 0 !== o) {
var l = (o.data || []).reduce((function(e, t) {
return Math.max(e, t[0] || 0)
}), -1);
if (null != o.projectionTime)
for (var c = 0; c <= l; ++c) a.push(o.projectionTime + c)
}
var h = null,
u = null,
d = s ? m._getSymbolExtrapolator(e, s, n) : null;
if (void 0 !== r) {
var p = r.map((function(e) {
return e.timeMs
})).concat(a);
null !== d && d.replaceBarsTimesTail(p, r.length), u = m._timeScales[e]
.replaceSeriesBarsTimesTail(t, p), h = r
} else {
var _ = m._getSeriesData(e, t) || [],
f = _.map((function(e) {
return e.timeMs
})).concat(a);
null !== d && d.setBarsTimes(f, _.length), u = m._timeScales[e]
.setSeriesBarsTimes(t, f), h = _
}
if (m._applyTimeScaleUpdate(e, u), 0 !== h.length || void 0 !== o) {
m._timeScales[e].fillIndexesInRows(h);
var g = void 0 !== o ? m._prepareSeriesNonSeriesData(e, t, o) : null;
TradingView.ChartapiMessagerInstances[e].onDataUpdate(t, i, h, g)
}
}
function g(s) {
var r = m._studiesCache[e][t];
r.completed = !0, TradingView.ChartapiMessagerInstances[e].onSeriesError(t, i,
s), P.enabled("clear_bars_on_series_error") && (r.isMain ? m
.onSessionSeriesError(e) : m._clearSeriesData(e, t))
}
}, T.prototype._clearSeriesData = function(e, t) {
var i = {};
for (var s in i[t] = {
turnaround: this._studiesCache[e][t].turnaround
}, this._studiesCache[e]) {
var r = this._studiesCache[e][s];
"study" === r.type && r.parentId === t && (i[s] = {
turnaround: r.turnaround
})
}
TradingView.ChartapiMessagerInstances[e].onClearData(i)
}, T.prototype.requestMoreTickmarks = function(e, t) {
var i = this._timeScales[e];
i.setMinFutureBarsCount(i.minFutureBarsCount() + t);
var s = i.firstFutureBarIndex(),
r = i.tickMarks(s);
TradingView.ChartapiMessagerInstances[e].onTickmarksUpdated(s, r)
}, T.prototype.chartCreateSession = function(e) {
this._pointsetsManagers[e] = new l, this._timeScales[e] = new a, this
._studiesNonSeriesTimes[e] = {}
}, T.prototype.chartDeleteSession = function(e) {
this._pointsetsManagers[e].destroy(), delete this._pointsetsManagers[e], this
._timeScales[e].destroy(), delete this._timeScales[e], delete this
._studiesNonSeriesTimes[e]
}, T.prototype.removePointset = function(e, t) {
this._pointsetsManagers[e].removePointset(t)
}, T.prototype.createPointset = async function(e, t, i, s, r) {
var n, o = this._resolvePromisesBySymbolId.get(x(e, i));
try {
n = (await o).symbolInfo
} catch (e) {
return
}
var a = this._getSymbolExtrapolator(e, n, s);
if (this._pointsetsManagers[e].createPointset(t, n.full_name, s, r, a), null ===
this._refreshPointsetsTimerId) {
var l = this;
this._refreshPointsetsTimerId = setTimeout((function() {
l._refreshPointsetsTimerId = null, l._refreshPointsets(l
._invalidatedPointsetSessions), l
._invalidatedPointsetSessions.clear()
}), 0)
}
this._invalidatedPointsetSessions.add(e)
}, T.prototype._refreshPointsets = function(e) {
var t = this;
e.forEach((function(e) {
var i = t._studiesCache[e];
if (null != i) {
var s = null;
for (var r in i) {
var n = i[r];
if ("series" === n.type) {
s = n;
break
}
}
if (null !== s && null != s.symbolInfo) {
var o = t._getSymbolExtrapolator(e, s.symbolInfo, s
.resolution);
t._pointsetsManagers[e].getUpdatesForSymbol(s.symbolInfo
.full_name, s.resolution, o, t._timeScales[e])
.forEach((function(t, i) {
TradingView.ChartapiMessagerInstances[e]
.onPointsetDataUpdate(i, null, t)
}))
}
}
}))
}, T.prototype.studiesMetadata = function() {
return 0 === this._metainfoCache.length && (this._metainfoCache = JSServer
.studyLibrary.map((function(e) {
return e.metainfo
})), this._metainfoCache.push({
palettes: {},
inputs: [],
plots: [{
id: "open",
type: "line"
}, {
id: "high",
type: "line"
}, {
id: "low",
type: "line"
}, {
id: "close",
type: "line"
}, {
id: "volume",
type: "line"
}],
graphics: {},
_metainfoVersion: 48,
description: "Unnamed Study",
format: {
type: "inherit"
},
is_hidden_study: !0,
is_price_study: !1,
shortDescription: "Unnamed Study",
description_localized: "Unnamed Study",
id: "BarSetHeikenAshi@tv-prostudies",
shortId: "BarSetHeikenAshi",
packageId: "tv-basicstudies",
version: "13",
fullId: "BarSetHeikenAshi@tv-basicstudies-13",
productId: "tv-basicstudies",
name: "BarSetHeikenAshi@tv-basicstudies"
})), this._metainfoCache
}, T.prototype.searchSymbols = function(e, t, i, s) {
this._logMessage(
"Symbol search requested: search string `{0}`, exchange: `{1}`, type `{2}`"
.format(e, t, i));
var r = this;
this._externalDatafeed.searchSymbols(e, t, i, (function(e) {
r._logMessage("Symbol search response: {0}".format(JSON
.stringify(e))), s(e)
}))
}, T.prototype.resolveSymbol = function(e, t, i) {
var s = this;
this._symbolIdToSymbolRequestString.set(x(e, t), i), this
._resolvePromisesBySymbolId.set(x(e, t), new Promise((function(r, n) {
s._resolveSymbolImpl(i, (function(s) {
TradingView.ChartapiMessagerInstances[e]
.onSymbolResolved(t, s), r({
symbolInfo: s,
requestedSymbol: i
})
}), (function(i) {
TradingView.ChartapiMessagerInstances[e]
.onSymbolError(t, i), n(i)
}))
})))
}, T.prototype._resolveSymbolImpl = function(e, t, i) {
v(e) || console.error(
"Expect to get symbol encoded string, but got the following instead: " +
e);
var s = S(e),
r = "string" == typeof s.symbol ? s : s.symbol,
n = r.symbol,
o = r["currency-id"],
a = r["unit-id"];
this._resolveSymbolByName(n, {
currency: o,
unit: a
}, t, i)
}, T.prototype._resolveSymbolByName = function(e, t, i, s) {
var r, n = t && t.currency,
o = t && t.unit,
a = M(e, n, o);
if (this._resolveRequests[a]) r = this._resolveRequests[a];
else {
r = this._resolveSymbolInternal(e, n || void 0, o || void 0), this
._resolveRequests[a] = r;
var l = this;
r.then((function(t) {
l._resolveRequests[M(e, t.currency_id, t.unit_id)] = r, l
._resolveRequests[M(y(t, null), t.currency_id, t
.unit_id)] = r, l._resolveRequests[M(y(t, null), n,
o)] = r
})).catch((function() {}))
}
r.then(i).catch(s)
}, T.prototype._resolveSymbolInternal = function(e, t, i) {
var s = this;
return new Promise(function(r, n) {
this._logMessage("Symbol resolve requested: `{0}` ".format(e));
var o = !0;
this._externalDatafeed.resolveSymbol(e, (function(t) {
o && console.warn(
"`resolveSymbol` should return result asynchronously. Use `setTimeout` with 0 interval to execute the callback function."
), s._logMessage(
"Symbol resolved: `{0}`, SymbolInfo in server response {1}"
.format(e, JSON.stringify(t))),
function(e) {
if (e.base_name || (e.base_name = [e.name]),
e.legs || (e.legs = [e.name]), e
.exchange || (e.exchange = e[
"exchange-listed"]), e.full_name ||
(e.full_name = e.symbol || (e.exchange ?
e.exchange + ":" + e.name : e
.name)), e.pro_name || (e.pro_name =
e.full_name), e.data_status || (e
.data_status = "streaming"), e
.ticker || (e.ticker = e.symbol || e
.name), !e.session && e[
"session-regular"] && (e.session =
e["session-regular"]), !e.minmov &&
e.minmovement && (e.minmov = e
.minmovement), e.currency_code && (e
.currency_id = e.currency_code), e
.original_currency_code && (e
.original_currency_id = e
.original_currency_code), e
.holidays && (e.session_holidays = e
.holidays), e.supported_resolutions)
for (var t = 0; t < e
.supported_resolutions.length; t++
) {
var i = u.parse(e
.supported_resolutions[t]);
i.isValid() && (e
.supported_resolutions[t] =
i.value())
}
}(t),
function(e) {
function t(e) {
console.warn("SymbolInfo validation: " +
e)
}
if (e.has_empty_bars && !g() && t(
'both has_empty_bars field and featureset "disable_resolution_rebuild" are enabled and may cause data issues (see #3329)'
), (void 0 === e.minmov || e
.minmov <= 0) && t(
"minmov must be positive"), (
void 0 === e.pricescale || e
.pricescale <= 0) && t(
"pricescale must be positive"),
void 0 !== e.name && 0 !== e.name
.length || t(
"name must be non-empty string"),
void 0 !== e.session && 0 !== e.session
.length || t(
"session must be non-empty string"),
void 0 !== e.holidays && t(
"field holidays is deprecated, use session_holidays instead"
), void 0 === e.timezone || 0 === e
.timezone.length ? t(
"timezone must be non-empty string"
) : "exchange" !== e.timezone && f(e
.timezone) || "UTC" !== e
.timezone && t(
'unsupported timezone "{0}"'.format(
e.timezone)), void 0 !== e
.intraday_multipliers) {
var i = e.intraday_multipliers;
if (Array.isArray(i))
for (var s = 0; s < i.length; ++s)
"string" != typeof i[s] && t(
'intraday_multipliers[{0}] = "{1}" must be string (now: {2})'
.format(s + 1, i[s],
typeof i[s]));
else t(
"intraday_multipliers must be array"
)
}(e.supported_resolutions || []).filter((
function(e) {
return !u.isValid(e)
})).forEach((function(e) {
t("supported_resolutions field contains invalid value: " +
e)
}))
}(t), s._logMessage(
"Symbol info after post-processing: `{0}`, SymbolInfo {1}"
.format(e, JSON.stringify(t))), r(t)
}), (function(t) {
s._logMessage(
"Symbol resolve failed: `{0}`, reason: `{1}`"
.format(e, t)), n(t)
}), {
currencyCode: t,
unitId: i
}), o = !1
}.bind(this))
}, T.prototype._createMarketStatusWatchers = function(e, t) {
void 0 === this._marketStatusWatchers[e] && (this._marketStatusWatchers[
e] = {});
var i = this;
t.forEach((function(t) {
void 0 === i._marketStatusWatchers[e][t] && (i
._marketStatusWatchers[e][t] = new s(i
._resolveSymbolByName.bind(i), e, t))
}))
}, T.prototype._removeMarketStatusWatchers = function(e) {
var t = this;
Object.keys(this._marketStatusWatchers[e] || {}).forEach((function(i) {
t._marketStatusWatchers[e][i].stop()
})), this._marketStatusWatchers[e] = {}
},
T.prototype._stopQuotesSubscription = function(e) {
this._quotesInfo[e].listenerGUID && (this._externalDatafeed.unsubscribeQuotes(
this._quotesInfo[e].listenerGUID), this._quotesInfo[e]
.listenerGUID = void 0), this._removeMarketStatusWatchers(e)
}, T.prototype._startQuotesSubscription = function(e) {
var t = {},
i = this;
function s(t, s) {
var r = i._marketStatusWatchers[e][t.n];
t.symbolname = t.n, t.status = t.s, t.values = t.v, t.values.change = t.v
.ch, t.values.last_price = t.v.lp, t.values.change_percent = t.v.chp, t
.values.current_session = t.v.cs || r && r.marketStatus(), t.values
.pricescale = s.pricescale, t.values.minmov = s.minmov, t.values
.minmove2 = s.minmove2 || 0, t.values.fractional = s.fractional || !1,
r && t.v.cs && r.stop(), TradingView.ChartapiMessagerInstances[e]
.onQuotesData([e].concat([t]))
}
function r(e) {
e.forEach((function(e) {
void 0 !== t[e.n] ? null !== t[e.n] && s(e, t[e.n]) : i
._resolveSymbolByName(e.n, null, (function(i) {
t[e.n] = i, s(e, i)
}), (function() {
t[e.n] = null
}))
}))
}
var n = this._quotesInfo[e].symbols;
0 !== n.length && (this._externalDatafeed.getQuotes && !P.enabled(
"charting_library") ? this._externalDatafeed.getQuotes(n, (function(
t) {
i._quotesInfo[e] && (r(t), i._quotesInfo[e].listenerGUID =
e, i._externalDatafeed.subscribeQuotes(n, i
._quotesInfo[e].fastSymbols, r, i._quotesInfo[e]
.listenerGUID))
}), (function(e) {})) : !this._externalDatafeed.getQuotes && P.enabled(
"trading_terminal") && setTimeout((function() {
r(n.map((function(e) {
return {
n: e,
s: "ok",
v: {}
}
})))
})), this._createMarketStatusWatchers(e, n))
}, T.prototype._restartQuotesSubscription = function(e) {
this._stopQuotesSubscription(e), this._startQuotesSubscription(e)
}, T.prototype.quoteCreateSession = function(e) {
this._quotesInfo[e] = {
symbols: [],
fastSymbols: [],
listenerGUID: void 0
}
}, T.prototype.quoteDeleteSession = function(e) {
this._stopQuotesSubscription(e), this._quotesInfo[e] = null
}, T.prototype.quoteSetFields = function(e, t) {}, T.prototype.quoteAddSymbols =
function(e, t) {
this._quotesInfo[e].symbols = this._filteredSymbols(this._quotesInfo[e].symbols
.concat(t)), this._restartQuotesSubscription(e)
}, T.prototype.quoteRemoveSymbols = function(e, t) {
this._quotesInfo[e].symbols = this._quotesInfo[e].symbols.filter((function(e) {
return t.indexOf(e) < 0
})), this._restartQuotesSubscription(e)
}, T.prototype.quoteFastSymbols = function(e, t) {
this._quotesInfo[e].fastSymbols = this._filteredSymbols(t), this
._restartQuotesSubscription(e)
}, T.prototype.quoteHibernateAll = function(e) {}, T.prototype
._stopDepthSubscription = function(e) {
this._depthInfo[e].listenerGUID && (this._externalDatafeed.unsubscribeDepth(this
._depthInfo[e].listenerGUID), this._depthInfo[e].listenerGUID =
void 0)
}, T.prototype._startDepthSubscription = function(e) {
var t = this,
i = this._depthInfo[e].symbol;
function s(e) {
return e.map((function(e) {
return {
p: e.price,
v: e.volume
}
}))
}
function r(e) {
var t = {};
return t.s = i, t.bids = s(e.bids), t.asks = s(e.asks), t
}
i && this._externalDatafeed.subscribeDepth && (t._depthInfo[e].listenerGUID =
this._externalDatafeed.subscribeDepth(i, (function(i) {
var s;
t._depthInfo[e] && ((s = i).snapshot ? TradingView
.ChartapiMessagerInstances[e].onDepthData([e]
.concat([r(s)])) : TradingView
.ChartapiMessagerInstances[e].onDepthUpdate([e]
.concat([r(s)])))
})))
}, T.prototype._restartDepthSubscription = function(e) {
this._stopDepthSubscription(e), this._startDepthSubscription(e)
}, T.prototype.depthCreateSession = function(e) {
this._depthInfo[e] = {
symbol: null,
listenerGUID: void 0
}
}, T.prototype.depthDeleteSession = function(e) {
this._depthInfo[e].symbol = null, this._stopDepthSubscription(e), delete this
._depthInfo[e]
}, T.prototype.depthSetSymbol = function(e, t) {
this._depthInfo[e].symbol = t, this._restartDepthSubscription(e)
}, T.prototype._filteredSymbols = function(e) {
var t = [];
return e.forEach((function(e) {
e instanceof Object || t.indexOf(e) < 0 && t.push(e)
})), t
}, T.prototype._isEndOfData = function(e, t, i) {
var s = e + "!" + t + "@" + i;
return !!this._endOfData[s]
}, T.prototype._setEndOfData = function(e, t, i, s) {
var r = e + "!" + t + "@" + i;
this._endOfData[r] = !1 !== s
}, T.prototype.serverTimeOffset = function() {
return this._serverTimeOffset
}, T.prototype.serverTime = function() {
return 1e3 * this.getCurrentUTCTime()
}, T.prototype.getCurrentUTCTime = function() {
return (new Date).valueOf() / 1e3 + this._serverTimeOffset
}, T.prototype.switchTimezone = function(e, t) {
this._timeScales[e].setTimezone(t);
var i = this._timeScales[e].tickMarks();
null !== i && TradingView.ChartapiMessagerInstances[e].onTickmarksUpdated(0, i)
}, e.exports = T
},
EX27: function(e, t, i) {
"use strict";
var s = i("Eyy1").ensureNotNull,
r = i("IiTo"),
n = i("LxhU").Interval,
o = i("EJcV"),
a = i("MrEN"),
l = i("XzZr"),
c = l.ChartApiInterface,
h = l.HandlerInfo,
u = i("ogJP").requireFullInterfaceImplementation,
d = i("txPx").getLogger("Chart.ChartApiLocal"),
p = i("uDHo").TIMEFRAMETYPE,
_ = i("OLhd").createDwmAligner;
TradingView.STUDY_COUNT_LIMIT = 210, JSServer.ChartApi = function(e) {
this._notificationHandlers = {}, this._sessions = {}, this.studyCounter = 0, this
._connected = !1, this._enabled = !1, this._studyEngine = new o(e), this
._callbacks = {}, this._serverTimeOffset = 0;
var t = this;
this._studyEngine.on("configuration_received", (function() {
t._fireEvent("configuration_received")
})), this._studyEngine.on("realtime_tick", (function(e) {
var i = {
time: e.value[0] / 1e3,
open: e.value[1],
high: e.value[2],
low: e.value[3],
close: e.value[4],
volume: e.value[5]
};
t._fireEvent("realtime_tick", i, !0)
})), this._setVisibleRangeTimeout = {}
}, JSServer.ChartApi.prototype.destroy = function() {
this._studyEngine.destroy(), this._studyEngine = null
}, JSServer.ChartApi.prototype.purgeCache = function(e) {
this._studyEngine.purgeCache(), this._studyEngine.purgeDataCache()
}, JSServer.ChartApi.prototype.defaultWatchlistSymbols = function() {
return this._watchlistSettings.default_symbols
}, JSServer.ChartApi.prototype.defaultResolutions = function() {
return this._studyEngine.supportedResolutions() || ["1", "3", "5", "15", "30", "45",
"60", "120", "180", "240", "1D", "1W", "1M"
]
}, JSServer.ChartApi.prototype.availableCurrencies = function() {
var e = this._studyEngine.supportedCurrencies().map((function(e) {
return {
id: e,
code: e,
convertible: !0
}
}));
return Promise.resolve(e)
}, JSServer.ChartApi.prototype.availableUnits = function() {
return Promise.resolve(this._studyEngine.supportedUnits())
}, JSServer.ChartApi.prototype.supportedSymbolsTypes = function() {
return this._studyEngine.supportedSymbolsTypes()
}, JSServer.ChartApi.prototype.supportedExchangesList = function() {
return this._studyEngine.supportedExchangesList()
}, JSServer.ChartApi.prototype.symbolsGrouping = function() {
return this._studyEngine.symbolsGrouping()
}, JSServer.ChartApi.prototype.start = function() {
this._enabled = !0, this._fireEvent("start_enabled")
}, JSServer.ChartApi.prototype.unsubscribe = function(e, t) {
var i = this._callbacks[e];
i && i.splice(i.indexOf(t), 1)
}, JSServer.ChartApi.prototype.on = function(e, t) {
return this._callbacks.hasOwnProperty(e) || (this._callbacks[e] = []), this._callbacks[
e].push(t), this
}, JSServer.ChartApi.prototype._fireEvent = function(e, t, i) {
if (this._callbacks.hasOwnProperty(e)) {
var s = this._callbacks[e].slice(0);
i || (this._callbacks[e] = []);
for (var r = 0; r < s.length; ++r) s[r](t)
}
}, JSServer.ChartApi.prototype.chartCreateSession = function(e, t) {
this._studyEngine.chartCreateSession(e)
}, JSServer.ChartApi.prototype.chartDeleteSession = function(e) {
this._studyEngine.chartDeleteSession(e)
}, JSServer.ChartApi.prototype.createSession = function(e, t) {
TradingView.ChartapiMessagerInstances[e] = new a(this, e), this._sessions[e] = t, this
._notificationHandlers[e] = {}, this.connected() && t.onMessage({
method: "connected",
params: []
})
}, JSServer.ChartApi.prototype.removeSession = function(e) {
delete this._sessions[e], delete this._notificationHandlers[e], this._studyEngine
.stopSources(e)
}, JSServer.ChartApi.prototype.connected = function() {
return this._connected
}, JSServer.ChartApi.prototype.connect = function() {
if (this._enabled) this.connected() || (this._connected = !0, this.sessionid =
"dummy session id", this._notifySessions({
method: "connected",
params: []
}));
else {
var e = this;
this.on("start_enabled", (function() {
e.connect()
}))
}
}, JSServer.ChartApi.prototype.disconnect = function() {
this._connected = !1, this._notifySessions({
method: "disconnected",
params: []
}), this.purgeCache(), this.studyCounter = 0
}, JSServer.ChartApi.prototype.switchTimezone = function(e, t) {
this._studyEngine.switchTimezone(e, t)
}, JSServer.ChartApi.prototype.receiveLocalResponse = function(e) {
this._dispathNotification(e), this._fireEvent("message_" + e.method, void 0, !0)
}, JSServer.ChartApi.prototype.getMarks = function(e, t, i, s, r) {
this._studyEngine.getMarks(e, t, i, s, r)
}, JSServer.ChartApi.prototype.getTimescaleMarks = function(e, t, i, s, r) {
this._studyEngine.getTimescaleMarks(e, t, i, s, r)
}, JSServer.ChartApi.prototype.resolveSymbol = function(e, t, i, s, r) {
this._notificationHandlers[e][t] = new h(s, t), this._studyEngine.resolveSymbol(e, t, i)
}, JSServer.ChartApi.prototype._doWhenSeriesDataReceived = function(e, t) {
TradingView.ChartapiMessagerInstances[e].seriesCompleted.subscribe(null, t, !0)
}, JSServer.ChartApi.prototype.createSeries = function(e, t, i, s, r, n, o, a) {
var l = this;
this._notificationHandlers[e][t] = new h((function(r) {
"series_completed" === r.method && null !== o && (l._applyTimeFrame(e,
s, t, i, o), o = null), a(r)
}), t), this._studyEngine.createSeries(e, t, i, s, r, {
countBack: n || 300
})
}, JSServer.ChartApi.prototype.removeSeries = function(e, t) {
delete this._notificationHandlers[e][t], this._studyEngine.removeSeries(e, t)
}, JSServer.ChartApi.prototype.setVisibleTimeRange = function(e, t, i, r, n, o, a, l) {
var c = r,
h = !0 !== (a = a || {}).applyDefaultRightMargin && void 0 === a
.percentRightMargin && void 0 !== n ? n : null,
u = _(this._studyEngine.getSeriesInterval(e, t), this._studyEngine
.getSeriesSymbolInfo(e, t));
null !== u && (c = u.timeToSessionStart(1e3 * c) / 1e3, null !== h && (h = u
.timeToSessionStart(1e3 * h) / 1e3));
var d = this;
function p() {
var r = d._studyEngine.sessionTimeScale(e);
if (null !== r) {
var n, u = r.indexOfTime(1e3 * c);
if (null === h) n = r.lastSessionBarIndex();
else {
var p = r.indexOfTime(1e3 * h);
n = p && p.index
}
if (null !== u && null !== n) {
var _ = u.index;
if (u.timeMs < 1e3 * c && (_ += 1), !1 === o) {
const e = s(r.firstSessionBarIndex());
_ < e && (_ = e)
}
_ > n || (TradingView.ChartapiMessagerInstances[e].onSeriesTimeframeUpdate(
t, i, _, n, a), l && setTimeout(l, 0))
}
}
}
if (this._studyEngine.isTimeScaleExtendedTo(e, 1e3 * r)) p();
else {
var m = TradingView.ChartapiMessagerInstances[e].seriesCompleted,
f = TradingView.ChartapiMessagerInstances[e].seriesError;
void 0 !== this._setVisibleRangeTimeout[e] && clearTimeout(this
._setVisibleRangeTimeout[e]), this._setVisibleRangeTimeout[e] = setTimeout(
function() {
delete this._setVisibleRangeTimeout[e], m.subscribe(null, g, !0), f
.subscribe(null, b, !0), this._studyEngine.ensureExtendedTo(t, e,
1e3 * r)
}.bind(this), 0)
}
function g(e, s) {
e === t && s === i && (m.unsubscribe(null, g), f.unsubscribe(null, b), p())
}
function b(e, s) {
e === t && s === i && m.unsubscribe(null, g)
}
}, JSServer.ChartApi.prototype._applyTimeFrame = function(e, t, i, s, o) {
var a, l, c = {},
h = !0;
if (o.type === p.PeriodBack) {
var u = this._studyEngine.getSeriesLastBarTime(e, i);
if (null === u) return;
l = u / 1e3;
var d = n.parse(o.value),
m = this._studyEngine.getSeriesSymbolInfo(e, i);
a = r.alignPeriodsBackForVisibleRange(m.session, m.session_holidays, m.corrections,
d.letter(), d.multiplier(), 1, u) / 1e3;
var f = _(this._studyEngine.getSeriesInterval(e, i), m);
null !== f && (l = f.timeToExchangeTradingDay(1e3 * l) / 1e3, a = f
.timeToExchangeTradingDay(1e3 * a) / 1e3), c = {
applyDefaultRightMargin: !0
}, h = !1
} else a = o.from, l = o.to;
this.setVisibleTimeRange(e, i, s, a, l, h, c)
}, JSServer.ChartApi.prototype.modifySeries = function(e, t, i, s, r, n, o) {
var a = this;
this._notificationHandlers[e][t] = new h((function(r) {
"series_completed" === r.method && null !== n && (a._applyTimeFrame(e,
s, t, i, n), n = null), o(r)
}), t), this._studyEngine.modifySeries(e, t, s, r, i)
}, JSServer.ChartApi.prototype.requestMoreData = function(e, t) {
this._studyEngine.extendSeriesRange(e, t)
}, JSServer.ChartApi.prototype.setStudiesAccessController = function(e) {
this.studiesAccessController = e
}, JSServer.ChartApi.prototype.setWatchlistSettings = function(e) {
this._watchlistSettings = e
}, JSServer.ChartApi.prototype.allStudiesMetadata = function() {
return this._studyEngine.studiesMetadata()
}, JSServer.ChartApi.prototype.requestMetadata = function(e, t, i) {
this._notificationHandlers[e][t] = new h(i, t);
var s = this.studiesAccessController.getEnabledTools();
TradingView.ChartapiMessagerInstances[e].onRequestMetadata(t, s)
}, JSServer.ChartApi.prototype.isCanCreateStudy = function() {
return this.studyCounter < TradingView.STUDY_COUNT_LIMIT
},
JSServer.ChartApi.prototype.createStudy = function(e, t, i, s, r, n, o) {
if (!this.isCanCreateStudy()) throw new Error("Exceeded the limit of studies");
this._notificationHandlers[e][t] = new h(o, t), this._studyEngine.createStudy(e, t, s,
i, r, n), this.studyCounter++
}, JSServer.ChartApi.prototype.rebindStudy = function(e, t, i, s, r, n, o, a) {
throw new Error("Not implemented")
}, JSServer.ChartApi.prototype.removeStudy = function(e, t, i) {
delete this._notificationHandlers[e][t], this._studyEngine.removeStudy(e, t), this
.studyCounter--
}, JSServer.ChartApi.prototype.modifyStudy = function(e, t, i, s, r) {
this._notificationHandlers[e][t] = new h(r, t), this._studyEngine.modifyStudy(e, t, i,
s)
}, JSServer.ChartApi.prototype.createPointset = function(e, t, i, s, r, n, o) {
this._notificationHandlers[e][t] = new h(o, t), this._studyEngine.createPointset(e, t,
s, r, n)
}, JSServer.ChartApi.prototype.modifyPointset = function(e, t, i, s, r) {
throw Error("This call is not implemented")
}, JSServer.ChartApi.prototype.removePointset = function(e, t, i) {
this._notificationHandlers[e][t] = null, this._studyEngine.removePointset(e, t)
}, JSServer.ChartApi.prototype.requestMoreTickmarks = function(e, t) {
this._studyEngine.requestMoreTickmarks(e, t)
}, JSServer.ChartApi.prototype.requestFirstBarTime = function(e, t, i, s) {
this._notificationHandlers[e][t] = new h(s, t)
}, JSServer.ChartApi.prototype._invokeHandler = function(e, t) {
e && e(t)
}, JSServer.ChartApi.prototype._sendRequest = function(e, t) {
throw Error("This method is not implemented")
}, JSServer.ChartApi.prototype._onMessage = function(e) {
throw Error("This method is not implemented")
}, JSServer.ChartApi.prototype._dispathNotification = function(e) {
var t = e.params.shift();
if (this._notificationHandlers[t]) switch (e.method) {
case "timescale_update":
var i = e.params[0],
s = e.params[1];
for (var r in s.clear = 0 === s.changes.length && 0 === s.marks.length, this
._sessions[t].onMessage({
method: "timescale_update",
params: s
}), i) {
var n = {
method: "data_update",
params: {
customId: r,
plots: i[r].series,
nonseries: i[r].nonseries,
turnaround: i[r].turnaround
}
};
this._invokeNotificationHandler(t, r, n)
}
break;
case "tickmark_update":
this._sessions[t].onMessage({
method: "timescale_update",
params: e.params[0]
});
break;
case "data_update":
for (var r in e.params[0]) {
var o = e.params[0][r];
n = {
method: "data_update",
params: {
customId: r,
plots: o.series ? o.series : o.plots,
nonseries: o.nonseries,
turnaround: o.turnaround
}
};
this._invokeNotificationHandler(t, r, n)
}
break;
case "index_update":
for (var r in e.params[0]) {
n = {
method: "index_update",
params: e.params[0][r]
};
this._invokeNotificationHandler(t, r, n)
}
break;
case "critical_error":
d.logNormal(new Date + " critical_error session:" + this.sessionid +
" reason:" + e.params[0]), this._sessions[t].onMessage({
method: "critical_error",
params: e.params
});
break;
case "timescale_completed":
case "quote_symbol_data":
case "quote_list_fields":
case "depth_symbol_error":
case "depth_symbol_success":
case "dd":
case "dpu":
case "depth_bar_last_value":
this._sessions[t].onMessage({
method: e.method,
params: e.params
});
break;
case "clear_data":
for (var a in e.params[0]) this._invokeNotificationHandler(t, a, {
method: "clear_data",
params: e.params[0][a]
});
break;
default:
var l = e.params[0];
this._invokeNotificationHandler(t, l, e)
}
}, JSServer.ChartApi.prototype._invokeNotificationHandler = function(e, t, i) {
if (void 0 !== t) {
var s = this._notificationHandlers[e][t];
void 0 !== s && s && this._invokeHandler(s.handler, i)
}
}, JSServer.ChartApi.prototype.searchSymbols = function(e, t, i, s, r, n, o, a, l, c) {
this._studyEngine.searchSymbols(e, t, i, c)
}, JSServer.ChartApi.prototype._notifySessions = function(e) {
for (var t in this._sessions) {
if (!this._sessions.hasOwnProperty(t)) return;
var i = this._sessions[t];
"function" == typeof i.onMessage && i.onMessage(e)
}
}, JSServer.ChartApi.prototype.unpack = function(e) {
throw Error("This method is not implemented")
}, JSServer.ChartApi.prototype.quoteCreateSession = function(e) {
return this._studyEngine.quoteCreateSession(e)
}, JSServer.ChartApi.prototype.quoteDeleteSession = function(e) {
return this._studyEngine.quoteDeleteSession(e)
}, JSServer.ChartApi.prototype.quoteSetFields = function(e, t) {
return this._studyEngine.quoteSetFields(e, t)
}, JSServer.ChartApi.prototype.quoteAddSymbols = function(e, t) {
return -1 !== t.indexOf(void 0) && (console.warn("Got undefined in quoteAddSymbols"),
t = t.filter((function(e) {
return !!e
}))), this._studyEngine.quoteAddSymbols(e, t)
}, JSServer.ChartApi.prototype.quoteRemoveSymbols = function(e, t) {
return this._studyEngine.quoteRemoveSymbols(e, t)
}, JSServer.ChartApi.prototype.quoteFastSymbols = function(e, t) {
return this._studyEngine.quoteFastSymbols(e, t)
}, JSServer.ChartApi.prototype.quoteHibernateAll = function(e) {
return this._studyEngine.quoteHibernateAll(e)
}, JSServer.ChartApi.prototype.depthCreateSession = function(e) {
return this._studyEngine.depthCreateSession(e)
}, JSServer.ChartApi.prototype.depthDeleteSession = function(e) {
return this._studyEngine.depthDeleteSession(e)
}, JSServer.ChartApi.prototype.depthSetSymbol = function(e, t) {
return this._studyEngine.depthSetSymbol(e, t)
}, JSServer.ChartApi.prototype.depthClearSymbol = function(e) {}, JSServer.ChartApi
.prototype.depthSetScale = function(e, t) {}, JSServer.ChartApi.prototype
.createStudiesAccessController = function(e, t, i) {
return new this.StudiesAccessController(this._studyEngine, e && JSON.parse(e) || {
type: "black",
tools: []
})
}, JSServer.ChartApi.prototype.StudiesAccessController = function(e, t) {
this._studyEngine = e, this._studiesAccess = t
}, JSServer.ChartApi.prototype.StudiesAccessController.prototype._findTool = function(e) {
for (var t = null, i = 0; i < this._studiesAccess.tools.length; ++i) {
var s = this._studiesAccess.tools[i];
if (s.name === e || s === e) {
t = s;
break
}
}
return t
}, JSServer.ChartApi.prototype.StudiesAccessController.prototype.getEnabledTools =
function() {
return this._studyEngine.studiesMetadata().filter((function(e) {
return this.isToolEnabled(e.description) || e.is_hidden_study
}), this)
}, JSServer.ChartApi.prototype.StudiesAccessController.prototype.isToolEnabled = function(
e) {
var t = this._findTool(e);
return "black" === this._studiesAccess.type ? !t || t.grayed : !!t
}, JSServer.ChartApi.prototype.StudiesAccessController.prototype.isToolGrayed = function(
e) {
var t = this._findTool(e);
return t && t.grayed
}, JSServer.ChartApi.prototype.serverTimeOffset = function() {
return this._studyEngine.serverTimeOffset()
},
JSServer.ChartApi.prototype.serverTime = function() {
return this._studyEngine.serverTime()
}, JSServer.ChartApi.prototype.disconnectCount = function() {
return 0
}, u(JSServer.ChartApi, "JSServer.ChartApi", c, "ChartApiInterface"), e.exports = JSServer
.ChartApi
},
EYFt: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return S
}));
var s = i("ivNn"),
r = i("YFKU"),
n = i("qFKp"),
o = i("Tmoa"),
a = i("Kxc7"),
l = i("k9/m"),
c = i("CW80"),
h = i("mMWL"),
u = i("23IT"),
d = i("i6cO"),
p = i("UAFa"),
_ = i("xCUR"),
m = i("Eyy1"),
f = i("nEwK");
const g = n.CheckMobile.any(),
b = Object(r.t)("n/a"),
v = a.enabled("hide_last_na_study_output");
class S {
constructor(e, t) {
this._emptyValues = [], this._colorProviders = new Map, this._study = e, this
._model = t;
const i = e.metaInfo().plots;
i && i.forEach((t, i) => {
if (Object(u.isPlotWithTechnicalValues)(t)) return;
const s = t.id;
this._emptyValues.push({
id: s,
index: i,
title: this._study.guiPlotName(s),
value: "",
visible: !1
});
const r = Object(u.isOhlcPlot)(t) ? t.target : t.id;
this._colorProviders.set(r, Object(p.createStudyPlotColorProvider)(e
.metaInfo(), e.properties(), r))
})
}
getItems() {
return this._emptyValues
}
getValues(e) {
const t = this._emptyValues.map(e => ({
...e
}));
let i = null;
const r = this._study.data().lastIndex();
if (null !== r)
for (const e of t) {
if (!this._study.properties().styles[e.id].visible.value()) continue;
const t = this._study.nearestIndex(r, l.PlotRowSearchMode.NearestLeft, e
.index + 1);
if (void 0 === t) continue;
const s = t + this._study.offset(e.id);
i = null !== i ? Math.max(s, i) : s
}(null === e || null !== i && e > i) && (e = i);
const n = this._hideValues(),
a = this._study.isVisible() && !n ? b : "";
for (const e of t) e.value = a;
if (n) return t;
if (v && t.length && (t[t.length - 1].value = ""), this._study.metaInfo().graphics
.hhists) return this._getValuesForHHist(t, e);
const c = this._study.priceScale();
if (!this._study.isVisible() || null === e || null === c || c.isEmpty() || this
._model.timeScale().isEmpty()) return t;
const h = this._study.metaInfo().plots,
p = Object(_.a)(this._study),
m = {};
for (const i of t) {
let t = i.id;
const n = this._study.properties().styles[t].visible.value();
if (i.visible = n, !n) continue;
const a = i.index,
c = e - this._study.offset(t),
_ = null !== r && c > r ? l.PlotRowSearchMode.NearestLeft : l
.PlotRowSearchMode.Exact,
f = this._study.nearestIndex(c, _);
if (void 0 === f) continue;
let g = m[t];
if (void 0 === g && (g = this._study.getMinFirstBarIndexForPlot(t), Number
.isFinite(g) && (m[t] = g)), g > f) continue;
const b = this._study.data().last(),
v = this._study.data().valueAt(f) || (null !== b ? b.value : null);
if (null === v) continue;
const S = v[a + 1];
if (!Object(s.isNumber)(S)) continue;
const y = S > 0;
i.value = p(S);
const w = this._study.properties().styles[t];
let P = w.color.value();
const C = h[a];
Object(u.isOhlcPlot)(C) ? (t = C.target || t, P = this._study.properties()
.ohlcPlots[t].color.value()) : Object(u.isArrowsPlot)(C) && (P = y ? w
.colorup.value() : w.colordown.value());
let x = P;
const T = this._colorProviders.get(t),
I = T && T.getPlotPointStyle(v);
I && (Object(u.isArrowsPlot)(C) ? (y && void 0 !== I.colors[d.ColorerType.Up] &&
(x = I.colors[d.ColorerType.Up]), y || void 0 === I.colors[d
.ColorerType.Down] || (x = I.colors[d.ColorerType.Down])) :
void 0 !== I.colors[d.ColorerType.Main] && (x = I.colors[d.ColorerType
.Main])), "transparent" === x && (x = P),
x = Object(o.resetTransparency)(x), i.color = x
}
return t
}
_hideValues() {
return g && (null === this._model.crossHairSource().pane || Object(c.isLineToolName)
(h.tool.value()) || null !== this._model.lineBeingEdited())
}
_getValuesForHHist(e, t) {
e.forEach(e => {
e.visible = this._study.isVisible(), e.value = b
});
const i = this._study.priceScale(),
r = this._model.timeScale();
if (null === i || i.isEmpty() || r.isEmpty() || this._hideValues()) return e;
if (null === t || !isFinite(t)) {
const i = this._study.data().last();
if (null === i) return e;
t = i.index
}
const n = this._model.crossHairSource(),
o = n.price;
if (!isFinite(n.y) && null === (t = function(e, t) {
var i;
const s = null === (i = e.visibleBarsStrictRange()) || void 0 === i ?
void 0 : i.lastBar();
if (!s) return null;
const r = t.data().search(s, l.PlotRowSearchMode.NearestLeft);
return r ? r.index : null
}(this._model.timeScale(), this._model.mainSeries()))) return e;
const a = function(e, t, i, s) {
if (0 === e.size) return null;
if (!i) {
const e = Object(m.ensureNotNull)(s.data().valueAt(t));
i = s.barFunction()(e)
}
const r = function(e, t) {
let i = null;
return e.forEach((e, s) => {
s <= t && (null === i || s > i) && (i = s)
}), i
}(e, t);
if (null === r) return null;
const n = e.get(r);
if (!n || 0 === n.size) return null;
return function(e, t) {
let i = null;
return e.forEach(e => {
e.priceLow <= t && t < e.priceHigh && (i = e)
}), i
}(n, i)
}(this._study.graphics().hhistsByTimePointIndex(), t, o, this._model
.mainSeries());
if (null === a) return e;
const c = this._study.metaInfo().graphics.hhists;
if (void 0 === c) return e;
const h = c[a.styleId];
if (void 0 === h) return e;
const u = this._study.properties().child("graphics").child("hhists").child(a
.styleId),
d = new f.VolumeFormatter;
return e.forEach((e, t) => {
if (t < u.colors.childCount())
if (t < a.rate.length) {
const i = a.rate[t];
e.title = h.titles[t], e.value = Object(s.isNumber)(i) ? d
.format(i) : "", e.color = u.colors[t].value()
} else e.title = "", e.value = "", e.color = void 0;
else {
if (a.rate.length > 1 && t === u.colors.childCount()) {
const t = a.rate.reduce((e, t) => e + t, 0);
return e.value = d.format(t), void(e.color = u.valuesColor
.value())
}
e.value = ""
}
}), e
}
}
},
Ecpn: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
const s = {
VbPFixed: !0,
PivotPointsStandard: !0,
VbPVisible: !0
};
function r(e) {
return e in s
}
},
EqoR: function(e, t, i) {
"use strict";
var s = i("5rJj"),
r = i("aDyP").LineToolPitchfork;
class n extends r {
constructor(e, t) {
super(e, t || n.createProperties())
}
name() {
return "Inside Pitchfork"
}
static createProperties(e) {
var t = new s("linetoolinsidepitchfork", e, !1, {
range: [0, 8]
});
return n._configureProperties(t), t
}
static _configureProperties(e) {
r._configureProperties(e)
}
}
t.LineToolInsidePitchfork = n
},
Ery9: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "setCustomAdapter", (function() {
return _
})), i.d(t, "initialize", (function() {
return m
})), i.d(t, "updateUser", (function() {
return f
})), i.d(t, "getChartsCount", (function() {
return g
})), i.d(t, "getCharts", (function() {
return b
})), i.d(t, "removeChart", (function() {
return v
})), i.d(t, "saveChart", (function() {
return S
})), i.d(t, "getChartContent", (function() {
return y
})), i.d(t, "loadChart", (function() {
return w
})), i.d(t, "removeStudyTemplate", (function() {
return P
})), i.d(t, "getStudyTemplateContent", (function() {
return C
})),
i.d(t, "saveStudyTemplate", (function() {
return x
})), i.d(t, "getStudyTemplatesList", (function() {
return T
})), i.d(t, "invalidateStudyTemplatesList", (function() {
return I
})), i.d(t, "getStudyTemplateContentById", (function() {
return M
})), i.d(t, "getStandardStudyTemplateContentById", (function() {
return O
})), i.d(t, "removeStudyTemplateById", (function() {
return L
})), i.d(t, "renameStudyTemplate", (function() {
return A
})), i.d(t, "replaceStudyTemplate", (function() {
return E
})), i.d(t, "getDrawingTemplates", (function() {
return k
})), i.d(t, "loadDrawingTemplate", (function() {
return D
})), i.d(t, "removeDrawingTemplate", (function() {
return V
})), i.d(t, "saveDrawingTemplate", (function() {
return B
}));
var s = i("FQhm"),
r = i("txPx"),
n = i("Cf1E");
const o = Object(r.getLogger)("Chart.SaveloadAdapter.Library");
let a, l, c, h, u = null,
d = null;
function p(e) {
return `${c}/${encodeURIComponent(h)}/${e}?client=${encodeURIComponent(a)}&user=${encodeURIComponent(l)}`
}
function _(e) {
u = e
}
function m(e, t, i, s) {
a = e, l = t, c = i, h = s
}
function f(e) {
l = e
}
function g(e, t) {
throw new Error("Not implemented")
}
async function b() {
const e = e => e.map(e => ({
id: e.id,
name: e.name,
image_url: String(e.id),
modified_iso: e.timestamp,
short_symbol: e.symbol,
interval: e.resolution
}));
if (u) return u.getAllCharts().then(e);
try {
const t = await fetch("" + p("charts"), {
credentials: "same-origin"
});
if (!t.ok) throw new Error(
`Getting chart content response was not OK. Status: ${t.status}.`);
const i = await t.json();
if ("ok" !== i.status) throw new Error("Get chart content request failed: " + i
.message);
return e(i.data)
} catch (e) {
throw o.logWarn(Object(n.a)(e)), e
}
}
async function v(e) {
if (u) u.removeChart(e);
else try {
const t = await fetch(`${p("charts")}&chart=${encodeURIComponent(e)}`, {
method: "DELETE",
credentials: "same-origin"
});
if (!t.ok) throw new Error(
`Remove chart response was not OK. Status: ${t.status}.`);
const i = await t.json();
if ("ok" !== i.status) throw new Error(
"Remove drawing template request failed: " + i.message)
} catch (e) {
throw o.logWarn(Object(n.a)(e)), e
}
}
async function S(e, t, i, s, r) {
const a = r.id.value(),
l = {
name: e,
content: JSON.stringify(s),
symbol: t,
resolution: i
};
if (u) return u.saveChart({
...l,
id: a
});
try {
const e = new FormData;
for (const t in l) e.append(t, l[t]);
let t = p("charts");
null != a && (t += "&chart=" + encodeURIComponent(a));
const i = await fetch(t, {
credentials: "same-origin",
method: "POST",
body: e
});
if (!i.ok) throw new Error(
`Saving chart content response was not OK. Status: ${i.status}.`);
const s = await i.json();
if ("ok" !== s.status) throw new Error("Saving chart content request failed: " + s
.message);
return s.id
} catch (e) {
throw o.logWarn(Object(n.a)(e)), e
}
}
async function y(e) {
const t = t => {
const i = JSON.parse(t);
return i.uid = e.id, i
};
if (u) return u.getChartContent(e.id).then(e => t(e));
try {
const i = await fetch(`${p("charts")}&chart=${encodeURIComponent(e.id)}`, {
credentials: "same-origin"
});
if (!i.ok) throw new Error(
`Getting chart content response was not OK. Status: ${i.status}.`);
const s = await i.json();
if ("ok" !== s.status) throw new Error("Get chart content request failed: " + s
.message);
return t(s.data.content)
} catch (e) {
throw o.logWarn(Object(n.a)(e)), e
}
}
function w(e) {
y(e).then(e => {
s.emit("chart_load_requested", e)
}, () => {
o.logWarn("Error loading chart")
})
}
async function P(e) {
try {
if (u) return u.removeStudyTemplate({
name: e
});
const t = await fetch(`${p("study_templates")}&template=${encodeURIComponent(e)}`, {
method: "DELETE",
credentials: "same-origin"
});
if (!t.ok) throw new Error(
`Remove study template response was not OK. Status: ${t.status}.`);
const i = await t.json();
if ("ok" !== i.status) throw new Error("Remove study template request failed: " + i
.message)
} catch (e) {
throw o.logWarn(Object(n.a)(e)), e
}
}
async function C(e) {
try {
if (u) {
return {
content: await u.getStudyTemplateContent({
name: e
})
}
}
const t = await fetch(`${p("study_templates")}&template=${encodeURIComponent(e)}`, {
credentials: "same-origin"
});
if (!t.ok) throw new Error(
`Get study template response was not OK. Status: ${t.status}.`);
const i = await t.json();
if ("ok" !== i.status) throw new Error("Get study template request failed: " + i
.message);
return i.data
} catch (e) {
throw o.logWarn(Object(n.a)(e)), e
}
}
async function x(e) {
try {
if (u) return u.saveStudyTemplate(e).then(() => ({
error: ""
})).catch(e => ({
error: null != e ? Object(n.a)(e) : "error"
}));
const t = new FormData;
t.append("name", e.name), t.append("content", e.content);
const i = await fetch(p("study_templates"), {
method: "POST",
body: t,
credentials: "same-origin"
});
if (!i.ok) throw new Error(
`Save study template response was not OK. Status: ${i.status}.`);
const s = await i.json();
return {
error: "ok" === s.status ? "" : s.status
}
} catch (e) {
throw o.logWarn(Object(n.a)(e)), e
}
}
async function T() {
try {
if (d) return d;
d = [];
const e = e => (d = e.map(e => ({
is_default: !1,
name: e.name
})), d);
if (u) return u.getAllStudyTemplates().then(e);
const t = await fetch(p("study_templates"), {
method: "GET",
credentials: "same-origin"
});
if (!t.ok) throw new Error(
`Study templates list response was not OK. Status: ${t.status}.`);
const i = await t.json();
if ("ok" !== i.status) throw new Error("Study templates list request failed: " + i
.message);
return e(i.data)
} catch (e) {
throw o.logWarn(Object(n.a)(e)), e
}
}
function I() {
d = null
}
function M(e, t) {
throw new Error("Not implemented")
}
function O(e, t) {
throw new Error("Not implemented")
}
function L(e, t) {
throw new Error("Not implemented")
}
function A(e, t, i) {
throw new Error("Not implemented")
}
function E(e, t, i) {
throw new Error("Not implemented")
}
async function k(e) {
throw new Error("Not implemented")
}
async function D(e, t) {
throw new Error("Not implemented")
}
async function V(e, t) {
throw new Error("Not implemented")
}
async function B(e, t, i) {
throw new Error("Not implemented")
}
},
EsvI: function(e, t, i) {
"use strict";
i.r(t);
i("bSeV");
var s = i("eJTA"),
r = i("wZIs"),
n = i("Vdly");
function o() {
return Object(n.getValue)("current_theme.name") || null
}
var a = i("wVAQ"),
l = i("txPx");
const c = Object(l.getLogger)("Themes.Provider");
let h = null;
function u(e) {
return Object(a.fetch)("/theme/?themeName=" + encodeURIComponent(e), {
credentials: "include",
method: "GET"
}).then(e => e.json()).then(e => {
const t = {};
return e.content && (t.content = JSON.parse(e.content)), t
})
}
var d = i("zM7N"),
p = i("oiZD");
var _ = i("YFKU"),
m = i("IMMp"),
f = i("HGP3");
const g = {
[d.a.Light]: {
name: d.a.Light,
label: () => Object(_.t)("Light", {
context: "colorThemeName"
}),
order: 2,
getThemedColor: e => Object(f.getHexColorByName)(e)
},
[d.a.Dark]: {
name: d.a.Dark,
label: () => Object(_.t)("Dark", {
context: "colorThemeName"
}),
order: 1,
getThemedColor: e => {
const t = m[e] || e;
return Object(f.getHexColorByName)(t)
}
}
};
function b(e) {
return !e.isPrivate
}
function v() {
return g[p.watchedTheme.value()] || g.light
}
function S(e) {
return v().getThemedColor(e)
}
async function y(e, t, i, s, n = !0, o = !1, a = !1) {
const l = await (t ? Promise.resolve(O(e)) : x(e));
if (void 0 !== l.content) {
const h = !t;
a && (void 0 !== (c = l.content).chartProperties && Object(r.applyDefaultsOverrides)
(c.chartProperties), void 0 !== c.mainSourceProperties && Object(r
.applyDefaultsOverrides)(c.mainSourceProperties, void 0, !0,
"mainSeriesProperties")), await s.applyTheme(l.content, h, i, e, t, n,
o)
}
var c;
return l
}
function w() {
Object(p.setTheme)(o() || "light")
}
function P() {
return o()
}
function C() {
var e;
e = v().name, Object(n.setValue)("current_theme.name", e, {
forceFlush: !0
})
}
function x(e) {
return u(e)
}
function T() {
return h || Object(a.fetch)("/themes/", {
credentials: "include",
method: "GET"
}).then(e => (h = e.json(), h))
}
function I() {
return d.c()
}
function M(e) {
return I().includes(e)
}
function O(e) {
return d.b(e) || {
content: void 0
}
}
function L(e, t) {
const i = t || v().name,
s = d.b(i),
r = 0 !== e.length && e.split(".");
return s && s.content && r ? r.reduce((e, t) => e[t], s.content) : null
}
function A(e, t, i) {
const r = L(e, i);
return null !== r && Object(s.areEqualRgba)(Object(s.parseRgba)(r), Object(s.parseRgba)(
String(t)))
}
function E(e, t) {
return function(e, t) {
const i = new FormData;
return i.append("content", JSON.stringify(t)), i.append("name", e), h = null,
Object(a.fetch)("/save-theme/", {
credentials: "include",
method: "POST",
body: i
}).then(e => e.json(), e => c.logError(e))
}(e, t)
}
function k(e) {
return function(e) {
const t = new FormData;
return t.append("name", e), h = null, Object(a.fetch)("/remove-theme/", {
credentials: "include",
method: "POST",
body: t
}).then(e => e.json(), e => c.logError(e))
}(e)
}
function D(e) {
return function(e) {
return u(e).then(e => Boolean(e.content))
}(e)
}
function V(e) {
return d.e(e)
}
function B(e) {
return d.d(e)
}
function R(e) {
return {
content: {
chartProperties: {
paneProperties: e.model().properties().paneProperties.state(),
scalesProperties: e.model().properties().scalesProperties.state()
},
sessions: e.model().sessions().properties().state(),
mainSourceProperties: e.model().mainSeries().properties().state()
}
}
}
i.d(t, "isPublicTheme", (function() {
return b
})), i.d(t, "getCurrentTheme", (function() {
return v
})), i.d(t, "getThemedColor", (function() {
return S
})), i.d(t, "loadTheme", (function() {
return y
})), i.d(t, "restoreTheme", (function() {
return w
})), i.d(t, "savedThemeName", (function() {
return P
})), i.d(t, "syncTheme", (function() {
return C
})), i.d(t, "getTheme", (function() {
return x
})), i.d(t, "getThemeNames", (function() {
return T
})), i.d(t, "getStdThemeNames", (function() {
return I
})), i.d(t, "isStdThemeName", (function() {
return M
})), i.d(t, "getStdTheme", (function() {
return O
})), i.d(t, "getStdThemedValue", (function() {
return L
})), i.d(t, "isStdThemedDefaultValue", (function() {
return A
})), i.d(t, "saveTheme", (function() {
return E
})), i.d(t, "removeTheme", (function() {
return k
})),
i.d(t, "isThemeExist", (function() {
return D
})), i.d(t, "translateStdThemeName", (function() {
return V
})), i.d(t, "isStdTheme", (function() {
return B
})), i.d(t, "extractThemeFromModel", (function() {
return R
})), i.d(t, "DEFAULT_THEME", (function() {
return "light"
})), i.d(t, "themes", (function() {
return g
}))
},
ExCE: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("VdBB");
class r {
constructor() {
this._bars = []
}
hitTest(e) {
const t = this._bars,
i = this._getBarSpacing(),
s = i / 2;
if (0 === t.length) return null;
const r = this._getTolerance(),
n = t[0],
o = t[t.length - 1];
if (e.x < n.time - s - r) return null;
if (e.x > o.time + s + r) return null;
let a = 0,
l = t.length - 1,
c = -1;
for (; a <= l;) {
const i = Math.floor((a + l) / 2),
h = t[i];
let u = s;
if (h !== n && h !== o || (u += r), Math.abs(h.time - e.x) <= u) {
c = i;
break
}
e.x - h.time > s ? a = i + 1 : l = i - 1
}
if (-1 !== c) {
const n = Math.ceil(r / i);
if (0 !== n) {
const i = Math.max(0, c - n),
o = Math.min(t.length - 1, c + n);
for (let n = i; n <= o; n++)
if (Math.abs(e.x - t[n].time) <= s + r && this._isPointAtBar(t[n], e.y,
r)) return this._getHitTest()
} else if (this._isPointAtBar(t[c], e.y, r)) return this._getHitTest()
}
return null
}
_getHitTest() {
return new s.HitTestResult(s.HitTestResult.REGULAR)
}
_isPointAtBar(e, t, i) {
const s = Math.min(e.high, e.low),
r = Math.max(e.high, e.low);
return s - i <= t && t <= r + i
}
}
},
EyEd: function(e, t, i) {
"use strict";
var s = i("lCO3").Version,
r = i("txPx").getLogger("Chart.StudyMigration");
function n(e) {
this._studyId = e, this._maxToVers = s.ZERO, this._maxFromVers = s.ZERO, this._migrs = []
}
n.prototype.addMigration = function(e, t, i) {
var r = s.parse(e),
n = s.parse(t);
r.isGreater(this._maxFromVers) && (this._maxFromVers = r), n.isGreater(this
._maxToVers) && (this._maxToVers = n), this._migrs.push({
fromVers: r,
toVers: n,
rules: i
})
}, n.prototype.updateInputs = function(e, t, i) {
if (!i) return i;
for (var s = TradingView.clone(i), n = e; n.isLess(t);) {
var o = this._findMigration(n);
if (null == o) break;
if (r.logNormal("Migrating study inputs from " + o.fromVers + " to " + o.toVers +
" version, studyId: " + this._studyId + ", migration: " + JSON.stringify(
o) + ", inputs: " + JSON.stringify(i)), s = this._applyMigration(s, o),
!n
.isLess(o.toVers)) throw new Error(
"Problems in study migration process... Possible infinite cycle has been detected and stopped."
);
n = o.toVers
}
return n > e && r.logNormal("Study inputs migration is done, studyId: " + this
._studyId + ", inputs: " + JSON.stringify(s)), s
}, n.prototype._findMigration = function(e) {
for (var t = -1, i = this._maxFromVers, s = 0; s < this._migrs.length; s++) {
var r = this._migrs[s];
r.fromVers.isLess(e) || r.fromVers.isLessOrEqual(i) && (i = r.fromVers, t = s)
}
return t < 0 ? null : this._migrs[t]
}, n.prototype._applyMigration = function(e, t) {
for (var i = e, s = 0; s < t.rules.length; s++) {
var r = t.rules[s];
i = this._getApplyRuleFun(r.type)(i, r)
}
return i
}, n.prototype._getApplyRuleFun = function(e) {
if ("inputRemoved" === e) return n._applyInputRemovedRule;
if ("inputChangedType" === e) return n._applyInputChangedTypeRule;
if ("inputChangedMinMax" === e) return n._applyInputChangedMinMaxRule;
if ("inputChangedOptions" === e) return n._applyInputChangedOptionsRule;
throw new Error("Unknown migration rule type: " + e)
}, n._applyInputRemovedRule = function(e, t) {
if (!(t.inputId in e)) return e;
if ("removeVal" !== t.action) throw new Error("Unexpected rule.action=" + t.action +
" in rule.type=" + t.type);
var i = e[t.inputId];
return delete e[t.inputId], r.logNormal("Input " + t.inputId + "=" + i + " removed"), e
}, n._applyInputChangedTypeRule = function(e, t) {
var i = e[t.inputId];
if ("resetToDefVal" === t.action) return e[t.inputId] = t.defVal, r.logNormal("Input " +
t.inputId + "=" + i + " reset to default value " + t.defVal), e;
if ("convertVal" === t.action) {
if (null == i) return e;
if ("float" === t.inputTypeFrom && "integer" === t.inputType) return e[t.inputId] =
Math.round(e[t.inputId]), r.logNormal("Input " + t.inputId + "=" + i +
" converted to value " + e[t.inputId]), e;
if ("integer" === t.inputTypeFrom && "float" === t.inputType) return e;
if ("text" === t.inputTypeFrom && "source" === t.inputType) return n._isValidSource(
i, t.options) || (e[t.inputId] = t.defVal), e;
throw new Error("Cannot convertVal from " + t.inputTypeFrom + " to " + t.inputType)
}
throw new Error("Unknown action " + t.action + " for rule with type " + t.type)
}, n._isValidSource = function(e, t) {
return e.indexOf("$") >= 0 || t.indexOf(e) >= 0
}, n._applyInputChangedMinMaxRule = function(e, t) {
if ("adjustValIfNeeded" !== t.action) throw new Error("Unknown action " + t.action +
" for rule with type " + t.type);
var i = e[t.inputId];
return i < t.minVal ? e[t.inputId] = t.minVal : i > t.maxVal && (e[t.inputId] = t
.maxVal), r.logNormal("Input " + t.inputId + "=" + i + " adjusted to value " +
e[t.inputId]), e
}, n._applyInputChangedOptionsRule = function(e, t) {
if (!(["text"].indexOf(t.inputType) >= 0 && "resetToDefValIfNeeded" === t.action))
throw new Error("Unexpected rule.inputType=" + t.inputType + " in rule.action=" + t
.action);
var i = e[t.inputId];
return t.options.indexOf(i) < 0 && (e[t.inputId] = t.defVal, r.logNormal("Input " + t
.inputId + "=" + i + " reset to default value " + t.defVal)), e
}, e.exports = n
},
Eyy1: function(e, t, i) {
"use strict";
function s(e) {
if (void 0 === e) throw new Error("Value is undefined");
return e
}
function r(e) {
if (null === e) throw new Error("Value is null");
return e
}
Object.defineProperty(t, "__esModule", {
value: !0
}), t.ensureNever = t.ensure = t.ensureNotNull = t.ensureDefined = t.assert = void 0, t
.assert = function(e, t) {
if (!e) throw new Error("Assertion failed" + (t ? ": " + t : ""))
}, t.ensureDefined = s, t.ensureNotNull = r, t.ensure = function(e) {
return r(s(e))
}, t.ensureNever = function(e) {}
},
F58L: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyTemplates", (function() {
return _
}));
var s = i("YFKU"),
r = i("zUrt"),
n = i("JWMC"),
o = i("aIyQ"),
a = i.n(o),
l = i("hY0g"),
c = i.n(l),
h = i("fZEr"),
u = i("txPx");
const d = Object(u.getLogger)("Platform.StudyTemplates"),
p = Object(s.t)("Do you really want to delete Study Template '{name}' ?");
class _ {
constructor(e) {
this._chartWidgetCollection = e.chartWidgetCollection, this
._favoriteStudyTemplatesService = e.favoriteStudyTemplatesService, window
.loginStateChange.subscribe(null, r.backend.invalidateStudyTemplatesList), this
._list = new c.a([]), this._onChange = new a.a, this._list.subscribe(() => this
._onChange.fire())
}
findRecordByName(e) {
return this._list.value().find(t => t.name === e) || null
}
showSaveAsDialog() {
const e = this._chartWidgetCollection.activeChartWidget.value().model();
Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i.e(9), i.e(13), i.e(16),
i.e(17), i.e(21), i.e(23), i.e(28), i.e(36), i.e(85), i.e(0), i.e(2), i
.e(15), i.e("study-template-dialog")
]).then(i.bind(null, "IDfV")).then(t => {
new t.StudyTemplateSaver({
controller: e,
onSave: e => {
this._list.setValue(e)
}
}).show()
})
}
applyTemplate(e) {
const t = this.findRecordByName(e);
null !== t ? window.runOrSignIn(() => {
const e = this._chartWidgetCollection.activeChartWidget.value(),
i = i => {
Object(n.trackEvent)("GUI", "Load Study Template"), e.model()
.applyStudyTemplate(JSON.parse(i.content), t.name)
};
void 0 !== t.id ? t.is_default ? r.backend
.getStandardStudyTemplateContentById(t.id, i) : r.backend
.getStudyTemplateContentById(t.id, i) : r.backend
.getStudyTemplateContent(t.name).then(i)
}, {
source: "Study templates apply"
}) : d.logNormal(`Template ${e} not found in cache`)
}
deleteStudyTemplate(e) {
const t = this.findRecordByName(e);
null !== t ? this._removeTemplate(t) : d.logNormal(
`Template ${e} not found in cache`)
}
list() {
return this._list.value()
}
getOnChange() {
return this._onChange
}
refreshStudyTemplateList(e) {
r.backend.getStudyTemplatesList().then(t => {
this._list.setValue(t), void 0 !== e && e()
})
}
invalidate() {
r.backend.invalidateStudyTemplatesList()
}
_removeTemplate(e) {
window.runOrSignIn(() => {
Object(h.showConfirm)({
text: p.format({
name: e.name
}),
onConfirm: ({
dialogClose: t
}) => new Promise(i => {
const s = () => {
this.refreshStudyTemplateList(() => {
const s = this.list();
this._list.setValue(s
.filter(t => t !==
e)), this
._favoriteStudyTemplatesService &&
this
._favoriteStudyTemplatesService
.remove(e.name), i(),
t()
})
};
r.backend.invalidateStudyTemplatesList(),
void 0 !== e.id ? r.backend
.removeStudyTemplateById(e.id, s) : r
.backend.removeStudyTemplate(e.name).then(s)
})
})
}, {
source: "Study templates delete"
})
}
}
},
FA0h: function(e, t, i) {
"use strict";
function s() {
return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i.e(9), i.e(
13), i.e(14), i.e(19), i.e(26), i.e(0), i.e(2), i.e(7), i.e(10), i.e(18), i
.e(20), i.e(25), i.e("symbol-search-dialog")
]).then(i.bind(null, "GcSm"))
}
i.d(t, "a", (function() {
return s
}))
},
FBsw: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "OverlayPriceAxisView", (function() {
return l
}));
var s = i("Kxc7"),
r = i("KcY8"),
n = i("n5al"),
o = i("oXaB");
const a = s.enabled("force_exchange_as_title");
class l extends r.a {
constructor(e) {
super(), this._source = e
}
_updateRendererData(e, t, i) {
e.visible = !1, t.visible = !1;
const s = this._source.lastValueData("close", !1);
if (s.noData) return;
const r = this._source.model(),
n = this._source.priceScale();
if (null === n) return;
if (!r.isPriceScaleVisible(n)) return;
i.background = s.color, i.textColor = this.generateTextColor(s.color), i
.coordinate = s.coordinate, i.floatCoordinate = s.floatCoordinate;
const a = this._source.model().properties().scalesProperties,
l = n.isPercentage();
a.showSeriesLastValue.value() && (e.text = l ? s.formattedPricePercentage : s
.formattedPriceAbsolute, a.seriesLastValueMode.value() !== o
.PriceAxisLastValueMode.LastPriceAndPercentageValue ? e.secondLine =
"" : e.secondLine = l ? s.formattedPriceAbsolute : s
.formattedPricePercentage, e.visible = !0), t.text = "", a
.showSymbolLabels.value() && (t.text = this._paneText(),
t.visible = t.text.length > 0)
}
_paneText() {
let e = "";
const t = this._source.symbolInfo();
return a ? e = Object(n.displayedSymbolExchange)(t) : this._source.model()
.properties().scalesProperties.showSymbolLabels.value() && (e = Object(n
.displayedSymbolName)(t)), e
}
}
},
FBuY: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "TVXWindowEvents", (function() {
return o
}));
i("HbRj");
var s = i("txPx"),
r = i("VVxS");
const n = Object(s.getLogger)("XWindowEvents");
var o;
! function(e) {
const t = "tvxwevents.",
i = {};
let s;
window.BroadcastChannel ? (s = new BroadcastChannel("tvxwevents"), s.addEventListener(
"message", (function(e) {
const {
data: {
event: t,
value: s
}
} = e;
i[t] && i[t].forEach(e => {
e(s)
})
})), function() {
const e = [],
i = performance.now();
for (let i = 0; i < r.TVLocalStorage.length; i++) {
const s = r.TVLocalStorage.key(i);
s.startsWith(t) && e.push(s)
}
const s = r.TVLocalStorage.length;
for (const t of e) r.TVLocalStorage.removeItem(t);
const o = performance.now() - i;
n.logNormal("Total keys amount in local storage on operation start: " + s), n
.logNormal("Keys amount in local storage to be deleted: " + e.length), n
.logNormal("Keys to be deleted from local storage: " + JSON.stringify(e)), n
.logNormal(`Removing keys from local storage took ${o} ms`)
}()) : window.addEventListener("storage", (function(e) {
const {
newValue: s,
key: n
} = e;
if (null === s || !n || !n.startsWith(t)) return;
const o = n.substr(t.length);
i[o] && i[o].forEach(t => {
t(e.newValue)
});
r.TVLocalStorage.removeItem(n)
})), e.on = function(e, t) {
i[e] || (i[e] = []), i[e].push(t)
}, e.off = function(e, t) {
if (!i[e]) return;
const s = i[e].indexOf(t); - 1 !== s && (1 === i[e].length ? delete i[e] : i[e]
.splice(s, 1))
}, e.emit = function(e, i = Date.now()) {
try {
s ? s.postMessage({
event: e,
value: i
}) : r.TVLocalStorage.setItem(t + e, i.toString())
} catch (e) {
n.logError(e.message)
}
}
}(o || (o = {}))
},
FDyI: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("LxhU"),
n = i("IiTo"),
o = i("/bs+");
class a {
constructor(e) {
this._timeScale = e
}
coordinateToTime(e) {
const t = this._timeScale.coordinateToIndex(e);
return this._timeScale.indexToTimePoint(t)
}
barSpacingChanged() {
return this._timeScale.barSpacingChanged()
}
rightOffsetChanged() {
return this._timeScale.rightOffsetChanged()
}
barSpacing() {
return this._timeScale.barSpacing()
}
rightOffset() {
return this._timeScale.rightOffset()
}
width() {
return this._timeScale.width()
}
}
var l = i("aIyQ"),
c = i.n(l),
h = i("96Yh"),
u = i("pOzK"),
d = i("CsKN");
function p(e, t) {
const i = () => {
e.completed().unsubscribe(null, s), t(!1)
},
s = () => {
e.error().unsubscribe(null, i), t(!0)
};
e.completed().subscribe(null, i, !0), e.error().subscribe(null, s, !0)
}
var _ = i("OLhd");
i.d(t, "ChartWidgetApiBase", (function() {
return m
}));
class m {
constructor(e, t) {
this._visibleBarsChanged = new c.a, this._crosshairMoved = new c.a, this._ranges =
null, this._alignerResolution = r.Interval.parse(""), this._alignerSymbolInfo =
null, this._dwmAligner = null, this._chartWidget = e, this._activateChart = t,
this._chartWidget.model().crossHairSource().moved().subscribe(this, this
._onCrosshairMoved)
}
getPriceToBarRatio() {
return this._chartWidget.model().model().mainSeriesScaleRatioProperty().value()
}
setPriceToBarRatio(e, t) {
const i = this._chartWidget.model(),
s = i.model(),
r = s.mainSeriesScaleRatioProperty();
(null == t ? void 0 : t.disableUndo) ? new d.SetScaleRatioPropertiesCommand(r, e,
"", s).redo(): i.setScaleRatioProperty(r, e, "Change Price to Bar Ratio")
}
isPriceToBarRatioLocked() {
return this._chartWidget.model().model().mainSeries().priceScale().isLockScale()
}
setPriceToBarRatioLocked(e, t) {
const i = this._chartWidget.model(),
s = i.model(),
r = s.mainSeries().priceScale();
(null == t ? void 0 : t.disableUndo) ? new u.SetPriceScaleModeCommand({
lockScale: e
}, r, "", s).redo(): i.setPriceScaleMode({
lockScale: e
}, r, "Toggle Lock Scale")
}
onDataLoaded() {
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
.dataEvents().completed())
}
onSymbolChanged() {
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
.dataEvents().symbolResolved())
}
onIntervalChanged() {
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
.onIntervalChanged())
}
onVisibleRangeChanged() {
return this._makeSubscriptionFromDelegate(this._visibleBarsChanged)
}
onChartTypeChanged() {
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
.onStyleChanged())
}
onSeriesTimeframe() {
return this._makeSubscriptionFromDelegate(this._chartWidget.model().mainSeries()
.dataEvents().seriesTimeFrame())
}
whenChartReady(e) {
this._chartWidget.withModel(this, e)
}
crossHairMoved() {
return this._makeSubscriptionFromDelegate(this._crosshairMoved)
}
setSymbol(e, t) {
if (e === this.symbol()) return void(null == t || t());
const i = e => {
!e && t && t()
},
s = this._chartWidget.model().mainSeries().dataEvents();
t && p(s, i), this._activateChart(), this._chartWidget.setSymbol(e)
}
setResolution(e, t) {
const i = r.Interval.normalize(e);
if (null === i || i === this.resolution()) return void(null == t || t());
const s = e => {
!e && t && t()
},
n = this._chartWidget.model().mainSeries().dataEvents();
t && p(n, s), this._activateChart(), this._chartWidget.setResolution(i)
}
setChartType(e, t) {
const i = this._chartWidget.model().mainSeries().properties().style;
if (i.value() === e) return void(null == t || t());
const s = e => {
!e && t && t()
},
r = this._chartWidget.model().mainSeries().dataEvents();
t && p(r, s), this._chartWidget.model().setChartStyleProperty(i, e,
"Change Series Style")
}
getAllStudies() {
return this._chartWidget.model().model().allStudies(!0).map(h.studyEntityInfo)
}
getAllPanesHeight() {
const e = this._chartWidget.model().model().panes();
if (this._chartWidget.isMaximizedPane()) {
let t = 0,
i = 0;
e.forEach(e => {
t += e.height(), i += e.stretchFactor()
});
const s = i / t;
return e.map(e => Math.round(e.stretchFactor() / s * 100) / 100)
}
return e.map(e => e.height())
}
setAllPanesHeight(e) {
const t = this._chartWidget.model().model(),
i = t.panes();
Object(s.assert)(i.length === e.length,
"There`s a mismatch between the number of heights you provided and the number of panes."
);
const r = i.reduce((e, t) => e + t.stretchFactor(), 0) / e.reduce((e, t) => e + t);
e.forEach((e, t) => {
const s = e * r;
i[t].setStretchFactor(s)
}), t.fullUpdate()
}
sessions() {
return this._chartWidget.model().model().sessions()
}
getTimeScaleLogicalRange() {
return this._chartWidget.model().timeScale().logicalRange()
}
exportData(e) {
const t = {
...e
};
return void 0 !== t.from && (t.from = this._convertTimeFromPublic(t.from)),
void 0 !== t.to && (t.to = this._convertTimeFromPublic(t.to)), i.e(
"export-data").then(i.bind(null, "SIoL")).then(e => e.exportData(this
._chartWidget.model().model(), t))
}
barTimeToEndOfPeriod(e) {
const t = this._prepareEndOfPeriodArgs();
return Object(o.a)(t.barBuilder, e, t.intervalObj)
}
endOfPeriodToBarTime(e) {
const t = this._prepareEndOfPeriodArgs();
return Object(o.b)(t.barBuilder, e, t.intervalObj)
}
properties() {
return this._chartWidget.properties()
}
setBarSpacing(e) {
this._chartWidget.model().timeScale().setBarSpacing(e)
}
scrollChartByBar(e) {
this._chartWidget.model().scrollChartByBar(e)
}
mergeAllScales(e) {
this._chartWidget.model().mergeAllScales(e)
}
chartPainted() {
return this._chartWidget.chartPainted()
}
axesSizeReady() {
for (const e of this._chartWidget.paneWidgets()) {
for (const t of e.leftPriceAxisesContainer().axes())
if (!t.sizeReady()) return !1;
for (const t of e.rightPriceAxisesContainer().axes())
if (!t.sizeReady()) return !1
}
return !0
}
applyOverrides(e) {
this._chartWidget.applyOverrides(e)
}
addOverlayStudy(e, t, i) {
return this._chartWidget.addOverlayStudy(e, t, i)
}
ranges() {
throw new Error("not implemented")
}
getTimeScale() {
return new a(this._chartWidget.model().timeScale())
}
_destroy() {
this._chartWidget.hasModel() && this._chartWidget.model().crossHairSource().moved()
.unsubscribeAll(this)
}
_createStudy(e) {
return Promise.reject("Pine and java studies are not supported")
}
_convertTimeToPublic(e) {
const t = this._getSeriesAligner();
return null !== t ? t.timeToExchangeTradingDay(1e3 * e) / 1e3 : e
}
_convertIndexToPublicTime(e) {
const t = this._chartWidget.model(),
i = t.timeScale();
if (i.isEmpty()) return null;
const r = i.points(),
n = Object(s.ensureNotNull)(r.firstIndex()),
o = Object(s.ensureNotNull)(r.lastIndex());
let a = null;
if (n <= e && e <= o) a = r.valueAt(e);
else if (e > o) {
const r = t.mainSeries().syncModel();
if (null !== r) {
const t = Object(s.ensureNotNull)(i.indexToTimePoint(o));
a = r.projectTime(t, e - o)
}
}
return null !== a && (a = this._convertTimeToPublic(a)), a
}
_convertTimeFromPublic(e) {
const t = this._getSeriesAligner();
return null !== t ? t.timeToSessionStart(1e3 * e) / 1e3 : e
}
_getSeriesAligner() {
const e = this._chartWidget.model().mainSeries(),
t = e.interval(),
i = r.Interval.parse(t),
s = e.symbolInfo();
return this._alignerResolution.isEqualTo(i) && this._alignerSymbolInfo === s || (
this._dwmAligner = null === s ? null : Object(_.createDwmAligner)(t, s),
this._alignerResolution = i, this._alignerSymbolInfo = s), this._dwmAligner
}
_onCrosshairMoved(e) {
const t = this._convertIndexToPublicTime(e.index);
null !== t && this._crosshairMoved.fire({
price: e.price,
time: t
})
}
_makeSubscriptionFromDelegate(e) {
return {
subscribe: e.subscribe.bind(e),
unsubscribe: e.unsubscribe.bind(e),
unsubscribeAll: e.unsubscribeAll.bind(e)
}
}
_prepareEndOfPeriodArgs() {
const e = this._chartWidget.model().model(),
t = e.timezone(),
i = Object(s.ensureNotNull)(e.mainSeries().symbolInfo()),
o = e.mainSeries().interval(),
a = new n.SessionInfo(t, i.session, i.session_holidays, i.corrections);
return {
barBuilder: Object(n.newBarBuilder)(o, a, a),
intervalObj: r.Interval.parse(o)
}
}
}
},
FIi8: function(e, t, i) {
"use strict";
function s(e, ...t) {
return e && "object" == typeof e ? (0 === t.length || t.forEach(t => {
null != t && "object" == typeof t && Object.keys(t).forEach(i => {
const n = e[i],
o = t[i];
if (o === e) return;
const a = Array.isArray(o);
if (o && (r(o) || a)) {
let t;
t = a ? n && Array.isArray(n) ? n : [] : n && r(n) ? n : {},
e[i] = s(t, o)
} else void 0 !== o && (e[i] = o)
})
}), e) : e
}
function r(e) {
if (!e || "[object Object]" !== Object.prototype.toString.call(e)) return !1;
const t = Object.getPrototypeOf(e);
if (!t) return !0;
const i = Object.hasOwnProperty.toString,
s = t.hasOwnProperty("constructor") && t.constructor;
return "function" == typeof s && i.call(s) === i.call(Object)
}
i.r(t), i.d(t, "deepExtend", (function() {
return s
}))
},
FKaq: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SetPriceScaleSelectionStrategyCommand", (function() {
return a
}));
var s = i("Eyy1"),
r = i("RDU5"),
n = i("MWAT");
class o {
constructor(e) {
this._leftScales = e.leftPriceScales().map(e => e.id()), this._rightScales = e
.rightPriceScales().map(e => e.id())
}
restorePane(e) {
this._leftScales.reverse().map(t => Object(s.ensureNotNull)(e.getPriceScaleById(t)))
.forEach(t => e.movePriceScale(t, "left")), this._rightScales.reverse().map(t =>
Object(s.ensureNotNull)(e.getPriceScaleById(t))).forEach(t => e
.movePriceScale(t, "right"))
}
}
class a extends r.UndoCommand {
constructor(e, t, i) {
super(i), this._chartModel = e, this._targetStrategy = Object(n
.createPriceScaleSelectionStrategy)(t), this._initialState = e.panes()
.map(e => new o(e))
}
redo() {
this._chartModel.panes().forEach(e => e.setPriceScaleSelectionStrategy(this
._targetStrategy)), this._chartModel.fullUpdate()
}
undo() {
const e = this._chartModel.panes();
for (let t = 0; t < e.length; t++) this._initialState[t].restorePane(e[t]);
this._chartModel.fullUpdate()
}
}
},
FQhm: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "unsubscribe", (function() {
return l
})), i.d(t, "on", (function() {
return c
})), i.d(t, "subscribe", (function() {
return h
})), i.d(t, "subscribeToAll", (function() {
return u
})), i.d(t, "emit", (function() {
return d
})), i.d(t, "emitOnce", (function() {
return p
}));
var s = i("aIyQ"),
r = i.n(s);
const n = {},
o = [],
a = {};
function l(e, t, i) {
n[e].unsubscribe(i, t)
}
function c(e, t, i) {
h(e, t, i)
}
function h(e, t, i, s) {
n.hasOwnProperty(e) || (n[e] = new r.a), a[e] ? t.call(i) : n[e].subscribe(i, t, s)
}
function u(e) {
o.push(e)
}
function d(e, ...t) {
const i = [e].concat(t);
o.forEach(e => {
e.apply(null, i)
}), n.hasOwnProperty(e) && n[e].fire.apply(n[e], t)
}
function p(e) {
a[e] && console.warn(
`Something went wrong: emitOnce called multiple times with same event (${e})`), a[
e] = !0, d.apply(null, arguments)
}
},
FZIs: function(e, t, i) {
"use strict";
var s;
i.d(t, "a", (function() {
return s
})),
function(e) {
e.Light = "light", e.Dark = "dark"
}(s || (s = {}))
},
FaJS: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "scaleRatio", (function() {
return r
})), i.d(t, "priceRangeByScaleRatio", (function() {
return n
})), i.d(t, "barSpacingByScaleRatio", (function() {
return o
}));
var s = i("Qb4w");
function r(e, t) {
if (t.isLog() || e.isEmpty() || t.isEmpty()) return null;
const i = function(e) {
if (e.isEmpty()) return null;
const t = e.priceRange();
if (null === t) return null;
const i = t.length();
return e.internalHeight() / i
}(t);
if (null === i) return null;
return e.getValidBarSpacing() / Math.max(1e-10, i)
}
function n(e, t, i) {
if (e.isLog() || null === i || e.isEmpty()) return null;
const r = e.priceRange();
if (null === r || r.isEmpty()) return null;
const n = e.internalHeight() / (t / i),
o = r.length();
if (n === o) return r;
const a = (n - o) / 2;
return new s.PriceRange(r.minValue() - a, r.maxValue() + a)
}
function o(e, t) {
if (e.isLog() || null === t || e.isEmpty()) return null;
const i = e.priceRange();
if (null === i) return null;
const s = i.length();
return e.internalHeight() / s * t
}
},
Fdrt: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PaneRendererStandardPivotLabel", (function() {
return r
}));
var s = i("VdBB");
class r {
constructor(e, t, i) {
this._drawRects = [], this._cacheProvider = e, this._point = t, this._label = i
}
draw(e, t) {
const i = this._cacheProvider(t);
e.save(), e.setTransform(1, 0, 0, 1, 0, 0);
const s = t.pixelRatio;
this._drawRects = [];
const r = t => {
const r = i.labelRectByIndex(t),
n = {
left: Math.round(this._point.x - r.width + o),
top: Math.round(this._point.y - r.height / 2),
width: r.width,
height: r.height
};
return e.drawImage(i.canvas(), Math.round(r.left * s), Math.round(r.top *
s), r.width * s, r.height * s, Math.round(n.left * s), Math
.round(n
.top * s), n.width * s, n.height * s), this._drawRects.push(n),
r.width
},
n = this._label.split("/");
let o = 0;
for (let e = 0; e < n.length; e++) {
const t = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5"]
.indexOf(n[e]);
e > 0 && (o += r(t + 11) / 2), o += r(t) / 2
}
e.restore()
}
hitTest(e) {
for (const t of this._drawRects)
if (e.x >= t.left && e.x <= t.left + t.width && e.y >= t.top && e.y <= t.top + t
.height) return new s.HitTestResult(s.HitTestResult.REGULAR);
return null
}
}
},
Fixu: function(e, t, i) {
"use strict";
i.d(t, "c", (function() {
return r
})), i.d(t, "d", (function() {
return n
})), i.d(t, "b", (function() {
return o
})), i.d(t, "a", (function() {
return a
}));
i("Eyy1"), i("dfhE");
function s(e, t) {
0
}
function r(e) {
s()
}
function n(e) {
s()
}
function o(e) {
s()
}
function a(e) {
0
}
},
FsE7: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX"),
o = n.LineToolWidthsProperty,
a = n.LineToolColorsProperty;
class l extends s {
constructor(e, t) {
super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views")
.then(i.t.bind(null, "wgWl", 7)).then(({
FibTimeZonePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return l.LevelsCount
}
migrateVersion(e, t, i) {
if (1 === e) {
i.properties.level1.color.setValue(i.properties.baselinecolor.value());
for (var s = 2; s <= 11; s++) i.properties["level" + s].color.setValue(i
.properties.linecolor.value());
for (s = 1; s <= 11; s++) i.properties["level" + s].linewidth.setValue(i
.properties.linewidth.value()), i.properties["level" + s].linestyle
.setValue(i.properties.linestyle.value())
}
}
pointsCount() {
return 2
}
name() {
return "Fib Time Zone"
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "SMr9")))
.FibTimezoneDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetoolfibtimezone", e, !1, {
range: [1, 11]
});
return l._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [], i = [], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r)
.child("linewidth")), i.push(e.child("level" + r).child("color"));
for (t = [], i = [], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r)
.child("linewidth")), i.push(e.child("level" + r).child("color"));
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
}
}
l.version = 2, l.LevelsCount = 11, t.LineToolFibTimeZone = l
},
"GD+X": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
class s {
constructor(e, t) {
this._chartUndoModel = e, this._chartModel = e.model(), this._priceScale = t
}
getMode() {
const e = this._priceScale.properties().childs();
return e.percentage.value() ? 2 : e.indexedTo100.value() ? 3 : e.log.value() ? 1 : 0
}
setMode(e) {
this._priceScale.setMode({
percentage: 2 === e,
log: 1 === e,
indexedTo100: 3 === e
})
}
isInverted() {
return this._priceScale.isInverted()
}
setInverted(e) {
this._priceScale.properties().childs().isInverted.setValue(e)
}
getVisiblePriceRange() {
return this._priceScale.priceRangeInPrice()
}
setVisiblePriceRange(e) {
this._priceScale.setPriceRangeInPrice(e), this._chartModel.lightUpdate()
}
hasMainSeries() {
return this._priceScale.hasMainSeries()
}
getStudies() {
return this._priceScale.getStudies().map(e => e.id())
}
currency() {
const e = this._priceScale.currency(this._chartModel.availableCurrencies());
return null === e ? null : {
selectedCurrency: e.selectedCurrency,
readOnly: e.readOnly
}
}
setCurrency(e) {
this._chartUndoModel.setPriceScaleCurrency(this._priceScale, e)
}
unit() {
const e = this._priceScale.unit(this._chartModel.availableUnits());
return null === e ? null : {
selectedUnit: e.selectedUnit,
readOnly: 0 === e.availableGroups.size,
availableGroups: Array.from(e.availableGroups)
}
}
setUnit(e) {
this._chartUndoModel.setPriceScaleUnit(this._priceScale, e)
}
}
},
GDWD: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "addPlusButtonProperty", (function() {
return o
})), i.d(t, "restoreAddPlusButtonSettingsValue", (function() {
return a
}));
var s = i("Vdly"),
r = i("m/cY");
function n() {
return s.getBool("add_plus_button", !0)
}
const o = Object(r.a)(n());
function a() {
o.setValue(!0), s.remove("add_plus_button")
}
s.onSync.subscribe(null, () => o.setValue(n())), o.listeners().subscribe(null, () => s.setValue(
"add_plus_button", o.value()))
},
GEp6: function(e, t, i) {
"use strict";
function s(e, t, i) {
var s = t.subtract(e),
r = i.subtract(e).dotProduct(s) / s.dotProduct(s);
return {
coeff: r,
distance: e.addScaled(s, r).subtract(i).length()
}
}
Object.defineProperty(t, "__esModule", {
value: !0
}), t.distanceToSegment = t.distanceToLine = void 0, t.distanceToLine = s, t
.distanceToSegment = function(e, t, i) {
var r = s(e, t, i);
if (0 <= r.coeff && r.coeff <= 1) return r;
var n = e.subtract(i).length(),
o = t.subtract(i).length();
return n < o ? {
coeff: 0,
distance: n
} : {
coeff: 1,
distance: o
}
}
},
GH0z: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PercentageFormatter", (function() {
return n
}));
var s = i("kcTO"),
r = i("Ialn");
class n extends s.PriceFormatter {
constructor(e = 100) {
super(e), this.type = "percentage"
}
state() {
const e = s.PriceFormatter.prototype.state.call(this);
return e.percent = !0, e
}
parse(e) {
return e = e.replace("%", ""), super.parse(e)
}
format(e, t, i, s, n = !0) {
const o = super.format(e, t, i, s, !1) + "%";
return n ? Object(r.forceLTRStr)(o) : o
}
static serialize(e) {
return e.state()
}
static deserialize(e) {
return new n(e.priceScale)
}
}
},
GUQs: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
})), i.d(t, "c", (function() {
return n
})), i.d(t, "b", (function() {
return o
}));
var s = i("qFKp");
function r(e) {
e.cancelable && e.preventDefault()
}
function n(e) {
return t => {
r(t), e()
}
}
function o(e) {
s.isChrome && e.addEventListener("mousedown", e => {
if (1 === e.button) return e.preventDefault(), !1
})
}
},
GVHu: function(e, t, i) {
"use strict";
(function(e, s) {
var r = i("Eyy1"),
n = r.assert,
o = r.ensureNotNull,
a = i("hsV8").unpackNonSeriesData,
l = i("n5al").symbolTitle,
c = i("38az").StudyBarColorer,
h = i("hezA").StudyPriceAxisView,
u = i("jenN"),
d = u.emptyStudyGraphics,
p = u.loadStudyGraphics,
_ = u.saveStudyGraphics,
m = u.LiveStudyGraphics,
f = u.createGraphicsPriceAxisViews,
g = i("XzZr").ChartApiInterface,
b = i("Ocx9").DefaultProperty,
v = i("kcTO").PriceFormatter,
S = i("nEwK").VolumeFormatter,
y = i("GH0z").PercentageFormatter,
w = i("k9/m"),
P = w.PlotList,
C = w.PlotRowSearchMode,
x = i("0YCj"),
T = (i("cBZt").extractStudyId, i("FQhm")),
I = i("23IT"),
M = I.LineStudyPlotStyle,
O = i("TmNs").StudyPriceLineAxisView,
L = i("w4Ji").studyPlotFunctionMap,
A = i("w4Ji").studyEmptyPlotValuePredicate,
E = i("jy4L").makeNextStudyId,
k = i("Kxc7"),
D = i("IcDj").StudyBase,
V = i("i6cO").ColorerType,
B = i("H0vP").InvalidationMask,
R = i("bmVy"),
N = R.StudyStatusType,
j = (R.convertStudyStatusToString, i("Tmoa").colorToInteger),
F = i("UAFa").createStudyPlotColorProvider,
W = i("0C7r").intervalsVisibilitiesDefaults,
H = i("txPx").getLogger("Chart.Study"),
U = k.enabled("datasource_copypaste"),
z = k.enabled("study_symbol_ticker_description"),
G = k.enabled("hide_unresolved_symbols_in_legend");
function q(e, t, i) {
var s = new b(t, i, !0);
s.addExclusion("visible"), s.addExclusion("precision"), s.addExclusion("minTick"), s
.addExclusion("intervalsVisibilities");
for (var r = 0; r < e.inputs.length; ++r) {
var n = e.inputs[r];
n.isHidden && (s.addExclusion("inputs." + r.toString()), s.addExclusion(
"inputs." + n.id))
}
return s
}
function Y(e, t) {
if (t.plots)
for (var i = 0; i < t.plots.length; i++) {
var s = t.plots[i],
r = s.id;
if (!I.isColorerPlot(s)) {
var n = {
visible: !0,
color: "#0496FF",
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 2,
plottype: M.Line,
histogramBase: 0,
transparency: 50,
trackPrice: !1,
joinPoints: !1
};
I.isBarColorerPlot(s) && (n.transparency = 0), n.plottype = s.type, n
.title = r, e.styles && r in e.styles && TradingView.merge(n, e
.styles[r]), e.styles[r] = n
}
}
}
function K(e, t) {
return e && e[t] && e[t].hasOwnProperty("showLast") ? e[t].showLast.value() : null
}
class J extends D {
constructor(e, t, i, r) {
super(e, t, i, r), this._resolvedSymbols = {}, this
._priceAxisViewsBase = [], this._graphicsPriceAxisViews = [], this
._priceLinesAxisViews = [], this._hlinesPriceAsisViews = [], this
._horizlinesPriceAsisViews = [], this._chartApi = e._chartApi, this
._turnaroundCounter = 0, this._turnaround = "st" + this
._turnaroundCounter, this._plotFields = [];
var n = this.metaInfo().plots;
if (n)
for (var o = 0, a = n.length; o < a; o++) {
var l = n[o].id;
this._plotFields.push(l)
}
this._invalidateLastNonEmptyPlotRowCache(), this.m_data = new P(L(this
._metaInfo), A), this._graphics = new m, this._plotOffsets = {},
this._plotOffsetsMetaInfoOverride = {}, this._studyModified = !1, this
._tagsChanged = new s, this._labelPaneViews = [], this._createViews();
var c = this;
this._handler = function(e) {
c.onData(e)
},
this._handler.isTVScriptStrategy = this._metaInfo.isTVScriptStrategy,
this._recreatePriceFormattingDependencies(), this._properties.precision
.listeners().subscribe(this, this._precisionChanged), this
._showStudyArgumentsProperty.listeners().subscribe(this, this
.invalidateTitleCache), this._properties.description.listeners()
.subscribe(this, this.invalidateTitleCache), this._properties.inputs
.listeners().subscribe(this, this.invalidateTitleCache), this
._properties.shortDescription && this._properties.shortDescription
.listeners().subscribe(this, this.invalidateTitleCache), k.enabled(
"update_study_formatter_on_symbol_resolve") && e.mainSeries()
.dataEvents().symbolResolved().subscribe(this, this
._recreatePriceFormattingDependencies), e.mainSeries().dataEvents()
.symbolResolved().subscribe(this, this.invalidateTitleCache);
c = this;
var h = {};
this._simplePlotsCount = r.plots.filter((function(e, t) {
if (I.isLinePlot(e)) return !0;
if (I.isOhlcPlot(e)) {
var i = c.metaInfo().plots[t].target;
return !h[i] && (h[i] = i, !0)
}
return !1
})).length, this._properties.showInDataWindow.listeners().subscribe(e, e
.fullUpdate), this.hasBarColorer() && this._properties.visible
.listeners().subscribe(e.mainSeries(), e.mainSeries()
.invalidateBarStylesCache), this._childStudyByRebind = new s, this
._formatterChanged = new s, this._priceStepChanged = new s, this
._aboutToBeDestroyed = new s, this._ongoingDataUpdate = Promise
.resolve(), this._isDestroyed = !1, this._definitionsViewModel = null
}
lastValueData(e, t, i) {
var s = {
noData: !0
};
if (this._model.timeScale().isEmpty() || null == this.priceScale() || this
.priceScale().isEmpty() || this.data().isEmpty()) return s;
var r = this._model.timeScale().visibleBarsStrictRange();
if (null === r) return s;
if (!this.properties().visible.value()) return s;
var n, o, a = this.properties().styles,
l = this.properties().ohlcPlots;
if (a && a[e] && (n = a[e]), l && l[e] && (n = l[e]), !n || !n.visible
.value()) return s;
var c = this.metaInfo().plots;
for (o = 0; o < c.length && !(c[o].id === e || I.isOhlcClosePlot(o) && c[o]
.target === e); o++);
var h = o + 1,
u = this.offset(e),
d = this.nearestIndex(r.lastBar() - u, C.NearestLeft, h);
if (null == d) return s;
var p = this._lastNonEmptyPlotRow(h),
_ = null !== p && r.contains(p.index),
m = null !== p ? p.value : null,
f = t || _ ? m : this.data().valueAt(d);
if (!f || !isNumber(f[h])) return s;
var g = {
noData: !1
},
b = f[h];
i && (g.price = b);
var v = this.firstValue(!0);
if (!isNumber(v)) return s;
g.text = this.priceScale().formatPrice(b, v), g.formattedPriceAbsolute =
this.priceScale().formatPriceAbsolute(b), g.formattedPricePercentage =
this.priceScale().formatPricePercentage(b, v);
const S = F(this.metaInfo(), this.properties(), e).getPlotPointStyle(f)
.colors[V.Main];
return g.color = S || n.color.value(), g.floatCoordinate = this.priceScale()
.priceToCoordinate(b, v), g.coordinate = g.floatCoordinate, g.item = f,
g
}
isFailed() {
return this._status.type === N.Error
}
isLoading() {
return this._status.type === N.Loading
}
series() {
return this._series
}
model() {
return this._model
}
clearData() {
this._invalidateLastNonEmptyPlotRowCache(), this.data().clear(), this
._graphics.clear && this._graphics.clear(), this._plotOffsets = {}
}
onTagsChanged() {
return this._tagsChanged
}
properties() {
return this._properties
}
state(e, t) {
var i = {
type: TradingView.className(this.constructor),
id: this.id(),
state: this.properties().state(),
zorder: this.zorder(),
ownFirstValue: this.isVisible() ? null : this._ownFirstValue
};
this.metaInfo() instanceof x ? i.metaInfo = TradingView.clone(this
.metaInfo().state()) : (i.metaInfo = TradingView.clone(this
.metaInfo()),
i.metaInfo.id = x.parseIdString(i.metaInfo.id + (i.metaInfo
.version ? "-" + i.metaInfo.version : "")).fullId), e && (i
.data = this.data().state(), i.data.symbols = this._resolvedSymbols,
i.data.graphics = _(this.graphics()), i.data.plotOffsets = this
._plotOffsets), this.ownerSource() && (i.ownerSource = this
.ownerSource().id());
for (var s = 0; s < this._metaInfo.inputs.length; s++)
if ("bar_time" === this._metaInfo.inputs[s].type) {
var r = this._metaInfo.inputs[s].id,
n = i.state.inputs[r];
if (n < 0) {
var o = this._rightOffsetToUnixTime(-n);
i.state.inputs[r] = o && o >= 0 ? o : 0
}
} return this._isChildStudy && x.patchChildStudyMetaInfoState(i), i
}
_plotsForAlert() {
var e = this,
t = this._metaInfo,
i = [I.isLinePlot, I.isShapesPlot, I.isCharsPlot, I.isArrowsPlot, I
.isOhlcPlot, I.isAlertConditionPlot
];
return t.plots.map((function(e, t) {
return e.pinePlotIndex = t, e
})).filter((function(e) {
return i.some((function(t) {
return t(e)
}))
})).map((function(i) {
var s = {
id: i.id,
type: i.type,
pinePlotIndex: i.pinePlotIndex,
offset: e.offset(i.id)
};
return t.styles && void 0 !== t.styles[i.id] && (s.title = t
.styles[i.id].title || "", s.text = t.styles[i.id]
.text || ""), i.target && t.ohlcPlots && t
.ohlcPlots[i.target] && (s.ohlcTitle = t.ohlcPlots[i
.target].title), s
}))
}
_collectDepsForAlert() {
throw new Error("Not implemented")
}
idForAlert() {
return D.prototype.idForAlert.call(this)
}
dependenciesForAlerts() {
throw new Error("Not implemented")
}
_hasAvailableAlertPlots() {
return !1
}
_hasAlertablePlots() {
return (this.metaInfo().plots || []).some((function(e) {
return "line" === e.type
}))
}
_hasAlertConditions() {
if (this.metaInfo().plots.some(I.isAlertConditionPlot)) return !0;
var e = this.stateForAlert();
return Boolean(e.alerts && e.alerts.conditions)
}
_hasAlertFunction() {
const e = this.metaInfo();
return Boolean(e.hasAlertFunction)
}
_isAlertFeatureEnabled() {
return !1
}
hasStateForAlert() {
return this._isAlertFeatureEnabled() && !this.isFailed() && (this.metaInfo()
.isTVScript ? this._hasAlertConditions() || this
._hasAvailableAlertPlots() || this._hasAlertFunction() : this
._hasAlertablePlots())
}
stateForAlert() {
throw new Error("Not implemented")
}
isSavedInStudyTemplates() {
for (var e = 0; e < this._metaInfo.inputs.length; e++)
if ("bar_time" === this._metaInfo.inputs[e].type) return !1;
return !0
}
restoreData(e) {
this._invalidateLastNonEmptyPlotRowCache(), this.data().restoreState(e),
this._resolvedSymbols = e.symbols, this._graphics = e.graphics ? p(e
.graphics) : d(), this._postProcessGraphics(), this._plotOffsets = e
.plotOffsets, this._status = {
type: N.Completed
}
}
restart(e) {
this._restarting = !0, this.clearData(), (e || k.enabled(
"stop_study_on_restart")) && this.stop(), setTimeout(this.start
.bind(this), 0)
}
stop(e) {
if (!0 === e && this._children)
for (var t = 0; t < this._children.length; ++t) this._children[t].stop(!
0);
this._stopStudyOnServer(), this.clearData(), this._unsubscribeToSessionId(),
this.recalculate()
}
_allInputsAreValid() {
for (var e = 0; e < this._metaInfo.inputs.length; e++)
if ("bar_time" === this._metaInfo.inputs[e].type) {
var t = this._metaInfo.inputs[e].id,
i = this._properties.inputs[t].value();
if (void 0 === i || null == i) return !1
} return !0
}
sourceId() {
return this._studyId
}
parentSource() {
return this._source || this._series
}
symbolSource() {
return this.parentSource().symbolSource()
}
source() {
return this.parentSource()
}
ownerSource() {
return this._isChildStudy ? this._source : D.prototype.ownerSource.call(
this)
}
getAllOwnerSources() {
for (var e = [], t = this.ownerSource(); null != t;) e.push(t), t = t
.ownerSource();
return e
}
isChildStudy() {
return !!this._isChildStudy
}
setChild(e) {
e instanceof J && e.source() === this && (this._children || (this
._children = []), -1 === this._children.indexOf(e) && this
._children.push(e))
}
unsetChild(e) {
if (e instanceof J && e.source() === this && this._children) {
var t = this._children.indexOf(e);
~t && this._children.splice(t, 1)
}
}
hasChildren() {
return !(!this._children || !this._children.length)
}
getAllChildren() {
if (!Array.isArray(this._children)) return [];
for (var e = this._children.slice(), t = 0; t < e.length; ++t)
for (var i = e[t].getAllChildren(), s = 0; s < i.length; ++s) ~e
.indexOf(i[s]) || e.push(i[s]);
return e
}
_debugId() {
var e = [];
return this._studyId && e.push(this._studyId), e.push(this._metaInfo
.fullId), e.push(this._metaInfo.description), JSON.stringify({
study: e
})
}
isStarted() {
return !!this._studyId
}
_isStopped() {
return !this.isStarted()
}
isRestarting() {
return !!this._restarting
}
start(e, t) {
var i = this._model.mainSeries();
if (!i.isStarted()) return void i.dataEvents().completed().subscribe(this, (
function() {
this.start(e, t)
}), !0);
this._isChildStudy && this._source.isHibernated() && this._source.start();
const s = !(!this._isChildStudy && !this.hasChildren() && !this
.isVisible()) || !0 === t;
this._chartApi && this._chartApi.connected() && s && this
._allSymbolsAreResolved().then(function() {
this._startAfterSymbolsResolved(e, t)
}.bind(this)).catch(function(e) {
H.logError("ERROR: " + this._debugId() + " start failed, " + e),
delete this._restarting
}.bind(this))
}
_getStudyIdWithLatestVersion() {
var e = x.cutDollarHash(this._metaInfo.id),
t = e;
return e.indexOf("@tv-scripting") >= 0 ? t += "-101!" : t += "-" + this
._metaInfo.version, t
}
_startAfterSymbolsResolved(e, t) {
if (!this.isStarted() || this._restarting) {
if (this._isChildStudy) {
if (!this._source.isStarted() || this._source.isRestarting())
return void this._source.onStart.subscribe(this, this
._startAfterSymbolsResolved, !0);
x.setChildStudyMetaInfoPropertiesSourceId(this._metaInfo, this
._source.sourceId(), this._properties)
}
if (delete this._restarting, this._allInputsAreValid() && (this
._inputs = this.inputs({
keepOptionalSymbolsEmpty: !0
}), this._createStudyOnServer(), this._subscribeToSessionId(),
this.onStart.fire(), !0 === e && this._children))
for (var i = 0; i < this._children.length; ++i) this._children[i]
.start(!0, t)
}
}
_createStudyOnServer() {
var e = this._getStudyIdWithLatestVersion();
this._studyId = E(), this._incrementTurnaround(), this._studyName = e,
this._chartApi.createStudy(this._studyId, this._turnaround, this
._isChildStudy ? this._source.sourceId() : this._series
.seriesSource().instanceId(), this._studyName, this._inputs, this
._handler, this._isChildStudy)
}
_modifyStudyOnServer(e) {
this._chartApi.modifyStudy(this._studyId, this._turnaround, e, this
._handler)
}
_stopStudyOnServer() {
this._chartApi && this._chartApi.connected() && this.isStarted() && this
._chartApi.removeStudy(this._studyId, this._isChildStudy), this
._studyId = null
}
_rightOffsetToUnixTime(e) {
var t = null;
if (this._series.bars().size() >= e) {
var i = o(this._series.bars().lastIndex()) - e;
t = o(this._series.bars().valueAt(i))[TradingView.TIME_PLOT]
}
return t
}
inputsForAlert() {
var e = this.offset(),
t = this.inputs();
return e && t.push(e), t
}
inputsForAlertState() {
return this.inputs()
}
_prepareInputValue(e, t) {
var i = e.id;
if (t.valuesAsIsFromProperties) return this._properties.inputs[i].value();
if ("symbol" === e.type) {
var s = t && t.symbolsForDisplay,
r = this._properties.inputs[i].value(),
n = s ? r : this._getSymbolForApi(r),
o = this._resolvedSymbols && this._resolvedSymbols[this
._getSymbolForResolve(n)];
if ("" === n && e.optional) {
if (t && t.keepOptionalSymbolsEmpty) return n;
n = this._model.mainSeries().symbol(), o = this._model.mainSeries()
.symbolInfo()
}
if (s)
if (o)
if (z) {
switch (this._model.mainSeries().properties()
.statusViewStyle.symbolTextSource.value()) {
case "description":
n = o.description;
break;
case "ticker-and-description":
n = `${o.name}, ${o.description}`;
break;
case "ticker":
n = o.name
}
} else n = l(o, t.noExchanges);
else G && (n = "");
else o && (n = o.ticker || o.full_name), !this.isPine() && t && t
.symbolsForChartApi && (n = this.getSymbolString(n));
return n
}
if ("bar_time" === e.type) {
var a = this._properties.inputs[i].value();
if (a < 0) {
var c = this._rightOffsetToUnixTime(-a);
a = c && c >= 0 ? c : a
}
return a
}
if (this._metaInfo.isTVScript || this._metaInfo.pine) {
if ("text" === i) return this._metaInfo.defaults.inputs.text;
if ("pineId" === i) return this._metaInfo.scriptIdPart;
if ("pineVersion" === i) return this._metaInfo.pine ? this._metaInfo
.pine.version : "-1";
if ("color" === e.type && this._metaInfo.isRGB) {
var h = this._properties.inputs[i].value();
return j(h)
}
return this._properties.inputs[i].value()
}
return this._properties.inputs[i].value()
}
_rebindToSource(e, t) {
var i = this.parentSource();
if (this._isChildStudy) {
var s;
this._source.unsetChild(this);
var r = null;
if (e === this._model.mainSeries()) delete this._source, delete this
._isChildStudy, delete this._ownerSource, s = this._series
.seriesSource().instanceId(), r = g
.REBIND_STUDY_CHILD_TO_STANDALONE;
else {
if (!(e instanceof J)) return H.logError(
"Unable to rebind study to source of this type"), !1;
this._ownerSource = e, this._source = e, s = this._source
.sourceId(), this._source.setChild(this), this._source
.isHibernated() && this._source.start()
}
this._incrementTurnaround(), this.disablePriceRangeReady(), this
._chartApi.rebindStudy(this._studyId, this._turnaround, s, this
._studyName, t, this._handler, r)
} else {
if (!(e instanceof J)) return H.logError(
"Unable to rebind study to source of this type"), !1;
var n = e.isHibernated();
n && e.start();
var o = !1;
if (this._canCreateStudyWithRebindType(g
.REBIND_STUDY_STANDALONE_TO_CHILD) && (this
._incrementTurnaround(), this.disablePriceRangeReady(), o = this
._chartApi.rebindStudy(this._studyId, this._turnaround, e
.sourceId(), this._studyName, t, this._handler, g
.REBIND_STUDY_STANDALONE_TO_CHILD)), !o) return n && e
.stop(), !1;
this._isChildStudy = !0, this._ownerSource = e, this._source = e, this
._source.setChild(this), this._childStudyByRebind.fire()
}
var a = this.m_priceScale,
l = e.priceScale();
if (a !== l) {
var c = this._model.paneForSource(this),
h = this._model.paneForSource(e);
c === h && h.move(this, l, !0)
}
const u = this.parentSource();
return i.formatterChanged().unsubscribe(this, this
._onSourceFormatterChanged), u.formatterChanged().subscribe(this,
this._onSourceFormatterChanged), i.priceStepChanged().unsubscribe(
this, this._onSourcePriceStepChanged), u.priceStepChanged()
.subscribe(this, this._onSourcePriceStepChanged), i.currencyChanged()
.unsubscribeAll(this), u.currencyChanged().subscribe(this, this
._onSourceCurrencyChanged), i.unitChanged().unsubscribeAll(this), u
.unitChanged().subscribe(this, this._onSourceUnitChanged), i
.priceRangeReadyChanged().unsubscribeAll(this), u
.priceRangeReadyChanged().subscribe(this, this
._onSourcePriceRangeReadyChanged), this
._recreatePriceFormattingDependencies(), !0
}
childStudyByRebind() {
return this._childStudyByRebind
}
_changeInputsImpl(e, t) {
var i = this.source(),
s = this._properties.inputs && this._properties.inputs.state(),
r = x.getSourceIdByInputs(this._metaInfo.inputs, s),
n = !0;
if (r)
if ("high" === r || "open" === r || "low" === r || "close" === r ||
"hl2" === r || "ohl3" === r || "ohlc4" === r) i = this._model
.mainSeries();
else
for (var o = this._model.dataSources().filter((function(e) {
return e instanceof J && e.canHaveChildren()
})), a = 0; a < o.length; ++a)
if (o[a].sourceId() === r) {
i = o[a];
break
} if (i !== this.source()) {
if (!this._rebindToSource(i, e) && s)
for (var l in t)
if (t.hasOwnProperty(l) && t[l] !== e[l] && 0 === e[l].indexOf(
r)) {
var c = this._properties.inputs[l],
h = t[l];
c.setValue(h), n = !1;
break
}
} else this._incrementTurnaround(), this.disablePriceRangeReady(), this
._modifyStudyOnServer(e);
this.invalidateTitleCache(), n && (this._studyModified = n)
}
_incrementTurnaround() {
this._turnaround = "st" + ++this._turnaroundCounter
}
_tryChangeInputs() {
var e = TradingView.clone(this._inputs);
this.isStarted() && this._chartApi.connected() ? this._allInputsAreValid() ?
this._allSymbolsAreResolved().then(function() {
var t = this.inputs({
keepOptionalSymbolsEmpty: !0
});
const i = JSON.stringify(t) !== JSON.stringify(this._inputs);
this._isStopped() ? i && this.disablePriceRangeReady() : i && (
this._changeInputsImpl(t, e), this._inputs = t)
}.bind(this)).catch(function(e) {
H.logError("ERROR: " + this._debugId() +
" _tryChangeInputs: cannot modify study, " + e)
}.bind(this)) : this.stop() : (this.stop(!0), this.start(!0)), this
._tagsChanged.fire()
}
testInputValue(e, t) {
if (!x.canBeChild(this._metaInfo) || !x.isSourceInput(e)) return !0;
var i = this._properties.inputs && this._properties.inputs[e.id];
if (!i) return !0;
var s = J.getInputRebindType(e, i.value(), t);
return !!this._canCreateStudyWithRebindType(s)
}
_canCreateStudyWithRebindType(e) {
return e !== g.REBIND_STUDY_STANDALONE_TO_CHILD || this._chartApi
.isCanCreateStudy(!0)
}
changeStyles() {
var e = void 0 !== this._metaInfo.inputs.find((function(e) {
return "symbol" === e.type
}));
!this.isStarted() && !e || this._restarting || (this._inputs ? this
._tryChangeInputs() : this._chartApi && this._chartApi
.connected() && this.restart())
}
_recreatePaneViews() {
this.hasBarColorer() && this._model.mainSeries().invalidateBarStylesCache(),
this._createViews(), this.recalculate(!0), this.updateAllViews()
}
_onPropertiesChanged() {
this.changeStyles(), this._recreatePaneViews(), T.emit(
"study_properties_changed", this._id)
}
_isModifiedStudyInputs(e) {
if (void 0 === this._oldStudyInputs) return this._oldStudyInputs = e, !0;
var t = Object.keys(this._oldStudyInputs);
return n(t.length === Object.keys(e).length,
"keys quantity should be equal"), t.forEach((function(t) {
n(e.hasOwnProperty(t), "key '" + t +
"' should existing in studyInputs"), this
._oldStudyInputs[t] !== e[t] && (this._oldStudyInputs =
e)
}), this), this._oldStudyInputs === e
}
_pinePatchProps() {
throw new Error("Not implemented")
}
priceLabelText(e) {
var t, i = this._metaInfo.styles,
s = this._metaInfo.ohlcPlots;
i && i[e] && (t = i[e]), s && s[e] && (t = s[e]);
var r = t.title;
return 1 !== this._simplePlotsCount || I.isPlotTitleDefined(r) ? this
._metaInfo.is_price_study && r !== this._metaInfo.shortDescription ?
"" === r ? this._metaInfo.shortDescription : this._metaInfo
.shortDescription + ":" + r : r : this._metaInfo.shortDescription
}
createPriceAxisView(e) {
return new h(this, {
plotIndex: e
})
}
createPriceLineAxisView(e) {
return new O(this, e)
}
_concatPriceAxisViews() {
this._priceAxisViews = [].concat(this._priceAxisViewsBase, this
._graphicsPriceAxisViews, this._hlinesPriceAsisViews, this
._horizlinesPriceAsisViews)
}
recalculate(e) {
var t = this._model.paneForSource(this);
this._model.recalculatePane(t, e), this._model.updateSource(this)
}
data() {
return this.m_data
}
metaInfo() {
return this._metaInfo
}
graphicsInfo() {
return this._metaInfo.graphics
}
graphics() {
return this._graphics
}
turnaround(e) {
var t = this.source();
return !0 === e ? (t === this._series ? t.seriesSource().turnaround() : t
.turnaround(!0)) + "_" + this._turnaround : this._turnaround
}
_checkTurnaround(e) {
return e === this._turnaround || e === this._model.mainSeries()
.seriesSource().turnaround() || e === this.turnaround(!0)
}
_handleStudyError(e) {
this.clearData(), this._setStatus(e), this._statusView.update(), this._model
.updateSource(this)
}
_onStudyLoading() {
this._setStatus({
type: N.Loading,
startTime: Date.now()
}), this._statusView.update(), this._model.updateSource(this)
}
_onStudyError(e) {
var t = "string" == typeof e ? {
error: e.split(":", 2)[0]
} : e;
this._handleStudyError({
type: N.Error,
errorDescription: t
}), this._enablePriceRangeReady()
}
_onStudyCompleted(e) {
this._studyModified && (this.clearData(), this._studyModified = !1), this
._setStatus({
type: N.Completed
}), this._statusView.update();
var t = this._model.paneForSource(this);
this._model.recalculatePane(t), this._updateSources();
var i = B.full();
null !== this._model.appliedTimeFrame().value() && i
.lockVisibleTimeRangeOnResize(), this._model.invalidate(i)
}
onData(e) {
switch (e.method) {
case "study_loading":
this._onStudyLoading();
break;
case "study_error":
this._onStudyError(e.params[2]);
break;
case "study_completed":
if (!this._checkTurnaround(e.params[1])) return;
this._onStudyCompleted(e.params[e.params.length - 1]);
break;
case "data_update":
if (e.params.customId !== this.sourceId() || !this._checkTurnaround(
e.params.turnaround)) return;
n(!!e.params.nonseries, "data.params.nonseries is missing"), this
._onDataUpdate(e.params.plots, e.params.nonseries);
break;
case "clear_data":
this._checkTurnaround(e.params.turnaround) && this.clearData()
}
}
_onDataUpdate(e, t) {
this._studyModified && (this.clearData(), this._studyModified = !1);
var i = a(t.d);
return this._ongoingDataUpdate = this._ongoingDataUpdate.then((function() {
return i
}), (function() {
return i
})).then(this._onDataUnpacked.bind(this, e, t.indexes)), this
._ongoingDataUpdate
}
_onDataUnpacked(e, t, i) {
this._isDestroyed || ("nochange" !== t && this._processPlotOffsets(i), this
.transformData(e), this._mergeData(e), null !== i && (i
.indexes_replace ? (n("nochange" !== t), this._graphics
.replaceIndexesTo(t)) : ("nochange" !== t && this._graphics
.replaceIndexesTo(t), void 0 !== i.graphicsCmds && this
._graphics.processCommands(i.graphicsCmds, this._metaInfo
.graphics))), this._onDataUpdated(e, i, t), this
.priceRangeReady() || this._enablePriceRangeReady())
}
_onDataUpdated(e, t, i) {
if (this.hasBarColorer() && e.length > 0) {
var s = this.barColorer().firstColoredBar(e[0].index);
this._model.mainSeries().invalidateBarStylesCache(s)
}
null !== t && this._postProcessGraphics();
var r = this._model.paneForSource(this);
this._model.recalculatePane(r), this._updateSources()
}
transformData(e) {}
moveData(e) {
this._ongoingDataUpdate = this._ongoingDataUpdate.then(function() {
this._invalidateLastNonEmptyPlotRowCache(), this.data().move(e)
}.bind(this))
}
replaceData(e, t, i) {
this._invalidateLastNonEmptyPlotRowCache(), this.data().remove(e + 1), this
.data().addTail(i, t)
}
_updateSources() {
this._model.updateSource(this), this.hasBarColorer() && this._model
.updateSource(this._model.mainSeries())
}
static processPlotOffsets(e, t) {
t && t.indexes_replace || (e._plotOffsets = t && t.offsets || {})
}
_processPlotOffsets(e) {
J.processPlotOffsets(this, e)
}
_mergeData(e) {
this._invalidateLastNonEmptyPlotRowCache(), this.data().merge(e)
}
_postProcessGraphics() {
this._graphicsPriceAxisViews = f(this), this._concatPriceAxisViews()
}
static offset(e, t) {
var i = 0;
return e._plotOffsets && void 0 !== e._plotOffsets[t] && (i += e
._plotOffsets[t]), void 0 !== e._plotOffsetsMetaInfoOverride[t] ?
i += e._plotOffsetsMetaInfoOverride[t] : e.properties().offsets &&
void 0 !== e.properties().offsets[t] && (i += e.properties().offsets[t]
.val.value()), e.properties().offset && (i += e.properties().offset
.val.value()), i
}
offset(e) {
return J.offset(this, e)
}
paneViews() {
return this.isSourceHidden() ? null : this._paneViews
}
labelPaneViews() {
return this.isSourceHidden() ? null : this._labelPaneViews
}
dataWindowView() {
return this._dataWindowView
}
legendView() {
return this._legendView
}
statusView() {
return this._statusView
}
priceAxisViews(e, t) {
return this.properties().oldShowLastValue && !this.properties()
.oldShowLastValue.value() ? null : e.findTargetPriceAxisViews(this, t,
this._priceAxisViews, this._priceLinesAxisViews)
}
_showLastValueOnPriceScale() {
return this._model.properties().scalesProperties.showStudyLastValue.value()
}
hasBarColorer() {
for (var e = 0; e < this._metaInfo.plots.length; ++e)
if (I.isBarColorerPlot(this._metaInfo.plots[e])) return !0;
return !1
}
barColorer() {
for (var e = null, t = 0; t < this._metaInfo.plots.length; ++t)
if (I.isBarColorerPlot(this._metaInfo.plots[t])) {
var i = new c(this, t);
null == e ? e = i : e.pushBackBarColorer(i)
} if (null == e) throw new Error(
"Cannot create BarColorer: study doesn't have a bar_colorer plot!"
);
return e
}
base() {
return 0
}
_priceScaleByProperties() {
if ("default" === this.properties().precision.value()) return null;
var e = parseInt(this.properties().precision.value());
return isFinite(e) ? Math.pow(10, e) : null
}
_formatterByProperties() {
var e = this._priceScaleByProperties();
return null !== e ? new v(e) : null
}
_priceScaleByMetaInfo() {
var e = this.metaInfo().format,
t = isNumber(e.precision) ? Math.pow(10, e.precision) : void 0;
if ("price" === e.type || "percent" === e.type) return t || 100;
if ("volume" === e.type) {
if (void 0 === e.precision) {
var i = this.series().symbolInfo();
if (null !== i && isNumber(i.volume_precision)) return Math.pow(10,
i.volume_precision)
}
return 1
}
return "inherit" === e.type || H.logWarn("Unsupported format type: " + e
.type), null
}
_formatterByMetaInfo() {
var e = this.metaInfo().format,
t = isNumber(e.precision) ? Math.pow(10, e.precision) : void 0;
switch (e.type) {
case "price":
return new v(t);
case "volume":
var i = e.precision;
if (void 0 === i) {
var s = this.series().symbolInfo();
i = s && isNumber(s.volume_precision) ? s.volume_precision : 0
}
return new S(i);
case "percent":
return new y(t);
case "inherit":
return null;
default:
return H.logWarn("Unsupported format type: " + e.type), null
}
}
_onSourceFormatterChanged() {
null === this._formatter && (null !== this.priceScale() && this.priceScale()
.updateFormatter(), this._formatterChanged.fire())
}
_onSourcePriceStepChanged() {
null === this._priceStep && this._priceStepChanged.fire()
}
_precisionChanged() {
this._recreatePriceFormattingDependencies()
}
_recreatePriceFormattingDependencies() {
this._recreateFormatter(), this._recreatePriceStep()
}
_recreateFormatter() {
this._formatter = this._tryCreateFormatter(), this._formatterChanged.fire(),
null !== this.priceScale() && this.priceScale().updateFormatter(), this
._model.fullUpdate()
}
_recreatePriceStep() {
var e = null,
t = this._tryToGetPriceScale();
null !== t && (e = 1 / t), this._priceStep !== e && (this._priceStep = e,
this._priceStepChanged.fire())
}
_tryToGetPriceScale() {
var e = this._priceScaleByProperties();
return null === e && (e = this._priceScaleByMetaInfo()), e
}
_tryCreateFormatter() {
var e = this._formatterByProperties();
return null === e && (e = this._formatterByMetaInfo()), e
}
formatter() {
return this._formatter || this.parentSource().formatter(!1)
}
priceStep() {
return this._priceStep || this.parentSource().priceStep(!1)
}
setOwnerSource(e) {
super.setOwnerSource(e), this._recreatePriceFormattingDependencies()
}
nearestIndex(e, t, i) {
if (TradingView.isInteger(e)) {
var s = this.data().search(e, t, i);
return null !== s ? s.index : void 0
}
H.logDebug("nearestIndex: incorrect logicalPoint")
}
updateAllViews() {
for (var e = 0; e < this._paneViews.length; e++) this._paneViews[e]
.update();
for (e = 0; e < this._labelPaneViews.length; e++) this._labelPaneViews[e]
.update();
this._dataWindowView.update(), null !== this._legendView && this._legendView
.update(), this._statusView.update();
for (e = 0; e < this._priceAxisViews.length; e++) this._priceAxisViews[e]
.update();
this._priceLinesAxisViews.forEach((function(e) {
e.update()
}))
}
tags() {
return !this._metaInfo || !this._metaInfo.description || this._metaInfo
.isTVScriptStub || this._metaInfo.is_hidden_study || this._metaInfo
.isTVScript && "tv-scripting" === this._metaInfo.productId ? [] : [this
._metaInfo.description
]
}
onExtendedHoursChanged() {
this.restart(!0)
}
hasSymbolInputs() {
for (var e = this._metaInfo.inputs.length; e--;)
if ("symbol" === this._metaInfo.inputs[e].type) return !0;
return !1
}
canOverrideMinTick() {
return !1
}
_subscribeExtendedHours() {
!this._isSubscribedToExtendedHours && this.hasSymbolInputs() && (this
._series.onExtendedHoursChanged().subscribe(this, this
.onExtendedHoursChanged), this._isSubscribedToExtendedHours = !0
)
}
removeByRemoveAllStudies() {
return !0
}
canHaveChildren() {
return void 0 === this._canHaveChildren && (this._canHaveChildren = !!x
.canHaveChildren(this._metaInfo)), this._canHaveChildren
}
static getInputRebindType(e, t, i) {
var s = x.isSourceInput(e);
return s && !~t.indexOf("$") && ~i.indexOf("$") ? g
.REBIND_STUDY_STANDALONE_TO_CHILD : s && ~t.indexOf("$") && !~i.indexOf(
"$") ? g.REBIND_STUDY_CHILD_TO_STANDALONE : 0
}
getPlotFields() {
return this._plotFields
}
getMinFirstBarIndexForPlot(e) {
var t = K(this._properties.styles, e) || K(this._properties.ohlcPlots, e) ||
K(this._properties.filledAreasStyle, e);
if (null === t) return -1 / 0;
var i = this.data().lastIndex();
return null === i ? -1 / 0 : i - t + 1
}
_getPropertyDefinitionsViewModelClass() {
return Promise.resolve(null)
}
getPropertyDefinitionsViewModel() {
if (null === this._definitionsViewModel) {
var e = this;
return e._getPropertyDefinitionsViewModelClass().then((function(t) {
return null === t || e._isDestroyed ? null : (null === e
._definitionsViewModel && (e
._definitionsViewModel = new t(e._model
.undoModel(), e)), e
._definitionsViewModel)
}))
}
return Promise.resolve(this._definitionsViewModel)
}
isPine() {
return void 0 !== this._metaInfo.pine
}
isStandardPine() {
return this.isPine() && x.isStandardPine(this._metaInfo.id)
}
isLinkedToSeries() {
return !0 === this._metaInfo.linkedToSeries
}
_getTelemetryObjectName() {
return "study"
}
_getTelemetryAdditionalData() {
var e = "";
return this._metaInfo.pine && this._metaInfo.pine.version && this._metaInfo
.shortId.indexOf("USER") >= 0 && (e = "_v" + this._metaInfo.pine
.version), {
symbol: this.series().actualSymbol(),
resolution: this.series().interval(),
study: this._metaInfo.shortId + e
}
}
_sendTelemetryReport(e, t, i) {
void 0 === i && (i = this._getTelemetryAdditionalData());
var s = Object.assign(t, {
additional: i
});
(void 0).sendChartReport(e, s)
}
_sendTelemetryCounter(e, t) {
this._sendTelemetryReport(e, {
count: 1
}, t)
}
onAboutToBeDestroyed() {
return this._aboutToBeDestroyed
}
destroy() {
this._aboutToBeDestroyed.fire(), this._isDestroyed = !0, this._legendView &&
this._legendView.destroy(), null !== this._definitionsViewModel && (this
._definitionsViewModel.destroy(), this._definitionsViewModel = null
),
this._properties.precision.listeners().unsubscribe(this, this
._precisionChanged), this._showStudyArgumentsProperty.listeners()
.unsubscribe(this, this.invalidateTitleCache), this._properties
.description.listeners().unsubscribe(this, this.invalidateTitleCache),
this._properties.shortDescription && this._properties.shortDescription
.listeners().unsubscribe(this, this.invalidateTitleCache), this._model
.mainSeries().dataEvents().symbolResolved().unsubscribeAll(this), this
._properties.showInDataWindow.listeners().unsubscribe(this._model, this
._model.fullUpdate), this.hasBarColorer() && this._properties
.visible.listeners().unsubscribe(this._model.mainSeries(), this._model
.mainSeries().invalidateBarStylesCache), this._model.mainSeries()
.dataEvents().symbolResolved().unsubscribe(this, this
._recreatePriceFormattingDependencies), super.destroy()
}
desiredPriceScalePosition() {
return this.metaInfo().isTVScriptStub ? "overlay" : this.metaInfo()
.linkedToSeries ? "as-series" : void 0 === this.metaInfo().priceScale ?
null : ["right", "left", "overlay"][this.metaInfo().priceScale]
}
guiPlotName(e) {
var t = this.properties().styles;
return t && t[e] && t[e].title ? t[e].title.value() : this.title()
}
defaultPlotIdForAlert() {
return this._metaInfo.plots.length ? this._metaInfo.plots[0].id : null
}
formatterChanged() {
return this._formatterChanged
}
copiable() {
return U && !this.isChildStudy()
}
setPriceScale(e) {
super.setPriceScale(e), T.emit("study_event", this.id(),
"price_scale_changed")
}
disconnect() {
this._studyId = null
}
}
TradingView.Study = J, t.Study = J, t.prepareStudyProperties = function(t, s, r, o, a) {
return function(t, s, r, o, a, l) {
var c = function(t, s, r, o) {
var a = i("K4L1");
if (x.versionOf(t) < 1) throw new Error(
"This function cannot work with metainfo of the old format version. Required format version >= 1"
);
var l = TradingView.clone(defaults("study"));
Y(l, t);
var c = x.getStudyPropertyRootName(t),
h = TradingView.clone(defaults(c, o));
h.intervalsVisibilities = TradingView.clone(W), ("Overlay" === t
.shortId || "Compare" === t.shortId) && (h.currencyId =
null, h.unitId = null);
t.isTVScript && t.TVScriptSourceCode !== h.TVScriptSourceCode &&
(h = TradingView.clone(TradingView.factoryDefaults(c, o)));
TradingView.merge(l, h), s && (n(!(s instanceof e),
"propsState should not be an instance of Property"),
TradingView.merge(l, s));
var u = TradingView.clone(t),
d = {};
a.mergeInputsObjPart(d, u.defaults.inputs), a
.mergeInputsObjPart(d, l.inputs), l.inputs = d, delete u
.inputs, delete u.defaults.inputs;
var p = {};
if (TradingView.merge(p, u.defaults), TradingView.merge(p,
TradingView.factoryDefaults(c)), TradingView.merge(p,
l), TradingView.merge(p, u), delete p.defaults, l = p,
null !== r) {
var _ = r.model().studiesColorRotatorFactory()
.getColorRotator(t);
null !== _ && ("Overlay@tv-basicstudies" === t.id ? l
.lineStyle.color = _.getColor(l.lineStyle.color,
t) : TradingView.merge(l, function(e, t) {
for (var i in e.styles) {
var s = e.styles[i].color;
s && (e.styles[i].color = t.getColor(s))
}
return e
}(l, _)))
}
s && TradingView.merge(l.styles, s.styles);
return l
}(t, s, r, o),
h = x.getSourceInputIds(t);
if (h.length > 0) {
var u = h[0];
l instanceof J ? c.inputs[u] = "{pid}$0" : void 0 !== c.inputs[u] &&
-1 !== c.inputs[u].indexOf("$") && (c.inputs[u] = "close")
}
return q(t, a, c)
}(t, s, r, o, x.getStudyPropertyRootName(t), a)
}, t.prepareStudyPropertiesForLoadChart = function(e, t, s, r, n, o) {
return function(e, t, s, r, n, o, a) {
var l = function(e, t, s, r, n) {
var o = i("K4L1");
e.version && s.version && e.version !== s.version && H.logWarn(
"Serialized metaInfo version " + e.version +
" is not equal to the saved state version " + s.version);
var a = TradingView.clone(defaults("study"));
a.intervalsVisibilities = TradingView.clone(W), TradingView
.merge(a, TradingView.factoryDefaults(x
.getStudyPropertyRootName(e))), Y(a, e), TradingView
.merge(a, s), a = n.updateStudyState(a, e, t);
var l = TradingView.clone(t || e);
if (l && x.versionOf(l) >= 1) {
var c = {};
o.mergeInputsObjPart(c, (l.defaults || {}).inputs), o
.mergeInputsObjPart(c, a.inputs), a.inputs = c, delete l
.inputs, l.defaults && delete l.defaults.inputs;
var h = {};
TradingView.merge(h, l.defaults), TradingView.merge(h,
TradingView.factoryDefaults(x
.getStudyPropertyRootName(l))), TradingView
.merge(h, a), delete l.defaults, TradingView.merge(h,
l), a = h
}
return a
}(e, t, s, 0, n);
return q(t || e, o, l)
}(e, t, s, 0, n, x.getStudyPropertyRootName(e))
}
}).call(this, i("tc+8"), i("aIyQ"))
},
GVQo: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return o
}));
var s = i("Eyy1"),
r = i("3ClC"),
n = i("CW80");
function o(e, t) {
if (1 === t.length && Object(r.isStudy)(t[0])) {
const e = t[0];
return {
title: e.title(),
sources: [{
source: Object(s.ensureNotNull)(e.state()),
type: "study"
}]
}
}
const i = {
sources: [],
title: ""
};
return i.sources = t.filter(e => e.copiable() && Object(n.isLineTool)(e)).map(t => {
const i = {
type: "drawing",
geometry: t.geometry(),
source: {
...t.state(!1),
points: t.normalizedPoints()
},
modelId: e
};
return delete i.source.alertId, i
}), i.sources.length > 0 ? (1 === i.sources.length ? i.title = t[0].title && t[0]
.title() : i.title = "Drawings", i) : null
}
},
GhVi: function(e, t, i) {
"use strict";
(function(t) {
function i() {
this._marksByIndex = new Map, this._marksBySpan = [], this.changed = new t, this
.minIndex = void 0, this.maxIndex = void 0
}
i.prototype.reset = function() {
this._resetImpl(), this.changed.fire()
}, i.prototype._resetImpl = function() {
this._marksByIndex = new Map, this._marksBySpan = [], this.minIndex = void 0,
this.maxIndex = void 0, this._cache = void 0
}, i.prototype.merge = function(e) {
if (0 !== e.length) {
var t = e[0].index,
i = e[e.length - 1].index;
t <= this.minIndex && i >= this.maxIndex && this._resetImpl();
for (var s = this._marksBySpan, r = new Set, n = 0; n < e.length; n++) {
var o = (c = e[n]).index,
a = c.span,
l = this._marksByIndex.get(c.index);
if (l) {
if (l.index === c.index && l.span === c.span) {
l.time = c.time;
continue
}
this._removeTickmark(l)
}
}
for (n = 0; n < e.length; n++) {
var c;
o = (c = e[n]).index, a = c.span;
if (!this._marksByIndex.has(c.index)) {
this._marksByIndex.set(o, c);
var h = s[a];
void 0 === h && (h = [], s[a] = h);
var u = 0 === h.length || h[h.length - 1].index < c.index;
s[a].push(c), u || r.add(a)
}
}
this.minIndex = void 0 === this.minIndex ? t : Math.min(this.minIndex, t),
this.maxIndex = void 0 === this.maxIndex ? i : Math.max(this.maxIndex,
i);
for (a = s.length; a--;) s[a] && (s[a].length || delete s[a], r.has(a) && s[
a].sort(this._sortByIndexAsc));
this._cache = void 0, this.changed.fire()
}
}, i.prototype._removeTickmark = function(e) {
var t = e.index;
if (this._marksByIndex.get(t) === e) {
this._marksByIndex.delete(t),
t <= this.minIndex && this.minIndex++, t >= this.maxIndex && this
.maxIndex--, this.maxIndex < this.minIndex && (this.minIndex = void 0,
this.maxIndex = void 0);
var i = this._marksBySpan[e.span],
s = i.indexOf(e); - 1 !== s && i.splice(s, 1)
}
}, i.prototype._sortByIndexAsc = function(e, t) {
return e.index - t.index
}, i.prototype.removeTail = function(e) {
var t = new Map;
this.maxIndex = 0, this._marksByIndex.forEach(function(i, s) {
i.time < e && (t.set(s, i), this.maxIndex = Math.max(this.maxIndex,
s))
}.bind(this)), this._marksByIndex = t
}, i.prototype.addTail = function(e) {
for (var t = 0; t < e.length; t++) e[t].index = this.maxIndex + t + 1;
this.merge(e)
}, i.prototype.indexToTime = function(e) {
var t = this._marksByIndex.get(e);
return t ? new Date(1e3 * t.time) : null
}, i.prototype.density = function() {
var e = this.maxIndex - this.minIndex;
if (0 !== e) return 1e3 * (this._marksByIndex.get(this.maxIndex).time - this
._marksByIndex.get(this.minIndex).time) / e
}, i.prototype.estimateLeft = function(e) {
var t = this.density();
if (t) return (1e3 * this._marksByIndex.get(this.minIndex).time - e) / t
}, i.prototype.nearestIndex = function(e) {
for (var t = this.minIndex, i = this.maxIndex; i - t > 2;) {
if (1e3 * this._marksByIndex.get(t).time === e) return t;
if (1e3 * this._marksByIndex.get(i).time === e) return i;
var s = Math.round((t + i) / 2);
1e3 * this._marksByIndex.get(s).time > e ? i = s : t = s
}
return t
}, i.prototype.build = function(e, t) {
var i = Math.ceil(t / e);
if (this._maxbar === i && this._cache) return this._cache;
this._maxbar = i;
for (var s = [], r = this._marksBySpan.length; r--;)
if (this._marksBySpan[r]) {
var n = s;
s = [];
for (var o = n.length, a = 0, l = this._marksBySpan[r], c = l.length,
h = 1 / 0, u = -1 / 0, d = 0; d < c; d++) {
for (var p = l[d], _ = p.index; a < o;) {
var m = n[a],
f = m.index;
if (!(f < _)) {
h = f;
break
}
a++, s.push(m), u = f, h = 1 / 0
}
h - _ >= i && _ - u >= i && (s.push(p), u = _)
}
for (; a < o; a++) s.push(n[a])
} return this._cache = s, this._cache
}, i.prototype.state = function() {
for (var e = [], t = this._marksBySpan.length; t--;) this._marksBySpan[t] && (
e = e.concat(this._marksBySpan[t]));
return {
marks: e = e.map((function(e) {
return [e.span, e.time, e.index]
})),
version: 2
}
}, i.prototype.restoreState = function(e) {
if (this._marksByIndex = new Map, this._marksBySpan = [], this.maxIndex =
void 0, this.minIndex = void 0, e && e.marks && e.marks.length)
if (2 === e.version) {
var t = e.marks.map((function(e) {
return {
span: e[0],
time: e[1],
index: e[2]
}
}));
this.merge(t)
} else this.merge(e.marks)
}, e.exports.Tickmarks = i
}).call(this, i("aIyQ"))
},
GmZZ: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("fJhV");
class r extends s.LineDataSourceTimeAxisView {
constructor(e) {
super(e, 0)
}
_getBgColor() {
return this._source.properties().linecolor.value()
}
_getAlwaysInViewPort() {
return !1
}
_getIndex() {
const e = this._source.points();
return 0 === e.length ? null : e[0].index
}
}
},
GxN8: function(e, t, i) {
"use strict";
function s(e) {
return Boolean(e.showInObjectTree)
}
i.d(t, "a", (function() {
return s
}))
},
H007: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "RiskRewordEntryPriceProperty", (function() {
return a
})), i.d(t, "RiskRewordStopPriceProperty", (function() {
return l
})), i.d(t, "RiskRewardTargetPriceProperty", (function() {
return c
}));
var s = i("Eyy1"),
r = i("tc+8"),
n = i.n(r);
class o extends n.a {
constructor(e, t) {
super(), this._lineSource = e, this._pointIndex = t
}
value() {
const e = this._lineSource.points()[this._pointIndex].price;
return this._formatAndParsePrice(e)
}
state() {
return this.value()
}
merge(e, t) {
return this.setValue(e), t ? [] : null
}
_formatAndParsePrice(e) {
const t = Object(s.ensureNotNull)(this._lineSource.ownerSource()).formatter();
if (t.parse) {
const i = t.format(e),
s = t.parse(i);
return s.res ? s.value : e
}
return e
}
}
class a extends o {
constructor(e) {
super(e, 0)
}
setValue(e) {
const t = this._lineSource.points()[this._pointIndex];
this._lineSource.startChanging(this._pointIndex, t), t.price = parseFloat("" + e),
this._lineSource.setPoint(this._pointIndex, t), this._lineSource.recalculate(),
this._lineSource.model().updateSource(this._lineSource), this._listeners.fire(
this), this._lineSource.endChanging(!1, !1), this._lineSource
.syncPriceLevels()
}
}
class l extends o {
constructor(e) {
super(e, 1)
}
value() {
const e = this._lineSource.stopPrice();
return this._formatAndParsePrice(e)
}
setValue(e) {
const t = Math.round(Math.abs(e - this._lineSource.entryPrice()) * this._lineSource
.model().mainSeries().base());
this._lineSource.properties().childs().stopLevel.setValue(t), this._lineSource
.syncPriceLevels()
}
}
class c extends o {
constructor(e) {
super(e, 2)
}
value() {
const e = this._lineSource.profitPrice();
return this._formatAndParsePrice(e)
}
setValue(e) {
const t = Math.round(Math.abs(e - this._lineSource.entryPrice()) * this._lineSource
.model().mainSeries().base());
this._lineSource.properties().childs().profitLevel.setValue(t), this._lineSource
.syncPriceLevels()
}
}
},
H0vP: function(e, t, i) {
"use strict";
i.r(t);
var s, r = i("Eyy1");
class n {
constructor(e = o) {
this._paneInvalidationLevel = o, this._leftPriceScalesInvalidationMap = new Map,
this._rightPriceScalesInvalidationMap = new Map, this._invalidationLevel = e
}
fullInvalidation() {
return this._invalidationLevel
}
invalidateAll(e) {
this._invalidationLevel = Math.max(this._invalidationLevel, e)
}
invalidatePane(e) {
this._paneInvalidationLevel = Math.max(this._invalidationLevel, e)
}
invalidatePriceScale(e, t, i) {
const s = "left" === e ? this._leftPriceScalesInvalidationMap : this
._rightPriceScalesInvalidationMap,
r = s.get(t) || o;
s.set(t, Math.max(r, i))
}
invalidationLevelForPane() {
return Math.max(this._paneInvalidationLevel, this._invalidationLevel)
}
getterForPriceScaleInvalidationLevelBySide(e) {
const t = "left" === e ? this._leftPriceScalesInvalidationMap : this
._rightPriceScalesInvalidationMap;
return e => Math.max(t.get(e) || o, this._invalidationLevel)
}
priceScaleSideMaxLevel(e) {
const t = "left" === e ? this._leftPriceScalesInvalidationMap : this
._rightPriceScalesInvalidationMap;
let i = this._invalidationLevel;
return t.size > 0 && t.forEach(e => {
e > i && (i = e)
}), i
}
merge(e) {
this._invalidationLevel = Math.max(this._invalidationLevel, e._invalidationLevel),
this._paneInvalidationLevel = Math.max(this._paneInvalidationLevel, e
._paneInvalidationLevel), e._leftPriceScalesInvalidationMap.forEach((e,
t) => {
const i = this._leftPriceScalesInvalidationMap.get(t) || o;
this._leftPriceScalesInvalidationMap.set(t, Math.max(i, e))
}), e._rightPriceScalesInvalidationMap.forEach((e, t) => {
const i = this._rightPriceScalesInvalidationMap.get(t) || o;
this._rightPriceScalesInvalidationMap.set(t, Math.max(i, e))
})
}
}
i.d(t, "InvalidationLevel", (function() {
return s
})), i.d(t, "defaultInvalidationLevel", (function() {
return o
})), i.d(t, "InvalidationMask", (function() {
return a
})),
function(e) {
e[e.None = 0] = "None", e[e.Cursor = 1] = "Cursor", e[e.Light = 2] = "Light", e[e.Full =
3] = "Full"
}(s || (s = {}));
const o = s.None;
class a {
constructor(e = o) {
this._panesOrderChanged = !1, this._keepVisibleTimeRangeOnResize = !1, this
._timeAxisInvalidationLevel = o, this._invalidatedPanes = new Map, this
._additionalActions = [], this._invalidationLevel = e
}
invalidateAll(e) {
this._invalidationLevel !== e && (this._invalidationLevel = Math.max(this
._invalidationLevel, e), this._invalidatedPanes.forEach(e => {
e.invalidateAll(this._invalidationLevel)
}))
}
invalidateAllPane(e, t) {
this._invalidatedPanes.has(e) || this._invalidatedPanes.set(e, new n(this
._invalidationLevel)), Object(r.ensureDefined)(this._invalidatedPanes.get(
e)).invalidateAll(t)
}
invalidatePriceScale(e, t, i, s) {
this._invalidatedPanes.has(e) || this._invalidatedPanes.set(e, new n(this
._invalidationLevel)), Object(r.ensureDefined)(this._invalidatedPanes.get(
e)).invalidatePriceScale(t, i, s)
}
invalidateTimeScale(e) {
this._timeAxisInvalidationLevel = Math.max(this._timeAxisInvalidationLevel, e)
}
invalidatePanesOrder() {
this._panesOrderChanged = !0
}
lockVisibleTimeRangeOnResize() {
this._keepVisibleTimeRangeOnResize = !0
}
fullInvalidation() {
return this._invalidationLevel
}
maxPaneInvalidation() {
const e = [];
return this._invalidatedPanes.forEach(t => {
e.push(t.fullInvalidation())
}), Math.max(...e, this._invalidationLevel)
}
invalidateForPane(e) {
return this._invalidatedPanes.get(e) || new n(this._invalidationLevel)
}
invalidateForTimeScale() {
return Math.max(this._timeAxisInvalidationLevel, this._invalidationLevel)
}
validationActions() {
return this._additionalActions
}
addValidationAction(e) {
this._additionalActions.push(e)
}
merge(e) {
this._invalidationLevel = Math.max(this._invalidationLevel, e._invalidationLevel),
this._panesOrderChanged = this._panesOrderChanged || e._panesOrderChanged, this
._keepVisibleTimeRangeOnResize = this._keepVisibleTimeRangeOnResize || e
._keepVisibleTimeRangeOnResize, this._invalidatedPanes.forEach(e => {
e.invalidateAll(this._invalidationLevel)
}), e._invalidatedPanes.forEach((e, t) => {
this._invalidatedPanes.has(t) || this._invalidatedPanes.set(t, new n(
this._invalidationLevel)), Object(r.ensureDefined)(this
._invalidatedPanes.get(t)).merge(e)
}), this._timeAxisInvalidationLevel = Math.max(this._timeAxisInvalidationLevel,
e._timeAxisInvalidationLevel);
for (let t = 0; t < e._additionalActions.length; t++) this._additionalActions.push(e
._additionalActions[t])
}
panesOrderInvalidated() {
return this._panesOrderChanged
}
isVisibleTimeRangeLockedOnResize() {
return this._keepVisibleTimeRangeOnResize
}
static cursor() {
return new a(s.Cursor)
}
static light() {
return new a(s.Light)
}
static full() {
return new a(s.Full)
}
static panesOrder() {
const e = a.full();
return e.invalidatePanesOrder(), e
}
static validateAction(e) {
const t = new a;
return t._additionalActions.push(e), t
}
}
},
HGP3: function(e, t, i) {
"use strict";
i.r(t);
var s = i("iR50"),
r = i("RBvv"),
n = i("Eyy1");
const o = {
...s,
...r
},
a = {},
l = Object.keys(o).length,
c = /^#[0-9A-F]{6}$/i;
Object.keys(o).forEach(e => {
const t = function e(t, i = []) {
const s = o[t];
if (!s) return null;
if (c.test(s)) return s;
const r = s;
return i.push(t), -1 !== i.indexOf(r) ? (console.warn(
"Colors definitions cycled"), s) : i.length > l ? (console.warn(
"Too many variables-link in HEX-color search: " + i[0]), null) : e(
r, i)
}(e);
a[e] = Object(n.ensureNotNull)(t)
});
const h = a;
function u(e) {
const t = h[e];
if (!t) throw new Error("No such color " + e);
return t
}
i.d(t, "colorsPalette", (function() {
return h
})), i.d(t, "getHexColorByName", (function() {
return u
}))
},
HGup: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return o
})), i.d(t, "c", (function() {
return a
})), i.d(t, "b", (function() {
return l
}));
var s = i("Eyy1"),
r = i("3u3j");
class n extends r.a {
constructor(e, t, i) {
super(e, t, i)
}
redo() {
const e = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
._sourceId)),
t = Object(s.ensureNotNull)(this._chartModel.paneForSource(e)),
i = this._chartModel.children(e, !0);
t.bulkActionMacro(() => {
i.forEach(e => this._chartModel.detachSource(e)), this._chartModel
.detachSource(e)
});
const r = this._chartModel.createPane(this.targetPaneIndex()),
n = r.findSuitableScale(e);
r.bulkActionMacro(() => {
r.addDataSource(e, n, !1), i.forEach(e => r.addDataSource(e, n, !1))
}), Object(s.ensureNotNull)(e.priceScale()).restoreState(this
._newPriceScaleState(r.isOverlay(e))), this._chartModel.fullUpdate(),
this._chartModel.setShouldBeSavedEvenIfHidden(!0)
}
undo() {
const e = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
._sourceId)),
t = Object(s.ensureNotNull)(this._chartModel.paneForSource(e)),
i = this._chartModel.children(e, !0);
t.bulkActionMacro(() => {
i.forEach(e => this._chartModel.detachSource(e));
const t = this._chartModel.detachSource(e);
Object(s.assert)(t, "Undo of detaching must remove pane")
});
const r = this._chartModel.panes()[this._initialPaneIndex];
let n = r.getPriceScaleById(this._initialPriceScaleId);
null === n && (n = r.createPriceScaleAtPosition(this._initialPriceScalePosition,
this._initialPriceScaleIndex)), r.bulkActionMacro(() => {
r.addDataSource(e, n, !0), i.forEach(e => r.addDataSource(e, n, !1))
}), Object(s.ensureNotNull)(e.priceScale()).restoreState(this
._originalPriceScaleState()), this._chartModel.fullUpdate()
}
}
class o extends n {
constructor(e, t, i) {
super(e, t, i)
}
targetPaneIndex() {
return this._initialPaneIndex + 1
}
}
class a extends n {
constructor(e, t, i) {
super(e, t, i)
}
targetPaneIndex() {
return this._initialPaneIndex
}
}
class l extends n {
constructor(e, t, i) {
super(e, t, i)
}
targetPaneIndex() {
return this._chartModel.panes().length
}
}
},
HLXm: function(e, t, i) {
"use strict";
function s(e) {
"LineToolGannComplex" !== e.type || void 0 !== e.version && 1 !== e.version || (e.type =
"LineToolGannFixed")
}
i.r(t), i.d(t, "migrateState", (function() {
return s
}))
},
"HV/F": function(e, t, i) {
"use strict";
function s(e) {
const t = {};
return {
promise: new Promise((i, s) => {
e.subscribe(t, i, !0)
}),
destroy: () => {
e.unsubscribeAll(t)
}
}
}
i.r(t), i.d(t, "delegateToPromise", (function() {
return s
}))
},
HY7u: function(e, t, i) {},
HZKX: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "defaultContextMenuOptions", (function() {
return Te
})), i.d(t, "createActionAddAlert", (function() {
return Me
})), i.d(t, "createActionTrade", (function() {
return Oe
})), i.d(t, "createActionOrder", (function() {
return Le
})), i.d(t, "createMTPredictorActions", (function() {
return Ae
})), i.d(t, "createLinesAction", (function() {
return Ee
})), i.d(t, "ActionsProvider", (function() {
return ke
}));
var s = i("Eyy1"),
r = i("txPx"),
n = (i("nc0P"), i("ogJP")),
o = i("Kxc7"),
a = i("7KDR"),
l = i("YmeR"),
c = i("Daqx"),
h = i("3ClC"),
u = i("QloM"),
d = i("Qq0B"),
p = i("z61+"),
_ = i("/3z9"),
m = i("L/Ed"),
f = i("cKqi"),
g = i("YzC7"),
b = i("pvsv"),
v = i("GVQo"),
S = i("CW80"),
y = i("/tGj"),
w = i("2uTr"),
P = i("YFKU"),
C = i("//lZ"),
x = i("9uLv");
const T = Object(r.getLogger)("Chart.ActionsProvider"),
I = (Object(P.t)("Add Alert"), Object(P.t)("Add Alert on {series}"), Object(P.t)(
"Add Alert on {drawing}"), Object(w.appendEllipsis)(Object(P.t)(
"Edit {title} Alert"))),
M = Object(P.t)("Extend Alert Lines"),
O = Object(P.t)("Show alert label lines"),
L = Object(P.t)("Hide alert label lines"),
A = (Object(P.t)("Trade"), Object(w.appendEllipsis)(Object(P.t)("Create Limit Order")),
Object(P.t)("Show")),
E = Object(P.t)("Hide"),
k = (Object(P.t)("MTPredictor"), Object(P.t)("Apply Manual Risk/Reward"), Object(P.t)(
"Apply Manual Decision Point"), Object(P.t)("Analyze Trade Setup"), Object(P.t)(
"Apply Elliott Wave"), Object(P.t)("Apply Elliott Wave Intermediate"), Object(P.t)(
"Apply Elliott Wave Major"), Object(P.t)("Apply Elliott Wave Minor"), Object(P.t)(
"Apply WPT Up Wave"), Object(P.t)("Up Wave 1 or A"), Object(P.t)("Up Wave 2 or B"),
Object(P.t)("Up Wave C"), Object(P.t)("Up Wave 3"), Object(P.t)("Up Wave 4"), Object(P
.t)("Up Wave 5"), Object(P.t)("Apply WPT Down Wave"), Object(P.t)(
"Down Wave 1 or A"), Object(P.t)("Down Wave 2 or B"), Object(P.t)("Down Wave C"),
Object(P.t)("Down Wave 3"), Object(P.t)("Down Wave 4"), Object(P.t)("Down Wave 5"),
Object(P.t)("Pinned To Scale {label} (Hidden)")),
D = Object(P.t)("Pinned To Right Scale (Hidden)"),
V = Object(P.t)("Pin To Scale {label} (Hidden)"),
B = Object(P.t)("Pin To Right Scale (Hidden)"),
R = Object(P.t)("Pinned To Scale {label}"),
N = Object(P.t)("Pinned To Right Scale"),
j = Object(P.t)("Pin To Scale {label}"),
F = Object(P.t)("Pin To Right Scale"),
W = Object(P.t)("Pinned To Left Scale (Hidden)"),
H = Object(P.t)("Pin To Left Scale (Hidden)"),
U = Object(P.t)("Pinned To Left Scale"),
z = Object(P.t)("Pin To Left Scale"),
G = Object(P.t)("Pin To New Left Scale"),
q = Object(P.t)("Pin To New Right Scale"),
Y = Object(P.t)("Pin To Scale (Now {label})"),
K = Object(P.t)("Pin To Scale (Now No Scale)"),
J = Object(P.t)("Pin To Scale (Now Left)"),
Z = Object(P.t)("Pin To Scale (Now Right)"),
X = Object(P.t)("No Scale (Fullscreen)"),
$ = Object(P.t)("Move To"),
Q = Object(P.t)("Existing Pane Above"),
ee = Object(P.t)("New Pane Above"),
te = Object(P.t)("Existing Pane Below"),
ie = Object(P.t)("New Pane Below"),
se = Object(P.t)("Bring to Front"),
re = Object(P.t)("Send to Back"),
ne = Object(P.t)("Bring Forward"),
oe = Object(P.t)("Send Backward"),
ae = Object(P.t)("Visual Order"),
le = Object(P.t)("Lines"),
ce = Object(w.appendEllipsis)(Object(P.t)("Add Indicator/Strategy on {studyTitle}")),
he = (Object(w.appendEllipsis)(Object(P.t)("Add Financial metric for {instrumentName}")),
Object(w.appendEllipsis)(Object(P.t)("Settings"))),
ue = Object(P.t)("Apply Default"),
de = Object(w.appendEllipsis)(Object(P.t)("Save As")),
pe = Object(P.t)("Copy"),
_e = Object(P.t)("Clone"),
me = Object(P.t)("Template"),
fe = (Object(P.t)("Sync To All Charts"), Object(P.t)("Go to {lineToolName}")),
ge = Object(P.t)("Unlock"),
be = Object(P.t)("Lock"),
ve = (Object(P.t)("Show Earnings"), Object(P.t)("Show Dividends"), Object(P.t)(
"Show Splits"), Object(P.t)("Show All Ideas")),
Se = Object(P.t)("Show Ideas of Followed Users"),
ye = Object(P.t)("Show My Ideas Only"),
we = Object(w.appendEllipsis)(Object(P.t)("Settings")),
Pe = Object(P.t)("Hide Events on Chart"),
Ce = Object(P.t)("Add this Symbol to Entire Layout"),
xe = Object(P.t)("Add this Indicator to Entire Layout"),
Te = (Object(P.t)("Add this Strategy to Entire Layout"), Object(P.t)(
"Add this Financial Metric to Entire Layout"), {
general: !0,
mainSeries: !0,
mainSeriesTrade: !0,
esdStudies: !0,
studies: !0,
fundamentals: !0,
lineTools: !0,
publishedCharts: !0,
ordersAndPositions: !0,
alerts: !0,
chartEvents: !0,
objectTree: !0,
gotoLineTool: !1
});
function Ie(e) {
return Object(y.isSymbolSource)(e) ? e.symbolTitle(!0, !0) : e.title(!0)
}
function Me(e, t) {
return null
}
function Oe(e, t, i) {
return null
}
function Le(e) {
throw new Error("not supported")
}
function Ae(e, t, i, s) {
return null
}
function Ee(e) {
const t = e.actions(),
i = [t.showPriceLine];
return i.push(t.showHighLowPriceLines), i.push(t.showAverageClosePriceLine), new a.Action({
label: le,
statName: "Lines",
subItems: i
})
}
class ke {
constructor(e, t) {
this._chartWidget = e, this._options = Object(n.merge)(Object(n.clone)(Te), t || {})
}
async contextMenuActionsForSources(e) {
const t = e[0],
i = this._options;
if (t === this._chartWidget.model().mainSeries() && i.mainSeries) return this
._contextMenuActionsForSeries(t);
if (Object(h.isStudy)(t) && i.studies) return this._contextMenuActionsForStudy(t);
if (Object(S.isLineTool)(t) && i.lineTools) {
const t = e.filter(S.isLineTool);
return this._contextMenuActionsForLineTool(t)
}
return []
}
_isReadOnly() {
return this._chartWidget.readOnly()
}
_createActionHide(e) {
return new a.Action({
label: E,
icon: i("dmHa"),
statName: "HideSelectedObject",
onExecute: this._chartWidget.hideDataSources.bind(this._chartWidget, [
e
])
})
}
_createActionShow(e) {
const t = new a.Action({
checkable: !0,
label: A,
icon: i("6ctS"),
statName: "ToggleShow"
}),
s = new l.ActionBinder(t, e.properties().visible, this._chartWidget.model(), A);
return t.setBinding(s), s.setValue(e.properties().visible.value()), t
}
_createActionScale(e) {
const t = Object(s.ensureNotNull)(e.priceScale()),
r = this._chartWidget.model().model(),
n = Object(s.ensureNotNull)(r.paneForSource(e)),
o = n.priceScalePosition(t),
l = ("left" === o ? n.leftPriceScales() : n.rightPriceScales()).indexOf(t),
h = r.priceScaleSlotsCount().totallySlots < 2 ? "dontneedname" : "needname",
u = "overlay" === o ? "" : Object(c.a)(o, l).label,
d = Y.format({
label: u
}),
p = {
"left-needname": d,
"left-dontneedname": J,
"right-needname": d,
"right-dontneedname": Z,
"overlay-needname": K,
"overlay-dontneedname": K
} [o + "-" + h];
return new a.Action({
label: p,
icon: i("/kal"),
subItems: this._createActionScaleItems(e)
})
}
_createActionScaleDetach(e, t, i, r) {
const n = this._chartWidget.model().model(),
o = Object(s.ensureNotNull)(n.paneForSource(e));
if (!o.canCreateNewPriceScale()) return null;
const l = Object(s.ensureNotNull)(e.priceScale()),
h = l.canDetachSource(e),
u = o.priceScalePosition(l),
d = h || u !== t;
if (!d) return null;
const p = n.priceScaleSlotsCount(),
_ = {
left: {
labelled: j,
sided: G
},
right: {
labelled: j,
sided: q
}
},
m = "left" === t ? o.leftPriceScales().length : o.rightPriceScales().length,
f = p[t] > m ? "labelled" : "sided",
g = Object(c.a)(t, m).label,
b = _[t][f].format({
label: g
});
return new a.Action({
checkable: !1,
disabled: !d,
label: b,
statName: r,
payload: e,
onExecute: i
})
}
_onDetachLeft(e) {
const t = e.getPayload(),
i = this._chartWidget.model().model(),
r = Object(s.ensureNotNull)(i.paneForSource(t));
this._chartWidget.model().detachToLeft(t, r)
}
_onDetachRight(e) {
const t = e.getPayload(),
i = this._chartWidget.model().model(),
r = Object(s.ensureNotNull)(i.paneForSource(t));
this._chartWidget.model().detachToRight(t, r)
}
_createActionScaleDetachLeft(e) {
return this._createActionScaleDetach(e, "left", this._onDetachLeft.bind(this),
"ToggleScaleLeft")
}
_createActionScaleDetachRight(e) {
return this._createActionScaleDetach(e, "right", this._onDetachRight.bind(this),
"ToggleScaleRight")
}
_onMoveToScale(e) {
const t = e.getPayload();
if (t.datasource.priceScale() === t.priceScale) return;
const i = this._chartWidget.model().model(),
r = Object(s.ensureNotNull)(i.paneForSource(t.datasource));
this._chartWidget.model().moveToScale(t.datasource, r, t.priceScale, t.undoText)
}
_createMoveToScaleAction(e, t, i, s) {
const r = e.priceScale() === t;
return new a.Action({
checkable: !0,
checked: r,
label: i,
statName: "ToggleScale",
payload: {
datasource: e,
priceScale: t,
undoText: s
},
onExecute: this._onMoveToScale.bind(this)
})
}
_onNoScale(e) {
const t = e.getPayload().datasource,
i = this._chartWidget.model().model(),
r = Object(s.ensureNotNull)(i.paneForSource(t));
r.isOverlay(t) || this._chartWidget.model().detachNoScale(t, r)
}
_createActionNoScale(e) {
const t = this._chartWidget.model().model(),
i = Object(s.ensureNotNull)(t.paneForSource(e)),
r = i.actionNoScaleIsEnabled(e);
return new a.Action({
checkable: !0,
checked: i.isOverlay(e),
label: X,
disabled: !r,
statName: "ToggleNoScale",
payload: {
datasource: e
},
onExecute: this._onNoScale.bind(this)
})
}
_createActionScaleItems(e) {
const t = [],
i = this._chartWidget.model().model(),
r = Object(s.ensureNotNull)(i.paneForSource(e)),
n = i.priceScaleSlotsCount().totallySlots > 1,
o = r.rightPriceScales(),
l = r.leftPriceScales(),
h = this._createActionScaleDetachRight(e),
u = this._createActionScaleDetachLeft(e),
d = o.length + l.length + (null === h ? 0 : 1) + (null === u ? 0 : 1) > 2,
p = {
right: {
hidden: {
checked: {
labelled: k,
sided: D
},
unchecked: {
labelled: V,
sided: B
}
},
visible: {
checked: {
labelled: R,
sided: N
},
unchecked: {
labelled: j,
sided: F
}
}
},
left: {
hidden: {
checked: {
labelled: k,
sided: W
},
unchecked: {
labelled: V,
sided: H
}
},
visible: {
checked: {
labelled: R,
sided: U
},
unchecked: {
labelled: j,
sided: z
}
}
}
},
_ = {
left: r.visibleLeftPriceScales(),
right: r.visibleRightPriceScales()
},
m = (t, i) => {
const s = ("right" === i ? o : l)[t],
r = _[i].includes(s) ? "visible" : "hidden",
a = e.priceScale() === s ? "checked" : "unchecked",
h = n ? "labelled" : "sided",
u = p[i],
d = {
labelled: u.visible.unchecked.labelled,
sided: u.visible.unchecked.sided
},
m = Object(c.a)(i, t).label;
return {
actionText: u[r][a][h].format({
label: m
}),
undoText: d[h].format({
label: m
})
}
};
t.push(...o.map((t, i) => {
const s = m(i, "right");
return this._createMoveToScaleAction(e, t, s.actionText, s.undoText)
})), null !== h && t.push(h);
d && (o.length > 0 || null !== h) && t.push(new a.Separator);
t.push(...l.map((t, i) => {
const s = m(i, "left");
return this._createMoveToScaleAction(e, t, s.actionText, s.undoText)
})), null !== u && t.push(u);
d && (l.length > 0 || null !== u) && t.push(new a.Separator);
return t.push(this._createActionNoScale(e)), t
}
_createVisualOrderAction(e) {
const t = this._chartWidget.model(),
s = t.availableZOrderOperations(e),
r = [new a.Action({
label: se,
statName: "BringToFront",
disabled: !s.bringToFrontEnabled,
onExecute: () => t.bringToFront(e)
}), new a.Action({
label: re,
statName: "SendToBack",
disabled: !s.sendToBackEnabled,
onExecute: () => t.sendToBack(e)
}), new a.Action({
label: ne,
statName: "BringForward",
disabled: !s.bringForwardEnabled,
onExecute: () => t.bringForward(e)
}), new a.Action({
label: oe,
statName: "SendBackward",
disabled: !s.sendBackwardEnabled,
onExecute: () => t.sendBackward(e)
})];
return new a.Action({
label: ae,
icon: i("9dnG"),
statName: "VisualOrder",
subItems: r
})
}
_createActionMergeUp(e) {
const t = this._chartWidget.model();
return t.model().isMergeUpAvailableForSource(e) ? new a.Action({
label: Q,
statName: "MergeUp",
onExecute: () => t.mergeSourceUp(e)
}) : null
}
_createActionUnmergeUp(e) {
const t = this._chartWidget.model();
return t.model().isUnmergeAvailableForSource(e) ? new a.Action({
label: ee,
statName: "UnmergeUp",
onExecute: () => t.unmergeSourceUp(e)
}) : null
}
_createActionMergeDown(e) {
const t = this._chartWidget.model();
return t.model().isMergeDownAvailableForSource(e) ? new a.Action({
label: te,
statName: "MergeDown",
onExecute: () => t.mergeSourceDown(e)
}) : null
}
_createActionUnmergeDown(e) {
const t = this._chartWidget.model();
return t.model().isUnmergeAvailableForSource(e) ? new a.Action({
label: ie,
statName: "UnmergeDown",
onExecute: () => t.unmergeSourceDown(e)
}) : null
}
_mergeContentMenuItems(e) {
return [this._createActionMergeUp(e), this._createActionUnmergeUp(e), this
._createActionMergeDown(e), this._createActionUnmergeDown(e)
].filter(n.notNull)
}
_createActionMove(e) {
const t = this._mergeContentMenuItems(e);
return t.length > 0 ? new a.Action({
label: $,
icon: i("BBCR"),
subItems: t
}) : null
}
_contextMenuActionsForSeries(e) {
const t = [],
i = e.properties().visible.value(),
r = this._chartWidget.model().model(),
n = (Object(s.ensureNotNull)(r.paneForSource(e)), this._chartWidget.actions());
if (this._isReadOnly()) t.push(i ? this._createActionHide(e) : this
._createActionShow(e)), t.push(new a.Separator), t.push(this
._createActionScale(e));
else {
0,
t.length > 0 && !(t[t.length - 1] instanceof a.Separator) && t.push(new a
.Separator),
o.enabled("symbol_info") && t.push(n.showSymbolInfoDialog);r.mainSeries()
.symbolInfo();0,
t.length > 0 && !(t[t.length - 1] instanceof a.Separator) && t.push(new a
.Separator),
t.push(this._createVisualOrderAction([e]));
const s = this._createActionMove(e);null !== s && t.push(s),
t.push(this._createActionScale(e)),
t.push(i ? this._createActionHide(e) : this._createActionShow(e)),
t.push(new a.Separator),
t.push(Ee(this._chartWidget)),
t.push(new a.Separator);window.widgetbar && (!window.widgetbar._customization ||
window.widgetbar._customization.watchlist) && n.addToWatchlist && t.push(n
.addToWatchlist),
o.enabled("text_notes") && t.push(n.addToTextNotes),
t[t.length - 1] instanceof a.Separator || t.push(new a.Separator),
t[t.length - 1] instanceof a.Separator && t.pop()
}
return t
}
_createActionAddChildStudy(e) {
const t = this._chartWidget.model().model();
return new a.Action({
label: ce.format({
studyTitle: Ie(e)
}),
icon: i("CwKc"),
statName: "ApplyIndicator",
onExecute: () => {
const i = this._chartWidget.showIndicators(Object(h.isStudy)(
e) ? e : void 0);
if (i && Object(h.isStudy)(e)) {
const e = () => {
trackEvent("SOS", "Apply SOS", "Apply by RC menu")
},
s = t.studyInserted();
s.subscribe(this, e), i.visible().subscribe(t => {
t || s.unsubscribe(this, e)
}, {
once: !0
})
}
}
})
}
_createActionAddFundamentals(e) {
return null
}
_createActionShowSymbolInfoDialog(e, t) {
return new a.Action({
label: Object(w.appendEllipsis)(Object(P.t)("Symbol Info")),
icon: i("1pHB"),
checkable: !1,
statName: "SymbolInfo",
onExecute: () => {
const i = e.symbol(),
s = {
symbolInfo: e.symbolInfo(),
unitName: e => t.name(e)
};
Object(b.showSymbolInfoDialog)(i, s)
}
})
}
_createActionShowProperties(e) {
return new a.Action({
label: he,
icon: i("MXV9"),
statName: "EditSelectedObject",
onExecute: () => this._chartWidget.showSourceProperties(e)
})
}
_contextMenuActionsForStudy(e) {
const t = this._chartWidget.actions(),
i = e.properties().visible.value(),
s = [];
if (!e.userEditEnabled()) return s;
if (this._chartWidget.readOnly()) s.push(i ? this._createActionHide(e) : this
._createActionShow(e)), s.push(new a.Separator), e.constructor instanceof d
.NonSeriesStudy || s.push(this._createActionScale(e));
else {
0,
o.enabled("study_on_study") && e.canHaveChildren() && s.push(this
._createActionAddChildStudy(e));
const r = this._createApplyToEntireLayoutCommand(e);
if (null !== r && s.push(r), s.length > 0 && !(s[s.length - 1] instanceof a
.Separator) && s.push(new a.Separator), o.enabled("symbol_info") && (
e instanceof g.a || e instanceof f.study_Overlay) && null !== e
.symbolInfo() && (s.push(this._createActionShowSymbolInfoDialog(e, this
._chartWidget.model().model().availableUnits())), s.push(new a
.Separator)), s.push(this._createVisualOrderAction([e])), !(e
.constructor instanceof d.NonSeriesStudy)) {
const t = this._createActionMove(e);
null !== t && s.push(t), s.push(this._createActionScale(e))
}
s.push(new a.Separator);
const n = e.metaInfo();
if (e.copiable()) {
const t = new a.Action({
label: pe,
shortcutHint: Object(_.humanReadableHash)(_.Modifiers.Mod + 67),
statName: "Copy",
onExecute: () => {
this._chartWidget.chartWidgetCollection().clipboard
.uiRequestCopy([e])
}
});
s.push(t)
}
s.push(i ? this._createActionHide(e) : this._createActionShow(e)),
s.push(t.studyRemove),
s.push(new a.Separator),
o.enabled("property_pages") && new p.a(n).hasUserEditableOptions() && s.push(
this._createActionShowProperties(e)),
s[s.length - 1] instanceof a.Separator && s.pop()
}
return s
}
_createEditAlertDrawingAction(e) {
return new a.Action({
label: I.format({
title: e.title()
}),
icon: TbbiEditAlertSvg,
statName: "EditAlert",
onExecute: () => {
window.runOrSignIn(() => {
e.editAlert("pane_context_menu_edit_alert")
}, {
source: "Alert edit from pane context menu"
})
}
})
}
_createLineToolTemplateAction(e) {
if (!window.lineToolPropertiesToolbar) return null;
const t = window.lineToolPropertiesToolbar.templatesList();
return void 0 === t ? null : new a.ActionAsync(() => {
const i = [],
s = new a.Action({
label: de,
statName: "SaveAs",
onExecute: () => {
t.showSaveDialog(i => {
const s = JSON.stringify(e.template());
t.saveTemplate(i, s)
})
}
});
i.push(s);
const r = new a.Action({
label: ue,
statName: "ApplyDefault",
onExecute: () => {
this._chartWidget.model()
.restorePropertiesForSource(e), window
.lineToolPropertiesToolbar.onSourceChanged(e)
}
});
return i.push(r), new Promise(e => {
t.templatesLoaded().then(() => {
const e = t.getData();
e.length > 0 && i.push(new a.Separator), e
.forEach((e, s) => {
const r = new a.Action({
label: e,
statName: "ApplyTemplate",
onExecute: () => t
.loadTemplate(e),
toolbox: {
type: m.ToolboxType
.Delete,
action: () => {
t.deleteAction(
e)
}
},
showToolboxOnHover: !0
});
i.push(r)
})
}, e => {
T.logWarn(e)
}).then(() => {
e({
label: me,
statName: "Template",
subItems: i
})
})
})
})
}
_createActionToggleLockObject(e) {
const t = e.properties().frozen.value();
return new a.Action({
label: t ? ge : be,
statName: "ToggleLockSelectedObject",
checkable: !0,
icon: i(t ? "fs3R" : "qckB"),
onExecute: () => this._chartWidget.toggleLockSelectedObject()
})
}
async _contextMenuActionsForLineTool(e) {
const t = [],
r = this._chartWidget.actions(),
l = this._chartWidget.model().model(),
c = () => {
t.push(this._createVisualOrderAction(e))
},
h = () => {
const s = e.filter(e => e.cloneable());
if (s.length > 0) {
const e = new a.Action({
label: _e,
icon: i("K8V9"),
shortcutHint: Object(_.humanReadableModifiers)(_.Modifiers
.Mod) + "Drag",
doNotBindShortcut: !0,
statName: "Clone",
onExecute: () => this._chartWidget.model().cloneLineTools(s,
!1)
}, "Clone");
t.push(e)
}
return !!s.length
},
u = () => {
const i = e.filter(e => e.copiable());
if (i.length > 0) {
const e = new a.Action({
label: pe,
shortcutHint: Object(_.humanReadableHash)(_.Modifiers.Mod +
67),
statName: "Copy",
onExecute: () => this._chartWidget.chartWidgetCollection()
.clipboard.uiRequestCopy(i)
}, "Copy");
t.push(e)
}
return !!i.length
},
d = e => {
const i = new a.Action({
label: fe.format({
lineToolName: e.title()
}),
statName: "GoToLineTool",
checkable: !1,
onExecute: async t => {
const i = l.timeScale().logicalRange();
if (null === i) return;
const r = this._chartWidget.model(),
o = l.timeScale().barSpacing();
let a = i.left();
const c = e.points().map(e => e.index);
let h = l.timeScale().points().firstIndex();
const u = l.timeScale().points().lastIndex();
if (null === h || null === u) return;
const d = i.length() / 2;
if (0 === c.length || c.some(e => i.contains(e)))
return;
const p = () => {
const t = e.points().map(e => e.index),
i = t.filter(e => e <= u).reduce((e, t) =>
null === e ? t : Math.max(e, t), null);
return null !== i ? i : t.reduce((e, t) => Math
.min(e, t))
};
let _, m = p();
if (h - d > m) {
const t = e.points().map(e => e.time).filter(n
.notUndefined).map(e => e.valueOf() / 1e3);
if (0 === t.length) return;
const i = t.reduce((e, t) => Math.min(e, t), t[0]);
await l.gotoTime(i), m = p();
a = Object(s.ensureNotNull)(l.timeScale()
.logicalRange()).left(), h = Object(s
.ensureNotNull)(l.timeScale().points()
.firstIndex())
}
h - d > m ? (_ = (a - h + d) * o, l.mainSeries()
.setGotoDateResult({
timestamp: Object(s.ensureNotNull)(l
.timeScale().points().valueAt(h)
),
eod: !0
})) : _ = (a - m + 1 + d) * o, r
.startScrollTime(0), Object(C.doAnimate)({
onStep: (e, t) => r.scrollTimeTo(t),
from: 0,
to: Math.round(_),
easing: x.c.easeInOutCubic,
duration: x.b,
onComplete: () => r.endScrollTime()
})
}
});
t.push(i)
};
if (1 === e.length) {
const i = e[0];
if (this._chartWidget.readOnly()) t.push(r.lineHide);
else if (i.userEditEnabled()) {
if (o.enabled("alerts") && !this._chartWidget.onWidget() && i.hasAlert && i
.hasAlert.value() && (t.push(this._createEditAlertDrawingAction(i)), t
.push(new a.Separator)), !o.enabled("charting_library_base")) {
const e = this._createLineToolTemplateAction(i);
null !== e && t.push(e)
}
c(), this._options.objectTree && r.paneObjectTree && t.push(r
.paneObjectTree), t.push(new a.Separator);
let e = h();
e = u() || e, e = e, e && t.push(new a.Separator), t.push(this
._createActionToggleLockObject(i)), t.push(r.lineHide), t.push(r
.lineRemove), i.points().length > 0 && this._options.gotoLineTool &&
(t.push(new a.Separator), d(i));
const s = await this._chartWidget.propertiesDefinitionsForSource(i);
if (o.enabled("property_pages") && null !== s && (t.push(new a.Separator), t
.push(r.format)), i.additionalActions) {
t.push(new a.Separator);
const e = i.additionalActions(this._chartWidget.model());
t.push(...e)
}
}
} else this._options.objectTree && r.paneObjectTree && t.push(r.paneObjectTree),
c(), t.push(new a.Separator), h(), u(), t.push(new a.Separator), t.push(r
.lineHide),
t.push(r.lineRemove);
return t
}
_createEarningsShow() {
return null
}
_createDividendsShow() {
return null
}
_createSplitsShow() {
return null
}
_contextMenuActionsForESD() {
return []
}
_contextMenuActionsForPublishedTimeline(e) {
const t = this._chartWidget.actions(),
i = [];
if (i.push(t.lineHide), window.is_authenticated) {
const t = e.properties().filter,
s = new a.Action({
checked: t.value() === PublishedChartsFilter.None,
checkable: !0,
label: ve,
name: "ToggleAllIdeas",
statName: "ToggleAllIdeas",
onExecute: () => this._chartWidget.model().setProperty(t,
PublishedChartsFilter.None, ve)
}),
r = new a.Action({
checked: t.value() === PublishedChartsFilter.Following,
checkable: !0,
label: Se,
name: "ToggleIdeasOfPeopleAndUser",
statName: "ToggleIdeasOfPeopleAndUser",
onExecute: () => this._chartWidget.model().setProperty(t,
PublishedChartsFilter.Following, Se)
}),
n = new a.Action({
checked: t.value() === PublishedChartsFilter.Private,
checkable: !0,
label: ye,
name: "ToggleUserIdeas",
statName: "ToggleUserIdeas",
onExecute: () => this._chartWidget.model().setProperty(t,
PublishedChartsFilter.Private, ye)
});
i.push(new a.Separator, s, r, n)
}
return i
}
_contextMenuActionsForTradingDrawings(e) {
return e.contextMenuItems()
}
_createAlertToggleHorzLineLabelAction(e) {
const t = getGlobalAlertSettingsProperty().childs().line.childs().visible,
i = t.value() ? L : O;
return new a.Action({
checkable: !0,
label: M,
checked: t.value(),
statName: "ToggleExtendAlertLine",
onExecute: () => this._chartWidget.model().setProperty(t, !t.value(), i)
})
}
_contextMenuActionsForAlertLabel(e) {
const t = e.alert(),
i = [];
return t.get("active") ? i.push(AlertActionCreator.stopAlert(t)) : i.push(
AlertActionCreator.restartAlert(t, "alert_label_context_menu_restart")), i
.push(AlertActionCreator.editAlert(t, "alert_label_context_menu_edit")), i.push(
AlertActionCreator.deleteAlert(t)),
i.push(new a.Separator), i.push(this._createAlertToggleHorzLineLabelAction(e)),
i
}
_contextMenuActionsForChartEvents(e) {
const t = [];
if (o.enabled("property_pages")) {
const e = new a.Action({
label: we,
statName: "Format",
onExecute: () => this._chartWidget.showGeneralChartProperties(u
.TabNames.eventsAndAlerts)
});
t.push(e)
}
const i = new a.Action({
label: Pe,
name: "HideEvents",
statName: "HideEvents",
onExecute: () => this._chartWidget.model().setProperty(e.properties()
.visible, !1, Pe)
});
return t.push(i), t
}
_createApplyToEntireLayoutCommand(e) {
if (!this._chartWidget.chartWidgetCollection()
.applyIndicatorsToAllChartsAvailable()) return null;
const t = this._chartWidget.model().model();
if (e.parentSource() !== t.mainSeries()) return null;
const i = Object(s.ensureNotNull)(t.paneForSource(e)),
r = t.paneForSource(t.mainSeries()) === i,
n = e instanceof g.a && e.priceScale() === t.mainSeries().priceScale() &&
Object(s.ensureNotNull)(e.priceScale()).isPercentage(),
o = r ? void 0 : t.panes().indexOf(i);
let l = xe,
c = "AddStudyToEntireLayout";
return Object(y.isSymbolSource)(e) && (l = Ce, c = "AddSymbolToEntireLayout"), new a
.Action({
label: l,
statName: c,
onExecute: () => {
const i = Object(s.ensureNotNull)(Object(v.a)(t.id(), [e])),
a = this._chartWidget.chartWidgetCollection(),
c = {
isOnMainPane: r,
asCompare: n,
paneIndex: o
};
a.applyIndicatorToAllCharts(this._chartWidget, i, c, l)
}
}, "applyStudyToEntireLayout")
}
}
},
Hr11: function(e, t, i) {
"use strict";
function s(e, t) {
return e <= t
}
function r(e, t) {
return e >= t
}
function n(e, t, i) {
return Math.min(Math.max(e, t), i)
}
function o(e) {
return e < 0 ? -1 : e > 0 ? 1 : 0
}
function a(e) {
if (e < 0) return !1;
for (let t = e; t > 1; t /= 10)
if (t % 10 != 0) return !1;
return !0
}
function l(e, t, i) {
return t - e <= i
}
function c(e, t, i) {
return Math.abs(e - t) < i
}
function h(e) {
return e <= 0 ? NaN : Math.log(e) / Math.log(10)
}
function u(e, t) {
return e < t ? -1 : e > t ? 1 : 0
}
function d(e, t = u) {
if (e.length < 1) throw Error("array is empty");
let i = e[0];
for (let s = 0; s < e.length; ++s) t(e[s], i) < 0 && (i = e[s]);
return i
}
function p(e, t = u) {
if (e.length < 1) throw Error("array is empty");
let i = e[0];
for (let s = 0; s < e.length; ++s) t(e[s], i) > 0 && (i = e[s]);
return i
}
function _(e) {
const t = Math.ceil(e);
return t % 2 != 0 ? t - 1 : t
}
function m(e) {
return e > 0 ? Math.floor(e) : Math.ceil(e)
}
i.r(t), i.d(t, "lessThan", (function() {
return s
})), i.d(t, "greaterThan", (function() {
return r
})), i.d(t, "clamp", (function() {
return n
})), i.d(t, "sign", (function() {
return o
})), i.d(t, "isBaseDecimal", (function() {
return a
})), i.d(t, "greaterOrEqual", (function() {
return l
})), i.d(t, "equal", (function() {
return c
})), i.d(t, "log10", (function() {
return h
})), i.d(t, "defComparator", (function() {
return u
})), i.d(t, "min", (function() {
return d
})), i.d(t, "max", (function() {
return p
})), i.d(t, "ceiledEven", (function() {
return _
})), i.d(t, "toInt", (function() {
return m
}))
},
HySD: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ResizerDetacherState", (function() {
return o
}));
var s = i("Eyy1"),
r = i("hY0g"),
n = i.n(r);
class o {
constructor(e) {
this._alive = new n.a, this._container = new n.a, this._width = new n.a, this
._height = new n.a, this._fullscreen = new n.a, this._detachable = new n.a, this
._fullscreenable = new n.a, this._visible = new n.a, this._availWidth = new n.a,
this._availHeight = new n.a,
this._owner = new n.a, this._ownersStack = [], this.owner = this._owner
.readonly(), this._bridge = {
alive: this._alive.readonly(),
container: this._container.readonly(),
width: this._width.readonly(),
height: this._height.readonly(),
fullscreen: this._fullscreen.readonly(),
detachable: this._detachable.readonly(),
fullscreenable: this._fullscreenable.readonly(),
visible: this._visible.readonly(),
availWidth: this._availWidth.readonly(),
availHeight: this._availHeight.readonly(),
remove: () => {
const e = this._owner.value();
e && e.remove && e.remove()
},
negotiateWidth: e => {
const t = this._owner.value();
t && t.negotiateWidth && t.negotiateWidth(e)
},
negotiateHeight: e => {
const t = this._owner.value();
t && t.negotiateHeight && t.negotiateHeight(e)
},
requestFullscreen: () => {
const e = this._owner.value();
e && e.requestFullscreen && e.requestFullscreen()
},
exitFullscreen: () => {
const e = this._owner.value();
e && e.exitFullscreen && e.exitFullscreen()
},
detach: e => {
const t = this._owner.value();
t && t.detach && t.detach(e)
},
attach: () => {
const e = this._owner.value();
e && e.attach && e.attach()
}
}, e && this.pushOwner(e)
}
bridge() {
return this._bridge
}
pushOwner(e) {
if (!e.alive.value()) return;
for (const e of this._ownersStack) this._unsubscribeOwner(e);
const t = {
owner: e
};
this._ownersStack.push(t), this._subscribeOwner(t)
}
_subscribeOwner(e) {
const t = e.owner;
if (e.deathWatcher || (this._alive.setValue(!0), e.deathWatcher = t.alive.spawn(), e
.deathWatcher.subscribe(t => {
t || this._deadHandler(e)
})), this._owner.setValue(t), !e.subscriptions) {
const i = e.subscriptions = [];
this._visible.setValue(!1);
const s = (e, t) => {
if (e) {
const s = e.spawn();
i.push(s), s.subscribe(e => {
t.setValue(e)
}, {
callWithLast: !0
})
} else t.deleteValue()
};
s(t.container, this._container), s(t.width, this._width), s(t.height, this
._height), s(t.fullscreen, this._fullscreen), s(t.detachable, this
._detachable), s(t.fullscreenable, this._fullscreenable), s(t
.availWidth, this._availWidth), s(t.availHeight, this._availHeight), s(t
.visible, this._visible)
}
}
_unsubscribeOwner(e, t) {
if (e.subscriptions) {
for (const t of e.subscriptions) t.unsubscribe();
e.subscriptions = null
}
t && e.deathWatcher && (e.deathWatcher.unsubscribe(), e.deathWatcher = null)
}
_deadHandler(e) {
const t = this._ownersStack.indexOf(e);
Object(s.assert)(-1 !== t, "sanitized owner should be in stack");
for (let e = this._ownersStack.length - 1; e >= t; e--) this._unsubscribeOwner(this
._ownersStack[e], !0);
this._ownersStack.length = t, t > 0 ? this._subscribeOwner(this._ownersStack[t -
1]) : (this._alive.setValue(!1), this._owner.deleteValue())
}
}
},
I4UZ: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "HeaderToolbarBootloader", (function() {
return o
}));
var s = i("yMne"),
r = i("YuHv"),
n = i("cZRT");
class o extends n.a {
constructor(e, t) {
super(), this._toolsBootloader = e, this._headerProps = t, this._headerProps
.resizerBridge.negotiateHeight(s.b), this._headerProps.resizerBridge
.container.value().appendChild(Object(r.a)())
}
_startLoading() {
return Promise.all([this._toolsBootloader.load(), this._loadHeaderToolbar()])
.then(([e, t]) => new t(this._headerProps.resizerBridge.container.value(), {
...this._headerProps,
tools: e
}))
}
_loadHeaderToolbar() {
return Promise.all([i.e("react"), i.e(14), i.e(42), i.e(79), i.e(7), i.e(10), i
.e(40), i.e("header-toolbar")
]).then(i.bind(null, "KMbc")).then(e => e.HeaderToolbarRenderer)
}
}
},
IDnv: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "extrapolateBarsFrontToTime", (function() {
return r
})), i.d(t, "extrapolateBarsFrontByCount", (function() {
return n
})), i.d(t, "extrapolateBarsFrontByCountAllPoints", (function() {
return o
})), i.d(t, "extrapolateBars", (function() {
return a
}));
var s = i("E6p6");
function r(e, t, i, s, n = !1) {
if (t > i) {
const o = r(e, i, t, s, n);
return o.count = -o.count, o
}
return a(e, t, 1, (e, t) => t > i || 0 !== s && e > s, n)
}
function n(e, t, i, s = !1) {
const r = i < 0 ? -1 : 1;
return a(e, t, r, (e, t) => e >= i * r, s)
}
function o(e, t, i) {
const s = i < 0 ? -1 : 1;
return a(e, t, s, (e, t) => e >= i * s, !0).times
}
function a(e, t, i, r, n) {
let o = 0,
a = t;
e.moveTo(a);
let l = 0,
c = Number.MAX_VALUE,
h = !1,
u = t;
const d = [];
for (; !r(o, a);) {
if (l > 15) throw new Error("Internal error 0x10 while extrapolating.");
const r = e.indexOfBar(a);
if (r === s.SessionStage.PRE_SESSION && 1 === i) a = e.startOfBar(0), e.moveTo(a);
else if (r === s.SessionStage.PRE_SESSION && -1 === i) a = e.startOfBar(s.SessionStage
.PRE_SESSION), e.moveTo(a);
else if (r === s.SessionStage.POST_SESSION && 1 === i) a = e.startOfBar(s.SessionStage
.POST_SESSION), e.moveTo(a);
else {
if (r === s.SessionStage.POST_SESSION && -1 === i) throw new Error(
"Internal error 0x12 while extrapolating."); {
const p = e.startOfBar(r);
if (p > t && i > 0 || t > p && i < 0) {
if (h && c === p) throw new Error(
"Internal error 0x11 while extrapolating.");
h = !0, c = p, l = 0, o++, u = p, n && d.push(u)
}
if (0 === r && -1 === i) a = p - 1;
else {
a = e.startOfBar(r + i);
const t = e.startOfBar(s.SessionStage.POST_SESSION);
a > t && (e.moveTo(t), a = e.startOfBar(0))
}
}
}
l++
}
return {
time: u,
times: d,
count: o
}
}
},
IMMp: function(e) {
e.exports = JSON.parse(
'{"color-bg-primary":"color-cold-gray-850","color-bg-primary-hover":"color-cold-gray-800","color-bg-secondary":"color-cold-gray-900","color-bg-highlight":"color-cold-gray-900","color-bg-scroll-buttons":"color-cold-gray-800","color-legacy-bg-scroll-buttons":"color-cold-gray-550","color-legacy-bg-widget":"color-cold-gray-900","color-text-primary":"color-cold-gray-200","color-text-secondary":"color-cold-gray-500","color-text-tertiary":"color-cold-gray-400","color-text-disabled":"color-cold-gray-650","color-accent-content":"color-white","color-divider":"color-cold-gray-700","color-divider-hover":"color-cold-gray-800","color-box-shadow":"color-cold-gray-900","color-active-hover-text":"color-cold-gray-300","color-alert-text":"color-cold-gray-200","color-border":"color-cold-gray-750","color-border-chat-fields":"color-cold-gray-750","color-border-hover":"color-cold-gray-650","color-border-table":"color-cold-gray-800","color-brand":"color-tv-blue-500","color-brand-hover":"color-tv-blue-600","color-brand-active":"color-tv-blue-700","color-button-hover-bg":"color-cold-gray-850","color-chart-page-bg":"color-cold-gray-800","color-common-tooltip-bg":"color-cold-gray-650","color-danger":"color-ripe-red-600","color-danger-hover":"color-ripe-red-500","color-danger-active":"color-ripe-red-400","color-depthrenderer-fill-style":"color-cold-gray-150","color-depthrenderer-stroke-style":"color-cold-gray-650","color-disabled-border-and-color":"color-cold-gray-800","color-disabled-input":"color-cold-gray-750","color-empty-container-message":"color-cold-gray-500","color-highlight-new":"color-tv-blue-a800","color-icons":"color-cold-gray-500","color-input-bg":"color-cold-gray-800","color-input-textarea-readonly":"color-cold-gray-650","color-input-placeholder-text":"color-cold-gray-700","color-input-publish-bg":"color-cold-gray-900","color-item-active-blue":"color-tv-blue-a800","color-item-hover-active-bg":"color-cold-gray-800","color-item-hover-bg":"color-cold-gray-800","color-item-hover-blue":"color-tv-blue-a800","color-item-selected-blue":"color-tv-blue-a800","color-item-active-text":"color-cold-gray-200","color-item-active-bg":"color-tv-blue-500","color-link":"color-tv-blue-500","color-link-hover":"color-tv-blue-600","color-link-active":"color-tv-blue-700","color-list-item":"color-cold-gray-500","color-list-nth-child-bg":"color-cold-gray-850","color-news-highlight":"color-cold-gray-800","color-pane-bg":"color-cold-gray-900","color-pane-secondary-bg":"color-cold-gray-850","color-placeholder":"color-cold-gray-650","color-popup-menu-item-hover-bg":"color-cold-gray-800","color-popup-menu-separator":"color-cold-gray-700","color-row-hover-active-bg":"color-cold-gray-800","color-sb-scrollbar-body-bg":"color-cold-gray-650","color-screener-description":"color-cold-gray-200","color-section-separator-border":"color-cold-gray-750","color-search-button-hover":"color-cold-gray-700","color-separator-table-chat":"color-cold-gray-750","color-success":"color-minty-green-700","color-success-hover":"color-minty-green-600","color-success-active":"color-minty-green-500","color-tag-active-bg":"color-cold-gray-750","color-tag-hover-bg":"color-cold-gray-800","color-text-regular":"color-cold-gray-200","color-toolbar-button-text":"color-cold-gray-500","color-toolbar-button-text-hover":"color-cold-gray-450","color-toolbar-button-text-active":"color-tv-blue-500","color-toolbar-button-text-active-hover":"color-tv-blue-600","color-toolbar-button-background-hover":"color-cold-gray-800","color-toolbar-button-background-secondary-hover":"color-cold-gray-750","color-toolbar-toggle-button-background-active":"color-tv-blue-500","color-toolbar-toggle-button-background-active-hover":"color-tv-blue-600","color-toolbar-interactive-element-text-normal":"color-cold-gray-300","color-toolbar-interactive-element-text-hover":"color-cold-gray-250","color-toolbar-opened-element-bg":"color-cold-gray-800","color-tooltip-bg":"color-cold-gray-750","color-tv-button-checked":"color-cold-gray-500","color-tv-dialog-caption":"color-cold-gray-50","color-tv-dropdown-item-hover-bg":"color-cold-gray-800","color-underlined-text":"color-cold-gray-300","color-widget-pages-bg":"color-cold-gray-900","color-warning":"color-tan-orange-700","color-forex-icon":"color-white","color-list-item-active-bg":"color-tv-blue-500","color-list-item-hover-bg":"color-cold-gray-800","color-list-item-text":"color-cold-gray-200","color-price-axis-label-back":"color-cold-gray-800","color-price-axis-label-text":"color-cold-gray-500","color-price-axis-gear":"color-cold-gray-500","color-price-axis-gear-hover":"color-cold-gray-400","color-price-axis-highlight":"color-cold-gray-800","color-bid":"color-tv-blue-500","color-scroll-bg":"color-cold-gray-750","color-scroll-border":"color-cold-gray-850","color-widget-border":"color-cold-gray-800","color-scroll-buttons-arrow":"color-white","color-control-intent-default":"color-cold-gray-650","color-control-intent-success":"color-minty-green-600","color-control-intent-primary":"color-tv-blue-500","color-control-intent-warning":"color-tan-orange-500","color-control-intent-danger":"color-ripe-red-700","color-growing":"color-minty-green-600","color-falling":"color-ripe-red-600","color-pre-market":"color-tan-orange-600","color-pre-market-bg":"color-tan-orange-400","color-post-market":"color-tv-blue-500","color-post-market-bg":"color-tv-blue-400","color-market-open":"color-minty-green-500","color-market-open-bg":"color-minty-green-400","color-market-closed":"color-cold-gray-400","color-market-holiday":"color-cold-gray-400","color-invalid-symbol":"color-ripe-red-400","color-invalid-symbol-hover":"color-ripe-red-500","color-replay-mode":"color-tv-blue-500","color-replay-mode-icon":"color-tv-blue-50","color-replay-mode-hover":"color-tv-blue-600","color-notaccurate-mode":"color-berry-pink-700","color-notaccurate-mode-bg":"color-berry-pink-400","color-delay-mode":"color-tan-orange-700","color-delay-mode-bg":"color-tan-orange-400","color-eod-mode":"color-grapes-purple-700","color-eod-mode-bg":"color-grapes-purple-400","color-data-problem":"color-ripe-red-600","color-data-problem-bg":"color-ripe-red-400","color-data-problem-hover":"color-ripe-red-500","color-list-item-bg-highlighted":"color-tv-blue-a900","color-list-item-bg-selected":"color-tv-blue-a800","color-list-item-bg-highlighted-hover":"color-tv-blue-a800","color-list-item-bg-selected-hover":"color-tv-blue-a700","color-screener-header-bg":"color-cold-gray-850","color-screener-header-bg-hover":"color-cold-gray-800","color-overlay":"color-cold-gray-950","color-card-border":"color-cold-gray-700","color-card-border-hover":"color-cold-gray-600"}'
)
},
IWXC: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "getQuoteSessionInstance", (function() {
return o
})), i.d(t, "setQuoteSessionInstance", (function() {
return a
})), i.d(t, "getQuoteSessionNoEnsure", (function() {
return l
})), i.d(t, "destroyQuoteSessions", (function() {
return c
}));
var s = i("hGf4"),
r = i.n(s);
const n = {};
function o(e = "full") {
return n[e] || a(e, new r.a(e)), n[e]
}
function a(e = "full", t) {
n[e] = t
}
function l(e = "full") {
return n[e]
}
function c() {
for (const e in n)
if (n.hasOwnProperty(e)) {
const t = n[e];
void 0 !== t && t.destroy(), delete n[e]
}
}
},
Ialn: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "isRtl", (function() {
return r
})), i.d(t, "stripLTRMarks", (function() {
return o
})), i.d(t, "startWithLTR", (function() {
return a
})), i.d(t, "forceLTRStr", (function() {
return l
})), i.d(t, "forceLTRStrSsr", (function() {
return c
})), i.d(t, "forceRTLStr", (function() {
return h
})), i.d(t, "getLTRScrollLeft", (function() {
return u
})), i.d(t, "getLTRScrollLeftOffset", (function() {
return d
})), i.d(t, "detectAutoDirection", (function() {
return m
}));
var s = i("oYVD");
const r = () => "rtl" === window.document.dir,
n = new RegExp("|||", "g");
function o(e) {
return "" !== e && r() && null != e ? e.replace(n, "") : e
}
function a(e) {
return "" !== e && r() && null != e ? "" + e : e
}
function l(e) {
return "" !== e && r() && null != e ? "" + e + "" : e
}
function c(e) {
return "" + e + ""
}
function h(e) {
return "" !== e && r() && null != e ? "" + e + "" : e
}
function u(e) {
return Object(s.getNormalizedScrollLeft)(e, "rtl")
}
function d(e, t) {
const i = Object(s.detectScrollType)();
if ("indeterminate" === i) return 0;
switch (i) {
case "negative":
t = e.clientWidth - e.scrollWidth + t;
break;
case "reverse":
t = e.scrollWidth - e.clientWidth - t
}
return t
}
const p =
/[^\u0000-\u0040\u005B-\u0060\u007B-\u00BF\u00D7\u00F7\u02B9-\u02FF\u2000-\u200E\u2010-\u2029\u202C\u202F-\u2BFF]/,
_ = /[\u0590-\u07FF\u200F\u202B\u202E\uFB1D-\uFDFD\uFE70-\uFEFC]/;
function m(e) {
const t = p.exec(e);
return t ? _.test(t[0]) ? "rtl" : "ltr" : ""
}
},
IcDj: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("txPx"),
n = i("aIyQ"),
o = i.n(n),
a = i("7ktv"),
l = i("Qb4w"),
c = i("k9/m"),
h = i("0YCj"),
u = i.n(h),
d = i("jenN"),
p = i("972a"),
_ = i("it7y"),
m = i("e1Hy");
class f extends _.StudyDataWindowView {
constructor(e, t) {
super(e, t), this._showStudyValues = t.properties().paneProperties
.legendProperties.showStudyValues, this._showStudyValues.subscribe(this,
this.update)
}
isValuesVisible() {
return this._showStudyValues.value()
}
additional() {
return null
}
destroy() {
this._showStudyValues.unsubscribeAll(this)
}
_createValuesProvider(e, t) {
return new m.a(e, t)
}
}
var g = i("mMWL"),
b = i("2kV1"),
v = i("5fI3"),
S = i("jy4L"),
y = i("YWnQ"),
w = i("W+6j"),
P = i("ogJP"),
C = i("zXvd"),
x = i("23IT"),
T = i("Kxc7"),
I = i("aO4+"),
M = i("Tmoa"),
O = i("Zy3/");
class L {
constructor(e) {
this._data = e
}
draw(e, t) {}
drawBackground(e, t) {
e.save();
const i = this._data,
s = t.pixelRatio;
let r = null;
const n = Math.round(this._data.w * s);
for (let t = 0; t < i.items.length; ++t) {
const o = i.items[t];
if (null == o.color) {
r = null;
continue
}
e.fillStyle = o.color;
const a = Math.round(o.x * s);
let l = a;
if (t > 0) {
i.items[t - 1].index === o.index - 1 && null !== r && (l = r + 1)
}
const c = a + n,
h = c - l + 1;
e.fillRect(l, Math.round(i.y * s), h, Math.round(i.h * s)), r = c
}
e.restore()
}
hitTest(e) {
return null
}
}
var A = i("i6cO"),
E = i("UAFa");
class k {
constructor(e, t, i, r) {
this._items = [], this._invalidated = !0, this._isMarkersEnabled = T.enabled(
"source_selection_markers"), this._study = e, this._series = t, this
._model = i, this._plotName = r;
const n = this._study.metaInfo().plots;
for (let e = 0; e < n.length; e++) {
const t = n[e];
t.id === this._plotName && (this._plotIndex = e, Object(s.assert)(Object(x
.isBgColorerPlot)(t), "Plot '" + this._plotName +
"' is not a background colorer!"))
}
this._colorProvider = Object(E.createStudyPlotColorProvider)(e.metaInfo(), e
.properties(), r)
}
items() {
return this._items
}
update() {
this._invalidated = !0
}
renderer() {
if (!this._study.properties().styles[this._plotName].visible) return null;
if (!this._study.properties().styles[this._plotName].visible.value()) return null;
if (!this._scalesReady()) return null;
this._invalidated && (this._updateImpl(), this._invalidated = !1);
const e = {
items: this._items,
y: 0,
h: Object(s.ensureNotNull)(this._study.priceScale()).height(),
w: this._model.timeScale().barSpacing()
},
t = new O.CompositeRenderer;
return t.append(new L(e)), t
}
_scalesReady() {
const e = this._model.timeScale(),
t = this._study.priceScale();
return e && !e.isEmpty() && null !== t && !t.isEmpty()
}
_getTranspValue() {
const e = this._study.properties().styles[this._plotName];
let t = 0;
return e.transparency && (t = e.transparency.value(), t = Object(P.isNumber)(t) ?
t : 40), t
}
_updateImpl() {
this._items = [], Object(s.assert)(this._scalesReady(), "Scales must be ready!");
const e = this._model.timeScale().visibleBarsStrictRange();
if (null === e) return;
const t = this._getTranspValue();
let i = Object(s.ensureDefined)(this._series.nearestIndex(e.firstBar(), c
.PlotRowSearchMode.NearestRight)),
r = Object(s.ensureDefined)(this._series.nearestIndex(e.lastBar(), c
.PlotRowSearchMode.NearestLeft));
const n = this._study.offset(this._plotName);
n > 0 ? (i -= n, r += n) : (i += n, r -= n);
const o = this._study.getMinFirstBarIndexForPlot(this._plotName);
if (o > r) return;
i = Math.max(o, i);
const a = this._study.data().rangeIterator(i, r);
for (; a.hasNext();) {
const e = a.next();
let i = e.index;
const r = e.value;
i += n;
const o = new I.Point(Math.floor(i) - .5, NaN);
let l = Object(P.isNumber)(t) ? t : 50;
l = Math.min(l, 100), l = Math.max(l, 0);
const c = this._colorProvider.getPlotPointStyle(r);
void 0 !== c.colors[A.ColorerType.Background] && (o.color = Object(M
.generateColor)(Object(s.ensureDefined)(c.colors[A.ColorerType
.Background]), l)), o.index = i, this._items.push(o)
}
this._model.timeScale().timedValuesToCoordinates(this._items)
}
}
var D = i("CLNU"),
V = i("vq8G"),
B = i("Nu4p"),
R = i("Hr11"),
N = i("VdBB"),
j = i("o2pV"),
F = i("XPit"),
W = i("f6yo");
function H(e, t, i) {
const s = e.get(t);
return void 0 !== s ? s : (e.set(t, i), i)
}
function U(e, t, i, s) {
const r = H(e, t, new Map);
return H(r, i, s)
}
class z {
constructor() {
this._map = new Map, this._size = 0
}
size() {
return this._size
}
clear() {
this._map.clear(), this._size = 0
}
}
var G, q, Y = i("XlJ7"),
K = i("c44N"),
J = i("ikwP");
! function(e) {
e.Left = "left", e.Right = "right", e.Center = "center"
}(G || (G = {})),
function(e) {
e.Top = "top", e.Bottom = "bottom", e.Middle = "middle"
}(q || (q = {}));
class Z {
constructor(e, t, i, r, n, o = "center") {
this._cacheRenderParams = null, this._canvasesMap = {}, this._lines = e.split(
/[^\S\r\n]*(?:\r\n|\r|\n)/), this._font = function(e, t, i, s) {
return Object(Y.makeFont)(s, i, `${e ? "bold " : ""}${t ? "italic " : ""}`)
}(t, i, r, n), this._fontSize = n, this._verticalPadding = ~~(n / 6), this
._textAlign = o;
const a = Object(J.createDisconnectedCanvas)(document, new J.Size(0, 0), 1),
l = Object(s.ensureNotNull)(a.getContext("2d"));
l.font = this._font;
let c = 0;
for (const e of this._lines) {
const t = l.measureText(e).width;
c = Math.max(c, t)
}
this.textImageWidth = c + 1, this.textImageHeight = this._lines.length * n + this
._verticalPadding
}
paintTo(e, t, i, s, r, n, o) {
const a = this._getTextImage(i, t);
if (0 === a.width || 0 === a.height) return;
const l = function(e, t, i) {
let s = e;
switch (t) {
case "left":
break;
case "right":
s -= i;
break;
case "center":
s -= i / 2
}
return Math.round(s)
}(s, n, this.textImageWidth),
c = function(e, t, i) {
let s = e;
switch (t) {
case "top":
break;
case "bottom":
s -= i;
break;
case "middle":
s -= i / 2
}
return Math.round(s)
}(r, o, this.textImageHeight);
Object(J.drawScaled)(e, t.pixelRatio, () => {
e.drawImage(a, l, c, this.textImageWidth, this.textImageHeight)
})
}
_getTextImage(e, t) {
if (null !== this._cacheRenderParams && Object(K.areEqualPaneRenderParams)(this
._cacheRenderParams, t) || (this._canvasesMap = {}, this
._cacheRenderParams = t), this._canvasesMap[e]) return this._canvasesMap[
e]; {
const t = Object(J.createDisconnectedCanvas)(document, new J.Size(this
.textImageWidth, this.textImageHeight), this._cacheRenderParams
.pixelRatio),
i = Object(s.ensureNotNull)(t.getContext("2d"));
let r;
switch (i.textBaseline = "top", i.font = this._font, i.fillStyle = e, this
._textAlign) {
case "left":
r = 0, i.textAlign = "left";
break;
case "right":
r = this.textImageWidth - 1, i.textAlign = "right";
break;
default:
r = this.textImageWidth / 2, i.textAlign = "center"
}
let n = this._verticalPadding;
return Object(J.drawScaled)(i, this._cacheRenderParams.pixelRatio, () => {
for (const e of this._lines) i.fillText(e, r, n), n += this
._fontSize
}), this._canvasesMap[e] = t, t
}
}
}
class X extends z {
constructor(e) {
super(), this._maxSize = e, this._keysQueue = []
}
get(e) {
if (!e.text || !e.fontSize || !e.align) return null;
const t = e.fontSize,
i = e.text,
s = e.align,
r = U(this._map, t, s, new Map);
let n = r.get(i);
return void 0 !== n || (this._size >= this._maxSize ? this._deleteFirstKey() : ++
this._size, this._keysQueue.push([t, i, s]), n = new Z(e.text, e.bold, e
.italic, e.font, e.fontSize, e.align), r.set(i, n)), n
}
_deleteFirstKey() {
const e = this._keysQueue.shift(),
t = e[0],
i = e[1],
s = this._map.get(t);
s.delete(i), 0 === s.size && this._map.delete(t)
}
}
var $ = i("zDbI");
class Q {
constructor(e, t = {
skipRenderingOptimizations: !1
}) {
this._height = void 0 !== e.height ? e.height : e.width, this._width = void 0 !== e
.width ? e.width : e.height, this._items = [], this._barSpacing = 0, this
._textCache = t.textCache || new X(5e3), this._drawOperation = t
.skipRenderingOptimizations ? this._drawWithoutOptimizations.bind(this) : this
._drawWithOptimizations.bind(this), this._color = e.color, this._borderColor = e
.borderColor, this._vertOffset = e.vertOffset || 0, e.text && (this._text = e
.text, this._fontSize = e.fontSize, this._textColor = e.textColor, this
._textAlign = e.textAlign || "center"), void 0 !== e.items && void 0 !== e
.barSpacing && this.setData(e.items, e.barSpacing)
}
draw(e, t) {
this._preDrawInit(), this._drawOperation(e, t)
}
hitTest(e) {
const t = N.HitTestResult.REGULAR;
let i = null;
for (const s of this._items) {
if (!s) continue;
const r = this._calcBoundingBox(s);
if (r && Object(W.pointInBox)(e, r)) {
const e = {
tooltip: this._getTooltip(s, r)
};
i = new N.HitTestResult(t, e)
}
}
return i
}
setData(e, t) {
this._setBaseData(e, t)
}
_calcBoundingBox(e) {
const t = e.vertOffset,
i = this._getTextCache(e);
if (!i) return;
const s = i.textImageWidth,
r = i.textImageHeight,
n = s / 2,
o = e.y + t + e.textVertOffset,
a = t > 0 ? 0 : -r,
l = t > 0 ? r : 0,
c = new I.Point(e.x - n, o + a),
h = new I.Point(e.x + n, o + l);
return Object(I.box)(c, h)
}
_unionBox(e, t) {
const i = Math.min(e.min.x, t.min.x),
s = Math.max(e.max.x, t.max.x),
r = Math.min(e.min.y, t.min.y),
n = Math.max(e.max.y, t.max.y),
o = new I.Point(i, r),
a = new I.Point(s, n);
return Object(I.box)(o, a)
}
_getTooltip(e, t) {
if (e.tooltip) return {
content: {
type: "text",
data: e.tooltip
},
tooltipDelay: 200,
extendMargin: !0,
rect: {
x: t.min.x,
y: t.min.y,
w: Math.abs(t.max.x - t.min.x),
h: Math.abs(t.max.y - t.min.y)
}
}
}
_setBaseData(e, t) {
this._items.length = 0, this._barSpacing = t;
for (const t of e) {
const e = void 0 === t.width ? Object(s.ensureDefined)(this._width) : t.width,
i = void 0 === t.height ? Object(s.ensureDefined)(this._height) : t.height,
r = void 0 === t.vertOffset ? this._vertOffset : t.vertOffset,
n = r > 0 ? i : -i;
this._items.push({
width: e,
height: i,
vertOffset: r,
textVertOffset: n,
shapeWidth: 0,
shapeHeight: 0,
stepX: 0,
stepY: 0,
...t
})
}
}
_drawItemText(e, t, i) {
const s = this._getTextCache(i);
if (null === s) return;
const r = i.x,
n = i.vertOffset,
o = i.y + n + i.textVertOffset;
let a;
a = i.style && void 0 !== i.style.textColor ? i.style.textColor : this._textColor, s
.paintTo(e, t, a, r, o, G.Center, n > 0 ? q.Top : q.Bottom)
}
_drawWithOptimizations(e, t) {
let i, s, r = null,
n = !1;
for (const o of this._items) o.style && void 0 !== o.style.color ? (i = o.style
.color || "rgba(0, 0, 0, 0)", s = o.style.borderColor || "rgba(0, 0, 0, 0)"
) : (i = this._color, s = this._borderColor), r !== i && (r = i, n && this
._endPath(e), this._startPath(e, t, i, s)), this._drawItemShape(e, t, o),
n = !0;
n && this._endPath(e);
for (const i of this._items) this._drawItemText(e, t, i)
}
_drawWithoutOptimizations(e, t) {
let i, r;
for (const n of this._items) {
const o = Object(s.ensureDefined)(n.style);
i = o.color || "rgba(0, 0, 0, 0)", r = o.borderColor || "rgba(0, 0, 0, 0)", this
._startPath(e, t, i, r), this._drawItemShape(e, t, n), this._endPath(e),
this._drawItemText(e, t, n)
}
}
_drawItemShape(e, t, i) {
Object(J.drawScaled)(e, t.pixelRatio, () => this._drawItemShapeUsingCSSPixels(e, i))
}
_drawItemShapeUsingCSSPixels(e, t) {}
_preDrawInit() {}
_startPath(e, t, i, s) {}
_endPath(e) {}
_getTextCache(e) {
const t = e.text || this._text,
i = e.fontSize || this._fontSize,
s = e.textAlign || this._textAlign;
return this._textCache.get({
text: t,
bold: !1,
italic: !1,
font: $.CHART_FONT_FAMILY,
fontSize: i,
align: s
})
}
}
class ee extends Q {
_startPath(e, t, i, s) {
e.beginPath(), e.lineWidth = this._lineWidth(t), e.lineCap = "butt", e.strokeStyle =
i
}
_endPath(e) {
e.stroke()
}
_lineWidth(e) {
return Math.max(1, Math.floor(2 * e.pixelRatio))
}
}
class te extends Q {
_startPath(e, t, i, s) {
e.beginPath(), e.lineWidth = this._lineWidth(t), e.lineCap = "butt", e.fillStyle =
i, e.strokeStyle = s
}
_endPath(e) {
e.fill(), e.stroke()
}
_lineWidth(e) {
return Math.max(1, Math.floor(e.pixelRatio))
}
}
class ie extends te {
constructor() {
super(...arguments), this._sign = 0, this._thinArrow = !1,
this._thinArrowLineWidth = 0, this._headHeight = 0, this._arrowWidth = 0
}
setData(e, t) {
this._setBaseData(e, t)
}
_drawItemShape(e, t, i) {
const s = t.pixelRatio,
r = this._lineWidth(t) % 2 ? .5 : 0,
n = this._sign,
o = this._arrowWidth,
a = this._headHeight,
l = Math.abs(i.height),
c = Math.round(i.x * s) + r,
h = i.vertOffset,
u = Math.round((i.y + h + n * l / 2) * s) + r,
d = Object(R.ceiledEven)(o * s),
p = d / 2,
_ = Math.round(l * s),
m = Math.round(a * s);
e.translate(c, u), this._thinArrow ? (e.moveTo(0, 0), e.lineTo(-p, -p * n), e
.moveTo(0, 0), e.lineTo(p, -p * n), e.moveTo(0, 0), e.lineTo(0, -_ * n), e
.moveTo(-p, -_ * n), e.lineTo(p, -_ * n)) : (e.moveTo(0, 0), _ < m ? (e
.lineTo(d, -_ * n), e.lineTo(-d, -_ * n)) : (e.lineTo(d, -m * n), e
.lineTo(p, -m * n), e.lineTo(p, -_ * n), e.lineTo(-p, -_ * n), e.lineTo(
-p, -m * n), e.lineTo(-d, -m * n)), e.lineTo(0, 0)), e.translate(-c, -u)
}
_preDrawInit() {
const e = this._calculateWidth();
this._arrowWidth = e, this._sign = this._isUp() ? -1 : 1, this._thinArrow = e < 4,
this._thinArrowLineWidth = Math.max(e / 2, 1), this._headHeight = Math.round(e)
}
_startPath(e, t, i, s) {
e.beginPath(), e.fillStyle = i, e.strokeStyle = s, e.lineWidth = this._lineWidth(t)
}
_lineWidth(e) {
return this._thinArrow ? this._thinArrowLineWidth : super._lineWidth(e)
}
_calcBoundingBox(e) {
const t = e.vertOffset,
i = this._sign,
s = this._arrowWidth,
r = this._headHeight,
n = Math.abs(e.height),
o = e.x - s,
a = o + 2 * s,
l = e.y + t + i * Math.round(n / 2),
c = l + (-n - r) * i,
h = new I.Point(o, l),
u = new I.Point(a, c);
let d = Object(I.box)(h, u);
const p = super._calcBoundingBox(e);
return p && (d = this._unionBox(d, p)), d
}
_calculateWidth() {
return Math.round(this._barSpacing / 4)
}
}
const se = 2 * Math.PI;
class re extends te {
setData(e, t) {
this._setBaseData(e, t);
for (const e of this._items) {
const t = e.height;
e.stepX = Math.round(t / 2 * .65) + .5, e.stepY = e.stepX;
const i = e.stepX / 2,
s = this._getTextCache(e);
if (null === s) {
e.shapeWidth = 2 * e.stepX, e.shapeHeight = 2.5 * e.stepY, e.vertOffset =
this._calcVertOffset(e);
continue
}
const r = s.textImageWidth,
n = s.textImageHeight;
e.shapeWidth = r + 2 * e.stepX, e.shapeHeight = n + 2 * i + e.stepY, e
.vertOffset = this._calcVertOffset(e), e.textHorizOffset = this
._getHorizontalTextOffset(e), e.textVertOffset = this
._getVerticalTextOffset(e)
}
}
_calcVertOffset(e) {
return e.vertOffset
}
_drawCorner(e, t, i, s, r) {
const n = Math.max(1, Math.floor(2 * r));
e.lineTo(t - n * s.prevPointSignX, i - n * s.prevPointSignY), e.arcTo(t, i, t + n *
s.nextPointSignX, i + n * s.nextPointSignY, n)
}
_getArrowSize(e) {
return e.stepX
}
_getHorizontalTextOffset(e) {
return 0
}
_getVerticalTextOffset(e) {
return 0
}
_hasText(e) {
return Boolean(e.text) || Boolean(this._text)
}
_drawItemText(e, t, i) {
var r;
const n = this._getTextCache(i);
if (null === n) return;
const o = i.textHorizOffset || 0,
a = i.x + o,
l = i.vertOffset,
c = i.y + l + i.textVertOffset,
h = (null === (r = i.style) || void 0 === r ? void 0 : r.textColor) || this
._textColor;
n.paintTo(e, t, Object(s.ensureDefined)(h), a, c, G.Center, q.Middle)
}
}
class ne {
constructor(e, t, i, s) {
this.prevPointSignX = e, this.prevPointSignY = t, this.nextPointSignX = i, this
.nextPointSignY = s
}
}
var oe;
! function(e) {
e.rightUp = new ne(1, 0, 0, 1), e.rightDown = new ne(0, 1, -1, 0), e.leftDown = new ne(-1,
0, 0, -1), e.leftUp = new ne(0, -1, 1, 0)
}(oe || (oe = {}));
class ae extends te {
_calcBoundingBox(e) {
const t = e.width,
i = e.height,
s = t / 2,
r = Math.round(i / 3),
n = e.x,
o = e.vertOffset - 2 * r,
a = e.y + o,
l = n - s,
c = n + s,
h = a,
u = a + i,
d = new I.Point(l, h),
p = new I.Point(c, u);
let _ = Object(I.box)(d, p);
const m = super._calcBoundingBox(e);
return m && (_ = this._unionBox(_, m)), _
}
}
const le = new Map;
le.set("PaneRendererArrowUp", class extends ie {
_isUp() {
return !0
}
}), le.set("PaneRendererArrowDown", class extends ie {
_isUp() {
return !1
}
}), le.set("PaneRendererCircleShape", class extends te {
_drawItemShapeUsingCSSPixels(e, t) {
const i = Math.max(t.width, t.height) / 2,
s = t.x,
r = t.vertOffset,
n = t.y + r;
e.moveTo(s + i, n), e.arc(s, n, i, 0, se, !1)
}
_calcBoundingBox(e) {
const t = Math.max(e.width, e.height) / 2,
i = e.x,
s = e.vertOffset,
r = e.y + s,
n = i - t,
o = i + t,
a = r - t,
l = r + t,
c = new I.Point(n, a),
h = new I.Point(o, l);
let u = Object(I.box)(c, h);
const d = super._calcBoundingBox(e);
return d && (u = this._unionBox(u, d)), u
}
}), le.set("PaneRendererCrossShape", class extends ee {
_drawItemShape(e, t, i) {
const s = i.width,
r = i.height,
n = i.x - s / 2,
o = i.vertOffset,
a = i.y - r / 2 + o,
l = t.pixelRatio,
c = this._lineWidth(t),
h = c % 2 ? .5 : 0,
u = Math.round(n * l);
let d = Math.round((n + s) * l);
(d - u) % 2 != c % 2 && (d += 1);
const p = Math.floor((u + d) / 2) + h,
_ = Math.round(a * l);
let m = Math.round((a + r) * l);
(m - _) % 2 != c % 2 && (m += 1);
const f = Math.floor((_ + m) / 2) + h;
e.moveTo(p, _), e.lineTo(p, m), e.moveTo(u, f), e.lineTo(d, f)
}
_calcBoundingBox(e) {
const t = e.width,
i = e.height,
s = e.x - t / 2,
r = e.vertOffset,
n = e.y - i / 2 + r,
o = s,
a = s + t,
l = n,
c = n + i,
h = new I.Point(o, l),
u = new I.Point(a, c);
let d = Object(I.box)(h, u);
const p = super._calcBoundingBox(e);
return p && (d = this._unionBox(d, p)), d
}
}), le.set("PaneRendererDiamond", class extends te {
_drawItemShapeUsingCSSPixels(e, t) {
const i = Math.round(t.height / 2),
s = t.x,
r = t.vertOffset,
n = t.y + r;
e.moveTo(s, n - i), e.lineTo(s + i, n), e.lineTo(s, n + i), e.lineTo(s - i,
n), e.lineTo(s, n - i)
}
_calcBoundingBox(e) {
const t = Math.round(e.height / 2),
i = e.x,
s = e.vertOffset,
r = e.y + s,
n = i - t,
o = i + t,
a = r - t,
l = r + t,
c = new I.Point(n, a),
h = new I.Point(o, l);
let u = Object(I.box)(c, h);
const d = super._calcBoundingBox(e);
return d && (u = this._unionBox(u, d)), u
}
}), le.set("PaneRendererFlagShape", class extends te {
_drawItemShapeUsingCSSPixels(e, t) {
const i = t.width,
s = t.height,
r = s / 2,
n = (i - 3) / 3,
o = t.x - i / 2,
a = t.vertOffset,
l = t.y - r + a;
e.moveTo(o, l), e.lineTo(o + 3, l), e.bezierCurveTo(o + n, l - n, o + 2 * n,
l + n, o + i, l), e.lineTo(o + i, l + r), e.bezierCurveTo(o + i - n,
l + r + n, o + i - 2 * n, l + r - n, o + 3, l + r), e.lineTo(o + 3,
l + s), e.lineTo(o, l + s), e.lineTo(o, l)
}
_calcBoundingBox(e) {
const t = e.width,
i = e.height,
s = i / 2,
r = e.x - t / 2,
n = e.vertOffset,
o = e.y - s + n,
a = r,
l = r + t,
c = o,
h = o + i,
u = new I.Point(a, c),
d = new I.Point(l, h);
let p = Object(I.box)(u, d);
const _ = super._calcBoundingBox(e);
return _ && (p = this._unionBox(p, _)), p
}
}), le.set("PaneRendererLabelUp", class extends re {
_calcBoundingBox(e) {
const t = e.x - e.shapeWidth / 2,
i = e.x + e.shapeWidth / 2,
s = e.y + e.vertOffset,
r = e.y + e.shapeHeight + e.vertOffset,
n = new I.Point(t, s),
o = new I.Point(i, r);
return Object(I.box)(n, o)
}
_drawItemShape(e, t, i) {
const s = t.pixelRatio,
r = this._lineWidth(t) % 2 ? .5 : 0,
n = Math.max(1, Math.floor(s)) % 2 ? .5 : 0,
o = this._getArrowSize(i);
let a = Math.round(o * s);
(n + a) % 1 != r % 1 && (a += .5);
let l = Math.round(i.shapeWidth / 2 * s);
(n + l) % 1 != r % 1 && (l += .5);
const c = Math.round(i.x * s) + n,
h = Math.round((i.y + i.vertOffset) * s) + r,
u = c - a,
d = Math.round((i.y + i.vertOffset + o) * s) + r,
p = c + a,
_ = c + l,
m = Math.round((i.y + i.vertOffset + i.shapeHeight) * s) + r,
f = c - l;
e.moveTo(u, d), e.lineTo(c, h), e.lineTo(p, d), i.shapeWidth <= 2 * o ? (e
.lineTo(_, d), this._drawCorner(e, _, m, oe.rightDown, s), this
._drawCorner(e, f, m, oe.leftDown, s), e.lineTo(f, d)) : (this
._drawCorner(e, _, d, oe.rightUp, s), this._drawCorner(e, _, m, oe
.rightDown, s), this._drawCorner(e, f, m, oe.leftDown, s), this
._drawCorner(e, f, d, oe.leftUp, s)), e.lineTo(u, d)
}
_getVerticalTextOffset(e) {
return e.shapeHeight / 2 + this._getArrowSize(e) / 2
}
_calcVertOffset(e) {
return Math.sign(e.vertOffset) >= 0 ? e.vertOffset : e.vertOffset - e
.shapeHeight
}
}), le.set("PaneRendererLabelDown", class extends re {
_calcBoundingBox(e) {
const t = e.x - e.shapeWidth / 2,
i = e.x + e.shapeWidth / 2,
s = e.y - e.shapeHeight + e.vertOffset,
r = e.y + e.vertOffset,
n = new I.Point(t, s),
o = new I.Point(i, r);
return Object(I.box)(n, o)
}
_drawItemShape(e, t, i) {
const s = t.pixelRatio,
r = this._lineWidth(t) % 2 ? .5 : 0,
n = Math.max(1, Math.floor(s)) % 2 ? .5 : 0,
o = this._getArrowSize(i);
let a = Math.round(o * s);
(n + a) % 1 != r % 1 && (a += .5);
let l = Math.round(i.shapeWidth / 2 * s);
(n + l) % 1 != r % 1 && (l += .5);
const c = Math.round(i.x * s) + n,
h = Math.round((i.y + i.vertOffset) * s) + r,
u = c + a,
d = Math.round((i.y + i.vertOffset - o) * s) + r,
p = c - a,
_ = c + l,
m = Math.round((i.y + i.vertOffset - i.shapeHeight) * s) + r,
f = c - l;
e.moveTo(u, d), e.lineTo(c, h), e.lineTo(p, d), i.shapeWidth <= 2 * o ? (e
.lineTo(f, d), this._drawCorner(e, f, m, oe.leftUp, s), this
._drawCorner(e, _, m, oe.rightUp, s), e.lineTo(_, d)) : (this
._drawCorner(e, f, d, oe.leftDown, s), this._drawCorner(e, f, m, oe
.leftUp, s), this._drawCorner(e, _, m, oe.rightUp, s), this
._drawCorner(e, _, d, oe.rightDown, s)), e.lineTo(u, d)
}
_getVerticalTextOffset(e) {
return -e.shapeHeight / 2 - this._getArrowSize(e) / 2
}
_calcVertOffset(e) {
return Math.sign(e.vertOffset) <= 0 ? e.vertOffset : e.vertOffset + e
.shapeHeight
}
}), le.set("PaneRendererSquare", class extends te {
_drawItemShape(e, t, i) {
const s = t.pixelRatio,
r = Math.max(1, Math.floor(s)) % 2 ? .5 : 0,
n = this._lineWidth(t) % 2 ? .5 : 0;
let o = Math.round(i.height / 2 * s);
(r + o) % 1 != n % 1 && (o += .5);
const a = Math.round(i.x * s) + r,
l = Math.round((i.y + i.vertOffset) * s) + r,
c = a - o,
h = l - o,
u = a + o,
d = l + o;
e.rect(c, h, u - c, d - h)
}
_calcBoundingBox(e) {
const t = e.height,
i = Math.round(t / 2),
s = e.x - i,
r = e.vertOffset,
n = e.y + r - i,
o = s,
a = s + t,
l = n,
c = n + t,
h = new I.Point(o, l),
u = new I.Point(a, c);
let d = Object(I.box)(h, u);
const p = super._calcBoundingBox(e);
return p && (d = this._unionBox(d, p)), d
}
}), le.set("PaneRendererTriangleApexUp", class extends ae {
_drawItemShape(e, t, i) {
const s = i.width,
r = i.height,
n = Math.round(r / 3),
o = i.vertOffset - 2 * n,
a = t.pixelRatio,
l = this._lineWidth(t) % 2 ? .5 : 0,
c = Math.max(1, Math.floor(a)),
h = c % 2 ? .5 : 0;
let u = Math.round(s * a);
u % 2 != c % 2 && (u += 1);
const d = Math.round(i.x * a) + h,
p = Math.round((i.y + o) * a),
_ = d + u / 2,
m = Math.round((i.y + o + r) * a) + l,
f = d - u / 2;
e.moveTo(d, p), e.lineTo(_, m), e.lineTo(f, m), e.lineTo(d, p)
}
}), le.set("PaneRendererTriangleApexDown", class extends ae {
_drawItemShape(e, t, i) {
const s = i.width,
r = i.height,
n = Math.round(r / 3),
o = i.vertOffset - n,
a = t.pixelRatio,
l = this._lineWidth(t) % 2 ? .5 : 0,
c = Math.max(1, Math.floor(a)),
h = c % 2 ? .5 : 0;
let u = Math.round(s * a);
u % 2 != c % 2 && (u += 1);
const d = Math.round(i.x * a) + h,
p = Math.round((i.y + o) * a) + l,
_ = d + u / 2,
m = Math.round((i.y + o + r) * a),
f = d - u / 2;
e.moveTo(f, p), e.lineTo(_, p), e.lineTo(d, m), e.lineTo(f, p)
}
}), le.set("PaneRendererXCross", class extends ee {
_drawItemShapeUsingCSSPixels(e, t) {
const i = t.width,
s = t.height,
r = t.x - i / 2,
n = t.vertOffset,
o = t.y - s / 2 + n;
e.moveTo(r, o), e.lineTo(r + i, o + s), e.moveTo(r, o + s), e.lineTo(r + i,
o)
}
_calcBoundingBox(e) {
const t = e.width,
i = e.height,
s = e.x - t / 2,
r = e.vertOffset,
n = e.y - i / 2 + r,
o = s,
a = s + t,
l = n,
c = n + i,
h = new I.Point(o, l),
u = new I.Point(a, c);
let d = Object(I.box)(h, u);
const p = super._calcBoundingBox(e);
return p && (d = this._unionBox(d, p)), d
}
});
class ce {
constructor(e, t, i, s) {
this._items = [], this._invalidated = !1, this._renderer = null, this
._isMarkersEnabled = T.enabled("source_selection_markers"), this
._selectionData = null, this._plotIndex = null, this._topCoord = 0, this
._bottomCoord = 0, this._study = e, this._series = t, this._model = i, this
._plotName = s;
const r = e.metaInfo().plots;
for (let e = 0; e < r.length; e++)
if (r[e].id === this._plotName) {
this._plotIndex = e;
break
} this._colorProvider = Object(E.createStudyPlotColorProvider)(e.metaInfo(), e
.properties(), s), this._selectionIndexer = new j.SelectionIndexes(i
.timeScale())
}
items() {
return this._items
}
update() {
this._invalidated = !0
}
renderer() {
if (!this._study.properties().styles[this._plotName].visible) return null;
if (!this._study.properties().styles[this._plotName].visible.value()) return null;
if (!this._scalesReady()) return null;
if (this._invalidated) {
const e = this._study.properties().styles[this._plotName];
this._updateRenderer(e), this._invalidated = !1
}
return this._renderer
}
_scalesReady() {
const e = this._model.timeScale(),
t = this._study.priceScale();
return e && null !== t && !e.isEmpty() && !t.isEmpty()
}
_updateImpl() {
if (this._items = [], !this._scalesReady()) return;
const e = this._model.timeScale(),
t = this._study.priceScale(),
i = e.visibleBarsStrictRange();
if (null === i || null === t) return;
let r = this._series.nearestIndex(i.firstBar(), c.PlotRowSearchMode.NearestRight),
n = this._series.nearestIndex(i.lastBar(), c.PlotRowSearchMode.NearestLeft);
if (void 0 === r || void 0 === n) return;
const o = this._study.offset(this._plotName);
o > 0 ? (r -= o, n += o) : (r += o, n -= o);
const a = this._study.getMinFirstBarIndexForPlot(this._plotName);
if (a > n) return;
r = Math.max(a, r);
const l = this._study.data(),
h = this._study.firstValue();
if (null === h) return;
const u = l.rangeIterator(r, n),
d = this._getTranspValue();
let p = [];
const _ = this._model.selection().isSelected(this._study);
_ ? (p = this._selectionIndexer.indexes(), this._selectionData = {
points: [],
hittestResult: N.HitTestResult.REGULAR,
vertOffset: 0,
bgColors: [],
barSpacing: e.barSpacing(),
visible: !0
}) : (this._selectionIndexer.clear(), this._selectionData = null);
const m = this._series.properties().style.value(),
f = 2 === m ? "lineStyle" : 3 === m ? "areaStyle" : null;
let g, b;
f ? (g = this._series.properties()[f].priceSource.value(), b = g) : (g = "high", b =
"low");
const v = t.isInverted(),
S = t.coordinateToPrice(t.height() * t.topMargin(), h),
y = t.coordinateToPrice(t.height() * (1 - t.bottomMargin()), h);
this._topCoord = v ? y : S, this._bottomCoord = v ? S : y;
const w = Object(s.ensureNotNull)(this._model.paneForSource(this._study)).height(),
P = this._study.properties().styles[this._plotName],
C = P.color.value(),
x = P.textColor ? P.textColor.value() : void 0,
T = C,
I = C,
M = void 0 === x ? void 0 : x,
O = Object(s.ensureNotNull)(this._plotIndex),
L = Object(A.createEmptyStyle)();
for (; u.hasNext();) {
const e = u.next(),
t = e.index,
i = e.value,
s = Math.floor(t + o),
r = i[O + 1];
if (null == r) continue;
const n = this._createItem(s, r, g, b);
if (null !== n) {
if (this._colorProvider.isColorDefined()) {
n.style = {
color: T,
borderColor: I,
textColor: M
};
const e = this._colorProvider.getPlotPointStyle(i, L);
this._fillItemWithPointStyle(n, e, d)
}
_ && -1 !== p.indexOf(t) && null !== this._selectionData && (this
._selectionData.points.push(n), this._selectionData.bgColors.push(
this._model.backgroundColorAtYPercentFromTop(n.y / w))), this
._items.push(n)
}
}
this._convertItemsToCoordinates()
}
_fillItemWithPointStyle(e, t, i) {
const r = Object(s.ensureDefined)(e.style);
if (void 0 !== t.colors[A.ColorerType.Main]) {
r.color = Object(M.generateColor)(Object(s.ensureDefined)(t.colors[A.ColorerType
.Main]), i);
const e = i > 9 ? i - 10 : 0;
r.borderColor = Object(M.generateColor)(r.color, e)
}
void 0 !== t.colors[A.ColorerType.Text] && (r.textColor = Object(M.generateColor)(
Object(s.ensureDefined)(t.colors[A.ColorerType.Text]), i))
}
_updateRenderer(e) {
this._updateImpl();
const t = this._model.timeScale(),
i = {},
s = this._getTranspValue(),
r = t.barSpacing(),
n = this._calculateShapeHeight(r),
o = this._study.properties().styles[this._plotName].location.value(),
a = this._calculateVerticalOffset(o, n + n / 2);
i.barSpacing = r, i.items = this._items, i.color = Object(M.generateColor)(this
._study.properties().styles[this._plotName].color.value(), s), i.height = n,
i.vertOffset = a;
const l = this._study.properties().styles[this._plotName].plottype.value(),
c = B.a[l],
h = new O.CompositeRenderer;
c && h.append(this._createRenderer(c.paneRendererClass, i)), this._model.selection()
.isSelected(this._study) && this._isMarkersEnabled && null !== this
._selectionData && (this._selectionData.vertOffset = a, h.append(new V
.SelectionRenderer(this._selectionData))), this._renderer = h
}
_createRenderer(e, t) {
const i = le.get(e);
return new(Object(s.ensureDefined)(i))(t)
}
_getSeriesVal(e, t) {
const i = Object(F.barFunction)(e),
s = this._series.data().valueAt(t);
return null === s ? null : i(s)
}
_getTranspValue() {
let e = 0;
this._study.properties().transparency && (e = this._study.properties().transparency
.value(), e = Object(P.isNumber)(e) ? e : 50);
const t = this._study.properties().styles[this._plotName];
return t.transparency && (e = t.transparency.value(), e = Object(P.isNumber)(e) ?
e : 50), Object(R.clamp)(e, 0, 100)
}
_createItem(e, t, i, r) {
const n = this._study.properties().styles[this._plotName].location.value();
if ((null === t || 0 === t) && n !== p.c.Absolute) return null;
let o;
switch (n) {
case p.c.AboveBar:
const a = this._getSeriesVal(i, e);
if (null === a) return null;
o = a;
break;
case p.c.BelowBar:
const l = this._getSeriesVal(r, e);
if (null === l) return null;
o = l;
break;
case p.c.Top:
o = this._topCoord;
break;
case p.c.Bottom:
o = this._bottomCoord;
break;
case p.c.Absolute:
o = Object(s.ensureNotNull)(t);
break;
default:
throw new Error("Bad value: " + n)
}
return new I.Point(e, o)
}
_convertItemsToCoordinates() {
const e = this._model.timeScale(),
t = this._study.priceScale();
e.timedValuesToCoordinates(this._items);
const i = Object(s.ensureNotNull)(this._study.firstValue());
Object(s.ensureNotNull)(t).pointsArrayToCoordinates(this._items, i)
}
_calculateVerticalOffset(e, t) {
let i = 0;
switch (e) {
case p.c.AboveBar:
case p.c.Bottom:
i = -t;
break;
case p.c.BelowBar:
case p.c.Top:
i = t
}
return Object(s.ensureNotNull)(this._study.priceScale()).isInverted() && (i *= -1),
i
}
_calculateShapeHeight(e, t) {
let i = e;
switch (t) {
case x.PlotSymbolSize.Tiny:
i = .3 * e;
break;
case x.PlotSymbolSize.Small:
i = .6 * e;
break;
case x.PlotSymbolSize.Normal:
i = e;
break;
case x.PlotSymbolSize.Large:
i = 1.5 * e;
break;
case x.PlotSymbolSize.Huge:
i = 2 * e
}
return i
}
}
class he extends ce {
renderer() {
const e = this._study.properties().styles[this._plotName];
return e.visible && e.visible.value() && this._scalesReady() ? (this._invalidated &&
(this._updateRenderer(e), this._invalidated = !1), this._renderer) : null
}
_updateRenderer(e) {
this._updateImpl();
const t = this._model.timeScale(),
i = {},
s = this._getTranspValue(),
r = t.barSpacing();
let n;
if (e.size) {
const t = e.size.value();
n = this._calculateShapeHeight(25, t)
} else n = Math.round(r / 2);
n = Math.max(n, 1);
const o = e.location.value(),
a = Object(M.generateColor)(e.color.value(), s),
l = s > 19 ? s - 10 : 0,
c = this._calculateVerticalOffset(o, Math.round(1.5 * n));
i.barSpacing = r, i.items = this.items(), i.color = a, i.borderColor = Object(M
.generateColor)(e.color.value(), l), i.height = n, i.vertOffset = c;
const h = e.plottype.value(),
u = B.a[h],
d = new O.CompositeRenderer,
p = e.text ? e.text.value() : void 0;
if (void 0 !== p && "" !== p.trim()) {
let t = p.trim().replace(/\\n/gm, "\n");
t = Object(D.cleanButAmpersand)(t, !0), i.text = t, i.fontSize = 12;
const r = e.textColor ? e.textColor.value() : void 0;
i.textColor = r ? Object(M.generateColor)(r, s) : a
}
d.append(super._createRenderer(u.paneRendererClass, i)), this._model.selection()
.isSelected(this._study) && this._isMarkersEnabled && null !== this
._selectionData && (this._selectionData.vertOffset = c, d.append(new V
.SelectionRenderer(this._selectionData))), this._renderer = d
}
}
var ue = i("/SnT"),
de = i.n(ue),
pe = i("Zp/P");
class _e extends Q {
constructor(e, t) {
super(e, t), this._heightEnsured = Object(s.ensureDefined)(this._height);
const i = e.char.slice(0, 40);
this._ch = de()(i)[0] || " ", this._fontFamily = e.fontFamily || $
.CHART_FONT_FAMILY, this._charCache = new Z(this._ch, !1, !1, this._fontFamily,
this._heightEnsured)
}
hitTest(e) {
const t = Object(pe.interactionTolerance)().series + this._heightEnsured / 2;
for (const i of this._items) {
if (new I.Point(i.x, i.y + i.vertOffset).subtract(e).length() <= t) return new N
.HitTestResult(N.HitTestResult.REGULAR)
}
return null
}
_drawItemShape(e, t, i) {
const s = i.x,
r = i.vertOffset > 0 ? 1 : -1,
n = i.y + i.vertOffset - r * Math.round(this._heightEnsured / 2);
let o;
o = i.style && void 0 !== i.style.color ? i.style.color : this._color, this
._charCache.paintTo(e, t, o, s, n, G.Center, i.vertOffset > 0 ? q.Top : q
.Bottom)
}
_startPath(e, t, i, s) {}
_endPath(e) {}
}
class me extends ce {
renderer() {
const e = this._study.properties().styles[this._plotName];
if (!e.visible || !e.visible.value()) return null;
if (!this._scalesReady()) return null;
const t = this._model.timeScale();
this._invalidated && (this._updateImpl(), this._invalidated = !1);
const i = {},
s = this._getTranspValue(),
r = t.barSpacing();
let n;
if (e.size) {
const t = e.size.value();
n = this._calculateShapeHeight(50, t)
} else n = Math.round(r);
const o = e.location.value(),
a = Object(M.generateColor)(e.color.value(), s),
l = this._calculateVerticalOffset(o, n);
i.items = this.items(), i.barSpacing = r, i.char = e.char.value(), i.height = n, i
.vertOffset = l, i.color = a;
const c = new O.CompositeRenderer,
h = e.text ? e.text.value() : void 0;
if (void 0 !== h && "" !== h.trim()) {
let t = h.trim().replace(/\\n/gm, "\n");
t = Object(D.cleanButAmpersand)(t, !0), i.text = t, i.fontSize = 12;
const r = e.textColor ? e.textColor.value() : void 0;
i.textColor = r ? Object(M.generateColor)(r, s) : a
}
return c.append(new _e(i)), this._model.selection().isSelected(this._study) && this
._isMarkersEnabled && null !== this._selectionData && (this._selectionData
.vertOffset = l, c.append(new V.SelectionRenderer(this._selectionData))), c
}
}
var fe = i("eJTA");
class ge extends I.Point {
constructor(e, t, i, s) {
super(e, t), this.height = i, this.isUp = s, this.style = {}
}
}
function be(e) {
return Math.round(e / 4)
}
function ve(e) {
return Math.round(e / 2)
}
class Se {
constructor(e) {
this._data = e
}
draw(e, t) {
var i;
const s = t.pixelRatio,
r = this._data,
n = ve(r.barSpacing),
o = be(r.barSpacing),
a = n < 4,
l = Math.max(n / 2, 1),
c = Object(R.ceiledEven)(n * s),
h = c / 2,
u = Math.round(n * s);
e.lineCap = "butt", e.lineWidth = Math.max(1, Math.floor(s));
const d = e.lineWidth % 2 ? .5 : 0;
for (const t of r.items) {
const n = t.isUp ? -1 : 1,
p = Math.round(Math.abs(t.height) * s),
_ = Math.round(t.x * s) + d,
m = Math.round((t.y - n * o) * s) + d;
e.beginPath(), e.translate(_, m);
const f = null !== (i = t.style && t.style.color) && void 0 !== i ? i : t.isUp ?
r.colorup : r.colordown;
a ? (e.moveTo(0, 0), e.lineTo(-h, -h * n), e.moveTo(0, 0), e.lineTo(h, -h * n),
e.moveTo(0, 0), e.lineTo(0, -p * n), e.moveTo(-h, -p * n), e.lineTo(h, -
p * n), e.lineWidth = l, e.strokeStyle = f, e.stroke()) : (e.moveTo(
0, 0), p < u ? (e.lineTo(c, -p * n), e.lineTo(-c, -p * n)) : (e
.lineTo(c, -u * n), e.lineTo(h, -u * n), e.lineTo(h, -p * n), e
.lineTo(-h, -p * n), e.lineTo(-h, -u * n), e.lineTo(-c, -u * n)), e
.lineTo(0, 0), e.strokeStyle = t.isUp ? r.colorBorderUp : r
.colorBorderDown, e.stroke(), e.fillStyle = f, e.fill()), e.translate(-
_, -m)
}
}
hitTest(e) {
const t = this._data,
i = ve(t.barSpacing),
s = Math.round(i / 2),
r = Math.round(i),
n = be(t.barSpacing);
for (const i of t.items) {
if (!i) continue;
if (!Number.isFinite(i.x) || !Number.isFinite(i.y)) continue;
const t = Math.abs(i.height),
o = i.isUp ? -1 : 1,
a = t + r,
l = i.y - o * n,
c = l - o * a,
h = i.x - s,
u = i.x + s;
if (h < e.x && e.x < u && (i.isUp ? l < e.y && e.y < c : c < e.y && e.y < l))
return new N.HitTestResult(N.HitTestResult.REGULAR)
}
return null
}
}
class ye extends V.SelectionRenderer {
_drawMarker(e, t, i, r, n) {
const o = Object(s.ensureNotNull)(this._data),
a = t.isUp ? 1 : -1;
const l = i + a * be(o.barSpacing) + a * ve(o.barSpacing);
let c = Math.round(3.5 * n * 2);
c % 2 != r % 2 && (c += 1);
const h = r % 2 / 2,
u = Math.round(t.x * n) + h,
d = Math.round((t.y + l) * n) + h;
e.beginPath(), e.arc(u, d, c / 2, 0, 2 * Math.PI, !0), e.closePath(), e.fill(),
e.stroke()
}
}
class we extends ce {
constructor() {
super(...arguments), this._maxAbsValue = 0
}
renderer() {
if (!this._study.properties().styles[this._plotName].visible) return null;
if (!this._study.properties().styles[this._plotName].visible.value()) return null;
if (!this._scalesReady()) return null;
this._invalidated && (this._updateImpl(), this._invalidated = !1);
const e = {},
t = Object(R.clamp)(this._getTranspValue(), 0, 100),
i = this._model.timeScale().barSpacing();
e.items = this._items, e.barSpacing = i, e.colorup = Object(M.generateColor)(this
._study.properties().styles[this._plotName].colorup.value(), t), e
.colordown = Object(M.generateColor)(this._study.properties().styles[this
._plotName].colordown.value(), t);
const s = Object(fe.parseRgba)(e.colorup),
r = s ? 100 * (1 - s[3]) : 0,
n = Object(fe.parseRgba)(e.colordown),
o = n ? 100 * (1 - n[3]) : 0;
e.colorBorderUp = Object(M.generateColor)("#000000", r), e.colorBorderDown = Object(
M.generateColor)("#000000", o), e.minHeight = this._study.properties()
.styles[this._plotName].minHeight.value(), e.maxHeight = this._study
.properties().styles[this._plotName].maxHeight.value();
const a = new O.CompositeRenderer;
if (a.append(new Se(e)), this._model.selection().isSelected(this._study) && null !==
this._selectionData) {
const e = this._selectionData;
e.barSpacing = i, a.append(new ye(e))
}
return a
}
_fillItemWithPointStyle(e, t, i) {
const r = Object(s.ensureDefined)(e.style);
e.isUp ? void 0 !== t.colors[A.ColorerType.Up] ? r.color = Object(M.generateColor)(
Object(s.ensureDefined)(t.colors[A.ColorerType.Up]), i) : r.color = Object(M
.generateColor)(this._study.properties().styles[this._plotName].colorup
.value(), i) : void 0 !== t.colors[A.ColorerType.Down] ? r.color = Object(M
.generateColor)(Object(s.ensureDefined)(t.colors[A.ColorerType.Down]), i) :
r.color = Object(M.generateColor)(this._study.properties().styles[this
._plotName].colordown.value(), i)
}
_createItem(e, t, i, s) {
if (0 === t) return null;
Math.abs(t) > this._maxAbsValue && (this._maxAbsValue = Math.abs(t));
const r = t > 0;
let n;
if (r) {
const t = this._getSeriesVal(s, e);
if (null === t) return null;
n = t
} else {
const t = this._getSeriesVal(i, e);
if (null === t) return null;
n = t
}
return new ge(e, n, t, r)
}
_convertItemsToCoordinates() {
const e = this._model.timeScale(),
t = Object(s.ensureNotNull)(this._study.priceScale());
e.timedValuesToCoordinates(this._items), t.pointsArrayToCoordinates(this._items,
Object(s.ensureNotNull)(this._study.firstValue()));
let i = Math.abs(this._study.properties().styles[this._plotName].minHeight.value()),
r = Math.abs(this._study.properties().styles[this._plotName].maxHeight.value());
if (i > r) {
const e = i;
i = r, r = e
}
const n = (r - i) / this._maxAbsValue,
o = this._items;
for (let e = 0; e < o.length; e++) {
const t = o[e],
s = Math.abs(t.height);
t.height = s * n + i
}
}
}
var Pe = i("29fS");
class Ce {
constructor(e, t, i, s) {
this._bars = [], this._invalidated = !1, this._isMarkersEnabled = T.enabled(
"source_selection_markers"), this._selectionData = null, this
._ohlcPlotIndexes = new Map, this._study = e, this._series = t, this._model = i,
this._plotName = s, this._isMarkersEnabled = T.enabled(
"source_selection_markers"), this._colorProvider = Object(E
.createStudyPlotColorProvider)(e.metaInfo(), e.properties(), s), this
._selectionIndexer = new j.SelectionIndexes(i.timeScale());
const r = this._study.metaInfo().plots;
for (let e = 0; e < r.length; e++) {
const t = r[e];
"target" in t && (t.target === this._plotName && (Object(x.isOhlcOpenPlot)(t) &&
this._ohlcPlotIndexes.set(1, e), Object(x.isOhlcHighPlot)(t) && this
._ohlcPlotIndexes.set(2, e), Object(x.isOhlcLowPlot)(t) && this
._ohlcPlotIndexes.set(3, e), Object(x.isOhlcClosePlot)(t) && this
._ohlcPlotIndexes.set(4, e)))
}
}
update() {
this._invalidated = !0
}
items() {
return this._bars
}
_updateImpl() {
this._bars.length = 0;
const e = this._study.priceScale();
if (this._model.timeScale().isEmpty() || null === e || e.isEmpty()) return;
const t = this._model.timeScale().visibleBarsStrictRange();
if (null === t) return;
let i = this._series.nearestIndex(t.firstBar(), c.PlotRowSearchMode.NearestRight);
const r = this._series.nearestIndex(t.lastBar(), c.PlotRowSearchMode.NearestLeft);
if (void 0 === i || void 0 === r) return;
const n = this._study.getMinFirstBarIndexForPlot(this._plotName);
if (n > r) return;
i = Math.max(n, i);
const o = this._study.data(),
a = this._study.firstValue();
if (null === a) return;
const l = o.rangeIterator(i, r),
h = this._study.properties().ohlcPlots[this._plotName],
u = new Map,
d = (e, t) => {
const i = e + "@" + t;
if (!u.has(i)) {
const s = Object(M.generateColor)(e, t);
return u.set(i, s), s
}
return u.get(i)
},
p = Object(A.createEmptyStyle)();
for (; l.hasNext();) {
const e = l.next();
let t = e.index;
const i = e.value;
t = Math.floor(t);
let r = !0;
const n = new Map;
for (let e = 1; e <= 4; ++e) {
const t = this._ohlcPlotIndexes.get(e);
if (void 0 === t) {
r = !1;
break
}
const s = i[t + 1];
if (null == s) {
r = !1;
break
}
n.set(e, s)
}
if (!r) continue;
const o = Object(s.ensureDefined)(n.get(1)),
a = Object(s.ensureDefined)(n.get(4)),
c = Object(s.ensureDefined)(n.get(2)),
u = Object(s.ensureDefined)(n.get(3)),
_ = Math.max(o, c, u, a),
m = Math.min(o, c, u, a);
let f = Object(s.ensureDefined)(d(h.color.value(), 0));
const g = this._colorProvider.getPlotPointStyle(i, p);
void 0 !== g.colors[A.ColorerType.Main] && (f = Object(s.ensureDefined)(g
.colors[A.ColorerType.Main]));
const b = {
time: Math.round(t),
open: o,
high: _,
low: m,
close: a,
color: f,
wickColor: g.colors[A.ColorerType.Wick],
borderColor: g.colors[A.ColorerType.Border],
hollow: null
};
this._bars.push(b)
}
if (e.barPricesToCoordinates(this._bars, a), this._model.timeScale()
.barIndexesToCoordinates(this._bars), this._model.selection().isSelected(this
._study)) {
const t = this._selectionIndexer.indexes();
this._selectionData = {
points: [],
hittestResult: N.HitTestResult.REGULAR,
bgColors: [],
visible: !0,
barSpacing: this._model.timeScale().barSpacing()
};
const i = Object(s.ensureNotNull)(this._model.paneForSource(this._study))
.height(),
r = Object(s.ensureDefined)(this._ohlcPlotIndexes.get(4));
for (let s = 0; s < t.length; s++) {
const n = t[s],
o = this._study.data().valueAt(n);
if (null === o) continue;
const l = o[r + 1];
if (null == l) continue;
const c = this._model.timeScale().indexToCoordinate(Math.floor(n)),
h = e.priceToCoordinate(l, a);
this._selectionData.points.push(new I.Point(c, h)), this._selectionData
.bgColors.push(this._model.backgroundColorAtYPercentFromTop(h / i))
}
} else this._selectionIndexer.clear()
}
}
class xe extends Ce {
renderer() {
if (!this._study.properties().ohlcPlots[this._plotName].visible.value())
return null;
this._invalidated && (this._updateImpl(), this._invalidated = !1);
const e = {
bars: this._bars,
barSpacing: this._model.timeScale().barSpacing(),
dontDrawOpen: this._series.properties().barStyle.dontDrawOpen.value(),
thinBars: this._series.properties().barStyle.thinBars.value()
},
t = new O.CompositeRenderer;
return t.append(new Pe.PaneRendererBars(e)), this._model.selection().isSelected(this
._study) && this._isMarkersEnabled && this._selectionData && t.append(new V
.SelectionRenderer(this._selectionData)), t
}
}
var Te = i("/hKg");
class Ie extends Ce {
renderer() {
const e = this._study.properties().ohlcPlots[this._plotName];
if (!e.visible.value()) return null;
this._invalidated && (this._updateImpl(), this._invalidated = !1);
const t = this._model.timeScale().barSpacing(),
i = {
bars: this._bars,
barSpacing: t,
wickVisible: e.drawWick.value(),
bodyVisible: !0,
borderVisible: e.drawBorder.value(),
barWidth: Object(pe.optimalBarWidth)(t),
borderColor: e.borderColor.value(),
wickColor: e.wickColor.value()
},
s = new O.CompositeRenderer;
return s.append(new Te.PaneRendererCandles(i)), this._model.selection().isSelected(
this._series) && this._isMarkersEnabled && this._selectionData && s.append(
new V.SelectionRenderer(this._selectionData)), s
}
}
var Me = i("KtbP"),
Oe = i("wYrq"),
Le = i("2ijp"),
Ae = i("8Uy/");
class Ee extends Le.a {
constructor(e, t) {
super(), this._lineRendererData.linestyle = Ae.LINESTYLE_DOTTED, this._study =
e, this._plotName = t
}
_updateImpl() {
this._lineRendererData.visible = !1;
const e = this._study.properties().styles[this._plotName];
if (!e.trackPrice.value()) return;
const t = this._study.lastValueData(this._plotName, !0);
t.noData || (this._lineRendererData.visible = !0, this._lineRendererData.y = t
.coordinate, this._lineRendererData.color = t.color, this
._lineRendererData.linewidth = e.linewidth.value())
}
}
var ke = i("cPgM");
class De {
constructor() {
this._items = [], this._actualLength = 0, this._invalidations = 0
}
push(e) {
this._items.length === this._actualLength ? this._items.push(e) : this._items[this
._actualLength] !== e && (this._items[this._actualLength] = e), this
._actualLength += 1
}
newItem() {
const e = this._items.length > this._actualLength ? this._items[this
._actualLength] : null;
return null !== e && Boolean(e.invalidateCache) && e.invalidateCache(), e
}
invalidateCache() {
this._invalidations += 1, 3e3 === this._invalidations && (this._items.splice(this
._actualLength), this._invalidations = 0), this._actualLength = 0
}
at(e) {
return this._items[e]
}
data() {
return this._items
}
length() {
return this._actualLength
}
}
class Ve {
constructor() {
this._map = new Map, this._usedKeys = new Set, this._invalidations = 0
}
invalidateCache() {
this._invalidations += 1, 50 === this._invalidations && (this._deleteUnused(), this
._invalidations = 0), this._usedKeys.clear(), this._map.forEach((e, t) => e
.invalidateCache())
}
get(e) {
const t = this._map.get(e);
return void 0 !== t && this._usedKeys.add(e), t
}
set(e, t) {
this._usedKeys.add(e), this._map.set(e, t)
}
forEach(e) {
this._map.forEach((t, i) => {
this._usedKeys.has(i) && e(t, i)
})
}
delete(e) {
const t = this._map.get(e);
void 0 !== t && t.invalidateCache(), this._usedKeys.delete(e)
}
_deleteUnused() {
const e = [];
this._map.forEach((t, i) => {
this._usedKeys.has(i) || e.push(i)
});
for (const t of e) this._map.delete(t)
}
}
class Be extends De {
constructor() {
super(), this.points1 = new De, this.points2 = new De,
this.push(this.points1), this.push(this.points2)
}
addPoints1Point(e, t) {
let i = this.points1.newItem();
null !== i ? (i.x = e, i.y = t) : i = {
x: e,
y: t
}, this.points1.push(i)
}
addPoints2Point(e, t) {
let i = this.points2.newItem();
null !== i ? (i.x = e, i.y = t) : i = {
x: e,
y: t
}, this.points2.push(i)
}
invalidateCache() {
this.points1.invalidateCache(), this.points2.invalidateCache()
}
}
class Re extends ke.ScaledPaneRenderer {
constructor() {
super(...arguments), this._data = null
}
setData(e) {
this._data = e
}
hitTest(e, t) {
return null
}
_drawImpl(e, t) {
if (null === this._data) return;
const i = .25 * this._data.barSpacing,
s = this._data.transparency;
this._data.colorAreas.forEach((t, r) => {
e.beginPath();
for (let s = 0; s < t.length(); s++) {
const r = t.at(s);
if (0 === r.points1.length() || 0 === r.points2.length())
continue;
const n = r.points1.at(0).x,
o = r.points1.at(0).y;
if (e.moveTo(n, o), 1 !== r.points1.length() && 1 !== r.points2
.length()) {
for (let t = 1; t < r.points1.length(); t++) e.lineTo(r
.points1.at(t).x, r.points1.at(t).y);
for (let t = r.points2.length() - 1; t >= 0; t--) e.lineTo(r
.points2.at(t).x, r.points2.at(t).y)
} else {
const t = r.points2.at(0).x,
s = r.points2.at(0).y;
e.lineTo(n + i, o), e.lineTo(t + i, s), e.lineTo(t - i, s),
e.lineTo(n - i, o)
}
}
e.closePath(), e.fillStyle = Object(M.generateColor)(r, s), e.fill()
})
}
}
var Ne = i("ZJKN");
class je extends De {
constructor() {
super(...arguments), this._startIndex = 0
}
setStartIndex(e) {
this._startIndex = e
}
at(e) {
const t = e - this._startIndex;
for (; t >= this._actualLength;) {
if (this._items.length <= t) this._items.push({
plot1Value: void 0,
plot2Value: void 0,
colorIndex: void 0
});
else {
const e = this._items[this._actualLength];
e.plot1Value = void 0, e.plot2Value = void 0, e.colorIndex = void 0
}
this._actualLength += 1
}
return this._items[t]
}
}
class Fe {
constructor(e, t = !1) {
this._isHlineFill = !1, this._bandAKey = null, this._bandBKey = null, this
._colorPlotIndex = null, this._colorValues = [], this._colors = new De, this
._areaRenderer = new Re, this._invalidated = !0, this._plIndex1 = null, this
._plIndex2 = null, this._level1 = 0, this._level2 = 0, this._studyValuesCache =
new je, this._points1 = new De, this._points2 = new De, this._timePoints =
new De, this._colorAreas = new Ve, this._source = e, this._fillGaps = t
}
update() {
this._invalidated = !0
}
renderer(e, t) {
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
._areaRenderer
}
_correctVisibleRange(e) {
const t = this._source.data(),
i = t.search(e.firstBar(), c.PlotRowSearchMode.NearestLeft, this._plotIndex1()),
s = t.search(e.firstBar(), c.PlotRowSearchMode.NearestLeft, this._plotIndex2()),
r = t.search(e.lastBar(), c.PlotRowSearchMode.NearestRight, this._plotIndex1()),
n = t.search(e.lastBar(), c.PlotRowSearchMode.NearestRight, this._plotIndex2()),
o = null !== i ? i.index : e.firstBar(),
a = null !== s ? s.index : e.firstBar(),
l = null !== r ? r.index : e.lastBar(),
h = null !== n ? n.index : e.lastBar();
return [Math.min(o, a), Math.max(l, h)]
}
_plotNames() {
return this._source.metaInfo().plots.map(e => e.id)
}
_plotIndex1() {
return null === this._plIndex1 && (this._plIndex1 = this._plotNames().indexOf(this
._plotAId()) + 1), this._plIndex1
}
_plotIndex2() {
return null === this._plIndex2 && (this._plIndex2 = this._plotNames().indexOf(this
._plotBId()) + 1), this._plIndex2
}
_updateImpl() {
var e, t, i;
if (this._areaRenderer.setData(null), !this._visible()) return;
const r = this._source.priceScale(),
n = this._source.model(),
o = n.timeScale();
if (!r || r.isEmpty() || o.isEmpty()) return;
if (n.mainSeries().bars().isEmpty()) return;
const a = this._source.firstValue();
if (null === a) return;
if (this._isHlineFill) {
const e = this._source.properties().bands[Object(s.ensureNotNull)(this
._bandAKey)],
t = this._source.properties().bands[Object(s.ensureNotNull)(this
._bandBKey)];
this._level1 = r.priceToCoordinate(e.value.value(), a), this._level2 = r
.priceToCoordinate(t.value.value(), a)
}
const l = o.visibleBarsStrictRange();
if (null === l) return;
this._timePoints.invalidateCache(), this._points1.invalidateCache(), this._points2
.invalidateCache(), null === (e = this._colors) || void 0 === e || e
.invalidateCache(), this._colorAreas.invalidateCache();
const [c, h] = this._correctVisibleRange(l), u = this._isPerBarColoringSupported() ?
this._colors : null, d = this._source.offset(this._plotAId()), p = this._source
.offset(this._plotBId()), _ = Math.min(d, p), m = Math.max(d, p), f = this
._plotIndex1(), g = this._plotIndex2(), b = this._source.data();
if (b.isEmpty()) return;
let v, S;
const y = Object(s.ensureNotNull)(b.firstIndex()),
w = Object(s.ensureNotNull)(b.lastIndex()),
C = y - Math.max(0, -_),
x = w + Math.max(0, m),
T = Math.max(c - 1, C),
I = Math.min(h + 1, x),
M = this._studyValuesCache;
M.invalidateCache();
const O = T - m,
L = b.rangeIterator(O, I - _),
A = Math.max(l.firstBar() - 1, Math.min(O - m - 1, O - 1 + _));
M.setStartIndex(A);
const E = new Ne.BarsRange(l.firstBar() - 1, l.lastBar() + 1);
for (; L.hasNext();) {
const e = L.next(),
t = e.index,
i = e.value,
r = i[f],
n = i[g],
o = t + d,
a = t + p;
if (o === a && E.contains(o)) {
const e = M.at(o);
e.plot1Value = r, e.plot2Value = n
} else {
if (E.contains(o)) {
M.at(o).plot1Value = r
}
if (E.contains(a)) {
M.at(a).plot2Value = n
}
}
if (null !== u) {
const e = t - 1 + _;
if (l.contains(e)) {
const t = i[Object(s.ensureNotNull)(this._colorPlotIndex) + 1];
M.at(e).colorIndex = t
}
}
}
const k = this._timePoints,
D = this._points1,
V = this._points2;
let B = null;
const R = A + M.length();
for (let e = A; e <= R; e++) {
if (!this._fillGaps && (null === v || null === S)) {
const t = e - 1;
k.push(t), D.push(NaN), V.push(NaN), null == u || u.push(null)
}
const s = M.at(e);
if (null !== u) {
const e = s.colorIndex;
B = null == e ? null : this._getColorByPlotValue(e)
}
if (this._isHlineFill) {
k.push(e), null !== u && u.push(B);
continue
}
const r = null !== (t = s.plot1Value) && void 0 !== t ? t : null,
n = null !== (i = s.plot2Value) && void 0 !== i ? i : null;
(null !== r || null !== n || Number.isFinite(v) || Number.isFinite(S)) && (v =
r, S = n, D.push(r), V.push(n), k.push(e), null !== u && u.push(B))
}
r.pricesArrayToCoordinates(D.data(), a, D.length()), r.pricesArrayToCoordinates(V
.data(), a, V.length()), o.indexesToCoordinates(k.data(), k.length());
const N = this._transparency();
let j = Object(P.isNumber)(N) ? N : 50;
j = Math.min(j, 100), j = Math.max(j, 0);
const F = {
barSpacing: this._source.model().timeScale().barSpacing(),
transparency: j,
colorAreas: this._getFilledAreas(k, D, V, u)
};
this._areaRenderer.setData(F)
}
_getFilledAreas(e, t, i, s) {
const r = this._isHlineFill;
if (!r && (0 === t.length() || 0 === i.length())) return new Ve;
const n = this._colorAreas;
let o = null,
a = null;
const l = this._color();
for (let c = 0; c < e.length(); c++) {
const h = r ? this._level1 : t.at(c),
u = r ? this._level2 : i.at(c),
d = e.at(c),
p = Object(pe.coordinateIsValid)(h),
_ = Object(pe.coordinateIsValid)(u);
if (this._fillGaps ? p || _ : p && _) {
const e = s ? s.at(c) || "" : l;
if (a !== e || null === o) {
a = e, null !== o && (p && o.addPoints1Point(d, h), _ && o
.addPoints2Point(d, u));
const t = n.get(e) || new De;
o = t.newItem() || new Be, t.push(o), n.set(e, t)
}
p && o.addPoints1Point(d, h), _ && o.addPoints2Point(d, u)
} else this._fillGaps || (a = null, o = null)
}
return n.delete(""), n
}
}
class We extends Fe {
constructor(e) {
super(e)
}
_plotAId() {
return this._source.properties().area[0].name.value()
}
_plotBId() {
return this._source.properties().area[1].name.value()
}
_color() {
return this._source.properties().areaBackground.backgroundColor.value()
}
_transparency() {
const e = this._source.properties().areaBackground.transparency.value();
return Object(R.clamp)(e, 0, 100)
}
_visible() {
return this._source.properties().areaBackground.fillBackground.value()
}
_getColorByPlotValue(e) {
return this._color()
}
_isPerBarColoringSupported() {
return !1
}
}
class He extends Fe {
constructor(e, t, i) {
super(e, !!t.fillgaps), this._isHlineFill = "hline_hline" === t.type, Object(s
.assert)(this._isHlineFill || "plot_plot" === t.type,
"Wrong filledArea type: " + t.type), this._isHlineFill && this
._initBandIndexes(t.objAId, t.objBId), this._fillMetaInfo = t, this
._fillStyleProps = i;
const r = e.metaInfo();
for (let i = 0; i < r.plots.length; ++i) {
const n = r.plots[i];
if ("palette" in n && n.palette === t.palette) {
this._colorPlotIndex = i, this._colorsMap = Object(s.ensureDefined)(Object(s
.ensureDefined)(r.palettes)[t.palette]).valToIndex, this
._colorValues = e.properties().palettes[t.palette].colors;
break
}
if (r.isRGB && "target" in n && n.target === t.id) {
this._colorPlotIndex = i;
break
}
}
}
_getColorByPlotValue(e) {
if (this._colorsMap) {
const t = Object(s.ensureDefined)(this._colorsMap)[e];
return this._colorValues[Object(s.ensureDefined)(t)].childs().color.value()
}
return Object(M.rgbaFromInteger)(e)
}
_isPerBarColoringSupported() {
return null !== this._colorPlotIndex
}
_plotAId() {
return this._fillMetaInfo.objAId
}
_plotBId() {
return this._fillMetaInfo.objBId
}
_color() {
return this._fillStyleProps.childs().color.value()
}
_transparency() {
return this._fillStyleProps.childs().transparency.value()
}
_correctVisibleRange(e) {
const [t, i] = super._correctVisibleRange(e), s = this._source
.getMinFirstBarIndexForPlot(this._fillMetaInfo.id);
return [Math.max(s, t), i]
}
_visible() {
return this._fillStyleProps.childs().visible.value()
}
_initBandIndexes(e, t) {
this._bandAKey = null, this._bandBKey = null;
const i = this._source.metaInfo().bands;
if (void 0 !== i)
for (let s = 0; s < i.length; ++s) {
const r = i[s];
null !== this._bandAKey || r.id !== e ? null === this._bandBKey && r.id ===
t && (this._bandBKey = s) : this._bandAKey = s
}
}
}
var Ue = i("l4sv");
class ze {
constructor(e, t) {
this._invalidated = !0, this._lineRenderer = new Ue.HorizontalLineRenderer, this
._source = t, this._points = [new I.Point(-1, -1)], this._invalidated = !0, this
._properties = e
}
update() {
this._invalidated = !0
}
renderer() {
this._invalidated && (this._updateImpl(), this._invalidated = !1);
const e = {
y: this._points[0].y,
color: this._properties.childs().color.value(),
linewidth: this._properties.childs().linewidth.value(),
linestyle: this._properties.childs().linestyle.value()
};
return this._lineRenderer.setData(e), this._lineRenderer
}
_updateImpl() {
const e = this._source.priceScale();
if (!e || e.isEmpty()) return void(this._points[0] = new I.Point(-1, -1));
const t = this._properties.childs().value.value(),
i = this._source.firstValue(),
s = Object(P.isNumber)(t) && null !== i ? e.priceToCoordinate(t, i) : NaN;
this._points[0] = new I.Point(-1, s)
}
}
class Ge extends ke.ScaledPaneRenderer {
constructor() {
super(), this._data = null, this._data = null
}
setData(e = null) {
this._data = e
}
hitTest() {
return null
}
_drawImpl(e, t) {
if (null === this._data || 0 === this._data.points.length) return;
const i = t.cssWidth;
e.fillStyle = Object(M.generateColor)(this._data.backcolor, this._data
.transparency);
const s = Math.min(this._data.points[0], this._data.points[1]),
r = Math.max(this._data.points[0], this._data.points[1]);
e.fillRect(0, s, i, r - s)
}
}
class qe {
constructor(e) {
this._points = [], this._bandBgRenderer = new Ge, this._source = e
}
update() {
if (this._points = [], this._source.properties().bands.length < 2) return;
if (!this._source.properties().bandsBackground.fillBackground.value()) return;
const e = this._source.properties().bands[0],
t = this._source.properties().bands[1],
i = this._source.priceScale(),
s = this._source.firstValue();
i && !i.isEmpty() && null !== s && (this._points.push(i.priceToCoordinate(e.value
.value(), s)), this._points.push(i.priceToCoordinate(t.value.value(),
s)))
}
renderer() {
const e = {
points: this._points,
backcolor: this._source.properties().bandsBackground.backgroundColor
.value(),
transparency: this._source.properties().bandsBackground.transparency.value()
};
return this._bandBgRenderer.setData(e), this._bandBgRenderer
}
}
class Ye {
constructor(e, t, i) {
this._points = [], this._bandBgRenderer = new Ge, this._bandAKey = null, this
._bandBKey = null, this._source = e, Object(s.assert)("hline_hline" === t.type,
"Wrong filledArea type: " + t.type), this._initBandIndexes(t.objAId, t
.objBId), this._fillStyleProps = i, this._bandBgRenderer = new Ge
}
update() {
if (this._points = [], !this._fillStyleProps.childs().visible.value()) return;
if (null === this._bandAKey || null === this._bandBKey) return;
const e = this._source.properties().bands[this._bandAKey],
t = this._source.properties().bands[this._bandBKey],
i = this._source.priceScale(),
s = this._source.firstValue();
i && !i.isEmpty() && null !== s && (this._points.push(i.priceToCoordinate(e.value
.value(), s)), this._points.push(i.priceToCoordinate(t.value.value(),
s)))
}
renderer() {
let e = this._fillStyleProps.childs().transparency.value();
e = Object(R.clamp)(e, 0, 100);
const t = {
points: this._points,
backcolor: Object(M.generateColor)(this._fillStyleProps.childs().color
.value(), e),
transparency: this._fillStyleProps.childs().transparency.value()
};
return this._bandBgRenderer.setData(t), this._bandBgRenderer
}
_initBandIndexes(e, t) {
this._bandAKey = null, this._bandBKey = null;
Object(s.ensureDefined)(this._source.metaInfo().bands).forEach((i, s) => {
null === this._bandAKey && i.id === e && (this._bandAKey = s), null ===
this._bandBKey && i.id === t && (this._bandBKey = s)
})
}
}
var Ke = i("bmVy"),
Je = i("eCE5");
i.d(t, "StudyBase", (function() {
return st
}));
const Ze = Object(r.getLogger)("Chart.Study"),
Xe = window.t("Invalid Symbol");
const $e = {
symbolsForDisplay: !1,
symbolsForChartApi: !0,
skipHiddenInputs: !1,
skipFakeInputs: !1,
skipBooleanInputs: T.enabled("dont_show_boolean_study_arguments"),
asObject: !0,
skippedGroups: [],
skippedInputs: [],
noExchanges: !1,
noResolution: !1,
keepOptionalSymbolsEmpty: !1,
skipColorInputs: !1,
skipTimeInputs: !1,
skipOptionalEmptySymbolInputs: !1
},
Qe = T.enabled("study_symbol_ticker_description");
function et(e, t) {
const i = e.plots[t];
if (!i || !Object(x.isOhlcPlot)(i)) return !1;
const s = i.target,
r = e.defaults.styles && e.defaults.styles[s],
n = e.defaults.ohlcPlots && e.defaults.ohlcPlots[s],
o = e.ohlcPlots && e.ohlcPlots[s];
return r && Object(x.isOhlcPlotStyleBars)(r) || n && Object(x.isOhlcPlotStyleBars)(n) || !!
o && Object(x.isOhlcPlotStyleBars)(o)
}
function tt(e, t) {
const i = e.plots[t];
if (!i || !Object(x.isOhlcPlot)(i)) return !1;
const s = i.target,
r = e.defaults.styles && e.defaults.styles[s],
n = e.defaults.ohlcPlots && e.defaults.ohlcPlots[s],
o = e.ohlcPlots && e.ohlcPlots[s];
return r && Object(x.isOhlcPlotStyleCandles)(r) || n && Object(x.isOhlcPlotStyleCandles)(
n) || !!o && Object(x.isOhlcPlotStyleCandles)(o)
}
function it(e, t) {
Object(s.assert)(void 0 !== e, "zOrder must be defined"), Object(s.assert)(!t.has(e),
"zOrder must be unique")
}
class st extends a.PriceDataSource {
constructor(e, t, i, s) {
super(e), this.onStart = new o.a, this._symbolsResolved = new o.a, this
._statusChanged = new o.a, this._paneViews = [], this._priceAxisViews = [],
this._resolvedSymbols = {}, this._resolvedSymbolsByInput = {}, this
._isChildStudy = !1, this._status = {
type: Ke.StudyStatusType.Undefined
}, this._studyId = null, this._isSubscribedToSessionId = !1, this
._titleStrCache = {}, this._titleInPartsCache = {}, this._children = [],
this._numericFormatter = new C.NumericFormatter, this
._priceAxisViewsBase = [], this._priceLinesAxisViews = [], this
._labelPaneViews = [], this._ownFirstValue = null, this
._pendingResolveSymbols = new Map, this._onIsActualIntervalChange = new o.a,
this._lastNonEmptyPlotRowCache = {}, this._chartApi = e.chartApi(), this
._properties = t, this._metaInfo = s, this._series = this._model
.mainSeries(), this._series.onIntervalChanged().subscribe(this, this
._calcIsActualInterval), this._showStudyArgumentsProperty = e
.properties().paneProperties.legendProperties.showStudyArguments,
i instanceof st && (this._source = i, this._isChildStudy = !0, this._source
.setChild(this));
const r = this.parentSource();
r.currencyChanged().subscribe(this, this._onSourceCurrencyChanged), r
.unitChanged().subscribe(this, this._onSourceUnitChanged), r
.priceRangeReadyChanged().subscribe(this, this
._onSourcePriceRangeReadyChanged), r.formatterChanged().subscribe(this,
this._onSourceFormatterChanged), r.priceStepChanged().subscribe(this,
this._onSourcePriceStepChanged), Qe && this._model.mainSeries()
.properties().statusViewStyle.symbolTextSource.listeners().subscribe(this,
() => {
this.invalidateTitleCache(!0)
}), this._properties.subscribe(this, this._onPropertiesChanged), this
._properties.visible.subscribe(this, this._visibleChanged), this._properties
.visible.subscribe(this, this.processHibernate),
this._properties.intervalsVisibilities.subscribe(this, this
._calcIsActualInterval);
for (let e = 0; e < this._metaInfo.plots.length; e++) {
const t = this._metaInfo.plots[e].id,
i = this.properties().styles[t];
null != i && null != i.visible && i.visible.subscribe(this, this
.processHibernate)
}
for (const e of Object.keys(this._metaInfo.graphics))
for (const t of Object.keys(this._metaInfo.graphics[e])) {
const i = this._properties.graphics[e][t];
i.visible && i.visible.subscribe(this, this.processHibernate)
}
this._isActualInterval = Object(Je.a)(this._series.intervalObj(), this
.properties().intervalsVisibilities)
}
destroy() {
const e = this.parentSource();
e.currencyChanged().unsubscribeAll(this), e.unitChanged().unsubscribeAll(this),
e.priceRangeReadyChanged().unsubscribeAll(this), e.formatterChanged()
.unsubscribeAll(this), e.priceStepChanged().unsubscribeAll(this), this
._series.properties().statusViewStyle.symbolTextSource.unsubscribeAll(this),
this._series.onIntervalChanged().unsubscribeAll(this)
}
isSymbolInvalid() {
return this._status.type === Ke.StudyStatusType.Error && this._status
.errorDescription.error === Xe
}
isActualInterval() {
return this._isActualInterval
}
onIsActualIntervalChange() {
return this._onIsActualIntervalChange
}
isVisible() {
if (!this.properties().visible.value() || !this.isActualInterval()) return !1;
const e = this.metaInfo();
if (e.plots.length > 0) return !0;
for (const t of Object.keys(e.graphics))
for (const i of Object.keys(e.graphics[t])) {
const e = this.properties().graphics[t][i];
if (!e.visible || e.visible.value()) return !0
}
return !(!e.isTVScriptStrategy && !e.hasAlertFunction)
}
inputs(e) {
const t = Object(P.merge)(Object(P.clone)($e), e || {});
return t.skipOptionalEmptySymbolInputs && (t.keepOptionalSymbolsEmpty = !0),
this._buildInputs(t)
}
status() {
return this._status
}
title(e, t, i, s) {
i = void 0 === i ? !this._showStudyArgumentsProperty.value() : i;
const r = JSON.stringify([e, t, i, s]);
if (this._titleStrCache[r]) return this._titleStrCache[r];
if (this._titleInPartsCache[r]) return this._joinTitlesParts(this
._titleInPartsCache[r]);
const n = this._title(e, t, i, s);
return this._titleStrCache[r] = n, n
}
titleInParts(e, t, i, s) {
i = void 0 === i ? !this._showStudyArgumentsProperty.value() : i;
const r = JSON.stringify([e, t, i, s]);
if (this._titleInPartsCache[r]) return this._titleInPartsCache[r];
const n = this._titleInParts(e, t, i, s);
return this._titleInPartsCache[r] = n, n
}
invalidateTitleCache(e) {
if (this._titleStrCache = {}, this._titleInPartsCache = {}, !0 === e && this
._children)
for (let t = 0; t < this._children.length; ++t) this._children[t]
.invalidateTitleCache(e)
}
setOwnFirstValue(e) {
this._ownFirstValue = e
}
firstValue(e) {
var t, i, s;
if (!this._isChildStudy && "Compare@tv-basicstudies" === (null === (t = this
._metaInfo) || void 0 === t ? void 0 : t.id) || !(null === (i = this
._metaInfo) || void 0 === i ? void 0 : i.is_price_study)) {
const t = this._model.timeScale().visibleBarsStrictRange();
if (null === t) return null;
if (!this.properties().visible.value() || !this.isActualInterval())
return this._ownFirstValue;
const i = t.firstBar(),
r = t.lastBar();
let n = null;
const o = (null === (s = this._metaInfo) || void 0 === s ? void 0 : s
.plots) || [];
if (null === n) {
const t = this.data().rangeIterator(i, r);
for (; t.hasNext();) {
const i = t.next().value;
for (let t = 0; t < o.length; ++t) {
if (Object(x.isColorerPlot)(o[t])) continue;
const s = i[t + 1];
if (null == s) continue;
const r = o[t].id,
a = this.properties().styles[r];
if (a.visible && a.visible.value() && !(e && Math.abs(s) <
1e-10)) {
n = s;
break
}
}
if (null !== n) break
}
}
return this._ownFirstValue = n, null !== n ? n : this._bandsFirstValue(e)
}
if (this._isChildStudy) {
const e = this._getNonPriceParent();
if (e && this.priceScale() === e.priceScale()) return null !== e
._ownFirstValue ? e._ownFirstValue : e.firstValue()
}
return this._series.firstValue()
}
priceRange(e, t) {
let i = null;
const r = Object(s.ensureNotNull)(this._metaInfo),
n = this._fillPrecalculatedAutoscaleInfo(e, t);
let o = this.data().minMaxOnRangeCached(e, t, n.fields);
if (o = Object(c.mergeMinMax)(n.baseValueMinMax, o), n.useMainSeriesRange) {
const i = [{
name: "low",
offset: 0
}, {
name: "high",
offset: 0
}],
s = this.series().data().bars().minMaxOnRangeCached(e, t, i);
o = Object(c.mergeMinMax)(o, s)
}
if (null !== o && (i = new l.PriceRange(o.min, o.max)), r.bands)
for (let e = 0; e < r.bands.length; e++)
if (this.properties().bands[e].visible.value()) {
const t = this.properties().bands[e].value.value();
if (!Object(P.isNumber)(t)) continue;
i ? i.apply(t, t) : i = new l.PriceRange(t, t)
} return this._postProcessPriceRange(i)
}
autoScaleInfo(e, t) {
const i = {
topPixelMargin: 0,
bottomPixelMargin: 0
};
return {
range: this.priceRange(e, t),
topPixelMargin: i.topPixelMargin,
bottomPixelMargin: i.bottomPixelMargin
}
}
resolvedSymbolInfoBySymbol(e) {
return this._resolvedSymbols && e && this._resolvedSymbols[this
._getSymbolForResolve(e)] || null
}
currency() {
const e = this.metaInfo();
return Boolean(e) && e.is_price_study ? this.parentSource().currency() : null
}
unit() {
const e = this.metaInfo();
return Boolean(e) && e.is_price_study ? this.parentSource().unit() : null
}
sessionId() {
return this.parentSource().sessionId()
}
sessionIdChanged() {
return this.parentSource().sessionIdChanged()
}
getSymbolString(e) {
return "" === e ? "" : Object(v.encodeExtendedSymbolOrGetSimpleSymbolString)(
this._getSymbolObject(e))
}
onStatusChanged() {
return this._statusChanged
}
symbolsResolved() {
return this._symbolsResolved
}
valuesProvider() {
return new m.a(this, this.model())
}
statusProvider(e) {
return new w.a(this, this._model.properties().scalesProperties.textColor)
}
correctScaleMargins(e) {
if ("Volume" === this.metaInfo().shortId) {
const t = this.model().paneForSource(this);
return null !== t && t.isOverlay(this) && t.containsMainSeries() ? {
top: .75,
bottom: 0
} : {
top: e.top,
bottom: 0
}
}
return e
}
canBeHiddenByGlobalFlag() {
return !0
}
isSourceHidden() {
return !this.isVisible() || this.canBeHiddenByGlobalFlag() && g
.hideAllIndicators().value()
}
_invalidateLastNonEmptyPlotRowCache() {
this._lastNonEmptyPlotRowCache = {}
}
processHibernate() {
this.isHibernateAllowed() && (!this.isStarted() && this.isVisible() && this
.start(), this.isStarted() && !this.isVisible() && this.stop())
}
isHibernated() {
return !this.isVisible() && !this.isStarted()
}
_createViews() {
var e, t, i;
this._priceAxisViewsBase = [], this._priceLinesAxisViews = [], this
._paneViews = [], this._labelPaneViews = [];
const r = new Set,
n = this.metaInfo(),
o = Boolean(n.usePlotsZOrder),
a = new Map;
if (n.plots)
for (let t = 0; t < n.plots.length; t++) {
const i = n.plots[t];
let l, c, h, u, d;
if (Object(x.isNonVisualPlot)(i)) continue;
let p = n.plots[t].id,
_ = n.styles;
if (Object(x.isBgColorerPlot)(i)) l = new k(this, this._series, this
._model, p);
else if (Object(x.isShapesPlot)(i)) l = new he(this, this._series, this
._model, p);
else if (Object(x.isCharsPlot)(i)) l = new me(this, this._series, this
._model, p);
else if (Object(x.isArrowsPlot)(i)) l = new we(this, this._series, this
._model, p);
else if (Object(x.isOhlcPlot)(i)) {
const e = i.target;
if (r.has(e)) continue;
if (r.add(e), et(n, t)) l = new xe(this, this._series, this._model,
e);
else {
if (!tt(n, t)) {
Ze.logError(`plot ${i.id} looks to be invalid`);
continue
}
l = new Ie(this, this._series, this._model, e)
}
u = this.createPriceAxisView(e), h = new Me.PanePriceAxisView(u,
this, this._model), p = e, _ = n.ohlcPlots
} else u = this.createPriceAxisView(p), d = this
.createPriceLineAxisView(p), l = new Oe.a(this, this._series, this
._model, p), this.properties().styles[p].trackPrice.value() && (
c = new Ee(this, p)), h = new Me.PanePriceAxisView(u, this, this
._model);
const m = o ? Object(s.ensureDefined)(null === (e = null == _ ? void 0 :
_[p]) || void 0 === e ? void 0 : e.zorder) : a.size;
it(m, a);
const f = {
paneViews: [l],
labelView: h,
priceAxisView: u,
priceLineAxisView: d
};
void 0 !== c && f.paneViews.push(c), a.set(m, f)
}(null !== (i = null === (t = this._metaInfo) || void 0 === t ? void 0 : t
.bands) && void 0 !== i ? i : []).forEach((e, t) => {
const i = this._properties.bands[t];
if (i && i.visible.value()) {
const t = new ze(i, this),
r = o ? Object(s.ensureDefined)(e.zorder) : a.size;
it(r, a), a.set(r, {
paneViews: [t]
})
}
}), this._properties.bandsBackground && (Object(s.assert)(!o,
"'usePlotsZOrder' flag does not supported"), a.set(a.size, {
paneViews: [new qe(this)]
}));
const l = this._paneViews;
Object(d.createGraphicsPaneViews)(this, this.model()).then(e => {
for (let t = 0; t < e.length; t++) l.push(e[t]);
this._model.lightUpdate()
}), this._properties.areaBackground && (Object(s.assert)(!o,
"'usePlotsZOrder' flag does not supported"), a.set(a.size, {
paneViews: [new We(this)]
}));
const c = e => n.plots.some(t => Object(x.isColorerPlot)(t) && t.target === e);
if (this._properties.filledAreas && n.filledAreas)
for (let e = 0; e < n.filledAreas.length; ++e) {
const t = n.filledAreas[e],
i = this._properties.filledAreasStyle[t.id],
r = c(t.id);
let l;
if ("plot_plot" === t.type || r ? l = new He(this, t, i) :
"hline_hline" === t.type ? l = new Ye(this, t, i) : Ze.logWarn(
"Unsupported filledArea type: " + t.type), void 0 !== l) {
const e = o ? Object(s.ensureDefined)(t.zorder) : a.size;
it(e, a), a.set(e, {
paneViews: [l]
})
}
}
const h = Array.from(a.keys()).sort((e, t) => e - t);
for (let e = 0; e < h.length; e++) {
const t = Object(s.ensureDefined)(a.get(h[e]));
this._paneViews.push(...t.paneViews), t.labelView && this._labelPaneViews
.push(t.labelView), t.priceAxisView && this._priceAxisViewsBase.push(t
.priceAxisView), t.priceLineAxisView && this._priceLinesAxisViews
.push(t.priceLineAxisView)
}
this._dataWindowView || (this._dataWindowView = new _.StudyDataWindowView(this,
this._model)), this._legendView || (this._legendView = new f(this, this
._model)), this._statusView || (this._statusView = new b
.StudyStatusView(this)), this._concatPriceAxisViews()
}
_titleInputs(e, t) {
return this.inputs(this._titleInputsOptions(e, t))
}
_titleInputsOptions(e, t) {
return {
symbolsForDisplay: !0,
skipHiddenInputs: !0,
skipFakeInputs: !1,
fakeInputsForDisplay: !0,
asObject: !1,
skippedGroups: [],
noExchanges: e,
noResolution: t,
skipColorInputs: !0,
skipTimeInputs: !0
}
}
_subscribeToSessionId() {
!this._isSubscribedToSessionId && this.hasSymbolInputs() && (this
.sessionIdChanged().subscribe(this, this._onSessionIdChanged), this
._isSubscribedToSessionId = !0)
}
_unsubscribeToSessionId() {
this._isSubscribedToSessionId && (this.sessionIdChanged().unsubscribe(this, this
._onSessionIdChanged), this._isSubscribedToSessionId = !1)
}
_onSessionIdChanged() {
this.restart(!0)
}
_title(e, t, i, s) {
const r = this._titleInParts(e, t, i, s);
return this._joinTitlesParts(r)
}
_postProcessPriceRange(e) {
if (e && e.minValue() === e.maxValue() && !this.metaInfo().is_price_study) {
const t = .005 * e.minValue();
e = new l.PriceRange(e.minValue() - t, e.maxValue() + t)
}
const t = this.priceScale();
return t && t.isLog() && e ? new l.PriceRange(t.priceToLogical(e.minValue()), t
.priceToLogical(e.maxValue())) : e
}
_joinTitlesParts(e) {
const t = e[1] ? e[1].join(", ") : "";
return e[0] + (t.length > 0 ? " (" + t + ")" : "")
}
_titleInParts(e, t, i, s) {
let r = "";
r = e ? this.metaInfo().shortDescription || this._properties.shortDescription &&
this._properties.shortDescription.value() || "Study" : this.metaInfo()
.description || this._properties.description && this._properties.description
.value() || "Study", t = t || {};
const n = [window.t(r, {
context: "study"
})];
let o = [];
if (!i) {
const i = this._getMTFResolutionInputTitle();
null !== i && i.length > 0 && n.push(i);
const r = this.metaInfo(),
a = this._titleInputs(s, !0) || [];
if (a.length > 0) {
const i = {};
if (this._isChildStudy)
for (let t = 0; t < r.inputs.length; ++t) {
const n = r.inputs[t];
if (!u.a.isSourceInput(n)) continue;
const o = n.id,
a = this._properties.inputs[o].value();
if (a.indexOf("$") >= 0 && this._source) {
const t = this._source.metaInfo(),
r = this._source.title(e, {}, !0, s);
if (1 === t.plots.length) i[a] = r;
else {
const e = a.split("$")[1],
s = t.plots[parseInt(e)].id,
n = t.styles && t.styles[s],
o = n && n.title || s;
i[a] = r + ": " + o
}
}
break
}
o = a.map(e => {
let s = Object(P.isNumber)(e) ? this._numericFormatter
.format(e) : i && i[e.toString()] || e.toString();
return t && t[s.toString()] && (s = t[s.toString()]), s
})
}
}
return [n.join(" · "), o]
}
_getMTFResolutionInputTitle() {
const e = this.metaInfo();
for (let t = 0; t < e.inputs.length; t++) {
const i = e.inputs[t];
if ("resolution" === i.type && i.isMTFResolution) return this._properties
.inputs[i.id].value()
}
return null
}
isHibernateAllowed() {
return !this.hasChildren()
}
_getSymbolForResolve(e) {
return this.getSymbolString(this._getSymbolForApi(e))
}
_allSymbolsAreResolved() {
const e = this.metaInfo(),
t = [];
let i = !1;
for (let s = 0; s < e.inputs.length; s++)
if ("symbol" === e.inputs[s].type) {
const r = e.inputs[s].id,
n = this._properties.inputs[r].value(),
o = this._getSymbolForResolve(n);
if ("" !== o)
if (this._resolvedSymbols[o]) i = !0;
else {
const e = this._resolveSymbol(o, n);
t.push(e)
}
} if (0 === t.length) {
const e = Promise.resolve();
return i ? e.then(() => this._symbolsResolved.fire()) : e
}
return Promise.all(t).catch(e => (this._setStatus({
type: Ke.StudyStatusType.Error,
errorDescription: {
error: Xe
}
}), this.stop(!0), this._model.updateSource(this), Promise.reject(
"Invalid symbol, " + e))).then(() => {
null !== this._studyId && this.stop(!0), this.start(!0),
this._symbolsResolved.fire(), this._recheckLineToolsActuality()
})
}
_getSymbolForApi(e) {
return e
}
_resolveSymbol(e, t) {
if ("" === e) return Promise.resolve();
let i = this._pendingResolveSymbols.get(e);
return void 0 !== i || (i = new Promise((i, s) => {
this._chartApi.resolveSymbol(Object(S.makeNextSymbolId)(), e,
r => {
switch (this._pendingResolveSymbols.delete(e), r
.method) {
case "symbol_resolved":
this._setStatus({
type: Ke.StudyStatusType
.Undefined
}), this._resolvedSymbols[e] = r.params[
1], this._resolvedSymbolsByInput[
t] = r.params[1], this
._onSymbolResolved(e, t, r.params[1]),
this.invalidateTitleCache(!0), i();
break;
case "symbol_error":
if (this._setStatus({
type: Ke.StudyStatusType.Error,
errorDescription: {
error: r.params[1]
}
}), r.params[1] === y
.permissionDenied && r.params[2])
switch (r.params[2]) {
case y
.SymbolErrorPermissionDeniedReason
.Symbol:
if (r.params[3])
return void this
._resolveSymbol(r
.params[3], t).then(
i);
break;
default:
return void this._resolveSymbol(
r.params[2], t).then(i)
}
0, s()
}
})
}), this._pendingResolveSymbols.set(e, i)), i
}
_recheckLineToolsActuality() {
const e = this._model.paneForSource(this);
null !== e && e.sourcesByGroup().lineSourcesForAllSymbols().forEach(e => {
e.ownerSource() === this && e.calcIsActualSymbol()
})
}
_getSymbolObject(e) {
const t = {
symbol: e
};
return t.session = this.sessionId(), t
}
_onSymbolResolved(e, t, i) {
0
}
_setStatus(e) {
this._status = e, this._statusView && this._statusView.update(), this._model
.updateSource(this), this._statusChanged.fire(e)
}
_bandsFirstValue(e) {
const t = Object(s.ensureNotNull)(this._metaInfo);
if (!t.bands) return null;
for (let i = 0; i < t.bands.length; i++) {
const t = this.properties().childs().bands.childs()[i];
if (t.childs().visible.value()) {
const i = t.childs().value.value();
if (e && 0 === i) continue;
return i
}
}
return null
}
_prepareInputs(e) {
Object(s.assert)(!!e, "options not set");
const t = this.metaInfo(),
i = {},
r = e.allowedInputTypes ? new Set(e.allowedInputTypes) : null;
for (let s = 0; s < t.inputs.length; s++) {
const n = t.inputs[s];
if (null !== r && !r.has(n.type)) continue;
if (n.isFake && e.skipFakeInputs) continue;
if (n.isMTFResolution && e.noResolution) continue;
if (n.isHidden && e.skipHiddenInputs) continue;
if ("bool" === n.type && e.skipHiddenInputs && e.skipBooleanInputs)
continue;
if ("color" === n.type && e.skipHiddenInputs && e.skipColorInputs) continue;
if ("time" === n.type && e.skipHiddenInputs && e.skipTimeInputs) continue;
if (void 0 !== n.groupId && -1 !== e.skippedGroups.indexOf(n.groupId))
continue;
if (-1 !== e.skippedInputs.indexOf(n.id)) continue;
const o = this._prepareInput(n, e);
"symbol" === n.type && e.skipOptionalEmptySymbolInputs && "" === o || (i[n
.id] = Object(P.clone)(o))
}
return i
}
_lastNonEmptyPlotRow(e) {
var t;
if (!Object(P.isInteger)(e)) return Ze.logDebug(
"_lastNonEmptyPlotRow: incorrect plotIndex"), null;
let i = null !== (t = this._lastNonEmptyPlotRowCache[e]) && void 0 !== t ? t :
null;
if (null !== i) return i;
return i = this.data().findLast((t, i) => void 0 !== i[e], 1e3), null === i ?
null : (this._lastNonEmptyPlotRowCache[e] = i, i)
}
_applyPlotToPrecalculatedAutoscaleInfo(e, t, i, s) {
const r = s.id,
n = this.properties().styles[r],
o = Object(x.isShapesPlot)(s) || Object(x.isCharsPlot)(s);
i.useMainSeriesRange = i.useMainSeriesRange || Object(x.isArrowsPlot)(s);
let a = Object(x.isLinePlot)(s) || Object(x.isOhlcPlot)(s);
if (o) {
const e = n.location.value(),
t = [p.c.Absolute, p.c.Top, p.c.Bottom].indexOf(e) < 0;
i.useMainSeriesRange = i.useMainSeriesRange || o && t, a = a || e === p.c
.Absolute
}
if (!a) return i;
const l = {
name: r,
offset: this.offset(r)
},
h = n.plottype.value();
if (!this.properties().skipHistogramBaseOnAutoScale && [x.LineStudyPlotStyle
.Histogram, x.LineStudyPlotStyle.Columns, x.LineStudyPlotStyle.Area
].indexOf(h) >= 0) {
const s = n.histogramBase.value(),
r = this.data().minMaxOnRangeCached(e, t, [l]);
return Object(P.isNumber)(s) && null !== r && (i.baseValueMinMax = Object(c
.mergeMinMax)(i.baseValueMinMax, {
min: s,
max: s
}), i.baseValueMinMax = Object(c.mergeMinMax)(i.baseValueMinMax, r)), i
}
return i.fields.push(l), i
}
_fillPrecalculatedAutoscaleInfo(e, t) {
return Object(s.ensureNotNull)(this._metaInfo).plots.filter(e => !Object(x
.isPlotWithTechnicalValues)(e)).filter(e => {
const t = e.id;
let i;
if (Object(x.isOhlcPlot)(e)) {
const t = e.target;
i = this.properties().ohlcPlots[t]
} else i = this.properties().styles[t];
return i.visible.value()
}).reduce((i, s) => this._applyPlotToPrecalculatedAutoscaleInfo(e, t, i,
s), {
fields: [],
useMainSeriesRange: !1,
baseValueMinMax: null
})
}
_buildInputs(e) {
Object(s.assert)(!!e, "options not set");
let t = {};
try {
t = this._prepareInputs(e)
} catch (e) {
Ze.logWarn("Failed to prepare study inputs: " + e)
}
if (e.asObject) {
const e = {};
return Object.keys(t).forEach(i => {
null != t[i] && (e[i] = t[i])
}), e
} {
const e = [];
return Object.keys(t).forEach(i => {
null != t[i] && e.push(t[i])
}), e
}
}
_prepareInput(e, t) {
const i = this._prepareInputValue(e, t);
return !e.isFake || t.fakeInputsForDisplay || t.onlyAtomValues ? i : {
v: i,
f: !0,
t: e.type
}
}
_calcIsActualInterval() {
const e = this._isActualInterval;
this._isActualInterval = Object(Je.a)(this._series.intervalObj(), this
.properties().intervalsVisibilities), e !== this._isActualInterval && (
this._onIsActualIntervalChange.fire(), this._visibleChanged(), this
.processHibernate())
}
_visibleChanged() {
this._series.invalidateBarColorerCache()
}
_getNonPriceParent() {
const e = this.source();
if (e instanceof st) {
const t = e.metaInfo();
return t.is_price_study && "Compare@tv-basicstudies" !== t.id ? e
._getNonPriceParent() : e
}
return null
}
}
},
IiTo: function(e, t, i) {
"use strict";
i.r(t);
var s = i("jCNj"),
r = i("LxhU"),
n = i("Hr11"),
o = i("ZmuQ"),
a = i("E6p6");
class l extends o.a {
constructor(e, t) {
super(), this._sessionStartMs = -Number.MAX_VALUE, this._sessionEndMs = -Number
.MAX_VALUE, this._periodSec = e, this._session = t
}
alignTimeIfPossible(e) {
const t = this.alignTime(e);
return isNaN(t) ? e : t
}
indexOfBar(e) {
return e < this._sessionStartMs ? a.SessionStage.PRE_SESSION : e >= this
._sessionEndMs ? a.SessionStage.POST_SESSION : Object(n.toInt)(s
.time_seconds_diff(e, this._sessionStartMs) / this._periodSec)
}
startOfBar(e) {
if (e === a.SessionStage.PRE_SESSION) {
const e = s.get_cal_from_unix_timestamp_ms(this._session.timezone, this
._sessionStartMs - 1),
t = this._session.spec.alignToNearestSessionEnd(e, -1);
return s.cal_to_utc(this._session.timezone, t)
}
if (e === a.SessionStage.POST_SESSION) return this._sessionEndMs;
if (e < 0) throw new Error("Negative offset is not supported");
return this._sessionStartMs + s.time_seconds(this._periodSec * e)
}
endOfBar(e) {
if (e < 0) throw new Error("Index cannot be negative");
const t = this.startOfBar(e) + 1e3 * this._periodSec;
return t > this._sessionEndMs ? this._sessionEndMs : t
}
isLastBar(e, t) {
return t >= this._sessionStartMs + s.time_seconds(this._periodSec * (e + 1) - 1)
}
moveTo(e) {
const t = this._session.timezone,
i = s.utc_to_cal(t, e),
r = this._session.spec.alignToSessionStart(i);
this._sessionStartMs = s.cal_to_utc(t, i), s.add_minutes(i, r), this
._sessionEndMs = s.cal_to_utc(t, i)
}
indexOfLastBarInSession() {
return Object(n.toInt)((this._sessionEndMs - 1 - this._sessionStartMs) / 1e3 /
this._periodSec)
}
moveNext() {
this.moveTo(this._sessionEndMs)
}
}
var c = i("OBgQ");
function h(e, t) {
const i = s.clone(t),
r = e.businessDaysToCalendarDays(i, 1);
r > 1 && s.add_date(i, r - 1);
const n = e.leftBorderOfDailyBar(i);
if (null === n) throw new Error("Cannot calculate left border of daily bar");
return s.cal_to_utc(s.get_timezone(e.timezone()), n)
}
class u extends o.a {
constructor(e, t, i, s, r = !1) {
super(), this._periodStart = -Number.MAX_VALUE, this._periodEnd = -Number
.MAX_VALUE, this._periodLastBarStart = -Number.MAX_VALUE, this
._periodStartDay = new c.a(0, 0, 0), this._periodEndDay = new c.a(0, 0, 0),
this._period = i, this._sessionTgt = e, this._builder = s, this
._useBusinessDays = r, this._sessionSrc = r ? new o.b("Etc/UTC", "24x7") :
t || e
}
builder() {
return this._builder
}
alignTimeIfPossible(e) {
return this.tradingDayToSessionStart(e)
}
tradingDayToSessionStart(e) {
return this.moveTo(e), this.startOfBar(0)
}
indexOfBar(e) {
if (this._useBusinessDays) {
const t = c.a.fromCalendar(s.get_cal_from_unix_timestamp_ms(this._sessionSrc
.timezone, e));
return t.before(this._periodStartDay) ? a.SessionStage.PRE_SESSION : this
._periodEndDay.before(t) ? a.SessionStage.POST_SESSION : 0
}
return e < this._periodStart ? a.SessionStage.PRE_SESSION : e >= this
._periodEnd ? a.SessionStage.POST_SESSION : 0
}
startOfBar(e) {
if (e === a.SessionStage.PRE_SESSION) {
const e = s.get_cal_from_unix_timestamp_ms(this._sessionTgt.timezone, this
._periodStart - 1),
t = this._sessionTgt.spec.alignToNearestSessionEnd(e, -1);
return s.cal_to_utc(this._sessionTgt.timezone, t) - 1
}
return e === a.SessionStage.POST_SESSION || e > 0 ? this._periodEnd : e === a
.SessionStage.LASTBAR_SESSION ? this._periodLastBarStart : this._periodStart
}
moveTo(e) {
const t = s.get_cal_from_unix_timestamp_ms(this._sessionSrc.timezone, e);
this._sessionSrc.spec.correctTradingDay(t);
const i = s.get_year(t),
r = this._indexOfPeriodInYear(t),
n = r + this._period,
o = this._sessionTgt.spec,
a = this._sessionTgt.timezone,
l = this._builder.startOfPeriod(a, r, i);
this._periodStart = h(o, l);
const u = s.clone(l),
d = o.businessDaysToCalendarDays(u, 1);
d > 1 && s.add_date(u, d - 1), this._periodStartDay = c.a.fromCalendar(u);
const p = this._builder.startOfPeriod(a, n, i);
this._periodEnd = h(o, p);
const _ = s.clone(p);
for (s.add_date(_, -1); o.isCalWeekEnd(_);) s.add_date(_, -1);
this._periodEndDay = c.a.fromCalendar(_), s.add_date(p, -1),
function(e, t) {
for (; e.isCalWeekEnd(t);) s.add_date(t, -1)
}(this._sessionTgt.spec, p), this._periodLastBarStart = h(o, p), (this
._periodLastBarStart < this._periodStart || this._periodLastBarStart ===
this._periodEnd) && (this._periodLastBarStart = this._periodStart)
}
endOfBar(e) {
if (0 !== e) throw new Error("index should be 0");
return this._periodEnd
}
isLastBar(e, t) {
if (0 !== e) throw new Error("index should be 0");
return t >= this._periodLastBarStart
}
currentRange() {
return {
from: this._periodStartDay,
to: this._periodEndDay
}
}
indexOfBarInYear(e) {
const t = s.get_cal_from_unix_timestamp_ms(this._sessionSrc.timezone, e),
i = s.get_year(t),
r = this._builder.indexOfPeriod(t),
o = this._sessionTgt.timezone;
let a = this._builder.startOfPeriod(o, r, i),
l = h(this._sessionTgt.spec, a);
return a = s.get_cal_from_unix_timestamp_ms(s.get_timezone("Etc/UTC"), l), i < s
.get_year(a) ? (a = this._builder.startOfPeriod(o, r - 1, i), l = h(this
._sessionTgt.spec, a), {
index: (r - 1) / this._period,
time: l
}) : {
index: Object(n.toInt)(r / this._period),
time: l
}
}
sessionSrc() {
return this._sessionSrc
}
_indexOfPeriodInYear(e) {
const t = this._builder.indexOfPeriod(e);
let i = Object(n.toInt)(t / this._period) * this._period;
return -1 === t && (i = -this._period), i
}
}
function d(e, t) {
const i = s.get_day_of_week(t) - e.firstDayOfWeek();
return i < 0 ? i + 7 : i
}
function p(e, t) {
const i = s.get_day_of_year(t) - 1;
let r = d(e, t) - i % 7;
return 0 === r ? Object(n.toInt)(i / 7) : (r >= 0 && (r -= 7), Object(n.toInt)((r + i) / 7))
}
class _ {
indexOfPeriod(e) {
return s.get_day_of_year(e) - 1
}
startOfPeriod(e, t, i) {
const r = s.days_per_year(i);
return s.get_cal(s.get_timezone("Etc/UTC"), i, s.JANUARY, 1 + Math.min(t, r))
}
}
class m extends _ {
constructor(e) {
super(), this._sessionsSpec = e
}
indexOfPeriod(e) {
return super.indexOfPeriod(e) - function(e, t) {
const i = p(e, t),
r = s.get_cal(s.get_timezone("Etc/UTC"), s.get_year(t), s.JANUARY, 1);
s.add_date(r, 7 * i);
const n = i * e.weekEndsCount() + e.holidaysFromYearStart(r),
o = s.get_day_of_year(t) - s.get_day_of_year(r);
return n + o - e.calendarDaysToBusinessDays(r, o)
}(this._sessionsSpec, e)
}
startOfPeriod(e, t, i) {
const r = 7 - this._sessionsSpec.weekEndsCount(),
o = Math.max(0, Object(n.toInt)(t / r) - 1),
a = s.get_cal(s.get_timezone("Etc/UTC"), i, s.JANUARY, 1),
l = s.get_days_per_year(a);
if (s.add_date(a, 7 * o), (t -= r * o - this._sessionsSpec.holidaysFromYearStart(
a)) > 0) {
const e = this._sessionsSpec.businessDaysToCalendarDays(a, t);
s.add_date(a, e)
}
let c = s.get_day_of_year(a) - 1;
return i < s.get_year(a) && (c += l), super.startOfPeriod(e, c, i)
}
}
class f {
constructor(e) {
this._builder = null, this._initialized = !1, this._session = e
}
indexOfPeriod(e) {
return this._getBuilder().indexOfPeriod(e)
}
startOfPeriod(e, t, i) {
return this._getBuilder().startOfPeriod(e, t, i)
}
_getBuilder() {
return null !== this._builder && this._initialized || (this._builder = this._session
.spec.hasWeekEnds() ? new m(this._session.spec) : new _, this
._initialized = !0), this._builder
}
}
class g {
constructor(e) {
this._session = e
}
indexOfPeriod(e) {
let t = p(this._session.spec, e);
if (0 === t) {
const i = s.get_timezone(this._session.spec.timezone());
e < this.startOfPeriod(i, 0, s.get_year(e)) && (t = -1)
}
return t
}
startOfPeriod(e, t, i) {
if (t < 0) {
i--;
const r = s.get_cal(s.get_timezone("Etc/UTC"), i, s.DECEMBER, 31, 23, 59, 59),
o = this.indexOfPeriod(r),
a = -1 * t,
l = Object(n.toInt)(o / a) * a;
return this.startOfPeriod(e, l, i)
}
const r = s.get_cal(s.get_timezone("Etc/UTC"), i, s.JANUARY, 1),
o = d(this._session.spec, r),
a = 0 === o ? 7 * t : 7 * (t + 1) - o;
return a > s.get_days_per_year(r) ? this.startOfPeriod(e, 0, i + 1) : (s.add_date(r,
a), r)
}
}
class b {
indexOfPeriod(e) {
return s.get_month(e)
}
startOfPeriod(e, t, i) {
if (t < 0) {
const e = Object(n.toInt)((11 - t) / 12);
i -= e, t += 12 * e
} else t > s.DECEMBER && (i++, t = s.JANUARY);
return s.get_cal(s.get_timezone("Etc/UTC"), i, t, 1)
}
}
function v(e, t, i, s = !1) {
const n = r.Interval.parse(e),
o = n.multiplier();
return n.isMinutes() ? new l(60 * o, t) : n.isSeconds() ? new l(o, t) : n.isTicks() ? new l(
1, t) : n.isRange() ? new l(60 * o, t) : new u(t, i, o, function(e, t) {
switch (e) {
case r.ResolutionKind.Days:
return new f(t);
case r.ResolutionKind.Weeks:
return new g(t);
case r.ResolutionKind.Months:
return new b
}
throw new Error("Unknown dwm resolution: " + e)
}(n.kind(), t), s)
}
function S(e, t, i, s, r, n, o) {
return w(e, t, i, s, r, n, o, 0)
}
function y(e, t, i, s, r, n, o) {
return w(e, t, i, s, r, n, o, 1)
}
function w(e, t, i, s, n, a, l, c) {
const h = r.Interval.parse(n + s);
if (h.isMonths()) {
const e = new Date(l);
return 0 === c && e.setUTCDate(1),
function(e, t) {
T(e, Math.floor(t / 12));
let i = e.getUTCMonth() - t % 12;
i < 0 && (T(e, 1), i += 12);
e.setUTCMonth(i);
for (; e.getUTCMonth() !== i;) I(e, 1)
}(e, a * h.multiplier()), e.getTime()
}
const u = new o.b("Etc/UTC", e, t, i),
d = h.inMilliseconds(),
p = h.isDWM();
let _;
_ = p ? 864e5 : 60 * u.spec.maxTradingDayLength() * 1e3;
let m = 0;
m = h.isWeeks() ? 7 : 7 - u.spec.weekEndsCount();
const f = _ / d,
g = m * f;
let b;
if (a < g) b = a / f;
else {
b = 7 * (a / g)
}
return p && (b = Math.floor(b)), l - 864e5 * b
}
function P(e, t, i, s, n, a, l) {
const c = r.Interval.parse(n + s);
if (c.isMonths()) {
const e = new Date(a),
t = new Date(l);
let i = 12 * (t.getUTCFullYear() - e.getUTCFullYear());
return i += t.getUTCMonth() - e.getUTCMonth(), Math.ceil(i / c.multiplier())
}
const h = new o.b("Etc/UTC", e, t, i),
u = c.inMilliseconds();
let d;
d = c.isDWM() ? 864e5 : 60 * h.spec.maxTradingDayLength() * 1e3;
let p = 0;
p = c.isWeeks() ? 7 : 7 - h.spec.weekEndsCount();
const _ = l - a,
m = d / u,
f = p * m;
let g = _ / 864e5 * m;
return g >= f && (g = _ / 6048e5 * f), Math.ceil(g)
}
function C(e, t) {
const i = s.clone(t);
return e.alignToSessionStart(i), s.cal_to_utc(s.get_timezone(e.timezone()), i)
}
function x(e, t) {
const i = s.utc_to_cal(t.timezone, +e);
let r = s.get_day_of_week(i),
n = s.get_minutes_from_midnight(i);
const o = t.spec.findSession(t.spec.getWeekIndex(i), r, n).getEntry();
return o.isOvernight() && n > o.startOffset() + o.length() && r === o.dayOfWeek() - 1 && (
r++, n -= 1440), r === o.dayOfWeek() && n >= o.startOffset() && n < o
.startOffset() + o.length()
}
function T(e, t) {
const i = e.getUTCMonth();
e.setUTCFullYear(e.getUTCFullYear() - t), e.getUTCMonth() !== i && I(e, 1)
}
function I(e, t) {
e.setTime(e.getTime() - 864e5 * t)
}
i.d(t, "newBarBuilder", (function() {
return v
})), i.d(t, "alignPeriodsBackForDataRequest", (function() {
return S
})), i.d(t, "alignPeriodsBackForVisibleRange", (function() {
return y
})), i.d(t, "getPeriodsBetweenDates", (function() {
return P
})), i.d(t, "alignExchangeTimeToSessionStartAndReturnUTC", (function() {
return C
})), i.d(t, "isTradingNow", (function() {
return x
})), i.d(t, "SessionInfo", (function() {
return o.b
}))
},
IjC5: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "RectangleRenderer", (function() {
return u
}));
var s = i("Eyy1"),
r = i("aO4+"),
n = i("f6yo"),
o = i("GEp6"),
a = i("VdBB"),
l = i("Tmoa"),
c = i("8Uy/"),
h = i("gAom");
class u {
constructor(e, t, i) {
this._data = null, this._hitTestResult = e || new a.HitTestResult(a.HitTestResult
.MOVEPOINT),
this._backHitTestResult = t || new a.HitTestResult(a.HitTestResult
.MOVEPOINT_BACKGROUND), this._forceOverrideTransparency = Boolean(i)
}
setData(e) {
this._data = e
}
hitTest(e, t) {
if (null === this._data || this._data.points.length < 2 || this._data.nohittest)
return null;
const [i, s] = this._getPointsInPhysicalSpace(t), n = new r.Point(s.x, i.y), a =
new r.Point(i.x, s.y), l = new r.Point(e.x * t.pixelRatio, e.y * t.pixelRatio),
c = this._extendAndHitTestLineSegment(l, i, n, t);
if (null !== c) return c;
const h = this._extendAndHitTestLineSegment(l, a, s, t);
if (null !== h) return h;
let u = Object(o.distanceToSegment)(n, s, l);
return u.distance <= 3 ? this._hitTestResult : (u = Object(o.distanceToSegment)(i,
a, l), u.distance <= 3 ? this._hitTestResult : this._data
.fillBackground ? this._hitTestBackground(l, i, s, t) : null)
}
getColor() {
const e = Object(s.ensure)(this._data);
return void 0 === e.transparency ? e.backcolor : Object(l.generateColor)(e
.backcolor, e.transparency, this._forceOverrideTransparency)
}
draw(e, t) {
if (null === this._data || this._data.points.length < 2 || this._data.linewidth <=
0 && !this._data.fillBackground) return;
e.save();
const [i, s] = this._getPointsInPhysicalSpace(t), r = this._data.linewidth ? Math
.max(1, Math.floor(this._data.linewidth * t.pixelRatio)) : 0, n = this._data
.fillBackground ? this.getColor() : void 0, o = Math.max(1, Math.floor(t
.pixelRatio));
Object(h.fillRectWithBorder)(e, i.x, i.y, s.x, s.y, n, this._data.color, r, c
.LINESTYLE_SOLID, this._data.extendLeft, this._data.extendRight, "center", t
.physicalWidth, this._data.includeRightEdge && 1 === o ? 1 : 0), e.restore()
}
_getPointsInPhysicalSpace(e, t = 0) {
const i = Object(s.ensureNotNull)(this._data),
[n, o] = i.points,
a = e.pixelRatio,
l = Math.min(n.x, o.x),
c = Math.max(n.x, o.x),
h = Math.min(n.y, o.y),
u = Math.max(n.y, o.y),
d = Math.round(l * a) + t,
p = Math.round(c * a) + t,
_ = Math.round(h * a) + t,
m = Math.round(u * a) + t;
return [new r.Point(d, _), new r.Point(p, m)]
}
_extendAndHitTestLineSegment(e, t, i, s) {
const r = this._extendAndClipLineSegment(t, i, s);
if (null !== r) {
if (Object(o.distanceToSegment)(r[0], r[1], e).distance <= 3) return this
._hitTestResult
}
return null
}
_extendAndClipLineSegment(e, t, i) {
const n = Object(s.ensureNotNull)(this._data);
if (Object(r.equalPoints)(e, t)) return null;
const o = i.physicalWidth,
a = Math.min(e.x, t.x),
l = Math.max(e.x, t.x),
c = n.extendLeft ? 0 : Math.max(a, 0),
h = n.extendRight ? o : Math.min(l, o);
return c > h || h <= 0 || c >= o ? null : [new r.Point(c, e.y), new r.Point(h, t.y)]
}
_hitTestBackground(e, t, i, s) {
const o = this._extendAndClipLineSegment(t, i, s);
return null !== o && Object(n.pointInBox)(e, Object(r.box)(o[0], o[1])) ? this
._backHitTestResult : null
}
}
},
InMJ: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("Ocx9").DefaultProperty;
class n extends s {
constructor(e, t) {
super(e, t || n.createProperties()), this.version = n.version, i.e("lt-pane-views")
.then(i.t.bind(null, "gr7S", 7)).then(({
FlatBottomPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 3
}
name() {
return "Flat Bottom"
}
hasEditableCoordinates() {
return !1
}
addPoint(e, t) {
return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e,
this.points()[this.points().length - 2]), s.prototype.addPoint.call(this, e)
}
setLastPoint(e, t) {
return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e,
this.points()[this.points().length - 2]), s.prototype.setLastPoint.call(
this, e)
}
setPoint(e, t, i) {
if (i && i.shift() && 1 === e) {
this._snapPoint45Degree(t, this.points()[0])
}
if (2 === e) this._points[1].index = t.index;
else if (3 === e) return this._points[0].index = t.index, this._points[2].price = t
.price, void this.normalizePoints();
super.setPoint(e, t)
}
getPoint(e) {
return e < 3 ? s.prototype.getPoint.call(this, e) : 3 === e ? {
index: this._points[0].index,
price: this._points[2].price
} : void 0
}
canHasAlert() {
return !0
}
_getAlertPlots() {
var e = this._points[0],
t = this._points[1],
i = [];
e.index <= t.index ? (i.push(e), i.push(t)) : (i.push(t), i.push(e));
var s = this._points[2];
s.time = t.time, s.index = t.index;
var r, n, o, a, l = {
price: s.price,
time: e.time,
index: e.index
},
c = [];
s.index <= l.index ? (c.push(s), c.push(l)) : (c.push(l), c.push(s)), i[0].price >
c[0].price ? (r = i, n = c) : c[0].price > i[0].price || c[1].price > i[1]
.price ? (r = c, n = i) : (r = i, n = c);
var h = this.properties().extendLeft.value(),
u = this.properties().extendRight.value();
return e.index <= t.index ? (o = h, a = u) : (o = u, a = h), [this
._linePointsToAlertPlot(r, "Upper", o, a), this._linePointsToAlertPlot(n,
"Lower", h, a)
]
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "vm8R")))
.GeneralTrendFiguresDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetoolflatbottom", e);
return n._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
n.version = 1, t.LineToolFlatBottom = n
},
J2xC: function(e, t, i) {
e.exports = {
"css-value-header-toolbar-height": "38px"
}
},
JT5O: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyMarket", (function() {
return n
}));
var s = i("hY0g"),
r = i.n(s);
class n {
constructor(e, t) {
this._visibility = new r.a(!1), this._dialogPromise = null, this._dialog = null,
this._chartWidgetCollection = e, this._options = t
}
visible() {
return this._visibility.readonly()
}
show(e) {
var t;
null === this._dialog && this._requestDialog(e), null === (t = this._dialog) ||
void 0 === t || t.open(e, void 0)
}
hide() {
var e;
null === (e = this._dialog) || void 0 === e || e.hide()
}
resetAllPages() {
var e;
null === (e = this._dialog) || void 0 === e || e.resetAllStudies()
}
_requestDialog(e) {
if (null === this._dialogPromise) {
let t;
t = Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i.e(9), i.e(17),
i.e(19), i.e(24), i.e(68), i.e(78), i.e(0), i.e(2), i.e(18), i.e(
"study-market")
]).then(i.bind(null, "zbLM")).then(e => new e.IndicatorsLibraryContainer(
this._chartWidgetCollection, this._options)), this._dialogPromise = t
.then(t => {
this._dialog = t, this._dialog.visible().subscribe(e => {
this._visibility.setValue(e)
}), this._dialog.open(e)
})
}
return this._dialogPromise
}
}
},
JWMC: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "trackEvent", (function() {
return l
}));
i("bSeV");
var s = i("FQhm"),
r = i("Kxc7"),
n = i("txPx");
const o = Object(n.getLogger)("Common.TrackEvent"),
a = [/Study_(Drawing)_(.*)/, /(Study)_(.*)@tv-basicstudies/, /(Study)_(.*)/,
/(Chart Style) (.*)/
],
l = (e, t, i) => {
if (r.enabled("charting_library_base")) return void((e, t, i) => {
t = t || e || i || "";
let r = "";
for (let e = 0; e < a.length; e++) {
const i = t.match(a[e]);
if (i && 3 === i.length) {
t = i[1], r = i[2];
break
}
}
Object(s.emit)(t.toLowerCase().replace(" ", "_"), {
category: e,
label: i,
value: r
})
})(e, t, i);
let n = (e ? e + ":" : "") + t;
i && (n += " " + i), o.logNormal(n), r.enabled("widget") || !window._UNIT_TESTS &&
window.gtag && window.gtag("event", t, {
event_category: e,
event_label: i
})
};
"undefined" != typeof window && (window.TradingView = window.TradingView || {}, window
.TradingView.trackEvent = l)
},
JcHK: function(e, t, i) {
"use strict";
function s(e) {
return e.getAll().some(e => e.isInitialized())
}
function r(e, t) {
const i = e.getAll(),
s = () => {
t(), i.forEach(e => {
e.chartWidgetInitialized.unsubscribe(null, s)
})
};
i.forEach(e => {
e.chartWidgetInitialized.subscribe(null, s, !0)
})
}
i.r(t), i.d(t, "isAnyChartWidgetInitialized", (function() {
return s
})), i.d(t, "waitAnyChartWidgetInitialized", (function() {
return r
}))
},
JjUe: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "OverlayDataWindowView", (function() {
return h
}));
var s = i("ivNn"),
r = i("4miz"),
n = i("qFKp"),
o = i("e92V"),
a = i("mMWL"),
l = i("e1Hy");
const c = n.CheckMobile.any();
class h extends r.b {
constructor(e, t) {
super(), this._invalidated = !0, this._study = e, this._model = t, this
._valueProvider = this._createValuesProvider(e, t), this._items = this
._valueProvider.getItems().map(e => new r.a(e.title, "")), this.update()
}
items() {
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
._items
}
update() {
this._invalidated = !0
}
study() {
return this._study
}
_updateImpl() {
this._header = this._study.title();
let e;
this._showLastPriceAndChangeOnly() ? e = this._study.data().lastIndex() : (e =
this._model.crossHairSource().appliedIndex(), Object(s.isNumber)(e) || (
e = this._study.data().lastIndex()));
const t = this._valueProvider.getValues(e);
for (let e = 0; e < t.length; ++e) {
const i = t[e],
s = this._items[e];
s.setValue(i.value), s.setVisible(i.visible), s.setColor(i.color)
}
}
_showLastPriceAndChangeOnly() {
return c && (null === this._model.crossHairSource().pane || Object(o
.isLineToolName)(a.tool.value()) || null !== this._model
.lineBeingEdited())
}
_createValuesProvider(e, t) {
return new l.a(e, t)
}
}
},
JmuD: function(e, t, i) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
}), t.hasProperty = t.isObject = void 0, t.isObject = function(e) {
var t = typeof e;
return null !== e && ("object" === t || "function" === t)
}, t.hasProperty = function(e, t) {
return t in e
}
},
JpbW: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "showChangeIntervalDialogAsync", (function() {
return n
}));
var s = i("6KAu");
let r = null;
function n(e) {
const t = r = Object(s.a)().then(i => {
t === r && i.showChangeIntervalDialog(e)
});
return t
}
},
K4L1: function(e, t, i) {
"use strict";
var s = i("Eyy1").assert,
r = i("lCO3").Version,
n = i("txPx").getLogger("Chart.Study.Versioning"),
o = i("Wt0y"),
a = i("0YCj"),
l = i("TcSq").extractPineId,
c = i("Si3H").migrateMetaInfoAndPropState;
function h(e, t) {
if (!e) throw new Error("No studies metainfo");
var s = i("EyEd");
if (this._studiesMetainfo = e, !t) throw new Error("No studies migrations");
this._studiesMigrations = t, this._migrations = {};
for (var r = 0; r < this._studiesMigrations.length; r++)
for (var o = this._studiesMigrations[r], a = o.versFrom, l = o.versTo, c = 0; c < o
.studyMigrations.length; c++) {
var h = o.studyMigrations[c],
u = h.studyId;
if (0 !== h.rules.length) {
var d = u in this._migrations ? this._migrations[u] : new s(u);
d.addMigration(a, l, h.rules), this._migrations[u] = d
} else n.logError("Study Migration should have at least one convertion rule")
}
this._clientMigrations = [function(e, t) {
if (0 === this._studiesMetainfo.length || !e.isTVScript || e.version >= 22)
return t;
for (var i = {}, s = 0, r = 0;;) {
var n = t[r];
if (void 0 === n) break;
var o = t[n.id];
n.isFake && (n.id = "in_" + s++), i[r] = n, i[n.id] = o, r++
}
return i
}]
}
h.prototype.updateMetaInfo = function(e) {
if (!e) return e;
s(!e.isTVScript,
"This method should update only built-in java indicators metaInfo. For Pine indicators use updateMetaInfoAsync"
);
for (var t = null, i = this._studiesMetainfo, r = 0; r < i.length; r++)
if (i[r].id === e.id) {
t = i[r];
break
} return TradingView.clone(t)
}, h.prototype.updateMetaInfoAsync = function(e) {
if (!e) return {
sync: !1,
result: Promise.reject("No old metaInfo was given")
};
new a(e), a.versionOf(e);
for (var t = null, i = this._studiesMetainfo, s = 0; s < i.length; s++)
if (i[s].id === e.id) {
t = i[s];
break
} return {
sync: !0,
result: t ? TradingView.clone(t) : null
}
}, h.prototype.lastVersionOfStudy = function(e) {
return this._studiesMetainfo.find((function(t) {
return t.id === e
})).version
}, h.prototype.updateStudyInputs = function(e, t, i, s, o) {
var a = TradingView.clone(s);
if (e in this._migrations) {
var l, c = r.parse(t);
if ("last" === i) {
var h = this.lastVersionOfStudy(e);
l = r.parse(h)
} else l = r.parse(i);
a = this._migrations[e].updateInputs(c, l, a)
}
if (null == o) return a;
for (var u in o) u in a || (a[u] = o[u]);
for (var u in a)
if (!(u in o)) {
var d = a[u];
n.logWarn("Extra input detected, studyId=" + e + ", versionFrom=" + t +
", inputId=" + u + ", inputValue=" + d + ", removing it and continue..."
), delete a[u]
} return a
}, h.prototype.updateStudyState = function(e, t, i) {
if (null == e || null == t || null == i) return e;
if (e = TradingView.clone(e), !(t.isTVScript || !!t.pine) && t.version !== i.version) {
var s = i && i.defaults.inputs,
r = this.updateStudyInputs(t.id, t.version, i.version, e.inputs, s);
e.inputs = r
}
for (var o = 0; o < this._clientMigrations.length; ++o) {
r = this._clientMigrations[o].call(this, t, e.inputs);
Object.keys(r).length === Object.keys(e.inputs).length ? e.inputs = r : n.logWarn(
"StudyVersioning._clientMigrations application returned bad result. Skipping it..."
)
}
var l = a.versionOf(t);
if (t.isTVScript && t.TVScriptSourceCode && l >= 12 && l <= 26) {
var c = {};
for (o = 0; o < t.plots.length; ++o) {
var h = t.plots[o],
u = i.plots[o];
c[h.id] = u.id
}
var d = Object.keys(e.styles);
for (o = 0; o < d.length; ++o) {
var p = d[o],
_ = e.styles[p];
delete e.styles[p];
var m = c[p];
e.styles[m] = _
}
var f = Object.keys(e.plots);
for (o = 0; o < f.length; ++o) {
var g = f[o];
p = e.plots[g].id;
e.plots[g].id = c[p]
}
}
return e
}, h.prototype.patchPointsBasedStudyState = function(e) {
return h._fixInputsMaxValue(e.state, e.metaInfo), e
}, h.prototype.patchPointsBasedStudyData = function(e, t) {
if (!o.isProd()) return t;
if (!e || !t) return t;
var i = TradingView.clone(t);
return "VbPFixed@tv-volumebyprice" === e.id && e.version && e.version <= 4 && h
._patchOldVolumeProfiles(0, i), i
}, h.prototype.patchStudyData = function(e, t, i, s) {
if (!o.isProd()) return {
data: t,
nsData: i,
indexes: s
};
var r = TradingView.clone(t),
n = TradingView.clone(i),
l = TradingView.clone(s);
"VbPVisible@tv-volumebyprice" === e.id && e.version && e.version <= 4 && h
._patchOldVolumeProfiles(0, r.graphics), "VbPSessions@tv-volumebyprice" === e.id &&
e.version && e.version <= 4 && h._patchOldVolumeProfiles(0, r.graphics);
var c = a.versionOf(e);
if (e.isTVScript && e.TVScriptSourceCode && c >= 12 && c <= 26) {
var u = r.columns;
r.columns = [];
for (var d = 0; d < u.length; ++d) {
var p = "plot_" + d;
r.columns.push(p)
}
}
return {
data: r,
nsData: n,
indexes: l
}
}, h._patchOldVolumeProfiles = function(e, t) {
var i = t.hhists[e].data,
s = [];
for (var r in i) s = s.concat(i[r]);
t.hhists[0].data = s
}, h._fixInputsOrder = function(e, t) {
for (var i = a.getOrderedInputIds(t), s = h.splitInputs(e.inputs), r = s.arr, n = s.obj,
o = TradingView.merge({}, n), l = 0; l < i.length; ++l) {
var c = i[l],
u = h.findInputKeyById(r, c);
if (null !== u) {
var d = r[u];
o[l] = d
}
}
e.inputs = o
}, h.INPUT_MAX_VALUE = 1e12, h._verifyInputsMaxValue = function(e) {
var t = h.INPUT_MAX_VALUE;
if (e.inputs)
for (var i = 0; i < e.inputs.length; i++) {
var s = e.inputs[i];
"integer" === s.type && (s.max && s.max > t && n.logWarn(
"Bad integer input max value in metaInfo id=" + e.id + " title=" + e
.description))
}
}, h._fixInputsMaxValue = function(e, t) {
if (!TradingView.isAbsent(t)) {
var i = h.INPUT_MAX_VALUE;
if (t.inputs)
for (var s = 0; s < t.inputs.length; s++) {
"integer" === (a = t.inputs[s]).type && (a.max && a.max > i && (a.max = i))
}
if (e && e.inputs) {
var r = h.splitInputs(e.inputs),
n = r.arr;
for (var o in n) {
var a;
"integer" === (a = n[o]).type && (a.max && a.max > i && (a.max = i))
}
e.inputs = TradingView.merge(r.obj, r.arr)
}
}
}, h.prototype.patchPropsStateAndMetaInfo = function(e, t, i) {
"Script$BOOKER" !== t.productId || t.alerts || delete e.alerts, h._fixInputsOrder(e, t),
h._fixInputsMaxValue(e, t);
var s = h.splitInputs(e.inputs);
e.inputs = s.obj;
var r = a.versionOf(t);
r < a.METAINFO_FORMAT_VERSION_SOS_V2 && t.isChildStudy && (e.isChildStudy = t
.isChildStudy);
if (t.isTVScript && t.version < 60 && ("Script$TV_EARNINGS@tv-scripting" !== t.id &&
"Script$TV_DIVIDENDS@tv-scripting" !== t.id &&
"Script$TV_SPLITS@tv-scripting" !== t.id || delete t.TVScriptSourceCode),
"Volume" !== t.id && "Volume@tv-basicstudies" !== t.id || 0 !== t.inputs.length || (
t.inputs = [{
id: "length",
type: "integer",
defval: 20,
min: 1,
max: 1e3
}], t.plots.push({
id: "vol_ma",
type: "line"
})), "Volume@tv-basicstudies" === t.id && t.version && t.version <= 46 &&
void 0 === e.styles.vol.transparency && (e.styles.vol.transparency = e
.transparency || 87), "PivotPointsStandard@tv-basicstudies" === t.id && (0 === t
.inputs.length ? (e.inputs = {
kind: "Traditional",
showHistoricalPivots: !0
}, t.inputs = [{
defval: "Traditional",
id: "kind",
type: "text",
options: ["Traditional", "Fibonacci", "Woodie", "Classic", "DeMark",
"Camarilla"
]
}, {
id: "showHistoricalPivots",
type: "bool",
defval: !0
}]) : 1 === t.inputs.length && (e.inputs = {
kind: "Traditional"
}, t.inputs = [{
defval: "Traditional",
id: "kind",
type: "text",
options: ["Traditional", "Fibonacci", "Woodie", "Classic", "DeMark",
"Camarilla"
]
}, {
id: "showHistoricalPivots",
type: "bool",
defval: !0
}]), void 0 === e._hardCodedDefaultsVersion)) {
e._hardCodedDefaultsVersion = 1;
var n = e.color;
delete e.color, e.levelsStyle = {
colors: {
P: n,
"S1/R1": n,
"S2/R2": n,
"S3/R3": n,
"S4/R4": n,
"S5/R5": n
}
}
}
"CMF" === t.shortId && 2 === t.inputs.length && (e.inputs = {
length: e.inputs["length fast"]
}, t.inputs = t.inputs.splice(0, 1),
t.inputs[0].id = "length"), t.defaults && void 0 === t.defaults.precision && r <
a.VERSION_NEW_STUDY_PRECISION_FORMAT && (-1 !== ["Volume@tv-basicstudies",
"VbPVisible@tv-volumebyprice", "VbPSessions@tv-volumebyprice"
].indexOf(t.id) ? t.defaults.precision = 0 : t.defaults.precision = 4);
if (t.version < 60)
for (var o = ["TV_DIVIDENDS", "TV_SPLITS", "TV_EARNINGS"], u = "Script".length, d =
0; d < o.length; d++) t.id.startsWith("Script$" + o[d] + "@tv-scripting") &&
(t.fullId = "ESD" + t.fullId.substring(u), t.id = "ESD" + t.id.substring(u), t
.name = "ESD" + t.name.substring(u), t.shortId = "ESD" + t.shortId
.substring(u), t.productId = "ESD" + t.productId.substring(u));
var p = {
"ESD$TV_EARNINGS@tv-scripting": {
fullId: "Earnings@tv-basicstudies-129!",
id: "Earnings@tv-basicstudies",
name: "Earnings@tv-basicstudies",
shortId: "Earnings",
productId: "tv-basicstudies"
},
"ESD$TV_SPLITS@tv-scripting": {
fullId: "Splits@tv-basicstudies-129!",
id: "Splits@tv-basicstudies",
name: "Splits@tv-basicstudies",
shortId: "Splits",
productId: "tv-basicstudies"
},
"ESD$TV_DIVIDENDS@tv-scripting": {
fullId: "Dividends@tv-basicstudies-129!",
id: "Dividends@tv-basicstudies",
name: "Dividends@tv-basicstudies",
shortId: "Dividends",
productId: "tv-basicstudies"
}
};
if (t.id in p && Object.assign(t, p[t.id]), r < a.VERSION_PINE_PROTECT_TV_4164) {
var _ = {
"StrategyScript$STD;Consecutive%1Ups/Downs%1Strategy": {
pineId: "STD;Consecutive%1Ups%1Downs%1Strategy",
className: "StrategyScript"
},
Script$EDGR_NET_INCOME_FROM_CONTINUING_OPERATIONS_APPLICABLE_TO_COMMON_V2: {
pineId: "Script$EDGR_NET_INCOME_FROM_CONTINUING_OPS_APPLICABLE_TO_COMMON_V2",
className: "Script"
}
};
if (t.shortId in _) {
var m = _[t.shortId].className + "$" + _[t.shortId].pineId,
f = {
scriptIdPart: _[t.shortId].pineId,
fullId: t.fullId.replace(t.shortId, m),
id: t.id.replace(t.shortId, m),
name: t.name.replace(t.shortId, m),
shortId: m
};
TradingView.merge(t, f), TradingView.merge(e, f)
}
var g = l(t.fullId),
b = g && g.match(/^(USER)(_\d+)(;)(.*)$/);
if (b) {
var v = b[0],
S = b[1] + b[3] + b[2] + b[4];
f = {
scriptIdPart: S,
fullId: t.fullId.replace(v, S),
id: t.id.replace(v, S),
name: t.name.replace(v, S),
shortId: t.shortId.replace(v, S)
};
TradingView.merge(t, f), TradingView.merge(e, f)
}
}
if ("MA" === t.id) {
var y = new a({
id: "MAExp",
properties: [{
id: "is_price_study",
type: "bool",
value: "true"
}],
inputs: [{
id: "length",
type: "integer",
defval: 20,
min: 1,
max: 500
}, {
id: "source",
type: "text",
defval: "close",
options: ["open", "high", "low", "close"]
}],
plots: [{
id: "MovAvgExp",
type: "line"
}],
palettes: {}
}),
w = new a({
id: "MASimple",
properties: [{
id: "is_price_study",
type: "bool",
value: "true"
}],
inputs: [{
id: "length",
type: "integer",
defval: 20,
min: 1,
max: 500
}, {
id: "source",
type: "text",
defval: "close",
options: ["open", "high", "low", "close"]
}],
plots: [{
id: "MovAvgSimple",
type: "line"
}],
palettes: {}
}),
P = new a({
id: "MAVolumeWeighted",
properties: [{
id: "is_price_study",
type: "bool",
value: "true"
}],
inputs: [{
id: "length",
type: "integer",
defval: 20,
min: 1,
max: 500
}, {
id: "source",
type: "text",
defval: "close",
options: ["open", "high", "low", "close"]
}],
plots: [{
id: "MovAvgVolumeWeighted",
type: "line"
}],
palettes: {}
}),
C = new a({
id: "MAWeighted",
properties: [{
id: "is_price_study",
type: "bool",
value: "true"
}],
inputs: [{
id: "length",
type: "integer",
defval: 20,
min: 1,
max: 500
}, {
id: "source",
type: "text",
defval: "close",
options: ["open", "high", "low", "close"]
}],
plots: [{
id: "MovAvgWeighted",
type: "line"
}],
palettes: {}
});
switch (e.inputs.type) {
case "exp":
t = y;
break;
case "simple":
t = w;
break;
case "weighted":
t = C;
break;
case "volume weighted":
t = P
}
e.styles[t.plots[0].id] = e.styles.MovAvg, delete e.styles.MovAvg, delete e.inputs
.type
}
return i.oldShowStudyLastValueProperty && (e.oldShowLastValue = e.showLastValue),
delete e.showLastValue, delete e.showStudyArguments, c(t, e), {
propsState: e,
metaInfo: t
}
}, h.mergeInputs = function(e, t) {
h.mergeInputsArrPart(e, t), h.mergeInputsObjPart(e, t)
}, h.mergeInputsArrPart = function(e, t) {
var i = h.splitInputs(t);
for (var s in i.arr) {
var r = h.findInputKeyById(e, i.arr[s].id);
r ? TradingView.merge(e[r], i.arr[s]) : h.appendInputInfoToArr(e, i.arr[s])
}
}, h.mergeInputsObjPart = function(e, t) {
var i = h.splitInputs(t);
TradingView.merge(e, i.obj)
}, h.appendInputInfoToArr = function(e, t) {
var i = -1;
for (var s in e) {
var r = parseInt(s, 10);
isNumber(r) && (r > i && (i = r))
}
e[i + 1] = t
}, h.splitInputs = function(e) {
var t = {},
i = {};
for (var s in e) isNumber(parseInt(s, 10)) ? t[s] = e[s] : i[s] = e[s];
return {
arr: t,
obj: i
}
}, h.findInputKeyById = function(e, t) {
var i = null;
for (var s in e)
if (isNumber(parseInt(s, 10)) && e[s].id === t) {
i = s;
break
} return i
}, h.getInputKeyById = function(e, t) {
var i = h.findInputKeyById(e, t);
if (!i) throw new Error("Cannot find input with id: " + t);
return i
}, e.exports = h
},
K5cv: function(e, t, i) {
"use strict";
let s;
function r() {
return s
}
function n(e) {
s = e
}
i.r(t), i.d(t, "getSearchRequestDelay", (function() {
return r
})), i.d(t, "setSearchRequestDelay", (function() {
return n
}))
},
K8V9: function(e, t) {
e.exports =
''
},
K9GE: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return s
})), i.d(t, "c", (function() {
return r
})), i.d(t, "a", (function() {
return n
}));
const s = 350,
r = {
linear: e => e,
easeInQuad: e => e * e,
easeOutQuad: e => e * (2 - e),
easeInOutQuad: e => e < .5 ? 2 * e * e : (4 - 2 * e) * e - 1,
easeInCubic: e => e * e * e,
easeOutCubic: e => --e * e * e + 1,
easeInOutCubic: e => e < .5 ? 4 * e * e * e : (e - 1) * (2 * e - 2) * (2 * e - 2) + 1,
easeInQuart: e => e * e * e * e,
easeOutQuart: e => 1 - --e * e * e * e,
easeInOutQuart: e => e < .5 ? 8 * e * e * e * e : 1 - 8 * --e * e * e * e,
easeInQuint: e => e * e * e * e * e,
easeOutQuint: e => 1 + --e * e * e * e * e,
easeInOutQuint: e => e < .5 ? 16 * e * e * e * e * e : 1 + 16 * --e * e * e * e * e
};
class n {
constructor(e, t, i, s) {
this._mX1 = e, this._mY1 = t, this._mX2 = i, this._mY2 = s
}
easingFunc(e) {
return this._mX1 === this._mY1 && this._mX2 === this._mY2 ? e : this._calcBezier(
this._getTForX(e))
}
_a(e, t) {
return 1 - 3 * t + 3 * e
}
_b(e, t) {
return 3 * t - 6 * e
}
_c(e) {
return 3 * e
}
_calcBezier(e) {
return ((this._a(this._mY1, this._mY2) * e + this._b(this._mY1, this._mY2)) * e +
this._c(this._mY1)) * e
}
_getSlope(e) {
return 3 * this._a(this._mX1, this._mX2) * e * e + 2 * this._b(this._mX1, this
._mX2) * e + this._c(this._mX1)
}
_getTForX(e) {
let t = e;
for (let i = 0; i < 4; ++i) {
const i = this._getSlope(t);
if (0 === i) return t;
t -= (this._calcBezier(t) - e) / i
}
return t
}
}
},
"KG+6": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
})), i.d(t, "b", (function() {
return r
})), i.d(t, "d", (function() {
return l
})), i.d(t, "c", (function() {
return c
}));
var s, r, n = i("Eyy1"),
o = i("tqok"),
a = i("hsV8");
function l(e, t) {
if (e.firstBarTime >= t.length || e.lastBarTime >= t.length) return null;
const i = t[e.firstBarTime],
s = t[e.lastBarTime];
return i === o.INVALID_TIME_POINT_INDEX || s === o.INVALID_TIME_POINT_INDEX ? null : (
Object(n.assert)(i <= s, "firstBarTime should not exceed lastBarTime"), Object(n
.assert)(e.priceLow <= e.priceHigh, "priceLow should not exceed priceHigh"), {
firstBarTime: i,
lastBarTime: s,
rate: e.rate,
priceHigh: e.priceHigh,
priceLow: e.priceLow
})
}
function c(e, t, i) {
const s = Object(a.ensureTimePointIndexIndex)(i.indexOf(e.firstBarTime)),
r = Object(a.ensureTimePointIndexIndex)(i.indexOf(e.lastBarTime));
return {
id: t,
...e,
firstBarTime: s,
lastBarTime: r
}
}! function(e) {
e.LeftToRight = "left_to_right", e.RightToLeft = "right_to_left"
}(s || (s = {})),
function(e) {
e.Relative = "relative", e.Absolute = "absolute"
}(r || (r = {}))
},
KcY8: function(e, t, i) {
"use strict";
var s = i("aO4+"),
r = i("f6yo"),
n = i("VaSN"),
o = i("Tmoa"),
a = i("Ialn"),
l = i("ikwP"),
c = i("VdBB"),
h = i("gAom"),
u = i("//lt");
class d {
constructor(e, t) {
this.setData(e, t)
}
setData(e, t) {
this._data = {
...e
}, this._commonData = {
...t
}
}
draw(e, t, i, s, r, n) {
if (!this._data.visible) return;
e.save(), e.font = t.font;
const c = void 0 !== this._data.labelIcon,
u = this._data.ignoreOffset ? 0 : t.offsetSize,
d = t.borderSize,
p = t.paddingTop + this._commonData.additionalPaddingTop,
_ = t.paddingBottom + this._commonData.additionalPaddingBottom,
m = t.paddingInner,
f = t.paddingOuter,
g = t.fontSize;
let b = this._data.text,
v = this._data.textColor || this._commonData.textColor,
S = this._data.secondLine || "",
y = this._commonData.secondLineTextColor || v,
w = this._data.thirdLine || "";
const P = this._commonData.thirdLineTextColor || v;
0 === S.length && (S = w, y = P, w = ""), 0 === b.length && (b = S, v = y, S = w,
y = P, w = "");
const C = i.yMidCorrection(e, b) * n,
x = Math.ceil(i.measureText(e, b)),
T = g + p + _,
I = Boolean(S),
M = Boolean(w),
O = I ? Math.ceil(i.measureText(e, S)) : 0,
L = M ? Math.ceil(i.measureText(e, w)) : 0,
A = d + m + f + x + u,
E = O > 0 ? d + m + f + O + u : 0,
k = L > 0 ? d + m + f + L + u : 0,
D = Math.max(A, E, k),
V = Math.max(1, Math.floor(n));
let B = Math.round(T * n);
B % 2 != V % 2 && (B += 1);
const R = Math.round((g + t.lineSpacing) * n),
N = Math.round(2 * (g + t.lineSpacing) * n),
j = Math.max(1, Math.floor(d * n)),
F = this._data.separatorVisible ? j : 0,
W = this._data.borderVisible ? j : 0,
H = c ? B : Math.round(D * n),
U = Math.round(u * n),
z = Math.ceil(s * n),
G = Math.ceil(m * n);
let q = this._commonData.coordinate;
this._commonData.fixedCoordinate && (q = this._commonData.fixedCoordinate), q = Math
.round(q * n) - Math.floor(.5 * n);
const Y = Math.floor(q + V / 2 - B / 2),
K = Y + B,
J = "right" === r,
Z = J ? z - F : F,
X = z;
let $, Q = Z;
const ee = Object(o.resetTransparency)(this._data.backgroung || this._commonData
.background);
e.fillStyle = ee;
const te = 2 * n;
if (e.textAlign = J ? "right" : "left", e.textBaseline = "middle", J ? (Q = Z - H,
$ = Z - U - G - 1) : (Q = Z + H, $ = Z + U + G), b || c) {
const i = M ? B + N : I ? B + R : B;
if (((t, s, r) => {
J ? Object(h.drawRoundRectWithInnerBorder)(e, Q, Y, H, i, t, [te, 0,
0, te
], W, s, r) : Object(h.drawRoundRectWithInnerBorder)(e, Z, Y, H,
i, t, [0, te, te, 0], W, s, r)
})(ee, this._commonData.borderColor || ee, this._commonData.borderStyle),
this._data.separatorVisible && (e.fillStyle = t.paneBackgroundColor, e
.fillRect(J ? X - F : 0, Y, F, K - Y)), c) {
switch (this._data.labelIcon) {
case 0:
this._drawPlusIcon(e, Z, Q, Y, q, K, V);
break;
case 1:
this._drawClockIcon(e, Z, Q, q, V, n)
}
return
}
e.save(), e.translate($, (Y + K) / 2 + C), Object(l.drawScaled)(e, n, () => {
e.fillStyle = v, e.fillText(b, 0, 0)
}), e.restore()
}
I && (e.fillStyle = y, e.save(), e.translate($, (Y + K) / 2 + C + R), Object(l
.drawScaled)(e, n, () => {
e.fillText(Object(a.startWithLTR)(S), 0, 0)
}), e.restore()), M && (e.fillStyle = P, e.save(), e.translate($, (Y + K) / 2 +
C + N), Object(l.drawScaled)(e, n, () => {
e.fillText(Object(a.startWithLTR)(w), 0, 0)
}), e.restore()), e.restore()
}
height(e) {
const t = this._data,
i = (t.text ? 1 : 0) + (t.secondLine ? 1 : 0) + (t.thirdLine ? 1 : 0);
return t.visible && 0 !== i ? i * e.fontSize + (i - 1) * e.lineSpacing + e
.paddingTop + this._commonData.additionalPaddingTop + e.paddingBottom + this
._commonData.additionalPaddingBottom : 0
}
hitTest(e) {
const t = this._data.hitTestData;
if (void 0 === t || !this._data.visible) return null;
const i = Object(n.lastEventIsTouch)() ? 10 : 0,
o = Object(s.box)(new s.Point(t.xl - i, t.y - i), new s.Point(t.xl + t
.containerWidth + i, t.y + t.containerHeight + i)),
a = t.left && Object(r.pointInBox)(e, o),
l = Object(s.box)(new s.Point(t.xr - i, t.y - i), new s.Point(t.xr + t
.containerWidth + i, t.y + t.containerHeight + i)),
h = t.right && Object(r.pointInBox)(e, l);
if (a || h) {
const i = a ? "left" : "right";
return new c.HitTestResult(c.HitTestResult.CUSTOM, {
cursorType: u.PaneCursorType.Default,
clickHandler: void 0 === t.clickHandler ? void 0 : t.clickHandler
.bind(this, e, i),
tapHandler: void 0 === t.clickHandler ? void 0 : t.clickHandler
.bind(this, e, i),
tooltip: t.tooltip
})
}
return null
}
_drawPlusIcon(e, t, i, s, r, n, o) {
e.fillStyle = this._commonData.textColor, e.strokeStyle = this._commonData
.textColor, e.lineWidth = o;
const a = Math.abs(t - i);
let l = Math.round(.35 * a);
l % 2 != o % 2 && (l += 1);
let c = Math.round(.65 * a);
c % 2 != o % 2 && (c += 1);
const h = Math.floor((a - l) / 2),
u = Math.min(t, i),
d = u + Math.floor(a / 2 - o / 2);
e.fillRect(u + h, r, l, o), e.fillRect(d, s + h, o, l), e.beginPath(), e.arc(d + o /
2, r + o / 2, c / 2, 0, 2 * Math.PI, !1), e.stroke()
}
_drawClockIcon(e, t, i, s, r, n) {
e.fillStyle = this._commonData.textColor, e.lineWidth = r;
const o = Math.abs(t - i);
let a = Math.round(.35 * o);
a % 2 != r % 2 && (a += 1);
let l = Math.round(.65 * o);
l % 2 != r % 2 && (l += 1);
const c = Math.min(t, i) + Math.floor(o / 2 - r / 2);
e.save(), e.translate(c + r / 2 - l / 2, s + r / 2 - l / 2), e.scale(n, n);
const h = new Path2D(
"M7.5 0.8a1 1 0 0 0 0 13.4 1 1 0 0 0 0-13.4zm0 1a1 1 0 0 1 0 11 1 1 0 0 1 0-11zm-.97-.25A3.5 3.5 0 0 0 3.5 0 3.5 3.5 0 0 0 0 3.5a3.5 3.5 0 0 0 1.75 3.03l.5-.86A2.5 2.5 0 0 1 1 3.5 2.5 2.5 0 0 1 3.5 1a2.5 2.5 0 0 1 2.17 1.25zm6.72 4.78A3.5 3.5 0 0 0 15 3.5 3.5 3.5 0 0 0 11.5 0a3.5 3.5 0 0 0-3.03 1.75l.86.5A2.5 2.5 0 0 1 11.5 1 2.5 2.5 0 0 1 14 3.5a2.5 2.5 0 0 1-1.25 2.17zM7 5h1v5H7zm3 2v1H5V7z"
);
e.fill(h), e.restore()
}
}
i.d(t, "a", (function() {
return p
}));
class p {
constructor(e) {
this._commonRendererData = {
coordinate: 0,
textColor: "#FFF",
background: "#000",
additionalPaddingBottom: 0,
additionalPaddingTop: 0
}, this._axisRendererData = {
text: "",
visible: !1,
separatorVisible: !1,
borderVisible: !1,
ignoreOffset: !1
}, this._paneRendererData = {
text: "",
visible: !1,
separatorVisible: !0,
borderVisible: !1,
ignoreOffset: !0
}, this._invalidated = !0, this._axisRenderer = new(e || d)(this
._axisRendererData, this._commonRendererData), this._paneRenderer = new(e ||
d)(this._paneRendererData, this._commonRendererData)
}
text() {
return this._updateRendererDataIfNeeded(), this._axisRendererData.text
}
secondLineText() {
return this._updateRendererDataIfNeeded(), this._axisRendererData.secondLine
}
thirdLineText() {
return this._updateRendererDataIfNeeded(), this._axisRendererData.thirdLine
}
background() {
return this._updateRendererDataIfNeeded(), this._commonRendererData.background
}
color() {
return this._updateRendererDataIfNeeded(), this.generateTextColor(this.background())
}
generateTextColor(e) {
return Object(o.colorFromBackground)(e)
}
coordinate() {
return this._updateRendererDataIfNeeded(), this._commonRendererData.coordinate
}
floatCoordinate() {
return this._updateRendererDataIfNeeded(), this._commonRendererData
.floatCoordinate || this._commonRendererData.coordinate
}
update() {
this._invalidated = !0
}
height(e) {
return this._updateRendererDataIfNeeded(), Math.max(this._axisRenderer.height(e),
this._paneRenderer.height(e))
}
getFixedCoordinate() {
return this._commonRendererData.fixedCoordinate || 0
}
setFixedCoordinate(e) {
this._commonRendererData.fixedCoordinate = e
}
isVisible() {
return this._updateRendererDataIfNeeded(), this._axisRendererData.visible || this
._paneRendererData.visible
}
isAxisLabelVisible() {
return this._updateRendererDataIfNeeded(), this._axisRendererData.visible
}
isPaneLabelVisible() {
return this._updateRendererDataIfNeeded(), this._paneRendererData.visible
}
renderer() {
return this._updateRendererDataIfNeeded(), this._axisRenderer
}
paneRenderer() {
return this._updateRendererDataIfNeeded(), this._paneRenderer
}
setPaneRendererLabelIcon(e) {
this._paneRendererData.labelIcon = e
}
setPaneLabelVisible(e) {
this._paneRendererData.visible = e, this._invalidated = !0
}
ignoreAlignment() {
return !1
}
_updateRendererDataIfNeeded() {
this._invalidated && (this._updateRendererData(this._axisRendererData, this
._paneRendererData, this._commonRendererData), this._invalidated = !1), this
._axisRenderer.setData(this._axisRendererData, this._commonRendererData), this
._paneRenderer.setData(this._paneRendererData, this._commonRendererData)
}
}
},
Khfk: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LollipopRenderer", (function() {
return h
}));
var s = i("f6yo"),
r = i("aO4+"),
n = i("jFln"),
o = i("8Uy/"),
a = i("gAom"),
l = i("ikwP"),
c = i("Zp/P");
class h {
constructor(e, t, i) {
this._data = e, this._hittest = t, this._textWidthCache = i
}
draw(e, t) {
const i = t.pixelRatio,
s = this._data.centerPoint,
n = Math.round(s.x * i),
o = Math.round(s.y * i),
a = Math.max(1, Math.floor(i)) % 2 / 2,
l = new r.Point(n + a, o - a);
this._drawLollipop(e, l, t), this._drawLabel(e, l, t.pixelRatio)
}
hitTest(e, t) {
const i = Object(c.interactionTolerance)().esd,
n = this._data.centerPoint.y - this._data.style.height / 2 - i,
o = this._data.centerPoint.x - this._data.style.width / 2 - i,
a = Object(r.box)(new r.Point(o, n), new r.Point(o + this._data.style.width +
2 * i, n + this._data.style.height + 2 * i));
return Object(s.pointInBox)(e, a) ? this._hittest : null
}
_drawLollipop(e, t, i) {
const s = this._data.style,
r = i.pixelRatio,
l = Math.max(1, Math.floor(r));
let c = Math.round(s.width * r);
c % 2 != l % 2 && (c += 1);
const h = c / 2;
s.fillCircle && s.backgroundColor && (e.fillStyle = s.backgroundColor, Object(a
.createCircle)(e, t.x, t.y, h), e.fill());
const u = Math.round(s.lineWidth * r);
e.strokeStyle = s.strokeStyle, e.lineWidth = u, Object(n.setLineStyle)(e, o
.LINESTYLE_SOLID);
const d = h - Math.round(1 * r + u / 2);
Object(a.createCircle)(e, t.x, t.y, d), s.fillCircle && s.fillStyle && (e
.fillStyle = s.fillStyle, e.fill()), e.stroke()
}
_drawLabel(e, t, i) {
const s = this._data.style.text,
r = s.label;
e.textAlign = "center", e.textBaseline = "middle", e.fillStyle = s.strokeStyle, e
.font = s.font;
const n = this._textWidthCache.yMidCorrection(e, r);
e.translate(t.x, t.y + ((s.deltaY || 0) + n) * i), Object(l.drawScaled)(e, i,
() => {
e.fillText(r, 0, 0)
})
}
}
},
KnF9: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("qFKp");
class r {
constructor(e) {
this._shift = !1, this._control = !1, this._alt = !1, void 0 !== e && (this._shift =
Boolean(e.shiftKey), this._control = Boolean(Object(s.isMac)() ? e.metaKey :
e.ctrlKey), this._alt = Boolean(e.altKey))
}
shift() {
return this._shift
}
control() {
return this._control
}
alt() {
return this._alt
}
shiftOnly() {
return this._shift && !this._control && !this._alt
}
controlOnly() {
return this._control && !this._shift && !this._alt
}
altOnly() {
return this._alt && !this._shift && !this._control
}
controlShift() {
return this._shift && this._control && !this._alt
}
static create(e = !1, t = !1, i = !1) {
return new r({
shiftKey: e,
ctrlKey: t,
metaKey: t,
altKey: i
})
}
}
},
KtbP: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PanePriceAxisView", (function() {
return n
}));
var s = i("u+0B");
class r {
constructor(e) {
this._priceAxisViewRenderer = null, this._rendererOptions = null, this._align =
"right", this._width = 0, this._textWidthCache = e
}
setParams(e, t, i, s) {
this._priceAxisViewRenderer = e, this._rendererOptions = t, this._width = i, this
._align = s
}
draw(e, t) {
null !== this._rendererOptions && null !== this._priceAxisViewRenderer && this
._priceAxisViewRenderer.draw(e, this._rendererOptions, this._textWidthCache,
this._width, this._align, t.pixelRatio)
}
hitTest(e) {
var t, i;
return void 0 === (null === (t = this._priceAxisViewRenderer) || void 0 === t ?
void 0 : t.hitTest) ? null : null === (i = this._priceAxisViewRenderer) ||
void 0 === i ? void 0 : i.hitTest(e, this._width, this._align)
}
}
class n {
constructor(e, t, i) {
this._renderer = null, this._invalidated = !0, this._priceAxisView = e, this
._textWidthCache = new s.TextWidthCache(50), this._dataSource = t, this
._chartModel = i, this._fontSize = -1, this._panePriceAxisViewRenderer = new r(
this._textWidthCache)
}
update() {
this._invalidated = !0
}
renderer(e, t) {
return this._invalidated && this._updateImpl(e, t), this._renderer
}
_updateImpl(e, t) {
this._priceAxisView.update(), this._renderer = null;
const i = this._chartModel.crossHairSource(),
s = this._dataSource === i ? i.pane : this._chartModel.paneForSource(this
._dataSource);
if (null === s) return;
const r = this._priceScale();
if (null === r) return;
let n = s.priceScalePosition(r);
if ("overlay" === n && (n = s.priceScalePosition(s.defaultPriceScale())),
"overlay" === n) return;
const o = this._chartModel.priceAxisRendererOptions();
o.fontSize !== this._fontSize && (this._fontSize = o.fontSize, this._textWidthCache
.reset()),
this._panePriceAxisViewRenderer.setParams(this._priceAxisView.paneRenderer(), o,
t, n), this._renderer = this._panePriceAxisViewRenderer, this
._invalidated = !1
}
_priceScale() {
return this._dataSource.priceScale()
}
}
},
"L/Ed": function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "ToolboxType", (function() {
return s
})),
function(e) {
e[e.Delete = 0] = "Delete"
}(s || (s = {}))
},
L6rT: function(e, t, i) {
"use strict";
function s(e) {
return e.reduce((function(e, t, i) {
return ~e.indexOf(t) || e.push(t), e
}), [])
}
i.r(t), i.d(t, "uniq", (function() {
return s
}))
},
LAp3: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return a
}));
var s = i("ogJP"),
r = i("5rJj"),
n = i.n(r);
class o extends n.a {
constructor(e, t) {
super(e, t, !1, {
names: ["width", "color", "visible"]
})
}
_iterateLevels(e, t) {
for (const i in e.levels)
if (e.levels[i] && Object(s.isSameType)(e.levels[i], t.typecheck())) {
let s = t.tpl();
for (const r in this._map.names) this._map.names.hasOwnProperty(r) && (
s = t.fill(r, this._map.names[r], e.levels[i], s));
e.levels[i] = s
} return e
}
}
function a(e, t) {
return new o(e, t)
}
},
LdoW: function(e, t) {
e.exports =
''
},
LxhU: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ResolutionKind", (function() {
return n
})), i.d(t, "SpecialResolutionKind", (function() {
return o
})), i.d(t, "Interval", (function() {
return h
})), i.d(t, "isHour", (function() {
return d
}));
const s = /^(\d*)([TSHDWMR])$/,
r = /^(\d+)$/;
var n, o;
! function(e) {
e.Ticks = "ticks", e.Seconds = "seconds", e.Minutes = "minutes", e.Days = "days", e.Weeks =
"weeks", e.Months = "months", e.Range = "range", e.Invalid = "invalid"
}(n || (n = {})),
function(e) {
e.Hours = "hours"
}(o || (o = {}));
const a = {};
a[n.Ticks] = 1e3, a[n.Seconds] = 1e3, a[n.Minutes] = 60 * a[n.Seconds], a[n.Days] = 1440 * a[n
.Minutes], a[n.Weeks] = 7 * a[n.Days];
const l = {
T: n.Ticks,
S: n.Seconds,
D: n.Days,
W: n.Weeks,
M: n.Months,
R: n.Range
},
c = new Set([n.Ticks, n.Seconds, n.Minutes]);
class h {
constructor(e, t) {
this._kind = n.Invalid, this._multiplier = 0, e !== n.Invalid && t > 0 && (this
._kind = e, this._multiplier = t)
}
kind() {
return this._kind
}
multiplier() {
return this._multiplier
}
isValid() {
return this.kind() !== n.Invalid && this.multiplier() > 0
}
isDWM() {
return this.isValid() && !this.isRange() && !this.isIntraday() && !this.isTicks()
}
isIntraday() {
const e = c.has(this.kind());
return this.isValid() && e
}
isSeconds() {
return this.kind() === n.Seconds
}
isMinutes() {
return this.kind() === n.Minutes
}
isMinuteHours() {
return this.kind() === n.Minutes && d(this.multiplier())
}
isDays() {
return this.kind() === n.Days
}
isWeeks() {
return this.kind() === n.Weeks
}
isMonths() {
return this.kind() === n.Months
}
isRange() {
return this.kind() === n.Range
}
isTicks() {
return this.kind() === n.Ticks
}
isTimeBased() {
return !this.isRange()
}
letter() {
return this.isValid() && this.kind() !== n.Minutes ? this.kind()[0].toUpperCase() :
""
}
value() {
return this.isValid() ? this.kind() === n.Minutes ? this.multiplier() + "" : this
.multiplier() + this.letter() : ""
}
isEqualTo(e) {
if (!(e instanceof h)) throw new Error("Argument is not an Interval");
return !(!this.isValid() || !e.isValid()) && (this.kind() === e.kind() && this
.multiplier() === e.multiplier())
}
inMilliseconds(e = Date.now()) {
if (!this.isValid() || this.isRange()) return NaN;
if (this.isMonths()) {
const t = new Date(e);
t.setUTCMonth(t.getUTCMonth() + (this.multiplier() || 1));
return +t - e
}
const t = this.multiplier();
return a[this.kind()] * t
}
static isEqual(e, t) {
return e === t || h.parse(e).isEqualTo(h.parse(t))
}
static parse(e) {
e = (e + "").toUpperCase().split(",")[0];
let t = s.exec(e);
return null !== t ? "H" === t[2] ? new h(n.Minutes, 60 * u(t[1])) : new h(l[t[2]],
u(t[1])) : (t = r.exec(e), null !== t ? new h(n.Minutes, u(t[1])) : new h(n
.Invalid, 0))
}
static kind(e) {
return h.parse(e).kind()
}
static isValid(e) {
return h.parse(e).isValid()
}
static isDWM(e) {
return h.parse(e).isDWM()
}
static isIntraday(e) {
return h.parse(e).isIntraday()
}
static isSeconds(e) {
return h.parse(e).isSeconds()
}
static isMinutes(e) {
return h.parse(e).isMinutes()
}
static isMinuteHours(e) {
return h.parse(e).isMinuteHours()
}
static isDays(e) {
return h.parse(e).isDays()
}
static isWeeks(e) {
return h.parse(e).isWeeks()
}
static isMonths(e) {
return h.parse(e).isMonths()
}
static isRange(e) {
return h.parse(e).isRange()
}
static isTicks(e) {
return h.parse(e).isTicks()
}
static isTimeBased(e) {
return h.parse(e).isTimeBased()
}
static normalize(e) {
const t = h.parse(e);
return t.isValid() ? t.value() : null
}
}
function u(e) {
return 0 === e.length ? 1 : parseInt(e, 10)
}
function d(e) {
return e >= 60 && !(e % 60)
}
},
"M7/j": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "itemsRangeIsValid", (function() {
return h
})), i.d(t, "splitItems", (function() {
return u
})), i.d(t, "PaneRendererBaseline", (function() {
return d
}));
var s = i("aO4+"),
r = i("hBTJ"),
n = i("GEp6"),
o = i("Zp/P"),
a = i("Y7w9"),
l = i("cPgM"),
c = i("VdBB");
function h(e) {
if (0 === e.length) return !1;
const t = e.findIndex(e => Object(o.coordinateIsValid)(e.y));
if (-1 === t) return !1;
let i = e.length - 1;
for (; i > t && !Object(o.coordinateIsValid)(e[i].y);) i--;
return !(t > i)
}
function u(e, t) {
const i = [],
n = [];
let a = null;
for (let l = 0; l < e.length; l++) {
let c = e[l];
const h = e[l + 1] || {};
if (Object(o.coordinateIsValid)(c.y)) c.y <= t && i.push(c), c.y >= t && n.push(c), a =
c;
else {
if (null === a) continue;
c = a
}
if (Object(o.coordinateIsValid)(h.y) && (c.y > t && h.y < t || c.y < t && h.y > t))
if (Math.abs(c.x - h.x) < 1) {
const e = new s.Point(c.x, t);
i.push(e), n.push(e)
} else {
const e = Object(r.intersectLineSegments)(c, h, new s.Point(c.x, t), new s
.Point(h.x, t));
if (null !== e) {
const t = c.add(h.subtract(c).scaled(e));
i.push(t), n.push(t)
}
}
}
return {
topItems: i,
bottomItems: n
}
}
class d extends l.ScaledPaneRenderer {
constructor() {
super(...arguments), this._data = null
}
setData(e) {
this._data = e
}
hitTest(e) {
if (null === this._data) return null;
const {
items: t,
topLineWidth: i,
bottomLineWidth: r
} = this._data, l = Object(o.interactionTolerance)().series + (i + r) / 4, h =
Object(a.lowerbound)(t, e, (e, t) => e.x <= t.x), u = Math.max(1, h - 1),
d = Math.min(t.length - 1, h + 1);
for (let i = u; i <= d; ++i) {
const r = t[i - 1],
o = t[i],
{
distance: a
} = Object(n.distanceToSegment)(new s.Point(r.x, r.y), new s.Point(o.x,
o.y), new s.Point(e.x, e.y));
if (a <= l) return new c.HitTestResult(c.HitTestResult.REGULAR)
}
return null
}
_drawImpl(e) {
if (null === this._data) return;
const {
items: t,
baseLevelCoordinate: i,
bottom: s,
bottomFillColor1: r,
bottomFillColor2: n,
topFillColor1: o,
topFillColor2: a,
topLineColor: l,
bottomLineColor: c,
topLineWidth: d,
bottomLineWidth: p
} = this._data;
if (!h(t)) return;
const {
topItems: _,
bottomItems: m
} = u(t, i);
e.lineCap = "round", e.lineJoin = "round", 0 !== _.length && (e.beginPath(), e
.moveTo(_[0].x, i), this._makeLine(e, _, !0, 0), e.closePath(), e
.fillStyle = this._makeLinearGradient(e, o, a, i - s, i), e.fill(), e
.beginPath(), this._makeLine(e, _, !1, 0), e.lineWidth = d, e
.strokeStyle = l, e.stroke()), 0 !== m.length && (e.beginPath(), e
.moveTo(m[0].x, i), this._makeLine(e, m, !0, 1), e.closePath(), e
.fillStyle = this._makeLinearGradient(e, r, n, i, i + s), e.fill(), e
.beginPath(), this._makeLine(e, m, !1, 1), e.lineWidth = p, e
.strokeStyle = c, e.stroke())
}
_makeLine(e, t, i, s) {
if (null === this._data) return;
const r = t.findIndex(e => Object(o.coordinateIsValid)(e.y));
if (-1 === r) return;
const {
barSpacing: n,
baseLevelCoordinate: a
} = this._data, l = .25 * n;
let c;
const h = t.length;
for (let n = r; n < h; n++) {
const h = t[n],
u = t[n + 1] || {};
if (Object(o.coordinateIsValid)(h.y)) {
if (0 === s) {
if (c && c.y >= a && h.y >= a) {
e.moveTo(h.x, h.y);
continue
}
} else if (c && c.y <= a && h.y <= a) {
e.moveTo(h.x, h.y);
continue
}
if (c && Object(o.coordinateIsValid)(c.y)) e.lineTo(h.x, h.y), i && !
Object(o.coordinateIsValid)(u.y) && e.lineTo(h.x, a);
else if (u && Object(o.coordinateIsValid)(u.y)) i ? (n !== r && e
.lineTo(h.x, a), e.lineTo(h.x, h.y)) : e.moveTo(h.x, h.y);
else if (i) {
if (0 === n) continue;
n !== r && e.lineTo(h.x - l, a), e.lineTo(h.x - l, h.y), e.lineTo(h
.x + l, h.y), e.lineTo(h.x + l, a)
} else e.moveTo(h.x - l, h.y), e.lineTo(h.x + l, h.y);
c = h
}
}
}
_makeLinearGradient(e, t, i, s, r) {
const n = e.createLinearGradient(0, s, 0, r);
return n.addColorStop(0, t), n.addColorStop(1, i), n
}
}
},
MA5A: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolCrossLine", (function() {
return a
}));
var s = i("Ocx9"),
r = i("p1SQ"),
n = i("GmZZ"),
o = i("Ss5c");
class a extends o.LineDataSource {
constructor(e, t) {
super(e, t || a.createProperties()), this._priceAxisView = new r
.LineToolHorzLinePriceAxisView(this), this._timeAxisView = new n.a(this), i
.e("lt-pane-views").then(i.bind(null, "amUF")).then(({
CrossLinePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 1
}
name() {
return "Cross Line"
}
priceAxisViews(e, t) {
return this.isSourceHidden() ? null : t === this.priceScale() && this
.properties().showPrice.value() && this._model.paneForSource(this) === e ? [
this._priceAxisView
] : null
}
timeAxisViews() {
return this.isSourceHidden() ? null : this.properties().showTime.value() ? [this
._timeAxisView
] : null
}
updateAllViews() {
super.updateAllViews(), this._priceAxisView.update(), this._timeAxisView
.update()
}
canHasAlert() {
return !1
}
lineColor() {
return this.properties().linecolor.value()
}
lineWidth() {
return this.properties().linewidth.value()
}
lineStyle() {
return this.properties().linestyle.value()
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolcrossline", e);
return a._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "xrdl")).then(
e => e.CrossLineDefinitionsViewModel)
}
static _configureProperties(e) {
o.LineDataSource._configureProperties(e)
}
}
},
MROS: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ModelSelection", (function() {
return o
}));
var s = i("Y7w9"),
r = i("GxN8"),
n = i("CW80");
class o {
constructor() {
this._items = [], this._set = new Set
}
isEmpty() {
return 0 === this._items.length
}
add(e) {
if (this._items.length > 0 && !Object(n.isLineTool)(this._items[0]) && this.clear(),
Object(n.isLineTool)(e)) {
const t = Object(s.lowerbound)(this._items, e, (e, t) => e.zorder() < t
.zorder());
this._items.splice(t, 0, e)
} else this.clear(), this._items = [e];
this._set.add(e)
}
canBeAddedToSelection(e) {
return 0 === this._items.length || Object(n.isLineTool)(this._items[0]) && Object(n
.isLineTool)(e)
}
isSelected(e) {
return this._set.has(e)
}
allSources() {
return this._items.slice(0)
}
dataSources() {
return this._items.filter(r.a)
}
lineDataSources() {
return this._items.filter(n.isLineTool)
}
customSources() {
return this._items.filter(e => !Object(r.a)(e))
}
checkLineToolSelection() {
this._items.forEach(e => Object(n.isLineTool)(e) && e.calcIsActualSymbol()), this
._items = this._items.filter(e => !Object(n.isLineTool)(e) || e
.isActualSymbol())
}
remove(e) {
this._items = this._items.filter(t => t !== e), this._set.delete(e)
}
clear() {
this._items = [], this._set.clear()
}
notFixedSources() {
return this._items.filter(e => !Object(n.isLineTool)(e) || !e.isFixed())
}
}
},
MSvv: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyLineDataSource", (function() {
return g
}));
var s = i("Eyy1"),
r = i("ogJP"),
n = i("k9/m"),
o = i("Ss5c"),
a = i("Ocx9"),
l = i("0YCj"),
c = i.n(l),
h = i("jenN"),
u = i("ZAxB"),
d = i("gvrv"),
p = i("w4Ji"),
_ = i("GVHu"),
m = i("jCNj"),
f = i("OLhd");
class g extends o.LineDataSource {
constructor(e, t, s, r) {
super(e, r), this._indexes = null, this._inputs = null, this._pointsetPoints =
null, this._loadedPlots = null, this._loadedGraphics = null, this
._beingCreatedPaneView = null, this._anchorsPaneView = null, this
._definitionsViewModel = null, this._alignerCache = null, Promise.all([i.e(
"lt-pane-views").then(i.bind(null, "pGCE")), i.e(
"lt-pane-views").then(i.bind(null, "AOzI"))]).then(t => {
const {
LineToolBeingCreatedPaneView: i
} = t[0], {
StudyLineDataSourceAnchorsPaneView: s
} = t[1];
this._beingCreatedPaneView = new i(this, e), this._anchorsPaneView =
new s(this, this.model()), this._model.lightUpdate()
}), this._metaInfo = t, this._dataSource = new d.a(e.chartApi(), e
.mainSeries().seriesSource(), s, t), this._dataSource.dataCleared()
.subscribe(this, this._onDataCleared), this._dataSource.dataUpdated()
.subscribe(this, this._onDataUpdated)
}
destroy() {
this._dataSource.dataUpdated().unsubscribe(this, this._onDataUpdated), this
._dataSource.dataCleared().unsubscribe(this, this._onDataCleared), this
._dataSource.destroy(), null !== this._definitionsViewModel && (this
._definitionsViewModel.destroy(), this._definitionsViewModel = null),
this._unsubscribeApplyInputsOnSeriesCompleted(), this._isDestroyed = !0,
super.destroy()
}
stop() {
super.stop(), this._isDestroyed || (this._dataSource.stop(), this.clearData())
}
start() {
super.start(), this._isDestroyed || null === this._inputs || this._dataSource
.start()
}
metaInfo() {
return this._metaInfo
}
graphicsInfo() {
return this._metaInfo.graphics
}
series() {
return this._model.mainSeries()
}
translatedType() {
return this._metaInfo.description
}
name() {
return this._metaInfo.description
}
studyId() {
return this._metaInfo.id
}
setPoint(e, t, i) {
super.setPoint(e, this._preparePoint(t, i))
}
move(e) {}
clearData() {
this._clearAllDataExceptPointsetPoints(), this._pointsetPoints = null, this
.updateAllViews()
}
data() {
return this.plots()
}
plots() {
return this._loadedPlots || this._dataSource.plots()
}
graphics() {
return this._loadedGraphics || this._dataSource.graphics()
}
firstValue() {
return this._model.mainSeries().firstValue()
}
state(e) {
const t = super.state(e);
let i;
this.metaInfo() instanceof c.a ? i = this.metaInfo().state() : (i = Object(r
.clone)(this.metaInfo()), i.id = c.a.parseIdString(i.id + (i
.version ? "-" + i.version : "")).fullId);
const s = {
...t,
metaInfo: i
};
return e && (s.data = this.plots().state(), s.nonseriesindexes = this._indexes,
s.graphics = Object(h.saveStudyGraphics)(this.graphics())), s
}
restoreData(e) {
void 0 !== e.data && (this._loadedPlots = new n.PlotList(Object(p
.studyPlotFunctionMap)(this._metaInfo), p
.studyEmptyPlotValuePredicate), this._loadedPlots.restoreState(e
.data)), this._indexes = e.nonseriesindexes ? e.nonseriesindexes : null,
this._loadedGraphics = e.graphics ? Object(h.loadStudyGraphics)(e
.graphics) : null
}
getPropertyDefinitionsViewModel() {
return null === this._definitionsViewModel ? this
._getPropertyDefinitionsViewModelClass().then(e => null === e || this
._isDestroyed ? null : (null === this._definitionsViewModel && (this
._definitionsViewModel = new e(this._model.undoModel(), this)),
this._definitionsViewModel)) : Promise.resolve(this
._definitionsViewModel)
}
paneViews(e) {
let t = [];
if (this.isSourceHidden()) return t;
if (this._isReady() && this._changeStatesStack.isEmpty()) {
const i = super.paneViews(e);
null !== i && (t = t.concat(i))
} else null !== this._beingCreatedPaneView && t.push(this
._beingCreatedPaneView);
return null !== this._anchorsPaneView && t.push(this._anchorsPaneView), t
}
propertiesChanged(e) {
super.propertiesChanged(e), this._onStudyInputsMayChange()
}
dataAndViewsReady() {
return super.dataAndViewsReady() && this._isReady()
}
endChanging(e, t) {
const i = super.endChanging(e, t);
return i.indexesChanged ? this.clearData() : this._updateAnchorsPrice(), i
}
moveData(e) {
this._dataSource.moveData(e)
}
static createPropertiesFromStudyMetaInfoAndState(e, t, i, s) {
const r = Object(_.prepareStudyPropertiesForLoadChart)(e, t, i, null, s);
return g._configureProperties(r), r
}
_isReady() {
return !0
}
_updateAllPaneViews() {
var e, t;
super._updateAllPaneViews(), null === (e = this._beingCreatedPaneView) ||
void 0 === e || e.update(), null === (t = this._anchorsPaneView) ||
void 0 === t || t.update()
}
_getPointTime(e, t) {
const i = e.index,
s = this._model.timeScale().indexToTimePoint(i);
if (null !== s) return s;
if (t || void 0 === e.time) return null;
const r = this._model.mainSeries().symbolInfo();
if (null === r) return null;
let n = this._model.properties().timezone.value();
"exchange" === n && (n = r.timezone);
const o = Object(m.cal_to_utc)(Object(m.get_timezone)(n), e.time);
return this._getStartBarAligner()(o) / 1e3
}
_updateAnchorsPrice() {}
_onPointsetUpdated(e) {
super._onPointsetUpdated(e), this._pointsetPoints = this._points.map(e => ({
price: e.price,
index: e.index,
time: e.time
})), this._onStudyInputsMayChange()
}
_onDataCleared() {
this.updateAllViews(),
this._model.updateSource(this)
}
_onDataUpdated(e, t, i) {
this._updateAnchorsPrice(), this.updateAllViews(), this._model.updateSource(
this)
}
_onStudyInputsMayChange() {
let e = null;
null !== this._pointsetPoints && this._pointsetPoints.length === this
.pointsCount() && (e = this._studyInputs(this._pointsetPoints), null ===
e && (this._clearAllDataExceptPointsetPoints(), this.updateAllViews())),
this._areInputsEqual(this._inputs, e) || this._applyStudyInputs(e)
}
_onMainSeriesSymbolResolved() {
super._onMainSeriesSymbolResolved(), this._alignerCache = null
}
_preparePoint(e, t) {
return super._preparePoint(this._alignPointToRangeOfActualData(e), t)
}
_getPropertyDefinitionsViewModelClass() {
return Promise.resolve(null)
}
_subscribeApplyInputsOnSeriesCompleted() {
this._unsubscribeApplyInputsOnSeriesCompleted(), this._model.mainSeries()
.dataEvents().completed().subscribe(this, () => this
._onStudyInputsMayChange(), !0)
}
_unsubscribeApplyInputsOnSeriesCompleted() {
this._model.mainSeries().dataEvents().completed().unsubscribeAll(this)
}
static _createPropertiesFromStudyIdAndState(e, t) {
const i = c.a.getStudyPropertyRootNameById(e),
s = new a.DefaultProperty(i, t);
return g._configureProperties(s), s
}
static _createPropertiesFromStudyMetaInfo(e, t) {
const i = Object(_.prepareStudyProperties)(e, null, null, t);
return g._configureProperties(i), i
}
static _configureProperties(e) {
o.LineDataSource._configureProperties(e)
}
_areInputsEqual(e, t) {
return null === t ? null === e : null !== e && Object(u.a)(this._metaInfo
.inputs, e, t)
}
_applyStudyInputs(e) {
const t = this._inputs;
this._inputs = e, null !== e && (this
._unsubscribeApplyInputsOnSeriesCompleted(), this._dataSource.setInputs(
e),
null === t && this.isStarted() && !this._dataSource.isStarted() && this
._dataSource.start())
}
_clearAllDataExceptPointsetPoints() {
this._inputs = null, this._dataSource.clearData(), this._loadedPlots = null,
this._indexes = null, this._loadedGraphics = null
}
_getStartBarAligner() {
const e = this._model.mainSeries().interval();
return null !== this._alignerCache && this._alignerCache.resolution === this
._model.mainSeries().interval() || (this._alignerCache = {
resolution: e,
aligner: Object(f.createTimeToBarTimeAligner)(e, Object(s
.ensureNotNull)(this._model.mainSeries().symbolInfo()))
}), this._alignerCache.aligner
}
}
},
MWAT: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PriceScaleSelectionStrategyEvenly", (function() {
return o
})), i.d(t, "PriceScaleSelectionStrategyAllRight", (function() {
return a
})), i.d(t, "PriceScaleSelectionStrategyAllLeft", (function() {
return l
})), i.d(t, "createPriceScaleSelectionStrategy", (function() {
return h
})), i.d(t, "allPriceScaleSelectionStrategyInfo", (function() {
return u
}));
var s = i("Eyy1"),
r = i("3ClC");
class n {
constructor(e) {
this._priceScalesLimit = 8, this._metaInfo = e
}
metaInfo() {
return this._metaInfo
}
findSuitableScale(e, t, i, s) {
if (void 0 !== s) return this._tryToGetDesiredPriceScale(e, t, s, i);
if (Object(r.isStudy)(t)) {
const s = t.metaInfo();
if ("Volume" === s.shortId && e.containsMainSeries()) return e
.createPriceScaleAtPosition("overlay");
const n = t.desiredPriceScalePosition();
if (null !== n) return this._tryToGetDesiredPriceScale(e, t, n, i);
if (void 0 !== i && (Object(r.isStudy)(i) || e.isMainPane()) && s
.is_price_study) return this._getPriceScaleTheSameAsForSource(i, e)
}
let n = !1;
if (Object(r.isStudy)(t)) {
const i = t.metaInfo().groupingKey;
if (void 0 !== i) {
const t = e.model().findNonOverlayStudyWithGroupingKey(i, e);
if (null !== t) return this._getPriceScaleTheSameAsForSource(t.study, t
.pane)
}
n = Boolean(t.metaInfo().is_price_study)
} else t === e.model().mainSeries() && (n = !0);
if (n) {
const t = this._findFirstScaleForPriceStudy(e);
if (null !== t) return t
}
return this.createNewPriceScaleIfPossible(e)
}
canCreateNewPriceScale(e) {
return e.leftPriceScales().length + e.rightPriceScales().length < this
._priceScalesLimit
}
_getPriceScaleTheSameAsForSource(e, t) {
return t.isOverlay(e) ? t.createPriceScaleAtPosition("overlay") : Object(s
.ensureNotNull)(e.priceScale())
}
_priceScaleIsPrice(e, t) {
const i = e.mainSource();
return !!i && (i === t.mainSeries() || !!Object(r.isStudy)(i) && Boolean(i
.metaInfo().is_price_study))
}
_findFirstScaleForPriceStudy(e) {
const t = e.model();
for (let i = 0; i < this._priceScalesLimit; i++) {
if (e.rightPriceScales().length > i && this._priceScaleIsPrice(e
.rightPriceScales()[i], t)) return e.rightPriceScales()[i];
if (e.leftPriceScales().length > i && this._priceScaleIsPrice(e
.leftPriceScales()[i], t)) return e.leftPriceScales()[i]
}
return null
}
_targetPriceScaleIndex(e, t) {
if (e.mainSource() === t.mainSeries()) return 0
}
_tryToGetDesiredPriceScale(e, t, i, r) {
switch (i) {
case "left":
return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition(
"left") : e.createPriceScaleAtPosition("overlay");
case "right":
return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition(
"right") : e.createPriceScaleAtPosition("overlay");
case "as-series":
return void 0 !== r ? Object(s.ensureNotNull)(r.priceScale()) : e
.isMainPane() ? Object(s.ensureNotNull)(Object(s.ensureNotNull)(e
.mainDataSource()).priceScale()) : this
.createNewPriceScaleIfPossible(e);
case "overlay":
return e.createPriceScaleAtPosition("overlay")
}
}
}
class o extends n {
constructor(e) {
super(e)
}
apply(e) {
if (e.containsMainSeries()) {
const t = Object(s.ensureNotNull)(Object(s.ensureNotNull)(e.mainDataSource())
.priceScale());
e.movePriceScale(t, "right", 0)
}
const t = e.model();
for (; e.leftPriceScales().length > e.rightPriceScales().length;) {
const i = e.leftPriceScales()[e.leftPriceScales().length - 1];
e.movePriceScale(i, "right", this._targetPriceScaleIndex(i, t))
}
for (; e.rightPriceScales().length - e.leftPriceScales().length > 1;) {
const i = e.rightPriceScales()[e.rightPriceScales().length - 1];
e.movePriceScale(i, "left", this._targetPriceScaleIndex(i, t))
}
}
createNewPriceScaleIfPossible(e) {
if (!this.canCreateNewPriceScale(e)) return e.createPriceScaleAtPosition("overlay");
const t = e.leftPriceScales().length < e.rightPriceScales().length ? "left" :
"right";
return e.createPriceScaleAtPosition(t)
}
}
class a extends n {
constructor(e) {
super(e)
}
apply(e) {
const t = e.model();
e.leftPriceScales().slice(0).forEach(i => e.movePriceScale(i, "right", this
._targetPriceScaleIndex(i, t)))
}
createNewPriceScaleIfPossible(e) {
return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition("right") : e
.createPriceScaleAtPosition("overlay")
}
}
class l extends n {
constructor(e) {
super(e)
}
apply(e) {
const t = e.model();
e.rightPriceScales().slice(0).forEach(i => e.movePriceScale(i, "left", this
._targetPriceScaleIndex(i, t)))
}
createNewPriceScaleIfPossible(e) {
return this.canCreateNewPriceScale(e) ? e.createPriceScaleAtPosition("left") : e
.createPriceScaleAtPosition("overlay")
}
}
const c = [{
name: "left",
title: window.t("Stack On The Left"),
ctor: l
}, {
name: "right",
title: window.t("Stack On The Right"),
ctor: a
}, {
name: "auto",
title: window.t("Auto"),
ctor: o
}];
function h(e) {
const t = Object(s.ensureDefined)(c.find(t => t.name === e));
return new t.ctor(t)
}
function u() {
return c
}
},
MXV9: function(e, t) {
e.exports =
''
},
MY2c: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return l
}));
var s = i("RDU5"),
r = i("aIyQ"),
n = i.n(r),
o = i("txPx");
const a = Object(o.getLogger)("Common.UndoStack");
class l {
constructor() {
this._commands = [], this._onChange = new n.a
}
onChange() {
return this._onChange
}
isEmpty() {
return 0 === this._commands.length
}
clear() {
this.isEmpty() || (this._commands.length = 0, this._onChange.fire())
}
push(e) {
if (!(e instanceof s.UndoCommand)) throw new TypeError(
"argument must be an instance of UndoCommand");
this._commands.push(e), this._onChange.fire(e)
}
pop() {
if (this.isEmpty()) return void a.logDebug("pop: undo stack is empty");
const e = this._commands.pop();
return this._onChange.fire(e), e
}
head() {
if (!this.isEmpty()) return this._commands[this._commands.length - 1]
}
}
},
MbIA: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return o
}));
var s = i("4kQX"),
r = i("gQ5K");
const n = {
dateFormat: "yyyy-MM-dd",
timeFormat: "%h:%m:%s",
dateTimeSeparator: " "
};
class o {
constructor(e = {}) {
const t = Object.assign({}, n, e);
this._dateFormatter = new r.DateFormatter(t.dateFormat), this._timeFormatter = new s
.TimeFormatter(t.timeFormat), this._separator = t.dateTimeSeparator
}
format(e) {
return `${this._dateFormatter.format(e)}${this._separator}${this._timeFormatter.format(e)}`
}
formatLocal(e) {
return `${this._dateFormatter.formatLocal(e)}${this._separator}${this._timeFormatter.formatLocal(e)}`
}
}
},
MrEN: function(e, t, i) {
"use strict";
var s = i("aIyQ"),
r = function(e, t) {
this._server = e, this._session = t, this.seriesCompleted = new s, this.seriesError =
new s
};
r.prototype.onRequestMetadata = function(e, t) {
this._server.receiveLocalResponse({
method: "studies_metadata",
params: [this._session, e, {
errors: [],
hash: "",
metainfo: t,
migrations: []
}]
})
}, r.prototype.onSymbolResolved = function(e, t) {
this._server.receiveLocalResponse({
method: "symbol_resolved",
params: [this._session, e, t]
})
}, r.prototype.onSymbolError = function(e, t) {
this._server.receiveLocalResponse({
method: "symbol_error",
params: [this._session, e, t]
})
}, r.prototype.onStudyError = function(e, t, i) {
this._server.receiveLocalResponse({
method: "study_error",
params: [this._session, e, t, i]
})
}, r.prototype.onSeriesLoading = function(e, t) {
this._server.receiveLocalResponse({
method: "series_loading",
params: [this._session, e, t]
})
}, r.prototype.onSeriesCompleted = function(e, t, i) {
this._server.receiveLocalResponse({
method: "series_completed",
params: [this._session, e, i, t]
}), this.seriesCompleted.fire(e, t)
}, r.prototype.onSeriesError = function(e, t, i) {
this._server.receiveLocalResponse({
method: "series_error",
params: [this._session, e, t, i]
}), this.seriesError.fire(e, t)
}, r.prototype.onStudyCompleted = function(e, t) {
this._server.receiveLocalResponse({
method: "study_completed",
params: [this._session, e, t]
})
}, r.prototype.onStudyLoading = function(e, t) {
this._server.receiveLocalResponse({
method: "study_loading",
params: [this._session, e, t]
})
}, r.prototype.onTickmarksUpdated = function(e, t) {
var i = {
method: "tickmark_update",
params: [this._session, {
index: e,
zoffset: 0,
changes: [],
marks: t,
index_diff: []
}]
};
this._server.receiveLocalResponse(i)
}, r.prototype.onTimescaleUpdate = function(e, t) {
var i = {
method: "timescale_update",
params: [this._session, this._prepareDataUpdateObjects(t), {
index: e.pointsIndex,
zoffset: 0,
changes: e.points,
marks: e.marks,
index_diff: e.indexChange,
baseIndex: e.baseIndex
}]
};
this._server.receiveLocalResponse(i)
}, r.prototype.onTimescaleCompleted = function(e) {
this._server.receiveLocalResponse({
method: "timescale_completed",
params: [this._session, e]
})
}, r.prototype.onSeriesTimeframeUpdate = function(e, t, i, s, r) {
var n = {
method: "series_timeframe",
params: [this._session, e, t, i, s, null, !0, r]
};
this._server.receiveLocalResponse(n)
}, r.prototype.onPointsetDataUpdate = function(e, t, i) {
this.onDataUpdate(e, t, i, null)
}, r.prototype._prepareDataUpdateObjects = function(e) {
var t = {};
return e.forEach((function(e) {
t[e.objId] = {
series: e.data,
turnaround: e.turnaround
}, e.nonSeriesData && (e.nonSeriesData.data ? t[e.objId]
.nonseries = {
d: JSON.stringify(e.nonSeriesData.data),
indexes: e.nonSeriesData.indexes
} : t[e.objId].nonseries = {
d: "",
indexes: []
})
})), t
}, r.prototype.onDataUpdate = function(e, t, i, s) {
var r = {
method: "data_update",
params: [this._session, this._prepareDataUpdateObjects([{
objId: e,
turnaround: t,
data: i,
nonSeriesData: s
}])]
};
this._server.receiveLocalResponse(r)
}, r.prototype.onQuotesData = function(e) {
this._server.receiveLocalResponse({
method: "quote_symbol_data",
params: e
})
}, r.prototype.onDepthData = function(e) {
this._server.receiveLocalResponse({
method: "dd",
params: e
})
}, r.prototype.onDepthUpdate = function(e) {
this._server.receiveLocalResponse({
method: "dpu",
params: e
})
}, r.prototype.onClearData = function(e) {
this._server.receiveLocalResponse({
method: "clear_data",
params: [this._session, e]
})
}, TradingView.ChartapiMessagerInstances = [], e.exports = r
},
"N+BX": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolBezierCubic", (function() {
return n
}));
var s = i("Ocx9"),
r = i("Ss5c");
class n extends r.LineDataSource {
constructor(e, t) {
const s = t || n.createProperties();
super(e, s), this._controlPoints = null, i.e("lt-pane-views").then(i.bind(null,
"a6on")).then(t => {
this._setPaneViews([new t.BezierCubicPaneView(this, e)])
})
}
pointsCount() {
return 2
}
name() {
return "Double Curve"
}
properties() {
return super.properties()
}
setLastPoint(e, t) {
super.setLastPoint(e, t), this._controlPoints = this._calculateControlPoints()
}
addPoint(e, t, i) {
const s = super.addPoint(e, t, i);
if (s) {
const e = this._calculateControlPoints();
this._controlPoints = null, this._points.push(e[0]), this._points.push(e[
1]), i || (this.normalizePoints(), this.createServerPoints()), this
._createPointProperty(2), this._createPointProperty(3)
}
return s
}
restorePoints(e, t, i) {
super.restorePoints(e, t, i), this._createPointProperty(2), this
._createPointProperty(3)
}
controlPoints() {
return this._controlPoints
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolbeziercubic", e);
return n._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "b4fl")).then(
e => e.GeneralBezierDefinitionsViewModel)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e)
}
_calculateControlPoints() {
const e = this.pointToScreenPoint(this.points()[0])[0],
t = this.pointToScreenPoint(this.points()[1])[0],
i = t.subtract(e).scaled(.5).transposed().scaled(.3),
s = e.add(t).scaled(.33),
r = e.add(t).scaled(.67),
n = s.add(i),
o = r.subtract(i);
return [this.screenPointToPoint(n), this.screenPointToPoint(o)]
}
}
},
N1UO: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyApi", (function() {
return v
}));
var s = i("Eyy1"),
r = i("aIyQ"),
n = i.n(r),
o = i("ogJP"),
a = i("9iCb"),
l = i("xo8u"),
c = i("gaBL"),
h = i("HGup"),
u = i("jRfx"),
d = i("/ToI"),
p = i("HZKX"),
_ = i("SwuQ"),
m = i("Yt+L"),
f = i("GD+X"),
g = i("bmVy"),
b = i("pZDF");
class v {
constructor(e, t) {
this._onStudyCompleted = new n.a, this._onStudyError = new n.a, this._study = e,
this._chartWidget = t, this._undoModel = this._chartWidget.model(), this
._model = this._undoModel.model(), this._study.onAboutToBeDestroyed().subscribe(
this, () => {
this._study.onStatusChanged().unsubscribeAll(this), this._study
.onAboutToBeDestroyed().unsubscribeAll(this)
}), this._study.onStatusChanged().subscribe(this, e => {
switch (e.type) {
case g.StudyStatusType.Completed:
this._onStudyCompleted.fire();
break;
case g.StudyStatusType.Error:
this._onStudyError.fire()
}
})
}
isUserEditEnabled() {
return this._study.userEditEnabled()
}
setUserEditEnabled(e) {
this._study.setUserEditEnabled(e)
}
getInputsInfo() {
return Object(b.getStudyInputsInfo)(this._study.metaInfo())
}
getInputValues() {
const e = this._study.inputs({
symbolsForChartApi: !1,
asObject: !0
});
return Object.keys(e).map(t => {
const i = e[t];
return {
id: t,
value: Object(o.isObject)(i) ? i.v : i
}
})
}
setInputValues(e) {
const t = this.getInputValues();
for (const i of e) {
void 0 !== t.find(e => e.id === i.id) ? this._study.properties().inputs[i.id]
.setValue(i.value) : console.warn(`There is no such input: "${i.id}"`)
}
}
mergeUp() {
this._model.isMergeUpAvailableForSource(this._study) && new u.c(this._model, this
._study, "").redo()
}
mergeDown() {
this._model.isMergeDownAvailableForSource(this._study) && new u.a(this._model, this
._study, "").redo()
}
unmergeUp() {
this._model.isUnmergeAvailableForSource(this._study) && new h.c(this._model, this
._study, "").redo()
}
unmergeDown() {
this._model.isUnmergeAvailableForSource(this._study) && new h.a(this._model, this
._study, "").redo()
}
onDataLoaded() {
return this._onStudyCompleted
}
onStudyError() {
return this._onStudyError
}
mergeUpWithUndo() {
this._model.isMergeUpAvailableForSource(this._study) && this._undoModel
.mergeSourceUp(this._study)
}
mergeDownWithUndo() {
this._model.isMergeDownAvailableForSource(this._study) && this._undoModel
.mergeSourceDown(this._study)
}
unmergeUpWithUndo() {
this._model.isUnmergeAvailableForSource(this._study) && this._undoModel
.unmergeSourceUp(this._study)
}
unmergeDownWithUndo() {
this._model.isUnmergeAvailableForSource(this._study) && this._undoModel
.unmergeSourceDown(this._study)
}
priceScale() {
return new f.a(this._undoModel, Object(s.ensureNotNull)(this._study.priceScale()))
}
symbolSource() {
const e = Object(s.ensureNotNull)(this._study.symbolSource());
return {
symbol: e.symbol(),
currencyId: e.currency(),
unitId: e.unit()
}
}
changePriceScale(e) {
const t = Object(s.ensureNotNull)(this._model.paneForSource(this._model
.mainSeries())),
i = Object(s.ensureNotNull)(this._model.paneForSource(this._study));
switch (e) {
case "no-scale":
Object(s.assert)(i.actionNoScaleIsEnabled(this._study),
"Unable to leave a pane without any non-overlay price scale"), new d
.b(this._model, this._study, i, "overlay", "").redo();
break;
case "as-series":
Object(s.assert)(i === t, "Study should be on the main pane"), new d.a(this
._model, this._study, i, this._model.mainSeries().priceScale(), "")
.redo();
break;
case "new-left":
new d.b(this._model, this._study, i, "left", "").redo();
break;
case "new-right":
new d.b(this._model, this._study, i, "right", "").redo();
break;
default:
const r = this._model.dataSourceForId(e);
if (null === r) throw new Error(`There is no study with entityId='${e}'`);
const n = i === this._model.paneForSource(r);
Object(s.assert)(n, "Both studies should be on the same pane");
const o = Object(s.ensureNotNull)(r.priceScale()),
a = Object(c.sourceNewCurrencyOnPinningToPriceScale)(this._study, o,
this._model),
h = Object(_.sourceNewUnitOnPinningToPriceScale)(this._study, o, this
._model);
new d.a(this._model, this._study, i, o, "").redo(), null !== a && new l.a(o,
a, this._undoModel.chartWidget(), "").redo(), null !== h && new m.a(
o, h, this._undoModel.chartWidget(), "").redo()
}
}
isVisible() {
return this._study.properties().visible.value()
}
setVisible(e) {
this._study.properties().visible.setValue(e)
}
bringToFront() {
this._model.bringToFront([this._study])
}
sendToBack() {
this._model.sendToBack([this._study])
}
applyOverrides(e) {
Object(a.applyOverridesToStudy)(this._study, e)
}
dataLength() {
return this._study.status().type !== g.StudyStatusType.Completed ? 0 : this._study
.metaInfo().plots.length > 0 ? this._study.data().size() : this._model
.mainSeries().bars().size()
}
isLoading() {
return this._study.isLoading()
}
async applyToEntireLayout() {
const e = new p.ActionsProvider(this._chartWidget),
t = (await e.contextMenuActionsForSources([this._study])).find(e =>
"applyStudyToEntireLayout" === e.id);
t && t.execute()
}
}
},
N22A: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("eqEH");
const r = {
id: "TradingService"
};
function n() {
return Object(s.hasService)(r) ? Object(s.service)(r) : null
}
},
NJRZ: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineTool5PointsPattern", (function() {
return a
}));
var s = i("Eyy1"),
r = i("Ocx9"),
n = i("Ss5c"),
o = i("j3hX");
class a extends n.LineDataSource {
constructor(e, t) {
super(e, t || a.createProperties()), this._loadPaneViews(e)
}
pointsCount() {
return 5
}
name() {
return "XABCD Pattern"
}
properties() {
return super.properties()
}
static createProperties(e) {
const t = new r.DefaultProperty("linetool5pointspattern", e);
return a._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "/HOw")).then(
e => e.PatternWithBackgroundDefinitionViewModel)
}
_loadPaneViews(e) {
i.e("lt-pane-views").then(i.bind(null, "6MfG")).then(t => {
this._setPaneViews([new t.Pattern5pointsPaneView(this, e)])
})
}
static _configureProperties(e) {
n.LineDataSource._configureProperties(e), e.addChild("linesColors", new o
.LineToolColorsProperty([Object(s.ensureDefined)(e.child("color"))])), e
.addChild("textsColors", new o.LineToolColorsProperty([Object(s
.ensureDefined)(e.child("textcolor"))]))
}
}
},
NSoL: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "clientSnapshot", (function() {
return y
}));
var s = i("aO4+"),
r = i("eJTA"),
n = i("zM7N"),
o = i("Y7w9"),
a = i("ikwP"),
l = i("zDbI"),
c = i("XlJ7"),
h = i("EsvI"),
u = i("Dq3s"),
d = i("Kxc7"),
p = i("4GHa");
const _ = !d.enabled("widget_logo");
function m(e, t = null, i = null) {
let s = {};
if ("number" == typeof e) return {
relativePositions: {
[e]: {
l: t,
t: i
}
},
nextElementLeft: e,
nextElementTop: e
};
const [r, ...n] = e;
if ("v" === r) {
let e = null;
for (const r of n) {
const n = m(r, t, i);
s = {
...s,
...n.relativePositions
}, i = n.nextElementTop, e = n.nextElementLeft
}
t = e
}
if ("h" === r) {
let e = null;
for (const r of n) {
const n = m(r, t, i);
s = {
...s,
...n.relativePositions
}, t = n.nextElementLeft, e = n.nextElementTop
}
i = e
}
return {
relativePositions: s,
nextElementTop: i,
nextElementLeft: t
}
}
const f = function(e) {
const t = {};
for (const i of Object.keys(e)) {
const s = m(e[i]).relativePositions;
t[i] = s
}
return t
}(u);
function g(e, t, i, s) {
return Object(a.drawScaled)(e, s, () => {
e.fillText(i, t.x / s, t.y / s)
}), e.measureText(i).width * s
}
function b(e) {
return e.map(e => ({
...e,
title: ""
}))
}
function v(e, t) {
const i = [{
text: e.trim()
}];
for (const e of t) e.visible && ("" !== i[i.length - 1].text && i.push({
text: " "
}), e.title && i.push({
text: e.title
}), i.push({
text: e.value,
color: e.color
}));
return i
}
class S {
constructor(e, t) {
this._logoTextColor = null, this._snapshotData = e, t = t || {}, this._options = {
backgroundColor: h.themes[e.theme].getThemedColor("color-bg-primary"),
borderColor: h.themes[e.theme].getThemedColor("color-border"),
font: l.CHART_FONT_FAMILY,
fontSize: 12,
legendMode: "vertical",
hideResolution: !1,
header: void 0,
...t
};
const i = f[e.layout],
s = e.charts.map(e => function(e) {
const t = e.panes[0],
i = t.canvas.width + t.leftAxis.canvas.width + t.rightAxis.canvas
.width;
let s = 0;
for (const t of e.panes) s += t.canvas.height;
return void 0 !== e.timeAxis && (s += e.timeAxis.canvas.height), new a
.Size(i, s)
}(e));
if (this._pixelRatio = e.hidpiRatio, this._chartsGeometry = e.charts.map((e, t) =>
function e(t, i, s, r) {
let n = Math.round(10 * r),
o = Math.round(10 * r);
const a = s[t];
if (null !== a.l) {
const t = e(a.l, i, s, r);
n = t.x + t.width + Math.round(5 * r)
}
if (null !== a.t) {
const t = e(a.t, i, s, r);
o = t.y + t.height + Math.round(5 * r)
}
const l = i[t];
return {
x: n,
y: o,
width: l.w,
height: l.h
}
}(t, s, i, this._pixelRatio)), !_) {
let i = e.theme;
void 0 !== t.backgroundColor && (i = "black" === Object(r.rgbToBlackWhiteString)
(Object(r.parseRgb)(t.backgroundColor), 150) ? n.a.Dark : n.a.Light),
this._logoTextColor = h.themes[i].getThemedColor("color-text-primary")
}
this._headerDefaultTextColor = h.themes[e.theme].getThemedColor(
"color-text-primary")
}
async getImage() {
const e = this._pixelRatio;
let t = 0,
i = 0,
r = 0;
if (this._options.header) {
r = Math.ceil(1.4 * this._options.fontSize * e) * this._options.header.length
}
i += r;
let n = 0,
o = 0;
for (const e of this._chartsGeometry) n = Math.max(n, e.x + e.width), o = Math.max(
o, e.y + e.height);
const h = i;
t += n, i += o, t += Math.round(10 * e);
const u = _ ? Math.round(10 * e) : Math.round(35 * e),
d = i;
i += u;
const m = Object(a.createDisconnectedCanvas)(document, new a.Size(t, i), 1),
f = Object(a.getContext2D)(m);
f.font = Object(c.makeFont)(this._options.fontSize, this._options.font), f
.textBaseline = "top", f.fillStyle = this._options.backgroundColor, f.fillRect(
0, 0, t, i), this._options.header && this._drawHeader(f, t, new s.Point(Math
.round(10 * e), Math.round(10 * e)));
for (let e = 0; e < this._snapshotData.charts.length; ++e) {
const t = this._snapshotData.charts[e],
i = this._chartsGeometry[e];
this._drawChart(t, i, f, new s.Point(0, h))
}
if (null !== this._logoTextColor) {
const t = await
function(e, t, i) {
var s;
const r = (new DOMParser).parseFromString(p, "image/svg+xml");
null === (s = null == r ? void 0 : r.firstElementChild) || void 0 === s || s
.setAttribute("color", i);
const n = URL.createObjectURL(new Blob([(new XMLSerializer)
.serializeToString(r)
], {
type: "image/svg+xml"
}));
return new Promise(i => {
const s = new Image;
s.width = e, s.height = t, s.onload = () => {
i({
image: s,
width: e,
height: t
})
}, s.src = n
})
}(Math.round(20 * e), Math.round(15 * e), this._logoTextColor);
f.fillStyle = this._logoTextColor, f.font = Object(c.makeFont)(13, l
.CHART_FONT_FAMILY);
const i = d + Math.round(u / 2 - t.height / 2);
! function(e, t, i, s, r) {
e.save(), e.drawImage(s.image, t, i, s.width, s.height), e.textBaseline =
"bottom";
const n = (t + s.width) / r + 3,
o = (i + s.height) / r;
Object(a.drawScaled)(e, r, () => {
e.fillText("TradingView", n, o)
}), e.restore()
}(f, Math.round(10 * e), i, t, e)
}
return m
}
_drawChart(e, t, i, r) {
i.save(), i.translate(t.x + r.x, t.y + r.y);
let n = 0;
for (const t of e.panes) {
let r = 0;
const o = t.leftAxis.canvas.width + Math.round(8 * this._pixelRatio),
a = n,
l = n + Math.round(10 * this._pixelRatio);
t.leftAxis.contentWidth > 0 && (i.drawImage(t.leftAxis.canvas, r, n),
r += t.leftAxis.canvas.width), i.drawImage(t.canvas, r, n), r += t
.canvas.width, t.rightAxis.contentWidth > 0 && i.drawImage(t.rightAxis
.canvas, r, n), "pane" === t.type && (i.fillStyle = e.colors.text, this
._drawLegend(t, i, new s.Point(o, l), a)), n += t.canvas.height
}
if (void 0 !== e.timeAxis) {
let t = 0;
e.timeAxis.lhsStub.contentWidth > 0 && (i.drawImage(e.timeAxis.lhsStub.canvas,
t, n), t += e.timeAxis.lhsStub.canvas.width), i.drawImage(e.timeAxis
.canvas, t, n), t += e.timeAxis.canvas.width, e.timeAxis.rhsStub
.contentWidth > 0 && i.drawImage(e.timeAxis.rhsStub.canvas, t, n)
}
i.strokeStyle = this._options.borderColor, i.strokeRect(0, 0, t.width, t.height), i
.restore()
}
_drawHeader(e, t, i) {
const {
header: r
} = this._options;
if (!r) return;
e.save(), e.fillStyle = this._headerDefaultTextColor;
const n = Math.ceil(1.4 * this._options.fontSize * this._pixelRatio);
r.forEach((r, o) => {
this._drawLegendLine(e, new s.Point(i.x, i.y + n * o), t, [{
...r,
text: r.text.trim()
}], !0)
}), e.restore()
}
_drawLegend(e, t, i, r) {
let n = !0;
const o = Math.ceil(1.4 * this._options.fontSize * this._pixelRatio);
let a = i.x,
l = i.y;
if (e.mainSeriesText && l + o < r + e.canvas.height) {
const i = this._drawLegendLine(t, new s.Point(a, l), e.contentWidth * this
._pixelRatio, v(e.mainSeriesText, e.mainSeriesValues), !0);
"horizontal" !== this._options.legendMode ? l += o : (a = i + 1.4 * this
._options.fontSize * this._pixelRatio, n = !1)
}
for (let c = 0; c < e.studies.length; ++c)
if (l + o < r + e.canvas.height) {
const r = e.studies[c],
h = e.studiesValues[c];
let u = null;
for (; null === u;) u = this._drawLegendLine(t, new s.Point(a, l), e
.contentWidth * this._pixelRatio, v(r, b(h)), n), "horizontal" !==
this._options.legendMode ? l += o : null === u ? (n = !0, a = i.x, l +=
o) : (a = u + 1.4 * this._options.fontSize * this._pixelRatio, n = !
1)
}
}
_drawLegendLine(e, t, i, r, n) {
const a = r.map(e => e.text).join("");
let l = t.x;
const c = function(e, t, i, s) {
if (e.measureText(t).width * s <= i) return {
text: t,
elided: !1
};
const r = e.measureText("...").width * s,
n = [];
for (let e = 0; e < t.length; ++e) n.push(e);
const a = Object(o.upperbound)(n, i, (n, o) => e.measureText(t.slice(0, o +
1)).width * s + r > i);
return {
text: (t = t.slice(0, a)).trim(),
elided: !0
}
}(e, a, i - l, this._pixelRatio);
if (c.elided && !n) return null;
const h = [];
let u = 0;
for (const e of r) {
if (u + e.text.length > c.text.length) break;
h.push(e.text), u += e.text.length
}
const d = h.join("").trim().length;
u = 0;
for (const i of r) {
if (u + i.text.length > d) break;
i.color && (e.save(), e.fillStyle = i.color), l += g(e, new s.Point(l, t.y), i
.text, this._pixelRatio), i.color && e.restore(), u += i.text.length
}
return c.elided && (l += g(e, new s.Point(l, t.y), "...", this._pixelRatio)), l
}
}
async function y(e, t) {
return new S(e, t).getImage()
}
},
NhkU: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX"),
o = n.LineToolWidthsProperty,
a = n.LineToolColorsProperty;
class l extends s {
constructor(e, t) {
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"l5Au", 7)).then(({
PitchfanLinePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return l.LevelsCount
}
pointsCount() {
return 3
}
name() {
return "Pitchfan"
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "D+Nk")))
.PitchBaseDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetoolpitchfan", e, !1, {
range: [0, 8]
});
return l._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [e.child("median").child("linewidth")], i = [e.child("median").child(
"color")], r = 0; r <= l.LevelsCount; r++) t.push(e.child("level" + r)
.child("linewidth")), i.push(e.child("level" + r).child("color"));
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
}
}
l.LevelsCount = 8, t.LineToolPitchfan = l
},
NsVT: function(e, t, i) {
"use strict";
i.r(t);
var s = i("hY0g"),
r = i.n(s),
n = i("HySD");
function o(e, t) {
let i = 0;
for (const {
min: s,
max: r
} of t) {
if (e < s || r < s) continue;
const t = Math.min(e, r);
if (i = Math.max(i, t), e === i) break
}
return i
}
function a(e) {
const t = [];
if (void 0 === e) return [];
Array.isArray(e) || (e = [e]);
for (const i of e) {
let e, s;
isFinite(i) ? e = s = Number(i) : (e = +i.min, s = +i.max), (e < 0 || isNaN(e)) && (e =
0), isNaN(s) && (s = 1 / 0), e <= s && s > 0 && t.push({
min: e,
max: s
})
}
return t.sort((e, t) => e.min - t.min || e.max - t.max), t
}
function l(e, t) {
if (e.length !== t.length) return !1;
for (let i = e.length; i--;) {
if (e[i].min !== t[i].min) return !1;
if (e[i].max !== t[i].max) return !1
}
return !0
}
var c = i("+GxX"),
h = i("Kxc7");
i.d(t, "ChartPage", (function() {
return d
}));
const u = h.enabled("no_min_chart_width");
class d {
constructor(e) {
this._processVisibility = e => {
const t = e.container.value();
return this._affectsLayout(e.name) ? (t && t.classList.toggle("js-hidden", !
1), !0) : (t && t.classList.toggle("js-hidden", !0), !1)
}, this._setWidth = (e, t) => {
let i = t;
this._fullscreenArea !== e.name && (e.availWidth.setValue(t), e.canNegotiate
.width && (i = o(t, e.negotiations.width)));
const s = e.container.value();
return s && (s.style.width = i + "px"), e.width.setValue(i), i
}, this._setHeight = (e, t) => {
let i = t;
this._fullscreenArea !== e.name && (e.availHeight.setValue(t), e
.canNegotiate.height && (i = o(t, e.negotiations.height)));
const s = e.container.value();
return s && (s.style.height = i + "px"), e.height.setValue(i), i
};
const t = e.container.value();
if (!t) throw new Error("bridge.container.value() must be an element");
this._container = t, this._availableAreas = ["left", "tradingpanel", "right", "top",
"bottom", "center", "topleft", "extratop"
], this._areas = {}, this._bridge = e, this._width = e.width, this._height = e
.height, this._width.subscribe(() => this.recalculate()), this._height
.subscribe(() => this.recalculate()), this._bridge.visible.subscribe(() => this
._updateVisibility()), this._bridge.fullscreen.subscribe(() => this
._onParentFullscreenChange()), this.recalculate()
}
allocate(e) {
const t = e && e.areaName;
if (-1 === this._availableAreas.indexOf(t)) throw new Error(
"unknown options.areaName");
this.free(t);
const i = this._createDOM(t),
s = {
name: t,
canNegotiate: {
width: "left" === t || "right" === t || "tradingpanel" === t ||
"topleft" === t,
height: "top" === t || "bottom" === t || "topleft" === t ||
"extratop" === t
},
negotiations: {
width: [],
height: []
},
remove: () => {
for (const e in this._areas) this._areas[e] === s && this.free(e)
},
negotiateWidth: e => {
if (!s.canNegotiate.width) return;
const t = a(e);
l(s.negotiations.width, t) || (s.negotiations.width = t, this
.recalculate())
},
negotiateHeight: e => {
if (!s.canNegotiate.height) return;
const t = a(e);
l(s.negotiations.height, t) || (s.negotiations.height = t, this
.recalculate())
},
requestFullscreen: () => {
this._fullscreenArea || ("right" !== t && "center" !== t || (this
._fullscreenArea = t), "center" === t && this._bridge
.requestFullscreen(), this._updateFullscreen())
},
exitFullscreen: () => {
t === this._fullscreenArea && (this._fullscreenArea = void 0,
"center" === t && this._bridge.exitFullscreen(), this
._updateFullscreen())
},
width: new r.a,
height: new r.a,
availWidth: new r.a,
availHeight: new r.a,
alive: new r.a(!0),
container: new r.a(i),
visible: new r.a(!0),
fullscreen: new r.a(!0),
rdState: new n.ResizerDetacherState
};
return s.rdState.pushOwner(s), this._areas[t] = s, s.rdState.owner.subscribe(e => {
const i = s.container.value();
if (e !== s) i && (i.innerHTML = "", i.parentElement && i.parentElement
.removeChild(i));
else {
let e = null;
for (let i = this._availableAreas.indexOf(t); i--;) {
const t = this._availableAreas[i];
if (this._affectsLayout(t)) {
e = this._areas[t].container.value();
break
}
}
i && (e && i.parentElement ? i.insertAdjacentElement("afterend",
e) : this._container.appendChild(i))
}
this.recalculate()
}, {
callWithLast: !0
}), s.rdState.bridge()
}
free(e) {
const t = this._areas[e];
if (!t) return;
this._areas[e] = void 0;
const i = t.container.value();
i && i.parentElement && i.parentElement.removeChild(i), t.alive.setValue(!1)
}
recalculate() {
const e = {};
this._recalcSingleRunToken = e;
const t = this._areas.topleft,
i = this._areas.left,
s = this._areas.tradingpanel,
r = this._areas.right,
n = this._areas.top,
o = this._areas.bottom,
a = this._areas.center,
l = this._areas.extratop,
c = this._width.value(),
h = this._height.value();
let d = 0,
p = 0,
_ = 0,
m = 0,
f = 0,
g = 0,
b = 0,
v = 0;
if (e === this._recalcSingleRunToken && l && this._processVisibility(l) && (v = this
._setHeight(l, h), this._setWidth(l, c)), e === this
._recalcSingleRunToken && t && this._processVisibility(t)) {
b = this._setHeight(t, h), g = this._setWidth(t, c), g && (g += 4);
const e = t.container.value();
e && (e.style.top = v + "px")
}
if (e === this._recalcSingleRunToken && i && this._processVisibility(i)) {
const e = i.container.value();
e && (e.style.top = b + v + "px"), this._setHeight(i, h - b - v), _ = this
._setWidth(i, c), _ && (_ += 4)
}
if (e === this._recalcSingleRunToken && s && this._processVisibility(s)) {
this._setHeight(s, h);
let e = c - _;
u || (e -= 300), f = this._setWidth(s, e)
}
if (e === this._recalcSingleRunToken && r && this._processVisibility(r)) {
this._setHeight(r, h - v);
let e = c - _ - f;
u || (e -= 300), m = this._setWidth(r, e);
const t = r.container.value();
t && (t.style.top = v + "px")
}
const S = f + m,
y = S ? 4 : 0;
if (e === this._recalcSingleRunToken && n && this._processVisibility(n)) {
const e = Math.max(g, _),
t = n.container.value();
t && (t.style.left = e + "px", t.style.top = v + "px");
const i = c - e - f - m - y;
this._setWidth(n, i), d = this._setHeight(n, h)
}
let w = 0;
const P = c - _ - f - m - y;
if (e === this._recalcSingleRunToken && o && this._processVisibility(o)) {
const e = o.container.value();
e && (e.style.left = _ + "px", e.classList.toggle("no-border-top-left-radius", !
_), e.classList.toggle("no-border-top-right-radius", !S)), this
._setWidth(o, P);
const t = h - d - v;
w = Math.min(300, t - 0), p = this._setHeight(o, t) + 4
}
if (e === this._recalcSingleRunToken && a && this._processVisibility(a)) {
const e = a.container.value();
e && (e.style.left = _ + "px", e.style.top = d + v + "px", e.classList.toggle(
"no-border-bottom-left-radius", !p || !_), e.classList.toggle(
"no-border-bottom-right-radius", !S || !p)), this._setWidth(a, P);
const t = h - d - p - v;
this._setHeight(a, Math.max(t, w))
}
if (e === this._recalcSingleRunToken && s && this._affectsLayout("tradingpanel")) {
const e = s.container.value();
e && (e.style.right = m + "px", e.style.top = v + "px")
}
e === this._recalcSingleRunToken && this._updateVisibility()
}
_affectsLayout(e) {
const t = this._areas[e];
if (!t) return !1;
if (t.rdState.owner.value() !== t) return !1;
if (this._fullscreenArea && this._fullscreenArea !== e) return p(e);
if (this._width.value() <= 567 || this._height.value() <= 445) {
const t = ["center", "top", "left", "topleft", "extratop"];
if (Object(c.isFeatureEnabled)("mobile_show_bottom_panel") && t.push("bottom"),
!t.includes(e)) return !1
}
return !0
}
_updateVisibility() {
const e = this._bridge.visible.value();
for (let t = 0; t < this._availableAreas.length; t++) {
const i = this._availableAreas[t],
s = this._areas[i];
s && (e && this._affectsLayout(i) ? s.visible.setValue(!0) : s.visible.setValue(
!1))
}
}
_onParentFullscreenChange() {
this._bridge.fullscreen.value() || (this._fullscreenArea = void 0, this
._updateFullscreen())
}
_updateFullscreen() {
const e = void 0 !== this._fullscreenArea;
for (let t = 0; t < this._availableAreas.length; t++) {
const i = this._availableAreas[t],
s = this._areas[i];
if (!s) continue;
if (i === this._fullscreenArea) {
s.fullscreen.setValue(!0);
continue
}
const r = s.container.value();
r && r.classList.toggle("js-hidden", e && !p(i))
}
this._updateVisibility(), this.recalculate()
}
_createDOM(e) {
const t = document.createElement("div");
return t.classList.add("layout__area--" + e), t.style.position = "absolute",
"bottom" === e ? t.style.bottom = "0" : t.style.top = "0", "right" === e ||
"tradingpanel" === e ? t.style.right = "0" : t.style.left = "0", t
}
}
function p(e) {
const t = h.enabled("side_toolbar_in_fullscreen_mode"),
i = h.enabled("header_in_fullscreen_mode");
return "center" === e || "left" === e && t || "top" === e && i
}
},
Nu4p: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
i("YFKU");
const s = {
shape_arrow_down: {
guiName: window.t("Arrow Down"),
id: "shape_arrow_down",
paneRendererClass: "PaneRendererArrowDown",
pineName: "shape.arrowdown",
icon: "arrow_down"
},
shape_arrow_up: {
guiName: window.t("Arrow Up"),
id: "shape_arrow_up",
paneRendererClass: "PaneRendererArrowUp",
pineName: "shape.arrowup",
icon: "arrow_up"
},
shape_circle: {
guiName: window.t("Circle"),
id: "shape_circle",
paneRendererClass: "PaneRendererCircleShape",
pineName: "shape.circle",
icon: "circle"
},
shape_cross: {
guiName: window.t("Cross"),
id: "shape_cross",
paneRendererClass: "PaneRendererCrossShape",
pineName: "shape.cross",
icon: "cross"
},
shape_diamond: {
guiName: window.t("Diamond"),
id: "shape_diamond",
paneRendererClass: "PaneRendererDiamond",
pineName: "shape.diamond",
icon: "diamond"
},
shape_flag: {
guiName: window.t("Flag"),
id: "shape_flag",
paneRendererClass: "PaneRendererFlagShape",
pineName: "shape.flag",
icon: "flag"
},
shape_label_down: {
guiName: window.t("Label Down"),
id: "shape_label_down",
paneRendererClass: "PaneRendererLabelDown",
pineName: "shape.labeldown",
icon: "label_down"
},
shape_label_up: {
guiName: window.t("Label Up"),
id: "shape_label_up",
paneRendererClass: "PaneRendererLabelUp",
pineName: "shape.labelup",
icon: "label_up"
},
shape_square: {
guiName: window.t("Square"),
id: "shape_square",
paneRendererClass: "PaneRendererSquare",
pineName: "shape.square",
icon: "square"
},
shape_triangle_down: {
guiName: window.t("Triangle Down"),
id: "shape_triangle_down",
paneRendererClass: "PaneRendererTriangleApexDown",
pineName: "shape.triangledown",
icon: "triangle_down"
},
shape_triangle_up: {
guiName: window.t("Triangle Up"),
id: "shape_triangle_up",
paneRendererClass: "PaneRendererTriangleApexUp",
pineName: "shape.triangleup",
icon: "triangle_up"
},
shape_xcross: {
guiName: window.t("X Cross"),
id: "shape_xcross",
paneRendererClass: "PaneRendererXCross",
pineName: "shape.xcross",
icon: "x_cross"
}
}
},
"O+9b": function(e, t, i) {
"use strict";
var s = i("ocLq"),
r = i("LxhU");
class n {
constructor(e, t) {
this._minTick = NaN, this._minPrice = NaN, this._maxPrice = NaN, this._low = NaN,
this._high = NaN, this._startPrice = NaN, this._indexLowVbP = NaN, this
._indexHighVbP = NaN, this._rowSize = e, this._type = t
}
init(e, t, i, s, r) {
this._minTick = e, this._minPrice = t, this._maxPrice = i, this._low = s, this
._high = r
}
getStartPrice() {
return this._startPrice
}
setStartPrice(e) {
this._startPrice = e
}
getIndexLowVbP() {
return this._indexLowVbP
}
setIndexLowVbP(e) {
this._indexLowVbP = e
}
getIndexHighVbP() {
return this._indexHighVbP
}
setIndexHighVbP(e) {
this._indexHighVbP = e
}
type() {
return this._type
}
}
class o extends n {
constructor(e) {
super(e, 0)
}
calculate() {
this.setStartPrice(this._minPrice);
const e = this.rowWidth();
let t = Math.floor((this._low - this._minPrice) / e),
i = Math.ceil((this._high - this._minPrice) / e) - 1;
t = Math.max(t, 0), i = Math.max(i, 0), i = Math.min(i, this._rowSize - 1), t = Math
.min(t, i), this.setIndexLowVbP(t), this.setIndexHighVbP(i)
}
rowWidth() {
return Math.max((this._maxPrice - this._minPrice) / this._rowSize, this._minTick)
}
}
class a extends n {
constructor(e) {
super(e, 1)
}
calculate() {
this.setStartPrice(0);
const e = this.rowWidth();
let t = Math.floor(this._low / e);
const i = Math.ceil(this._high / e) - 1;
t = Math.min(t, i), this.setIndexLowVbP(t), this.setIndexHighVbP(i)
}
rowWidth() {
return this._minTick * this._rowSize
}
}
var l = i("Kxc7");
function c() {
return 6e3
}
function h(e) {
switch (e) {
case "Up/Down":
return 2;
case "Total":
return 1;
default:
s.Std.error("Invalid study argument value: " + e)
}
}
i.d(t, "b", (function() {
return c
})), i.d(t, "c", (function() {
return h
})), i.d(t, "a", (function() {
return u
}));
class u {
findBasicResolutionForFromTo(e, t, i, n) {
const o = Object(s.getVolumeProfileResolutionForPeriod)(e.value(), t, i, n),
a = r.Interval.parse(o);
return l.enabled("charting_library_debug_mode") && console.log(
`Selected resolution ${a.value()} for (${e.value()}, ${t}, ${i})`), a
}
verifyRowSizeInput(e, t) {
"Number Of Rows" === t && e > 6e3 && s.Std.error(
'Histogram is too large, please reduce "Row Size" input.')
}
_getRowsLayout(e, t) {
return "Number Of Rows" === e ? new o(t) : new a(t)
}
}
},
OBgQ: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("jCNj");
class r {
constructor(e, t, i) {
this.year = e, this.month = t, this.day = i
}
toString() {
return `${this.year}-${this.month}-${this.day}`
}
compareTo(e) {
return this.year > e.year || this.year === e.year && this.month > e.month || this
.year === e.year && this.month === e.month && this.day > e.day ? 1 : this
.year === e.year && this.month === e.month && this.day === e.day ? 0 : -1
}
before(e) {
return -1 === this.compareTo(e)
}
toCalendar(e) {
return s.get_cal(s.get_timezone("Etc/UTC"), this.year, this.month - 1, this.day)
}
addDays(e) {
const t = this.toCalendar(s.get_timezone("Etc/UTC"));
return s.add_date(t, e), r.fromCalendar(t)
}
static fromCalendar(e) {
return new r(s.get_year(e), s.get_month(e) + 1, s.get_day_of_month(e))
}
}
},
OH2X: function(e, t, i) {
"use strict";
t.LineToolFibRetracement = i("t2ex").LineToolFibRetracement, t.LineToolFibChannel = i("xnA2")
.LineToolFibChannel, t.LineToolFibSpeedResistanceArcs = i("Yjuu")
.LineToolFibSpeedResistanceArcs, t.LineToolProjection = i("68at").LineToolProjection, t
.LineToolTrendBasedFibExtension = i("ZtA1").LineToolTrendBasedFibExtension, t
.LineToolElliott = i("xz+e").LineToolElliott, t.LineToolFibCircles = i("4bfY")
.LineToolFibCircles, t.LineToolVertLine = i("n40Z").LineToolVertLine, t.LineToolCrossLine =
i("MA5A").LineToolCrossLine, t.LineToolBarsPattern = i("2bPF").LineToolBarsPattern, t
.LineToolTrendBasedFibTime = i("yUly").LineToolTrendBasedFibTime, t.LineToolFibTimeZone = i(
"FsE7").LineToolFibTimeZone, t.LineToolCircleLines = i("tG6Q").LineToolCircleLines, t
.LineToolDateRange = i("WkYF").LineToolDateRange, t.LineToolPriceRange = i("RDDl")
.LineToolPriceRange, t.LineToolDateAndPriceRange = i("UCMi").LineToolDateAndPriceRange, t
.LineToolParallelChannel = i("qcGP").LineToolParallelChannel, t.LineToolTrendAngle = i(
"nW7S").LineToolTrendAngle, t.LineToolTrendLine = i("WPQD").LineToolTrendLine, t
.LineToolInfoLine = i("yi8X").LineToolInfoLine, t.LineToolArrowMark = i("TohL")
.LineToolArrowMark, t.LineToolExecution = i("704P").LineToolExecution, t.LineToolPitchfan =
i("NhkU").LineToolPitchfan, t.LineToolGannSquare = i("Z0Sh").LineToolGannSquare, t
.LineToolFibSpeedResistanceFan = i("zZ5f").LineToolFibSpeedResistanceFan, t
.LineToolGannComplex = i("nd9+").LineToolGannComplex, t.LineToolGannFixed = i("TBaH")
.LineToolGannFixed, t.LineToolGannFan = i("4u8j").LineToolGannFan, t.LineToolFibWedge = i(
"9QkW").LineToolFibWedge, t.LineToolPitchfork = i("aDyP").LineToolPitchfork, t
.LineToolDisjointAngle = i("oIoN").LineToolDisjointChannel, t.LineToolFlatBottom = i("InMJ")
.LineToolFlatBottom, t.LineToolIcon = i("icPo").LineToolIcon, t.LineToolRotatedRectangle =
i("Az04").LineToolRotatedRectangle, t.LineToolFibSpiral = i("i80N").LineToolFibSpiral, t
.LineToolHeadAndShoulders = i("aILO").LineToolHeadAndShoulders, t.LineToolTriangle = i(
"isVH").LineToolTriangle, t.LineToolTrianglePattern = i("lNN+").LineToolTrianglePattern,
t.LineTool5PointsPattern = i("NJRZ").LineTool5PointsPattern, t.LineToolThreeDrivers = i(
"PYn8").LineToolThreeDrivers, t.LineToolABCD = i("pKDv").LineToolABCD, t
.LineToolPolyline = i("hP9j").LineToolPolyline, t.LineToolPath = i("YdVo").LineToolPath, t
.LineToolPrediction = i("Wh6B").LineToolPrediction, t.LineToolPriceLabel = i("zqZp")
.LineToolPriceLabel, t.LineToolArrowMarker = i("wiuq").LineToolArrowMarker, t.LineToolNote =
i("gLxC").LineToolNote,
t.LineToolNoteAbsolute = i("gLxC").LineToolNoteAbsolute, t.LineToolSignpost = i("gASG")
.LineToolSignpost, t.LineToolBrush = i("+hLl").LineToolBrush, t.LineToolArc = i("0Pxc")
.LineToolArc, t.LineToolCallout = i("odCa").LineToolCallout, t.LineToolBalloon = i("me8f")
.LineToolBalloon, t.LineToolText = i("V3Oj").LineToolText, t.LineToolHorzLine = i("/DxK")
.LineToolHorzLine, t.LineToolHorzRay = i("CJIV").LineToolHorzRay, t.LineToolRectangle = i(
"7qI1").LineToolRectangle, t.LineToolEllipse = i("V086").LineToolEllipse, t
.LineToolTimeCycles = i("kIXa").LineToolTimeCycles, t.LineToolSineLine = i("bv/X")
.LineToolSineLine, t.LineToolGhostFeed = i("XUCF").LineToolGhostFeed, t
.LineToolBezierQuadro = i("Xyly").LineToolBezierQuadro, t.LineToolBezierCubic = i("N+BX")
.LineToolBezierCubic, t.LineToolArrow = i("QQu0").LineToolArrow, t.LineToolRay = i("5ZUI")
.LineToolRay, t.LineToolExtended = i("CHw2").LineToolExtended, t.LineToolSchiffPitchfork =
i("v5F8").LineToolSchiffPitchfork, t.LineToolSchiffPitchfork2 = i("XFad")
.LineToolSchiffPitchfork2, t.LineToolInsidePitchfork = i("EqoR").LineToolInsidePitchfork, t
.LineToolTextAbsolute = i("V3Oj").LineToolTextAbsolute, t.LineToolArrowMarkLeft = i("TohL")
.LineToolArrowMarkLeft, t.LineToolArrowMarkRight = i("TohL").LineToolArrowMarkRight, t
.LineToolArrowMarkUp = i("TohL").LineToolArrowMarkUp, t.LineToolArrowMarkDown = i("TohL")
.LineToolArrowMarkDown, t.LineToolFlagMark = i("aIha").LineToolFlagMark, t
.LineToolCypherPattern = i("bTqm").LineToolCypherPattern, t.LineToolElliottImpulse = i(
"xz+e").LineToolElliottImpulse, t.LineToolElliottTriangle = i("xz+e")
.LineToolElliottTriangle, t.LineToolElliottTripleCombo = i("xz+e")
.LineToolElliottTripleCombo, t.LineToolElliottCorrection = i("xz+e")
.LineToolElliottCorrection, t.LineToolElliottDoubleCombo = i("xz+e")
.LineToolElliottDoubleCombo, t.LineToolRiskRewardLong = i("tDUI").LineToolRiskRewardLong, t
.LineToolRiskRewardShort = i("tDUI").LineToolRiskRewardShort, t.LineToolPosition = i("ziJ5")
.LineToolPosition, t.LineToolOrder = i("B4/o").LineToolOrder, t.LineToolHighlighter = i(
"SMvR").LineToolHighlighter, t.LineToolPriceNote = i("Zl0W").LineToolPriceNote
},
"OK+B": function(e, t, i) {
"use strict";
var s = i("Eyy1").assert,
r = i("eJTA"),
n = r.rgba,
o = r.rgbaToString,
a = r.parseRgb,
l = (i("vTIA").TradingSourcesHorizontalAlignment, i("cWHH")),
c = i("1Wlv").PriceScale,
h = i("8sOK").StudyStub,
u = i("CW80"),
d = u.createLineTool,
p = u.createLineToolProperties,
_ = u.createStudyLineToolProperties,
m = u.isLineToolName,
f = u.isStudyLineToolName,
g = i("Ss5c").LineDataSource,
b = i("OH2X").LineToolBarsPattern,
v = i("OH2X").LineToolCallout,
S = i("CW80").isLineTool,
y = i("HLXm"),
w = i("GVHu"),
P = w.Study,
C = w.prepareStudyPropertiesForLoadChart,
x = i("3ClC").createStudy,
T = i("qJq3").Series,
I = i("dfhE"),
M = i("n5al"),
O = i("0YCj"),
L = i("Kxc7"),
A = i("txPx").getLogger("Chart.Serialization"),
E = i("OH2X").LineToolParallelChannel,
k = i("OH2X").LineToolTrendAngle,
D = i("OH2X").LineToolGhostFeed,
V = i("OH2X").LineToolElliott,
B = i("7ktv").PriceDataSource,
R = i("iDOr").Pane,
N = i("Tmoa"),
j = i("jofe").createDeferredPromise,
F = i("ApcL").preferencesByWhiteList,
W = (A = i("txPx").getLogger("Chart.Serialization"), i("mPvX").LineToolsGroupModel),
H = i("bmVy").StudyStatusType;
const {
isLineToolState: U,
isMainSeriesState: z,
isStudyState: G
} = i("Vs8b"), {
reorderDataSourcesStateZOrder: q
} = i("2jby");
l.prototype.state = function(e, t, i, s) {
for (var r = {
panes: []
}, n = 0; n < this.panes().length; n++) r.panes.push(this.panes()[n].state(!0, e, !
1, t, i, s));
r.timeScale = this._timeScale.state(e);
var o = null,
a = this.properties(),
l = a.tradingProperties.state();
return r.chartProperties = {
paneProperties: a.paneProperties.state(),
scalesProperties: a.scalesProperties.state(),
publishedChartsTimelineProperties: o ? o.state(e) : void 0,
chartEventsSourceProperties: a.chartEventsSourceProperties.state(),
tradingProperties: l,
priceScaleSelectionStrategyName: a.priceScaleSelectionStrategyName.value()
}, a.chartEventsSourceProperties && (r.chartProperties.chartEventsSourceProperties =
a.chartEventsSourceProperties.state()), s || (r.lineToolsGroups = this
.lineToolsGroupModel().state(t)), r.version = this.version(), r.timezone = this
.timezone(), r.sessions = this.sessions().state(e), r.shouldBeSavedEvenIfHidden =
this._shouldBeSavedEvenIfHidden, r
}, l.prototype.chartPropertiesTransparencyMigrate = function(e) {
var t, i, s;
e.chartProperties.paneProperties.crossHairProperties && (s = e.chartProperties
.paneProperties.crossHairProperties, N.isHexColor(s.color) && (i = s
.transparency / 100, t = a(s.color), s.color = o(n(t, i)))), e
.chartProperties.paneProperties.dataWindowProperties && (s = e.chartProperties
.paneProperties.dataWindowProperties, N.isHexColor(s.color) && (i = s
.transparency / 100, t = a(s.color), s.color = o(n(t, i))))
}, l.prototype.resetDeferredStudies = function() {
new Y(this).reset()
}, l.prototype._getExceedingChildStudies = function(e) {
for (var t = [], i = 0; i < e.length; ++i) t = t.concat(e[i].sources || []);
var s = 0;
for (var r = [], n = {}, o = 0, a = 1e6; t.length && --a;) {
var l = t[o];
(l.ownerSource && n[l.ownerSource] || !l.ownerSource) && (n[l.id] = l, t.splice(t
.indexOf(l), 1), l.ownerSource && "Study" === l.type && l.state && l.state
.isChildStudy && ++s > 1 && r.push(l)), o = (o + 1) % t.length
}
return r
}, l.prototype.restoreState = function(e, t, i) {
new Y(this).reset();
var s = {};
if (!e.panes) return void A.logDebug("ChartModel.restoreState: invalid state");
if (!Array.isArray(e.panes)) return void A.logDebug(
"ChartModel.restoreState: invalid state");
if (e.panes.length < 1) return void A.logDebug(
"ChartModel.restoreState: invalid state");
if (this._shouldBeSavedEvenIfHidden = void 0 === e.shouldBeSavedEvenIfHidden || e
.shouldBeSavedEvenIfHidden, e.chartProperties && !e.chartProperties.timezone && (e
.chartProperties.timezone = e.timezone), e.chartProperties) {
var r = TradingView.factoryDefaults("chartproperties").scalesProperties;
if (TradingView.merge(r, e.chartProperties.scalesProperties), !("showLastValue" in
r) || "showSeriesLastValue" in r || "showStudyLastValue" in r || (r
.showSeriesLastValueProperty = r.showLastValue, r
.showStudyLastValueProperty = r.showLastValue), "showSeriesLastValue" in
r && (s.showSeriesLastValueProperty = !0), "showStudyLastValue" in r && (s
.showStudyLastValueProperty = !0), e.chartProperties.paneProperties
.vertGridProperties = e.chartProperties.paneProperties.vertGridProperties ||
TradingView.clone(e.chartProperties.paneProperties.gridProperties),
e.chartProperties.paneProperties.horzGridProperties = e.chartProperties
.paneProperties.horzGridProperties || TradingView.clone(e.chartProperties
.paneProperties.gridProperties), "backgroundType" in e.chartProperties
.paneProperties || (e.chartProperties.paneProperties.backgroundType = "solid"),
this._properties.paneProperties.mergeAndFire(e.chartProperties.paneProperties),
this._properties.scalesProperties.mergeAndFire(r), e.chartProperties.timezone &&
this._properties.timezone.setValue(e.chartProperties.timezone), e
.chartProperties.chartEventsSourceProperties && this._properties
.chartEventsSourceProperties && this._properties.chartEventsSourceProperties
.mergeAndFire(e.chartProperties.chartEventsSourceProperties), e.chartProperties
.tradingProperties && this._properties.tradingProperties) {
e.chartProperties.tradingProperties.lineLength;
0, this._properties.tradingProperties.mergeAndFire(e.chartProperties
.tradingProperties)
}
this._timeScale.restoreState(e.timeScale, t), this._updateDateTimeFormatter()
}
if (e.timeScale && this._timeScale.restoreState(e.timeScale, t), !this.readOnly()) {
var n = this._getExceedingChildStudies(e.panes);
if (n.length) {
for (var o = e.panes.length - 1; o >= 0; --o) {
for (var a = (d = e.panes[o]).sources.length - 1; a >= 0; --a) {
var l = d.sources[a];
~n.indexOf(l) && d.sources.splice(a, 1)
}
d.sources.length || e.panes.splice(o, 1)
}
0
}
}
const c = e.version || 0;
var h = e.panes;
this.panes()[0].restoreState(h[0], t, c, s, i, !0);
var u = 1;
for (o = 1; o < e.panes.length; o++) {
var d, p = e.panes[o];
if (0 !== p.sources.length)(d = this.panes()[u] || this.createPane()).restoreState(
p, t, c, s, i, !0), d.mainDataSource() ? u += 1 : this.removePane(d);
else A.logWarn("Empty pane detected - restoring is skipped. idx=" + o + ", state=" +
JSON.stringify(p))
}
this._invalidateBarColorerCaches();
var _ = this.dataSources(),
m = 0;
for (o = 0; o < _.length; o++) {
var f = _[o];
TradingView.isInherited(f.constructor, g) && (m++, f.calcIsActualSymbol())
}
this.updateTimeScaleBaseIndex(), this.recalculateAllPanes(), this.fullUpdate(), this
.syncESD();
var b = TVLocalStorage.getItem("linetools_limit") || 1e3;
return window.is_authenticated && window.user && window.user.settings && (b = window
.user.settings.linetools_limit || b), e.sessions && this.sessions()
.restoreState(e.sessions, t), e.lineToolsGroups && (this._lineToolsGroupModel = W
.fromState(this, e.lineToolsGroups)), m > b && m % 100 == 0 ? {
lines_limit_exceeded: !0,
line_tools_count: m
} : (this.panes().forEach(function(e) {
this._dataSourceCollectionChanged.fire(e)
}.bind(this)), this._lineToolsGroupModel.fireChangedAll(), {})
}, R.prototype.state = function(e, t, i, s, r, n) {
var o = {},
a = new Map;
function l(e) {
if (a.has(e)) return a.get(e);
var o = null,
l = i && !e.isSavedInStudyTemplates() || !e.state || S(e) && n || !(o = e.state(
t, r)) || !e.isSavedInChart(t) || s && e.isActualSymbol && !e
.isActualSymbol() || e.isPhantom() ? null : o;
return a.set(e, l), l
}
if (e) {
o.sources = [];
for (var c = 0; c < this.m_dataSources.length; c++) {
var h = l(this.m_dataSources[c]);
null !== h && o.sources.push(h)
}
}
function u(e) {
return null !== a.get(e)
}
function d(e) {
return !n || !S(e)
}
o.leftAxisesState = this._leftPriceScales.map((function(e) {
var t = {};
return t.state = e.state(), t.sources = e.dataSources().filter(u)
.filter(d).map((function(e) {
return e.id()
})), t
})), o.rightAxisesState = this._rightPriceScales.map((function(e) {
var t = {};
return t.state = e.state(), t.sources = e.dataSources().filter(u)
.filter(d).map((function(e) {
return e.id()
})), t
})), o.overlayPriceScales = {};
for (c = 0; c < this.m_dataSources.length; c++) {
var p = this.m_dataSources[c];
if (this.isOverlay(p) && p.isSavedInChart(t)) {
var _ = p.priceScale();
o.overlayPriceScales[p.id()] = _ ? _.state() : null
}
}
return o.stretchFactor = this._stretchFactor, this.m_mainDataSource && (o.mainSourceId =
this.m_mainDataSource.id()), o.priceScaleRatio = this._currentPriceScaleRatio, o
}, R.prototype.sourceById = function(e) {
for (var t = 0; t < this.m_dataSources.length; t++)
if (this.m_dataSources[t].id() === e) return this.m_dataSources[t];
return null
}, R.prototype.isESDStudy = function(e) {
return "Script$TV_EARNINGS@tv-scripting" === e.id ||
"Script$TV_DIVIDENDS@tv-scripting" === e.id || "Script$TV_SPLITS@tv-scripting" === e
.id || "ESD$TV_EARNINGS@tv-scripting" === e.id ||
"ESD$TV_DIVIDENDS@tv-scripting" === e.id || "ESD$TV_SPLITS@tv-scripting" === e.id ||
"Earnings@tv-basicstudies" === e.id || "Dividends@tv-basicstudies" === e.id ||
"Splits@tv-basicstudies" === e.id
}, R.prototype.isStudyToSkip = function(e) {
return !!this.isESDStudy(e)
}, R.prototype.restoreState = function(e, t, i, s, r, n) {
s = s || {}, e.stretchFactor && (this._stretchFactor = e.stretchFactor);
var o = {};
if (e.sources) {
var a = e.sources.filter((function(e) {
return !!e && ("MainSeries" === e.type || (!e.points || !e.points
.some((function(e) {
return null === e.time_t || !isFinite(e
.time_t)
})) || (A.logNormal("Dropped invalid " + e.type +
". Reason: non-numeric point time"), !1)))
}), this);
const c = a.findIndex(z); - 1 !== c && this.model().mainSeries().setObsoleteZOrder(
a[c].zorder), i < 3 && q(a);
var l = -1 !== this.m_dataSources.indexOf(this._model.mainSeries());
this.clearSeries(n), this.m_mainDataSource = null, l && this
._addSourceToCollections(this._model.mainSeries(), n),
function() {
var t = a.find((function(t) {
return t.id === e.mainSourceId
}));
if (void 0 !== t)
if (TradingView[t.type] && m(t.type)) {
for (var i = null, s = 0; s < a.length; s++) {
var r = a[s];
if (!TradingView[t.type] || !m(r.type)) {
if (null !== i) return void A.logWarn(
"Pane contains more than 1 possibly main sources - auto fix cannot be applied"
);
i = r
}
}
if (null !== i) {
var n = e.mainSourceId,
o = 0;
e.mainSourceId = i.id, a.forEach((function(e) {
e.ownerSource === n && (e.ownerSource = i.id,
o += 1)
})), A.logNormal(
"Auto fix broken pane is applied, changed line tools=" +
o + ", changed from=" + n + " to=" + i.id)
} else A.logWarn(
"Pane contains only line tools - possible we need to remove this pane?"
)
} else A.logNormal(
"The type of main source is not line tool - fix is unnecessary");
else A.logWarn("There is no main source with id " + e.mainSourceId +
", total sources=" + a.length)
}();
for (var h = 0; h < a.length; h++) {
if ("study_Sessions" === (u = a[h]).type) {
this.model().sessions().restoreOldState(u, t);
break
}
}
for (h = 0; h < a.length; h++) {
var u;
if ("study_Sessions" !== (u = a[h]).type) {
var d = u.id;
null === this._model.dataSourceForId(u.id) || "MainSeries" === u.type ? (o[
d] = u.ownerSource, z(u) ? this._restoreMainSeries(u, t, l, s,
r, n) : G(u) ? this.restoreStudy(u, t, s, n) : U(u) ? (u
.state && (u.state.zOrderVersion = 2),
this.restoreLineTool(u, t, void 0, n)) : TradingView[u.type] &&
TradingView[u.type].createFromState && this._restoreSpecialSource(u,
t, n)) : A.logError("Duplicate id while restoring pane: " + u
.type + "," + u.id)
}
}
}
var p, _, f = new Set,
b = this;
function v(e) {
var t = defaults("chartproperties").paneProperties.axisProperties,
i = new c(b.model().properties().scalesProperties, t);
return i.restoreState(e.state), e.sources.forEach((function(e) {
var s = b.dataSourceForId(e);
s && function e(t, i, s) {
f.has(t) || (f.add(t), void 0 !== s.m_showSymbolLabels &&
t instanceof T && b.model().properties()
.scalesProperties.showSymbolLabels.setValue(s
.m_showSymbolLabels), L(t, i), b._model
.children(t, !0).forEach((function(t) {
e(t, i, s)
})))
}(s, i, t)
})), 0 === i.dataSources().length ? null : i
}
if (e.leftAxisesState) p = e.leftAxisesState.map(v).filter((function(e) {
return null !== e
}));
else {
var S = v({
state: e.leftAxisState,
sources: e.leftAxisSources
});
p = null !== S ? [S] : []
}
if (this._leftPriceScales.slice().forEach(function(e) {
this.removePriceScale(e)
}.bind(this)), this._leftPriceScales = [], p.forEach((function(e) {
b._placePriceScale(e, "left")
})), e.rightAxisesState) _ = e.rightAxisesState.map(v).filter((function(e) {
return null !== e
}));
else {
var y = v({
state: e.rightAxisState,
sources: e.rightAxisSources
});
_ = null !== y ? [y] : []
}
this._rightPriceScales.forEach(function(e) {
this.removePriceScale(e)
}.bind(this)), this._rightPriceScales = [], _.forEach((function(e) {
b._placePriceScale(e, "right")
})), this._currentPriceScaleRatio = e.priceScaleRatio || e.leftPriceScaleRatio || e
.rightPriceScaleRatio || null;
var w = new Map;
for (h = 0; h < this.m_dataSources.length; h++) {
var C = this.m_dataSources[h];
if (!f.has(C)) {
var x;
if (e.overlayPriceScales && e.overlayPriceScales[C.id()]) {
var I = e.overlayPriceScales[C.id()];
w.has(I.id) ? x = w.get(I.id) : ((x = new c(this._model.properties()
.scalesProperties)).setHeight(this.m_height), I
.m_isAutoScale = !0, I.m_isLog = !1, I.m_isPercentage = !1, I
.m_isLockScale = !1, x.restoreState(I), w.set(I.id, x))
} else(x = new c(this._model.properties().scalesProperties)).setHeight(this
.m_height);
L(C, x)
}
}
for (var d in o) {
var M = o[d];
if (M)(C = this.dataSourceForId(d)) && this.dataSourceForId(d).setOwnerSource(this
.dataSourceForId(M))
}
if (e.mainSourceId && !this.containsMainSeries() && (this.m_mainDataSource = this
.dataSourceForId(e.mainSourceId)), !this.m_mainDataSource)
for (h = 0; h < this.m_dataSources.length; h++) {
C = this.m_dataSources[h];
if (TradingView.isInherited(C.constructor, B)) {
this.m_mainDataSource = C;
break
}
}
for (h = 0; h < this.m_dataSources.length; h++) {
C = this.m_dataSources[h];
if (TradingView.isInherited(C.constructor, g)) C.ownerSource() || C.setOwnerSource(
this.mainDataSource()), C.isFixed() && C.restoreFixedPoints();
else if (TradingView.isInherited(C.constructor, P)) {
var O = C.properties();
O.linkedToSeries && O.linkedToSeries.value() && (C.ownerSource() || C
.setOwnerSource(this.model().mainSeries()))
}
}
function L(e, t) {
b.removeSourceFromPriceScale(e), e.setPriceScale(t), t.addDataSource(e)
}
this._updateMargins(), this._cachedOrderedSources.clear()
}, R.prototype._restoreMainSeries = function(e, t, i, s, r, n) {
var o = e.id,
a = e.state;
if (a && r && (a.style = r.style || a.style, a.interval = r.interval || a.interval,
a.symbol = r.symbol || a.symbol, r.symbol && delete a.currencyId), a && (a
.style, I.STYLE_HILO), a && ["candleStyle", "hollowCandleStyle", "haStyle"]
.forEach((function(e) {
a[e] && (a[e].wickUpColor = a[e].wickUpColor || a[e].wickColor, a[e]
.wickDownColor = a[e].wickDownColor || a[e].wickColor)
})), a && (a.statusViewStyle = a.statusViewStyle || {}, !a.statusViewStyle
.symbolTextSource)) {
var l = !!a.statusViewStyle.showSymbolAsDescription;
a.statusViewStyle.symbolTextSource = l ? "ticker" : "description"
}
if (a && (a.extendedHours ? a.sessionId = "extended" : a.sessionId || (a.sessionId =
"regular"), delete a.extendedHours), !i) {
var c = this._model.mainSeries();
this._model.paneForSource(c).removeDataSource(c, !1, n), this
._addSourceToCollections(c, n)
}
const h = this.model().mainSeries(),
u = h.properties();
if (this.m_mainDataSource = h, (g = a && a.style ? a.style : void 0) === T.STYLE_PNF &&
"ATR" === u.pnfStyle.inputs.style.value() ? u.pnfStyle.inputs.style._value =
"Traditional" : g === T.STYLE_RENKO && "ATR" === u.renkoStyle.inputs.style
.value() && (u.renkoStyle.inputs.style._value = "Traditional"), a && !a
.hasOwnProperty(
"showSessions") && (a.showSessions = !1), a && t && (a.showCountdown = !1), a &&
(t && !("showSeriesLastValueProperty" in s) && "showLastValue" in a && this._model
.properties().scalesProperties.showSeriesLastValue.setValue(a.showLastValue),
delete a.showLastValue), a)
for (var d = {
haStyle: M.chartStyleStudyId(T.STYLE_HEIKEN_ASHI, !0),
renkoStyle: M.chartStyleStudyId(T.STYLE_RENKO, !0),
pbStyle: M.chartStyleStudyId(T.STYLE_PB, !0),
kagiStyle: M.chartStyleStudyId(T.STYLE_KAGI, !0),
pnfStyle: M.chartStyleStudyId(T.STYLE_PNF, !0),
rangeStyle: M.chartStyleStudyId(T.STYLE_RANGE, !0)
}, p = this._model.studyVersioning(), _ = h.styleStudyInfos(), m = Object
.keys(I.SYMBOL_STRING_DATA), f = 0; f < m.length; f++) {
var g = m[f],
b = I.STYLE_SHORT_NAMES[g] + "Style",
v = b in e ? e[b].studyId : d[b];
if (null != (g = a[b])) {
var S = g.inputs,
y = O.parseIdString(v),
w = _[b].studyId,
P = O.parseIdString(w),
C = p.updateStudyInputs(y.id, y.version, P.version, S, null);
g.inputs = C
}
}
const x = h.sessionId();
h.restoreState(e, t), this.changeSourceId(h, o), h.sessionId() !== x && u.sessionId
.listeners().fire(u.sessionId)
}, R.prototype.restoreStudy = function(e, t, i, s) {
if (t && void 0 === e.data && void 0 === e.nonSeriesData && void 0 === e.indexes) A
.logError("Cannot restore (skipping) study without data " + e.id + ", " + e.metaInfo
.id);
else {
var r = e.id,
n = e.state,
o = e.zorder,
a = e.ownerSource,
l = TradingView.clone(e.metaInfo);
if (Object.assign(l, O.parseIdString(l.id)), !this.isStudyToSkip(l) || t) {
var c = n,
u = this._model.studyVersioning(),
d = u.patchPropsStateAndMetaInfo(c, l, {
oldShowStudyLastValueProperty: t && !i.showStudyLastValueProperty
});
c = d.propsState, l = d.metaInfo;
var p = new h(this._model, e, l.shortDescription);
p.setId(r), p.setZorder(o);
var _ = this;
if (t) f(null);
else {
var m = u.updateMetaInfoAsync(l);
m.sync ? f(m.result) : m.result.then((function(e) {
f(e)
})).catch((function(e) {
p.setFailed("error: " + e)
}))
}
return p && (p.setZorder(o), this._addSourceToCollections(p, s), this
._processMainSourceChange()), this._cachedOrderedSources.clear(), p
}
A.logNormal("Skipping study " + l.id)
}
function f(i) {
p.setStatus({
type: H.Undefined
});
var s = i || new O(l),
n = new Y(_._model);
function o(o) {
var a = C(l, i, c, null, u, o),
h = x(_._model, a, o || _._model.mainSeries(), s);
if (h.setId(r), h.setOwnFirstValue(void 0 === e.ownFirstValue ? null : e
.ownFirstValue), t) {
var d = u.patchStudyData(l, e.data, e.nonSeriesData, e.indexes);
h.restoreData(d.data, d.nsData, d.indexes)
}
_._model.replaceStudyStub(p, h) || (p = h), n.add(r, h)
}
a && e.state.isChildStudy ? n.get(a).then(o) : o()
}
}, R.prototype.restoreLineTool = function(e, t, i, r) {
delete e.state.lastUpdateTime, i = void 0 === i || i, V.migrateState(e), y.migrateState(
e);
var n = e.type,
o = e.id,
a = e.state,
l = i ? e.zorder : this.newLineToolZOrder();
s(m(n), "invalid data source type:" + n + " (expected to be a Line Tool)");
var c, h, u = null;
if (f(n)) {
var g = (e = (u = this._model.studyVersioning()).patchPointsBasedStudyState(e))
.metaInfo;
Object.assign(g, O.parseIdString(g.fullId));
var S = u.updateMetaInfo(g) || g;
h = _(n, g, S, a, u), t ? h.merge({
fixedSize: !1
}) : h.merge({
fixedSize: !0
}), c = d(n, this._model, h, S, !0)
} else h = p(n, a), t ? h.merge({
fixedSize: !1
}) : h.merge({
fixedSize: !0
}), c = d(n, this._model, h, null, !0);
c.setId(o), c.linkKey().setValue(e.linkKey || null);
var w = e.alertId;
w && c.canHasAlert() && "function" == typeof c.setAlert && L.enabled("alerts") && !this
._model.readOnly() && !this._model.isJustClonedChart() && c.setAlert(w, {
noChartSave: !0
});
var P = e.indexes ? e.indexes : [];
if (P = P.slice(0, e.points.length), c.isFixed() ? c.restorePositionPercents(e
.positionPercents) : c.restorePoints(e.points, P, t), c instanceof b ||
c instanceof v || c instanceof k || c instanceof D || c instanceof E ||
c instanceof E) c.restoreData(e);
else if (t && c.restoreData) {
var C = e;
u && (C.graphics = u.patchPointsBasedStudyData(C.metaInfo, C.graphics)), c
.restoreData(C)
}
var x = null == e.version ? 1 : e.version,
T = null == c.version ? 1 : c.version;
return x !== T && "function" == typeof c.migrateVersion && c.migrateVersion(x, T, {
pane: this,
model: this._model,
properties: h
}), void 0 !== l && c.setZorder(l), this._addSourceToCollections(c, r), this
._cachedOrderedSources.clear(), c
}, R.prototype._restoreSpecialSource = function(e, t, i) {
var s = TradingView[e.type];
if (s && s.createFromState) {
var r = s.createFromState(e, t, this._model);
r && (r.setId(e.id), this._addSourceToCollections(r, i), r.zorder && r.setZorder(r
.zorder))
}
}, l.prototype.restoreTheme = function(e, t, i) {
var s = {
hollowCandle: {
related: "candle"
}
};
for (var r in s)
if (!e.mainSourceProperties[r + "Style"]) {
var n = e.mainSourceProperties[s[r].related + "Style"];
e.mainSourceProperties[r + "Style"] = TradingView.clone(n)
} this._undoModel.chartLoadTheme(this, e, t, i)
}, l.prototype.preferences = function() {
return F(this, this.mainSeries())
};
var Y = function() {
var e = [],
t = [];
function i(s) {
var r = e.indexOf(s);
return ~r ? t[r] : this instanceof i ? (this._source = s, this._studies = {}, this
._deferreds = {}, e.push(s), void t.push(this)) : new i(s)
}
return i.prototype.add = function(e, t) {
this._deferreds[e] && (this._deferreds[e].resolve(t), delete this._deferreds[
e]), this._studies[e] = t
}, i.prototype.get = function(e) {
return this._studies[e] ? Promise.resolve(this._studies[e]) : (this._deferreds[
e] || (this._deferreds[e] = j()), this._deferreds[e].promise)
}, i.prototype.reset = function() {
var i = e.indexOf(this._source);
~i && (e.splice(i, 1), t.splice(i, 1))
}, i
}();
e.exports = l
},
OLhd: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "createDwmAligner", (function() {
return c
})), i.d(t, "isAlignmentEnabled", (function() {
return h
})), i.d(t, "createTimeToBarTimeAligner", (function() {
return u
}));
var s = i("jCNj"),
r = i("Kxc7"),
n = i("LxhU"),
o = i("ZmuQ"),
a = i("IiTo");
const l = new o.b("Etc/UTC", "0000-0000:1234567");
function c(e, t) {
if (!h() || !n.Interval.isDWM(e)) return null;
const i = new o.b(t.timezone, t.session, t.session_holidays, t.corrections),
r = Object(a.newBarBuilder)(e, i, l);
return {
timeToSessionStart: e => r.tradingDayToSessionStart(e),
timeToExchangeTradingDay: e => {
const t = s.utc_to_cal(i.timezone, e),
r = i.spec.correctTradingDay(t);
return s.set_hms(r, 0, 0, 0, 0, s.get_timezone("Etc/UTC")), r.getTime()
}
}
}
function h() {
return !r.enabled("disable_resolution_rebuild")
}
function u(e, t) {
if (!h()) return e => e;
const i = new o.b(t.timezone, t.session, t.session_holidays, t.corrections),
s = Object(a.newBarBuilder)(e, i, i, !1);
return e => s.alignTimeIfPossible(e)
}
},
Ocx9: function(e, t, i) {
"use strict";
(function(e) {
var s = i("wZIs"),
r = i("tc+8");
function n(e, t, i, r) {
var n = e ? s.defaults : s.factoryDefaults,
a = t.startsWith("study_") ? TradingView.clone(n("study")) : {},
l = TradingView.clone(n(t, r));
return t.startsWith("study_") && l.inputs && delete l.inputs.symbol,
"linetoolicon" === t && e && (l.icon = s.defaults(t).icon), l = o(l, i),
TradingView.merge(a, l), a
}
function o(e, t) {
var i = {};
for (var s in e) t.indexOf(s) < 0 && (i[s] = e[s]);
return i
}
function a(t, i, s, o) {
var l;
void 0 === o && (o = !0), this._defaultName = t, s ? l = i : (l = n(o, t, [], null),
i && TradingView.merge(l, i)), r.call(this, l), this._defaultName = t, this
._useUserPreferences = o, this.listeners().subscribe(this, a.prototype
.onPropertyChanged), this._exclusions = [], this
._restoreFactoryDefaultsEvent = new e
}
inherit(a, r), a._saveDefaults = !1, a.prototype.preferences = function() {
return this.state(this._exclusions)
}, a.prototype.mergePreferences = function(e) {
this.mergeAndFire(o(e, this._exclusions))
}, a.prototype.addExclusion = function(e) {
this._exclusions.indexOf(e) < 0 && this._exclusions.push(e)
}, a.prototype.restoreFactoryDefaults = function() {
var e = n(!1, this._defaultName, this._exclusions, null);
this.mergeAndFire(e), this._defaultName.startsWith("study_") && !this
._defaultName.startsWith("study_VbPFixed") || this.saveDefaults(), this
._restoreFactoryDefaultsEvent.fire()
}, a.prototype.onRestoreFactoryDefaults = function() {
return this._restoreFactoryDefaultsEvent
}, a.prototype.onPropertyChanged = function() {
!a._saveDefaults || this._defaultName.startsWith("study_") && !this._defaultName
.startsWith("study_VbPFixed") || this.saveDefaults()
}, a.prototype.saveDefaults = function() {
this._useUserPreferences && s.saveDefaults(this._defaultName, this
.preferences())
}, a.prototype.clone = function(e) {
for (var t = new a(this._defaultName, this.state(), e && e.replaceByState, this
._useUserPreferences), i = 0; i < this._exclusions.length; ++i) t
.addExclusion(this._exclusions[i]);
return t
}, t.DefaultProperty = a, t.saveDefaultProperties = function(e) {
a._saveDefaults = e
}
}).call(this, i("aIyQ"))
},
OiSa: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "isDrawingToolbarVisible", (function() {
return c
}));
var s = i("Vdly"),
r = i("Kxc7"),
n = i("hY0g"),
o = i.n(n);
const a = !r.enabled("hide_left_toolbar_by_default"),
l = s.getBool("ChartDrawingToolbarWidget.visible", a),
c = new o.a(l)
},
OsWk: function(e, t) {
e.exports =
''
},
OwDf: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PivotPointsStandardLastPricesView", (function() {
return o
}));
var s = i("k9/m");
const r = ["p", "s1", "r1", "s2", "r2", "s3", "r3", "s4", "r4", "s5", "r5"],
n = {
P: "P",
S1: "S1/R1",
S2: "S2/R2",
S3: "S3/R3",
S4: "S4/R4",
S5: "S5/R5",
R1: "S1/R1",
R2: "S2/R2",
R3: "S3/R3",
R4: "S4/R4",
R5: "S5/R5"
};
class o {
constructor(e) {
this._visiblePivots = new Set, this._invidated = !0, this._prices = [], this
._source = e
}
visiblePivots() {
return this._visiblePivots
}
update() {
this._invidated = !0
}
prices() {
return this._invidated && (this._updateImpl(), this._invidated = !1), this._prices
}
_updateImpl() {
this._visiblePivots.clear();
const e = this._source.model(),
t = this._source.priceScale();
if (null === t) return;
if (e.timeScale().isEmpty() || t.isEmpty()) return;
const i = e.timeScale().visibleBarsStrictRange();
if (null === i) return;
if (!this._source.customData() || !this._source.customData().pivots) return;
const o = e.mainSeries().bars().search(i.lastBar(), s.PlotRowSearchMode
.NearestLeft);
if (null === o) return;
const a = o.index,
l = this._source.customData().pivots,
c = this._source.indexes(),
h = this._source.properties(),
u = this._source.firstValue();
for (let e = 0; e < l.length; e++) {
if (!l[e]) continue;
const i = c[l[e].startIndex],
s = c[l[e].endIndex],
o = h.inputs.showHistoricalPivots.value();
if (i <= a && (s >= a || o)) {
this._visiblePivots.add(l[e]), this._prices = [];
for (let i = 0; i < r.length; i++) {
const s = r[i],
o = l[e][s];
if (void 0 === o || null === u) continue;
const a = t.priceToCoordinate(o, u),
c = s.toUpperCase(),
d = n[c],
p = h.levelsStyle.colors[d].value();
this._prices.push({
formatted: t.formatPrice(o, u),
price: o,
coordinate: a,
color: p
})
}
}
}
}
}
},
Owlf: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
const s = "large"
},
Oy0l: function(e, t, i) {},
PAcw: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "GridRenderer", (function() {
return n
}));
var s = i("jFln"),
r = i("gAom");
class n {
constructor() {
this._data = null
}
setData(e) {
this._data = e
}
draw(e, t) {
if (null === this._data) return;
const i = t.pixelRatio,
n = Math.max(1, Math.floor(i));
e.lineWidth = n;
const o = Math.ceil(this._data.h * i),
a = Math.ceil(this._data.w * i);
if (e.save(), e.lineCap = "butt", this._data.vertLinesVisible) {
e.strokeStyle = this._data.vertLinesColor, Object(s.setLineStyle)(e, this._data
.vertLineStyle);
for (const t of this._data.timeMarks) {
const s = Math.round(t.coord * i);
Object(r.drawVerticalLine)(e, s, 0, o)
}
}
if (this._data.horzLinesVisible) {
e.strokeStyle = this._data.horzLinesColor, Object(s.setLineStyle)(e, this._data
.horzLineStyle);
for (const t of this._data.priceMarks) {
const s = Math.round(t.coord * i);
Object(r.drawHorizontalLine)(e, s, 0, a)
}
}
e.restore()
}
hitTest(e) {
return null
}
}
},
PL0c: function(e, t, i) {
"use strict";
(function(e) {
var s = i("aO4+").Point,
r = i("2kV1").StudyStatusView,
n = i("it7y").StudyDataWindowView,
o = i("Qq0B").NonSeriesStudy,
a = i("UHyS").StandardPivotPointsPriceAxisView,
l = i("KtbP").PanePriceAxisView,
c = i("VdBB").HitTestResult,
h = i("Zy3/").CompositeRenderer,
u = i("c44N").areEqualPaneRenderParams,
d = i("2EnG").StandardPivotPointsImageCache,
p = i("OwDf").PivotPointsStandardLastPricesView,
_ = i("Fdrt").PaneRendererStandardPivotLabel,
m = i("l4sv").HorizontalLineRenderer;
class f {
constructor(e, t) {
this._model = e, this._source = t, this._pivots = [], this._textCache = {}
}
setCache(e) {
this._cache = e
}
priceAxisViews(e, t) {
return this._priceAxisViews
}
mergeLabel(e, t, i) {
var s = "" + t;
void 0 === e[s] ? (e[s] = {}, e[s].text = i, e[s].ids = [this.complete(
i)]) : (e[s].text += "/" + i, e[s].ids.push(this.complete(i)))
}
complete(e) {
return "P" === e ? e : "S" + e[1] + "/R" + e[1]
}
update() {
this._invalidated = !0
}
_updateImpl() {
if (this._source.pricesView().prices(), this._pivots = [], this._source
.customData() && this._source.customData().pivots && this._source
.properties().visible.value()) {
var e = this._source.customData().pivots,
t = this._source._indexes,
i = this._model.timeScale(),
s = this._source.priceScale();
if (s && !s.isEmpty() && !i.isEmpty() && e) {
var r = i.visibleBarsStrictRange(),
n = r.firstBar(),
o = r.lastBar();
if (this._source.ownerSource())
for (var a = this._source.ownerSource().firstValue(), l = 0; l <
e.length; l++)
if (e[l]) {
var c = t[e[l].startIndex],
h = t[e[l].endIndex];
if (!(h < n || c > o)) {
var u = {},
d = this._source.properties().levelsStyle
.visibility;
d.P.value() && this.mergeLabel(u, e[l].p, "P"), d[
"S1/R1"].value() && (this.mergeLabel(u, e[l]
.s1, "S1"), this.mergeLabel(u, e[l].r1,
"R1")), d["S2/R2"].value() && (this
.mergeLabel(u, e[l].s2, "S2"),
this.mergeLabel(u, e[l].r2, "R2")), d[
"S3/R3"].value() && (this.mergeLabel(u, e[l]
.s3, "S3"), this.mergeLabel(u, e[l].r3,
"R3")), d["S4/R4"].value() && (this
.mergeLabel(u, e[l].s4, "S4"), this
.mergeLabel(u, e[l].r4, "R4")), d["S5/R5"]
.value() && (this.mergeLabel(u, e[l].s5, "S5"),
this.mergeLabel(u, e[l].r5, "R5"));
var p = i.indexToCoordinate(c),
_ = i.indexToCoordinate(h);
for (var m in u) {
var f = parseFloat(m),
g = s.priceToCoordinate(f, a);
this._pivots.push({
x1: p,
x2: _,
y: g,
label: u[m].text,
labelIds: u[m].ids,
src: e[l]
})
}
}
}
}
}
}
renderer() {
this._invalidated && (this._updateImpl(), this._invalidated = !1);
for (var e = new h, t = this._source.properties().levelsStyle.colors, i =
this._source.properties().levelsStyle.widths, r = this._source
.visiblePivots(), n = 0; n < this._pivots.length; n++) {
var o = this._pivots[n];
if (r.has(o.src)) {
var a = {
width: this._model.timeScale().width(),
height: this._source.priceScale().height(),
color: t[o.labelIds[0]].value(),
linewidth: i[o.labelIds[0]].value(),
linestyle: CanvasEx.LINESTYLE_SOLID,
y: o.y,
left: o.x1,
right: o.x2
},
l = new m;
if (l.setData(a), l.setHitTest(new c(c.REGULAR)), e.append(l), this
._source.properties().levelsStyle.showLabels.value()) {
var u = function(e) {
return this._source.getCache(e)
}.bind(this);
e.append(new _(u, new s(o.x1, o.y), o.label))
}
}
}
return e
}
}
t.study_PivotPointsStandard = class extends o {
constructor(e, t, i, s) {
super(e, t, i, s);
for (var r = ["P", "S1/R1", "S2/R2", "S3/R3", "S4/R4", "S5/R5"], n =
this.properties().levelsStyle.visibility, o = 0; o < r
.length; o++) n[r[o]].listeners().subscribe(this, this
.processHibernate);
this._cacheDrawParams = null, this._cache = null
}
indexes() {
return this._indexes
}
getCache(e) {
return this.createCacheIfRequred(e), this._cache
}
createCacheIfRequred(e) {
if (null === this._cache || null == this._cacheDrawParams || !u(e, this
._cacheDrawParams)) {
this._cache && this._cache.destroy();
var t = this._getActualCacheParams();
this._cache = new d(e, t.font, t.fontSize, t.backColors), this
._cache.setPrices(this._pricesView.prices()), this
._cacheDrawParams = e, this._cacheInvalidated = !1, this._cache
.reset(t), this._cache.setPrices(this._pricesView.prices())
}
}
lastValueData(e, t, i) {
var s = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5",
"R5"
].indexOf(e.toUpperCase()),
r = this._pricesView.prices()[s];
return null != r ? r : {
noData: !0
}
}
priceLabelText(e) {
return this._metaInfo.shortDescription + ":" + e.toUpperCase()
}
pricesView() {
return this._pricesView
}
_getActualCacheParams() {
var e = {};
return e.font = this.properties().font.value(), e.fontSize = this
.properties().fontsize.value(), e.backColors = [this.properties()
.levelsStyle.colors.P.value(), this.properties().levelsStyle
.colors["S1/R1"].value(), this.properties().levelsStyle.colors[
"S1/R1"].value(), this.properties().levelsStyle.colors[
"S2/R2"].value(), this.properties().levelsStyle.colors[
"S2/R2"].value(), this.properties().levelsStyle.colors[
"S3/R3"].value(), this.properties().levelsStyle.colors[
"S3/R3"].value(), this.properties().levelsStyle.colors[
"S4/R4"].value(), this.properties().levelsStyle.colors[
"S4/R4"].value(), this.properties().levelsStyle.colors[
"S5/R5"].value(), this.properties().levelsStyle.colors[
"S5/R5"].value()
], e
}
updateAllViews() {
super.updateAllViews(),
this._pricesView.update()
}
_createViews() {
this._cache && (this._cache.destroy(), this._cache = null), this
._priceAxisViews = [];
var e = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5",
"R5"
];
this._paneViews.length = 0, this._labelPaneViews = [];
var t = new f(this._model, this);
t.setCache(this._cache), this._paneViews.push(t), this._mainPaneView =
t;
for (var i = 0; i < e.length; i++) {
var s = new a(this, {
name: e[i],
cache: this._cache
});
this._priceAxisViews.push(s), this._labelPaneViews.push(new l(s,
this, this._model))
}
this._dataWindowView || (this._dataWindowView = new n(this, this
._model)), this._statusView || (this._statusView = new r(this,
this._model.properties().scalesProperties.textColor)), this
._legendView = null, this._pricesView = new p(this)
}
visiblePivots() {
return this._pricesView.visiblePivots()
}
_postProcessGraphics() {}
isVisible() {
if (!this.properties().visible.value() || !this.isActualInterval())
return !1;
for (var e = ["P", "S1/R1", "S2/R2", "S3/R3", "S4/R4", "S5/R5"], t =
this.properties().levelsStyle.visibility, i = 0; i < e
.length; i++)
if (t[e[i]].value()) return !0;
return !1
}
stop() {
super.stop(), this._cache && (this._cache.destroy(), this._cache = null)
}
priceRange(t, i) {
if (!this.customData() || !this.customData().pivots || !this._indexes)
return null;
if (!this.priceScale()) return null;
for (var s = this.customData().pivots, r = this._indexes, n = null, o =
0; o < s.length; o++)
if (s[o]) {
var a = r[s[o].startIndex];
if (!(r[s[o].endIndex] < t || a > i)) {
var l = [],
c = this._properties.levelsStyle.visibility;
c.P.value() && l.push(s[o].p), c["S1/R1"].value() && l.push(
s[o].s1, s[o].r1), c["S2/R2"].value() && l.push(s[o]
.s2, s[o].r2), c["S3/R3"].value() && l.push(s[o].s3,
s[o].r3), c["S4/R4"].value() && l.push(s[o].s4, s[o]
.r4), c["S5/R5"].value() && l.push(s[o].s5, s[o].r5);
for (var h = 0; h < l.length; h++) l[h] && (null === n ? n =
new e(l[h], l[h]) : n.apply(l[h], l[h]))
}
} return this.priceScale().isLog() && n ? new e(this.priceScale()
.priceToLogical(n.minValue()), this.priceScale().priceToLogical(
n.maxValue())) : n
}
}
}).call(this, i("Qb4w").PriceRange)
},
PT1i: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "Linking", (function() {
return h
})), i.d(t, "linking", (function() {
return u
}));
var s = i("hbEN"),
r = i("hY0g"),
n = i.n(r),
o = i("Kxc7"),
a = i("txPx");
const l = Object(a.getLogger)("Linking");
var c;
! function(e) {
e[e.NotBound = 0] = "NotBound", e[e.BoundToWidget = 1] = "BoundToWidget", e[e.BoundToModel =
2] = "BoundToModel"
}(c || (c = {}));
class h {
constructor() {
this._watchedSymbol = new n.a, this._seriesShortSymbol = new n.a, this._proSymbol =
new n.a, this._watchedInterval = new n.a, this._watchedIntraday = new n.a, this
._watchedSeconds = new n.a, this._watchedTicks = new n.a, this
._watchedSupportedResolutions = new n.a, this._symbolNamesList = new n.a, this
._chartWidgetBindingState = c.NotBound, this._activeChartWidget = null, this
._watchedSymbolListenerBound = this._watchedSymbolListener.bind(this), this
._watchedIntervalListenerBound = this._watchedIntervalListener.bind(this), this
._onSymbolLinkBound = this._onSymbolLink.bind(this), this._searchCharts = null,
this._searchChartsLoadDebounced = null, this._selfEmit = !1, this
._preventFeedBySymbol = !1, this._feedBySymbolDebounceCounter = 0
}
get symbol() {
return this._watchedSymbol
}
get proSymbol() {
return this._proSymbol
}
get symbolNamesList() {
return this._symbolNamesList
}
get seriesShortSymbol() {
return this._seriesShortSymbol.readonly()
}
get interval() {
return this._watchedInterval
}
get intraday() {
return this._watchedIntraday.readonly()
}
get seconds() {
return this._watchedSeconds.readonly()
}
get ticks() {
return this._watchedTicks.readonly()
}
get supportedResolutions() {
return this._watchedSupportedResolutions.readonly()
}
get preventFeedBySymbol() {
return this._preventFeedBySymbol
}
bindToChartWidget(e) {
if (this.unbindFromChartWidget(), this._activeChartWidget = e, e.hasModel())
return void this._onChartModelCreated(e.model());
e.modelCreated().subscribe(this, this._onChartModelCreated), this
._chartWidgetBindingState = c.BoundToWidget;
const t = e.properties().childs().mainSeriesProperties.childs();
this._watchedSymbol.setValue(t.symbol.value()), this._watchedInterval.setValue(t
.interval.value())
}
unbindFromChartWidget() {
switch (this._chartWidgetBindingState) {
case c.BoundToWidget:
if (!this._activeChartWidget) throw new Error("ChartWidget is undefined");
this._activeChartWidget.modelCreated().unsubscribe(this, this
._onChartModelCreated);
break;
case c.BoundToModel:
this._symbolProperty().unsubscribe(this, this._onSymbolPropertyChange), this
._watchedSymbol.unsubscribe(this._watchedSymbolListenerBound), this
._mainSeries().dataEvents().symbolResolved().unsubscribe(this, this
._updateSeriesSymbolInfo), this._mainSeries().dataEvents()
.symbolError().unsubscribe(this, this._updateSeriesSymbolInfo), this
._intervalProperty().unsubscribe(this, this._onIntervalPropertyChange),
this._watchedInterval.unsubscribe(this._watchedIntervalListenerBound),
delete this._watchedSymbol.hook, delete this._watchedSymbol.writeLock
}
this._activeChartWidget = null, this._chartWidgetBindingState = c.NotBound
}
getChartWidget() {
return this._activeChartWidget
}
bindToChartWidgetCollection(e) {
this._chartWidgetCollection = e, this.unbindFromChartWidget(), e.activeChartWidget
.subscribe(e => {
this.unbindFromChartWidget(), this.bindToChartWidget(e)
}, {
callWithLast: !0
})
}
bindToSearchCharts(e) {
this.unbindFromSearchCharts(), this._searchCharts = e, e.onSearchBySymbol.subscribe(
this, this._onSearchBySymbol), e.loadingSymbol.subscribe(e => {
!1 === e && (this._feedBySymbolDebounceCounter = 0)
}), this._watchedSymbol.subscribe(this._onSymbolLinkBound)
}
unbindFromSearchCharts() {
this._searchCharts && (this._searchCharts.onSearchBySymbol.unsubscribe(this, this
._onSearchBySymbol), this._watchedSymbol.unsubscribe(this
._onSymbolLinkBound), this._searchCharts = null)
}
setPreventFeedBySymbol(e) {
this._preventFeedBySymbol = e
}
_onSearchBySymbol(e) {
if (!e.resolved_symbol) throw new Error("no resolved_symbol");
this._selfEmit = !0, this._watchedSymbol.setValue(e.resolved_symbol), this
._selfEmit = !1
}
_onSymbolLink(e) {
if (!this._selfEmit) {
if (!this._searchCharts) {
const e = "No search charts defined";
throw l.logError(e), new Error(e)
}
this._preventFeedBySymbol || this._loadSearchCharts(e)
}
}
_loadSearchCharts(e) {
if (!this._searchCharts) {
const e = "No search charts defined";
throw l.logError(e), new Error(e)
}
if (this._searchChartsLoadDebounced) return void(this._feedBySymbolDebounceCounter <
100 && (this._feedBySymbolDebounceCounter++, this
._searchChartsLoadDebounced(e)));
const t = e => this._searchCharts ? (!0 === this._searchCharts.loadingSymbol
.value() ? this._feedBySymbolDebounceCounter < 100 && (this
._feedBySymbolDebounceCounter++, this._searchChartsLoadDebounced =
Object(s.default)(t, 2e3), this._searchChartsLoadDebounced(e)) : this
._searchChartsLoadDebounced = null, this._searchCharts.feedBySymbol.call(
this._searchCharts, e)) : () => {};
!0 === this._searchCharts.loadingSymbol.value() ? this
._feedBySymbolDebounceCounter < 100 && (this._feedBySymbolDebounceCounter++,
this._searchChartsLoadDebounced = Object(s.default)(t, 2e3), this
._searchChartsLoadDebounced(e)) : this._searchCharts.feedBySymbol(e)
}
_mainSeries() {
if (!this._activeChartWidget) throw new Error("ChartWidget is undefined");
return this._activeChartWidget.model().mainSeries()
}
_properties() {
return this._mainSeries().properties()
}
_symbolProperty() {
return this._properties().symbol
}
_intervalProperty() {
return this._properties().interval
}
_watchedSymbolListener(e) {
this._symbolProperty().value() !== e && this._chartWidgetCollection.setSymbol(e)
}
_sendSnowplowAnalytics() {
if (!window.user.do_not_track) throw new Error("unsupported")
}
_onSymbolPropertyChange() {
const e = this._symbolProperty().value() !== this._watchedSymbol.value();
this._watchedSymbol.setValue(this._symbolProperty().value()), e && this
._chartWidgetCollection.setSymbol(this._symbolProperty().value())
}
_onSymbolResolved(e) {
const t = this._mainSeries().symbolInfo();
t && this._applyValuesFromSymbolInfo(t)
}
_applyValuesFromSymbolInfo(e) {
const t = e.pro_name || o.enabled("trading_terminal") && (e.full_name || e.name) ||
"";
this._proSymbol.setValue(t), e.aliases && this._symbolNamesList.setValue(e.aliases)
}
_updateSeriesSymbolInfo() {
this._seriesShortSymbol.setValue(this._properties().shortName.value());
const e = this._mainSeries().symbolInfo();
e ? (this._applyValuesFromSymbolInfo(e), e.hasOwnProperty("supported_resolutions") ?
this._watchedSupportedResolutions.setValue(e.supported_resolutions) : this
._watchedSupportedResolutions.setValue(void 0), this._watchedIntraday
.setValue(!!e.has_intraday), this._watchedSeconds.setValue(!!e.has_seconds),
this._watchedTicks.setValue(!!e.has_ticks)) : (this._watchedIntraday
.deleteValue(), this._watchedSeconds.deleteValue(), this._watchedTicks
.deleteValue(), this._proSymbol.deleteValue())
}
_watchedIntervalListener(e) {
this._intervalProperty().value() !== e && this._chartWidgetCollection.setResolution(
e)
}
_onIntervalPropertyChange() {
const e = this._intervalProperty().value() !== this._watchedInterval.value();
this._watchedInterval.setValue(this._intervalProperty().value()), e && this
._chartWidgetCollection.setResolution(this._intervalProperty().value())
}
_onChartModelCreated(e) {
if (!this._activeChartWidget) throw new Error("ChartWidget is undefined");
this._chartWidgetBindingState = c.BoundToModel, this._activeChartWidget
.modelCreated().unsubscribe(this, this._onChartModelCreated);
const t = this._symbolProperty();
t.subscribe(this, this._onSymbolPropertyChange), this._watchedSymbol.setValue(t
.value()),
this._watchedSymbol.subscribe(this._watchedSymbolListenerBound);
const i = this._mainSeries();
i.dataEvents().symbolResolved().subscribe(this, this._onSymbolResolved), this
._watchedSymbol.hook = e => (i.symbolSameAsCurrent(e) && (e = i.symbol()), e), i
.dataEvents().symbolResolved().subscribe(this, this._updateSeriesSymbolInfo), i
.dataEvents().symbolError().subscribe(this, this._updateSeriesSymbolInfo), i
.dataEvents().symbolNotPermitted().subscribe(this, this
._updateSeriesSymbolInfo), i.dataEvents().symbolGroupNotPermitted()
.subscribe(
this, this._updateSeriesSymbolInfo), this._updateSeriesSymbolInfo();
const s = this._intervalProperty();
s.subscribe(this, this._onIntervalPropertyChange), this._watchedInterval.setValue(s
.value()), this._watchedInterval.subscribe(this
._watchedIntervalListenerBound), this._activeChartWidget.readOnly() && (this
._watchedSymbol.writeLock = !0)
}
}
window.TradingView = window.TradingView || {};
const u = new h;
window.TradingView.Linking = u
},
PYn8: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolThreeDrivers", (function() {
return o
}));
var s = i("Ocx9"),
r = i("Ss5c"),
n = i("j3hX");
class o extends r.LineDataSource {
constructor(e, t) {
const s = t || o.createProperties();
super(e, s), i.e("lt-pane-views").then(i.bind(null, "S6aM")).then(t => {
this._setPaneViews([new t.LineToolThreeDrivesPaneView(this, e)])
})
}
pointsCount() {
return 7
}
name() {
return "Three Drives Pattern"
}
properties() {
return super.properties()
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolthreedrivers", e);
return o._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "aMeN")).then(
e => e.PatternWithoutBackgroundDefinitionsViewModel)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e), e.addChild("linesColors", new n
.LineToolColorsProperty([e.childs().color])), e.addChild("textsColors",
new n.LineToolColorsProperty([e.childs().textcolor])), e.addChild(
"linesWidths", new n.LineToolWidthsProperty([e.childs().linewidth])), e
.hasChild("backgroundsColors") && e.removeProperty("backgroundsColors")
}
}
},
PzPU: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "copyToClipboardImageOfChart", (function() {
return r
})), i.d(t, "getImageOfChartSilently", (function() {
return n
})), i.d(t, "copyToClipboardClientScreenshot", (function() {
return o
})), i.d(t, "downloadClientScreenshot", (function() {
return a
}));
const s = () => i.e("take-chart-image-impl").then(i.bind(null, "13es"));
function r(e, t = {}) {
return s().then(i => i.copyToClipboardImageOfChart(e, t))
}
function n(e, t = {}) {
return s().then(i => i.getImageOfChartSilently(e, t))
}
function o(e) {
return s().then(t => t.copyToClipboardClientScreenshot(e))
}
function a(e) {
return s().then(t => t.downloadClientScreenshot(e))
}
},
Q19o: function(e, t, i) {
"use strict";
var s = i("Eyy1").ensureNotNull,
r = i("jA0t"),
n = i("9iCb").applyOverridesToStudy,
o = i("0YCj"),
a = i("5JMW"),
l = a.LineDataSourceApi,
c = a.isLineToolRiskReward,
h = i("N1UO").StudyApi,
u = i("ltKl").SeriesApi,
d = i("QrSB").SelectionApi,
p = i("mf9N").PaneApi,
_ = i("OLhd").createDwmAligner,
m = i("LxhU").Interval,
f = i("2jXJ").supportedLineTools,
g = i("vwKG").showTooManyStudiesNotice,
b = i("ogJP"),
v = b.isNumber,
S = b.deepEquals,
y = i("CW80").createLineToolProperties,
w = i("CW80").prepareLineToolPropertiesByOwnerSource,
P = i("96Yh").lineToolEntityInfo,
C = i("lReN").LineToolsGroupControllerApi,
x = i("ocrj").RemoveSourcesCommand,
T = i("e92V").isLineDrawnWithPressedButton,
I = i("FDyI").ChartWidgetApiBase,
M = i("mMWL");
function O(e, t) {
return t.map((function(t) {
return e.dataSourceForId(t)
}))
}
e.exports = class extends I {
constructor(e, t) {
super(e, t), this._panes = new WeakMap, this._studies = new WeakMap, this
._lineDataSources = new WeakMap, this._selectionApi = null, this
._prevVisibleRange = null, this._chartWidget.onAboutToBeDestroyed()
.subscribe(this, this._destroy, !0), this._chartWidget.withModel(this, (
function() {
this._chartWidget.model().timeScale().logicalRangeChanged()
.subscribe(this, this._onLogicalRangeChanged)
}))
}
id() {
return this._chartWidget.id()
}
_getPaneApi(e) {
var t = this._panes.get(e);
return void 0 === t && (t = new p(e, this._chartWidget), this._panes.set(e, t)),
t
}
_getStudyApi(e) {
var t = this._studies.get(e);
return void 0 === t && (t = new h(e, this._chartWidget), this._studies.set(e,
t)), t
}
_getLineDataSourceApi(e) {
var t = this._lineDataSources.get(e);
return void 0 === t && (t = new l(e, this._chartWidget.model().model(), {
apiPointsToDataSource: this._convertUserPointsToDataSource.bind(
this),
dataSourcePointsToPriced: e => {
var t = this._chartWidget.model().mainSeries()
.syncModel(),
i = this._chartWidget.model().timeScale();
return e.map(e => {
var s = i.normalizeBarIndex(e.index);
return {
price: e.price,
time: this._convertTimeToPublic(t
.projectTime(s.time_t, s.offset)
)
}
})
}
}), this._lineDataSources.set(e, t)), t
}
executeActionById(e) {
this._chartWidget.executeActionById(e)
}
getCheckableActionState(e) {
return this._chartWidget.getCheckableActionState(e)
}
setZoomEnabled(e) {
this._chartWidget.model().model().setZoomEnabled(e)
}
setScrollEnabled(e) {
this._chartWidget.model().model().setScrollEnabled(e)
}
refreshMarks() {
this._chartWidget.refreshMarks()
}
clearMarks() {
this._chartWidget.clearMarks()
}
symbol() {
return this._chartWidget.getSymbol()
}
symbolExt() {
var e = this._chartWidget.model().mainSeries().symbolInfo();
return e ? {
symbol: e.name,
full_name: e.full_name,
exchange: e.exchange,
description: e.description,
type: e.type,
pro_name: e.pro_name
} : null
}
resolution() {
return this._chartWidget.model().mainSeries().properties().interval.value()
}
resetData() {
this._chartWidget.model().mainSeries().rerequestData()
}
setEntityVisibility(e, t) {
console.warn(
"`setEntityVisibility` is deprecated. Use shape/study API instead");
var i = this._chartWidget.model().model().dataSourceForId(e);
if (i) {
var s = i.properties();
s && s.visible && s.visible.setValue(t)
}
}
availableZOrderOperations(e) {
var t = O(this._chartWidget.model().model(), e);
return this._chartWidget.model().availableZOrderOperations(t)
}
sendToBack(e) {
var t = O(this._chartWidget.model().model(), e);
this._chartWidget.model().sendToBack(t)
}
bringToFront(e) {
var t = O(this._chartWidget.model().model(), e);
this._chartWidget.model().bringToFront(t)
}
insertAfter(e, t) {
var i = this._chartWidget.model().model(),
s = O(i, e),
r = i.dataSourceForId(t);
this._chartWidget.model().insertAfter(s, r)
}
insertBefore(e, t) {
var i = this._chartWidget.model().model(),
s = O(i, e),
r = i.dataSourceForId(t);
this._chartWidget.model().insertBefore(s, r)
}
bringForward(e) {
var t = O(this._chartWidget.model().model(), e);
this._chartWidget.model().bringForward(t)
}
sendBackward(e) {
var t = O(this._chartWidget.model().model(), e);
this._chartWidget.model().sendBackward(t)
}
showPropertiesDialog(e) {
var t = this._chartWidget.model().model().dataSourceForId(e);
if (null === t) throw new Error("Study or shape " + e + " does not exist");
this._chartWidget.showChartPropertiesForSource(t)
}
getAllShapes() {
return this._chartWidget.model().model().allLineTools().map(P).filter((function(
e) {
return null !== e.name
}))
}
removeAllShapes() {
this._chartWidget.removeAllDrawingTools()
}
removeAllStudies() {
this._chartWidget.removeAllStudies()
}
removeEntity(e, t) {
var i = this._chartWidget.model().chartModel().dataSourceForId(e);
i ? t && t.disableUndo ? new x(this._chartWidget.model().chartModel(), [i], "")
.redo() : this._chartWidget.model().removeSource(i, !0, !0) : console.warn(
"Can't find a source with id: " + e)
}
removeEntityWithUndo(e) {
var t = this._chartWidget.model().chartModel().dataSourceForId(e);
this._chartWidget.model().removeSource(t, !1)
}
selection() {
return null === this._selectionApi && (this._selectionApi = new d(this
._chartWidget.model().model())), this._selectionApi
}
createStudyTemplate(e) {
return this._chartWidget.model().model().studyTemplate(e.saveSymbol, e
.saveInterval)
}
drawOnAllCharts(e) {
M.drawOnAllCharts.setValue(e)
}
applyStudyTemplate(e) {
this._chartWidget.model().applyStudyTemplate(e, "" + 1e3 * Math.random())
}
setVisibleRange(e, t) {
return new Promise(function(i) {
this._chartWidget.setVisibleTimeRange(e.from, e.to, t, i)
}.bind(this))
}
getVisibleRange() {
var e = {
from: 0,
to: 0
},
t = this._chartWidget.model().timeScale();
if (t.isEmpty()) return e;
var i = t.coordinateToVisibleIndex(0),
s = t.coordinateToVisibleIndex(t.width() - 1),
r = this._convertIndexToPublicTime(s);
return null === r || (e.from = this._convertIndexToPublicTime(Math.max(t
.points().firstIndex(), i)), e.to = r), e
}
getVisiblePriceRange() {
return console.warn(
"`getVisiblePriceRange` is deprecated. Use Price Scale API instead"),
this._chartWidget.model().mainSeries() ? this._chartWidget.model()
.mainSeries().priceScale().priceRangeInPrice() : null
}
scrollPosition() {
return this._chartWidget.model().timeScale().rightOffset()
}
defaultScrollPosition() {
return this._chartWidget.model().timeScale().defaultRightOffsetProperty()
.value()
}
_createTradingPrimitive(e, t) {
var i = this;
var r, n, o = this._chartWidget.model().model(),
a = o.paneForSource(o.mainSeries());
return (t ? o : this._chartWidget.model()).createLineTool(a, (r = TradingView
.CLOSE_PLOT, {
index: (n = s(i._chartWidget.model().mainSeries().bars()
.last())).index,
price: n.value[r]
}), e)._adapter
}
createOrderLine(e) {
e = e || {};
return this._createTradingPrimitive("LineToolOrder", e.disableUndo)
}
createPositionLine(e) {
e = e || {};
return this._createTradingPrimitive("LineToolPosition", e.disableUndo)
}
createExecutionShape(e) {
e = e || {};
return this._createTradingPrimitive("LineToolExecution", e.disableUndo)
}
createShape(e, t) {
return this.createMultipointShape([e], t)
}
_alignPoints(e) {
var t = this._chartWidget.model().model(),
i = t.mainSeries(),
s = i.interval();
if (t.timeScale().isEmpty() || !m.isDWM(s)) return e;
var r = _(s, i.symbolInfo());
return null === r ? e : e.map((function(e) {
return r.timeToSessionStart(1e3 * e) / 1e3
}))
}
_convertUserPointsToDataSource(e) {
var t = this._chartWidget.model().model(),
i = t.mainSeries(),
s = t.timeScale().points(),
r = i.data();
if (t.timeScale().isEmpty()) return null;
var n = e.map((function(e) {
return e.time || 0
})),
o = this._alignPoints(n);
function a(e, t, n) {
var o = s.closestIndexLeft(e) || 0,
a = {
index: o
},
l = s.valueAt(o);
if (e > l && o === s.lastIndex())(c = i.syncModel().distance(l, e))
.success && (a.index = a.index + c.result);
else if (e < l && o === s.firstIndex()) {
var c;
(c = i.syncModel().distance(e, l)).success && (a.index = a.index - c
.result)
}
if (v(t)) a.price = t;
else {
var h = n ? ["open", "high", "low", "close"].indexOf(n) + 1 : 1;
h <= 0 && (h = 1), a.price = r.valueAt(o)[h]
}
return a
}
for (var l = [], c = 0; c < e.length; c++) {
var h = e[c];
l.push(a(o[c], h.price, h.channel))
}
return l
}
createMultipointShape(e, t, i) {
var s = t.disableUndo ? this._chartWidget.model().model() : this._chartWidget
.model(),
r = this._chartWidget.model().model(),
n = r.mainSeries();
if (!r.timeScale().isEmpty()) {
var o = r.dataSourceForId(t.ownerStudyId) || n,
a = r.paneForSource(o),
l = this._convertUserPointsToDataSource(e),
h = f[t.shape] || f.flag;
if (h.onlySelectable) throw new Error('Cannot create "' + t.shape +
'" shape');
if ("LineToolPolyline" === h.name || "LineToolPath" === h.name ||
"LineToolGhostFeed" === h.name) l[0].price === l[l.length - 1].price &&
l[0].index === l[l.length - 1].index || l.push(l[0]);
else if ("LineToolIcon" === h.name) {
if (t.icon = t.icon || t.overrides && t.overrides.icon, !t
.hasOwnProperty("icon")) throw new Error(
"icon must be specified in options");
t.overrides = t.overrides || {}, t.overrides.icon = t.icon
}
var u = y(h.name);
if (w(u, o), t.overrides)
for (var d in t.overrides) u[d] ? u[d].mergeAndFire(t.overrides[d]) : c(
h.name) && -1 !== ["profitLevel", "stopLevel"].indexOf(d) && u
.addProperty(d, t.overrides[d]);
void 0 !== u.text && t.text && u.text.setValue(t.text);
var p = s.createLineTool(a, l[0], h.name, u, void 0, o);
if (c(h.name)) {
if (l.length > 2) throw new Error("Wrong points count for " + t.shape +
". Required 1 or 2");
2 === l.length && (p.startChanging(1, l[1]), p.setPoint(1, l[1]), p
.endChanging())
} else {
var _ = p.pointsCount();
if (_ !== l.length && -1 !== _) throw new Error(
"Wrong points count for " + t.shape + ". Required " + _);
for (var m = T(h.name), g = 1; g < l.length && this._chartWidget.model()
.lineBeingCreated(); g++) s.continueCreatingLine(l[g], null, g < l
.length - 1 || m);
m && (s.finishLineTool(p), s.continueCreatingLine(l[l.length - 1], null,
!1))
}
if (t.lock && p.setUserEditEnabled(!1), t.disableSelection && p
.setSelectionEnabled(!1), t.disableSave && (p.customization
.disableSave = !0), t.hasOwnProperty("showInObjectsTree") && (p
.customization.showInObjectsTree = t.showInObjectsTree),
t.zOrder) {
var b = this._chartWidget.model().availableZOrderOperations([p]);
"top" === t.zOrder && b.bringToFrontEnabled ? s.bringToFront([p]) :
"bottom" === t.zOrder && b.sendToBackEnabled && s.sendToBack([p])
}
return p.id()
}
}
getShapeById(e) {
var t = this._chartWidget.model().model().getLineToolById(e);
if (null === t) throw new Error("There is no such shape");
return this._getLineDataSourceApi(t)
}
createStudy(e, t, i, s, a, l) {
if ("function" == typeof a) return console.warn(
'"createStudy" does not take "callback" parameter anymore'), Promise
.resolve(null);
if (l = l || {}, "string" != typeof e) return this._createStudy(e);
if (l.checkLimit && !this._chartWidget.model().canCreateStudy()) return g(),
Promise.resolve(null);
e = e.toLowerCase();
var c = l.disableUndo ? this._chartWidget.model().model() : this._chartWidget
.model(),
h = o.findStudyMetaInfoByDescription(c.studiesMetaData(), e).id,
u = c.createStudyInserter({
type: "java",
studyId: h
});
return u.setForceOverlay(t), l.priceScale && u.setPreferredPriceScale(function(
e) {
switch (e) {
case "no-scale":
return "overlay";
case "as-series":
return "as-series";
case "new-left":
return "left";
case "new-right":
return "right";
default:
throw new Error('The pricescale "' + e +
'" is invalid, the only valid options are "no-scale", "as-series", "new-left" and "new-right".'
)
}
}(l.priceScale)), l.allowChangeCurrency && u.setAllowChangeCurrency(!0), l
.allowChangeUnit && u.setAllowChangeUnit(!0), s && (s = r
.getStudyRecordFromArray([e].concat(s), this._chartWidget).inputs), u
.insert((function() {
return Promise.resolve(s || {})
})).then((function(e) {
return a && n(e, a), i && e.setUserEditEnabled(!1), e.id()
}))
}
getStudyById(e) {
var t = this._chartWidget.model().model().getStudyById(e);
if (null === t) throw new Error("There is no such study");
return this._getStudyApi(t)
}
getSeries() {
var e = this._chartWidget.model(),
t = e.mainSeries();
return new u(t, e)
}
chartType() {
return this._chartWidget.model().mainSeries().properties().style.value()
}
priceFormatter() {
return this._chartWidget.model().mainSeries().priceScale().formatter()
}
dataReady(e) {
var t = !this._chartWidget.hasModel() || !this._chartWidget.model()
.mainSeries() || this._chartWidget.model().mainSeries().data().isEmpty();
return e && (t ? this.onDataLoaded().subscribe(null, e, !0) : e()), !t
}
_onLogicalRangeChanged() {
var e = this._chartWidget.model().mainSeries(),
t = e.data().isEmpty();
if (null !== this._chartWidget.model().timeScale().visibleBarsStrictRange() &&
t) e.dataEvents().completed().subscribe(this, this._onLogicalRangeChanged, !
0);
else {
var i = this.getVisibleRange();
null !== this._prevVisibleRange && S(this._prevVisibleRange, i)[0] || (this
._prevVisibleRange = i, this._visibleBarsChanged.fire(i))
}
}
_destroy() {
super._destroy(), this._chartWidget.hasModel() && this._chartWidget.model()
.timeScale().logicalRangeChanged().unsubscribe(this, this
._onLogicalRangeChanged)
}
setTimezone(e) {
this._chartWidget.setTimezone(e)
}
getTimezone() {
return this._chartWidget.getTimezone()
}
getPanes() {
return this._chartWidget.model().chartModel().panes().map((function(e) {
return this._getPaneApi(e)
}), this)
}
canZoomOut() {
return !this._chartWidget.model().zoomStack().isEmpty()
}
zoomOut() {
this.canZoomOut() && this._chartWidget.model().zoomFromViewport()
}
shapesGroupController() {
return new C(this._chartWidget.model().lineToolsGroupController(), this
._chartWidget.model())
}
isSelectBarRequested() {
return this._chartWidget.selectPointMode().value()
}
requestSelectBar() {
if (this.isSelectBarRequested()) return Promise.reject("already requested");
var e = this;
return new Promise((function(t, i) {
e._chartWidget.requestSelectPoint("time").then((function(i) {
t(e._convertTimeToPublic(i.point.time))
})).catch((function() {
i("cancelled")
}))
}))
}
cancelSelectBar() {
this.isSelectBarRequested() && this._chartWidget.cancelRequestSelectPoint()
}
}
},
QCyK: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "spreadStudyItem", (function() {
return n
}));
var s = i("7dm8");
class r extends s.a {
_doCalculation(e, t, i, s) {
return e * t - i * s
}
}
const n = {
name: "Spread",
metainfo: {
_metainfoVersion: 15,
defaults: s.b,
plots: s.d,
styles: s.e,
description: "Spread",
shortDescription: "Spread",
is_price_study: !1,
inputs: s.c,
id: "Spread@tv-basicstudies-1"
},
constructor: r
}
},
QIuV: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("ivNn").fixComputationError;
class n extends s {
constructor(e, t) {
super(e, t), this.customization.forcePriceAxisLabel = !0, this.customization
.disableErasing = !0, this.customization.showInObjectsTree = !1, this
.setSelectionEnabled(!1)
}
isSynchronizable() {
return !1
}
pointsCount() {
return n.POINTS_COUNT
}
hasContextMenu() {
return !1
}
state() {
return null
}
startMoving() {
s.prototype.startMoving.apply(this, arguments), this._cursorMoved = !1
}
endMoving() {
s.prototype.endMoving.apply(this, arguments), this._cursorMoved = !1
}
_correctPoints(e) {
this._currentMovingPoint && this._startMovingPoint ? this._currentMovingPoint
.logical.price - this._startMovingPoint.logical.price && (this._cursorMoved = !
0) : this._cursorMoved = !1;
for (var t = 1 / this.priceScale().mainSource().base(), i = 0; i < e.length; i++) {
var s = e[i];
this._cursorMoved && (s.price = this._currentMovingPoint.logical.price), s
.price = r(t * Math.round(s.price / t)), e[i] = s
}
}
userEditEnabled() {
return !0
}
movable() {
return !1
}
canBeHidden() {
return !1
}
isUserDeletable() {
return !1
}
showInObjectTree() {
return !1
}
doesMovingAffectsUndo() {
return !1
}
isAvailableInFloatingWidget() {
return !1
}
timeAxisViews() {
return null
}
cloneable() {
return !1
}
copiable() {
return !1
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
n.POINTS_COUNT = 1, e.exports.LineToolTrading = n
},
QQu0: function(e, t, i) {
"use strict";
var s = i("WPQD").LineToolTrendLine,
r = i("Ocx9").DefaultProperty;
class n extends s {
constructor(e, t) {
super(e, t || n.createProperties())
}
name() {
return "Arrow"
}
static createProperties(e) {
var t = new r("linetoolarrow", e);
return n._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
t.LineToolArrow = n
},
QTwd: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "RestoreDefaultsPreferencesUndoCommand", (function() {
return h
}));
var s = i("Eyy1"),
r = i("RDU5"),
n = i("ApcL"),
o = i("3t3b"),
a = i("x2L+"),
l = i("N22A"),
c = i("GDWD");
class h extends r.UndoCommand {
constructor(e) {
super("Apply All Chart Properties"), this._trading = null, this
._oldShowSellBuyButtons = null, this._oldNoConfirmEnabled = null,
this._oldShowOnlyRejectionNotifications = null, this
._oldShowPricesWithZeroVolume = null, this._oldShowPricesWithSpread = null,
this._oldOrderExecutedSoundEnabled = null, this._prevWatermarkPreferences =
null, this._model = e, this._trading = Object(l.a)(), null !== this
._trading && (this._oldShowSellBuyButtons = this._trading.showSellBuyButtons
.value(), this._oldNoConfirmEnabled = this._trading.noConfirmEnabled
.value(), this._oldShowOnlyRejectionNotifications = this._trading
.showOnlyRejectionNotifications.value(), this
._oldShowPricesWithZeroVolume = this._trading.showPricesWith()
.zeroVolume.value(), this._oldShowPricesWithSpread = this._trading
.showPricesWith().spread.value(), this._oldOrderExecutedSoundEnabled =
this._trading.orderExecutedSoundParams.enabled.value()), this
._defaultsPreferences = Object(n.defaultsPreferencesByWhiteList)(this
._model, this._model.mainSeries()), this._oldPreferences = e
.preferences(), this._prevDateFormat = o.dateFormatProperty.value(), this
._prevAddPlusButton = c.addPlusButtonProperty.value(), this
._prevShowOpenMarkerStatus = a.b.value();
const t = this._model.watermarkSource();
null !== t && (this._prevWatermarkPreferences = t.properties().state())
}
redo() {
null !== this._trading && (this._trading.showSellBuyButtons.setValue(!0), this
._trading.noConfirmEnabled.setValue(!1), this._trading
.showOnlyRejectionNotifications.setValue(!1), this._trading
.showPricesWith().zeroVolume.setValue(!0), this._trading
.showPricesWith().spread.setValue(!0), this._trading
.orderExecutedSoundParams.enabled.setValue(!1)), this._model
.applyPreferences(this._defaultsPreferences), this._model.mainSeries()
.onChartStyleChanged(), this._model.updateScales(), Object(o
.restoreDateFormatSettingsValue)(), Object(c
.restoreAddPlusButtonSettingsValue)(), Object(a.a)();
const e = this._model.watermarkSource();
null !== e && e.restorePropertiesDefaults()
}
undo() {
null !== this._trading && (this._trading.showSellBuyButtons.setValue(Object(s
.ensureNotNull)(this._oldShowSellBuyButtons)), this._trading
.noConfirmEnabled.setValue(Object(s.ensureNotNull)(this
._oldNoConfirmEnabled)), this._trading
.showOnlyRejectionNotifications.setValue(Object(s.ensureNotNull)(this
._oldShowOnlyRejectionNotifications)), this._trading
.showPricesWith().zeroVolume.setValue(Object(s.ensureNotNull)(this
._oldShowPricesWithZeroVolume)), this._trading.showPricesWith()
.spread.setValue(Object(s.ensureNotNull)(this
._oldShowPricesWithSpread)), this._trading.orderExecutedSoundParams
.enabled.setValue(Object(s.ensureNotNull)(this
._oldOrderExecutedSoundEnabled))), this._model.applyPreferences(this
._oldPreferences), this._model.mainSeries().onChartStyleChanged(), this
._model.updateScales(), o.dateFormatProperty.setValue(this._prevDateFormat),
a.b.setValue(this._prevShowOpenMarkerStatus), c.addPlusButtonProperty
.setValue(this._prevAddPlusButton);
const e = this._model.watermarkSource();
null !== e && null !== this._prevWatermarkPreferences && e.properties()
.mergeAndFire(this._prevWatermarkPreferences)
}
}
},
Qb4w: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PriceRange", (function() {
return o
}));
var s = i("ogJP"),
r = i("txPx");
const n = Object(r.getLogger)("Chart.PriceRange");
class o {
constructor(e, t) {
if (null !== e && "object" == typeof e) {
const t = e;
this._minValue = t.m_minValue, this._maxValue = t.m_maxValue
} else {
const i = e;
this._minValue = i, void 0 !== t && (this._maxValue = t)
}
}
equals(e) {
return this._minValue === e._minValue && this._maxValue === e._maxValue
}
clone() {
return new o(this._minValue, this._maxValue)
}
minValue() {
return this._minValue
}
setMinValue(e) {
this._minValue = e
}
maxValue() {
return this._maxValue
}
setMaxValue(e) {
this._maxValue = e
}
length() {
return this._maxValue - this._minValue
}
isEmpty() {
return this._maxValue === this._minValue || this._maxValue != this._maxValue || this
._minValue != this._minValue
}
serialize() {
return {
m_maxValue: this._maxValue,
m_minValue: this._minValue
}
}
state() {
return {
max: this._maxValue,
min: this._minValue
}
}
merge(e) {
return new o(Math.min(this.minValue(), e.minValue()), Math.max(this.maxValue(), e
.maxValue()))
}
apply(e, t) {
this._minValue = Math.min(this._minValue, e), this._maxValue = Math.max(this
._maxValue, t)
}
set(e, t) {
this._minValue = e, this._maxValue = t
}
scaleAroundCenter(e) {
if (!Object(s.isNumber)(e)) return void n.logDebug(
"PriceRange.scaleAroundCenter: invalid coeff");
if (0 === this._maxValue - this._minValue) return;
const t = .5 * (this._maxValue + this._minValue);
let i = this._maxValue - t,
r = this._minValue - t;
i *= e, r *= e, this._maxValue = t + i, this._minValue = t + r
}
shift(e) {
Object(s.isNumber)(e) ? (this._maxValue += e, this._minValue += e) : n.logDebug(
"PriceRange.shift: invalid coeff")
}
containsStrictly(e) {
return e.minValue() > this._minValue && e.maxValue() < this._maxValue
}
static compare(e, t) {
return null === e || null === t ? e === t : e.equals(t)
}
}
},
QfUd: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return a
}));
var s = i("hY0g"),
r = i.n(s),
n = i("ogJP");
function o(e, t) {
return Object(n.deepEquals)(e, t)[0]
}
class a extends r.a {
constructor(e, t = o) {
super(e), this._comparator = t
}
setValue(e, t) {
!1 === this._comparator(this.value(), e) && super.setValue(e, t)
}
}
},
QloM: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "TabNames", (function() {
return s
})),
function(e) {
e.background = "Background", e.coordinates = "Coordinates", e.drawings = "Drawings", e
.events = "Events", e.eventsAndAlerts = "Events & Alerts", e.inputs = "Inputs", e
.properties = "Properties", e.scales = "Scales", e.legend = "Legend", e.sourceCode =
"Source Code", e.style = "Style", e.symbol = "Symbol", e.timezoneSessions =
"Timezone/Sessions", e.trading = "Trading", e.visibility = "Visibility", e.text =
"Text"
}(s || (s = {}))
},
Qq0B: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "NonSeriesStudy", (function() {
return n
}));
var s = i("Eyy1"),
r = i("GVHu");
class n extends r.Study {
clearData() {
this._customData = null, this._indexes = null
}
restoreData(e, t, i) {
r.Study.prototype.restoreData.call(this, e), this._customData = t, this
._indexes = i
}
state(e) {
const t = super.state(e);
return e && (t.nonSeriesData = this._customData, t.indexes = this._indexes), t
}
customData() {
return this._customData
}
_setPaneViews(e) {
this._paneViews = e, this.model().lightUpdate()
}
_onDataUpdated(e, t, i) {
null !== t && (t.indexes_replace ? (Object(s.assert)("nochange" !== i), this
._indexes = i) : (this._customData = t.data, "nochange" !== i && (
this._indexes = i))), super._onDataUpdated(e, t, i)
}
}
},
QrSB: function(e, t, i) {
"use strict";
function s(e, t) {
const i = e.dataSourceForId(t);
if (null === i) throw new Error(`Chart has no study or shape with id "${t}"`);
return i
}
i.r(t), i.d(t, "SelectionApi", (function() {
return r
}));
class r {
constructor(e) {
this._model = e
}
add(e) {
Array.isArray(e) ? this._model.selectionMacro(t => {
e.map(s.bind(null, this._model)).forEach(e => t.addSourceToSelection(e))
}) : this.add([e])
}
canBeAddedToSelection(e) {
const t = s(this._model, e);
return this._model.selection().canBeAddedToSelection(t)
}
set(e) {
Array.isArray(e) ? this._model.selectionMacro(t => {
t.clearSelection(), e.map(s.bind(null, this._model)).forEach(e => t
.addSourceToSelection(e))
}) : this.set([e])
}
remove(e) {
Array.isArray(e) ? this._model.selectionMacro(t => {
e.map(s.bind(null, this._model)).forEach(e => t
.removeSourceFromSelection(e))
}) : this.remove([e])
}
contains(e) {
const t = s(this._model, e);
return this._model.selection().isSelected(t)
}
allSources() {
return this._model.selection().dataSources().map(e => e.id())
}
isEmpty() {
return this._model.selection().isEmpty()
}
clear() {
this._model.selectionMacro(e => {
e.clearSelection()
})
}
onChanged() {
return this._model.onSelectedSourceChanged()
}
}
},
Qtjj: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "TimeSynchronizer", (function() {
return l
}));
var s = i("LxhU"),
r = i("jCNj"),
n = i.n(r),
o = i("IiTo");
let a = null;
class l {
constructor(e, t) {
var i, r;
this._sourceTargetBarBuilder = null, this._cache = new Map, this._source = e, this
._target = t, this._isResolutionTheSame = s.Interval.isEqual(e.getResolution(),
t.getResolution()), this._isSessionTheSame = (i = e.getSymbolInfo(), r = t
.getSymbolInfo(), i.timezone === r.timezone && i.session === r.session),
this._shouldCorrectTradingDay = s.Interval.isDWM(e.getResolution()) && !this
._isSessionTheSame
}
sourceTimeToTargetTime(e) {
if (this._isSessionTheSame && this._isResolutionTheSame) return e;
if (!this._source.isValid() || !this._target.isValid()) return e;
let t = this._cache.get(e);
if (void 0 === t) {
let i = 1e3 * e;
if (this._shouldCorrectTradingDay) {
let e = n.a.utc_to_cal(this._source.getSession().timezone, i);
e = this._source.getSession().spec.correctTradingDay(e);
const t = new Date(e);
n.a.set_hms(t, 0, 0, 0, 0, this._source.getSession().timezone), i = t
.valueOf()
}
const s = this._sourceTargetBuilder();
s.moveTo(i);
const r = s.indexOfBar(i);
t = s.startOfBar(Math.max(0, r)) / 1e3, this._cache.set(e, t)
}
return t
}
_sourceTargetBuilder() {
if (null === this._sourceTargetBarBuilder) {
const e = this._isSessionTheSame ? this._target.getSession() : (null === a && (
a = new o.SessionInfo("Etc/UTC", "24x7")), a);
this._sourceTargetBarBuilder = Object(o.newBarBuilder)(this._target
.getResolution(), this._target.getSession(), e)
}
return this._sourceTargetBarBuilder
}
}
},
RBvv: function(e) {
e.exports = JSON.parse(
'{"color-bg-primary":"color-white","color-bg-primary-hover":"color-cold-gray-100","color-bg-secondary":"color-white","color-bg-highlight":"color-cold-gray-50","color-bg-scroll-buttons":"color-cold-gray-100","color-legacy-bg-scroll-buttons":"color-cold-gray-850","color-legacy-bg-widget":"color-white","color-text-primary":"color-cold-gray-900","color-text-secondary":"color-cold-gray-500","color-text-tertiary":"color-cold-gray-400","color-text-disabled":"color-cold-gray-300","color-accent-content":"color-cold-gray-900","color-box-shadow":"color-cold-gray-300","color-divider":"color-cold-gray-150","color-divider-hover":"color-cold-gray-100","color-active-hover-text":"color-cold-gray-900","color-alert-text":"color-cold-gray-900","color-border-table":"color-cold-gray-100","color-brand":"color-tv-blue-500","color-brand-active":"color-tv-blue-700","color-brand-hover":"color-tv-blue-600","color-chart-page-bg":"color-cold-gray-150","color-common-tooltip-bg":"color-cold-gray-800","color-danger":"color-ripe-red-400","color-danger-hover":"color-ripe-red-500","color-danger-active":"color-ripe-red-600","color-depthrenderer-stroke-style":"color-cold-gray-100","color-highlight-new":"color-tan-orange-50","color-input-bg":"color-white","color-input-publish-bg":"color-white","color-link":"color-tv-blue-500","color-link-hover":"color-tv-blue-600","color-link-active":"color-tv-blue-700","color-list-nth-child-bg":"color-cold-gray-50","color-pane-bg":"color-white","color-pane-secondary-bg":"color-cold-gray-100","color-popup-menu-item-hover-bg":"color-cold-gray-100","color-popup-menu-separator":"color-cold-gray-150","color-screener-description":"color-cold-gray-650","color-success":"color-minty-green-500","color-success-hover":"color-minty-green-600","color-success-active":"color-minty-green-700","color-toolbar-button-text":"color-cold-gray-900","color-toolbar-button-text-hover":"color-cold-gray-900","color-toolbar-button-text-active":"color-tv-blue-500","color-toolbar-button-text-active-hover":"color-tv-blue-600","color-toolbar-button-background-hover":"color-cold-gray-100","color-toolbar-button-background-secondary-hover":"color-cold-gray-150","color-toolbar-toggle-button-background-active":"color-tv-blue-500","color-toolbar-toggle-button-background-active-hover":"color-tv-blue-600","color-toolbar-interactive-element-text-normal":"color-cold-gray-900","color-toolbar-interactive-element-text-hover":"color-cold-gray-900","color-toolbar-opened-element-bg":"color-cold-gray-100","color-tooltip-bg":"color-cold-gray-800","color-tv-dialog-caption":"color-cold-gray-650","color-tv-dropdown-item-hover-bg":"color-cold-gray-100","color-underlined-text":"color-cold-gray-500","color-widget-pages-bg":"color-white","color-warning":"color-tan-orange-500","color-growing":"color-minty-green-400","color-falling":"color-ripe-red-400","color-forex-icon":"color-cold-gray-750","color-list-item-active-bg":"color-tv-blue-400","color-list-item-hover-bg":"color-tv-blue-50","color-list-item-text":"color-cold-gray-800","color-price-axis-label-back":"color-cold-gray-150","color-price-axis-label-text":"color-cold-gray-650","color-price-axis-gear":"color-cold-gray-900","color-price-axis-gear-hover":"color-black","color-price-axis-highlight":"color-cold-gray-150","color-bid":"color-tv-blue-500","color-border":"color-cold-gray-150","color-border-chat-fields":"color-cold-gray-250","color-border-hover":"color-cold-gray-250","color-button-hover-bg":"color-cold-gray-150","color-depthrenderer-fill-style":"color-cold-gray-650","color-disabled-border-and-color":"color-cold-gray-150","color-disabled-input":"color-cold-gray-150","color-empty-container-message":"color-cold-gray-500","color-icons":"color-cold-gray-500","color-input-textarea-readonly":"color-cold-gray-650","color-input-placeholder-text":"color-cold-gray-350","color-item-active-blue":"color-tv-blue-50","color-item-hover-active-bg":"color-tv-blue-100","color-item-hover-bg":"color-tv-blue-100","color-item-hover-blue":"color-tv-blue-100","color-item-selected-blue":"color-tv-blue-50","color-item-active-text":"color-white","color-item-active-bg":"color-tv-blue-500","color-list-item":"color-cold-gray-450","color-news-highlight":"color-tv-blue-100","color-placeholder":"color-cold-gray-350","color-row-hover-active-bg":"color-cold-gray-100","color-sb-scrollbar-body-bg":"color-cold-gray-200","color-section-separator-border":"color-cold-gray-300","color-separator-table-chat":"color-cold-gray-150","color-tag-active-bg":"color-cold-gray-200","color-tag-hover-bg":"color-cold-gray-150","color-text-regular":"color-cold-gray-700","color-tv-button-checked":"color-cold-gray-550","color-scroll-bg":"color-cold-gray-400","color-scroll-border":"color-cold-gray-100","color-widget-border":"color-cold-gray-100","color-scroll-buttons-arrow":"color-white","color-control-intent-default":"color-cold-gray-200","color-control-intent-success":"color-minty-green-600","color-control-intent-primary":"color-tv-blue-500","color-control-intent-warning":"color-tan-orange-500","color-control-intent-danger":"color-ripe-red-500","color-pre-market":"color-tan-orange-600","color-pre-market-bg":"color-tan-orange-400","color-post-market":"color-tv-blue-500","color-post-market-bg":"color-tv-blue-400","color-market-open":"color-minty-green-500","color-market-open-bg":"color-minty-green-400","color-market-closed":"color-cold-gray-400","color-market-holiday":"color-cold-gray-400","color-invalid-symbol":"color-ripe-red-400","color-invalid-symbol-hover":"color-ripe-red-700","color-replay-mode":"color-tv-blue-500","color-replay-mode-icon":"color-white","color-replay-mode-hover":"color-tv-blue-600","color-notaccurate-mode":"color-berry-pink-700","color-notaccurate-mode-bg":"color-berry-pink-400","color-delay-mode":"color-tan-orange-700","color-delay-mode-bg":"color-tan-orange-400","color-eod-mode":"color-grapes-purple-700","color-eod-mode-bg":"color-grapes-purple-400","color-data-problem":"color-ripe-red-600","color-data-problem-bg":"color-ripe-red-400","color-data-problem-hover":"color-ripe-red-700","color-list-item-bg-highlighted":"color-tv-blue-50","color-list-item-bg-selected":"color-tv-blue-100","color-list-item-bg-highlighted-hover":"color-tv-blue-100","color-list-item-bg-selected-hover":"color-tv-blue-200","color-screener-header-bg":"color-white","color-screener-header-bg-hover":"color-cold-gray-100","color-marker-flagged":"color-ripe-red-400","color-marker-flagged-hovered":"color-ripe-red-600","color-ask":"color-ripe-red-400","color-sell":"color-ripe-red-400","color-buy":"color-tv-blue-500","color-neutral":"color-cold-gray-500","color-pro":"color-minty-green-400","color-pro-hover":"color-minty-green-600","color-pro-plus":"color-tv-blue-500","color-pro-plus-hover":"color-tv-blue-600","color-pro-premium":"color-tan-orange-500","color-pro-premium-hover":"color-tan-orange-700","color-trial":"color-cold-gray-500","color-trial-hover":"color-cold-gray-600","color-mod":"color-ripe-red-400","color-mod-hover":"color-ripe-red-600","color-top":"color-banana-yellow-700","color-top-hover":"color-banana-yellow-800","color-ad":"color-banana-yellow-a700","color-broker-featured":"color-minty-green-400","color-broker-featured-hover":"color-minty-green-600","color-alert-status-active":"color-minty-green-400","color-alert-status-stopped":"color-ripe-red-500","color-alert-status-triggered":"color-tan-orange-500","color-covid19-confirmed":"color-ripe-red-500","color-covid19-recovered":"color-minty-green-500","color-covid19-deaths":"color-cold-gray-450","color-overlay":"color-cold-gray-400","color-search-button-hover":"color-cold-gray-150","color-brand-light":"color-tv-blue-500","color-common-tooltip-text":"color-cold-gray-100","color-replay-data-mode":"color-radical-red","color-legacy-success":"color-keppel-1","color-collapse-tabs-border":"color-athens-gray-3","color-site-widget-hover":"color-athens-gray-1","color-attention":"color-sunglow","color-card-border":"color-cold-gray-150","color-card-border-hover":"color-cold-gray-300"}'
)
},
RDDl: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolPriceRange", (function() {
return n
}));
var s = i("Ocx9"),
r = i("Ss5c");
class n extends r.LineDataSource {
constructor(e, t) {
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.bind(null,
"VghZ")).then(e => {
this._setPaneViews([new e.PriceRangePaneView(this, this._model)])
})
}
pointsCount() {
return 2
}
properties() {
return super.properties()
}
name() {
return "Price Range"
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolpricerange", e);
return n._configureProperties(t), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "Ax76")))
.GeneralDatePriceRangeDefinitionsViewModel
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e)
}
}
},
RDU5: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "UndoCommand", (function() {
return s
}));
class s {
constructor(e, t = !0) {
this._customFlags = {}, this._text = e, this._executeOnPush = t
}
text() {
return this._text
}
executeOnPush() {
return this._executeOnPush
}
customFlag(e) {
return this._customFlags[e]
}
setCustomFlag(e, t) {
this._customFlags[e] = t
}
canMerge(e) {
return !1
}
merge(e) {
throw new Error("Should be re-implemented in child classes")
}
}
},
RTYN: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PositionAveragePriceAxisView", (function() {
return r
}));
var s = i("4TVt");
class r extends s.LineToolPriceAxisView {
_formatPrice(e, t) {
return this._source.formatter().format(e)
}
}
},
RXmj: function(e, t, i) {
"use strict";
(function(e) {
var s = i("FIi8").deepExtend,
r = i("ogJP").deepEquals,
n = i("zUrt").backend,
o = i("l+oz").ChartSaverBase;
window.t(
"The publication preview could not be loaded. Please disable your browser extensions and try again."
);
function a(e, t) {
e.content = JSON.stringify(t)
}
t.ChartSaver = class extends o {
constructor(t) {
super(t), this._chartAboutToBeSavedDelegate = new e, this
._chartSavedDelegate = new e, this._prevChartState = null, this
._chartSizeLimitExceededDelegate = new e
}
chartSizeLimitExceeded() {
return this._chartSizeLimitExceededDelegate
}
chartAboutToBeSaved() {
return this._chartAboutToBeSavedDelegate
}
chartSaved() {
return this._chartSavedDelegate
}
whenReadyToSave(e) {
var t = this._chartWidgetCollection.activeChartWidget.value().model()
.mainSeries();
if (t.hasDelayedSymbolIntervalChange()) {
var i, s = null;
i = function() {
t.dataEvents().symbolError().unsubscribe(null, s, !0), e()
}, s = function() {
t.dataEvents().symbolResolved().unsubscribe(null, i, !0)
}, t.dataEvents().symbolResolved().subscribe(null, i, !0), t
.dataEvents().symbolError().subscribe(null, s, !0)
} else e()
}
saveToJSON() {
var e = this._getCommonSavingInfo(!1);
return a(e, this._getChartWidgetCollectionState(!1, !0)), e
}
_fillAsyncInfo(e, t) {
var i = JSON.parse(e.content),
r = this._chartWidgetCollection;
return (t ? r.asyncState() : r.activeChartWidget.value().asyncState())
.then((function(t) {
return e.content = JSON.stringify(s(i, t)), e
}))
}
_getChartWidgetCollectionState(e, t, i, s, r) {
return e || (t = !0, s = !1), t ? this._chartWidgetCollection.state(!!e,
i, s, r) : this._chartWidgetCollection.activeChartWidget.value()
.state(!!e, i, s, r)
}
publishChart(e) {}
publishScript(e, t, i) {}
onPublish(e, t) {}
saveChartLineTools(e, t) {
var i = (void 0)(),
s = this._chartWidgetCollection.metaInfo.uid.value();
return i.saveLineToolsAndGroups(s, e, t)
}
_saveLineToolsToStorage() {
return Promise.resolve()
}
_saveChartImpl(e, t, i, s, r, o) {
var a = i,
l = s;
if (a = function(s) {
t.id.value() || (t.id.setValue(s), t.uid.setValue(s)),
"function" == typeof i && i(t, e)
}, !e.name) return console.warn(
"Saving chart with empty name is not allowed"), void s();
n.saveChart(e.name, e.short_name, e.resolution, e, t).then(a.bind(this))
.catch(l.bind(this))
}
_saveChart(e, t, i, s) {
var n = this._chartWidgetCollection.metaInfo,
o = function(o) {
return r(this._prevChartState, o)[0] && null != n.id.value() ? (
this._chartSavedDelegate.fire(!0), void(t && t(n, o))) :
this._saveChartImpl(o, n, t, i, s, e)
}.bind(this);
this._saveLineToolsToStorage().then((function() {
var t = e(!0);
return o(t)
})).catch((function(t) {
var i = e(!1);
return o(i)
}))
}
saveChartSilently(e, t, i) {
i = i || {};
var s = function(e) {
var t = e && (void 0)("remove_line_tools_from_content"),
s = this._getChartWidgetCollectionState(!1, void 0, void 0,
void 0, t),
r = this._getCommonSavingInfo(!1, t);
return a(r, s), i.chartName && (r.name = i.chartName), r.name &&
0 !== r.name.length || !i.defaultChartName || (r.name = i
.defaultChartName), i.autoSave && (r.autoSave = !0), r
}.bind(this);
this._isSaveInProcess = !0, this._chartAboutToBeSavedDelegate.fire(),
this._saveChart(s, function(t, i) {
this._chartWidgetCollection.metaInfo.name.setValue(i.name),
this._prevChartState = i, this._chartSavedDelegate.fire(
!0), this._isSaveInProcess = !1, e && e({
uid: t.uid.value(),
data: i
}), delete this._prevChartState.savingToken
}.bind(this), function() {
this._chartSavedDelegate.fire(!1), this._isSaveInProcess = !
1, t && t.apply(null, arguments)
}.bind(this), i)
}
isSaveInProcess() {
return this._isSaveInProcess
}
}
}).call(this, i("aIyQ"))
},
RspR: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "property", (function() {
return n
})), i.d(t, "availableValues", (function() {
return o
})), i.d(t, "actualBehavior", (function() {
return a
}));
var s = i("+jnJ"),
r = i("1ANp");
const {
property: n,
availableValues: o,
actualBehavior: a
} = Object(s.a)("PaneButtons.visibility", r.navigationButtonsVisibilityKey)
},
S8xo: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "MouseEventHandler", (function() {
return h
}));
var s = i("qFKp"),
r = i("Eyy1"),
n = i("ogJP"),
o = i("GUQs"),
a = i("VaSN");
const l = s.isSafari ? "click" : "auxclick",
c = {
treatVertTouchDragAsPageScroll: !1,
treatHorzTouchDragAsPageScroll: !1
};
class h {
constructor(e, t, i) {
this._clickCount = 0, this._clickTimeoutId = null, this._clickPosition = {
x: Number.NEGATIVE_INFINITY,
y: Number.POSITIVE_INFINITY
}, this._tapCount = 0, this._tapTimeoutId = null, this._tapPosition = {
x: Number.NEGATIVE_INFINITY,
y: Number.POSITIVE_INFINITY
}, this._longTapTimeoutId = null, this._longTapActive = !1, this
._mouseMoveStartPosition = null, this._touchMoveStartPosition = null, this
._touchMoveExceededManhattanDistance = !1, this._cancelClick = !1, this
._cancelTap = !1, this._unsubscribeOutsideMouseEvents = null, this
._unsubscribeOutsideTouchEvents = null, this._unsubscribeMobileSafariEvents =
null, this._unsubscribeMousemove = null, this._unsubscribeRootMouseEvents =
null, this._unsubscribeRootTouchEvents = null, this._startPinchMiddlePoint =
null,
this._startPinchDistance = 0, this._pinchPrevented = !1, this
._preventTouchDragProcess = !1, this._mousePressed = !1, this
._lastTouchEventTimeStamp = 0, this._activeTouchId = null, this
._acceptMouseLeave = !s.CheckMobile.iOS(), this._onFirefoxOutsideMouseUp =
e => {
this._mouseUpHandler(e)
}, this._onMobileSafariDoubleClick = e => {
if (this._firesTouchEvents(e)) {
const t = this._makeCompatEvent(e);
if (++this._tapCount, this._tapTimeoutId && this._tapCount > 1) {
const {
manhattanDistance: i
} = this._touchMouseMoveWithDownInfo(u(e), this._tapPosition);
i < 30 && !this._cancelTap && this._processTouchEvent(t, this
._handler.doubleTapEvent), this._resetTapTimeout()
}
} else {
const t = this._makeCompatEvent(e);
if (++this._clickCount, this._clickTimeoutId && this._clickCount > 1) {
const {
manhattanDistance: i
} = this._touchMouseMoveWithDownInfo(u(e), this._clickPosition);
i < 5 && !this._cancelClick && this._processMouseEvent(t, this
._handler.mouseDoubleClickEvent), this._resetClickTimeout()
}
}
}, this._target = e, this._handler = t, this._options = Object(n.merge)(Object(n
.clone)(c), i || {}), this._init()
}
destroy() {
null !== this._unsubscribeOutsideMouseEvents && (this
._unsubscribeOutsideMouseEvents(), this._unsubscribeOutsideMouseEvents =
null), null !== this._unsubscribeOutsideTouchEvents && (this
._unsubscribeOutsideTouchEvents(), this._unsubscribeOutsideTouchEvents =
null), null !== this._unsubscribeMousemove && (this._unsubscribeMousemove(),
this._unsubscribeMousemove = null), null !== this
._unsubscribeRootMouseEvents && (this._unsubscribeRootMouseEvents(), this
._unsubscribeRootMouseEvents = null), null !== this
._unsubscribeRootTouchEvents && (this._unsubscribeRootTouchEvents(), this
._unsubscribeRootTouchEvents = null), null !== this
._unsubscribeMobileSafariEvents && (this._unsubscribeMobileSafariEvents(), this
._unsubscribeMobileSafariEvents = null), this._clearLongTapTimeout(), this
._resetClickTimeout()
}
_mouseEnterHandler(e) {
this._unsubscribeMousemove && this._unsubscribeMousemove();
const t = this._mouseMoveHandler.bind(this);
if (this._unsubscribeMousemove = () => {
this._target.removeEventListener("mousemove", t)
}, this._target.addEventListener("mousemove", t), this._firesTouchEvents(e))
return;
const i = this._makeCompatEvent(e);
this._processMouseEvent(i, this._handler.mouseEnterEvent), this
._acceptMouseLeave = !0
}
_resetClickTimeout() {
null !== this._clickTimeoutId && clearTimeout(this._clickTimeoutId), this
._clickCount = 0, this._clickTimeoutId = null, this._clickPosition = {
x: Number.NEGATIVE_INFINITY,
y: Number.POSITIVE_INFINITY
}
}
_resetTapTimeout() {
null !== this._tapTimeoutId && clearTimeout(this._tapTimeoutId), this._tapCount = 0,
this._tapTimeoutId = null, this._tapPosition = {
x: Number.NEGATIVE_INFINITY,
y: Number.POSITIVE_INFINITY
}
}
_mouseMoveHandler(e) {
if (this._mousePressed || null !== this._touchMoveStartPosition) return;
if (this._firesTouchEvents(e)) return;
const t = this._makeCompatEvent(e);
this._processMouseEvent(t, this._handler.mouseMoveEvent), this._acceptMouseLeave = !
0
}
_touchMoveHandler(e) {
const t = _(e.changedTouches, Object(r.ensureNotNull)(this._activeTouchId));
if (null === t) return;
if (this._lastTouchEventTimeStamp = p(e), null !== this._startPinchMiddlePoint)
return;
if (this._preventTouchDragProcess) return;
this._pinchPrevented = !0;
const i = this._touchMouseMoveWithDownInfo(u(t), Object(r.ensureNotNull)(this
._touchMoveStartPosition)),
{
xOffset: s,
yOffset: n,
manhattanDistance: a
} = i;
if (this._touchMoveExceededManhattanDistance || !(a < 5)) {
if (!this._touchMoveExceededManhattanDistance) {
const e = .5 * s,
t = n >= e && !this._options.treatVertTouchDragAsPageScroll,
i = e > n && !this._options.treatHorzTouchDragAsPageScroll;
t || i || (this._preventTouchDragProcess = !0), this
._touchMoveExceededManhattanDistance = !0, this._cancelTap = !0, this
._clearLongTapTimeout(), this._resetTapTimeout()
}
if (!this._preventTouchDragProcess) {
const i = this._makeCompatEvent(e, t);
this._processTouchEvent(i, this._handler.touchMoveEvent), Object(o.a)(e)
}
}
}
_mouseMoveWithDownHandler(e) {
if (0 !== e.button) return;
const t = this._touchMouseMoveWithDownInfo(u(e), Object(r.ensureNotNull)(this
._mouseMoveStartPosition)),
{
manhattanDistance: i
} = t;
if (i >= 5 && (this._cancelClick = !0, this._resetClickTimeout()), this
._cancelClick) {
const t = this._makeCompatEvent(e);
this._processMouseEvent(t, this._handler.pressedMouseMoveEvent)
}
}
_touchMouseMoveWithDownInfo(e, t) {
const i = Math.abs(t.x - e.x),
s = Math.abs(t.y - e.y);
return {
xOffset: i,
yOffset: s,
manhattanDistance: i + s
}
}
_touchEndHandler(e) {
let t = _(e.changedTouches, Object(r.ensureNotNull)(this._activeTouchId));
if (null === t && 0 === e.touches.length && (t = e.changedTouches[0]), null === t)
return;
this._activeTouchId = null, this._lastTouchEventTimeStamp = p(e), this
._clearLongTapTimeout(), this._touchMoveStartPosition = null, this
._unsubscribeRootTouchEvents && (this._unsubscribeRootTouchEvents(), this
._unsubscribeRootTouchEvents = null);
const i = this._makeCompatEvent(e, t);
if (this._processTouchEvent(i, this._handler.touchEndEvent), ++this._tapCount, this
._tapTimeoutId && this._tapCount > 1) {
const {
manhattanDistance: e
} = this._touchMouseMoveWithDownInfo(u(t), this._tapPosition);
e < 30 && !this._cancelTap && this._processTouchEvent(i, this._handler
.doubleTapEvent), this._resetTapTimeout()
} else this._cancelTap || (this._processTouchEvent(i, this._handler.tapEvent), this
._handler.tapEvent && Object(o.a)(e));
0 === this._tapCount && Object(o.a)(e), 0 === e.touches.length && this
._longTapActive && (this._longTapActive = !1, Object(o.a)(e))
}
_mouseUpHandler(e) {
if (0 !== e.button) return;
const t = this._makeCompatEvent(e);
if (this._mouseMoveStartPosition = null, this._mousePressed = !1, this
._unsubscribeRootMouseEvents && (this._unsubscribeRootMouseEvents(), this
._unsubscribeRootMouseEvents = null), s.isFF) {
this._target.ownerDocument.documentElement.removeEventListener("mouseleave",
this._onFirefoxOutsideMouseUp)
}
if (!this._firesTouchEvents(e))
if (this._processMouseEvent(t, this._handler.mouseUpEvent), ++this._clickCount,
this._clickTimeoutId && this._clickCount > 1) {
const {
manhattanDistance: i
} = this._touchMouseMoveWithDownInfo(u(e), this._clickPosition);
i < 5 && !this._cancelClick && this._processMouseEvent(t, this._handler
.mouseDoubleClickEvent), this._resetClickTimeout()
} else this._cancelClick || this._processMouseEvent(t, this._handler
.mouseClickEvent)
}
_clearLongTapTimeout() {
null !== this._longTapTimeoutId && (clearTimeout(this._longTapTimeoutId), this
._longTapTimeoutId = null)
}
_touchStartHandler(e) {
if (null !== this._activeTouchId) return;
const t = e.changedTouches[0];
this._activeTouchId = t.identifier, this._lastTouchEventTimeStamp = p(e);
const i = this._target.ownerDocument.documentElement;
this._cancelTap = !1, this._touchMoveExceededManhattanDistance = !1, this
._preventTouchDragProcess = !1, this._touchMoveStartPosition = u(t), this
._unsubscribeRootTouchEvents && (this._unsubscribeRootTouchEvents(), this
._unsubscribeRootTouchEvents = null); {
const t = this._touchMoveHandler.bind(this),
s = this._touchEndHandler.bind(this);
this._unsubscribeRootTouchEvents = () => {
i.removeEventListener("touchmove", t), i.removeEventListener("touchend",
s)
}, i.addEventListener("touchmove", t, {
passive: !1
}), i.addEventListener("touchend", s, {
passive: !1
}), this._clearLongTapTimeout(), this._longTapTimeoutId = setTimeout(this
._longTapHandler.bind(this, e), 240)
}
const s = this._makeCompatEvent(e, t);
this._processTouchEvent(s, this._handler.touchStartEvent), this._tapTimeoutId || (
this._tapCount = 0, this._tapTimeoutId = setTimeout(this._resetTapTimeout
.bind(this), 500), this._tapPosition = u(t))
}
_wheelClickHandler(e) {
if (1 !== e.button) return;
if (this._firesTouchEvents(e)) return;
const t = this._makeCompatEvent(e);
this._processMouseEvent(t, this._handler.wheelClickEvent)
}
_mouseDownHandler(e) {
if (0 !== e.button) return;
const t = this._target.ownerDocument.documentElement;
s.isFF && t.addEventListener("mouseleave", this._onFirefoxOutsideMouseUp), this
._cancelClick = !1, this._mouseMoveStartPosition = u(e), this
._unsubscribeRootMouseEvents && (this._unsubscribeRootMouseEvents(), this
._unsubscribeRootMouseEvents = null); {
const e = this._mouseMoveWithDownHandler.bind(this),
i = this._mouseUpHandler.bind(this);
this._unsubscribeRootMouseEvents = () => {
t.removeEventListener("mousemove", e), t.removeEventListener("mouseup",
i)
}, t.addEventListener("mousemove", e), t.addEventListener("mouseup", i)
}
if (this._mousePressed = !0, this._firesTouchEvents(e)) return;
const i = this._makeCompatEvent(e);
this._processMouseEvent(i, this._handler.mouseDownEvent), this._clickTimeoutId || (
this._clickCount = 0, this._clickTimeoutId = setTimeout(this
._resetClickTimeout.bind(this), 500), this._clickPosition = u(e))
}
_init() {
this._target.addEventListener("mouseenter", this._mouseEnterHandler.bind(this)),
this._target.addEventListener("touchcancel", this._clearLongTapTimeout.bind(
this)); {
const e = this._target.ownerDocument,
t = e => {
this._handler.mouseDownOutsideEvent && (e.target && this._target
.contains(e.target) || this._handler.mouseDownOutsideEvent())
};
this._unsubscribeOutsideTouchEvents = () => {
e.removeEventListener("touchstart", t)
}, this._unsubscribeOutsideMouseEvents = () => {
e.removeEventListener("mousedown", t)
}, e.addEventListener("mousedown", t), e.addEventListener("touchstart", t, {
passive: !0
})
}
s.CheckMobile.iOS() && (this._unsubscribeMobileSafariEvents = () => {
this._target.removeEventListener("dblclick", this
._onMobileSafariDoubleClick)
}, this._target.addEventListener("dblclick", this
._onMobileSafariDoubleClick)), this._target.addEventListener("mouseleave",
this._mouseLeaveHandler.bind(this)), this._target.addEventListener(
"contextmenu", this._contextMenuHandler.bind(this)),
this._target.addEventListener("touchstart", this._touchStartHandler.bind(
this), {
passive: !0
}), Object(o.b)(this._target), this._target.addEventListener("mousedown", this
._mouseDownHandler.bind(this)), this._target.addEventListener(l, this
._wheelClickHandler.bind(this)), this._initPinch(), this._target
.addEventListener("touchmove", () => {}, {
passive: !1
})
}
_initPinch() {
void 0 === this._handler.pinchStartEvent && void 0 === this._handler.pinchEvent &&
void 0 === this._handler.pinchEndEvent || (this._target.addEventListener(
"touchstart", e => this._checkPinchState(e.touches), {
passive: !0
}), this._target.addEventListener("touchmove", e => {
if (2 === e.touches.length && null !== this
._startPinchMiddlePoint && void 0 !== this._handler.pinchEvent
) {
const t = d(e.touches[0], e.touches[1]) / this
._startPinchDistance;
this._handler.pinchEvent(this._startPinchMiddlePoint, t),
Object(o.a)(e)
}
}, {
passive: !1
}), this._target.addEventListener("touchend", e => {
this._checkPinchState(e.touches)
}))
}
_checkPinchState(e) {
1 === e.length && (this._pinchPrevented = !1), 2 !== e.length || this
._pinchPrevented || this._longTapActive ? this._stopPinch() : this._startPinch(
e)
}
_startPinch(e) {
const t = this._target.getBoundingClientRect() || {
left: 0,
top: 0
};
this._startPinchMiddlePoint = {
x: (e[0].clientX - t.left + (e[1].clientX - t.left)) / 2,
y: (e[0].clientY - t.top + (e[1].clientY - t.top)) / 2
}, this._startPinchDistance = d(e[0], e[1]), void 0 !== this._handler
.pinchStartEvent && this._handler.pinchStartEvent(), this._clearLongTapTimeout()
}
_stopPinch() {
null !== this._startPinchMiddlePoint && (this._startPinchMiddlePoint = null,
void 0 !== this._handler.pinchEndEvent && this._handler.pinchEndEvent())
}
_mouseLeaveHandler(e) {
if (this._unsubscribeMousemove && this._unsubscribeMousemove(), this
._firesTouchEvents(e)) return;
if (!this._acceptMouseLeave) return;
const t = this._makeCompatEvent(e);
this._processMouseEvent(t, this._handler.mouseLeaveEvent), this
._acceptMouseLeave = !s.CheckMobile.iOS()
}
_longTapHandler(e) {
const t = _(e.touches, Object(r.ensureNotNull)(this._activeTouchId));
if (null === t) return;
const i = this._makeCompatEvent(e, t);
this._processTouchEvent(i, this._handler.longTapEvent), this._processTouchEvent(i,
this._handler.touchContextMenuEvent), this._cancelTap = !0, this
._longTapActive = !0
}
_contextMenuHandler(e) {
if (Object(o.a)(e), null !== this._touchMoveStartPosition) return;
if (this._firesTouchEvents(e)) return;
const t = this._makeCompatEvent(e);
this._processMouseEvent(t, this._handler.contextMenuEvent), this._cancelClick = !0
}
_firesTouchEvents(e) {
return e.sourceCapabilities && void 0 !== e.sourceCapabilities.firesTouchEvents ? e
.sourceCapabilities.firesTouchEvents : p(e) < this._lastTouchEventTimeStamp +
500
}
_processTouchEvent(e, t) {
Object(a.setLastEventIsTouch)(!0), t && t.call(this._handler, e)
}
_processMouseEvent(e, t) {
"mouseleave" !== e.srcType && Object(a.setLastEventIsTouch)(!1), t && t.call(this
._handler, e)
}
_makeCompatEvent(e, t) {
const i = t || e,
s = this._target.getBoundingClientRect() || {
left: 0,
top: 0
};
return {
clientX: i.clientX,
clientY: i.clientY,
pageX: i.pageX,
pageY: i.pageY,
screenX: i.screenX,
screenY: i.screenY,
localX: i.clientX - s.left,
localY: i.clientY - s.top,
ctrlKey: e.ctrlKey,
altKey: e.altKey,
shiftKey: e.shiftKey,
metaKey: e.metaKey,
isTouch: !e.type.startsWith("mouse") && "contextmenu" !== e.type && "click" !==
e.type,
srcType: e.type,
target: i.target,
view: e.view,
preventDefault: () => {
"touchstart" !== e.type && Object(o.a)(e)
}
}
}
}
function u(e) {
return {
x: e.pageX,
y: e.pageY
}
}
function d(e, t) {
const i = e.clientX - t.clientX,
s = e.clientY - t.clientY;
return Math.sqrt(i * i + s * s)
}
function p(e) {
return e.timeStamp || performance.now()
}
function _(e, t) {
for (let i = 0; i < e.length; ++i)
if (e[i].identifier === t) return e[i];
return null
}
},
SMvR: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolHighlighter", (function() {
return n
}));
var s = i("Ocx9"),
r = i("DVnF");
class n extends r.a {
constructor(e, t) {
super(e, t || n.createProperties()), this._loadPaneViews(e)
}
properties() {
return super.properties()
}
smooth() {
return this.properties().childs().smooth.value()
}
name() {
return "Highlighter"
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolhighlighter", e);
return n._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "/a/6")).then(
e => e.HighlighterDefinitionsViewModel)
}
_loadPaneViews(e) {
i.e("lt-pane-views").then(i.bind(null, "uRW3")).then(t => {
this._setPaneViews([new t.HighlighterPaneView(this, e)])
})
}
static _configureProperties(e) {
r.a._configureProperties(e)
}
}
},
Si3H: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("0YCj"),
n = i.n(r),
o = i("ogJP");
i.d(t, "migrateMetaInfoAndPropState", (function() {
return l
}));
const a = [new class {
targetMetaInfoVersion() {
return 47
}
migrateMetaInfo(e) {
const t = e,
i = e;
if (i._metainfoVersion = 47, !t.defaults || void 0 === t.defaults.precision)
return void(i.format = {
type: "inherit"
});
const s = t.defaults && t.defaults.precision,
r = Object(o.isNumber)(s) ? s : parseInt(s);
0 === r ? i.format = {
type: "volume"
} : isFinite(r) ? i.format = {
type: "price",
precision: r
} : i.format = {
type: "inherit"
}, delete t.defaults.precision
}
migratePropState(e) {}
}, new class {
targetMetaInfoVersion() {
return 50
}
migrateMetaInfo(e) {
const t = e,
i = e;
if (i._metainfoVersion = 50, void 0 === t.defaults || void 0 === t.defaults
.ohlcPlots || void 0 === t.ohlcPlots) return;
const r = t.ohlcPlots,
n = t.defaults.ohlcPlots,
o = Object(s.ensureDefined)(Object(s.ensureDefined)(i.defaults)
.ohlcPlots);
for (const e of Object.keys(n)) {
const t = n[e];
if ("ohlc_candles" === t.plottype) {
let i = !1;
const s = r[e];
void 0 !== s && (i = !!s.drawBorder, delete s.drawBorder), o[e] = {
borderColor: "#000000",
drawBorder: i,
...t
}
}
}
}
migratePropState(e) {}
}];
function l(e, t) {
const i = n.a.versionOf(e),
r = e;
void 0 === r._serverMetaInfoVersion && (r._serverMetaInfoVersion = i), a.forEach(r => {
i < 0 || i >= r.targetMetaInfoVersion() || (r.migrateMetaInfo(e), void 0 !==
t && r.migratePropState(t), Object(s.assert)(e._metainfoVersion === r
.targetMetaInfoVersion()))
})
}
a.sort((function(e, t) {
return e.targetMetaInfoVersion() - t.targetMetaInfoVersion()
}))
},
SqfW: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return n
})), i.d(t, "a", (function() {
return o
}));
var s = i("tqok"),
r = i("hsV8");
function n(e, t) {
if (e.index >= t.length) return null;
const i = t[e.index];
return i === s.INVALID_TIME_POINT_INDEX ? null : {
startPrice: e.startPrice,
endPrice: e.endPrice,
index: i,
extendTop: e.extendTop,
extendBottom: e.extendBottom
}
}
function o(e, t, i) {
const s = Object(r.ensureTimePointIndexIndex)(i.indexOf(e.index));
return {
id: t,
...e,
index: s
}
}
},
Ss5c: function(e, t, i) {
"use strict";
var s = i("aO4+").Point,
r = i("dOnf").deepCopy,
n = i("4TVt").LineToolPriceAxisView,
o = i("fJhV").LineDataSourceTimeAxisView,
a = i("mMWL"),
l = i("LxhU").Interval,
c = i("txPx").getLogger("Chart.LineDataSource"),
h = i("FQhm"),
u = i("aIyQ"),
d = i("tc+8"),
p = i("Ocx9").DefaultProperty,
_ = i("Kxc7"),
m = i("0qMc").lineToolsLocalizedNames,
f = _.enabled("datasource_copypaste"),
g = i("ng+v").LineDataSourceBase,
b = i("0C7r").intervalsVisibilitiesDefaults;
class v extends g {
constructor(e, t) {
super(e, t), this._onTemplateApplying = new u, this._onTemplateApplied = new u, this
._properties.hasChild("interval") || this._properties.addChild("interval",
new d(e.mainSeries().interval())), this.calcIsActualSymbol(), this
._properties.intervalsVisibilities.listeners().subscribe(this, v.prototype
.calcIsActualSymbol);
var i = this;
if (this._properties.listeners().subscribe(this, (function(e) {
i.propertiesChanged()
})), this._createPointsProperties(), this.pointsCount() > 0)
for (var s = 0; s < this.pointsCount(); s++) this._priceAxisViews.push(this
.createPriceAxisView(s)), this._timeAxisViews.push(new o(this, s));
this._properties.visible.listeners().subscribe(this, (function(e) {
var t = !1 === a.hideAllDrawings().value();
e.value() ? e.value() && t && h.emit("drawing_event", this._id,
"show") : (i._model.selection().isSelected(this) && i._model
.selectionMacro((function(e) {
e.removeSourceFromSelection(i)
})), t && h.emit("drawing_event", this._id, "hide")), i
._onSourceHiddenMayChange()
})), a.hideAllDrawings().subscribe(this, this._onSourceHiddenMayChange), this
.customization = {
forcePriceAxisLabel: !1,
disableErasing: !1,
disableSave: !1,
showInObjectsTree: !0
}, this._syncStateExclusions = [], this._definitionsViewModel = null, this
._isDestroyed = !1, this._syncLineStyleMuted = !1
}
getType() {
return TradingView.className(this.constructor)
}
isSavedInChart(e) {
return !this.customization.disableSave
}
setSavingInChartEnabled(e) {
this.customization.disableSave = !e
}
showInObjectTree() {
return this.customization.showInObjectsTree
}
isAvailableInFloatingWidget() {
return !0
}
setShowInObjectsTreeEnabled(e) {
this.customization.showInObjectsTree = e
}
visibilityKeyByInterval(e) {
var t, i = l.parse(e);
return v.IntervalsVisibilities.forEach((function(e) {
e.kind === i.kind() && e.from <= i.multiplier() && e.to >= i
.multiplier() && (t = e.key)
})), t
}
priceScale() {
return this._ownerSource ? this._ownerSource.m_priceScale : null
}
symbol() {
return this._properties.symbol.value()
}
properties() {
return this._properties
}
isSavedInStudyTemplates() {
return !1
}
state(e) {
var t = {
type: TradingView.className(this.constructor),
id: this.id(),
state: this.properties().state(this._propertiesStateExclusions()),
points: r(this._timePoint),
zorder: this.zorder()
};
return this.linkKey().value() && (t.linkKey = this.linkKey().value()), delete t
.state.points, e && (t.indexes = this._points), this.ownerSource() && (t
.ownerSource = this.ownerSource().id()), this.isFixed() && (t
.positionPercents = this._positionPercents || this.calcPositionPercents()),
"version" in this && 1 !== this.version && (t.version = this.version), this
.hasAlert.value() && (t.alertId = this._alertId), t
}
_propertiesStateExclusions() {
return null
}
template() {
return this.properties().preferences()
}
applyTemplate(e) {
this._onTemplateApplying.fire(e), this._applyTemplateImpl(e), this
.calcIsActualSymbol(), this.updateAllViews(), this.model().lightUpdate(), this
._onTemplateApplied.fire()
}
_applyTemplateImpl(e) {
var t = this.properties();
t.mergePreferences(e), t.saveDefaults(), this.propertiesChanged()
}
restoreExternalState(e) {
this.properties().mergeAndFire(e)
}
restorePositionPercents(e) {
this._positionPercents = e
}
propertiesChanged(e) {
this.calcIsActualInterval(), this.updateAllViewsAndRedraw(), e || this
._syncLineStyleIfNeeded()
}
syncLineStyleState() {
const e = this.properties().state(this._syncStateExclusions);
return delete e.interval, e
}
_syncLineStyleIfNeeded() {
!this._syncLineStyleMuted && this.linkKey().value() && a.changeLineStyle({
linkKey: this.linkKey().value(),
state: this.syncLineStyleState(),
model: this._model
})
}
_muteSyncLineStyle() {
this._syncLineStyleMuted = !0
}
_unmuteSyncLineStyleWithoutApplyingChanges() {
this.propertiesChanged(), this._syncLineStyleMuted = !1
}
fixedPoints() {
var e = [];
if (this._positionPercents && !this.priceScale().isEmpty())
for (var t = 0; t < this._positionPercents.length; t++) {
var i = this._positionPercents[t],
r = this._model.timeScale().width() * i.x,
n = this.priceScale().height() * i.y;
e.push(new s(r, n))
} else
for (t = 0; t < this._fixedPoints.length; t++) e.push(this._fixedPoints[t]
.clone());
return this._lastPoint && e.push(this._lastPoint.clone()), this
._currentMovingPoint && this._startMovingPoint && this._correctFixedPoints(e), e
}
addFixedPoint(e) {
this._fixedPoints.push(e);
var t = this._fixedPoints.length === this.pointsCount();
return t && this.calcPositionPercents(), t
}
calcPositionPercents() {
if (!this.priceScale() || this.priceScale().isEmpty()) return [];
this._positionPercents = [];
for (var e = 0; e < this._fixedPoints.length; e++) {
var t = this._fixedPoints[e],
i = t.x / this._model.timeScale().width(),
s = t.y / this.priceScale().height();
this._positionPercents.push({
x: i,
y: s
})
}
return this._positionPercents
}
calcMiddlePoint(e, t) {
return new s((e.x + t.x) / 2, (e.y + t.y) / 2)
}
getPointByPosition(e, t, i, s) {
return [t, i, s][e]
}
restoreFixedPoints() {
this._fixedPoints = this.fixedPoints()
}
dataWindowView() {
return null
}
statusView() {
return null
}
isSynchronizable() {
return this.priceScale() === this._model.mainSeries().priceScale()
}
priceAxisViews(e, t) {
if (t !== this.priceScale() || this.isSourceHidden()) return null;
if (this._model.lineBeingEdited() === this) {
var i = this._model.linePointBeingEdited();
if (null !== i && i < this._priceAxisViews.length) {
var s = this._priceAxisViews.slice(),
r = s[i];
return s.splice(i, 1), s.push(r), s
}
return this._priceAxisViews
}
return this._priceAxisViews
}
timeAxisViews() {
if (this.isSourceHidden()) return null;
if (this._model.lineBeingEdited() === this) {
var e = this._model.linePointBeingEdited();
if (null !== e && e < this._timeAxisViews.length) {
var t = this._timeAxisViews.slice(),
i = t[e];
return t.splice(e, 1), t.push(i), t
}
return this._timeAxisViews
}
return this._timeAxisViews
}
updateAllViews() {
if (!this._isActualSymbol || !this._isActualCurrency || !this._isActualUnit)
return null;
if (!this._properties.visible.value()) return null;
this._updateAllPaneViews();
for (var e = this._priceAxisViews, t = 0; t < e.length; t++) e[t].update();
for (e = this._timeAxisViews, t = 0; t < e.length; t++) e[t].update()
}
setLastFixedPoint(e) {
this._lastFixedPoint = e, this.updateAllViews()
}
title() {
return this.translatedType()
}
translatedType() {
return void 0 !== m[this.toolname] ? m[this.toolname] : "Line Tool"
}
name() {
return "Line Tool"
}
isBeingEdited() {
return this === this._model.lineBeingEdited() || this === this._model
.sourceBeingMoved
}
isFixed() {
return !1
}
isLocked() {
return this.properties().frozen && this.properties().frozen.value()
}
pointToScreenPoint(e) {
var t = this._model.timeScale(),
i = this.priceScale(),
r = this.ownerSource().firstValue();
if (!i || i.isEmpty() || t.isEmpty() || null == r) return [new s(0, 0), new s(0,
0)];
var n = t.indexToCoordinate(e.index, !0),
o = e.price,
a = i.priceToCoordinate(o, r),
l = new s(n, a);
n = t.indexToCoordinate(e.index, !1), a = i.priceToCoordinate(o, r);
return [l, new s(n, a)]
}
screenPointToPoint(e) {
var t = this._model.timeScale(),
i = this.priceScale(),
s = t.coordinateToIndex(e.x),
r = this.ownerSource().firstValue();
if (null !== r && isFinite(r)) return {
price: i.coordinateToPrice(e.y, r),
index: s
}
}
tags() {
return [this.toolname]
}
createPriceAxisView(e) {
return new n(this, {
pointIndex: e
})
}
alertId() {
return this._alertId
}
setAlert(e, t) {
throw new Error("not implemented")
}
removeAlert() {
delete this._alertId, delete this._alert, this.hasAlert.setValue(!1)
}
_processAlertHandlers(e) {
var t, i, s = this;
if ("unsubscribe" !== (e = "subscribe" === e ? "subscribe" : "unsubscribe") || s
._alertCallbacks) {
i = "subscribe" === e ? "on" : "off", t = s.properties();
var r = s._alertCallbacks || {
remove: s.removeAlert.bind(s),
hovered: function(e, t) {
var i = s._model.hoveredSource() === s;
t && !i ? s._model.setHoveredSource(s, null) : !t && i && s
._model.setHoveredSource(null, null)
},
selected: function(e, t) {
t && s._model.selectionMacro((function(e) {
e.addSourceToSelection(s)
}))
},
synchronizeSilently: function(e) {
s.synchronizeAlert(!1)
}
};
s._alertCallbacks || (s._alertCallbacks = r), s.getAlert().then((function(n) {
n && (n[i]("destroy", r.remove), n[i]("change:hovered", r
.hovered), n[i]("change:selected", r.selected), t
.extendLeft && t.extendLeft[e](s, r
.synchronizeSilently), t.extendRight && t
.extendRight[e]
(s, r.synchronizeSilently))
}))
}
}
editAlert(e) {}
getAlert() {
throw new Error("not implemented")
}
getAlertSync() {
return null
}
synchronizeAlert(e) {}
_getUndoHistory() {
return this._model._undoModel.undoHistory()
}
stateForAlert() {
if (!this.canHasAlert()) return null;
var e = this.state();
e.id = this.idForAlert(), e.uniqueId = this.idForAlert(), e.title = this.title(), e
.interval = this._model.mainSeries().interval();
var t = this._getAlertPlots();
return t && (e.plots = t), e
}
_getAlertPlots() {
return null
}
_linePointsToAlertPlot(e, t, i, s) {
if (2 !== e.length) return c.logError("[Drawing Alert] Wrong points"), null;
var r = this._model.timeScale();
return !r || r.isEmpty() ? null : {
type: "LinePlot",
title: t || this.title(),
timestamp: r.indexToTimePoint(0),
offset1: e[0].index,
offset2: e[1].index,
price1: e[0].price,
price2: e[1].price,
extendBackward: i || !1,
extendForward: s || !1
}
}
getAlertIsActive() {
return !1
}
geometry() {
var e = this;
return this.points().map((function(t) {
return function(t) {
var i = t.x / e._model.timeScale().width(),
r = t.y / e.priceScale().height();
return new s(i, r)
}(e.pointToScreenPoint(t)[0])
}))
}
model() {
return this._model
}
isForcedDrawPriceAxisLabel() {
return this.customization.forcePriceAxisLabel
}
_getPropertyDefinitionsViewModelClass() {
return Promise.resolve(null)
}
getPropertyDefinitionsViewModel() {
if (null === this._definitionsViewModel) {
var e = this;
return e._getPropertyDefinitionsViewModelClass().then((function(t) {
return null === t || e._isDestroyed ? null : (null === e
._definitionsViewModel && (e._definitionsViewModel =
new t(e._model.undoModel(), e)), e
._definitionsViewModel)
}))
}
return Promise.resolve(this._definitionsViewModel)
}
hasEditableCoordinates() {
return !0
}
getSourceIcon() {
return {
type: "loadSvg",
svgId: "linetool." + this.getType()
}
}
destroy() {
super.destroy(), this.stop(), null !== this._definitionsViewModel && (this
._definitionsViewModel.destroy(), this._definitionsViewModel = null),
null !== this._ownerSource && (this._ownerSource.currencyChanged()
.unsubscribeAll(this), this._ownerSource.unitChanged().unsubscribeAll(this)
), a.hideAllDrawings().unsubscribeAll(this), this._isDestroyed = !0
}
getOrderTemplate() {
return null
}
copiable() {
return f
}
cloneable() {
return null !== this._ownerSource && null !== this._ownerSource.firstValue()
}
movable() {
return !0
}
static _configureProperties(e) {
if (g._addCollectedProperties(e), e.hasChild("symbolStateVersion") || e.addChild(
"symbolStateVersion", new d(g._initialSymbolStateVersion())), e.hasChild(
"zOrderVersion") || e.addChild("zOrderVersion", new d(g
._initialZOrderVersion())), e.hasChild("visible") || e.addChild("visible",
new d(!0)), e.hasChild("frozen") || e.addChild("frozen", new d(!1)), e
.hasChild("symbol") || e.addChild("symbol", new d("")), e.hasChild(
"currencyId") || e.addChild("currencyId", new d(null)), e.hasChild(
"unitId") ||
e.addChild("unitId", new d(null)), e instanceof p && (e.addExclusion(
"symbolStateVersion"), e.addExclusion("zOrderVersion"), e.addExclusion(
"visible"), e.addExclusion("frozen"), e.addExclusion("symbol"), e
.addExclusion("currencyId"), e.addExclusion("unitId")), e.hasChild(
"intervalsVisibilities")) {
const t = e.childs().intervalsVisibilities,
i = t.state();
t.merge(b), t.merge(i)
} else e.addChild("intervalsVisibilities", new d(b));
e.hasChild("title") || e.addChild("title", new d("")), e instanceof p && (e
.addExclusion("symbolInfo"), e.addExclusion("points"), e.addExclusion(
"interval"), e.addExclusion("title")), e.hasChild("singleChartOnly") &&
e.removeProperty("singleChartOnly")
}
}
v.prototype.version = 1, t.LineToolPriceAxisView = n, t.LineDataSource = v
},
SwuQ: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "unitConvertibleGroups", (function() {
return n
})), i.d(t, "sourceNewUnitOnPinningToPriceScale", (function() {
return o
}));
var s = i("/tGj"),
r = i("n5al");
function n(e, t, i) {
const s = Object(r.symbolUnitConvertibleGroupsIfExist)(e);
if (null !== s) return s;
const n = i.unitGroupById(t);
return null === n ? [] : [n]
}
function o(e, t, i, r) {
let o = null;
if (i.unitConversionEnabled() && Object(s.isSymbolSource)(e)) {
const s = i.availableUnits(),
a = t.unit(s),
l = e.unit(),
c = null === l ? [] : n(e.symbolInfo(), l, s);
null !== a && null !== a.selectedUnit && !a.allUnitsAreOriginal && a.selectedUnit !==
l && (r && null === l || null !== l && s.convertible(l, c)) && (o = a.selectedUnit)
}
return o
}
},
SzKR: function(e, t, i) {},
T6Of: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LimitedPrecisionNumericFormatter", (function() {
return r
}));
var s = i("ogJP");
class r {
constructor(e = 1) {
this._precision = e
}
format(e) {
Object(s.isNumber)(e) || (e = parseFloat(e));
const t = e.toFixed(this._precision),
i = Math.pow(10, -this._precision);
return Math.max(parseFloat(t), i) + ""
}
parse(e) {
const t = parseFloat(e);
return isNaN(t) ? {
res: !1
} : {
res: !0,
value: t,
suggest: this.format(t)
}
}
}
},
TBaH: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolGannFixed", (function() {
return a
}));
var s = i("aO4+"),
r = i("Ss5c"),
n = i("j3hX"),
o = i("LAp3");
class a extends r.LineDataSource {
constructor(e, t) {
super(e, t || a.createProperties()), this._constructor = "LineToolGannFixed", i
.e("lt-pane-views").then(i.bind(null, "wdUH")).then(({
GannFixedPaneView: e
}) => {
this._setPaneViews([new e(this, this.model())])
}), this.properties().childs().reverse.subscribe(this, this._reversePoints)
}
pointsCount() {
return 2
}
name() {
return "Gann Square Fixed"
}
properties() {
return super.properties()
}
axisPoints() {
const e = this.points(),
t = this.getScreenPoints();
return e.length < 2 || t.length < 2 ? [] : [e[0], this.screenPointToPoint(t[1])]
}
getScreenPoints() {
const e = this.points();
if (e.length < 2) return [];
const t = this._calcAngle();
if (null === t) return [];
const [i, r] = e, n = this.pointToScreenPoint(i)[0], o = this
.pointToScreenPoint(r)[0], a = Math.sqrt(Math.pow(n.x - o.x, 2) + Math.pow(n
.y - o.y, 2)), l = new s.Point(Math.cos(t), -Math.sin(t)), c = l
.normalized(), h = c.x < 0 ? -1 : 1, u = c.y < 0 ? -1 : 1;
return [n.addScaled(l, a), n.add(new s.Point(5 * a * h, 5 * a * u))]
}
levelsCount() {
return this.properties().childs().levels.childCount()
}
levels() {
const e = [],
t = this.properties().childs(),
i = t.levels.childCount();
for (let s = 0; s < i; s++) {
const i = t.levels.childs()[s].childs();
e.push({
index: s,
visible: i.visible.value(),
color: i.color.value(),
width: i.width.value()
})
}
return e
}
fanLinesCount() {
return this.properties().childs().fanlines.childCount()
}
fanLines() {
const e = [],
t = this.properties().childs(),
i = t.fanlines.childCount();
for (let s = 0; s < i; s++) {
const i = t.fanlines.childs()[s].childs();
e.push({
index: s,
visible: i.visible.value(),
x: i.x.value(),
y: i.y.value(),
color: i.color.value(),
width: i.width.value()
})
}
return e
}
arcsCount() {
return this.properties().childs().arcs.childCount()
}
arcs() {
const e = [],
t = this.properties().childs(),
i = t.arcs.childCount();
for (let s = 0; s < i; s++) {
const i = t.arcs.childs()[s].childs();
e.push({
index: s,
visible: i.visible.value(),
x: i.x.value(),
y: i.y.value(),
color: i.color.value(),
width: i.width.value()
})
}
return e
}
arcsBackgroundTransparency() {
return this.properties().childs().arcsBackground.childs().transparency.value()
}
isArcsBackgroundFilled() {
return this.properties().childs().arcsBackground.childs().fillBackground.value()
}
static createProperties(e) {
const t = Object(o.a)("linetoolgannfixed", e);
return a._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "WfUZ")).then(
e => e.GannComplexAndFixedDefinitionsViewModel)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e);
const t = [],
i = [],
s = e.childs(); {
const e = s.levels.childCount();
for (let r = 0; r < e; r++) {
const e = s.levels.childs()[r].childs();
t.push(e.width), i.push(e.color)
}
} {
const e = s.fanlines.childCount();
for (let r = 0; r < e; r++) {
const e = s.fanlines.childs()[r].childs();
t.push(e.width), i.push(e.color)
}
} {
const e = s.arcs.childCount();
for (let r = 0; r < e; r++) {
const e = s.arcs.childs()[r].childs();
t.push(e.width), i.push(e.color)
}
}
e.addChild("linesColors", new n.LineToolColorsProperty(i)), e.addChild(
"linesWidths", new n.LineToolWidthsProperty(t))
}
_calcAngle() {
const e = this.points();
if (e.length < 2) return null;
const [t, i] = e, s = this.pointToScreenPoint(t)[0];
let r = this.pointToScreenPoint(i)[0].subtract(s);
if (r.length() <= 0) return null;
r = r.normalized();
let n = Math.acos(r.x);
return r.y > 0 && (n = -n), n
}
_reversePoints() {
const [e, t] = this._points;
this._points[0] = t, this._points[1] = e, this.normalizePoints(), this.restart()
}
}
},
TCfT: function(e, t, i) {
"use strict";
i.r(t);
var s = i("sQaR");
i.d(t, "CompareDialogRenderer", (function() {
return r
}));
class r extends s.a {
constructor(e) {
super(), this._dialog = null, this._subscribe = e => {
this._setVisibility(e)
}, this._chartWidgetCollection = e
}
show() {
this._load().then(e => {
var t, i;
null === (t = this._dialog) || void 0 === t || t.hide(), null === (
i = this._dialog) || void 0 === i || i.visible()
.unsubscribe(this._subscribe), this._dialog = e, e.visible()
.subscribe(this._subscribe), e.show()
})
}
hide() {
var e;
null === (e = this._dialog) || void 0 === e || e.hide()
}
_load() {
return Promise.all([i.e("compare-model").then(i.bind(null, "cK0E")), Promise
.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(8), i
.e(9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(19), i.e(21),
i.e(26), i.e(69), i.e(82), i.e(0), i.e(2), i.e(7), i.e(10),
i.e(18), i.e(20), i.e(25), i.e("add-compare-dialog")
]).then(i.bind(null, "a+BI"))
]).then(([e, t]) => {
const i = new e.CompareModel(this._chartWidgetCollection);
return t.getCompareDialogRenderer(i)
})
}
}
},
TMWk: function(e, t, i) {
"use strict";
var s = i("Eyy1").assert,
r = i("ogJP").clone,
n = i("GVHu").Study,
o = i("k9/m").PlotList,
a = i("w4Ji").studyPlotFunctionMap,
l = i("w4Ji").studyEmptyPlotValuePredicate;
class c {
constructor(e, t, i) {
this._strategyPlotIndex = e, this._targetPlotIndex = t, this._startIndex = i
}
rebuildData(e) {
var t = this._targetPlotIndex + 1,
i = this._strategyPlotIndex + 1,
s = null,
r = null;
e.range(this._startIndex || e.firstIndex(), e.lastIndex()).each((function(n, o) {
var a = o[t],
l = o[i] ? Math.round(o[i]) : null;
if (o[t] = null, o[i] = null, !l || l > 0) return !1;
var c = n + l,
h = {
pointIndex: c,
value: a
};
if (r) {
if (r.pointIndex !== h.pointIndex) {
c >= 0 && (e.valueAt(c)[t] = a);
var u = !1;
s && (u = s.value <= r.value && r.value <= a || s.value >= r
.value && r.value >= a), u ? r.pointIndex >= 0 && (e
.valueAt(r.pointIndex)[t] = null) : s = r, r = h
}
} else r = h;
return !1
}))
}
}
t.study_ScriptWithDataOffset = class extends n {
constructor(e, t, i, s) {
super(e, t, i, s), this._underlyingData = new o(a(s), l)
}
clearData() {
super.clearData(), this._underlyingData.clear()
}
_mergeData(e) {
this._invalidateLastNonEmptyPlotRowCache();
var t = this._underlyingData.firstIndex();
this._underlyingData.merge(e), t !== this._underlyingData.firstIndex() && (this
.m_data = new o(a(this._metaInfo), l));
var i = this.m_data.lastIndex();
this._underlyingData.range(i, this._underlyingData.lastIndex()).each(function(e,
t) {
return this.m_data.add(e, r(t)), !1
}.bind(this)), this._plotsForStrategyProcessing().forEach((function(e) {
new c(e.strategyIndex, e.targetIndex, i).rebuildData(this
.m_data)
}), this)
}
_plotsForStrategyProcessing() {
var e = [];
return this._metaInfo.plots.forEach((function(t, i) {
if ("dataoffset" === t.type) {
var r = this._metaInfo.plots.findIndex((function(e) {
return e.id === t.target
}));
s(r >= 0, "target plot not found for strategy plot " + t
.id);
var n = {
strategyIndex: i,
targetIndex: r
};
e.push(n)
}
}), this), e
}
}
},
TTFo: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "fromPercent", (function() {
return n
})), i.d(t, "toPercent", (function() {
return o
})), i.d(t, "toPercentRange", (function() {
return a
})), i.d(t, "fromIndexedTo100", (function() {
return l
})), i.d(t, "toIndexedTo100", (function() {
return c
})), i.d(t, "toIndexedTo100Range", (function() {
return h
})), i.d(t, "toLog", (function() {
return u
})), i.d(t, "fromLog", (function() {
return d
}));
var s = i("Qb4w"),
r = i("Hr11");
function n(e, t) {
return t < 0 && (e = -e), e / 100 * t + t
}
function o(e, t) {
const i = 100 * (e - t) / t;
return t < 0 ? -i : i
}
function a(e, t) {
const i = o(e.minValue(), t),
r = o(e.maxValue(), t);
return new s.PriceRange(i, r)
}
function l(e, t) {
return t < 0 && (e = -e), (e -= 100) / 100 * t + t
}
function c(e, t) {
const i = 100 * (e - t) / t + 100;
return t < 0 ? -i : i
}
function h(e, t) {
const i = c(e.minValue(), t),
r = c(e.maxValue(), t);
return new s.PriceRange(i, r)
}
function u(e) {
const t = Math.abs(e);
if (t < 1e-8) return 0;
const i = Object(r.log10)(t + 1e-4) + 4;
return e < 0 ? -i : i
}
function d(e) {
const t = Math.abs(e);
if (t < 1e-8) return 0;
const i = Math.pow(10, t - 4) - 1e-4;
return e < 0 ? -i : i
}
},
TcSq: function(e, t, i) {
"use strict";
function s(e) {
return e === r(e)
}
function r(e) {
const t = e.indexOf("$"),
i = e.indexOf("@");
return t < 0 && i >= 0 ? null : e.substring(Math.max(t + 1, 0), i >= 0 ? i : e.length)
}
function n(e) {
return e.startsWith("PUB;")
}
function o(e) {
return e.startsWith("USER;")
}
function a(e) {
return e.startsWith("STD;")
}
function l(e) {
return e.includes("Candlestick%1Pattern%1")
}
function c(e) {
return e.startsWith("EDGR_")
}
i.r(t), i.d(t, "isPineIdString", (function() {
return s
})), i.d(t, "extractPineId", (function() {
return r
})), i.d(t, "isPublishedPineId", (function() {
return n
})), i.d(t, "isCustomPineId", (function() {
return o
})), i.d(t, "isStandardPineId", (function() {
return a
})), i.d(t, "isCandleStickId", (function() {
return l
})), i.d(t, "isEdgrPineId", (function() {
return c
}))
},
TlGQ: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "visitObject", (function() {
return n
}));
var s = i("ogJP");
function r(e, t, i) {
return Object(s.isArray)(e) ? function(e, t, i) {
return e.map(e => {
const s = r(e, t, i),
n = t(s);
return void 0 !== n ? n : s
})
}(e, t, i) : Object(s.isObject)(e) && (Object(s.isHashObject)(e) || i && i
.visitInstances) ? function(e, t, i) {
const s = {};
return Object.keys(e).forEach(n => {
const o = r(e[n], t, i),
a = t(o);
s[n] = void 0 !== a ? a : o
}), s
}(e, t, i) : e
}
function n(e, t, i) {
const s = r(e, t, i),
n = t(s);
return void 0 !== n ? n : s
}
},
TmNs: function(e, t, i) {
"use strict";
i.r(t);
var s = i("KcY8"),
r = i("Eyy1"),
n = i("jFln"),
o = i("8Uy/"),
a = i("gAom");
class l {
constructor(e, t) {
this.setData(e, t)
}
setData(e, t) {
this._data = e, this._commonData = t
}
draw(e, t, i, s, l, c) {
if (!this._data.visible) return;
let h = this._commonData.coordinate;
void 0 !== this._commonData.fixedCoordinate && (h = this._commonData
.fixedCoordinate), e.lineWidth = Math.max(1, Math.floor(Object(r
.ensureDefined)(this._data.linewidth) * c)), e.lineCap = "butt", Object(n
.setLineStyle)(e, void 0 === this._data.linestyle ? o.LINESTYLE_DOTTED :
this._data.linestyle), e.strokeStyle = this._commonData.textColor, Object(a
.drawHorizontalLine)(e, Math.round(h * c), 0, Math.ceil(s * c))
}
height(e) {
return 0
}
}
i.d(t, "PriceLineAxisView", (function() {
return c
})), i.d(t, "SeriesPriceLineAxisView", (function() {
return h
})), i.d(t, "StudyPriceLineAxisView", (function() {
return u
}));
class c extends s.a {
constructor(e) {
super(e || l)
}
ignoreAlignment() {
return !0
}
_updateRendererData(e, t, i) {
if (t.visible = !1, e.visible = !1, !this._isVisible()) return;
const s = this._value();
s.noData || (i.background = "", i.textColor = this._priceLineColor(s.color), i
.coordinate = s.coordinate, i.floatCoordinate = s.floatCoordinate, e
.linewidth = this._lineWidth(), e.linestyle = this._lineStyle(), e
.backgroundAreaVisible = this._backgroundAreaVisible(), e
.backgroundAreaColor = this._backgroundAreaColor(), e
.backgroundAreaHeight = this._backgroundAreaHeight(), e.visible = !0)
}
_lineStyle() {
return o.LINESTYLE_DOTTED
}
_backgroundAreaVisible() {
return !1
}
_backgroundAreaColor() {
return ""
}
_backgroundAreaHeight() {
return 0
}
}
class h extends c {
constructor(e) {
super(), this._series = e
}
_value() {
return this._series.lastValueData(void 0, !0)
}
_priceLineColor(e) {
return this._series.priceLineColor(e)
}
_lineWidth() {
return this._series.properties().priceLineWidth.value()
}
_isVisible() {
const e = this._series.model().properties().scalesProperties.showSeriesLastValue
.value();
return this._series.properties().showPriceLine.value() && e
}
}
class u extends c {
constructor(e, t) {
super(), this._study = e, this._plotname = t
}
_value() {
return this._study.lastValueData(this._plotname, !0)
}
_lineWidth() {
return this._study.properties().styles[this._plotname].linewidth.value()
}
_lineStyle() {
return o.LINESTYLE_DOTTED
}
_priceLineColor(e) {
return e
}
_isVisible() {
const e = this._study.model().properties().scalesProperties.showStudyLastValue
.value();
return this._study.properties().styles[this._plotname].trackPrice.value() && e
}
}
},
Tmoa: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "generateColor", (function() {
return r
})), i.d(t, "alphaToTransparency", (function() {
return n
})), i.d(t, "transparencyToAlpha", (function() {
return o
})), i.d(t, "applyTransparency", (function() {
return a
})), i.d(t, "resetTransparency", (function() {
return l
})), i.d(t, "getLuminance", (function() {
return c
})), i.d(t, "isHexColor", (function() {
return h
})), i.d(t, "colorFromBackground", (function() {
return u
})), i.d(t, "gradientColorAtPercent", (function() {
return d
})), i.d(t, "isColorDark", (function() {
return p
})), i.d(t, "rgbaFromInteger", (function() {
return _
})), i.d(t, "rgbaToInteger", (function() {
return m
})), i.d(t, "colorToInteger", (function() {
return f
}));
var s = i("eJTA");
function r(e, t, i) {
if (t = t || 0, !h(e)) return i ? Object(s.rgbaToString)(Object(s.rgba)(Object(s.parseRgb)(
e), Object(s.normalizeAlphaComponent)(o(t)))) : e;
const [r, n, a] = Object(s.parseRgb)(e), l = Object(s.normalizeAlphaComponent)(o(t));
return Object(s.rgbaToString)([r, n, a, l])
}
function n(e) {
return 100 * (1 - e)
}
function o(e) {
if (e < 0 || e > 100) throw new Error("invalid transparency");
return 1 - e / 100
}
function a(e, t) {
if ("transparent" === e) return e;
const i = Object(s.parseRgba)(e),
r = i[3];
return Object(s.rgbaToString)(Object(s.rgba)(i[0], i[1], i[2], o(t) * r))
}
function l(e) {
return "transparent" === e || h(e) ? e : Object(s.rgbaToString)(Object(s.rgba)(Object(s
.parseRgb)(e), Object(s.normalizeAlphaComponent)(1)))
}
function c(e) {
const t = Object(s.parseRgb)(e).map(e => (e /= 255) <= .03928 ? e / 12.92 : Math.pow((e +
.055) / 1.055, 2.4));
return Number((.2126 * t[0] + .7152 * t[1] + .0722 * t[2]).toFixed(3))
}
function h(e) {
return 0 === e.indexOf("#")
}
function u(e) {
return "black" === Object(s.rgbToBlackWhiteString)(Object(s.parseRgb)(e), 150) ? "#ffffff" :
"#000000"
}
function d(e, t, i) {
const [r, n, o, a] = Object(s.parseRgba)(e), [l, c, h, u] = Object(s.parseRgba)(t), d =
Object(s.rgba)(Math.round(r + i * (l - r)), Math.round(n + i * (c - n)), Math.round(o +
i * (h - o)), a + i * (u - a));
return Object(s.rgbaToString)(d)
}
function p(e) {
return c(l(e)) < .5
}
function _(e) {
const t = (e = Math.round(e)) % 256;
e -= t;
const i = (e /= 256) % 256;
e -= i;
const s = (e /= 256) % 256;
e -= s;
return `rgba(${t},${i},${s},${(e /= 256) / 255})`
}
function m(e) {
const t = Math.round(255 * e[3]);
return e[0] + 256 * e[1] + 65536 * e[2] + 16777216 * t
}
function f(e) {
const t = Object(s.tryParseRgba)(e);
return null === t ? 0 : m(t)
}
},
TohL: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolArrowMark", (function() {
return l
})), i.d(t, "LineToolArrowMarkLeft", (function() {
return c
})), i.d(t, "LineToolArrowMarkUp", (function() {
return h
})), i.d(t, "LineToolArrowMarkRight", (function() {
return u
})), i.d(t, "LineToolArrowMarkDown", (function() {
return d
}));
var s = i("Ocx9"),
r = i("Ss5c"),
n = i("tc+8"),
o = i.n(n),
a = i("j3hX");
class l extends r.LineDataSource {
constructor(e, t, s) {
const r = t || l.createProperties(null, s);
super(e, r), this._textPaneView = null, i.e("lt-pane-views").then(i.bind(null,
"ct+2")).then(({
ArrowMarkPaneView: t
}) => {
const i = [new t(this, e)];
this._setPaneViews(i)
})
}
paneViews(e) {
const t = super.paneViews();
return null !== t && this._textPaneView && t.push(this._textPaneView), t
}
pointsCount() {
return 1
}
template() {
const e = super.template();
return e.text = this.properties().childs().text.value(), e
}
static createProperties(e, t) {
const i = new s.DefaultProperty(t, e);
return l._configureProperties(i), i
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "5sLb")).then(
e => e.ArrowMarkDefinitionsViewModel)
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e), e.addChild("linesColors", new a
.LineToolColorsProperty([e.childs().arrowColor])), e.addChild(
"textsColors", new a.LineToolColorsProperty([e.childs().color])), e
.hasChild("text") || e.addChild("text", new o.a("")), e.addExclusion("text")
}
}
l.version = 2;
class c extends l {
constructor(e, t) {
super(e, t, "linetoolarrowmarkleft")
}
direction() {
return "left"
}
name() {
return "Arrow Mark Left"
}
textAlignParams() {
return {
horzAlign: "left",
vertAlign: "middle",
offsetX: 22,
offsetY: 3
}
}
static createProperties(e) {
return l.createProperties(e, "linetoolarrowmarkleft")
}
}
class h extends l {
constructor(e, t) {
super(e, t, "linetoolarrowmarkup")
}
direction() {
return "up"
}
name() {
return "Arrow Mark Up"
}
textAlignParams() {
return {
horzAlign: "center",
vertAlign: "top",
offsetX: 0,
offsetY: 20
}
}
static createProperties(e) {
return l.createProperties(e, "linetoolarrowmarkup")
}
}
class u extends l {
constructor(e, t) {
super(e, t, "linetoolarrowmarkright")
}
direction() {
return "right"
}
name() {
return "Arrow Mark Right"
}
textAlignParams() {
return {
horzAlign: "right",
vertAlign: "middle",
offsetX: 22,
offsetY: 3,
forceTextAlign: !0
}
}
static createProperties(e) {
return l.createProperties(e, "linetoolarrowmarkright")
}
}
class d extends l {
constructor(e, t) {
super(e, t, "linetoolarrowmarkdown")
}
direction() {
return "down"
}
name() {
return "Arrow Mark Down"
}
textAlignParams() {
return {
horzAlign: "center",
vertAlign: "bottom",
offsetX: 0,
offsetY: 20
}
}
static createProperties(e) {
return l.createProperties(e, "linetoolarrowmarkdown")
}
}
},
"U0+/": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyMetaInfoRepository", (function() {
return h
}));
i("YFKU");
var s = i("Eyy1"),
r = i("0YCj"),
n = i.n(r),
o = i("Si3H"),
a = i("lCO3"),
l = i("txPx");
const c = Object(l.getLogger)("Chart.Studies.StudyMetaInfoRepository", {
color: "#606"
});
class h {
constructor(e) {
this._nextRequestNumber = 1, this._rawStudiesMetaInfo = [], this._isReady = !1, this
._metaInfoQueryQueue = [], this._javaMetaInfoQueryQueue = [], this
._javaStudiesMetaInfo = [], this._pineMetaInfoCache = [], this
._studiesMigrations = [], this._gateway = e
}
requestMetaInfo() {
this._requestStarted();
const e = this._makeNextRequestId();
return c.logNormal("Requesting metainfo #" + e), new Promise(t => {
c.logNormal("Requesting studies metadata #" + e), this._gateway
.requestMetadata(e, i => {
c.logNormal(`Requesting studies metadata #${e} finished`);
const s = i.params[1].metainfo.slice();
this._processLibraryMetaInfo(s), this._requestFinished(),
t()
})
})
}
findById(e) {
if (!this._isReady) return this._enqueueMetaInfoQuery(e);
const t = this._findStudyMetaInfo(e);
return null !== t ? Promise.resolve(t) : "pine" === e.type ? this._compilePine(e) :
Promise.reject(`unexpected study id=${e.studyId} with type=${e.type}`)
}
findByIdSync(e) {
return this._findStudyMetaInfo(e)
}
isReady() {
return this._isReady
}
findAllJavaStudies() {
return this._isReady ? Promise.resolve(this._javaStudiesMetaInfo) : this
._enqueueJavaMetaInfoQuery()
}
getInternalMetaInfoArray() {
return this._javaStudiesMetaInfo
}
getMigrations() {
return this._studiesMigrations
}
addPineMetaInfo(e) {
return d(this._pineMetaInfoCache, e)
}
_processMigrations(e) {
throw new Error("not implemented")
}
_processSiteMetaInfo(e, t) {
throw new Error("not implemented")
}
_processLibraryMetaInfo(e) {
for (const t of e) u(t), d(this._javaStudiesMetaInfo, t);
this._javaStudiesMetaInfo = this._javaStudiesMetaInfo.sort((e, t) => {
const i = e.description_localized || e.description,
s = t.description_localized || t.description;
return i > s ? 1 : i < s ? -1 : 0
}),
n.a.overrideDefaults(this._javaStudiesMetaInfo)
}
_requestStarted() {
this._isReady = !1, this._javaStudiesMetaInfo = [], this._pineMetaInfoCache = [],
this._studiesMigrations = [], this._rawStudiesMetaInfo = []
}
_requestFinished() {
this._isReady = !0, this._processPendingMetaInfoQueries(), this
._processPendingFullMetaInfoQueries()
}
_enqueueMetaInfoQuery(e) {
return new Promise(t => {
this._metaInfoQueryQueue.push({
studyDescriptor: e,
resolver: t
})
})
}
_enqueueJavaMetaInfoQuery() {
return new Promise(e => {
this._javaMetaInfoQueryQueue.push({
resolver: e
})
})
}
_processPendingMetaInfoQueries() {
for (; this._metaInfoQueryQueue.length;) {
const e = this._metaInfoQueryQueue.shift();
this.findById(e.studyDescriptor).then(e.resolver)
}
}
_processPendingFullMetaInfoQueries() {
for (; this._javaMetaInfoQueryQueue.length;) {
this._javaMetaInfoQueryQueue.shift().resolver(this._javaStudiesMetaInfo)
}
}
_findStudyMetaInfo(e) {
return "java" === e.type ? this._javaStudiesMetaInfo.find(t => t.id === e
.studyId) || null : this._pineMetaInfoCache.find(t => t.scriptIdPart === e
.pineId && (void 0 === e.pineVersion || Object(s.ensureDefined)(t.pine)
.version === e.pineVersion)) || null
}
_makeNextRequestId() {
return "metadata_" + this._nextRequestNumber++
}
_compilePine(e) {
throw new Error("unsupported")
}
}
function u(e) {
e.description_localized = window.t(e.description, {
context: "study"
})
}
function d(e, t) {
const i = new n.a(t);
Object(o.migrateMetaInfoAndPropState)(i);
let s = !0;
const r = e.findIndex(e => e.id === i.id);
if (-1 === r) e.push(i);
else {
const t = e[r],
n = void 0 !== t.pine ? a.Version.parse(t.pine.version) : null,
o = void 0 !== i.pine ? a.Version.parse(i.pine.version) : null;
null === o || null === n || o.isGreaterOrEqual(n) ? (t.removeDefaults(), e[r] = i) :
s = !1
}
return s && i.createDefaults(), i
}
},
UAFa: function(e, t, i) {
"use strict";
i.r(t);
var s = i("i6cO"),
r = i("23IT"),
n = i("Eyy1");
const o = new Map([
[s.ColorerType.Main, "color"],
[s.ColorerType.Text, "textColor"],
[s.ColorerType.Border, "borderColor"],
[s.ColorerType.Wick, "wickColor"],
[s.ColorerType.Up, "colorup"],
[s.ColorerType.Down, "colordown"]
]);
class a {
constructor(e) {
this._plotStyle = e
}
getPlotPointStyle(e, t) {
const i = t ? Object(s.clearStyle)(t) : Object(s.createEmptyStyle)();
return o.forEach((e, t) => {
this._plotStyle[e] && (i.colors[t] = this._plotStyle[e].value())
}), i.lineWidth = this._plotStyle.linewidth ? this._plotStyle.linewidth
.value() : void 0, i.lineStyle = this._plotStyle.linestyle ? this._plotStyle
.linestyle.value() : void 0, i
}
isColorDefined() {
return !0
}
singleColor() {
return !0
}
getDefaultPlotPointStyle() {
return null
}
}
class l {
constructor(e, t, i, s) {
this._palettes = new Map, this._metaInfo = e, this._properties = t, this._indexes =
s, this._plotStyle = t.styles[i];
const r = Object(n.ensureDefined)(this._metaInfo.palettes);
s.forEach((t, i) => {
const s = e.plots[t];
if (s && "palette" in s) {
const e = r[s.palette],
t = this._properties.palettes[s.palette];
e && t && this._palettes.set(i, {
palette: e,
props: t
})
}
})
}
getPlotPointStyle(e, t) {
const i = t ? Object(s.clearStyle)(t) : Object(s.createEmptyStyle)();
if (this._palettes.has(s.ColorerType.Main)) {
const t = Object(n.ensureDefined)(this._indexes.get(s.ColorerType.Main)),
r = e[t + 1];
if (null != r) {
const e = Object(n.ensureDefined)(this._palettes.get(s.ColorerType.Main)),
t = e.palette,
o = e.props,
a = Object(n.ensureDefined)(t.valToIndex ? t.valToIndex[r] : r),
l = o.colors[a];
i.lineWidth = l.width.value(), i.lineStyle = l.style.value()
}
}
return Object.keys(s.ColorerType).forEach(t => {
const s = parseInt(t);
if (this._palettes.has(s)) {
const t = Object(n.ensureDefined)(this._indexes.get(s)),
r = e[t + 1];
if (null != r) {
const e = Object(n.ensureDefined)(this._palettes.get(s)),
t = Object(n.ensureDefined)(e.palette.valToIndex ? e.palette
.valToIndex[r] : r),
o = e.props.colors[t];
i.colors[s] = o.color.value()
} else i.colors[s] = "transparent"
} else if (this._plotStyle) {
const e = o.get(s);
void 0 !== e && this._plotStyle[e] && (i.colors[s] = this
._plotStyle[e].value())
}
}), i
}
getDefaultPlotPointStyle() {
const e = Object(n.ensureDefined)(this._palettes.get(s.ColorerType.Main)).props
.colors[0];
if (null != e) {
return {
colors: [e.color.value(), void 0, void 0, void 0, void 0, void 0, void 0],
lineWidth: e.width.value()
}
}
return null
}
isColorDefined() {
return !!this._palettes.size
}
singleColor() {
return !1
}
}
var c = i("Tmoa");
class h {
constructor(e) {
this._indexes = e
}
getPlotPointStyle(e, t) {
const i = t ? Object(s.clearStyle)(t) : Object(s.createEmptyStyle)();
return this._indexes.forEach((t, s) => {
const r = e[t + 1];
if (null != r) {
const e = Object(c.rgbaFromInteger)(r);
i.colors[s] = e
} else i.colors[s] = "transparent"
}), i
}
isColorDefined() {
return !0
}
singleColor() {
return !1
}
getDefaultPlotPointStyle() {
return null
}
}
i.d(t, "createStudyPlotColorProvider", (function() {
return d
}));
const u = new Map([
[s.ColorerType.Main, function(e, t) {
const i = Object(r.isColorerPlot)(t) || Object(r.isOhlcColorerPlot)(t);
return "target" in t && t.target === e && i
}],
[s.ColorerType.Text, function(e, t) {
const i = Object(r.isTextColorerPlot)(t);
return "target" in t && t.target === e && i
}],
[s.ColorerType.Background, function(e, t) {
return Object(r.isBgColorerPlot)(t) && t.id === e
}],
[s.ColorerType.Border, function(e, t) {
const i = Object(r.isCandleBorderColorerPlot)(t);
return "target" in t && t.target === e && i
}],
[s.ColorerType.Wick, function(e, t) {
const i = Object(r.isCandleWickColorerPlot)(t);
return "target" in t && t.target === e && i
}],
[s.ColorerType.Up, function(e, t) {
const i = Object(r.isUpColorerPlot)(t);
return "target" in t && t.target === e && i
}],
[s.ColorerType.Down, function(e, t) {
const i = Object(r.isDownColorerPlot)(t);
return "target" in t && t.target === e && i
}]
]);
function d(e, t, i) {
const {
colorers: s
} = function(e, t) {
const i = e.plots,
s = i.findIndex(e => e.id === t),
r = new Map;
return i.forEach((e, i) => {
u.forEach((s, n) => {
s(t, e) && r.set(n, i)
})
}), {
plotIndex: -1 === s ? null : s,
colorers: r
}
}(e, i);
if (s.size) return e.isRGB ? new h(s) : new l(e, t, i, s); {
const e = t.ohlcPlots;
if (e && e[i]) return new a(e[i]);
const s = t.styles[i];
return new a(s)
}
}
},
UCMi: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolDateAndPriceRange", (function() {
return a
}));
var s = i("Eyy1"),
r = i("Ocx9"),
n = i("Ss5c"),
o = i("585y");
class a extends n.LineDataSource {
constructor(e, t) {
super(e, t || a.createProperties()), this._volumeCalculator = null, i.e(
"lt-pane-views").then(i.bind(null, "UcQu")).then(e => {
this._setPaneViews([new e.DateAndPriceRangePaneView(this, this
._model)])
})
}
destroy() {
super.destroy(),
null !== this._volumeCalculator && this._volumeCalculator.destroy()
}
pointsCount() {
return 2
}
properties() {
return super.properties()
}
name() {
return "Date and Price Range"
}
volume() {
if (null === this._volumeCalculator) return NaN;
const e = this.points();
return this._volumeCalculator.volume(e[0].index, e[1].index)
}
setOwnerSource(e) {
e === this._model.mainSeries() && (Object(s.assert)(null === this
._volumeCalculator), this._volumeCalculator = new o.a(this._model
.mainSeries())), super.setOwnerSource(e)
}
static createProperties(e) {
const t = new r.DefaultProperty("linetooldateandpricerange", e);
return a._configureProperties(t), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "Ax76")))
.GeneralDatePriceRangeDefinitionsViewModel
}
static _configureProperties(e) {
n.LineDataSource._configureProperties(e)
}
}
},
UCjq: function(e, t, i) {
"use strict";
i.r(t);
var s = i("YFKU"),
r = i("Eyy1"),
n = i("aO4+"),
o = i("qFKp"),
a = i("VaSN"),
l = i("FQhm"),
c = i("ogJP"),
h = i("FIi8"),
u = i("VdBB"),
d = i("vTIA"),
p = i("KnF9"),
_ = i("3ClC"),
m = i("GxN8"),
f = i("CW80"),
g = i("mMWL"),
b = i("bOGh"),
v = i("fTGZ"),
S = i("ikwP"),
y = i("gAom"),
w = i("mE5r"),
P = i("1IXQ");
function C(e, t) {
return e.position - t.position
}
function x(e, t, i) {
const s = (e.position - t.position) / (e.time - t.time);
return Math.sign(s) * Math.min(Math.abs(s), i)
}
class T {
constructor(e, t, i, s) {
this._position1 = null, this._position2 = null, this._position3 = null, this
._position4 = null, this._animationStartPosition = null, this._durationMsecs =
0, this._speedPxPerMsec = 0, this._terminated = !1, this._minSpeed = e, this
._maxSpeed = t, this._dumpingCoeff = i, this._minMove = s
}
addPosition(e, t) {
if (null !== this._position1) {
if (this._position1.time === t) return void(this._position1.position = e);
if (Math.abs(this._position1.position - e) < this._minMove) return
}
this._position4 = this._position3, this._position3 = this._position2, this
._position2 = this._position1, this._position1 = {
time: t,
position: e
}
}
start(e, t) {
if (null === this._position1 || null === this._position2) return;
if (t - this._position1.time > 50) return;
let i = 0;
const s = x(this._position1, this._position2, this._maxSpeed),
r = C(this._position1, this._position2),
n = [s],
o = [r];
if (i += r, null !== this._position3) {
const e = x(this._position2, this._position3, this._maxSpeed);
if (Math.sign(e) === Math.sign(s)) {
const t = C(this._position2, this._position3);
if (n.push(e), o.push(t), i += t, null !== this._position4) {
const e = x(this._position3, this._position4, this._maxSpeed);
if (Math.sign(e) === Math.sign(s)) {
const t = C(this._position3, this._position4);
n.push(e), o.push(t), i += t
}
}
}
}
let a = 0;
for (let e = 0; e < n.length; ++e) a += o[e] / i * n[e];
Math.abs(a) < this._minSpeed || (this._animationStartPosition = {
position: e,
time: t
}, this._speedPxPerMsec = a, this._durationMsecs = function(e, t) {
const i = Math.log(t);
return Math.log(1 * i / -e) / i
}(Math.abs(a), this._dumpingCoeff))
}
getPosition(e) {
const t = Object(r.ensureNotNull)(this._animationStartPosition),
i = e - t.time;
return t.position + this._speedPxPerMsec * (Math.pow(this._dumpingCoeff, i) - 1) /
Math.log(this._dumpingCoeff)
}
finished(e) {
return null === this._animationStartPosition || this._progressDuration(e) === this
._durationMsecs
}
terminated() {
return this._terminated
}
terminate() {
this._terminated = !0
}
_progressDuration(e) {
const t = e - Object(r.ensureNotNull)(this._animationStartPosition).time;
return Math.min(t, this._durationMsecs)
}
}
var I = i("hY0g"),
M = i.n(I),
O = i("1AAW"),
L = i("XcdR"),
A = i("7MWe"),
E = i("HZKX"),
k = i("5VQP"),
D = i("7ktv"),
V = i("Fixu"),
B = i("e92V"),
R = i("QloM"),
N = i("Kxc7"),
j = i("//lt"),
F = i("+6II"),
W = i("JWMC"),
H = i("7KDR"),
U = i("ZBiT"),
z = i("zL3Q"),
G = i("/3z9"),
q = i("H0vP"),
Y = i("m/3z");
function K(e) {
return "startMoving" in e && "move" in e && "endMoving" in e
}
i.d(t, "PaneWidgetBase", (function() {
return ce
}));
const J = parseInt(U["css-value-pane-controls-padding-left"]),
Z = parseInt(U["css-value-pane-controls-padding-right"]),
X = ["AlertLabel"];
function $(e) {
return !(null === e || !Object(_.isStudy)(e)) && "Volume@tv-basicstudies" === e.metaInfo()
.id
}
function Q(e, t, i) {
e.drawBackground && e.drawBackground(t, i)
}
function ee(e, t, i) {
e.draw(t, i)
}
function te(e, t) {
return e.paneViews(t)
}
function ie(e, t) {
return e.topPaneViews()
}
function se(e, t) {
return e.labelPaneViews(t)
}
function re(e, t) {
const i = e.strategyOrdersPaneView();
return null === i ? null : [i]
}
function ne(e, t) {
return null === e || null === e.hittest || e.source !== t ? null : e.hittest.data()
}
const oe = {
contextMenuEnabled: !0,
contextMenu: E.defaultContextMenuOptions,
priceScaleContextMenuEnabled: !0,
legendWidgetEnabled: !0,
controlsEnabled: !0,
propertyPagesEnabled: !0,
sourceSelectionEnabled: !0,
countdownEnabled: !0
},
ae = new Map([
[u.AreaName.Text, "Text"],
[u.AreaName.Style, "Style"]
]),
le = !N.enabled("display_legend_on_all_charts");
class ce {
constructor(e, t, i, s) {
this._legendWidget = null, this._paneControls = null, this._isDestroyed = !1, this
._trackCrosshairOnlyAfterLongTap = Object(a.lastEventIsTouch)(), this
._startTrackPoint = null, this._exitTrackingModeOnNextTry = !1, this
._startMoveSourceParams = null, this._startChangeLineToolParams = null, this
._preventSourceChange = !1, this._clonningAtMoveLineTools = null, this
._startCloningPoint = null, this._size = new S.Size(0, 0), this
._themedTopColor = null, this._themedBottomColor = null, this
._initCrossHairPosition = null, this._firstZoomPoint = null, this._editDialog =
null, this._processing = !1, this._touchMove = !1, this._startTouchPoint = null,
this._isSelecting = !1, this._prevHoveredHittest = null, this._contextMenuX = 0,
this._contextMenuY = 0, this._startScrollingPos = null, this._isScrolling = !1,
this._scrollPriceScale = null, this._scrollXAnimation = null, this
._scrollYAnimation = null, this._prevPinchScale = 1, this._pinching = !1, this
._wasPinched = !1, this._longTap = !1, this._contextMenuOpenedOnLastTap = !1,
this._paneControlsResizeObserver = null, this._hideNotMainSourcesInLegendSpawn =
null, this._hideWholeLegend = null, this._lastClickedSource = null, this
._customLegendWidgetsFactoryMap = new Map, this._prevMoveEventPosition = null,
this._onMagnetStateChangedListener = this._onMagnetStateChanged.bind(this), this
._onShiftKeyStateChangedListener = this._onShiftKeyStateChanged.bind(this), this
._currentCursorClassName = "", this._lastFinishedToolId = null, this
._needResetMeasureLater = !1, this._currentChangingLineToolHitTest = null, this
._lastCommonTooltipData = null,
this._canvasConfiguredHandler = () => this._state && this._chartModel()
.lightUpdate(), this._topCanvasConfiguredHandler = () => this._state && this
._chartModel().lightUpdate(), this._recalculateLegendVisibility = () => {
const e = Object(r.ensureNotNull)(this._hideWholeLegend),
t = this._chartModel().crossHairSource().measurePane();
null !== t ? e.setValue(t === this._state) : e.setValue(Object(g
.toolIsMeasure)(g.tool.value()))
}, this._chart = e, this._state = t, this._options = Object(c.merge)(Object(c
.clone)(oe), i), this._paneWidgetsSharedState = s, this._state && (this
._state.onDestroyed().subscribe(this, this._onStateDestroyed, !0), this
._state.dataSourcesCollectionChanged().subscribe(this, this
._onDataSourcesCollectionChanged));
const n = {
contextMenuEnabled: this._options.priceScaleContextMenuEnabled,
pressedMouseMoveScale: this._options.handleScale.axisPressedMouseMove.price,
mouseWheelScale: this._options.handleScale.mouseWheel,
currencyConversionEnabled: this._options.currencyConversionEnabled,
unitConversionEnabled: this._options.unitConversionEnabled,
countdownEnabled: this._options.countdownEnabled,
croppedTickMarks: this._options.croppedTickMarks
};
void 0 !== this._options.priceScaleContextMenu && (n.contextMenu = this._options
.priceScaleContextMenu);
const o = (e, t, i, s, r) => new P.PriceAxisWidget(this, this._chartUndoModel(), i,
t, e, n, s, r),
l = e.properties().childs().scalesProperties,
h = this._chartModel().rendererOptionsProvider(),
u = {
backgroundBasedTheme: e.backgroundBasedTheme(),
rendererOptionsProvider: h,
getBackgroundTopColor: () => this._chartModel().backgroundTopColor()
.value(),
getBackgroundBottomColor: () => this._chartModel().backgroundColor().value()
},
d = {
showLabels: !1
};
this._lhsPriceAxisesContainer = new w.a(l, "left", o, u, d), this
._rhsPriceAxisesContainer = new w.a(l, "right", o, u, d), this._paneCell =
document.createElement("td"), this._paneCell.classList.add("chart-markup-table",
"pane"), this._div = document.createElement("div"), this._div.classList.add(
"chart-gui-wrapper"), this._paneCell.appendChild(this._div), this
._canvasBinding = Object(S.createBoundCanvas)(this._div, new S.Size(16, 16)),
this._canvasBinding.subscribeCanvasConfigured(this._canvasConfiguredHandler);
const p = this._canvasBinding.canvas;
p.style.position = "absolute", p.style.left = "0", p.style.top = "0", this
._topCanvasBinding = Object(S.createBoundCanvas)(this._div, new S.Size(16, 16)),
this._topCanvasBinding.subscribeCanvasConfigured(this
._topCanvasConfiguredHandler);
const _ = this._topCanvasBinding.canvas;
_.style.position = "absolute", _.style.left = "0", _.style.top = "0", this
._rowElement = document.createElement("tr"), this._rowElement.appendChild(this
._lhsPriceAxisesContainer.getElement()), this._rowElement.appendChild(this
._paneCell), this._rowElement.appendChild(this._rhsPriceAxisesContainer
.getElement()), this._options.legendWidgetEnabled && (this._options
.customLegendWidgetFactories && (this._customLegendWidgetsFactoryMap = this
._options.customLegendWidgetFactories), this
._loadAndCreateLegendWidget()), this._state && !this._chart.readOnly() &&
this._options.controlsEnabled && this._loadAndCreatePaneControlsWidget(),
Object(z.a)().subscribe(this._onMagnetStateChangedListener),
Object(Y.d)().subscribe(this._onShiftKeyStateChangedListener), this._paneCell
.addEventListener("dragover", e => {
e.dataTransfer && Array.from(e.dataTransfer.files).some(
blobImageFilter) && e.preventDefault()
})
}
destroy() {
this._chart.onPaneWidgetDestroyed(this), this._customLegendWidgetsFactoryMap
.clear(), this._topCanvasBinding.unsubscribeCanvasConfigured(this
._topCanvasConfiguredHandler), this._topCanvasBinding.destroy(), this
._canvasBinding.unsubscribeCanvasConfigured(this._canvasConfiguredHandler), this
._canvasBinding.destroy(), null !== this._hideNotMainSourcesInLegendSpawn &&
this._hideNotMainSourcesInLegendSpawn.destroy(), this._legendWidget && (this
._legendWidget.destroy(), this._legendWidget = null), null !== this
._paneControlsResizeObserver && this._paneControlsResizeObserver.disconnect(),
null !== this._paneControls && (this._paneControls.destroy(), this
._paneControls = null), this._lhsPriceAxisesContainer.destroy(), this
._rhsPriceAxisesContainer.destroy(), this.hasState() && (this.state()
.onDestroyed().unsubscribeAll(this), this.state()
.dataSourcesCollectionChanged().unsubscribeAll(this)), Object(z.a)()
.unsubscribe(this._onMagnetStateChangedListener), Object(Y.d)().unsubscribe(this
._onShiftKeyStateChangedListener), this._paneWidgetsSharedState
.onPaneDestroyed(this), null !== this._hideWholeLegend && (g.tool.unsubscribe(
this._recalculateLegendVisibility), this._chartModel().crossHairSource()
.measuringEnabled().unsubscribeAll(this))
}
size() {
return this._size
}
setSize(e) {
Object(r.assert)(e.w >= 0 && e.h >= 0, "Try to set invalid size to PaneWidget " +
JSON.stringify(e)), this._size.equals(e) || (this._size = e, this
._canvasBinding.resizeCanvas({
width: e.w,
height: e.h
}), this._topCanvasBinding.resizeCanvas({
width: e.w,
height: e.h
}), this._paneCell.style.width = e.w + "px", this._paneCell.style.height = e
.h + "px", this._div.style.width = e.w + "px", this._div.style.height = e
.h + "px", this._rowElement.classList.toggle("js-hidden", 0 === e.h),
null !== this._legendWidget && this._legendWidget.updateWidgetModeBySize(e),
null !== this._paneControls && this._paneControls.updateWidgetModeByWidth(e
.w))
}
width() {
return this._size.w
}
height() {
return this._size.h
}
backgroundColor() {
return this._chartModel().backgroundColor().value()
}
processDoubleClickOnSource(e, t) {
e.id() !== this._lastFinishedToolId && this._showEditDialogForSource(e, t)
}
setCursorForTool(e, t, i) {
if (t && t.control() && e) return void this._setCursorClassName("pointer");
if (void 0 !== i) {
switch (i) {
case j.PaneCursorType.VerticalResize:
this._setCursorClassName("ns-resize");
break;
case j.PaneCursorType.HorizontalResize:
this._setCursorClassName("ew-resize");
break;
case j.PaneCursorType.DiagonalNeSwResize:
this._setCursorClassName("nesw-resize");
break;
case j.PaneCursorType.DiagonalNwSeResize:
this._setCursorClassName("nwse-resize");
break;
case j.PaneCursorType.Default:
this._setCursorClassName("default");
break;
case j.PaneCursorType.Pointer:
this._setCursorClassName("pointer");
break;
case j.PaneCursorType.Grabbing:
this._setCursorClassName("grabbing")
}
return
}
const s = g.tool.value();
if (Object(g.toolIsCursor)(s)) {
if (null !== this._paneWidgetsSharedState.draggingSource() || this
._isScrolling || this._chartUndoModel() && this._chartUndoModel().model()
.sourcesBeingMoved().length) return void this._setCursorClassName(
"grabbing");
if (e && this._options.sourceSelectionEnabled) return void this
._setCursorClassName("pointer")
}
if ("eraser" === s) return void this._setCursorClassName("eraser");
if ("zoom" === s) return void this._setCursorClassName("zoom-in");
const r = g.cursorTool.value();
"dot" !== r ? "arrow" !== r ? this._setCursorClassName("") : this
._setCursorClassName("default") : this._setCursorClassName("dot")
}
showContextMenuForSelection(e) {
const t = this._chartUndoModel().selection();
if (t.isEmpty()) return;
const i = t.dataSources().filter(e => e.hasContextMenu());
this.showContextMenuForSources(i, e)
}
async showContextMenuForSources(e, t, i) {
if (!e.length) return Promise.resolve(null);
const s = e[0],
r = Object(c.merge)(Object(c.clone)(this._options.contextMenu), i || {}),
n = new E.ActionsProvider(this._chart, r);
if (s === this._chartUndoModel().crossHairSource()) return s.handleContextMenuEvent(
t), Promise.resolve(null); {
const i = await n.contextMenuActionsForSources(e);
return 0 === i.length ? Promise.resolve(null) : k.ContextMenuManager.createMenu(
i).then(e => (e.show(t), e))
}
}
leftPriceAxisesContainer() {
return this._lhsPriceAxisesContainer
}
rightPriceAxisesContainer() {
return this._rhsPriceAxisesContainer
}
setPriceAxisSizes(e, t, i) {
this._priceAxisesContainer(e).setSizes(t, i)
}
state() {
return Object(r.ensureNotNull)(this._state)
}
hasState() {
return null !== this._state
}
setState(e) {
this._state !== e && (this.hasState() && (this.state().onDestroyed().unsubscribeAll(
this), this.state().dataSourcesCollectionChanged().unsubscribeAll(
this)), this._state = e, this.hasState() && (this.state().onDestroyed()
.subscribe(this, this._onStateDestroyed, !0), this.state()
.dataSourcesCollectionChanged().subscribe(this, this
._onDataSourcesCollectionChanged), this.updatePriceAxisWidgets()))
}
getScreenshotData(e) {
const t = [],
i = [];
let s, r = [];
const n = this.state().sourcesByGroup().allExceptSpecialSources().slice().reverse(),
o = this._chart.properties().childs().paneProperties.childs().legendProperties
.childs();
for (const a of n) {
const n = a.statusView();
Object(_.isStudy)(a) && (o.showLegend.value() || (null == e ? void 0 : e
.showCollapsedStudies)) ? a.properties().visible.value() && n && o
.showStudyTitles.value() && (t.push(a.statusProvider(null == e ? void 0 : e
.status).text()), i.push(a.valuesProvider().getValues(null))) : a ===
this._chartModel().mainSeries() && n && o.showSeriesTitle.value() && (s = a
.statusProvider((null == e ? void 0 : e.status) || {}).text(), r = a
.valuesProvider().getValues(null))
}
return {
type: "pane",
leftAxis: this._lhsPriceAxisesContainer.getScreenshotData(),
rightAxis: this._rhsPriceAxisesContainer.getScreenshotData(),
content: this._canvasBinding.canvas.toDataURL(),
canvas: this._canvasBinding.canvas,
contentWidth: this._size.w,
contentHeight: this._size.h,
studies: t,
studiesValues: i,
containsMainSeries: this.containsMainSeries(),
mainSeriesText: s,
mainSeriesValues: r
}
}
hardResetCanvas() {
this._size.equals(new S.Size(0, 0)) || (Object(S.hardResizeCanvas)(this
._canvasBinding, this._size),
Object(S.hardResizeCanvas)(this._topCanvasBinding, this._size), this
._lhsPriceAxisesContainer.hardResetCanvas(), this._rhsPriceAxisesContainer
.hardResetCanvas())
}
updatePriceAxisWidgets() {
if (!this.hasState()) return;
const e = this._chartModel(),
t = e.paneForSource(e.mainSeries());
if (!t) return;
const i = e.priceScaleSlotsCount(),
s = this.state(),
r = s.visibleLeftPriceScales(),
n = s.visibleRightPriceScales();
this._lhsPriceAxisesContainer.setScales(r, i.left, t.leftPriceScales().length, i
.left + i.right), this._rhsPriceAxisesContainer.setScales(n, i.right, t
.rightPriceScales().length, i.left + i.right)
}
update() {
this.hasState() && (this._lhsPriceAxisesContainer.update(), this
._rhsPriceAxisesContainer.update(), null !== this._legendWidget && this
._legendWidget.update(), this.updateControls())
}
updateStatusWidget(e = q.InvalidationLevel.None) {
this.hasState() && null !== this._legendWidget && (e === q.InvalidationLevel.Full ?
this._legendWidget.updateLayout() : this._legendWidget.update())
}
updateControls() {
this.hasState() && null !== this._paneControls && this._paneControls.update()
}
updateThemedColors(e, t) {
this._themedTopColor = e, this._themedBottomColor = t, this._updateByThemedColors()
}
statusWidget() {
return this._legendWidget
}
getElement() {
return this._rowElement
}
canvasElement() {
return this._canvasBinding.canvas
}
hasCanvas(e) {
return this._canvasBinding.canvas === e || this._topCanvasBinding.canvas === e
}
pinchStartEvent() {
null === this._paneWidgetsSharedState.scrollingPane() && null === this
._paneWidgetsSharedState.pinchingPane() && (this._onTouchEvent(), this._options
.handleScale.pinch && (this._terminateActiveAnimations(), this
._prevPinchScale = 1, this._pinching = !0, this._wasPinched = !0, this
._paneWidgetsSharedState.setPinchingPane(this)))
}
pinchEvent(e, t) {
if (null !== this._paneWidgetsSharedState.scrollingPane() || this
._paneWidgetsSharedState.pinchingPane() !== this) return;
if (this._onTouchEvent(), !this._options.handleScale.pinch) return;
const i = 10 * (t - this._prevPinchScale);
this._prevPinchScale = t, this._chartModel().zoomTime(e.x, i, !0), this
._prevPinchScale = t
}
pinchEndEvent() {
null === this._paneWidgetsSharedState.scrollingPane() && this
._paneWidgetsSharedState.pinchingPane() === this && (this._onTouchEvent(), this
._pinching = !1, this._paneWidgetsSharedState.setPinchingPane(null))
}
mouseClickEvent(e) {
this._onMouseEvent(), this._mouseClickOrTapEvent(e)
}
tapEvent(e) {
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
._mouseClickOrTapEvent(e))
}
mouseDownEvent(e) {
this._onMouseEvent(), this.hasState() && this._mouseDownOrTouchStartEvent(e, Object(
r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY)))
}
touchStartEvent(e) {
if (this._paneWidgetsSharedState.startTouch(this), this
._preventTouchEventsExceptPinch()) return;
const t = this._chartModel().crossHairSource(),
i = !this._trackCrosshairOnlyAfterLongTap && t.pane === this._state && Number
.isFinite(t.originX()) && Number.isFinite(t.originY()) && Math.abs(t.originX() -
e.localX) + Math.abs(t.originY() - e.localY) < 5;
this._onTouchEvent(), this._chart.setActivePaneWidget(this);
const s = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY));
i && (s.source === t || t.selectPointMode().value() ? this.startTrackingMode(new n
.Point(e.localX, e.localY), new n.Point(e.localX, e.localY)) : !this
._chart.readOnly() && Object(f.isLineTool)(s.source) && s.source
.userEditEnabled() && this._chartUndoModel().selectionMacro(e => {
var t;
e.clearSelection(), e.addSourceToSelection(s.source, null === (t = s
.hittest) || void 0 === t ? void 0 : t.data())
})), this._mouseDownOrTouchStartEvent(e, s), this._mouseOrTouchMoveEvent(e)
}
mouseUpEvent(e) {
this._onMouseEvent(), this._mouseUpOrTouchEndEvent(e)
}
touchEndEvent(e) {
this._paneWidgetsSharedState.endTouch(this), this
._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
._mouseOrTouchLeaveEvent(e), this._mouseUpOrTouchEndEvent(e))
}
mouseMoveEvent(e) {
this._onMouseEvent(), this._mouseOrTouchMoveEvent(e)
}
pressedMouseMoveEvent(e) {
this._onMouseEvent(), this._pressedMouseOrTouchMoveEvent(e)
}
touchMoveEvent(e) {
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
._pressedMouseOrTouchMoveEvent(e))
}
mouseLeaveEvent(e) {
this._onMouseEvent(), this._mouseOrTouchLeaveEvent(e)
}
mouseDoubleClickEvent(e) {
this._onMouseEvent(), this._mouseDoubleClickOrDoubleTapEvent(e)
}
wheelClickEvent(e) {
var t, i;
if (this._chart.readOnly()) return;
const s = this._dataSourceAtPoint(e.localX, e.localY);
if (null === s || s.isCustom || null === s.source) return;
if (((null === (t = s.hittest) || void 0 === t ? void 0 : t.result()) || 0) <= u
.HitTestResult.MOVEPOINT_BACKGROUND) return;
const n = new p.a(e),
o = null === (i = s.hittest) || void 0 === i ? void 0 : i.eraseMarker();
if (n.control() && void 0 !== o && s.source.processErase) return void s.source
.processErase(this._chartUndoModel(), o);
const a = this._chartUndoModel();
a.selection().isSelected(s.source) || a.selectionMacro(e => {
e.clearSelection();
const t = Object(r.ensureNotNull)(s.source);
e.addSourceToSelection(t, ne(s, t))
}), this._chart.removeSelectedSources()
}
doubleTapEvent(e) {
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
._mouseDoubleClickOrDoubleTapEvent(e))
}
longTapEvent(e) {
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this._longTap = !0,
null === this._startTrackPoint && this._trackingModeShouldBeActive() && this
.startTrackingMode(new n.Point(e.localX, e.localY), new n.Point(e.localX, e
.localY), new p.a(e)))
}
mouseEnterEvent(e) {
this._onMouseEvent(), this.hasState() && (this._chart.setActivePaneWidget(this),
this._setCursorPosition(e.localX, e.localY, new p.a(e)))
}
contextMenuEvent(e) {
this._onMouseEvent(), this._contextMenuEvent(e)
}
touchContextMenuEvent(e) {
this._preventTouchEventsExceptPinch() || (this._onTouchEvent(), this
._contextMenuEvent(e))
}
mouseDownOutsideEvent() {
this._processOutsideClick({
hittest: null,
isCustom: !1,
renderer: null,
source: null
})
}
cancelZoom() {
this._chartModel().crossHairSource().clearSelection(), this._firstZoomPoint = null,
this._preventCrossHairMove() && this._clearCursorPosition()
}
startTrackingMode(e, t, i) {
this._startChangeLineToolParams = null, this._startMoveSourceParams = null, this
._currentChangingLineToolHitTest = null, this._chartUndoModel().selectionMacro(
e => e.clearSelection()), this._startTrackPoint = e, this
._exitTrackingModeOnNextTry = !1, this._setCursorPosition(t.x, t.y, i),
this._initCrossHairPosition = this._chartModel().crossHairSource()
.currentPoint()
}
setDragToAnotherPaneCursor() {
this._setCursorClassName("grabbing")
}
cloneLineTools(e, t) {
return this._chartUndoModel().cloneLineTools(e, t)
}
exitTrackingMode() {
null !== this._state && null !== this._startTrackPoint && (this
._exitTrackingModeOnNextTry = !0, this._tryExitTrackingMode())
}
trackingModeEnabled() {
return null !== this._state && null !== this._startTrackPoint
}
addCustomWidgetToLegend(e, t) {
this._options.legendWidgetEnabled && (this._customLegendWidgetsFactoryMap.set(e, t),
null !== this._legendWidget && this._legendWidget.addCustomWidgetToLegend(e,
t))
}
containsMainSeries() {
return !!this.hasState() && this.state().containsMainSeries()
}
paint(e, t) {
if (!this._chartUndoModel() || !this.hasState()) return;
this._state && (e.priceScaleSideMaxLevel("left") > q.InvalidationLevel.Cursor || e
.priceScaleSideMaxLevel("right") > q.InvalidationLevel.Cursor) && (this
._recalculatePriceScales(), this._chartModel()
.updateCrosshairPositionByOriginCoords());
const i = e.fullInvalidation();
if (i > q.InvalidationLevel.Cursor) {
const e = this._chartModel().crossHairSource(),
t = e.originX(),
i = e.originY();
if (e.pane === this._state && Number.isFinite(t) && Number.isFinite(i)) {
const e = this._dataSourceAtPoint(t, i);
null !== e && this._updateHoveredSource(e, Object(Y.b)())
}
}
if (this._lhsPriceAxisesContainer.paint(e
.getterForPriceScaleInvalidationLevelBySide("left")), this
._rhsPriceAxisesContainer.paint(e.getterForPriceScaleInvalidationLevelBySide(
"right")), i !== q.InvalidationLevel.None) {
if (i > q.InvalidationLevel.Cursor) {
const e = Object(r.ensureNotNull)(this._canvasBinding.canvas.getContext(
"2d"));
e.setTransform(1, 0, 0, 1, 0, 0);
const i = this._canvasRenderParams();
this._drawBackground(e, i), this._state && this._drawSources(e, i, t)
}
if (this._state) {
const e = Object(r.ensureNotNull)(this._topCanvasBinding.canvas.getContext(
"2d"));
e.setTransform(1, 0, 0, 1, 0, 0);
const t = this._topCanvasRenderParams();
e.clearRect(0, 0, Math.ceil(this._size.w * t.pixelRatio), Math.ceil(this
._size.h * t.pixelRatio)), this._drawSeriesTopViews(e, t), this
._drawCrossHair(e, t), this._drawActiveLineTools(e, t)
}
}
}
cancelCreatingLineTool() {
const e = this._chartUndoModel(),
t = this._chartUndoModel().lineBeingCreated();
if (t)
if (t.pointsCount() <= 0) {
const i = t.points();
if (i.length > 2) {
const s = i[i.length - 2];
e.continueCreatingLine(s), this._finishTool(t)
} else e.cancelCreatingLine()
} else e.cancelCreatingLine();
null !== this._firstZoomPoint && this.cancelZoom(), this.setCursorForTool()
}
cancelMeasuring() {
this._chartUndoModel().crossHairSource().clearMeasure(), Object(g.resetToCursor)(),
this.setCursorForTool()
}
_topCanvasRenderParams() {
return {
pixelRatio: this._topCanvasBinding.pixelRatio,
physicalWidth: this._topCanvasBinding.canvas.width,
physicalHeight: this._topCanvasBinding.canvas.height,
cssWidth: this._chartModel().timeScale().width(),
cssHeight: this.height()
}
}
_canvasRenderParams() {
return {
pixelRatio: this._canvasBinding.pixelRatio,
physicalWidth: this._canvasBinding.canvas.width,
physicalHeight: this._canvasBinding.canvas.height,
cssWidth: this._chartModel().timeScale().width(),
cssHeight: this.height()
}
}
_tryExitTrackingMode(e) {
this._exitTrackingModeOnNextTry && (this._startTrackPoint = null, e || this
._clearCursorPosition())
}
_tryStartMeasure(e, t, i, s, r) {
return !(!Object(g.toolIsMeasure)(g.tool.value()) || t.startMeasurePoint()) && (e
.isTouch || this._preventCrossHairMove() || this._setCursorPosition(e
.localX, e.localY, i), s = this._chartModel().magnet().align(s, r, this
.state()), t.startMeasuring({
price: s,
index: r
}, this.state()), !0)
}
_tryFinishMeasure(e, t) {
if (t.startMeasurePoint() && !t.endMeasurePoint()) {
let i = t.price;
const s = t.index;
return i = this._chartModel().magnet().align(i, s, this.state()), t
.finishMeasure({
price: i,
index: s
}), e.isTouch ? Object(g.resetToCursor)() : this._needResetMeasureLater = !
0, this._preventCrossHairMove() && this._clearCursorPosition(), !0
}
return !1
}
_tryStartZoom(e, t, i, s) {
const r = this._chart.model().model().zoomEnabled();
if ("zoom" === g.tool.value() && r) {
const r = this._chartUndoModel(),
n = r.timeScale().indexToCoordinate(i) - .5 * r.timeScale().barSpacing();
return this._firstZoomPoint = {
price: t,
index: i,
x: n,
y: e.localY
}, this._preventCrossHairMove() || this._setCursorPosition(e.localX, e
.localY, s), this._chartModel().crossHairSource().startSelection(this
.state()), !0
}
return !1
}
_finishZoom(e) {
const t = this.state(),
i = t.defaultPriceScale(),
s = Object(r.ensureNotNull)(t.mainDataSource()).firstValue(),
n = i.coordinateToPrice(e.localY, Object(r.ensureNotNull)(s)),
o = this._chartUndoModel(),
a = Math.round(o.timeScale().coordinateToIndex(e.localX)),
l = Object(r.ensureNotNull)(this._firstZoomPoint);
a !== l.index && o.zoomToViewport(l.index, a, l.price, n, t), this._chartModel()
.crossHairSource().clearSelection(), this._firstZoomPoint = null, Object(g
.resetToCursor)(), this._preventCrossHairMove() && this
._clearCursorPosition()
}
_tryFinishZoom(e) {
return null !== this._firstZoomPoint && (this._finishZoom(e), !0)
}
_tryHandleEraserMouseDown(e, t) {
if (e.source && "eraser" === g.tool.value() && !e.isCustom && (!(i = e.source) || !i
.customization || !i.customization.disableErasing)) {
const i = this._chartUndoModel();
if (null !== e.hittest && (Object(f.isLineTool)(e.source) || Object(_.isStudy)(e
.source))) {
const s = e.hittest.eraseMarker();
return t.control() && void 0 !== s && e.source.processErase ? e.source
.processErase(i, s) : i.removeSource(e.source, !1), !0
}
}
var i;
return !1
}
_tryStartChangingLineTool(e, t, i, s) {
var n, o;
if (e.isTouch && null !== this._startTrackPoint) return !1;
const a = t.hittest;
if ((!e.isTouch || !this._preventSourceChange) && a && Object(f.isLineTool)(t
.source) && a.result() === u.HitTestResult.CHANGEPOINT) {
const l = this._chartUndoModel(),
c = Object(r.ensure)(null === (n = this.state().mainDataSource()) ||
void 0 === n ? void 0 : n.firstValue()),
h = Object(r.ensureNotNull)(t.source.priceScale()).coordinateToPrice(e
.localY, c);
l.selectionMacro(e => {
e.clearSelection(), e.addSourceToSelection(t.source, a.data())
});
const u = l.model().magnet().align(h, s, this.state()),
d = null === (o = a.data()) || void 0 === o ? void 0 : o.pointIndex;
return this._startChangeLineToolParams = {
source: t.source,
startPoint: {
index: s,
price: u
},
screenPoint: {
x: e.localX,
y: e.localY
},
pointIndex: d,
envState: i
}, !0
}
return this._startChangeLineToolParams = null, !1
}
_tryStartCloning(e, t, i, s) {
if (i.control()) {
const t = this._chartUndoModel().selection().dataSources().filter(e => e
.cloneable());
if (s && s.cloneable() && t.push(s), t.length > 0) return this
._clonningAtMoveLineTools = t.map(e => e.id()), this
._startCloningPoint = new n.Point(e.localX, e.localY), !0
}
return !1
}
_tryFinishClonning(e, t, i) {
const s = this._chartUndoModel(),
o = this._chartModel();
if (t.control() && this._clonningAtMoveLineTools) {
const a = new n.Point(e.localX, e.localY),
l = Object(r.ensureNotNull)(this._startCloningPoint).subtract(a).length(),
c = [];
for (const e of this._clonningAtMoveLineTools) {
const t = o.dataSourceForId(e);
null !== t && c.push(t)
}
if (0 === c.length) return !1;
if (l > 8) {
const o = this.cloneLineTools(c, !0).map(e => Object(r.ensureNotNull)(s
.model().dataSourceForId(e)));
s.selectionMacro(e => {
e.clearSelection();
let t = null;
o.forEach(s => {
null === t && (t = ne(i, s)), e
.addSourceToSelection(s, t)
})
});
const a = new n.Point(e.localX, e.localY),
l = Object(r.ensureNotNull)(o[0].priceScale()),
h = Object(r.ensureNotNull)(this.state().mainDataSource()).firstValue(),
u = {
index: s.timeScale().coordinateToIndex(e.localX),
price: l.coordinateToPrice(e.localY, Object(r.ensureNotNull)(h))
};
s.startMovingSources(o, {
logical: u,
screen: a
}, null, t), this._clonningAtMoveLineTools = null, this
._startCloningPoint = null
}
return !0
}
return !1
}
_mouseDownEventForLineTool(e, t, i, s) {
var o, a;
const l = g.tool.value();
if (!this.hasState() || Object(B.isLineToolDrawWithoutPoints)(l)) return;
const c = this._chartUndoModel();
let h = !1,
u = null;
Object(g.hideAllDrawings)().value() && Object(g.hideAllIndicators)().setValue(!1),
Object(g.hideAllDrawings)().setValue(!1), Object(g.lockDrawings)().setValue(!1),
e.isTouch && (Object(f.isLineToolName)(l) && !Object(B
.isLineDrawnWithPressedButton)(l) || c.lineBeingCreated()) && this
._initToolCreationModeParams(e);
const d = c.lineBeingCreated();
if (d && !Object(B.isLineDrawnWithPressedButton)(d.toolname)) {
const l = Object(r.ensure)(null === (o = d.ownerSource()) || void 0 === o ?
void 0 : o.firstValue());
if (e.isTouch) {
if (!this._startTouchPoint) {
this._startTouchPoint = new n.Point(e.pageX, e.pageY);
const t = d.points(),
i = t[t.length - 1],
s = c.timeScale().indexToCoordinate(i.index),
o = Object(r.ensureNotNull)(d.priceScale()).priceToCoordinate(i
.price, l);
return void(this._initCrossHairPosition = new n.Point(s, o))
}
} else {
u = d;
const n = c.model().paneForSource(d);
if (n !== this._state && null !== n) {
const i = this._externalPaneXCoord(n, e.localX),
s = this._externalPaneYCoord(n, e.localY);
h = c.continueCreatingLine({
index: Math.round(c.timeScale().coordinateToIndex(i)),
price: Object(r.ensure)(null === (a = d.priceScale()) ||
void 0 === a ? void 0 : a.coordinateToPrice(s, l))
}, t)
} else {
const e = c.model().magnet().align(s, i, this.state());
h = c.continueCreatingLine({
index: i,
price: e
}, t)
}
}
} else if (!e.isTouch || Object(B.isLineDrawnWithPressedButton)(l)) {
const e = {
index: i,
price: c.model().magnet().align(s, i, this.state())
};
u = c.createLineTool(this.state(), e, l), c.lineBeingCreated() || (h = !0)
}
const p = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY));
u && c.selectionMacro(e => {
var t;
return e.addSourceToSelection(Object(r.ensureNotNull)(u), null === (t =
p.hittest) || void 0 === t ? void 0 : t.data())
}), h && u && (this._finishTool(u, p),
e.preventDefault())
}
_handleSelectionMouseDownAndGetJustDeselectedSource(e, t, i) {
const s = this._chartUndoModel();
let r = null;
if (null === t.source || t.source.isSelectionEnabled()) {
let n = e.isTouch ? Boolean(t.hittest && t.hittest.result() >= u.HitTestResult
.MOVEPOINT_BACKGROUND) : Boolean(t.hittest && t.hittest.result() > u
.HitTestResult.MOVEPOINT_BACKGROUND);
this._preventSourceChange && (n = !1), s.selectionMacro(e => {
var s;
n && t.source ? (i.control() || e.selection().isSelected(t
.source) || e.clearSelection(), i.control() && e
.selection()
.isSelected(t.source) ? (r = t.source, e
.removeSourceFromSelection(t.source)) : e
.addSourceToSelection(t.source, null === (s = t.hittest) ||
void 0 === s ? void 0 : s.data()), e.selection()
.allSources().length > 1 && Object(W.trackEvent)("GUI",
"Multiselect", "Click Select")) : i.control() || e
.clearSelection()
})
}
return r
}
_processMouseMoveWhileZoom(e, t) {
this._preventCrossHairMove() || this._setCursorPosition(e.localX, e.localY, t)
}
_updateCommonTooltip(e, t) {
let i = null;
if (null !== e && null !== e.hittest) {
const t = e.hittest.data();
t && (i = t.tooltip || null)
}
const s = this._lastCommonTooltipData;
if (null === s && null === i) return;
if (null === i || "" === i.text) return this._lastCommonTooltipData = null,
void Object(F.a)(t);
if (s && i.text === s.text && i.rect && s.rect && i.rect.x === s.rect.x && i.rect
.y === s.rect.y && i.rect.w === s.rect.w && i.rect.h === s.rect.h) return;
this._lastCommonTooltipData = i;
const r = Object(c.clone)(i);
if (void 0 !== r.rect) {
const e = this._paneCell.getBoundingClientRect();
r.rect.x += e.left, r.rect.y += e.top
}
Object(F.b)(r)
}
_setCursorPositionOnExternalPane(e, t, i, s) {
t = this._externalPaneXCoord(e, t), i = this._externalPaneYCoord(e, i);
this._chart.paneByState(e)._setCursorPosition(t, i, s)
}
_setCursorPosition(e, t, i) {
this._chartModel().setAndSaveCurrentPosition(this._correctXCoord(e), this
._correctYCoord(t), this.state(), i)
}
_setCursorClassName(e) {
let t = "";
e && (t = "pane--cursor-" + e), this._currentCursorClassName !== t && (this
._currentCursorClassName && this._paneCell.classList.remove(this
._currentCursorClassName), t && this._paneCell.classList.add(t), this
._currentCursorClassName = t, this._paneCell.style.cursor)
}
_processMouseUpOrTouchEndHandler(e) {
var t;
null === (t = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY))
.hittest) || void 0 === t || t.tryCallMouseUpOrTouchEndHandler(e)
}
_crossHairShouldBeVisible() {
const e = this._chartModel().crossHairSource();
return Object(f.isLineToolName)(g.tool.value()) || Object(g.toolIsMeasure)(g.tool
.value()) || e.startMeasurePoint() && !e.endMeasurePoint() || null !== this
._firstZoomPoint || null !== this._chartModel().lineBeingEdited() || null !==
this._chartModel().lineBeingCreated()
}
_clearCursorPosition() {
this._chartModel().clearCurrentPosition()
}
_dataSourceAtPoint(e, t) {
let i = null,
s = null,
r = null;
if (!this.hasState()) return null;
const o = this.state(),
a = o.height(),
l = o.width();
let c = !1;
if (this._currentChangingLineToolHitTest) return this
._currentChangingLineToolHitTest;
const h = (e, t, n, o) => {
const a = r ? r.result() : 0;
e.result() > a && (r = e, i = t, s = n, c = o)
},
u = this._canvasRenderParams(),
p = new n.Point(e, t),
_ = this._chartUndoModel();
this._hitTestChartSources(u, [_.crossHairSource()], p, h),
this._hitTestCustomSources(u, o.customSources(d.CustomSourceLayer.Topmost), p,
h);
const m = o.sourcesByGroup();
this._hitTestChartSources(u, m.tradingSources(), p, h), this._hitTestCustomSources(
u, o.customSources(d.CustomSourceLayer.Foreground), p, h);
const f = [...this._chartModel().multiPaneSources(o), ...m.hitTestSources()];
if (this._hitTestChartSources(u, f, p, h), this.containsMainSeries()) {
const e = _.barsMarksSources();
for (let t = 0; t < e.length; ++t) {
const i = e[t],
s = i.paneViews(o) || [];
let r, n;
for (let e = 0; e < s.length; e++) r = s[e].renderer(a, l), null !== r && (
n = r.hitTest(p, u), n && h(n, i, r, !1))
}
const t = _.activeStrategySource().value();
if (null !== t) {
const e = t.strategyOrdersPaneView();
if (null !== e) {
const i = e.renderer(a, l);
if (null !== i) {
const e = i.hitTest(p, u);
e && h(e, t, i, !1)
}
}
}
}
return null === i && this._hitTestCustomSources(u, o.customSources(d
.CustomSourceLayer.Background), p, h), {
source: i,
hittest: r,
renderer: s,
isCustom: c
}
}
_hitTestCustomSources(e, t, i, s) {
const n = Object(r.ensureNotNull)(this._state),
o = n.height(),
a = n.width();
for (let r = t.length - 1; r >= 0; --r) {
const l = t[r],
c = l.paneViews(n);
if (0 !== c.length)
for (let t = c.length - 1; t >= 0; --t) {
const r = c[t].renderer(o, a);
if (null !== r) {
const t = r.hitTest(i, e);
null !== t && s(t, l, r, !0)
}
}
}
}
_hitTestChartSources(e, t, i, s) {
const n = Object(r.ensureNotNull)(this._state),
o = n.height(),
a = n.width();
for (let r = t.length; 0 < r--;) {
const l = t[r],
c = l.paneViews(n);
if (null !== c)
for (let t = c.length; 0 < t--;) {
const r = c[t].renderer(o, a);
if (r && r.hitTest) {
const t = r.hitTest(i, e);
null !== t && s(t, l, r, !1)
}
}
}
}
_tryStartMovingLineTool(e, t, i, s) {
var o, a;
if (null === t.source || !t.source.movable() || null !== this._startTrackPoint)
return !1;
if (!this._preventSourceChange) {
const l = this._chartUndoModel(),
c = Object(r.ensureNotNull)(Object(r.ensureNotNull)(this._state)
.mainDataSource()).firstValue(),
h = Object(r.ensureNotNull)(t.source.priceScale()).coordinateToPrice(e
.localY, Object(r.ensureNotNull)(c)),
u = (t.source.isSelectionEnabled() ? l.selection().allSources() : [t
.source
]).filter(K),
d = new n.Point(e.localX, e.localY),
p = {
index: s,
price: h
},
_ = null === (a = null === (o = t.hittest) || void 0 === o ? void 0 : o
.data()) || void 0 === a ? void 0 : a.activeItem;
return this._startMoveSourceParams = {
source: u,
startPoint: {
logical: p,
screen: d
},
itemIndex: void 0 === _ ? null : _,
envState: i
}, !0
}
return this._startMoveSourceParams = null, !1
}
_chartModel() {
return this._chart.model().model()
}
_chartUndoModel() {
return this._chart.model()
}
_externalPaneXCoord(e, t) {
t += this._div.getBoundingClientRect().left + document.body.scrollLeft;
const i = Object(r.ensureNotNull)(this._chart.paneByState(e)),
s = i._div.getBoundingClientRect().left + document.body.scrollLeft;
return i._correctXCoord(t - s)
}
_externalPaneYCoord(e, t) {
t += this._div.getBoundingClientRect().top + document.body.scrollTop;
const i = Object(r.ensureNotNull)(this._chart.paneByState(e)),
s = i._div.getBoundingClientRect().top + document.body.scrollTop;
return i._correctYCoord(t - s)
}
_correctXCoord(e) {
return Math.max(0, Math.min(e, this._size.w - 1))
}
_correctYCoord(e) {
return Math.max(0, Math.min(e, this._size.h - 1))
}
_processScroll(e) {
if (!this._chart.model().model().scrollEnabled()) return;
const t = Date.now();
this._startScrollingPos || this._preventScroll() || (this._startScrollingPos = {
x: e.clientX,
y: e.clientY,
timestamp: t,
localX: e.localX,
localY: e.localY
}), null !== this._scrollXAnimation && this._scrollXAnimation.addPosition(e
.localX, t), null !== this._scrollYAnimation && this._scrollYAnimation
.addPosition(e.localY, t);
const i = this._chartUndoModel();
let s = this.state().defaultPriceScale();
if (this._startScrollingPos && !this._isScrolling && (this._startScrollingPos.x !==
e.clientX || this._startScrollingPos.y !== e.clientY)) return i
.beginUndoMacro("scroll").setCustomFlag("doesnt_affect_save", !0), null ===
this._scrollXAnimation && this._options.useKineticScroll && (this
._scrollXAnimation = new T(.2, 7, .997, 15), this._scrollXAnimation
.addPosition(this._startScrollingPos.localX, this._startScrollingPos
.timestamp), this._scrollXAnimation.addPosition(e.localX, t)), this
._scrollYAnimation, i.selection().isEmpty() || (s = i.selection()
.allSources()[0].priceScale()), null === s || s.isEmpty() || (this
._scrollPriceScale = s, i.startScrollPrice(this.state(), s, e.localY)),
i.startScrollTime(e.localX), this._isScrolling = !0, this
.setCursorForTool(), void this._paneWidgetsSharedState.setScrollingPane(
this);
this._isScrolling && (null !== this._scrollPriceScale && i.scrollPriceTo(this
.state(), this._scrollPriceScale, e.localY), i.scrollTimeTo(e.localX))
}
_finishScroll() {
const e = this._chartUndoModel();
e.endScrollTime(), null !== this._scrollPriceScale && e.endScrollPrice(this.state(),
this._scrollPriceScale), e.endUndoMacro(), this._isScrolling = !1, this
._startScrollingPos = null, this._scrollPriceScale = null, this
.setCursorForTool(), this._paneWidgetsSharedState.setScrollingPane(null)
}
_endScroll(e) {
if (!this._isScrolling) return !1;
const t = this._isScrolling && this._scrollUndoCommandInStack();
if (this._isScrolling) {
const i = Date.now();
null !== this._scrollXAnimation && this._scrollXAnimation.start(e.localX, i),
null !== this._scrollYAnimation && this._scrollYAnimation.start(e.localY,
i);
const s = this._chartUndoModel();
if ((null === this._scrollXAnimation || this._scrollXAnimation.finished(i)) && (
null === this._scrollYAnimation || this._scrollYAnimation.finished(i)))
return this._finishScroll(), t;
const r = s.timeScale(),
n = this._scrollXAnimation,
o = this._scrollYAnimation,
a = () => {
if ((null === n || n.terminated()) && (null === o || o.terminated()))
return;
const e = Date.now();
let t = null === n || n.finished(e);
const i = null === o || o.finished(e);
if (null !== n && !n.terminated()) {
const i = r.rightOffset();
s.scrollTimeTo(n.getPosition(e)), i === r.rightOffset() && (t = !0,
this._scrollXAnimation = null)
}
null === o || o.terminated() || null === this._scrollPriceScale || s
.scrollPriceTo(this.state(), this._scrollPriceScale, o.getPosition(
e)), t && i ? this._finishScroll() : requestAnimationFrame(a)
};
requestAnimationFrame(a)
}
return t
}
_terminateActiveAnimations() {
const e = Date.now(),
t = null === this._scrollXAnimation || this._scrollXAnimation.finished(e),
i = null === this._scrollYAnimation || this._scrollYAnimation.finished(e);
null === this._scrollXAnimation && null === this._scrollYAnimation || t && i || this
._finishScroll(), null !== this._scrollXAnimation && (this._scrollXAnimation
.terminate(), this._scrollXAnimation = null),
null !== this._scrollYAnimation && (this._scrollYAnimation.terminate(), this
._scrollYAnimation = null)
}
_preventScroll() {
return this._trackCrosshairOnlyAfterLongTap && this._longTap || this
._contextMenuOpenedOnLastTap || Object(f.isLineToolName)(g.tool.value()) ||
Boolean(this._chartUndoModel().lineBeingCreated()) || null !== this
._startTrackPoint
}
_isSelectPointModeEnabled() {
return this._chartUndoModel().crossHairSource().selectPointMode().value()
}
_preventCrossHairMove() {
return !!this._trackCrosshairOnlyAfterLongTap && (null === this._chart
.trackingModePaneWidget() && (!!this._contextMenuOpenedOnLastTap || !this
._crossHairShouldBeVisible() && null === this._startTrackPoint))
}
_finishTool(e, t = null) {
const i = this._chartUndoModel(),
s = g.tool.value();
if (Object(g.resetToCursor)(), this._preventCrossHairMove() && this
._clearCursorPosition(), i.selectionMacro(i => {
i.addSourceToSelection(e, ne(t, e))
}), Object(B.isTextToolName)(s)) {
const t = i.createUndoCheckpoint();
this._chart.showChartPropertiesForSource(e, R.TabNames.text, void 0, t)
}
this._lastFinishedToolId = e.id(), Object(V.c)(e)
}
_alignSourcesThatBeingMoved(e, t, i, s) {
const r = this._chartUndoModel(),
o = r.timeScale().coordinateToIndex(t);
r.model().sourcesBeingMoved().forEach(e => {
const a = e.convertYCoordinateToPriceForMoving(i, this.state()
.mainDataSource());
null !== a && (this.setCursorForTool(), r.moveSources({
screen: new n.Point(t, i),
logical: {
index: o,
price: a
}
}, s))
})
}
_resetMeasureIfRequired() {
this._needResetMeasureLater && (Object(g.resetToCursor)(), this
._needResetMeasureLater = !1)
}
_drawBackground(e, t) {
const i = Math.ceil(t.pixelRatio * this._size.w),
s = Math.ceil(t.pixelRatio * this._size.h),
r = this._chartModel(),
n = r.backgroundTopColor().value(),
o = r.backgroundColor().value();
n === o ? Object(S.clearRect)(e, 0, 0, i + 1, s + 1, o) : Object(y
.clearRectWithGradient)(e, 0, 0, i + 1, s + 1, n, o)
}
_drawWatermark(e, t) {
const i = this._chartModel().watermarkSource();
if (null === i) return;
const s = this.state();
if (!s.containsMainSeries()) return;
const r = i.paneViews(),
n = s.height(),
o = s.width();
for (const i of r) {
e.save();
const s = i.renderer(n, o);
s && s.draw(e, t), e.restore()
}
}
_drawCrossHair(e, t) {
const i = this._chartUndoModel().crossHairSource();
!i.visible && Object(g.lockTimeAxis)().value() && (i.setLockedPosition(Object(r
.ensureNotNull)(this._state)), i.updateAllViews()), this._drawSourceImpl(e,
t, te, ee, i)
}
_drawActiveLineTools(e, t) {
const i = this._chartModel(),
s = [i.lineBeingCreated(), i.lineBeingEdited(), ...i.sourcesBeingMoved(), i
.customSourceBeingMoved()
].filter(e => !!e);
for (const r of s) {
(i.paneForSource(r) === this.state() || Object(m.a)(r) && r
.isMultiPaneEnabled()) && this._drawSourceImpl(e, t, te, ee, r)
}
}
_drawSeriesTopViews(e, t) {
this.state().containsMainSeries() && this._drawSourceImpl(e, t, ie, ee, this
._chartUndoModel().mainSeries())
}
_drawSources(e, t, i) {
const s = this.state(),
r = s.model(),
n = s.sourcesByGroup(),
o = n.tradingSources(),
a = [...r.multiPaneSources(s), ...n.generalSources()],
l = n.phantomSources(),
h = s.customSources(d.CustomSourceLayer.Background).slice(),
u = s.customSources(d.CustomSourceLayer.Foreground).slice(),
p = s.customSources(d.CustomSourceLayer.Topmost).slice(); {
const e = r.panes();
for (let t = e.length - 1; t >= 0; t--) e[t].createDrawingsCaches()
}
this._drawSourceImpl(e, t, te, ee, r.gridSource()), this._drawWatermark(e, t);
for (const i of h) this._drawSourceImpl(e, t, te, Q, i);
for (const i of a) this._drawSourceImpl(e, t, te, Q, i);
for (const i of u) this._drawSourceImpl(e, t, te, Q, i);
for (const i of l) this._drawSourceImpl(e, t, te, Q, i);
const _ = new Set;
[r.lineBeingCreated(), r.lineBeingEdited(), ...r.sourcesBeingMoved(), r
.customSourceBeingMoved()
].filter(c.notNull).forEach(e => _.add(e.id()));
let f = r.hoveredSource();
null !== f && ($(f) || _.has(f.id()) || Object(m.a)(f) && !a.includes(f) ? f =
null : _.add(f.id()));
const g = r.selection().allSources().filter(e => !(Object(m.a)(e) && !a.includes(
e)) && (!_.has(e.id()) && !$(e)));
g.forEach(e => _.add(e.id())); {
for (const i of h) this._drawSourceImpl(e, t, te, ee, i, _);
for (const i of a) this._drawSourceImpl(e, t, te, ee, i, _);
for (const i of u) this._drawSourceImpl(e, t, te, ee, i, _);
const i = r.activeStrategySource().value();
i && this.containsMainSeries() && this._drawSourceImpl(e, t, re, ee, i)
}
for (const i of o) this._drawSourceImpl(e, t, te, Q, i);
for (const i of p) this._drawSourceImpl(e, t, te, Q, i);
for (const i of o) this._drawSourceImpl(e, t, te, Q, i);
for (const i of p) this._drawSourceImpl(e, t, te, Q, i);
for (const i of a) this._drawSourceImpl(e, t, se, ee, i, _);
for (const i of u) this._drawSourceImpl(e, t, se, ee, i, _);
this._drawBarsMarks(e, t, i);
for (const i of o) this._drawSourceImpl(e, t, te, ee, i, _);
for (const i of p) this._drawSourceImpl(e, t, te, ee, i, _);
for (const i of g) this._drawSourceImpl(e, t, te, ee, i);
for (const i of g) this._drawSourceImpl(e, t, se, ee, i);
f && (this._drawSourceImpl(e, t, te, ee, f), this._drawSourceImpl(e, t, se, ee, f));
for (const i of l) this._drawSourceImpl(e, t, te, ee, i, _); {
const e = r.panes();
for (let t = e.length - 1; t >= 0; t--) e[t].clearDrawingCaches()
}
}
_drawSourceImpl(e, t, i, s, r, n) {
if (n && n.has(r.id())) return;
const o = this.state(),
a = o.height(),
l = o.width(),
c = i(r, this.state());
if (c)
for (const i of c) {
const r = i.renderer(a, l);
r && (e.save(), s(r, e, t), e.restore())
}
}
_drawBarsMarks(e, t, i) {
if (this.containsMainSeries() && !i) {
const i = this._chartUndoModel().barsMarksSources();
for (const s of i) this._drawSourceImpl(e, t, te, ee, s)
}
}
_updateByThemedColors() {
null !== this._legendWidget && this._legendWidget.updateThemedColors(this
._themedTopColor), null !== this._paneControls && this._paneControls
.updateThemedColors(this._themedTopColor)
}
_scrollUndoCommandInStack() {
const e = this._chartUndoModel().undoHistory().undoStack();
if (e.isEmpty()) return !1;
const t = e.head();
if (!(t instanceof b.a)) return !1;
if (t.isEmpty()) return !1;
const i = t.commands()[0];
return i instanceof A.PriceScaleChangeUndoCommand || i instanceof L.a
}
_onStateDestroyed() {
this.setState(null)
}
_getHideNotMainSourcesValue() {
return le && !this._chart.isActive() && !this._chart.crossHairSyncEnabled()
}
_onDataSourcesCollectionChanged() {
this._startMoveSourceParams = null
}
_processMouseEnterLeaveMoveHandlers(e, t) {
var i, s, r, n;
null !== this._prevHoveredHittest && this._prevHoveredHittest.renderer !== e
.renderer && (Object(u.tryCallHandler)(t, null === (s = null === (i = this
._prevHoveredHittest.hittest) || void 0 === i ? void 0 : i
.data()) || void 0 === s ? void 0 : s.mouseLeaveHandler),
this._prevHoveredHittest = null), t.isTouch || (e.hittest && (null === (r =
this._prevHoveredHittest) || void 0 === r ? void 0 : r.renderer) !== e
.renderer && (e.hittest.tryCallMouseEnterHandler(t), this
._prevHoveredHittest = e), null === (n = e.hittest) || void 0 === n || n
.tryCallMouseMoveHandler(t))
}
_startChangeOrMoveLineToolIfNeeded() {
if (null !== this._startChangeLineToolParams) {
const e = this._startChangeLineToolParams;
this._chartUndoModel().startChangingLinetool(e.source, e.startPoint, e
.pointIndex, e.envState)
}
if (null !== this._startMoveSourceParams) {
const e = this._startMoveSourceParams;
this._chartUndoModel().startMovingSources(e.source, e.startPoint, e.itemIndex, e
.envState)
}
this._startMoveSourceParams = null, this._startChangeLineToolParams = null
}
_trackingModeShouldBeActive() {
return !(!this._trackCrosshairOnlyAfterLongTap || this
._contextMenuOpenedOnLastTap || this._crossHairShouldBeVisible()) && this
._longTap
}
_processOutsideClick(e) {
let t = null;
const i = this._chartModel();
if (e.source && (t = e.isCustom ? i.customSourceName(e.source) : e.source.id()),
null !== this._lastClickedSource && this._lastClickedSource.id !== t) {
const e = this._lastClickedSource.id;
let t = this._lastClickedSource.isCustom ? i.customSourceForName(e) : i
.dataSourceForId(e);
null !== t || this._lastClickedSource.isCustom || (t = this._chartUndoModel()
.barMarksSourceForId(e)), null !== t && t.onClickOutside && (t
.onClickOutside(), this._chartModel().updateSource(t))
}
this._lastClickedSource = null !== t ? {
id: t,
isCustom: e.isCustom
} : null
}
_mouseClickOrTapEvent(e) {
var t, i, s;
if (!this.hasState()) return;
const n = this._dataSourceAtPoint(e.localX, e.localY),
o = n && n.source,
a = this._chartUndoModel(),
c = Boolean(null === (i = null === (t = null == n ? void 0 : n.hittest) ||
void 0 === t ? void 0 : t.data()) || void 0 === i ? void 0 : i
.hideCrosshairLinesOnHover);
this._processOutsideClick(Object(r.ensureNotNull)(n)), !this
._isSelectPointModeEnabled() || c || e.isTouch && this.trackingModeEnabled() &&
!this._exitTrackingModeOnNextTry || a.crossHairSource().trySelectCurrentPoint(),
(null === (s = null == n ? void 0 : n.hittest) || void 0 === s ? void 0 : s
.tryCallClickOrTapHandler(e)) && a.model().updateSource(Object(r
.ensureNotNull)(o)), !e.isTouch || this._isSelectPointModeEnabled() || n &&
n.source === a.crossHairSource() || this._tryExitTrackingMode(), o instanceof v
.BarsMarksContainer && n && n.hittest && n.hittest.data() && o.onClicked(Object(
r.ensureNotNull)(n.hittest).data()), o && Object(f.isLineTool)(o) && Object(
l.emit)("drawing_event", o.id(), "click"), this._resetMeasureIfRequired()
}
_mouseDownOrTouchStartEvent(e, t) {
var i;
if (e.isTouch && (this._longTap = !1, this._exitTrackingModeOnNextTry = null !==
this._startTrackPoint, this._paneWidgetsSharedState.clearDraggingSource()),
this._contextMenuOpenedOnLastTap = !1, this._lastFinishedToolId = null, this
._terminateActiveAnimations(), e.isTouch && this
._switchTrackingModeFromAnotherPaneIfNeeded(e), document.activeElement !==
document.body && document.activeElement !== document.documentElement) document
.activeElement && document.activeElement.blur ? document.activeElement.blur() :
document.body.focus();
else {
const e = document.getSelection();
null !== e && e.removeAllRanges()
}
Object(l.emit)("mouse_down", {
clientX: e.clientX,
clientY: e.clientY,
pageX: e.pageX,
pageY: e.pageY,
screenX: e.screenX,
screenY: e.screenY
}), this._updateCommonTooltip(null);
const s = this._chartUndoModel(),
o = new p.a(e);
s.mainSeries().clearGotoDateResult(), this.hideInplaceEditor();
const c = this.state().defaultPriceScale();
if (c.isEmpty() || s.timeScale().isEmpty()) return;
const h = s.crossHairSource();
if (!e.isTouch && !Object(B.isLineDrawnWithPressedButton)(g.tool.value())) {
const t = s.lineBeingCreated(),
i = null !== t ? s.model().paneForSource(t) : null;
null !== i && i !== this._state ? this._setCursorPositionOnExternalPane(i, e
.localX, e.localY, o) : this._setCursorPosition(e.localX, e.localY, o)
}
e.isTouch && Object(f.isLineToolName)(g.tool.value()) && (Object(B
.isLineDrawnWithPressedButton)(g.tool.value()) || null !== h.pane ?
Object(B.isLineDrawnWithPressedButton)(g.tool.value()) && this
._clearCursorPosition() : this._chart.updateCrossHairPositionIfNeeded());
const d = Object(r.ensureNotNull)(this.state().mainDataSource()).firstValue();
if (null === d) return void(this._chart.readOnly() || (this
._handleSelectionMouseDownAndGetJustDeselectedSource(e, t, o), t
.source && t.source instanceof D.PriceDataSource && t.source
.isDraggable() && this._paneWidgetsSharedState.trySetDraggingSource(
t.source, this)));
const _ = c.coordinateToPrice(e.localY, d),
m = this._chartModel().timeScale().coordinateToIndex(e.localX);
if (h.startMeasurePoint() && h.endMeasurePoint() && h.clearMeasure(), o.shift() &&
Object(g.toolIsCursor)(g.tool.value()) && s.selection().isEmpty() && g.tool
.setValue("measure"), (e.isTouch || !this._tryStartMeasure(e, h, o, _, m)) && (e
.isTouch || !this._tryFinishMeasure(e, h)) && !this._tryFinishZoom(e) && !
this._tryStartZoom(e, _, m, o)) {
if (e.isTouch && (null !== this._startTrackPoint ? (this
._initCrossHairPosition = h.currentPoint(), this._startTrackPoint =
new n.Point(e.localX, e.localY)) : this
._isSelectPointModeEnabled() && null === this._chart
.trackingModePaneWidget() && this.startTrackingMode(new n.Point(e
.localX, e.localY), new n.Point(e.localX, e.localY), new p.a(e))), e
.isTouch && (this._preventSourceChange = null === t.source || !s.selection()
.isSelected(t.source)), !this._isSelectPointModeEnabled() && !this
._isScrolling) {
if (e.isTouch && (Object(g.toolIsMeasure)(g.tool.value()) || null !== h
.measurePane())) return void this._initToolCreationModeParams(e);
if (Object(f.isLineToolName)(g.tool.value()) || s.lineBeingCreated())
return o.shift() || s.selectionMacro(e => e.clearSelection()), void this
._mouseDownEventForLineTool(e, o, m, _)
}
if (null === (i = t.hittest) || void 0 === i || i
.tryCallMouseDownOrTouchStartHandler(e), !this._chart.readOnly()) {
const i = this._handleSelectionMouseDownAndGetJustDeselectedSource(e, t, o);
if (t.hittest && t.source) {
const i = t.hittest.data();
if (t.isCustom) {
if (t.hittest.hasPressedMoveHandler(e)) return void s.model()
.setMovingCustomSource(t.source, i)
} else if ((null == i ? void 0 : i.areaName) === u.AreaName
.SourceItemMove) {
const r = null == i ? void 0 : i.activeItem;
if (void 0 !== r) return void s.startCustomMoving(t.source, r, e)
}
}
if (this._tryHandleEraserMouseDown(t, o)) return;
const r = t.source && Object(f.isLineTool)(t.source) && t.source.isLocked &&
t.source.isLocked();
if (!(Object(g.lockDrawings)().value() || r) && !t.isCustom) {
if (t.source && !t.source.userEditEnabled()) return;
if (this._tryStartChangingLineTool(e, t, o, m)) return void(this
._currentChangingLineToolHitTest = t);
if (this._currentChangingLineToolHitTest = null, t.hittest && ((b = t
.hittest.result()) === u.HitTestResult.MOVEPOINT || b === u
.HitTestResult.MOVEPOINT_BACKGROUND && Object(a
.lastEventIsTouch)())) {
if (this._tryStartCloning(e, t, o, i)) return;
if (this._tryStartMovingLineTool(e, t, o, m)) return
}
}
if (t.source && t.source instanceof D.PriceDataSource && t.source
.isDraggable() && this._paneWidgetsSharedState.trySetDraggingSource(t
.source, this)) return
}
var b;
t && t.hittest && t.hittest.result() === u.HitTestResult.REGULAR || (this
._processing = !0)
}
}
_mouseUpOrTouchEndEvent(e) {
var t, i;
if (!this.hasState()) return;
const s = e.isTouch && null !== this._startTrackPoint,
n = e.isTouch && this._wasPinched;
e.isTouch && (this._wasPinched = !1, this._longTap = !1), this
._startMoveSourceParams = null, this._startChangeLineToolParams = null, this
._currentChangingLineToolHitTest = null;
const o = this._chartUndoModel(),
c = o.model().customSourceMovingHitTestData();
null !== c || o.customMoveBeingProcessed() || this._processMouseUpOrTouchEndHandler(
e), this._isSelecting = !1;
const h = o.model(),
d = h.crossHairSource(),
_ = this._dataSourceAtPoint(e.localX, e.localY),
m = null == _ ? void 0 : _.hittest;
if (d.selection() && null === this._firstZoomPoint) {
const e = this.state().lineToolsForArea(d.selection());
o.selectionMacro(t => {
let i = null;
e.forEach(e => {
null === i && (i = ne(_, e)), t.addSourceToSelection(e,
i)
})
}), d.clearSelection(), Object(W.trackEvent)("GUI", "Multiselect",
"Area Select")
}
Object(l.emit)("mouse_up", {
clientX: e.clientX,
clientY: e.clientY,
pageX: e.pageX,
pageY: e.pageY,
screenX: e.screenX,
screenY: e.screenY
});
const b = e.isTouch && this._touchMove;
e.isTouch && (this._touchMove = !1);
const v = new p.a(e),
S = g.tool.value();
if (e.isTouch && !b && (Object(g.toolIsMeasure)(S) || null !== d.measurePane())) {
if (null === d.measurePane() && d.pane !== this._state) return void this
._setCursorPosition(e.localX, e.localY);
if (this._tryStartMeasure(e, d, v, d.price, d.index)) return;
if (this._tryFinishMeasure(e, d)) return
}
if (e.isTouch && !b && !Object(B.isLineDrawnWithPressedButton)(S) && Object(f
.isLineToolName)(S) && !o.lineBeingCreated()) {
if (this._chart.justActivated()) return;
if (d.pane !== this._state) return void this._setCursorPosition(e.localX, e
.localY, v);
const i = d.currentPoint(),
s = this.state().defaultPriceScale(),
n = Object(r.ensure)(null === (t = this.state().mainDataSource()) ||
void 0 === t ? void 0 : t.firstValue()),
a = {
index: Math.round(o.timeScale().coordinateToIndex(i.x)),
price: s.coordinateToPrice(i.y, n)
},
l = Object(r.ensureNotNull)(o.createLineTool(this.state(), a, S));
return o.selectionMacro(e => {
e.addSourceToSelection(l)
}), o.lineBeingCreated() || (this._finishTool(l, _), e.preventDefault()),
void(this._startTouchPoint = null)
}
const y = o.lineBeingCreated();
if (y && !Object(B.isLineDrawnWithPressedButton)(y.toolname) && e.isTouch && this
._startTouchPoint) {
if (this._startTouchPoint = null, !b) {
const t = y.points()[y.points().length - 1],
i = o.continueCreatingLine({
index: t.index,
price: t.price
}, new p.a(e));
this._initCrossHairPosition = null, i && (this._finishTool(y, _), e
.preventDefault())
}
return
}
if (null !== this._firstZoomPoint && this._firstZoomPoint.draggingMode)
return void this._finishZoom(e);
if (this._processing = !1, o.customMoveBeingProcessed() && o.endCustomMoving(),
null !== c && (c.beingMoved && (Object(u.tryCallHandler)(e, c.mouseUpHandler, c
.touchEndHandler), this.setCursorForTool()), h.setMovingCustomSource(
null, null)), h.lineBeingEdited()) return o.endChangingLinetool(!1), void(
this._preventCrossHairMove() && this._clearCursorPosition());
if (Object(B.isLineDrawnWithPressedButton)(S) && !this
._isSelectPointModeEnabled()) {
const t = o.lineBeingCreated();
null !== t && (Object(V.c)(t), t.finish());
const s = this.state().defaultPriceScale();
if (s.isEmpty()) return;
if (!t) return;
const n = Object(r.ensure)(null === (i = t.ownerSource()) || void 0 === i ?
void 0 : i.firstValue()),
a = s.coordinateToPrice(e.localY, n),
l = {
index: Math.round(o.timeScale().coordinateToIndex(e.localX)),
price: a
};
return void o.continueCreatingLine(l)
}
if (h.sourcesBeingMoved().length) return o.endMovingSource(!1), h
.sourcesBeingMoved().filter(f.isLineTool).forEach(e => {
this.setCursorForTool(e)
}), void h.invalidate(q.InvalidationMask.cursor());
if (!this._chart.readOnly()) {
const t = e.localX >= 0 && e.localX < this._size.w;
if ((!_ || _.source !== d) && t) {
const t = o.timeScale().coordinateToIndex(e.localX);
h.onSyncScrollNeeded(t)
}
}
const w = this._isScrolling,
P = this._endScroll(e),
C = this._paneWidgetsSharedState.draggingSource();
if (null !== C) {
const t = e.target,
i = this._chart.paneByCanvas(t);
i && i !== this && (P && o.undoHistory().undo(), o.mergeToPane(C, i.state()));
if (this._chart.timeAxisByCanvas(t))
if (h.isUnmergeAvailableForSource(C)) P && o.undoHistory().undo(), o
.unmergeToNewBottomPane(C);
else {
const e = h.panes(),
t = Object(r.ensureNotNull)(h.paneForSource(C)),
i = e.indexOf(t);
i !== e.length - 1 && (P && o.undoHistory().undo(), t.isMaximized() &&
this._chart.toggleMaximizePane(), o.movePane(i, e.length - 1))
} this._paneWidgetsSharedState.clearDraggingSource();
const s = this._chart.getTimeScale();
s && s.restoreDefaultCursor();
const n = this._chart.paneWidgets();
for (let e = 0; e < n.length; e++) {
const t = n[e];
t === this && _ && !_.isCustom ? t.setCursorForTool(_.source || void 0) : t
.setCursorForTool(), t.leftPriceAxisesContainer()
.restoreDefaultCursor(), t.rightPriceAxisesContainer()
.restoreDefaultCursor()
}
}
this._chart.readOnly() || s || v.control() || w || n || _ && _.source && (m && m
.result() > u.HitTestResult.MOVEPOINT_BACKGROUND || Object(a
.lastEventIsTouch)()) && o.selectionMacro(e => {
e.clearSelection();
const t = Object(r.ensureNotNull)(_.source);
e.addSourceToSelection(t, ne(_, t))
}), e.isTouch && (this._touchMove = !1)
}
_mouseOrTouchMoveEvent(e) {
if (!this.hasState()) return;
this._resetMeasureIfRequired();
const t = Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY));
this._processMouseEnterLeaveMoveHandlers(t, e);
const i = this._chartUndoModel();
if (!i) return;
const s = e.localX,
o = e.localY;
this._prevMoveEventPosition = new n.Point(s, o);
const a = new p.a(e);
if (null === this._firstZoomPoint) {
if (this._updateHoveredSource(t, a, e), !e.isTouch && i.lineBeingCreated()) {
const e = i.lineBeingCreated(),
t = null === e ? null : i.model().paneForSource(e);
if (null !== t && t !== this._state) return void this
._setCursorPositionOnExternalPane(t, s, o, a)
}
e.isTouch || this._setCursorPosition(s, o, a)
} else this._processMouseMoveWhileZoom(e, a)
}
_pressedMouseOrTouchMoveEvent(e) {
var t;
if (!this.hasState() || this._pinching) return;
this._resetMeasureIfRequired(), this._startChangeOrMoveLineToolIfNeeded(), e
.isTouch && (this._touchMove = !0, this._preventSourceChange = !1);
const i = new p.a(e),
s = this._chartUndoModel(),
o = s.crossHairSource(),
a = e.localX,
l = e.localY;
if (this._prevMoveEventPosition = new n.Point(a, l), null !== this._firstZoomPoint)
return this._processMouseMoveWhileZoom(e), void(this._firstZoomPoint
.draggingMode = !0);
const c = g.tool.value();
if (e.isTouch && this._startTouchPoint && Object(f.isLineToolName)(c) && !Object(B
.isLineDrawnWithPressedButton)(c) && !s.lineBeingCreated() && !this
._isSelectPointModeEnabled()) return void this
._updateCrosshairPositionInToolCreationMode(e, this.state());
const h = o.measurePane();
if (e.isTouch && this._startTouchPoint && (Object(g.toolIsMeasure)(c) || null !==
h)) return void this._updateCrosshairPositionInToolCreationMode(e, h || this
.state());
const d = s.lineBeingCreated();
if (e.isTouch && d && !Object(B.isLineDrawnWithPressedButton)(d.toolname)) {
if (this._startTouchPoint) {
const t = Object(r.ensureNotNull)(s.lineBeingCreated()),
i = Object(r.ensureNotNull)(s.model().paneForSource(t));
this._updateCrosshairPositionInToolCreationMode(e, i)
}
return
}
if (e.isTouch && null !== this._startTrackPoint) {
this._exitTrackingModeOnNextTry = !1;
const e = Object(r.ensureNotNull)(this._initCrossHairPosition),
t = new n.Point(a, l).subtract(this._startTrackPoint),
s = e.add(t);
this._setCursorPosition(s.x, s.y, i)
} else e.isTouch && this._preventCrossHairMove() || this._setCursorPosition(a, l,
i);
const _ = this._isSelectPointModeEnabled();
if (Object(f.isLineToolName)(c) && !Object(B.isLineDrawnWithPressedButton)(c) && !
_ && !i.control()) return;
if (Object(B.isLineDrawnWithPressedButton)(c) && !_) {
const i = this.state().defaultPriceScale();
if (i.isEmpty()) return;
const o = s.lineBeingCreated();
if (!o) return;
const a = new n.Point(e.localX, e.localY),
l = Object(r.ensure)(null === (t = o.ownerSource()) || void 0 === t ?
void 0 : t.firstValue());
return a.price = i.coordinateToPrice(e.localY, l), a.index = Math.round(s
.timeScale().coordinateToIndex(e.localX)), void s.continueCreatingLine(
a)
}
if (null !== this._paneWidgetsSharedState.draggingSource()) {
const t = e.target,
i = this._chart.paneByCanvas(t);
i && (i !== this ? i.setDragToAnotherPaneCursor() : i.setCursorForTool());
const s = this._chart.timeAxisByCanvas(t);
s && s.setCursor("grabbing")
}
if (s.timeScale().isEmpty()) return;
const m = this._options.handleScroll;
if ((!m.pressedMouseMove || e.isTouch) && (!m.horzTouchDrag && !m.vertTouchDrag || !
e.isTouch)) return;
if (s.customMoveBeingProcessed()) return void s.processCustomMove(e);
const b = s.model().customSourceMovingHitTestData();
if (null !== b && (this._updateCommonTooltip(null, !0), s.model()
.processingCustomSourceMove(), Object(u.tryCallHandler)(e, b
.pressedMouseMoveHandler, b.touchMoveHandler), !Object(u
.shouldDefaultActionBeExecuted)(e, b, "pressedMouseMoveHandler",
"touchMoveHandler"))) return;
if (s.model().lineBeingEdited()) return void this._setCursorPosition(a, l, i);
if (s.model().sourcesBeingMoved().length) return void this
._alignSourcesThatBeingMoved(s.model().sourcesBeingMoved(), e.localX, e
.localY, i);
const v = this._dataSourceAtPoint(e.localX, e.localY);
if (this._tryFinishClonning(e, new p.a(e), v)) return;
const S = Object(g.toolIsMeasure)(c) || o.startMeasurePoint() && o
.endMeasurePoint();
this._chart.readOnly() || !i.control() || Object(f.isLineToolName)(c) || S ? (this
._processScroll(e), this._preventScroll() && !this
._preventCrossHairMove() && null === this._startTrackPoint && this
._setCursorPosition(e.localX, e.localY, new p.a(e))) : this._isSelecting ||
(o.startSelection(this.state()), this._isSelecting = !0)
}
_mouseOrTouchLeaveEvent(e) {
var t, i;
if (!this.hasState()) return;
const s = this._chartUndoModel();
if (!s) return;
const r = s.crossHairSource();
e.isTouch || null !== r.measurePane() && null === r.endMeasurePoint() || this
._clearCursorPosition(), s.model().setHoveredSource(null, null), null !== this
._prevHoveredHittest && (Object(u.tryCallHandler)(e, null === (i = null === (t =
this._prevHoveredHittest.hittest) || void 0 === t ? void 0 : t
.data()) || void 0 === i ? void 0 : i.mouseLeaveHandler), this
._prevHoveredHittest = null), this._updateCommonTooltip(null), this._chart
.unsetActivePaneWidget()
}
_mouseDoubleClickOrDoubleTapEvent(e) {
var t;
if (!this.hasState()) return;
const i = !this._chart.readOnly() && !Object(f.isLineToolName)(g.tool.value()) &&
Object(r.ensureNotNull)(this._dataSourceAtPoint(e.localX, e.localY)) || null;
if (null === i) return;
if (i.isCustom) return void(null === (t = i.hittest) || void 0 === t || t
.tryCallDblClickOrDblTapHandler(e));
let s = i.hittest && i.source || null;
s && i.hittest && i.hittest.result() <= u.HitTestResult.MOVEPOINT_BACKGROUND && !e
.isTouch && (s = null), s && !s.isSelectionEnabled() && (s = null), s ? this
.processDoubleClickOnSource(s, i.hittest ? i.hittest : void 0) : this._chart
.readOnly() || Object(f.isLineToolName)(g.tool.value()) || this
._chartUndoModel().lineBeingCreated() || !this._chartUndoModel().selection()
.isEmpty() || this._chart.toggleMaximizePane(this)
}
_contextMenuEvent(e) {
var t;
const i = this._chartUndoModel();
if (i.crossHairSource().startMeasurePoint() && !this
._trackCrosshairOnlyAfterLongTap) return i.crossHairSource().clearMeasure(),
void Object(g.resetToCursor)(!0);
if (this._pinching) return;
if (null === this._firstZoomPoint || this._trackCrosshairOnlyAfterLongTap || this
.cancelZoom(), this.hideInplaceEditor()) return;
if (!Object(g.toolIsCursor)(g.tool.value()) || this._isSelectPointModeEnabled()) {
if (e.isTouch) return;
return Object(g.resetToCursor)(!0), this.setCursorForTool(), void(i
.lineBeingCreated() && i.cancelCreatingLine())
}
if (!this._options.contextMenuEnabled) return;
const s = this._dataSourceAtPoint(e.localX, e.localY),
r = s ? s.source : null;
if (e.isTouch && null !== this._startTrackPoint) {
if (this._preventSourceChange) return;
this._clearCursorPosition()
}
e.isTouch && (this._contextMenuOpenedOnLastTap = !0, this._startTrackPoint = null),
this._contextMenuX = e.localX, this._contextMenuY = e.localY;
const n = s && s.hittest ? s.hittest.result() : 0,
o = n >= u.HitTestResult.REGULAR || n >= u.HitTestResult.MOVEPOINT_BACKGROUND &&
e.isTouch;
this._chart.updateActions(),
i.selectionMacro(t => {
null !== r && o ? t.selection().isSelected(r) || (t.clearSelection(), t
.addSourceToSelection(r, ne(s, r))) : (this._options.contextMenu
.general && this._contextMenu(e).then(t => {
null !== t && t.show(e)
}), t.clearSelection())
}), s && o && null !== r && (Object(m.a)(r) && r.hasContextMenu() ? r
.isSelectionEnabled() ? this.showContextMenuForSelection(e) : this
.showContextMenuForSources([r], e) : null === (t = s.hittest) || void 0 ===
t || t.tryCallContextMenuHandler(e))
}
_onMouseEvent() {
this._preventSourceChange = !1, this._startTrackPoint = null, this
._trackCrosshairOnlyAfterLongTap = !1
}
_onTouchEvent() {
this._trackCrosshairOnlyAfterLongTap = !0
}
_switchTrackingModeFromAnotherPaneIfNeeded(e) {
const t = this._chart.trackingModePaneWidget();
if (null !== t && t !== this) {
const i = this._chartModel().crossHairSource().currentPoint();
t._exitTrackingModeOnNextTry = !0, t._tryExitTrackingMode(!0), this
.startTrackingMode(new n.Point(e.localX, e.localY), new n.Point(i.x, e
.localY), new p.a(e))
}
}
_contextMenu(e) {
const t = e => e instanceof H.Separator,
i = this._customActions();
if (N.enabled("disable_no_source_context_menu")) return Promise.resolve(null);
const s = this._initActions(e).filter(e => null !== e);
i.remove.forEach(e => {
for (let t = 0; t < s.length; t++) {
const i = s[t];
if (i instanceof H.Action && i.getLabel() === e) {
s.splice(t, 1);
break
}
}
});
const r = i.top.concat(s).concat(i.bottom);
for (let e = r.length - 1; e > 0; e--) t(r[e]) && t(r[e - 1]) && r.splice(e, 1);
return r.length && t(r[0]) && r.splice(0, 1), r.length && t(r[r.length - 1]) && r
.splice(r.length - 1, 1), k.ContextMenuManager.createMenu(r, {
statName: "ChartContextMenu"
})
}
_initActions(e) {
var t;
const i = this._chart.actions(),
r = [];
r.push(i.chartReset), r.push(new H.Separator), N.enabled("datasource_copypaste") &&
!this.state().isEmpty() && (r.push(new H.Action({
label: Object(s.t)("Paste %s").replace("%s", "").trim(),
shortcutHint: Object(G.humanReadableHash)(G.Modifiers.Mod + 86),
statName: "Paste",
onExecute: () => this._chart.chartWidgetCollection().clipboard
.uiRequestPaste(this.state())
})), r.push(new H.Separator)), r[r.length - 1] instanceof H.Separator || r.push(
new H.Separator);
return window.widgetbar && (!window.widgetbar._customization || window.widgetbar
._customization.watchlist) && i.addToWatchlist && r.push(i.addToWatchlist),
N.enabled("text_notes") && r.push(i.addToTextNotes), r[r.length -
1] instanceof H.Separator || r.push(new H.Separator), r.push(this
._createLockTimeAxisAction(e)), r.push(new H.Separator), r.push(Object(E
.createLinesAction)(this._chart)), N.enabled("charting_library_base") || r
.push(i.applyColorTheme), r[r.length - 1] instanceof H.Separator || r.push(new H
.Separator), this._chart.applyIndicatorsToAllChartsAvailable() && (r.push(i
.applyStudiesToAllCharts), r.push(new H.Separator)), r.push(i
.paneRemoveAllDrawingTools), r.push(i.paneRemoveAllStudies), r.push(new H
.Separator), (null === (t = window.pro) || void 0 === t ? void 0 : t
.hasPackage("mtp-mtpredictor")) && this.state().containsMainSeries() && r
.push(Object(E.createMTPredictorActions)(this._chart, this.state(), this
._contextMenuX, this._contextMenuY), new H.Separator), r.push(i
.hideAllMarks), r.push(new H.Separator), N.enabled(
"show_chart_property_page") && r.push(i.chartProperties),
r[r.length - 1] instanceof H.Separator && r.pop(), r
}
_loadAndCreateLegendWidget() {
Promise.all([i.e("react"), i.e(72), i.e(7), i.e("chart-widget-gui")]).then(i.bind(
null, "sAH5")).then(e => {
if (this._isDestroyed) return;
const t = e.LegendWidget,
i = Object(h.deepExtend)({}, this._options.legendWidget);
i.canShowSourceCode = !this._chart.onWidget() && !o.CheckMobile.any(), i
.readOnlyMode = i.readOnlyMode || this._chart.readOnly(), i
.statusesWidgets = {
sourceStatusesEnabled: this._options
.sourceStatusesWidgetEnabled,
sourceStatuses: this._options.sourceStatusesWidget || {},
marketStatusEnabled: this._options.marketStatusWidgetEnabled,
marketStatus: this._options.marketStatusWidget || {},
dataUpdateModeEnabled: this._options.chartWarningWidgetEnabled,
dataUpdateMode: this._options.chartWarningWidget || {},
dataProblemEnabled: this._options.dataProblemWidgetEnabled
};
const s = new M.a(this._getHideNotMainSourcesValue());
this._hideNotMainSourcesInLegendSpawn = Object(O.a)(() => ({}), this
._chart.chartWidgetCollection().activeChartWidget, this._chart
.chartWidgetCollection().lock.crosshair), this
._hideNotMainSourcesInLegendSpawn.subscribe(() => {
s.setValue(this._getHideNotMainSourcesValue())
}), this._hideWholeLegend = new M.a(!1), g.tool.subscribe(this
._recalculateLegendVisibility), this._chartModel()
.crossHairSource().measuringEnabled().subscribe(this, this
._recalculateLegendVisibility), this._legendWidget = new t(this
._chartUndoModel(), this, this._chart.backgroundTopTheme(), s,
this._hideWholeLegend, i, {
showContextMenuForSelection: this
.showContextMenuForSelection.bind(this),
showContextMenuForSources: this.showContextMenuForSources
.bind(this),
updateActions: this._chart.updateActions.bind(this._chart),
showChartPropertiesForSource: this._chart
.showChartPropertiesForSource.bind(this._chart),
showGeneralChartProperties: this._chart
.showGeneralChartProperties.bind(this._chart),
showObjectsTreeDialog: this._chart.showObjectsTreeDialog
.bind(this._chart)
}), this._div.appendChild(this._legendWidget.getElement()), this
._legendWidget.updateLayout(), this._legendWidget
.updateWidgetModeBySize(this._size), this._legendWidget
.updateThemedColors(this._themedTopColor);
for (const e of Array.from(this._customLegendWidgetsFactoryMap.keys()))
this._legendWidget.addCustomWidgetToLegend(e, Object(r
.ensureDefined)(this._customLegendWidgetsFactoryMap.get(e)))
})
}
_loadAndCreatePaneControlsWidget() {
Promise.all([Promise.all([i.e("react"), i.e(72), i.e(7), i.e("chart-widget-gui")])
.then(i.bind(null, "lvAK")), Promise.all([i.e("react"), i.e(72), i.e(7),
i.e("chart-widget-gui")
]).then(i.bind(null, "MjAr"))
]).then(([e, t]) => {
if (this._isDestroyed) return;
const i = e.PaneControlsWidget;
this._paneControls = new i(this._chartUndoModel(), this, {
backgroundThemeName: this._chart.backgroundTopTheme()
}, {
toggleMaximizePane: this._chart.toggleMaximizePane.bind(this
._chart)
}, this._div), this._paneControls.updateWidgetModeByWidth(this._size
.w), this._paneControls.updateThemedColors(this
._themedTopColor), this._paneControlsResizeObserver = new t
.default(
this._handleRestrictLegendWidth.bind(this)), this
._paneControlsResizeObserver.observe(this._paneControls
.getElement())
})
}
_handleRestrictLegendWidth(e) {
if (null === this._legendWidget || null === this._paneControls) return;
const t = e[e.length - 1].contentRect.width,
i = 0 === t ? 0 : t + J + Z;
this._legendWidget.addMargin(i)
}
_onMagnetStateChanged() {
this._chart.isActive() && this._isToolActionActiveOnPane(!0) && this._chartModel()
.crossHairSource().visible && this._updateLineToolUsingMagnetOrShift()
}
_onShiftKeyStateChanged() {
this._chart.isActive() && this._isToolActionActiveOnPane(!1) && this._chartModel()
.crossHairSource().visible && this._updateLineToolUsingMagnetOrShift(p.a.create(
Object(Y.d)().value()))
}
_isToolActionActiveOnPane(e) {
const t = this._chartModel(),
i = t.lineBeingCreated() || t.lineBeingEdited() || t.sourcesBeingMoved()
.length > 0 && t.sourcesBeingMoved()[0];
return i ? t.paneForSource(i) === this._state : e && Object(f.isLineToolName)(g.tool
.value()) && t.crossHairSource().pane === this._state
}
_updateLineToolUsingMagnetOrShift(e) {
if (null === this._prevMoveEventPosition) return;
const {
x: t,
y: i
} = this._prevMoveEventPosition, s = this._chartModel().sourcesBeingMoved();
s.length > 0 ? this._alignSourcesThatBeingMoved(s, t, i, e) : this
._setCursorPosition(t, i, e)
}
_showEditDialogForSource(e, t) {
if (this._options.propertyPagesEnabled && e.userEditEnabled())
if (e === this._chartUndoModel().mainSeries()) this._chart
.showGeneralChartProperties(R.TabNames.symbol);
else if (Object(f.isLineTool)(e) || Object(_.isStudy)(e)) {
let i;
const s = null == t ? void 0 : t.data();
if (null != s) {
const e = s.areaName;
void 0 !== e && (i = ae.get(e))
}
this._chart.showChartPropertiesForSource(e, i).then(e => {
this._editDialog = e
})
}
}
_initToolCreationModeParams(e) {
this._startTouchPoint = new n.Point(e.pageX, e.pageY), this._initCrossHairPosition =
this._chartModel().crossHairSource().currentPoint()
}
_updateCrosshairPositionInToolCreationMode(e, t) {
if (t !== this._state) {
const i = this._chart.paneByState(t);
return i._startTouchPoint = this._startTouchPoint, i._initCrossHairPosition =
this._initCrossHairPosition, void i
._updateCrosshairPositionInToolCreationMode(e, t)
}
const i = this._chartModel().crossHairSource();
this._chart.justActivated() && (this._initCrossHairPosition = i.currentPoint());
const s = e.pageX,
o = e.pageY,
a = Object(r.ensureNotNull)(this._initCrossHairPosition),
l = new n.Point(s, o).subtract(Object(r.ensureNotNull)(this._startTouchPoint)),
c = a.add(l);
this._setCursorPosition(c.x, c.y, new p.a(e))
}
_priceAxisesContainer(e) {
return "left" === e ? this._lhsPriceAxisesContainer : this._rhsPriceAxisesContainer
}
_recalculatePriceScales() {
const e = this.state();
for (const t of e.leftPriceScales()) e.recalculatePriceScale(t);
for (const t of e.rightPriceScales()) e.recalculatePriceScale(t);
for (const t of e.sourcesByGroup().overlayPriceScaleSources()) Object(f.isLineTool)(
t) || e.recalculatePriceScale(t.priceScale())
}
_createLockTimeAxisAction(e) {
const t = Object(g.lockTimeAxis)().value();
return new H.Action({
label: Object(s.t)("Lock Vertical Line On Time Axis"),
statName: "LockCursorInTime",
checkable: !0,
checked: t,
onExecute: () => this._toggleLockTimeAxis(e.localX, !t)
})
}
_toggleLockTimeAxis(e, t) {
if (t) {
const t = this._chartUndoModel().timeScale(),
i = t.coordinateToIndex(e),
s = t.points().roughTime(i);
null !== s && g.lockTimeAxisTime.setValue(s)
}
Object(g.lockTimeAxis)().setValue(t)
}
_preventTouchEventsExceptPinch() {
return this._paneWidgetsSharedState.hasTouchesOnOtherPanes(this) || null !== this
._paneWidgetsSharedState.pinchingPane()
}
_updateHoveredSource(e, t, i) {
var s, r, n;
const o = this._chartUndoModel(),
a = o.model();
let l = !1;
const c = e && e.source,
h = this._chart.readOnly();
if (h && !Object(f.isLineTool)(e.source) || this._editDialog && this._editDialog
.visible().value()) h && (a.setHoveredSource(null, null), this
.setCursorForTool());
else {
const d = g.tool.value();
let p = null;
if (!this._processing && (Object(g.toolIsCursor)(d) || "eraser" === d && !h || t
.control() || !o.lineBeingCreated())) {
const {
hittest: t
} = e;
l = Boolean(null === (s = null == t ? void 0 : t.data()) || void 0 === s ?
void 0 : s.hideCrosshairLinesOnHover) || !!c && Object(f.isLineTool)
(c) && -1 !== X.indexOf(c.toolname), t && t.result() > u.HitTestResult
.MOVEPOINT_BACKGROUND ? (p = c, !(null == c ? void 0 : c
.isHoveredEnabled()) || "eraser" === d && c === o.mainSeries() ?
a.setHoveredSource(null, null) : a.setHoveredSource(c, null == t ?
void 0 : t.data())) : a.setHoveredSource(null, null)
}
h ? this.setCursorForTool(p, t, j.PaneCursorType.Default) : this._options
.sourceSelectionEnabled && (this._isSelectPointModeEnabled() ? this
._setCursorClassName("pointer") : this.setCursorForTool(p, t, null === (
n = null === (r = null == e ? void 0 : e.hittest) || void 0 ===
r ? void 0 : r.data()) || void 0 === n ? void 0 : n.cursorType));
const _ = o.model().customSourceBeingMoved(),
m = null !== _ ? [_] : o.model().sourcesBeingMoved(),
b = e.source;
if ((!m.length || null !== b && -1 === m.indexOf(b)) && this
._updateCommonTooltip(e), !h && null !== e.hittest && i && e.hittest
.hasPressedMoveHandler(i)) {
switch ((e.hittest.data() || {}).cursorType) {
case j.PaneCursorType.VerticalResize:
this._setCursorClassName("ns-resize");
break;
case j.PaneCursorType.HorizontalResize:
this._setCursorClassName("we-resize");
break;
case j.PaneCursorType.DiagonalNeSwResize:
this._setCursorClassName("nesw-resize");
break;
case j.PaneCursorType.DiagonalNwSeResize:
this._setCursorClassName("nwse-resize")
}
}
}
this._preventCrossHairMove() && this._clearCursorPosition(), this._chartModel()
.crossHairSource().setLinesShouldBeHidden(l)
}
}
},
UHyS: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StandardPivotPointsPriceAxisView", (function() {
return n
}));
var s = i("KcY8");
const r = ["P", "S1", "R1", "S2", "R2", "S3", "R3", "S4", "R4", "S5", "R5"];
class n extends s.a {
constructor(e, t) {
super(), this._source = e, this._data = t;
const i = t.name;
this._completeName = "P" === i.toUpperCase() ? "P" : `S${i[1]}/R${i[1]}`
}
_updateRendererData(e, t, i) {
e.visible = !1, t.visible = !1;
const s = this._source.properties();
if (!s.visible.value()) return;
const n = this._completeName,
o = s.levelsStyle.visibility;
if (!o[n] || !o[n].value()) return;
const a = this._source.model().timeScale(),
l = this._source.priceScale();
if (a.isEmpty() || null === a.visibleBarsStrictRange() || null !== l && l
.isEmpty()) return;
const c = this._source.customData();
if (!c || !c.pivots) return;
const h = this._source.pricesView().prices()[r.indexOf(this._data.name
.toUpperCase())];
if (!h) return;
i.background = h.color, i.textColor = this.generateTextColor(h.color), i
.coordinate = h.coordinate, i.floatCoordinate = h.floatCoordinate;
const u = this._source.model().properties().scalesProperties;
u.showStudyLastValue.value() && (e.text = h.formatted, e.visible = !0), u
.showStudyPlotLabels.value() && (t.text = this._source.priceLabelText(this
._data.name), t.visible = !0)
}
}
},
USzt: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return c
}));
var s = i("Eyy1"),
r = i("cBZt"),
n = i("MSvv"),
o = i("jenN"),
a = i("wYrq");
const l = Object(r.studyIdString)("VbPFixed", "tv-volumebyprice");
class c extends n.StudyLineDataSource {
constructor(e, t, i, s) {
const r = i || e.studyMetaInfoRepository().findByIdSync({
type: "java",
studyId: l
}),
n = t || c._createPropertiesFromStudyMetaInfo(r, e.studyVersioning());
super(e, r, "vbpfixed_", n), Object(o.createGraphicsPaneViews)(this, e).then(
t => {
if (s = e.mainSeries(), r.plots.length > 0) {
const i = new a.a(this, s, e, r.plots[0].id);
t.push(i)
}
if (r.plots.length > 1) {
const i = new a.a(this, s, e, r.plots[1].id);
t.push(i)
}
if (r.plots.length > 2) {
const i = new a.a(this, s, e, r.plots[2].id);
t.push(i)
}
this._setPaneViews(t)
}), this.clearData()
}
pointsCount() {
return 2
}
boundToSymbol() {
return !1
}
offset(e) {
return 0
}
getMinFirstBarIndexForPlot() {
return -1 / 0
}
calcIsActualSymbol() {
this._isActualSymbol = !0, this._isActualCurrency = !0, this._isActualUnit = !0,
this.calcIsActualInterval()
}
cloneable() {
return !1
}
isSynchronizable() {
return !1
}
static createProperties(e) {
const t = super._createPropertiesFromStudyIdAndState(l, e);
return c._configureProperties(t), t
}
static studyId() {
return l
}
_studyInputs(e) {
Object(s.assert)(2 === e.length, "all the line tool points should be defined");
const [t, i] = e, r = Math.max(t.index, i.index), n = this._model.mainSeries()
.bars().lastIndex(), o = this._getPointTime(t.index <= i.index ? t : i, !0),
a = this._getPointTime(i.index >= t.index ? i : t, !0);
return null === o || null === a ? (this
._subscribeApplyInputsOnSeriesCompleted(), null) : {
rowsLayout: this.properties().inputs.rowsLayout.value(),
rows: this.properties().inputs.rows.value(),
volume: this.properties().inputs.volume.value(),
vaVolume: this.properties().inputs.vaVolume.value(),
first_bar_time: 1e3 * o,
last_bar_time: 1e3 * a,
subscribeRealtime: n === r
}
}
_isReady() {
return !Object(o.isStudyGraphicsEmpty)(this.graphics())
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(61), i.e(62), i.e(
"study-property-pages-with-definitions")]).then(i.bind(null, "cKLu"))
.then(e => e.StudyLineDataSourceDefinitionsViewModel)
}
_updateAnchorsPrice() {
let e = null,
t = null;
this.graphics().hhists().forEach(i => {
i.forEach(i => {
const s = i.priceLow,
r = i.priceHigh;
(!e || s < e) && (e = s), (!t || r > t) && (t = r)
})
}), null !== e && null !== t && (this._timePoint.length && (this._timePoint[
0].price = t, this._timePoint[1].price = e), this._points.length &&
(this._points[0].price = t, this._points[1].price = e))
}
}
},
UlDV: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "RestrictedToolsetBootloader", (function() {
return r
}));
var s = i("cZRT");
class r extends s.a {
_startLoading() {
return Promise.all([i.e("react"), i.e(1), i.e(4), i.e(6), i.e(11), i.e(12), i.e(
13), i.e(14), i.e(22), i.e(24), i.e(28), i.e(29), i.e(41), i.e(
51), i.e(52), i.e(64), i.e(66), i.e(69), i.e(70), i.e(71), i.e(
0), i.e(5), i.e(7), i.e(10), i.e(38), i.e(57), i.e(
"restricted-toolset")]).then(i.bind(null, "miV2")).then(e => e
.getRestrictedToolSet())
}
}
},
Ulff: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
const s = {
common: i("HGP3").colorsPalette["color-tv-blue-500"],
active: "#143EB3"
}
},
UqOQ: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return l
}));
var s = i("aIyQ"),
r = i.n(s),
n = i("e3/o");
function o(e) {
return e.properties().visible.value()
}
function a(e) {
return !o(e)
}
class l {
constructor(e, t, i) {
this._onChanged = new r.a, this._lineToolsSet = new Set, this._lineTools = [...e],
this._lineToolsSet = new Set(this._lineTools), this._name = t, this.id = i ||
Object(n.randomHashN)(6), this.instanceId = Object(n.randomHashN)(6)
}
lineTools() {
return this._lineTools
}
name() {
return this._name
}
setName(e) {
this._doAndFireOnChange(() => {
this._name = e
})
}
isActualSymbol() {
return this._lineTools.length > 0 && this._lineTools[0].isActualSymbol() && this
._lineTools[0].isActualCurrency() && this._lineTools[0].isActualUnit()
}
symbol() {
return this._lineTools[0].symbol()
}
currencyId() {
var e;
return null !== (e = this._lineTools[0].properties().childs().currencyId.value()) &&
void 0 !== e ? e : null
}
unitId() {
var e;
return null !== (e = this._lineTools[0].properties().childs().unitId.value()) &&
void 0 !== e ? e : null
}
containsLineTool(e) {
return this._lineToolsSet.has(e)
}
addLineTools(e) {
this._doAndFireOnChange(t => {
e.forEach(i => {
this._lineToolsSet.add(i), t.push(...e.map(e => e.id()))
}), this._lineTools.push(...e)
})
}
excludeLineTool(e) {
this._doAndFireOnChange(t => {
this._lineToolsSet.delete(e);
const i = this._lineTools.indexOf(e);
this._lineTools.splice(i, 1), t.push(e.id())
})
}
excludeLineTools(e) {
this._doAndFireOnChange(t => {
const i = new Set(e);
e.forEach(e => this._lineToolsSet.delete(e)), this._lineTools = this
._lineTools.filter(e => !i.has(e)), t.push(...e.map(e => e.id()))
})
}
state() {
return {
id: this.id,
name: this._name,
tools: this._lineTools.map(e => e.id())
}
}
visibility() {
const e = this._lineTools.some(o),
t = this._lineTools.some(a);
return e && !t ? "Visible" : t && !e ? "Invisible" : "Partial"
}
locked() {
const e = this._lineTools.some(e => e.properties().frozen.value()),
t = this._lineTools.some(e => !e.properties().frozen.value());
return e && !t ? "Locked" : t && !e ? "Unlocked" : "Partial"
}
isActualInterval() {
const e = this._lineTools.some(e => e.isActualInterval()),
t = this._lineTools.some(e => !e.isActualInterval());
return e && !t ? "IsActualInterval" : t && !e ? "IsNotActualInterval" : "Partial"
}
onChanged() {
return this._onChanged
}
static fromState(e, t) {
const i = [];
for (const s of t.tools) {
const t = e.dataSourceForId(s);
null !== t && i.push(t)
}
return i.length > 0 ? new l(i, t.name, t.id) : null
}
_doAndFireOnChange(e) {
const t = [],
i = this.visibility(),
s = this.locked(),
r = this.name(),
n = this.isActualInterval();
e(t);
const o = {
affectedLineTools: t,
visibilityChanged: this.visibility() !== i,
lockedChanged: s !== this.locked(),
titleChanged: r !== this.name(),
isActualIntervalChanged: n !== this.isActualInterval()
};
this._onChanged.fire(o)
}
}
},
V086: function(e, t, i) {
"use strict";
var s = i("aO4+").Point,
r = i("GEp6").distanceToLine,
n = i("Ss5c").LineDataSource,
o = i("Ocx9").DefaultProperty,
a = i("j3hX").LineToolColorsProperty;
class l extends n {
constructor(e, t) {
super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views")
.then(i.t.bind(null, "obU/", 7)).then(({
EllipsePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
startChanging(e, t) {
if (super.startChanging(e, t), 0 === e || 1 === e) {
var i = this.pointToScreenPoint(this._points[0])[0],
s = this.pointToScreenPoint(this._points[1])[0],
n = this.pointToScreenPoint(this._points[2])[0];
this._dist = r(i, s, n).distance || 0
}
}
_preparePoint(e, t) {
var i = this._preparePointInternal(e, t, !1);
return t && t.shift() && this._points[0].index === this._points[1].index && this
._fixVerticalDiameterPoints(this._points[1], this._points[0], i), i
}
_preparePointInternal(e, t, i) {
var r = Object.assign({}, e);
if (t && t.shift()) {
var n = this.points().length;
if (!this._fakePointAdded && 3 === n && !i) return r;
if (this._fakePointAdded || 2 === n || i) {
this._snapPoint45Degree(e, this._points[0]), this._fakePointAdded ? this
._points[1] = e : i || (this._fakePointAdded = !0, super
._addPointIntenal(e));
var o = this.pointToScreenPoint(this._points[0])[0],
a = this.pointToScreenPoint(this._points[1])[0],
l = a.x - o.x,
c = a.y - o.y,
h = Math.sqrt(l * l + c * c) / 2,
u = a.subtract(o),
d = o.add(a).scaled(.5),
p = new s(-u.y, u.x);
p = p.normalized();
var _ = d.add(p.scaled(h));
r = this.screenPointToPoint(_), (TradingView.isNaN(r.price) || TradingView
.isNaN(r.index)) && (r = this.screenPointToPoint(d))
}
} else this._fakePointAdded && (this._points.splice(1, 1), this._fakePointAdded = !
1);
return r
}
_fixVerticalDiameterPoints(e, t, i) {
var s = this.pointToScreenPoint(e)[0],
r = this.pointToScreenPoint(t)[0],
n = this._model.timeScale(),
o = n.indexToCoordinate(e.index),
a = n.indexToCoordinate(i.index),
l = 2 * Math.abs(o - a);
l *= t.price > e.price ? 1 : -1, e.price = this.screenPointToPoint({
x: s.x,
y: r.y + l
}).price
}
addPoint(e, t, i) {
var s = n.prototype.addPoint.call(this, e, t, i);
return s && (this._fakePointAdded = !1), s
}
setPoint(e, t, i) {
var n = Object.assign({}, t),
o = this.pointToScreenPoint(this._points[0])[0],
a = this.pointToScreenPoint(this._points[1])[0],
l = this.pointToScreenPoint(this._points[2])[0];
switch (e) {
case 0:
if (i && i.shift()) {
this._snapPoint45Degree(n, this._points[1]), this._points[0] = n, this
._points[2] = this._preparePointInternal(this._points[2], i, !0),
this._points[0].index === this._points[1].index && this
._fixVerticalDiameterPoints(this._points[0], this._points[1], this
._points[2]);
break
}
o = this.pointToScreenPoint(n)[0];
var c = a.subtract(o),
h = o.add(a).scaled(.5);
d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(this._dist)),
l = this.screenPointToPoint(l), this._points[0] = n, this._points[2] =
l;
break;
case 1:
if (i && i.shift()) {
this._snapPoint45Degree(n, this._points[0]), this._points[1] = n, this
._points[2] = this._preparePointInternal(this._points[2], i, !0),
this._points[0].index === this._points[1].index && this
._fixVerticalDiameterPoints(this._points[1], this._points[0], this
._points[2]);
break
}
c = (a = this.pointToScreenPoint(n)[0]).subtract(o), h = o.add(a).scaled(
.5);
d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(this._dist)),
l = this.screenPointToPoint(l), this._points[1] = n, this._points[2] =
l;
break;
case 2:
n = this.pointToScreenPoint(n)[0];
var u = r(o, a, n).distance;
c = a.subtract(o), h = o.add(a).scaled(.5);
d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(u)), l = this
.screenPointToPoint(l), this._points[2] = l;
break;
case 3:
n = this.pointToScreenPoint(n)[0];
var d;
u = r(o, a, n).distance, c = a.subtract(o), h = o.add(a).scaled(.5);
d = (d = new s(-c.y, c.x)).normalized(), l = h.add(d.scaled(u)), l = this
.screenPointToPoint(l), this._points[2] = l
}
this.normalizePoints()
}
pointsCount() {
return 3
}
name() {
return "Ellipse"
}
hasEditableCoordinates() {
return !1
}
migrateVersion(e, t, i) {
if (1 === e && 2 === this._points.length) {
var s = this._points[0].price,
r = .5 * (this._points[0].price + this._points[1].price);
this._points[0] = {
price: r,
index: this._points[0].index
}, this._points[1] = {
price: r,
index: this._points[1].index
}, this._points.push({
price: s,
index: this._points[0].index
})
}
if (1 === e && 2 === this._timePoint.length) {
s = this._timePoint[0].price, r = .5 * (this._timePoint[0].price + this
._timePoint[1].price);
this._timePoint[0].price = r, this._timePoint[1].price = r;
var n = {
price: s,
offset: this._timePoint[0].offset,
time_t: this._timePoint[0].time_t
};
this._timePoint.push(n)
}
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D")))
.GeneralFiguresDefinitionsViewModel
}
static createProperties(e) {
var t = new o("linetoolellipse", e);
return l._configureProperties(t), t
}
static _configureProperties(e) {
n._configureProperties(e), e.addChild("linesColors", new a([e.childs().color]))
}
}
l.version = 2, t.LineToolEllipse = l
},
V3Oj: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolText", (function() {
return h
})), i.d(t, "LineToolTextAbsolute", (function() {
return u
}));
var s = i("Eyy1"),
r = i("aO4+"),
n = i("Ss5c"),
o = i("tc+8"),
a = i.n(o),
l = i("Ocx9"),
c = i("j3hX");
class h extends n.LineDataSource {
constructor(e, t) {
const s = t || h.createProperties();
super(e, s), this._barSpacing = e.timeScale().barSpacing(), this
._recalculatePointsOnCenter = !1, i.e("lt-pane-views").then(i.bind(null,
"mr3a")).then(({
TextPaneView: t
}) => {
const i = this._recalculatePointsOnCenter ? (e, t) => {
this._recalculatePointsOnCenter && this
._recalculateCenterPosition(e, t)
} : void 0;
this._setPaneViews([new t(this, e, void 0, void 0, void 0, void 0,
void 0, i)])
})
}
centerPosition() {
this._recalculatePointsOnCenter = !0
}
setPoint(e, t, i) {
const s = this.properties().childs();
let r;
if (0 === e && s.wordWrapWidth.value()) {
const e = this.model().timeScale();
r = this.isFixed() ? this.fixedPoints()[0].x : e.indexToCoordinate(this
.points()[0].index);
const i = e.indexToCoordinate(t.index) - r - ~~(s.fontsize.value() / 6);
if (!isFinite(i)) return;
s.wordWrapWidth.setValue(Math.max(100, i))
}
}
pointsCount() {
return 1
}
name() {
return "Text"
}
setPriceScale(e) {
super.setPriceScale(e), e && e.priceRange() && (this._priceDencity = e
.height() / Object(s.ensureNotNull)(e.priceRange()).length(), this
._isPriceDencityLog = e.isLog())
}
restoreSize() {
const e = Object(s.ensureNotNull)(this.priceScale());
this._barSpacing = this.model().timeScale().barSpacing(),
this._priceDencity = e.height() / Object(s.ensureNotNull)(e.priceRange())
.length(), this.redraw()
}
redraw() {
this.updateAllViews(), this._model.updateSource(this)
}
properties() {
return super.properties()
}
template() {
const e = super.template();
return e.text = this.properties().childs().text.value(), e
}
state(e) {
const t = super.state(e);
return e && (t.state.fixedSize = !1), t
}
barSpacing() {
return this._barSpacing
}
priceDencity() {
return this._priceDencity
}
isPriceDencityLog() {
return this._isPriceDencityLog
}
hasEditableCoordinates() {
return !1
}
static createProperties(e) {
const t = new l.DefaultProperty("linetooltext", e);
return h._configureProperties(t), t
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "QWxu")).then(
e => e.TextDefinitionsViewModel)
}
static _configureProperties(e) {
n.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
"text", new a.a(window.t("Text"))), e.addExclusion("text"), e.addChild(
"linesColors", new c.LineToolColorsProperty([e.childs().borderColor])),
e.addChild("textsColors", new c.LineToolColorsProperty([e.childs().color])),
e.addExclusion("linesColors"), e.addExclusion("textsColors")
}
_recalculateCenterPosition(e, t) {
const i = (this.isFixed() ? this.fixedPoints() : this.pointToScreenPoint(this
._points[0]))[0],
s = new r.Point(i.x - e / 2, i.y - t / 2),
n = this.screenPointToPoint(s);
this.setPoints([n]), this.normalizePoints(), this.createServerPoints(), this
.redraw()
}
}
class u extends h {
constructor(e, t) {
super(e, t || u.createProperties())
}
name() {
return "Anchored Text"
}
hasEditableCoordinates() {
return !1
}
isFixed() {
return !0
}
static createProperties(e) {
const t = new l.DefaultProperty("linetooltextabsolute", e);
return u._configureProperties(t), t
}
static _configureProperties(e) {
h._configureProperties(e)
}
}
},
VNzU: function(e, t, i) {
"use strict";
i.r(t);
i("Dq3s");
i.d(t, "layouts", (function() {
return r
})), i.d(t, "isSingleLayout", (function() {
return n
})), i.d(t, "isMultipleLayout", (function() {
return o
}));
let s;
s = {};
const r = {
...{
s: {
title: "1 chart",
count: 1,
sizer: (e, t) => {
if (0 !== t) throw new RangeError("invalid index");
return e
}
}
},
...s
};
function n(e) {
return "s" === e
}
function o(e) {
return !n(e)
}
},
VVxS: function(e, t, i) {
"use strict";
const {
getLogger: s
} = i("txPx"), r = s("TVLocalStorage");
var n = function() {
try {
this.isAvailable = !0, this.localStorage = window.localStorage, this.localStorage
.setItem("tvlocalstorage.available", "true")
} catch (e) {
delete this.isAvailable, delete this.localStorage
}
this._updateLength();
try {
this._report()
} catch (e) {}
};
n.prototype._report = function() {
if (this.isAvailable) {
const e = 10,
t = [];
for (let e = 0; e < this.localStorage.length; e++) {
const i = this.key(e);
t.push({
key: i,
length: String(this.getItem(i)).length
})
}
t.sort((e, t) => t.length - e.length);
const i = t.slice(0, e);
t.sort((e, t) => t.key.length - e.key.length);
const s = t.slice(0, e);
r.logNormal("Total amount of keys in Local Storage: " + this.length), r.logNormal(
`Top ${e} keys with longest values: ${JSON.stringify(i)}`),
r.logNormal(`Top ${e} longest key names: ${JSON.stringify(s)}`);
try {
navigator.storage.estimate().then(e => {
r.logNormal("Storage estimate: " + JSON.stringify(e))
})
} catch (e) {}
}
}, n.prototype.length = 0, n.prototype.isAvailable = !1, n.prototype.localStorage = {
"tvlocalstorage.available": "false"
}, n.prototype._updateLength = function() {
if (this.isAvailable) this.length = this.localStorage.length;
else {
var e, t = 0;
for (e in this.localStorage) this.localStorage.hasOwnProperty(e) && t++;
this.length = t
}
}, n.prototype.key = function(e) {
return this.isAvailable ? this.localStorage.key(e) : Object.keys(this.localStorage)[e]
}, n.prototype.getItem = function(e) {
return this.isAvailable ? this.localStorage.getItem(e) : void 0 === this.localStorage[
e] ? null : this.localStorage[e]
}, n.prototype.setItem = function(e, t) {
this.isAvailable ? this.localStorage.setItem(e, t) : this.localStorage[e] = t, this
._updateLength()
}, n.prototype.removeItem = function(e) {
this.isAvailable ? this.localStorage.removeItem(e) : delete this.localStorage[e], this
._updateLength()
}, n.prototype.clear = function() {
this.isAvailable ? this.localStorage.clear() : this.localStorage = {}, this
._updateLength()
};
var o = function(e) {
this.storage = e
};
o.prototype.getItem = function(e) {
return Promise.resolve(this.storage.getItem(e))
}, o.prototype.setItem = function(e, t) {
return Promise.resolve(this.storage.setItem(e, t))
}, window.TVLocalStorage = new n, window.TVLocalStorageAsync = new o(window.TVLocalStorage),
e.exports = {
TVLocalStorage: window.TVLocalStorage,
TVLocalStorageAsync: window.TVLocalStorageAsync
}
},
VaSN: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "lastEventIsTouch", (function() {
return n
})), i.d(t, "lastEventIsMouse", (function() {
return o
})), i.d(t, "setLastEventIsTouch", (function() {
return a
}));
var s = i("qFKp");
let r = Object(s.supportTouch)();
function n() {
return r
}
function o() {
return r
}
function a(e) {
r = e
}
},
VdBB: function(e, t, i) {
"use strict";
function s(e, t, i) {
if (e.isTouch) {
if (void 0 !== i) return !0
} else if (void 0 !== t) return !0;
return !1
}
function r(e, t, i) {
if (e.isTouch) {
if (void 0 !== i) return i(e), !0
} else if (void 0 !== t) return t(e), !0;
return !1
}
function n(e, t, i, s) {
return void 0 !== t.executeDefaultAction && (e.isTouch ? Boolean(t.executeDefaultAction[
s]) : Boolean(t.executeDefaultAction[i]))
}
var o;
i.r(t), i.d(t, "hasMouseOrTouchHandler", (function() {
return s
})), i.d(t, "tryCallHandler", (function() {
return r
})), i.d(t, "shouldDefaultActionBeExecuted", (function() {
return n
})), i.d(t, "AreaName", (function() {
return o
})), i.d(t, "HitTestResult", (function() {
return a
})),
function(e) {
e.Style = "Style", e.Text = "Text", e.SourceItemMove = "SourceItemMove"
}(o || (o = {}));
class a {
constructor(e, t, i) {
this._result = e, this._data = t || null, this._eraseMarker = i
}
result() {
return this._result
}
data() {
return this._data
}
hasPressedMoveHandler(e) {
return null !== this._data && s(e, this._data.pressedMouseMoveHandler, this._data
.touchMoveHandler)
}
tryCallMouseDownOrTouchStartHandler(e) {
return null !== this._data && r(e, this._data.mouseDownHandler, this._data
.touchStartHandler)
}
tryCallMouseUpOrTouchEndHandler(e) {
return null !== this._data && r(e, this._data.mouseUpHandler, this._data
.touchEndHandler)
}
tryCallMouseEnterHandler(e) {
return null !== this._data && r(e, this._data.mouseEnterHandler)
}
tryCallMouseLeaveHandler(e) {
return null !== this._data && r(e, this._data.mouseLeaveHandler)
}
tryCallMouseMoveHandler(e) {
return null !== this._data && r(e, this._data.mouseMoveHandler)
}
tryCallClickOrTapHandler(e) {
return null !== this._data && r(e, this._data.clickHandler, this._data.tapHandler)
}
tryCallDblClickOrDblTapHandler(e) {
return null !== this._data && r(e, this._data.doubleClickHandler, this._data
.doubleTapHandler)
}
tryCallContextMenuHandler(e) {
return null !== this._data && r(e, this._data.contextMenuHandler, this._data
.touchContextMenuHandler)
}
eraseMarker() {
return this._eraseMarker
}
}
a.MOVEPOINT_BACKGROUND = 1, a.REGULAR = 2, a.MOVEPOINT = 3, a.CHANGEPOINT = 4, a.CUSTOM = 5
},
Vdly: function(e, t, i) {
"use strict";
(function(e) {
i("qFKp");
i("wVAQ").fetch;
var t = i("dTSQ").regExpEscape,
s = i("FBuY").TVXWindowEvents,
r = i("VVxS").TVLocalStorage,
n = i("aIyQ"),
o = i("Kxc7"),
a = ["s.tradingview.com", "betacdn.tradingview.com"],
l = o.enabled("use_localstorage_for_settings"),
c = window.TVSettings = function() {
var e = !1,
i = null;
function h() {
return !i && l
}
try {
e = !TradingView.onWidget() && parent && parent !== window && !!parent
.IS_DEMO_PAGE
} catch (e) {}
if (e) {
var u = {
"widgetbar.layout-settings": {
widgets: {},
settings: {
minimized: !0
}
},
notShowMainWizard: !0
},
d = function(e, t, i) {
var s = u[e];
return null == s ? t : s
},
p = function() {};
return {
loaded: !1,
loadedModel: !1,
getValue: d,
getJSON: d,
getBool: d,
getFloat: d,
getInt: d,
setValue: p,
setJSON: p,
remove: p,
keys: function() {
return Object.keys(u)
},
keysMask: function() {
return []
},
sync: p,
onSync: {
subscribe: function() {}
}
}
}
window.environment;
var _, m = TradingView.onWidget() ? "tradingview-widget" : "tradingview",
f = m + ".",
g = {},
b = [/^widgetbar\.widget\.watchlist.+/, /.+quicks$/,
/^widgetbar\.layout-settings$/, /^ChartSideToolbarWidget\.visible$/,
/^onwidget\.watchlist$/, /^domepanel.visible$/, /^orderpanel.visible$/,
/^chart\.favoriteDrawings$/, /^chart\.favoriteDrawingsPosition$/,
/^loadChartDialog.favorites$/,
/^ChartFavoriteDrawingToolbarWidget\.visible/,
/^trading\.chart\.proterty$/, /^trading_floating_toolbar\.position$/,
/^trading\.orderWidgetMode\./, /^symbolWatermark$/,
/^pinereference\.size$/, /^pinereference\.position$/, /^hint\.+/,
/^ChartDrawingToolbarWidget\.visible/
];
const v = ["current_theme.name"];
function S(e) {
return f + e
}
function y(e) {
return e.substring(f.length)
}
function w(e, t) {
var i = g[e];
return null == i ? t : i
}
function P(e, t, i) {
i = i || {};
var s = "" + t;
return g[e] !== s && (g[e] = s, x(e)), i.forceFlush && !_ && (_ =
setTimeout((function() {
_ = void 0, T()
}), 10)), c
}
function C(e, t) {
return t = t || {}, null != g[e] && (delete g[e], x(e)), t.forceFlush &&
T(), c
}
function x(e) {
if (i) null == g[e] ? i.removeValue(e) : i.setValue(e, g[e]);
else if (h()) try {
null == g[e] ? r.removeItem(S(e)) : r.setItem(S(e), g[e])
} catch (e) {} else 0;
s.emit("settings", JSON.stringify({
key: e,
value: g[e]
}))
}
function T(e) {}
function I() {
return Object.keys(g)
}
function M(e) {
for (var t = 0; t < b.length; ++t)
if (b[t].exec(e)) return !0;
return !1
}
function O(e) {
return e.substring(0, f.length) === f
}
function L(e) {
g = {};
const t = 0 === Object.keys(e).length;
t || function(e) {
Object.keys(e).forEach((function(t) {
g[t] = e[t] + ""
}))
}(e),
function(e) {
for (var t = r.length; t--;) {
var i = r.key(t);
i && O(i) && ((e || v.includes(y(i))) && P(y(i), r.getItem(i)),
r.removeItem(i))
}
}(t)
}
s.on("settings", (function(e) {
var t = JSON.parse(e);
null == t.value ? delete g[t.key] : g[t.key] = t.value
}));
var A = new n;
return document.addEventListener("visibilitychange", (function() {
"hidden" === document.visibilityState || document.hidden
})), window.addEventListener("beforeunload", (function() {})), {
loaded: !1,
loadedModel: !1,
getValue: w,
getJSON: function(e, t) {
var i = w(e, void 0);
if (null == i) return t;
try {
return JSON.parse(i)
} catch (i) {
return C(e), t
}
},
getBool: function(e, t) {
var i = w(e);
return null == i ? t : !(!i || "false" === i || 0 == +i)
},
getFloat: function(e, t, i) {
var s = w(e, void 0);
if (null == s) return t;
var r = parseFloat(s);
if (!isFinite(r)) throw new TypeError('"' + s +
'" is not float (key: "' + e + '")');
return r
},
getInt: function(e, t, i) {
var s = w(e, void 0);
if (null == s) return t;
var r = parseInt(s, 10);
if (!isFinite(r)) throw new TypeError('"' + s +
'" is not int (key: "' + e + '")');
return r
},
setValue: P,
setJSON: function(e, t, i) {
return P(e, JSON.stringify(t), i), c
},
remove: C,
keys: I,
keysMask: function(e, i) {
for (var s = I(), r = [], n = (e = new RegExp("^" + t(e)
.replace(/\\\*\\\*/gi, ".+").replace(/\\\*/gi,
"[^.]+") + "$", "gi"), s.length - 1); n >= 0; n--) e
.test(s[n]) && r.push(s[n]), e.lastIndex = 0;
return r
},
sync: function(e) {
null !== e ? (i ? L(i.initialSettings || {}) : h() ? (
function() {
if (TradingView.onWidget() && a.includes(window
.location.host))
for (var e = r.length; e--;) {
var t = r.key(e);
if (0 === t.indexOf("tradingview.")) {
var i = t.replace("tradingview.",
m + ".");
r.setItem(i, r.getItem(t)), r
.removeItem(t)
}
}
}(),
function() {
for (const e of v) g[e] && !r.getItem(S(e)) && r
.setItem(S(e), g[e])
}(),
function() {
g = {};
for (var e = !o.enabled(
"save_chart_properties_to_local_storage"
), t = r.length; t--;) {
var i = r.key(t);
if (i && O(i)) {
var s = i.substring(f.length);
e && !M(s) || (g[s] = r.getItem(i))
}
}
}()) : L(e || {}), A.fire()) : !0
},
onSync: A,
setSettingsAdapter: function(e) {
i = e
}
}
}();
e && e.exports && (e.exports = c)
}).call(this, i("YuTi")(e))
},
VgjZ: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PriceAxisRendererOptionsProvider", (function() {
return n
}));
var s = i("XlJ7"),
r = i("zDbI");
class n {
constructor(e) {
this._rendererOptions = {
borderSize: 1,
offsetSize: 5,
fontSize: NaN,
font: "",
color: "",
paneBackgroundColor: "",
paddingBottom: 0,
paddingInner: 0,
paddingOuter: 0,
paddingTop: 0,
lineSpacing: 0
}, this._chartModel = e
}
options() {
const e = this._rendererOptions,
t = this._chartModel.properties(),
i = t.scalesProperties.fontSize.value();
return e.fontSize !== i && (e.fontSize = i, e.font = Object(s.makeFont)(i, r
.CHART_FONT_FAMILY, ""), e.paddingTop = 2.5 / 12 * i, e.paddingBottom =
e.paddingTop, e.paddingInner = i / 12 * e.offsetSize, e.paddingOuter = i /
12 * e.offsetSize, e.lineSpacing = 2 / 12 * i), e.color = t.scalesProperties
.textColor.value(), e.paneBackgroundColor = t.paneProperties.background.value(),
this._rendererOptions
}
}
},
ViuT: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("Kxc7"),
n = i("jCNj"),
o = i("Y7w9"),
a = i("OLhd"),
l = i("tqok"),
c = i("/bs+");
function h(e) {
return 60 * e * 60 * 1e3
}
function u(e) {
return 60 * e * 1e3
}
const d = [{
divisor: 1,
weight: 18
}, {
divisor: (p = 1, 1e3 * p),
weight: 19
}, {
divisor: u(1),
weight: 20
}, {
divisor: u(5),
weight: 21
}, {
divisor: u(30),
weight: 22
}, {
divisor: h(1),
weight: 30
}, {
divisor: h(3),
weight: 31
}, {
divisor: h(6),
weight: 32
}, {
divisor: h(12),
weight: 33
}];
var p;
function _(e, t) {
if (null !== t) {
if (e.getUTCFullYear() !== t.getUTCFullYear()) return 70;
if (e.getUTCMonth() !== t.getUTCMonth()) return 60;
if (e.getUTCDate() !== t.getUTCDate()) return 50;
const i = t.getTime(),
s = e.getTime();
for (let e = d.length - 1; e >= 0; --e)
if (Math.floor(i / d[e].divisor) !== Math.floor(s / d[e].divisor)) return d[e]
.weight
}
return 18
}
function m(e, t, i = 0) {
if (0 === e.length) return [];
let s = i,
r = i;
const n = [];
for (; s < e.length;) r >= t.length ? (n.push({
old: s,
new: l.INVALID_TIME_POINT_INDEX
}), s++) : e[s].timeMs === t[r].timeMs ? (s !== r && n.push({
old: s,
new: r
}), s++, r++) : e[s].timeMs < t[r].timeMs ? (n.push({
old: s,
new: l.INVALID_TIME_POINT_INDEX
}), s++) : r++;
return n.sort((e, t) => {
if (e.new === t.new && e.new === l.INVALID_TIME_POINT_INDEX) return e.old - t
.old;
if (e.new === l.INVALID_TIME_POINT_INDEX) return -1;
if (t.new === l.INVALID_TIME_POINT_INDEX) return 1;
const i = e.old - e.new,
s = t.old - t.new;
return i > 0 ? s > 0 ? e.old - t.old : -1 : s < 0 ? t.new - e.new : 1
})
}
function f(e, t) {
return {
span: e.markWeight,
time: e.displayTime,
index: t
}
}
i.d(t, "SessionTimeScale", (function() {
return b
}));
const g = r.enabled("end_of_period_timescale_marks");
class b {
constructor() {
this._completed = !0, this._mainSymbolExtrapolator = null, this
._pointDataByTimePoint = new Map, this._seriesIds = new Set, this
._displayTimezone = null, this._minFutureBarsCount = 0, this
._sortedTimePoints = []
}
destroy() {
this.clearTimeScale()
}
setCompleted(e) {
this._completed = e
}
isCompleted() {
return this._completed
}
clearTimeScale() {
return this._pointDataByTimePoint.clear(), this._seriesIds.clear(), this
._sortedTimePoints = [], {
baseIndex: 0,
pointsIndex: 0,
indexChange: [],
marks: [],
points: []
}
}
indexOfTime(e) {
if (0 === this._sortedTimePoints.length) return null === this
._mainSymbolExtrapolator ? null : this._mainSymbolExtrapolator.indexOfTime(
e);
if (e < this._sortedTimePoints[0].timeMs) {
if (null === this._mainSymbolExtrapolator) return null;
const t = this._mainSymbolExtrapolator.indexOfTime(e),
i = this._mainSymbolExtrapolator.indexOfTime(this._sortedTimePoints[0]
.timeMs);
if (null === t || null === i) return null;
let s = t.index - i.index;
return i.timeMs !== this._sortedTimePoints[0].timeMs && (s -= 1), {
index: s,
timeMs: t.timeMs
}
}
if (e > this._sortedTimePoints[this._sortedTimePoints.length - 1].timeMs) {
if (null === this._mainSymbolExtrapolator) return null;
const t = this._mainSymbolExtrapolator.indexOfTime(e),
i = this._mainSymbolExtrapolator.indexOfTime(this._sortedTimePoints[this
._sortedTimePoints.length - 1].timeMs);
if (null === t || null === i) return null;
const s = t.index - i.index - 1;
return {
index: this._sortedTimePoints.length + s,
timeMs: t.timeMs
}
}
let t = Object(o.lowerbound)(this._sortedTimePoints, e, (e, t) => e.timeMs < t);
return this._sortedTimePoints[t].timeMs !== e && (t -= 1), {
index: t,
timeMs: this._sortedTimePoints[t].timeMs
}
}
setMainSymbolExtrapolator(e) {
this._mainSymbolExtrapolator = e, this._updateFutureBars(), this._fillPointsData(
this._sortedTimePoints, 0)
}
setMinFutureBarsCount(e) {
this._minFutureBarsCount = e, this._updateFutureBars()
}
minFutureBarsCount() {
return this._minFutureBarsCount
}
firstFutureBarIndex() {
return this._sortedTimePoints.length
}
firstSessionBarIndex() {
return 0 === this._sortedTimePoints.length ? null : 0
}
lastSessionBarIndex() {
return 0 === this._sortedTimePoints.length ? null : this._sortedTimePoints.length -
1
}
tickMarks(e = 0) {
const t = this.firstFutureBarIndex();
Object(s.assert)(e <= t, "tickmarks cannot be filtered in the future");
const i = this._futureBars().map((e, t) => ({
timeMs: e,
markWeight: 0,
displayTime: NaN
}));
this._fillPointsData(i, 0, 0 !== this._sortedTimePoints.length ? this
._sortedTimePoints[this._sortedTimePoints.length - 1].displayTime : null);
const r = [];
for (let t = e; t < this._sortedTimePoints.length; ++t) r.push(f(this
._sortedTimePoints[t], t));
const n = i.map((e, i) => f(e, i + t));
return r.concat(n)
}
setTimezone(e) {
this._displayTimezone = "exchange" === e ? null : Object(n.get_timezone)(e), this
._fillPointsData(this._sortedTimePoints, 0)
}
fillIndexesInRows(e) {
if (0 === e.length) return;
let t = -1,
i = Object(o.lowerbound)(this._sortedTimePoints, Math.round(1e3 * e[0].value[
0]), (e, t) => e.timeMs < t);
for (const r of e) {
const e = Math.round(1e3 * r.value[0]);
for (; i < this._sortedTimePoints.length && this._sortedTimePoints[i].timeMs <
e;) i += 1;
i !== this._sortedTimePoints.length && this._sortedTimePoints[i].timeMs === e ||
(i -= 1), Object(s.assert)(i !== t, "data must have unique times"), t = i, r
.index = i
}
Object(s.assert)(i < this._sortedTimePoints.length,
"data must be within a data range")
}
convertTimesToIndexes(e) {
if (0 === e.length) return [];
let t = -1,
i = Object(o.lowerbound)(this._sortedTimePoints, e[0], (e, t) => e.timeMs < t);
return e.map(e => {
for (; i < this._sortedTimePoints.length && this._sortedTimePoints[i]
.timeMs < e;) i += 1;
if (0 === i && e < this._sortedTimePoints[0].timeMs) return l
.INVALID_TIME_POINT_INDEX;
if (i >= this._sortedTimePoints.length) {
const t = this.indexOfTime(e);
if (null === t) return l.INVALID_TIME_POINT_INDEX;
i = t.timeMs !== e ? t.index + 1 : t.index
}
return Object(s.assert)(i > t, "data must have unique sorted times"),
t = i, i
})
}
firstSeriesBarTime() {
return 0 === this._sortedTimePoints.length ? null : this._sortedTimePoints[0].timeMs
}
replaceSeriesBarsTimesTail(e, t) {
if (0 === t.length) return null;
if (!this._seriesIds.has(e)) return this.setSeriesBarsTimes(e, t);
const i = [],
s = Object(o.lowerbound)(this._sortedTimePoints, t[0], (e, t) => e.timeMs < t);
for (let t = s; t < this._sortedTimePoints.length; ++t) {
const s = this._sortedTimePoints[t];
s.pointData.series.delete(e) && 0 === s.pointData.series.size && i.push(s)
}
const r = this._addBarsTimesToSeries(e, t, !0);
this._cleanupPointsData(i);
const n = r.map(e => ({
timeMs: e.timeMs,
pointData: e.pointData,
markWeight: 0,
displayTime: NaN
}));
for (let e = s; e < this._sortedTimePoints.length; ++e) {
const t = this._sortedTimePoints[e];
0 !== t.pointData.series.size && n.push(t)
}
n.sort((e, t) => e.timeMs - t.timeMs);
const a = this._updateTimeScalePointsTail(n);
return this._applyTimeScaleChanges(a, !1)
}
setSeriesBarsTimes(e, t) {
let i = 0 !== this._pointDataByTimePoint.size;
if (this._seriesIds.has(e))
if (1 === this._seriesIds.size) i = !1, this._pointDataByTimePoint.clear();
else
for (const t of this._sortedTimePoints) t.pointData.series.delete(e);
this._addBarsTimesToSeries(e, t, !1);
const s = this._seriesIds.size;
0 === t.length ? this._seriesIds.delete(e) : this._seriesIds.add(e), i && this
._cleanupPointsData(this._sortedTimePoints);
const r = s < this._seriesIds.size,
n = s > this._seriesIds.size,
o = r && 2 === this._seriesIds.size || n && 1 === this._seriesIds.size,
a = [];
this._pointDataByTimePoint.forEach((e, t) => {
a.push({
markWeight: 0,
timeMs: t,
displayTime: NaN,
pointData: e
})
}), a.sort((e, t) => e.timeMs - t.timeMs);
const l = this._updateTimeScalePoints(a);
return this._applyTimeScaleChanges(l, o)
}
_updateFutureBars() {
if (0 === this._minFutureBarsCount || null === this._mainSymbolExtrapolator) return;
if (0 !== this._sortedTimePoints.length) {
const e = this._sortedTimePoints[this._sortedTimePoints.length - 1].timeMs;
this._mainSymbolExtrapolator.ensureExtrapolatedToFutureTime(e)
}
const e = this._futureBarsFirstPointIndex();
this._mainSymbolExtrapolator.setMinFutureBarsCount(e + this._minFutureBarsCount)
}
_addBarsTimesToSeries(e, t, i) {
const s = i ? [] : null;
for (const i of t) {
const t = this._pointDataByTimePoint.get(i);
if (void 0 === t) {
const t = new Set;
t.add(e);
const r = {
index: 0,
series: t
};
this._pointDataByTimePoint.set(i, r), null !== s && s.push({
timeMs: i,
pointData: r
})
} else t.series.add(e)
}
return s
}
_futureBarsFirstPointIndex() {
if (null === this._mainSymbolExtrapolator || 0 === this._sortedTimePoints.length)
return 0;
const e = this._mainSymbolExtrapolator.futureBars();
return Object(o.upperbound_int)(e, this._sortedTimePoints[this._sortedTimePoints
.length - 1].timeMs)
}
_futureBars() {
return null === this._mainSymbolExtrapolator ? [] : this._mainSymbolExtrapolator
.futureBars().slice(this._futureBarsFirstPointIndex(), this
._futureBarsFirstPointIndex() + 1e3)
}
_cleanupPointsData(e) {
for (const t of e) 0 === t.pointData.series.size && this._pointDataByTimePoint
.delete(t.timeMs)
}
_updateTimeScalePoints(e) {
let t = -1;
for (let i = 0; i < this._sortedTimePoints.length && i < e.length; ++i) {
const s = this._sortedTimePoints[i],
r = e[i];
if (s.timeMs !== r.timeMs) {
t = i;
break
}
r.markWeight = s.markWeight, r.displayTime = s.displayTime
}
if (t = v(t, this._sortedTimePoints.length, e.length), -1 === t) return null;
for (let i = t; i < e.length; ++i) {
e[i].pointData.index = i
}
this._fillPointsData(e, t);
const i = m(this._sortedTimePoints, e, t);
return this._sortedTimePoints = e, this._updateFutureBars(), {
pointsIndex: t,
indexChange: i
}
}
_updateTimeScalePointsTail(e) {
if (0 === e.length) return null;
const t = Object(o.lowerbound)(this._sortedTimePoints, e[0].timeMs, (e, t) => e
.timeMs < t);
let i = -1;
for (let s = 0; s < e.length; ++s) {
const r = e[s],
n = t + s;
if (r.pointData.index = n, n >= this._sortedTimePoints.length) continue;
this._sortedTimePoints[n].timeMs !== r.timeMs && -1 === i && (i = n)
}
const s = t + e.length;
if (i = v(i, this._sortedTimePoints.length, s), -1 === i) return null;
this._fillPointsData(e, 0, 0 === t || 0 === this._sortedTimePoints.length ? null :
this._sortedTimePoints[t - 1].displayTime);
const r = m(this._sortedTimePoints.slice(t), e).map(e => ({
old: e.old + t,
new: e.new === l.INVALID_TIME_POINT_INDEX ? e.new : e.new + t
})); {
const i = this._sortedTimePoints;
let r = 0;
for (; t + r < i.length && r < e.length;) i[t + r] = e[r], r += 1;
for (; r < e.length; ++r) i.push(e[r]);
i.length = s
}
return this._updateFutureBars(), {
pointsIndex: i,
indexChange: r
}
}
_getBaseIndex() {
return Math.max(0, this._sortedTimePoints.length - 1)
}
_fillPointsData(e, t, i = null) {
this._fillDiplayTimeForPoints(e, t),
function(e, t = 0, i = null) {
let s = 0 === t || 0 === e.length ? i : e[t - 1].displayTime,
r = null !== s ? new Date(1e3 * s) : null,
n = 0;
for (let i = t; i < e.length; ++i) {
const t = e[i],
o = new Date(1e3 * t.displayTime);
t.markWeight = _(o, r), n += t.displayTime - (s || t.displayTime), r =
o, s = t.displayTime
}
if (0 === t && e.length > 1 && null === i) {
const t = Math.ceil(n / (e.length - 1)),
i = new Date(1e3 * (e[0].displayTime - t));
e[0].markWeight = _(new Date(1e3 * e[0].displayTime), i)
}
}(e, t, i)
}
_applyTimeScaleChanges(e, t) {
if (null === e) return t ? (this._fillPointsData(this._sortedTimePoints, 0), {
points: [],
pointsIndex: 0,
baseIndex: this._getBaseIndex(),
indexChange: [],
marks: this.tickMarks(0)
}) : null;
let i = e.pointsIndex;
if (0 !== i && t && (this._fillPointsData(this._sortedTimePoints, 0), i = 0), 0 ===
this._sortedTimePoints.length) return {
baseIndex: 0,
pointsIndex: 0,
indexChange: [],
marks: [],
points: []
};
const s = [];
for (let t = e.pointsIndex; t < this._sortedTimePoints.length; ++t) s.push(this
._sortedTimePoints[t].timeMs / 1e3);
return {
...e,
points: s,
baseIndex: this._getBaseIndex(),
marks: this.tickMarks(i)
}
}
_fillDiplayTimeForPoints(e, t = 0) {
if (null === this._mainSymbolExtrapolator) return;
const i = this._mainSymbolExtrapolator.interval(),
s = this._mainSymbolExtrapolator.barBuilder(),
r = this._mainSymbolExtrapolator.symbolInfo(),
o = null === this._displayTimezone ? Object(n.get_timezone)(r.timezone) : this
._displayTimezone,
l = 1 === this._seriesIds.size,
h = i.isDWM(),
u = h ? Object(a.createDwmAligner)(i.value(), {
timezone: r.timezone,
corrections: l ? r.corrections : void 0,
session_holidays: l ? r.session_holidays : void 0,
session: l ? r.session : "24x7"
}) : null,
d = !h;
for (let r = t; r < e.length; ++r) {
let t = e[r].timeMs / 1e3;
g && (t = Object(c.a)(s, t, i)), null !== u && (t = Math.floor(u
.timeToExchangeTradingDay(1e3 * t) / 1e3)), d && (t = Math.floor(Object(
n.utc_to_cal_ts)(o, 1e3 * t) / 1e3)), e[r].displayTime = t
}
}
}
function v(e, t, i) {
return -1 === e && t !== i && (e = i < t ? Math.max(0, i - 1) : t), e
}
},
Vs8b: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "isMainSeriesState", (function() {
return r
})), i.d(t, "isStudyState", (function() {
return n
})), i.d(t, "isLineToolState", (function() {
return o
})), i.d(t, "isZOrderedSourceState", (function() {
return a
}));
var s = i("CW80");
function r(e) {
return "MainSeries" === e.type
}
function n(e) {
return Boolean(e.type) && e.type.toLowerCase().startsWith("study")
}
function o(e) {
return Boolean(e.type) && Object(s.isLineToolName)(e.type)
}
function a(e) {
return r(e) || n(e) || o(e)
}
},
"W+6j": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
i("bmVy");
var s = i("ww0J");
window.t("Fundamental studies are no longer available on charts");
class r extends s.a {
constructor(e, t) {
super(e, t), this._study = e
}
color() {
return this._study.isFailed() || this._study.metaInfo && this._study.metaInfo()
.isTVScriptStub ? "#ff0000" : super.color()
}
sourceStatusText() {
this._study.status();
return super.sourceStatusText()
}
}
},
WIS0: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "DatafeedRequestsCachedProcessor", (function() {
return _
}));
var s = i("Eyy1"),
r = i("LxhU"),
n = i("Y7w9"),
o = i("ocLq"),
a = i("Kxc7"),
l = i("IiTo"),
c = i("OLhd"),
h = i("5mo2");
i("HbRj");
function u(e, t) {
return e.ticker + (e.currency_code ? "_#_" + e.currency_code : "") + (e.unit_id ? "_#_" + e
.unit_id : "") + "_#_" + t
}
function d(e) {
return new Date(e).toISOString()
}
class p {
constructor(e, t, i, s, n, o) {
this._cache = {
bars: []
}, this._nextSubscriptionId = 0, this._pendingSubscribers = [], this
._subscribers = [], this._requesting = !1, this._leftDate = null, this
._nextTime = null, this._realtimeOn = !1, this._endOfData = !1, this
._resetCacheTimeout = null, this._errorMessage = null, this._destroyed = !1,
this._emptyResponsesCount = 0, this._datafeed = e, this._symbolInfo = t, this
._interval = r.Interval.parse(i), this._resolution = this._interval.value(),
this._dwmAligner = n, this._serverTimeOffsetGetter = s, this
._resetCacheTimePeriod = void 0 === o ? 1e4 : o, this._sessionSpec = new h
.SessionSpec(t.timezone, t.session, t.session_holidays, t.corrections), this
._updateDatesFromExpirationDate()
}
destroy() {
0 !== this._subscribers.length && console.warn("Destroying with not-empty state"),
this._clearResetCacheTimeout(), this._unsubscribeRealtime(), this._purgeCache(),
delete this._datafeed, this._destroyed = !0
}
addSubscription(e, t, i) {
const s = this._getNextSubscriptionId();
this._pendingSubscribers.push({
key: s,
range: e,
onHistoryCallback: t,
onErrorCallback: i
}), r.Interval.isDWM(this._resolution) && void 0 !== e.to && null !== this
._dwmAligner && e.to % 864e5 && console.warn(
`Internal error: invalid date for DWM resolution ${d(e.to)}, expected time without a time part`
), this._clearResetCacheTimeout();
return setTimeout(() => {
this._destroyed || this._processPendingSubscribers()
}, 0), s
}
removeSubscription(e) {
const t = this._pendingSubscribers.find(t => t.key === e);
if (t) return void this._pendingSubscribers.splice(this._pendingSubscribers.indexOf(
t), 1);
const i = this._subscribers.find(t => t.key === e);
if (i) return this._subscribers.splice(this._subscribers.indexOf(i), 1), void(this
._subscribers.length || (this._resetCacheTimeout = setTimeout(() => {
this._resetCacheTimeout = null, this._purgeCache(), this
._unsubscribeRealtime()
}, this._resetCacheTimePeriod)));
console.warn("Unknown subscription symbol={0}, resolution={1}, key={2}".format(this
._symbolInfo.name, this._resolution, e))
}
_logMessage(e, t) {
if (a.enabled("charting_library_debug_mode") || t) {
const t = this._symbolInfo.currency_code,
i = this._symbolInfo.unit_id;
console.log(
`FEED [${this._symbolInfo.name}|${this._resolution}${t ? "|" + t : ""}${i ? "|" + i : ""}]: ${e}`
)
}
}
_clearResetCacheTimeout() {
null !== this._resetCacheTimeout && (clearTimeout(this._resetCacheTimeout), this
._resetCacheTimeout = null)
}
_purgeCache() {
this._logMessage("Reset cache"), this._cache = {
bars: []
}, this._errorMessage = null, this._leftDate = null, this._endOfData = !1, this
._updateDatesFromExpirationDate()
}
_updateDatesFromExpirationDate() {
void 0 !== this._symbolInfo.expiration_date && (this._nextTime = 1e3 * this
._symbolInfo.expiration_date, this._leftDate = 1e3 * (this._symbolInfo
.expiration_date + 1))
}
_dealignTime(e) {
return null === this._dwmAligner ? e : this._dwmAligner.timeToExchangeTradingDay(e)
}
_normalizeRange(e) {
const t = void 0 !== e.to ? e.to : this._dealignTime(this._now());
if (0 === this._cache.bars.length || void 0 !== e.to && t <= Object(s.ensureNotNull)
(this._leftDate)) return {
countBack: e.countBack,
to: t
};
const i = null !== this._dwmAligner ? this._dwmAligner.timeToSessionStart(t) : t,
r = Object(n.lowerbound)(this._cache.bars, i, (e, t) => e.time < t);
return e.countBack < r ? {
countBack: 0,
to: 0 !== e.countBack && r <= this._cache.bars.length ? this._dealignTime(
this._cache.bars[r - e.countBack].time) : t
} : {
countBack: e.countBack - r,
to: this._dealignTime(this._cache.bars[0].time)
}
}
_processPendingSubscribers() {
const e = this._pendingSubscribers;
if (!e.length) return;
if (this._requesting) return void this._logMessage(
"Processing is skipped due active request");
if (this._logMessage("Processing pending subscribers, count=" + e.length), this
._errorMessage) {
const t = this._errorMessage;
return this._logMessage("Return error: " + t), this._pendingSubscribers = [],
void e.forEach(e => {
e.onErrorCallback(t)
})
}
let t = this._normalizeRange(e[0].range);
for (const i of e.map(e => this._normalizeRange(e.range)))(i.to < t.to || i.to === t
.to && i.countBack > t.countBack) && (t = i);
this._logMessage(
`Leftmost subscriber requires ${t.countBack} bars prior ${d(t.to)}`);
!(null === this._leftDate || t.to < this._leftDate && (null === this._nextTime || t
.to < this._nextTime) || 0 !== t.countBack) || this._endOfData ? (this
._pendingSubscribers = [], e.forEach(e => {
const t = this._moveSubscriberToRealtime(e);
this._returnHistoryDataToSubscriber(e, t)
}), this._subscribeRealtimeIfNeeded()) : this._ensureRequestedTo(t)
}
_moveSubscriberToRealtime(e) {
const t = {
key: e.key,
onHistoryCallback: e.onHistoryCallback,
barset: null
};
return this._subscribers.push(t), t
}
_isSymbolExpired() {
return this._symbolInfo.expired || void 0 !== this._symbolInfo.expiration_date
}
_subscribeRealtimeIfNeeded() {
!this._subscribers.length || this._realtimeOn || this._isSymbolExpired() || this
._subscribeRealtime()
}
_subscribeRealtime() {
if (this._symbolInfo.expired || this._realtimeOn) return;
this._realtimeOn = !0, this._datafeed.subscribeBars(this._symbolInfo, this
._resolution, e => {
null !== this._dwmAligner && (e.time = this._dwmAligner
.timeToSessionStart(e.time)), this._putToCacheNewBar(e), this
._subscribers.forEach(t => {
const i = t.barset;
if (null === i) throw new Error(
"subscriber.barset is null");
i.add(e), t.onHistoryCallback(i)
})
}, u(this._symbolInfo, this._resolution), () => {
this._unsubscribeRealtime();
const e = this._leftDate;
this._purgeCache(), null !== e && this._ensureRequestedTo({
to: e,
countBack: 0
})
}), this._logMessage("Subscribed to realtime")
}
_unsubscribeRealtime() {
!this._isSymbolExpired() && this._realtimeOn && (this._datafeed.unsubscribeBars(u(
this._symbolInfo, this._resolution)), this._logMessage(
"Unsubscribed from realtime"), this._realtimeOn = !1)
}
_returnHistoryDataToSubscriber(e, t) {
const i = this._normalizeRange(e.range),
s = this._createBarsetForRange(i);
s.count() > 0 ? this._logMessage(
"Bars to return for request {0}: total {1} bars in [{2} ... {3}] ".format(e
.key, s.count(), d(s.bars[0].time), d(s.bars[s.count() - 1].time))) :
this._logMessage("Request {0}. Nothing to return.".format(e.key)), t.barset = s,
this._endOfData && null !== this._leftDate && i.to <= this._leftDate && (s
.endOfData = !0), e.onHistoryCallback(s)
}
_createBarsetForRange(e) {
const t = null !== this._dwmAligner ? this._dwmAligner.timeToSessionStart(e.to) : e
.to,
i = Object(n.lowerbound)(this._cache.bars, t, (e, t) => e.time < t),
r = new o.BarSet(this._symbolInfo, this._cache.bars.slice(Math.max(0, i - e
.countBack)));
return 0 !== r.bars.length ? r.firstLoadedTimeMs = this._dealignTime(r.bars[0]
.time) : 0 !== this._cache.bars.length ? r.firstLoadedTimeMs = this
._dealignTime(this._cache.bars[this._cache.bars.length - 1].time) : r
.firstLoadedTimeMs = this._dealignTime(Object(s.ensureNotNull)(this._leftDate)),
r
}
_ensureRequestedTo(e) {
var t;
let i;
if (this._requesting && this._logMessage(
"Internal error: trying to call getBars while the previous request is active",
!0), null !== this._leftDate) i = this._leftDate;
else {
const e = this._now();
if (null === this._dwmAligner) i = e;
else {
let t = this._sessionSpec.alignToNearestSessionStart(new Date(e), 1)
.getTime();
if (t < e) {
const e = this._sessionSpec.alignToNearestSessionEnd(new Date(t), 1)
.getTime();
t = this._sessionSpec.alignToNearestSessionStart(new Date(e + 1e3), 1)
.getTime()
}
i = this._dealignTime(t)
}
}
const s = Object(l.alignPeriodsBackForDataRequest)(this._symbolInfo.session, this
._symbolInfo.session_holidays, this._symbolInfo.corrections, this._interval
.letter(), this._interval.multiplier(), e.countBack, Math.min(e.to, i,
null !== (t = this._nextTime) && void 0 !== t ? t : 1 / 0));
let r = e.countBack;
if (e.to < i && (r += Object(l.getPeriodsBetweenDates)(this._symbolInfo.session,
this._symbolInfo.session_holidays, this._symbolInfo.corrections, this
._interval.letter(), this._interval.multiplier(), e.to, i)), null !== this
._leftDate && this._leftDate < s) return void this._processPendingSubscribers();
const n = this._isSymbolExpired() ? 0 === this._cache.bars.length : null === this
._leftDate;
this._requesting = !0, this._nextTime = null, this._leftDate = s;
const o = `[${d(s)} ... ${d(i)}, ${r} bars]`;
this._logMessage("Requesting data: " + o);
let a = !1;
const c = s / 1e3,
h = i / 1e3;
this._datafeed.getBars(this._symbolInfo, this._resolution, {
from: this._interval.isTicks() ? c : Math.floor(c),
to: this._interval.isTicks() ? h : Math.floor(h),
countBack: r,
firstDataRequest: n
}, (e, t) => {
if (!this._destroyed)
if (a) this._logMessage("getBars callback is already called before",
!0);
else {
if (a = !0, e.length > 0) {
const t =
` [${d(e[0].time)} ... ${d(e[e.length - 1].time)}]`;
this._logMessage(
`Receiving bars: total ${e.length} bars in ${t}, requested range: ${o}`
)
} else this._logMessage(
"Receiving bars: barset is empty, requested range: " + o
);
this._requesting = !1, this._processBars(e, t)
}
}, e => {
this._destroyed || (a ? this._logMessage(
"getBars callback is already called before", !0) : (a = !0,
this._requesting = !1, this._errorMessage = e || null, this
._processPendingSubscribers()))
})
}
_processBars(e, t) {
this._checkBars(e), this._alignBarsTime(e), e.length > 0 ? (this
._emptyResponsesCount = 0, this._processFullBarset(e, t)) : (this
._emptyResponsesCount += 1, this._processEmptyBarset(t)), this
._processPendingSubscribers()
}
_processEmptyBarset(e) {
e && e.nextTime ? (this._logMessage("Next time received: `{0}`".format(d(1e3 * e
.nextTime))), this._nextTime = 1e3 * e.nextTime) : e && e.noData ? (this
._logMessage("EOD received"), this._setEndOfData()) : this._logMessage(
"nextTime or noData should present in metainfo when empty barset is returned"
), 50 === this._emptyResponsesCount && (this._logMessage(
"EOD detected due 50 empty responses in a row"), this._setEndOfData())
}
_setEndOfData() {
this._endOfData = !0,
this._cache.bars.length && (this._leftDate = this._dealignTime(this._cache.bars[
0].time))
}
_processFullBarset(e, t) {
this._putToCache(e) ? null !== this._leftDate && 0 !== this._cache.bars.length && (
this._interval.isTicks() ? this._leftDate = this._dealignTime(this._cache
.bars[0].time) : this._leftDate = Math.min(this._leftDate, this
._dealignTime(this._cache.bars[0].time))) : this._logMessage(
"Incremental update failed. Starting full update. Returned data should be in the requested range.",
!0), t && t.nextTime ? console.warn(
"nextTime should be set when there is no data in the requested period only"
) : t && t.noData && console.warn(
"noData should be set when there is no data in the requested period and earlier only"
)
}
_getNextSubscriptionId() {
return this._nextSubscriptionId++
}
_checkBars(e, t = !1) {
if (a.enabled("charting_library_debug_mode"))
for (let i = 1; i < e.length; i++) {
if (e[i].time <= e[i - 1].time) {
let s =
"Wrong bars time: time {0} of bar {1} should be more than time {2} of bar {3}"
.format(e[i].time, i, e[i - 1].time, i - 1);
t && null !== this._dwmAligner && (s +=
"\nCheck that you provide DWM bars without time part, i.e. 00:00 GMT"
), console.error(s)
} ["high", "low", "open", "close", "time"].some(t => "number" != typeof e[i]
[t] || !isFinite(e[i][t])) && console.error(
"Wrong bars values: all OHLC values should be numbers")
}
}
_putToCache(e) {
if (0 === e.length) return !0;
if (this._cache.bars.length === e.length && this._cache.bars[0].time === e[0]
.time && this._cache.bars[this._cache.bars.length - 1].time === e[e.length - 1]
.time) return this._logMessage(
"Time range of received data is the same as cached one. Skip the update."
), !0;
if (0 !== this._cache.bars.length && e[e.length - 1].time === this._cache.bars[0]
.time && this._cache.bars.splice(0, 1), 0 !== this._cache.bars.length && e[e
.length - 1].time >= this._cache.bars[0].time) {
const t = this._cache.bars[this._cache.bars.length - 1].time === e[e.length - 1]
.time;
if (this._cache.bars = [], !t) return this._leftDate = null, !1;
this._logMessage(
"Received history up to now instead of incremental update. Return exactly what is requested."
)
}
return this._cache.bars = [...e, ...this._cache.bars], this._checkBars(this._cache
.bars, !0), !0
}
_putToCacheNewBar(e) {
const t = this._cache.bars.length,
i = e.time,
s = 0 === t ? NaN : this._cache.bars[t - 1].time;
0 === t || s < i ? this._cache.bars.push(e) : s === i ? (this._interval.isTicks() &&
this._logMessage("Received update for the last tick bar"), this._cache.bars[
t - 1] = e) : console.error(
"putToCacheNewBar: time violation, previous bar time: " + d(s) +
" should be less or equal to new time: " + d(i))
}
_alignBarsTime(e) {
if (this._dwmAligner)
for (const t of e) t.time = this._dwmAligner.timeToSessionStart(t.time)
}
_now() {
return Date.now() + 1e3 * this._serverTimeOffsetGetter() + 6e4
}
}
class _ {
constructor(e, t, i) {
this._threads = {}, this._datafeed = e, this._serverTimeOffsetGetter = t, this
._resetCacheTimePeriod = i
}
destroy() {
this._forEachThread((e, t) => t.destroy()), this._threads = {}, delete this
._datafeed
}
purgeCache() {
this._forEachThread((e, t) => t.destroy()), this._threads = {}
}
subscribe(e, t, i, s, r) {
const n = u(e, t);
this._threads[n] || (this._threads[n] = this._createThread(e, t));
return n + '"' + this._threads[n].addSubscription(i, s, r)
}
unsubscribe(e) {
const t = e.split('"');
if (2 !== t.length) return void console.warn("Wrong guid format");
const i = t[0],
s = parseInt(t[1]);
this._threads.hasOwnProperty(i) ? this._threads[i].removeSubscription(s) : console
.warn("Data thread doesnt exist: " + e)
}
_createThread(e, t) {
return new p(this._datafeed, e, t, this._serverTimeOffsetGetter, Object(c
.createDwmAligner)(t, e), this._resetCacheTimePeriod)
}
_forEachThread(e) {
Object.keys(this._threads).forEach(t => e(t, this._threads[t]))
}
}
},
WPQD: function(e, t, i) {
"use strict";
(function(e) {
var s = i("Ss5c").LineDataSource,
r = i("Ocx9").DefaultProperty;
class n extends s {
constructor(e, t) {
super(e, t || n.createProperties()), this._trendLinePaneView = null, i.e(
"lt-pane-views").then(i.t.bind(null, "ocVb", 7)).then(({
TrendLinePaneView: e
}) => {
this._trendLinePaneView = new e(this, this._model), this
._setPaneViews([this._trendLinePaneView])
})
}
dataAndViewsReady() {
return s.prototype.dataAndViewsReady.call(this) && this
._trendLinePaneView && this._trendLinePaneView.iconsReady()
}
stop() {
super.stop()
}
pointsCount() {
return 2
}
name() {
return "Trend Line"
}
canHasAlert() {
return !0
}
_getAlertPlots() {
return [this._linePointsToAlertPlot(this._points, null, this.properties()
.extendLeft.value(), this.properties().extendRight.value())]
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null,
"auWl"))).TrendLineDefinitionsViewModel
}
template() {
var e = s.prototype.template.call(this);
return e.text = this.properties().childs().text.value(), e.showLabel = this
.properties().childs().showLabel.value(), e
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e
.text || ""), this.properties().childs().showLabel.setValue(Boolean(
e.showLabel))
}
_snapTo45DegreesAvailable() {
return !0
}
static createProperties(e) {
var t = new r("linetooltrendline", e);
return n._configureProperties(t), t
}
static _configureProperties(t) {
s._configureProperties(t), t.hasChild("text") || t.addChild("text", new e(
"")), t.addExclusion("text"), t.addExclusion("showLabel")
}
}
t.LineToolTrendLine = n
}).call(this, i("tc+8"))
},
WTyR: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("ocLq");
class r {
constructor(e) {
this._haveAnyVolume = !1, this._isDisabled = !1, this._seriesGetter = e
}
update(e, t) {
if (this._haveAnyVolume || this._isDisabled) return;
const i = this._seriesGetter.volume().get(e);
0 !== i && Number.isFinite(i) && (this._haveAnyVolume = !0), t && (this
._haveAnyVolume || s.Std.error(
"The data vendor doesn't provide volume data for this symbol."), this
._isDisabled = !0)
}
}
},
WYmP: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("oamr"),
r = i("dhFz");
class n {
constructor() {
this._items = [], this._owner = null
}
primitivesData(e) {
const t = [];
for (const i of this._items) e.isIgnoredObj(i) || t.push(i.primitiveData());
return t
}
get(e) {
return this._items[e]
}
set(e, t) {
return this.dirty(), t.setOwner(this), this._items[e] = t, t
}
addAtIndex(e, t) {
this.dirty(), t.setOwner(this), this._items[e] = t
}
clear() {
this._unsetOwner(this._items), this._items = [], this.dirty()
}
addAllFromNumber(e, t) {
this.setOwner(t), this._items.splice(e, 0, ...t._items);
return this._setCachedDataValid(!1), !0
}
addAll(e) {
this.setOwner(e), this._items.push(...e._items);
return this._setCachedDataValid(!1), !0
}
remove(e) {
const t = this._items[e];
return this._items.splice(e, 1), t.unsetOwner(this), this.dirty(), t
}
getItems() {
return this._items
}
size() {
return this._items.length
}
add(e) {
e.setOwner(this), this._items.push(e);
return this._setCachedDataValid(!1), !0
}
deleteErasedItems() {
this._items = this._items.filter(e => !e.isErased())
}
markPostedItems() {
for (const e of this._items) e.markAsPosted()
}
isNaN() {
if (0 === this._items.length) return !0;
for (const e of this._items) {
if (!Object(r.a)(e)) return !1;
if (!e.isNaN()) return !1
}
return !0
}
setOwner(e) {
this._owner = e
}
dirty() {
null !== this._owner && this._owner.dirty()
}
_unsetOwner(e) {
for (const t of e) t instanceof s.a && t.unsetOwner(this)
}
_setCachedDataValid(e) {
e || this.dirty()
}
}
},
"Wh/T": function(e, t, i) {
"use strict";
var s = i("Kxc7");
window.onload = function() {
location.hostname.indexOf(".") >= 0 && ! function() {
try {
return /^(192|172|10)\.[0-9][0-9][0-9]\.[0-9][0-9][0-9]\.[0-9][0-9][0-9]/
.test(location.hostname) || /^.*((?:\.local)|localhost)$/.test(location
.hostname)
} catch (e) {
return !1
}
}() && setTimeout((function() {
try {
var e = function() {
var e = 0;
return JSON.parse(urlParams.logo).image && (e = "C", s
.enabled("link_to_tradingview") || (e = "D")), e
}();
window.ga && (0 !== e && window.ga("send", "event", "s", e),
urlParams.utm || window.ga("send", "event", "l"))
} catch (e) {}
}), 3e4)
}
},
Wh6B: function(e, t, i) {
"use strict";
var s = i("Eyy1").ensureNotNull,
r = i("Ss5c").LineDataSource,
n = i("Ocx9").DefaultProperty,
o = i("08i5");
class a extends r {
constructor(e, t) {
super(e, t || a.createProperties()), this._predictionPaneView = null, i.e(
"lt-pane-views").then(i.t.bind(null, "Ay2m", 7)).then(({
PredictionPaneView: e
}) => {
this._predictionPaneView = new e(this, this._model), this._setPaneViews(
[this._predictionPaneView])
})
}
dataAndViewsReady() {
return r.prototype.dataAndViewsReady.call(this) && this._predictionPaneView && this
._predictionPaneView.iconsReady()
}
isSynchronizable() {
return !1
}
status() {
return this._properties.status.value()
}
setStatus(e) {
return this._properties.status.setValue(e)
}
pointsCount() {
return 2
}
name() {
return "Forecast"
}
restorePoints(e, t, i) {
super.restorePoints(e, t, i), this.checkAlert()
}
checkAlert() {
if (!(this._points.length < 2 || this._model.mainSeries().bars().isEmpty())) {
var e = this._points[1];
if (this.status()) e.index > this._model.timeScale().baseIndex() && this
.setStatus(o.AlertStatus.Waiting);
else {
var t = this._model.mainSeries().bars().valueAt(e.index);
if (null !== t) {
var i = this.direction();
if (i === o.Direction.Up && t[TradingView.HIGH_PLOT] >= e.price) this
.setStatus(o.AlertStatus.Success);
else if (i === o.Direction.Down && t[TradingView.LOW_PLOT] <= e.price)
this.setStatus(o.AlertStatus.Success);
else {
var r = s(this._model.mainSeries().bars().lastIndex());
e.index !== r && this.setStatus(o.AlertStatus.Failure)
}
}
}
}
}
addPoint(e) {
var t = r.prototype.addPoint.call(this, e);
return t && this.checkAlert(), t
}
endChanging() {
super.endChanging(), this.setStatus(o.AlertStatus.Waiting), this.checkAlert()
}
onData(e) {
super.onData(e), this.checkAlert()
}
endMoving() {
super.endMoving(),
this.setStatus(o.AlertStatus.Waiting), this.checkAlert()
}
direction() {
if (this.points().length < 2) return o.Direction.Up;
var e = this.points()[0];
return this.points()[1].price > e.price ? o.Direction.Up : o.Direction.Down
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "Pwwq")))
.PredictionDefinitionsViewModel
}
cloneable() {
return !1
}
static createProperties(e) {
var t = new n("linetoolprediction", e);
return a._configureProperties(t), t
}
static _configureProperties(e) {
r._configureProperties(e), e.merge({
status: o.AlertStatus.Waiting
})
}
}
t.LineToolPrediction = a
},
WkOR: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
})), i.d(t, "b", (function() {
return a
}));
var s = i("Kxc7");
const r = s.enabled("uppercase_instrument_names");
function n(e, t) {
return void 0 === e ? void 0 === t : void 0 !== t && (r ? e.toUpperCase() === t
.toUpperCase() : e === t)
}
function o(e, t) {
return e.some(e => n(t, e))
}
function a(e, t, i) {
if (n(t, e)) return !0;
if (i) {
if (n(i.full_name, e) || n(i.pro_name, e)) return !0;
if (n(i.ticker, e)) return !0;
if (i.aliases && o(i.aliases, e)) return !0;
if (i.alternatives && o(i.alternatives, e)) return !0;
if (0 === e.indexOf("FRA:") && n(i.pro_name, e.replace("FRA:", "FWB:"))) return !0
}
return !1
}
},
WkYF: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolDateRange", (function() {
return a
}));
var s = i("Eyy1"),
r = i("Ocx9"),
n = i("Ss5c"),
o = i("585y");
class a extends n.LineDataSource {
constructor(e, t) {
super(e, t || a.createProperties()), this._volumeCalculator = null, i.e(
"lt-pane-views").then(i.bind(null, "3xLB")).then(e => {
this._setPaneViews([new e.DateRangePaneView(this, this._model)])
})
}
destroy() {
super.destroy(), null !== this._volumeCalculator && this._volumeCalculator
.destroy()
}
pointsCount() {
return 2
}
properties() {
return super.properties()
}
name() {
return "Date Range"
}
volume() {
if (null === this._volumeCalculator) return NaN;
const e = this.points();
return this._volumeCalculator.volume(e[0].index, e[1].index)
}
setOwnerSource(e) {
e === this._model.mainSeries() && (Object(s.assert)(null === this
._volumeCalculator), this._volumeCalculator = new o.a(this._model
.mainSeries())), super.setOwnerSource(e)
}
static createProperties(e) {
const t = new r.DefaultProperty("linetooldaterange", e);
return a._configureProperties(t), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "Ax76")))
.GeneralDatePriceRangeDefinitionsViewModel
}
static _configureProperties(e) {
n.LineDataSource._configureProperties(e)
}
}
},
WmDe: function(e, t, i) {
"use strict";
TradingView.Pro = function() {
this.hasPackage = function() {
return !1
}
}, window.user = {
is_pro: !1,
settings: {}
}, TradingView.Pro.prototype.isPaidPro = function() {
return !1
}, TradingView.Pro.prototype.isSupportAvailable = function() {
return !1
}, TradingView.Pro.prototype.getStudies = function() {
return []
}, TradingView.Pro.prototype.getProduct = function() {
return {}
}, TradingView.Pro.prototype.getStudiesOrder = function() {
return []
}
},
Wo0S: function(e, t, i) {
e.exports = {
"common-tooltip": "common-tooltip-36YLR71G",
"common-tooltip--hidden": "common-tooltip--hidden-36YLR71G",
"common-tooltip--horizontal": "common-tooltip--horizontal-36YLR71G",
"common-tooltip--farther": "common-tooltip--farther-36YLR71G",
"common-tooltip--vertical": "common-tooltip--vertical-36YLR71G",
"common-tooltip-farther": "common-tooltip-farther-36YLR71G",
"common-tooltip--direction_normal": "common-tooltip--direction_normal-36YLR71G",
"common-tooltip__body": "common-tooltip__body-36YLR71G",
"common-tooltip__button-container": "common-tooltip__button-container-36YLR71G",
"common-tooltip__body--no-buttons": "common-tooltip__body--no-buttons-36YLR71G",
"common-tooltip__button": "common-tooltip__button-36YLR71G",
"common-tooltip--direction_reversed": "common-tooltip--direction_reversed-36YLR71G",
"common-tooltip__ear-holder": "common-tooltip__ear-holder-36YLR71G",
"common-tooltip__ear-holder--below": "common-tooltip__ear-holder--below-36YLR71G",
"common-tooltip__ear-holder--above": "common-tooltip__ear-holder--above-36YLR71G",
"common-tooltip__ear-holder--before": "common-tooltip__ear-holder--before-36YLR71G",
"common-tooltip__ear-holder--after": "common-tooltip__ear-holder--after-36YLR71G",
"common-tooltip__body--with-hotkey": "common-tooltip__body--with-hotkey-36YLR71G",
"common-tooltip__body--width_wide": "common-tooltip__body--width_wide-36YLR71G",
"common-tooltip__body--width_narrow": "common-tooltip__body--width_narrow-36YLR71G",
"common-tooltip__body--no-padding": "common-tooltip__body--no-padding-36YLR71G",
"common-tooltip__hotkey-block": "common-tooltip__hotkey-block-36YLR71G",
"common-tooltip__hotkey-block--divider": "common-tooltip__hotkey-block--divider-36YLR71G",
"common-tooltip__hotkey-text": "common-tooltip__hotkey-text-36YLR71G",
"common-tooltip__hotkey-button": "common-tooltip__hotkey-button-36YLR71G",
"common-tooltip__plus-sign": "common-tooltip__plus-sign-36YLR71G"
}
},
Wt0y: function(e, t, i) {
"use strict";
function s(e = location.host) {
return -1 !== ["i18n.tradingview.com", "partial.tradingview.com", "www.tradingview.com",
"wwwcn.tradingview.com"
].indexOf(e) || -1 !== ["d33t3vvu2t2yu5.cloudfront.net", "dwq4do82y8xi7.cloudfront.net",
"s.tradingview.com", "s3.tradingview.com"
].indexOf(e) || e.match(/^[a-z]{2}\.tradingview\.com/) || e.match(
/prod-[^.]+.tradingview.com/) ? "battle" : e.includes("tradingview.com") || e
.includes("staging") ? "staging" : e.match(/webcharts/) ? "staging_local" : (e.match(
/^localhost(:\d+)?$/), "local")
}
function r() {
return "local" === s()
}
function n() {
return "battle" === s()
}
function o() {
return !n()
}
i.r(t), i.d(t, "environment", (function() {
return s
})), i.d(t, "isLocal", (function() {
return r
})), i.d(t, "isProd", (function() {
return n
})), i.d(t, "isDebug", (function() {
return o
}))
},
X0WL: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
class s {
constructor(e) {
this._colorProperty = e
}
size() {
return "13px"
}
bold() {
return !1
}
color() {
return this._colorProperty.value()
}
}
},
XAms: function(e, t, i) {
"use strict";
function s(e) {
e.preventDefault()
}
i.d(t, "a", (function() {
return s
})), i.d(t, "b", (function() {
return n
}));
const r = ["input:not([type])", 'input[type="text"]', 'input[type="email"]',
'input[type="password"]', 'input[type="search"]', 'input[type="number"]',
'input[type="url"]', "textarea", "a[href]", '*[contenteditable="true"]',
"[data-allow-context-menu]"
];
function n(e) {
const t = e.target;
t && !t.closest(r.join(", ")) && e.preventDefault()
}
},
XFad: function(e, t, i) {
"use strict";
var s = i("5rJj"),
r = i("aDyP").LineToolPitchfork;
class n extends r {
constructor(e, t) {
super(e, t || n.createProperties())
}
name() {
return "Schiff Pitchfork"
}
static createProperties(e) {
var t = new s("linetoolschiffpitchfork2", e, !1, {
range: [0, 8]
});
return n._configureProperties(t), t
}
static _configureProperties(e) {
r._configureProperties(e)
}
}
t.LineToolSchiffPitchfork2 = n
},
XPit: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "TimePointIndexSearchMode", (function() {
return s
})), i.d(t, "seriesPlotFunctionMap", (function() {
return l
})), i.d(t, "barFunction", (function() {
return c
})), i.d(t, "SeriesData", (function() {
return u
}));
var s, r = i("Eyy1"),
n = i("k9/m");
! function(e) {
e[e.FromLeft = -1] = "FromLeft", e[e.FromRight = 1] = "FromRight"
}(s || (s = {}));
const o = {
open: e => e[1],
high: e => e[2],
low: e => e[3],
close: e => e[4],
hl2: e => (e[2] + e[3]) / 2,
hlc3: e => (e[2] + e[3] + e[4]) / 3,
ohlc4: e => (e[1] + e[2] + e[3] + e[4]) / 4
},
a = ["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"];
function l() {
const e = new Map;
return a.forEach((t, i) => {
e.set(t, c(t))
}), e
}
function c(e) {
return o[e]
}
function h(e, t) {
return null == e[t]
}
class u {
constructor() {
this.m_bars = new n.PlotList(l(), h), this.m_nsBars = new n.PlotList(l(), h)
}
bars() {
return this.m_bars
}
nsBars() {
return this.m_nsBars
}
size() {
return this.m_bars.size() + this.m_nsBars.size()
}
each(e) {
this.m_bars.each(e), this.m_nsBars.each(e)
}
clear() {
this.m_bars.clear(), this.m_nsBars.clear(), this.lastProjectionPrice = void 0
}
isEmpty() {
return this.m_bars.isEmpty() && this.m_nsBars.isEmpty()
}
first() {
return this.m_bars.isEmpty() ? this.m_nsBars.first() : this.m_bars.first()
}
last() {
return this.m_nsBars.isEmpty() ? this.m_bars.last() : this.m_nsBars.last()
}
search(e, t) {
return this.nsBars().isEmpty() ? this.bars().search(e, t) : this.bars().isEmpty() ||
Object(r.ensureNotNull)(this.nsBars().firstIndex()) <= e ? this.nsBars().search(
e, t) : this.bars().search(e, t)
}
valueAt(e) {
const t = this.search(e);
return null !== t ? t.value : null
}
plotValueToTimePointIndex(e, t, i) {
if (i === s.FromRight) {
const i = (i, s) => {
const r = s[t];
return null != r && e >= r
},
s = this.m_bars.findLast(i);
if (null !== s) return s.index;
const r = this.m_nsBars.findLast(i);
return null !== r ? r.index : this.m_bars.firstIndex()
}
if (i === s.FromLeft) {
const i = (i, s) => {
const r = s[t];
return null != r && e <= r
},
s = this.m_bars.findFirst(i);
if (null !== s) return s.index;
const r = this.m_nsBars.findFirst(i);
return null !== r ? r.index : this.m_bars.lastIndex()
}
throw new Error("plotValueToTimePointIndex: unsupported search mode")
}
moveData(e) {
this.m_bars.move(e), this.m_nsBars.move(e)
}
}
},
XRI5: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SymbolExtrapolator", (function() {
return c
}));
var s = i("Eyy1"),
r = i("Y7w9"),
n = i("IiTo"),
o = i("IDnv"),
a = i("LxhU");
function l(e, t) {
return e.length > t
}
class c {
constructor(e, t, i = 2e5) {
this._firstRealBarTimeMs = null, this._historyBarsCache = [],
this._projectionFirstIndex = 1 / 0, this._barsTimes = [], this
._minFutureBarsCount = 0, this._lastRealBarTimeMs = null, this
._futureBarsCache = [], this._symbolInfo = e, this._interval = a.Interval.parse(
t), this._extrapolateLimit = i, this._barBuilder = Object(n.newBarBuilder)(
t, new n.SessionInfo(e.timezone, e.session, e.session_holidays, e
.corrections), null)
}
destroy() {
this.clear()
}
interval() {
return this._interval
}
barBuilder() {
return this._barBuilder
}
symbolInfo() {
return this._symbolInfo
}
clear() {
this._firstRealBarTimeMs = null, this._historyBarsCache = [], this._barsTimes = [],
this._lastRealBarTimeMs = null, this._futureBarsCache = [], this
._minFutureBarsCount = 0, this._projectionFirstIndex = 1 / 0
}
firstFutureBarIndex() {
return this._barsTimes.length
}
futureBars() {
return this._futureBarsCache
}
replaceBarsTimesTail(e, t = e.length) {
if (0 === e.length) return;
if (0 === this._barsTimes.length) return void this.setBarsTimes(e, t);
const i = e[0],
n = this._barsTimes[this._barsTimes.length - 1],
o = i > n ? this._barsTimes.length : Object(r.lowerbound_int)(this._barsTimes,
i);
0 !== o ? (this._barsTimes.splice(o, this._barsTimes.length, ...e), this
._projectionFirstIndex = t === e.length ? this._barsTimes.length : this
._barsTimes.indexOf(e[t]), Object(s.assert)(-1 !== this
._projectionFirstIndex, "something went wrong"), n !== e[e.length -
1] && this._setLastRealBarTime(e[e.length - 1])) : this.setBarsTimes(e,
t)
}
setBarsTimes(e, t = e.length) {
const i = this._barsTimes;
if (this._barsTimes = e.slice(), this._projectionFirstIndex = 0 === this._barsTimes
.length ? 1 / 0 : t, 0 === e.length) return this._historyBarsCache = [], this
._futureBarsCache = [], this._firstRealBarTimeMs = null, void(this
._lastRealBarTimeMs = null);
0 !== i.length && i[i.length - 1] === e[e.length - 1] || this._setLastRealBarTime(e[
e.length - 1]), 0 !== i.length && i[0] === e[0] || (this
._historyBarsCache = [], this._firstRealBarTimeMs = e[0])
}
extrapolateTimeWithOffsetToTime(e, t) {
if (0 === t) return {
timeMs: e,
exact: !0
};
0 === this._barsTimes.length && (t < 0 ? null === this._firstRealBarTimeMs ? this
._firstRealBarTimeMs = e : (this._extendHistoryCacheToTimeFromRight(Math
.min(e, null !== this._lastRealBarTimeMs ? this._lastRealBarTimeMs :
1 / 0)), this._ensureExtrapolatedToHistoryTime(e)) : null === this
._lastRealBarTimeMs ? this._lastRealBarTimeMs = e : (this
._extendFutureCacheToTimeFromLeft(Math.max(e, null !== this
._firstRealBarTimeMs ? this._firstRealBarTimeMs : 1 / 0)), this
._ensureExtrapolatedToFutureTime(e)));
const i = this.indexOfTime(e);
if (null === i) return null;
const s = this._timeOfBarIndex(i.index + t);
return null === s ? null : ((i.index < 0 || this._projectionFirstIndex <= i
.index) && (s.exact = !1), s)
}
indexOfTime(e) {
if (null !== this._firstRealBarTimeMs && e < this._firstRealBarTimeMs) {
this._ensureExtrapolatedToHistoryTime(e);
let t = Object(r.lowerbound_int)(this._historyBarsCache, e);
if (0 !== this._historyBarsCache.length && 0 === t && e < this
._historyBarsCache[0]) return null;
t !== this._historyBarsCache.length && this._historyBarsCache[t] === e || (t -=
1);
return {
index: t - this._historyBarsCache.length,
timeMs: this._historyBarsCache[t]
}
}
if (null !== this._lastRealBarTimeMs && e > this._lastRealBarTimeMs) {
this._ensureExtrapolatedToFutureTime(e);
let t = Object(r.lowerbound_int)(this._futureBarsCache, e);
if (0 !== this._futureBarsCache.length && t === this._futureBarsCache.length &&
e > this._futureBarsCache[this._futureBarsCache.length - 1]) return null;
this._futureBarsCache[t] !== e && (t -= 1);
const i = Math.max(1, this._barsTimes.length) + t;
return {
index: i,
timeMs: i === this._barsTimes.length - 1 ? Object(s.ensureNotNull)(this
._lastRealBarTimeMs) : this._futureBarsCache[t]
}
}
if (0 === this._barsTimes.length) return null !== this._firstRealBarTimeMs && this
._firstRealBarTimeMs <= e || null !== this._lastRealBarTimeMs && e <= this
._lastRealBarTimeMs ? {
index: 0,
timeMs: Object(s.ensureNotNull)(this._timeOfBarIndex(0)).timeMs
} : null;
let t = Object(r.lowerbound_int)(this._barsTimes, e);
return this._barsTimes[t] !== e && (t -= 1), {
index: t,
timeMs: this._barsTimes[t]
}
}
setMinFutureBarsCount(e) {
this._minFutureBarsCount = e, 0 !== this._barsTimes.length && this
._ensureExtrapolatedToFutureBar(e)
}
ensureExtrapolatedToFutureTime(e) {
this._ensureExtrapolatedToFutureTime(e)
}
_setLastRealBarTime(e) {
const t = this._futureBarsCache.length,
i = Object(r.upperbound_int)(this._futureBarsCache, e);
0 === i ? this._extendFutureCacheToTimeFromLeft(e) : (this._lastRealBarTimeMs = e,
this._futureBarsCache = this._futureBarsCache.slice(i)), this
._ensureExtrapolatedToFutureBar(Math.max(t, this._minFutureBarsCount))
}
_timeOfBarIndex(e) {
var t;
if (e < 0) {
const t = Math.abs(e);
this._ensureExtrapolatedToHistoryBar(t);
const i = this._historyBarsCache.length - t;
return i < 0 ? null : {
timeMs: this._historyBarsCache[i],
exact: !1
}
}
if (0 === e && 0 === this._barsTimes.length) return {
timeMs: Object(s.ensureNotNull)(null !== (t = this._firstRealBarTimeMs) &&
void 0 !== t ? t : this._lastRealBarTimeMs),
exact: !1
};
if (e >= this._barsTimes.length) {
const t = e - Math.max(1, this._barsTimes.length);
return this._ensureExtrapolatedToFutureBar(t + 1), t >= this._futureBarsCache
.length ? null : {
timeMs: this._futureBarsCache[t],
exact: !1
}
}
return {
timeMs: this._barsTimes[e],
exact: e < this._projectionFirstIndex
}
}
_extendFutureCacheFromRight(e) {
const t = 0 !== this._futureBarsCache.length ? this._futureBarsCache[this
._futureBarsCache.length - 1] : this._lastRealBarTimeMs;
if (null === t) return !1;
const i = e(t, this._futureBarsCache.length);
return 0 !== i.length && (this._futureBarsCache = this._futureBarsCache.concat(i), !
0)
}
_extendHistoryCacheFromLeft(e) {
const t = 0 !== this._historyBarsCache.length ? this._historyBarsCache[0] : this
._firstRealBarTimeMs;
if (null === t) return;
const i = e(t, this._historyBarsCache.length);
this._historyBarsCache = i.concat(this._historyBarsCache)
}
_extendFutureCacheToTimeFromLeft(e) {
if (null !== this._lastRealBarTimeMs && this._lastRealBarTimeMs <= e) return;
if (Object(s.assert)(0 === this._barsTimes.length || e === this._barsTimes[this
._barsTimes.length - 1], "invalid argument"), this._lastRealBarTimeMs = e,
0 === this._futureBarsCache.length) return;
const t = Object(o.extrapolateBarsFrontToTime)(this._barBuilder, e, this
._futureBarsCache[0] - 1, this._extrapolateLimit, !0).times;
this._futureBarsCache = t.concat(this._futureBarsCache)
}
_extendHistoryCacheToTimeFromRight(e) {
if (null !== this._firstRealBarTimeMs && this._firstRealBarTimeMs >= e) return;
if (Object(s.assert)(0 === this._barsTimes.length, "bars should be empty"), this
._firstRealBarTimeMs = e,
0 === this._historyBarsCache.length) return;
const t = Object(o.extrapolateBarsFrontToTime)(this._barBuilder, this
._historyBarsCache[this._historyBarsCache.length - 1], e - 1, this
._extrapolateLimit, !0).times;
this._historyBarsCache = this._historyBarsCache.concat(t)
}
_ensureExtrapolatedToFutureBar(e) {
return !(this._futureBarsCache.length >= e || l(this._futureBarsCache, this
._extrapolateLimit)) && this._extendFutureCacheFromRight((t, i) => Object(o
.extrapolateBarsFrontByCount)(this._barBuilder, t, e - i, !0).times)
}
_ensureExtrapolatedToFutureTime(e) {
null !== this._lastRealBarTimeMs && this._lastRealBarTimeMs >= e || l(this
._futureBarsCache, this._extrapolateLimit) || 0 !== this._futureBarsCache
.length && this._futureBarsCache[this._futureBarsCache.length - 1] >= e || (this
._extendFutureCacheFromRight((t, i) => Object(o.extrapolateBarsFrontToTime)(
this._barBuilder, t, e, this._extrapolateLimit, !0).times), this
._futureBarsCache[this._futureBarsCache.length - 1] < e && this
._ensureExtrapolatedToFutureBar(this._futureBarsCache.length + 1))
}
_ensureExtrapolatedToHistoryBar(e) {
this._historyBarsCache.length >= e || l(this._historyBarsCache, this
._extrapolateLimit) || this._extendHistoryCacheFromLeft((t, i) => Object(o
.extrapolateBarsFrontByCount)(this._barBuilder, t, -(e - i), !0).times
.reverse())
}
_ensureExtrapolatedToHistoryTime(e) {
null !== this._firstRealBarTimeMs && this._firstRealBarTimeMs <= e || l(this
._historyBarsCache, this._extrapolateLimit) || 0 !== this._historyBarsCache
.length && this._historyBarsCache[0] <= e || (this._extendHistoryCacheFromLeft((
t, i) => {
const s = Object(o.extrapolateBarsFrontToTime)(this._barBuilder, t -
1, e - 1, this._extrapolateLimit, !0).times;
return s[s.length - 1] === t ? s.slice(0, -1) : s
}), (0 === this._historyBarsCache.length || this._historyBarsCache[0] >
e) && this._ensureExtrapolatedToHistoryBar(this._historyBarsCache
.length +
1))
}
}
},
XUCF: function(e, t, i) {
"use strict";
var s = i("Hr11").sign,
r = i("Ss5c").LineDataSource,
n = i("Ocx9").DefaultProperty;
class o {
constructor(e, t, i) {
this._source = e, this._index = t, this._bars = i || []
}
setBars(e) {
this._bars = e || []
}
clone(e) {
return new o(e, this._index, TradingView.clone(this._bars))
}
createBar() {
var e = this._source.properties().averageHL.value(),
t = this._source.properties().variance.value() / 100,
i = this._source._model.mainSeries().base(),
s = Math.random(),
r = e * (1 - 2 * s) * t,
n = e * (1 + (.5 - (s = Math.random())) * t),
o = r - n / 2,
a = o + n;
return {
o: (o + Math.random() * n) / i,
h: a / i,
l: o / i,
c: (o + Math.random() * n) / i
}
}
generate() {
this._bars = [];
var e = this._source.points(),
t = e[this._index],
i = e[this._index + 1];
if (t && i && t.index !== i.index) {
this._avgHL = this._source.properties().averageHL.value(), this._variance = this
._source.properties().variance.value() / 100;
for (var r = this._index ? t.index + 1 : t.index, n = s(i.index - t.index), o =
r; o !== i.index; o += n) this._bars.push(this.createBar())
}
}
bars() {
return this._bars
}
setSize(e) {
if (e < this._bars.length) this._bars.splice(e, this._bars.length - e);
else
for (; this._bars.length < e;) this._bars.push(this.createBar())
}
}
class a extends r {
constructor(e, t, s) {
var r = t || a.createProperties();
if (super(e, r), this._segments = [], !s) {
var n = Math.round(this.calculateATR(e));
r.averageHL.setValue(n)
}
r.averageHL.listeners().subscribe(this, a.prototype.regenerate), r.variance
.listeners().subscribe(this, a.prototype.regenerate), r.points || r.addProperty(
"points"), this._currentAverageHL = this._properties.averageHL.value(), this
._currentVariance = this._properties.variance.value(), this._currentInterval = e
.mainSeries().interval(), this.properties().onRestoreFactoryDefaults()
.subscribe(this, this._handleRestoringFactoryDefaults), i.e("lt-pane-views")
.then(i.t.bind(null, "dMkl", 7)).then(({
GhostFeedPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
isSynchronizable() {
return !1
}
_handleRestoringFactoryDefaults() {
var e = Math.round(this.calculateATR());
this.properties().averageHL.setValue(e)
}
destroy() {
this.properties().onRestoreFactoryDefaults().unsubscribe(this, this
._handleRestoringFactoryDefaults), super.destroy()
}
regenerate() {
this._currentAverageHL = this._properties.averageHL.value(), this._currentVariance =
this._properties.variance.value(), this._segments.forEach((function(e) {
e.generate()
})), this.updateAllViews(), this._model.updateSource(this)
}
propertiesChanged() {
super.propertiesChanged(), this._currentAverageHL === this._properties.averageHL
.value() && this._currentVariance === this._properties.variance.value() || this
.regenerate()
}
pointsCount() {
return -1
}
name() {
return "Ghost Feed"
}
segmentBars(e) {
return this._segments[e].bars()
}
segments() {
return this._segments
}
generateBars(e) {
this._segments.length <= e && this._segments.push(new o(this, e)), this._segments[e]
.generate()
}
addPoint(e) {
if (this._points.length > 0 && this._points[this._points.length - 1].index === e
.index) {
this._lastPoint = null, this.normalizePoints(), this.createServerPoints();
for (var t = 0; t < this._points.length; t++) this._createPointProperty(t);
return !0
}
var i = r.prototype.addPoint.call(this, e);
return this._finished && (this._lastPoint = null), this._points.length > 1 && this
.generateBars(this._points.length - 2), i || this._finished
}
finish() {
this._finished = !0, this._lastPoint = null, this.normalizePoints(), this
.createServerPoints()
}
setPoint(e, t, i) {
if (super.setPoint(e, t, i), e > 0) {
var s = this.points()[e - 1],
r = t.index - s.index;
this._segments[e - 1].setSize(Math.abs(r))
}
if (e < this.points().length - 1) {
r = this.points()[e + 1].index - t.index;
this._segments[e].setSize(Math.abs(r))
}
}
state(e) {
var t = r.prototype.state.call(this, e);
return t.segments = this._segments.map((function(e) {
return {
bars: e.bars()
}
})), t
}
restoreData(e) {
var t = this;
e.segments && (this._segments = e.segments.map((function(e, i) {
return new o(t, i, [].concat(e.bars))
}))), this._currentAverageHL = this._properties.averageHL.value(), this
._currentVariance = this._properties.variance.value()
}
onData(e) {
if (super.onData(e), 0 === this.pointsProperty().childs().points._childs.length)
for (var t = 0; t < this._points.length; t++) this._createPointProperty(t);
this._currentInterval !== this._model.mainSeries().interval() && (this.regenerate(),
this._currentInterval = this._model.mainSeries().interval())
}
cloneData(e) {
var t = this;
this._segments = e._segments.map((function(e) {
return e.clone(t)
}))
}
calculateATR(e) {
var t = (void 0 !== e ? e : this._model).mainSeries(),
i = [];
t.bars().each((function(e, t) {
i.push(t[TradingView.HIGH_PLOT] - t[TradingView.LOW_PLOT])
}));
var s = 0 === i.length ? 0 : i.reduce((function(e, t) {
return e + t
}), 0) / i.length;
return s *= t.base()
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "fIc+")))
.GhostFeedDefinitionsViewModel
}
static createProperties(e) {
var t = new n("linetoolghostfeed", e);
return a._configureProperties(t), t
}
static _configureProperties(e) {
r._configureProperties(e)
}
}
t.LineToolGhostFeed = a
},
XXdw: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "StoriesTimeLineItemType", (function() {
return s
})),
function(e) {
e[e.Image = 0] = "Image", e[e.Emoji = 1] = "Emoji"
}(s || (s = {}))
},
XcdR: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return o
}));
var s = i("txPx"),
r = i("RDU5");
const n = Object(s.getLogger)("Chart.ChartUndoModel");
class o extends r.UndoCommand {
constructor(e, t, i) {
super(i, !1), this._newRightOffsetAndBarSpacing = null, this.setCustomFlag(
"doesnt_affect_save", !0), this._model = e, this
._rightOffsetAndBarSpacing = t
}
undo() {
if (null !== this._newRightOffsetAndBarSpacing) return void n.logDebug(
"TimeScaleChangeUndoCommand.undo: Command is already undone");
const e = this._model.timeScale();
this._newRightOffsetAndBarSpacing = {
barSpacing: e.barSpacing(),
rightOffset: e.rightOffset()
}, e.setBarSpacing(this._rightOffsetAndBarSpacing.barSpacing), e
.setRightOffset(this._rightOffsetAndBarSpacing.rightOffset), this._model
.lightUpdate()
}
redo() {
if (null === this._newRightOffsetAndBarSpacing) return void n.logDebug(
"TimeScaleChangeUndoCommand.redo: Command is not undone");
const e = this._model.timeScale();
e.setBarSpacing(this._newRightOffsetAndBarSpacing.barSpacing), e.setRightOffset(
this._newRightOffsetAndBarSpacing.rightOffset), this._model
.lightUpdate(), this._newRightOffsetAndBarSpacing = null
}
}
},
XlJ7: function(e, t, i) {
"use strict";
function s(e, t, i, s) {
return `${s ? s + " " : ""}${i ? i + " " : ""}${e}px ${t}`
}
i.r(t), i.d(t, "makeFont", (function() {
return s
})), i.d(t, "parseFont", (function() {
return n
}));
const r = /(bold )?(italic )?(\d+)(px|pt) (.*)$/;
function n(e) {
const t = r.exec(e);
return null === t ? null : {
family: t[5],
size: parseInt(t[3]) * ("pt" === t[4] ? .75 : 1),
bold: Boolean(t[1]),
italic: Boolean(t[2])
}
}
},
Xyly: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolBezierQuadro", (function() {
return n
}));
var s = i("Ocx9"),
r = i("Ss5c");
class n extends r.LineDataSource {
constructor(e, t) {
const s = t || n.createProperties();
super(e, s), this._controlPoint = null, i.e("lt-pane-views").then(i.bind(null,
"4Ptp")).then(t => {
this._setPaneViews([new t.BezierQuadroPaneView(this, e)])
})
}
pointsCount() {
return 2
}
properties() {
return super.properties()
}
name() {
return "Curve"
}
setLastPoint(e, t) {
super.setLastPoint(e, t), this._controlPoint = this._calculateControlPoint()
}
addPoint(e, t, i) {
const s = super.addPoint(e, t, i);
if (s) {
const e = this._calculateControlPoint();
this._points.push(e), this._controlPoint = null, i || (this
.normalizePoints(), this.createServerPoints()), this
._createPointProperty(2)
}
return s
}
restorePoints(e, t, i) {
super.restorePoints(e, t, i), this._createPointProperty(2)
}
controlPoint() {
return this._controlPoint
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolbezierquadro", e);
return n._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "b4fl")).then(
e => e.GeneralBezierDefinitionsViewModel)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e)
}
_calculateControlPoint() {
const e = this.pointToScreenPoint(this.points()[0])[0],
t = this.pointToScreenPoint(this.points()[1])[0],
i = t.subtract(e).scaled(.5).transposed().scaled(.3),
s = e.add(t).scaled(.5).add(i);
return this.screenPointToPoint(s)
}
}
},
XzZr: function(e, t, i) {
"use strict";
var s = i("ogJP").declareClassAsPureInterface;
function r() {}
TradingView.WEB_SOCKET_WAS_CONNECTED = !1, r.REBIND_STUDY_STANDALONE_TO_CHILD = 1, r
.REBIND_STUDY_CHILD_TO_STANDALONE = 2, r.prototype.defaultWatchlistSymbols = function() {},
r.prototype.defaultResolutions = function() {}, r.prototype.availableCurrencies =
function() {}, r.prototype.availableUnits = function() {}, r.prototype
.supportedSymbolsTypes =
function() {}, r.prototype.supportedExchangesList = function() {}, r.prototype
.symbolsGrouping = function() {}, r.prototype.quoteCreateSession = function(e) {}, r
.prototype.quoteDeleteSession = function(e) {}, r.prototype.quoteSetFields = function(e,
t) {}, r.prototype.quoteAddSymbols = function(e, t) {}, r.prototype.quoteRemoveSymbols =
function(e, t) {}, r.prototype.quoteFastSymbols = function(e, t) {}, r.prototype
.depthCreateSession = function(e, t, i) {}, r.prototype.depthDeleteSession = function(e) {},
r.prototype.depthSetSymbol = function(e, t) {}, r.prototype.depthClearSymbol = function(
e) {}, r.prototype.depthSetScale = function(e, t) {}, r.prototype.chartCreateSession =
function(e, t) {}, r.prototype.chartDeleteSession = function(e) {}, r.prototype
.createSession = function(e, t) {}, r.prototype.removeSession = function(e) {}, r.prototype
.connected = function() {}, r.prototype.connect = function() {}, r.prototype.disconnect =
function() {}, r.prototype.switchTimezone = function(e, t) {}, r.prototype.resolveSymbol =
function(e, t, i, s, r) {}, r.prototype.createSeries = function(e, t, i, s, r, n, o, a) {},
r.prototype.removeSeries = function(e, t, i) {}, r.prototype.modifySeries = function(e, t,
i, s, r, n, o) {}, r.prototype.requestMoreData = function(e, t, i, s) {}, r.prototype
.requestMetadata = function(e, t, i) {}, r.prototype.isCanCreateStudy = function(e, t) {}, r
.prototype.createStudy = function(e, t, i, s, r, n, o) {}, r.prototype.rebindStudy =
function(e, t, i, s, r, n, o, a) {}, r.prototype.removeStudy = function(e, t, i) {}, r
.prototype.modifyStudy = function(e, t, i, s, r) {}, r.prototype.createPointset = function(
e, t, i, s, r, n, o) {}, r.prototype.modifyPointset = function(e, t, i, s, r) {}, r
.prototype.removePointset = function(e, t, i) {}, r.prototype.requestMoreTickmarks =
function(e, t, i, s) {}, r.prototype.requestFirstBarTime = function(e, t, i, s) {}, r
.prototype._invokeHandler = function(e, t) {}, r.prototype._sendRequest = function(e, t) {},
r.prototype._onMessage = function(e) {}, r.prototype._dispathNotification = function(e) {},
r.prototype._invokeNotificationHandler = function(e, t, i) {}, r.prototype._notifySessions =
function(e) {}, r.prototype.unpack = function(e) {},
r.prototype.searchSymbols = function(e, t, i, s, r, n, o, a, l, c) {}, r.prototype
.serverTimeOffset = function() {}, r.prototype.getMarks = function(e, t, i, s, r) {}, r
.prototype.getTimescaleMarks = function(e, t, i, s, r) {}, s(r, "ChartApiInterface"), e
.exports.HandlerInfo = function(e, t) {
this.handler = e, this.customId = t
}, e.exports.ChartApiInterface = r
},
Y5iK: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "MainSeriesScaleRatioProperty", (function() {
return n
}));
var s = i("aIyQ"),
r = i.n(s);
class n {
constructor(e) {
this._changed = new r.a, this._model = e
}
getStepChangeValue() {
return .1
}
getMinValue() {
return 1e-7
}
getMaxValue() {
return 99999999
}
value() {
return this._model.mainSeriesScaleRatio()
}
setValue(e, t) {
(e !== this.value() || t) && (this._model.setMainSeriesScaleRatio(e), this
._onChanged())
}
state() {
return null
}
clone() {
return new n(this._model)
}
listeners() {
return this._changed
}
subscribe(e, t) {
this._changed.subscribe(e, t)
}
unsubscribe(e, t) {
this._changed.unsubscribe(e, t)
}
unsubscribeAll(e) {
this._changed.unsubscribeAll(e)
}
_onChanged() {
this._changed.fire(this)
}
}
},
Y7w9: function(e, t, i) {
"use strict";
function s(e, t) {
return e < t
}
function r(e, t, i, s = 0, r = e.length) {
let n = r - s;
for (; 0 < n;) {
const r = n >> 1,
o = s + r;
i(e[o], t) ? (s = o + 1, n -= r + 1) : n = r
}
return s
}
function n(e, t, i = 0, n = e.length) {
return r(e, t, s, i, n)
}
function o(e, t, i, s = 0, r = e.length) {
let n = r - s;
for (; 0 < n;) {
const r = n >> 1,
o = s + r;
i(t, e[o]) ? n = r : (s = o + 1, n -= r + 1)
}
return s
}
function a(e, t, i = 0, r = e.length) {
return o(e, t, s, i, r)
}
function l(e, t) {
return e.filter(e => !t.includes(e))
}
function c(e, t) {
const i = e.indexOf(t);
return i < 0 ? e.slice() : [t].concat(e.slice(0, i)).concat(e.slice(i + 1))
}
function h(e, t, i) {
const s = new Set(t),
r = [],
o = [],
a = [];
return e.forEach((e, t) => {
s.has(e) ? o.push(e) : (r.push(e), a.push(t))
}), i = i < e.length - 1 ? n(a, i + 1) : r.length, r.splice(i, 0, ...o), {
newItems: r,
movedItemsStartIndex: i
}
}
function u(e, t, i) {
const s = new Set(t),
r = [],
o = [],
a = [];
return e.forEach((e, t) => {
s.has(e) ? o.push(e) : (r.push(e), a.push(t))
}), i = i <= e.length - 1 ? n(a, i) : r.length, r.splice(i, 0, ...o), {
newItems: r,
movedItemsStartIndex: i
}
}
function d(e, t) {
const i = new Set;
return e.forEach(e => {
t.has(e) && i.add(e)
}), i
}
i.r(t), i.d(t, "lowerbound", (function() {
return r
})), i.d(t, "lowerbound_int", (function() {
return n
})), i.d(t, "upperbound", (function() {
return o
})), i.d(t, "upperbound_int", (function() {
return a
})), i.d(t, "subtract", (function() {
return l
})), i.d(t, "moveToHead", (function() {
return c
})), i.d(t, "moveAfter", (function() {
return h
})), i.d(t, "moveBefore", (function() {
return u
})), i.d(t, "intersect", (function() {
return d
}))
},
YCFM: function(e, t, i) {},
YWnQ: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "SymbolErrorPermissionDeniedReason", (function() {
return s
})), i.d(t, "permissionDenied", (function() {
return r
})),
function(e) {
e.Symbol = "symbol", e.GroupPermission = "group"
}(s || (s = {}));
const r = "permission denied"
},
YdVo: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolPath", (function() {
return c
}));
var s = i("Eyy1"),
r = i("aO4+"),
n = i("Ocx9"),
o = i("Zp/P"),
a = i("Ss5c"),
l = i("j3hX");
class c extends a.LineDataSource {
constructor(e, t) {
const s = t || c.createProperties();
super(e, s), i.e("lt-pane-views").then(i.bind(null, "JeuX")).then(t => {
this._setPaneViews([new t.PathPaneView(this, e)])
})
}
pointsCount() {
return -1
}
properties() {
return super.properties()
}
name() {
return "Path"
}
hasEditableCoordinates() {
return !1
}
addPoint(e, t, i) {
var n;
const a = Object(s.ensureNotNull)(this.priceScale()),
l = this._model.timeScale().indexToCoordinate(e.index),
c = e.price,
h = Object(s.ensure)(null === (n = this.ownerSource()) || void 0 === n ?
void 0 : n.firstValue()),
u = a.priceToCoordinate(c, h);
if (this._points.length > 0) {
const e = this._points[this._points.length - 1],
t = this._model.timeScale().indexToCoordinate(e.index),
i = e.price,
s = a.priceToCoordinate(i, h);
if (new r.Point(l, u).subtract(new r.Point(t, s)).length() < Object(o
.interactionTolerance)().minDistanceBetweenPoints) return this
._lastPoint = null, this.normalizePoints(), this
.createServerPoints(), !0
}
return super.addPoint(e, t, i)
}
static createProperties(e) {
const t = new n.DefaultProperty("linetoolpath", e);
return c._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "WW+G")).then(
e => e.PathDefinitionsViewModel)
}
static _configureProperties(e) {
a.LineDataSource._configureProperties(e), e.addChild("linesColors", new l
.LineToolColorsProperty([e.childs().lineColor]))
}
}
},
"Ye2/": function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "LineToolBarsPatternMode", (function() {
return s
})),
function(e) {
e[e.Bars = 0] = "Bars", e[e.Line = 1] = "Line", e[e.OpenClose = 2] = "OpenClose", e[e
.LineOpen = 3] = "LineOpen", e[e.LineHigh = 4] = "LineHigh", e[e.LineLow = 5] =
"LineLow", e[e.LineHL2 = 6] = "LineHL2"
}(s || (s = {}))
},
Yj6H: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("ogJP"),
n = i("aIyQ"),
o = i.n(n),
a = i("Y7w9"),
l = i("Qb4w"),
c = i("TTFo"),
h = i("qJq3"),
u = i("7ktv"),
d = i("tc+8"),
p = i.n(d),
_ = i("3ClC"),
m = i("/tGj"),
f = i("n5al"),
g = i("SwuQ"),
b = i("s1Gx"),
v = i("Hr11");
class S {
constructor(e, t) {
if (this._base = e, this._integralDividers = t, Object(v.isBaseDecimal)(this._base))
this._fractionalDividers = [2, 2.5, 2];
else {
this._fractionalDividers = [];
for (let e = this._base; 1 !== e;) {
if (e % 2 == 0) this._fractionalDividers.push(2), e /= 2;
else {
if (e % 5 != 0) throw new Error("unexpected base");
this._fractionalDividers.push(2), this._fractionalDividers.push(2.5),
e /= 5
}
if (this._fractionalDividers.length > 100) throw new Error(
"something wrong with base")
}
}
}
tickSpan(e, t, i) {
const s = 0 === this._base ? 0 : 1 / this._base;
let r = Math.pow(10, Math.max(0, Math.ceil(Object(v.log10)(e - t)))),
n = 0,
o = this._integralDividers[0];
for (;;) {
const e = Object(v.greaterOrEqual)(r, s, 1e-14) && r > s + 1e-14,
t = Object(v.greaterOrEqual)(r, i * o, 1e-14),
a = Object(v.greaterOrEqual)(r, 1, 1e-14);
if (!(e && t && a)) break;
r /= o, o = this._integralDividers[++n % this._integralDividers.length]
}
if (r <= s + 1e-14 && (r = s), r = Math.max(1, r), this._fractionalDividers.length >
0 && Object(v.equal)(r, 1, 1e-14))
for (n = 0, o = this._fractionalDividers[0]; Object(v.greaterOrEqual)(r, i * o,
1e-14) && r > s + 1e-14;) r /= o, o = this._fractionalDividers[++n %
this._fractionalDividers.length];
return r
}
}
class y {
constructor(e, t, i, s) {
this._marks = null, this._priceScale = e, this._base = t, this
._coordinateToLogicalFunc = i, this._logicalToCoordinateFunc = s
}
base() {
return this._base
}
setBase(e) {
if (e < 0) throw new Error("base < 0");
this._base = e
}
tickSpan(e, t, i = 0) {
if (e < t) throw new Error("high < low");
const s = this._priceScale.height(),
r = (e - t) * this._tickMarkHeight() / s,
n = new S(this._base, [2, 2.5, 2]),
o = new S(this._base, [2, 2, 2.5]),
a = new S(this._base, [2.5, 2, 2]);
let l = 0;
const c = n.tickSpan(e, t, r);
c > i && (l = c);
const h = o.tickSpan(e, t, r);
h > i && (l = Math.min(l, h));
const u = a.tickSpan(e, t, r);
return u > i && (l = Math.min(l, u)), l > 0 ? l : e - t
}
rebuildTickMarks() {
this._marks = null
}
marks() {
return null === this._marks && (this._marks = this._rebuildTickMarksImpl()), this
._marks
}
_fontHeight() {
return this._priceScale.fontSize()
}
_tickMarkHeight() {
return Math.ceil(2.5 * this._fontHeight())
}
_rebuildTickMarksImpl() {
const e = this._priceScale,
t = [],
i = e.mainSource();
if (e.isEmpty() || null === i) return t;
let s = i.firstValue();
null === s && (s = 0);
const r = e.height(),
n = this._coordinateToLogicalFunc(r - 1, s),
o = this._coordinateToLogicalFunc(0, s),
a = Math.max(n, o),
l = Math.min(n, o);
if (a === l) return t;
let c = this.tickSpan(a, l),
h = a % c;
h += h < 0 ? c : 0;
const u = a >= l ? 1 : -1;
let d = null;
const p = e.formatter();
let _ = NaN;
for (let i = a - h; i > l; i -= c) {
i === _ && (c = this.tickSpan(a, l, c)), _ = i;
const r = this._logicalToCoordinateFunc(i, s);
null !== d && Math.abs(r - d) < this._tickMarkHeight() || (t.push({
coord: r,
label: p.format(i)
}), d = r, e.isLog() && (c = this.tickSpan(i * u, l)))
}
return t
}
}
var w = i("CW80"),
P = i("mMWL"),
C = i("GH0z"),
x = i("kcTO");
i.d(t, "PriceScaleBase", (function() {
return O
}));
const T = new C.PercentageFormatter,
I = new x.PriceFormatter(100, 1),
M = {
autoScale: !0,
autoScaleDisabled: !1,
lockScale: !1,
percentage: !1,
percentageDisabled: !1,
log: !1,
logDisabled: !1,
alignLabels: !0,
isInverted: !1,
indexedTo100: !1
};
class O {
constructor(e) {
this._marksCache = null, this._onMarksChanged = new o.a, this.m_dataSources = [],
this._sourcesForAutoscale = null, this._hasSeries = !1, this._studiesCount = 0,
this._drawingCount = 0, this._seriesLikeSources = [], this
._seriesLikeSourcesSet = new Set, this._priceDataSources = [], this
._mainSource = null, this._lastSourceRemoved = new o.a, this
._scaleSeriesOnly = !1, this._invalidatedForRange = {
isValid: !0,
visibleBars: null
}, this.m_priceRange = null, this.m_height = 0, this._margins = {
top: 0,
bottom: 0
}, this._correctedMarginsCache = null, this._topPixelMargin = 0, this
._bottomPixelMargin = 0, this._internalHeightCache = null, this
._internalHeightChanged = new o.a, this._priceRangeSnapshot = null, this
._currencyCache = null, this._unitCache = null, this
._recalculatePriceRangeOnce = !1, this._cachedOrderedSoruces = null, this
._scaleStartPoint = null, this._maxPriceRange = null, this._minPriceRange =
null, this._priceRangeChanged = new o.a, this._sourcesToUpdateViews = null, this
._markBuilder = new y(this, 100, this._coordinateToLogical.bind(this), this
._logicalToCoordinate.bind(this)), this._formatter = null, this._id = "",
e = Object.assign({}, M, e), this._properties = new p.a(e)
}
id() {
return this._id
}
setId(e) {
this._id = e
}
isLog() {
return this._properties.childs().log.value()
}
isPercentage() {
return this._properties.childs().percentage.value()
}
isInverted() {
return this._properties.childs().isInverted.value()
}
isIndexedTo100() {
return this._properties.childs().indexedTo100.value()
}
isAutoScale() {
return this._properties.childs().autoScale.value() && !this.isLockScale()
}
isLockScale() {
return this._properties.childs().lockScale.value()
}
isRegular() {
return !this.isPercentage() && !this.isLog() && !this.isIndexedTo100()
}
properties() {
return this._properties
}
height() {
return this.m_height
}
setHeight(e) {
this.m_height !== e && (this.m_height = e, this._invalidateInternalHeightCache(),
this._marksCache = null)
}
internalHeight() {
if (this._internalHeightCache) return this._internalHeightCache;
const e = this.height() - this.topPixelMargin() - this.bottomPixelMargin();
return this._internalHeightCache = e, e
}
priceRange() {
return this._makeSureItIsValid(), this.m_priceRange
}
setPriceRange(e, t, i) {
if (!(e instanceof l.PriceRange)) throw new TypeError("incorrect price range");
const s = this.m_priceRange;
if (!t && l.PriceRange.compare(s, e)) return;
const r = null !== this._maxPriceRange && this._maxPriceRange.containsStrictly(e),
n = null !== this._minPriceRange && e.containsStrictly(this._minPriceRange);
this.isLockScale() && !t && (r || n) || (this._marksCache = null, this
.m_priceRange = e, i || this._priceRangeChanged.fire(s, e))
}
setMinPriceRange(e) {
this._minPriceRange = e
}
setMaxPriceRange(e) {
this._maxPriceRange = e
}
recalculatePriceRangeOnce() {
this._recalculatePriceRangeOnce = !0
}
priceRangeShouldBeRecalculatedOnce() {
if (!this._recalculatePriceRangeOnce || this.isLockScale()) return !1;
const e = this.mainSource();
return null !== e && e.priceRangeReady()
}
priceRangeChanged() {
return this._priceRangeChanged
}
updateAllViews() {
const e = this._getSourcesToUpdateViews();
for (const t of e) t.updateAllViews()
}
state() {
var e;
const t = this._properties.childs();
return {
id: this._id,
m_priceRange: (null === (e = this.priceRange()) || void 0 === e ? void 0 : e
.serialize()) || null,
m_isAutoScale: this.isAutoScale(),
m_isPercentage: t.percentage.value(),
m_isIndexedTo100: t.indexedTo100.value(),
m_isLog: t.log.value(),
m_isLockScale: this.isLockScale(),
m_isInverted: this.isInverted(),
m_height: this.m_height,
m_topMargin: this._margins.top,
m_bottomMargin: this._margins.bottom,
alignLabels: t.alignLabels.value()
}
}
restoreState(e) {
let t = e.m_priceRange;
if (void 0 === t) throw new TypeError("invalid state");
if (void 0 === e.m_isAutoScale) throw new TypeError("invalid state");
void 0 !== e.id && (this._id = e.id);
const i = {
autoScale: e.m_isAutoScale
};
void 0 !== e.m_isPercentage && (i.percentage = e.m_isPercentage), void 0 !== e
.m_isIndexedTo100 && (i.indexedTo100 = e.m_isIndexedTo100), void 0 !== e
.m_isLog && (i.log = e.m_isLog), void 0 !== e.m_isLockScale && (i.lockScale = e
.m_isLockScale), void 0 !== e.m_isInverted && this._properties.childs()
.isInverted.setValue(e.m_isInverted), void 0 !== e.m_height && this.setHeight(
Math.max(0, e.m_height)), this.setMode(i), t ? (t instanceof l.PriceRange ||
(t = new l.PriceRange(t)), this.setPriceRange(t, !0)) : this.m_priceRange =
null, void 0 !== e.m_topMargin && (this._margins.top = e.m_topMargin),
void 0 !== e.m_bottomMargin && (this._margins.bottom = e.m_bottomMargin),
void 0 !== e.alignLabels && this._properties.childs().alignLabels.setValue(e
.alignLabels), this._mainSource = null, this._scaleSeriesOnly = !1
}
priceToLogical(e) {
return this.isLog() && e ? Object(c.toLog)(e) : e
}
logicalToPrice(e) {
return this.isLog() ? Object(c.fromLog)(e) : e
}
priceToCoordinate(e, t) {
const i = this._priceToPercentOrIndexedTo100IfNeeded(e, t);
return this._logicalToCoordinate(i)
}
coordinateToPrice(e, t) {
let i = this._coordinateToLogical(e);
return this.isPercentage() ? i = Object(c.fromPercent)(i, t) : this
.isIndexedTo100() && (i = Object(c.fromIndexedTo100)(i, t)), i
}
mainSource() {
if (null !== this._mainSource) return this._mainSource;
let e;
for (const t of this.m_dataSources) {
if (t instanceof h.Series) {
e = t;
break
}!e && t instanceof u.PriceDataSource && (e = t)
}
return this._mainSource = e || null, this._correctedMarginsCache = null, this
._mainSource
}
pricesArrayToCoordinates(e, t, i) {
this._makeSureItIsValid();
const r = this.bottomPixelMargin(),
n = Object(s.ensureNotNull)(this.priceRange()),
o = n.minValue(),
a = n.maxValue(),
l = this.internalHeight() - 1,
h = this.isInverted(),
u = l / (a - o);
void 0 === i && (i = e.length);
const d = this.isPercentage(),
p = this.isIndexedTo100(),
_ = this.isLog(),
m = this.m_height;
let f, g;
for (let s = 0; s < i; s++) f = e[s], Number.isFinite(f) && (d ? f = Object(c
.toPercent)(f, t) : p ? f = Object(c.toIndexedTo100)(f, t) : _ && (f =
Object(c.toLog)(f)), g = r + u * (f - o), e[s] = h ? g : m - 1 - g)
}
pointsArrayToCoordinates(e, t) {
this._makeSureItIsValid();
const i = Object(s.ensureNotNull)(this.priceRange()),
r = this.bottomPixelMargin(),
n = i.minValue(),
o = i.maxValue(),
a = this.internalHeight() - 1,
l = this.isInverted(),
h = a / (o - n),
u = e;
if (this.isPercentage())
for (let e = 0; e < u.length; e++) u[e].y = Object(c.toPercent)(u[e].y, t);
if (this.isIndexedTo100())
for (let e = 0; e < u.length; e++) u[e].y = Object(c.toIndexedTo100)(u[e].y, t);
if (this.isLog())
for (let e = 0; e < u.length; e++) u[e].y = this.priceToLogical(u[e].y);
for (let e = 0; e < u.length; e++) {
const t = u[e].y;
if (isNaN(t) || null == t) continue;
const i = r + h * (t - n),
s = l ? i : this.m_height - 1 - i;
u[e].y = s
}
}
barPricesToCoordinates(e, t) {
this._makeSureItIsValid();
const i = Object(s.ensureNotNull)(this.priceRange()),
r = e,
n = this.bottomPixelMargin(),
o = i.minValue(),
a = i.maxValue(),
l = this.internalHeight() - 1;
let h = null;
if (this.isPercentage() ? h = c.toPercent : this.isIndexedTo100() ? h = c
.toIndexedTo100 : this.isLog() && (h = (e, t) => e ? Object(c.toLog)(e) : e),
null !== h)
for (let e = 0; e < r.length; e++) r[e] && (r[e].open = h(r[e].open, t), r[e]
.high = h(r[e].high, t), r[e].low = h(r[e].low, t), r[e].close = h(r[e]
.close, t), void 0 !== r[e].additionalPrice && (r[e]
.additionalPrice = h(r[e].additionalPrice, t)));
const u = l / (a - o),
d = this.isInverted();
for (let e = 0; e < r.length; e++) {
const t = r[e];
if (!t) continue;
const i = n + u * (t.open - o),
s = d ? i : this.m_height - 1 - i;
t.open = s;
const a = n + u * (t.high - o),
l = d ? a : this.m_height - 1 - a;
t.high = l;
const c = n + u * (t.low - o),
h = d ? c : this.m_height - 1 - c;
t.low = h;
const p = n + u * (t.close - o),
_ = d ? p : this.m_height - 1 - p;
if (t.close = _, void 0 !== t.additionalPrice) {
const e = n + u * (t.additionalPrice - o);
t.additionalPrice = d ? e : this.m_height - 1 - e
}
}
}
formatter() {
return null === this._formatter && this.updateFormatter(), Object(s.ensureNotNull)(
this._formatter)
}
updateFormatter() {
this._marksCache = null;
const e = this.mainSource();
let t = 100;
e && (t = e.base()), this._formatter = null, this.isPercentage() ? (this
._formatter = T, t = 100) : this.isIndexedTo100() ? (this._formatter = new x
.PriceFormatter(100, 1), t = 100) : this._formatter = e ? e.formatter() : I,
this._markBuilder = new y(this, t, this._coordinateToLogical.bind(this), this
._logicalToCoordinate.bind(this)), this._markBuilder.rebuildTickMarks()
}
formatPrice(e, t) {
const i = this._priceToPercentOrIndexedTo100IfNeeded(e, t);
return this.formatter().format(i)
}
formatPriceAbsolute(e) {
return this._mainSourceFormatter().format(e)
}
formatPricePercentage(e, t, i) {
return e = Object(c.toPercent)(e, t), T.format(e, i)
}
dataSources() {
return this.m_dataSources
}
seriesLikeSources() {
return this._seriesLikeSources
}
addDataSource(e, t) {
if (t || -1 === this.m_dataSources.indexOf(e)) {
if (e instanceof u.PriceDataSource && (this._priceDataSources.push(e), e
.currencyChanged().subscribe(this, () => this._currencyCache = null), e
.unitChanged().subscribe(this, () => this._unitCache = null), Object(m
.isSymbolSource)(e) && (this._seriesLikeSources.push(e), this
._seriesLikeSourcesSet.add(e), e.symbolResolved().subscribe(this,
() => {
this._currencyCache = null, this._unitCache = null
}), e instanceof h.Series))) {
const t = e.properties();
this._hasSeries || (t.childs().lockScale && (this.setMode({
lockScale: t.childs().lockScale.value()
}), t.removeProperty("lockScale")), t.childs().pnfStyle.childs()
.lockScale && t.childs().pnfStyle.removeProperty("lockScale")), this
._hasSeries = !0
}
e.properties().visible.listeners().subscribe(this, this._dropScaleCache),
Object(_.isStudy)(e) && (e.onIsActualIntervalChange().subscribe(this, this
._dropScaleCache), 0 === this._studiesCount && Object(P
.hideAllIndicators)().subscribe(this, this._dropScaleCache), this
._studiesCount++), Object(w.isLineTool)(e) && (0 === this
._drawingCount && Object(P.hideAllDrawings)().subscribe(this, this
._dropScaleCache), this._drawingCount++), this.m_dataSources.push(
e), this._mainSource = null, this._correctedMarginsCache = null, this
._sourcesToUpdateViews = null, this._dropScaleCache(), this
.updateFormatter(), this._initScaleProperties(), this
.invalidateSourcesCache()
}
}
removeDataSource(e) {
const t = this.m_dataSources.indexOf(e);
if (Object(s.assert)(-1 !== t, "Source is not attached to scale"), e.properties()
.visible.listeners().unsubscribe(this, this._dropScaleCache), this.m_dataSources
.splice(t, 1), e instanceof u.PriceDataSource) {
const t = this._priceDataSources.indexOf(e);
if (Object(s.assert)(-1 !== t, "Source is not found"), this._priceDataSources
.splice(t, 1), Object(m.isSymbolSource)(e)) {
const t = this._seriesLikeSources.indexOf(e);
Object(s.assert)(-1 !== t, "Source is not found"), this._seriesLikeSources
.splice(t, 1), this._seriesLikeSourcesSet.delete(e), e.symbolResolved()
.unsubscribeAll(this), e instanceof h.Series && (this._hasSeries = !1)
}
e.currencyChanged().unsubscribeAll(this), e.unitChanged().unsubscribeAll(this)
}
this.mainSource() || this.setMode({
autoScale: !0
}), Object(_.isStudy)(e) && (e.onIsActualIntervalChange().unsubscribe(this, this
._dropScaleCache), this._studiesCount--, 0 === this._studiesCount &&
Object(P.hideAllIndicators)().unsubscribe(this, this._dropScaleCache)),
Object(w.isLineTool)(e) && (this._drawingCount--, 0 === this._drawingCount &&
Object(P.hideAllDrawings)().unsubscribe(this, this._dropScaleCache)), this
._mainSource = null, this._correctedMarginsCache = null, this
._sourcesForAutoscale = null,
this._sourcesToUpdateViews = null, this.updateFormatter(), this
.invalidateSourcesCache(), 0 === this.m_dataSources.length && this
._lastSourceRemoved.fire(), this._currencyCache = null, this._unitCache = null
}
currency(e) {
if (null !== this._currencyCache && e.size() === this._currencyCache
.availableCurrenciesCount) return this._currencyCache.value;
let t;
const i = new Set,
r = new Set,
n = new Set,
o = new Map;
let a, l = 0 === this._seriesLikeSources.length,
c = !0,
h = 0,
u = 0;
for (const u of this._seriesLikeSources) {
if (!u.isVisible()) continue;
const d = u.symbolInfo();
if (null === d) {
t = null;
break
}
const p = Object(f.symbolOriginalCurrency)(d);
if (null === p) {
t = null;
break
}
o.set(p, Object(s.ensureNotNull)(Object(f.symbolOriginalCurrency)(d, !0)));
const _ = u.currency();
if (null === _) {
t = null;
break
}
o.set(_, Object(s.ensureNotNull)(Object(f.symbolCurrency)(d, !0)));
const m = Object(f.symbolBaseCurrency)(d);
null !== m && r.add(m), c = c && p === _, n.add(_), i.add(p), void 0 === a ? a =
_ : null !== a && a !== _ && (a = null), l || e.convertible(_) && Object(f
.symbolCurrencyConvertible)(d) || (l = !0), h += 1
}
if (null !== t)
for (const i of this._priceDataSources) {
if (this._seriesLikeSourcesSet.has(i)) continue;
const r = i;
if (!r.isCurrencySource() || !r.isVisible()) continue;
const c = r.currency();
if (null === c) {
t = null;
break
}
n.add(c), u += 1;
const d = Object(s.ensureNotNull)(r.symbolSource()),
p = d.symbolInfo();
if (null === p) {
t = null;
break
}
if (l || e.convertible(c) && Object(f.symbolCurrencyConvertible)(p) || (
l = !0), o.set(c, Object(s.ensureNotNull)(Object(f.symbolCurrency)(
p, !0))), !this._seriesLikeSourcesSet.has(d) || !d.isVisible()) {
if (h > 0) a = null;
else if (void 0 === a) a = c;
else if (null !== a && a !== c) {
a = null;
break
}
l = !0;
break
}
}
return void 0 === t && (t = 0 === h && 0 === u ? null : {
readOnly: l,
selectedCurrency: a || null,
currencies: n,
originalCurrencies: i,
baseCurrencies: r,
symbolSourceCount: h,
allCurrenciesAreOriginal: c,
displayedValues: o
}), this._currencyCache = {
value: t,
availableCurrenciesCount: e.size()
}, t
}
unit(e) {
if (null !== this._unitCache && e.size() === this._unitCache.availableUnitsCount)
return this._unitCache.value;
let t;
const i = new Set,
r = new Set,
n = new Map,
o = new Map;
let l, c = 0 === this._seriesLikeSources.length ? new Set : e.allGroups(),
h = !0,
u = 0,
d = 0;
for (const s of this._seriesLikeSources) {
if (!s.isVisible()) continue;
const d = s.symbolInfo();
if (null === d) {
t = null;
break
}
const p = Object(f.symbolOriginalUnit)(d);
if (null === p) {
t = null;
break
}
n.set(p, e.name(p)), o.set(p, e.description(p));
const _ = s.unit();
if (null === _) {
t = null;
break
}
if (n.set(_, e.name(_)), o.set(_, e.description(_)), h = h && p === _, r.add(_),
i.add(p), void 0 === l ? l = _ : null !== l && l !== _ && (l = null), c
.size > 0) {
const t = Object(g.unitConvertibleGroups)(d, _, e);
c = Object(a.intersect)(c, new Set(t))
}
u += 1
}
if (null !== t)
for (const i of this._priceDataSources) {
if (this._seriesLikeSourcesSet.has(i)) continue;
const h = i;
if (!h.isUnitSource() || !h.isVisible()) continue;
const p = h.unit();
if (null === p) {
t = null;
break
}
r.add(p), d += 1;
const _ = Object(s.ensureNotNull)(h.symbolSource()),
m = _.symbolInfo();
if (null === m) {
t = null;
break
}
if (c.size > 0) {
const t = Object(g.unitConvertibleGroups)(m, p, e);
c = Object(a.intersect)(c, new Set(t))
}
if (n.set(p, e.name(p)), o.set(p, e.description(p)),
!this._seriesLikeSourcesSet.has(_) || !_.isVisible()) {
if (u > 0) l = null;
else if (void 0 === l) l = p;
else if (null !== l && l !== p) {
l = null;
break
}
c = new Set;
break
}
}
if (void 0 === t)
if (0 === u && 0 === d) t = null;
else {
const e = l || null;
t = {
availableGroups: c,
selectedUnit: e,
units: r,
originalUnits: i,
symbolSourceCount: u,
allUnitsAreOriginal: h,
names: n,
descriptions: o
}
} return this._unitCache = {
value: t,
availableUnitsCount: e.size()
}, t
}
setMargins(e) {
if (!Object(r.isNumber)(e.top) || !Object(r.isNumber)(e.bottom))
throw new TypeError("invalid margin");
if (e.top < 0 || e.top > 30 || e.bottom < 0 || e.bottom > 30) throw new RangeError(
"invalid margin");
this._margins.top === e.top && this._margins.bottom === e.bottom || (this._margins =
e, this._correctedMarginsCache = null, this
._invalidateInternalHeightCache(), this._marksCache = null)
}
topMargin() {
return this._correctedMargins().top
}
bottomMargin() {
return this._correctedMargins().bottom
}
invalidateMargins() {
this._correctedMarginsCache = null
}
topPixelMargin() {
return this.isInverted() ? this.bottomMargin() * this.height() + this
._bottomPixelMargin : this.topMargin() * this.height() + this._topPixelMargin
}
bottomPixelMargin() {
return this.isInverted() ? this.topMargin() * this.height() + this._topPixelMargin :
this.bottomMargin() * this.height() + this._bottomPixelMargin
}
marks() {
return this._makeSureItIsValid(), null === this._marksCache && (this._markBuilder
.rebuildTickMarks(), this._marksCache = this._markBuilder.marks(), this
._onMarksChanged.fire()), this._marksCache
}
onMarksChanged() {
return this._onMarksChanged
}
priceRangeInPrice() {
if (this.isEmpty()) return null;
const e = this.mainSource();
if (null === e) return null;
const t = Object(s.ensureNotNull)(e.firstValue()),
i = this.height();
return {
from: this.coordinateToPrice(i - 1, t),
to: this.coordinateToPrice(0, t)
}
}
setPriceRangeInPrice(e) {
if (this.isPercentage() || this.isIndexedTo100()) return;
const t = this.isInverted(),
i = t ? this.bottomMargin() : this.topMargin(),
s = t ? this.topMargin() : this.bottomMargin(),
r = this.isLog();
let n = r ? Object(c.toLog)(e.from) : e.from,
o = r ? Object(c.toLog)(e.to) : e.to;
const a = o - n;
n += s * a, o -= i * a, this.setMode({
autoScale: !1
}), this.setPriceRange(new l.PriceRange(n, o)), this._marksCache = null, this
._onMarksChanged.fire()
}
hasMainSeries() {
return this._hasSeries
}
getStudies() {
return this.dataSources().filter(_.isStudy)
}
lastSourceRemoved() {
return this._lastSourceRemoved
}
sourcesForAutoscale() {
return this._mainSource && this._scaleSeriesOnly !== this._scalesProperties.childs()
.scaleSeriesOnly.value() && (this._sourcesForAutoscale = null), this
._sourcesForAutoscale || (this._sourcesForAutoscale = this
._recalculateSourcesForAutoscale()), this._sourcesForAutoscale
}
recalculatePriceRange(e) {
this._invalidatedForRange = {
visibleBars: e,
isValid: !1
}
}
internalHeightChanged() {
return this._internalHeightChanged
}
orderedSources() {
if (this._cachedOrderedSoruces) return this._cachedOrderedSoruces;
let e = this.m_dataSources.slice();
return e = Object(b.sortSources)(e), this._cachedOrderedSoruces = e, this
._cachedOrderedSoruces
}
invalidateSourcesCache() {
this._cachedOrderedSoruces = null, this._sourcesToUpdateViews = null
}
startScale(e) {
if (this.isPercentage() || this.isIndexedTo100()) return;
if (null !== this._scaleStartPoint || null !== this._priceRangeSnapshot) return;
if (this.isEmpty()) return;
this._scaleStartPoint = this.m_height - e;
const t = this.priceRange();
this._priceRangeSnapshot = t && t.clone()
}
scaleTo(e) {
if (this.isPercentage() || this.isIndexedTo100()) return;
if (null === this._scaleStartPoint) return;
this.setMode({
autoScale: !1
}), (e = this.m_height - e) < 0 && (e = 0);
let t = (this._scaleStartPoint + .2 * (this.m_height - 1)) / (e + .2 * (this
.m_height - 1));
const i = Object(s.ensureNotNull)(this._priceRangeSnapshot).clone();
t = Math.max(t, .1), i.scaleAroundCenter(t), this.setPriceRange(i)
}
endScale() {
this.isPercentage() || this.isIndexedTo100() || null !== this._scaleStartPoint && (
this._scaleStartPoint = null, this._priceRangeSnapshot = null)
}
_recalculateSourcesForAutoscale() {
this._mainSource && (this._scaleSeriesOnly = this._scalesProperties.childs()
.scaleSeriesOnly.value());
const e = this._scaleSeriesOnly && this._hasSeries;
return this.m_dataSources.filter(t => !!(t.properties().visible.value() ||
t instanceof h.Series) && (e ? t instanceof h.Series : Object(_.isStudy)
(t) ? !t.isSourceHidden() && t.isIncludedInAutoScale() : t
.isIncludedInAutoScale()))
}
_updateAutoScaleDisabledProperty(e) {
const t = this._properties.childs(),
i = t.indexedTo100.value() || t.percentage.value() || t.lockScale.value();
e ? t.autoScaleDisabled.setValueSilently(i) : t.autoScaleDisabled.setValue(i)
}
_setAutoScaleValueWithDependentProperties(e) {
const t = this._properties.childs();
t.autoScale.setValueSilently(e), e && (t.percentage.setValueSilently(!1), t
.indexedTo100.setValueSilently(!1), t.lockScale.setValueSilently(!1), t
.logDisabled.setValueSilently(!1)), this._updateAutoScaleDisabledProperty(!
0)
}
_setLockScaleValueWithDependentProperties(e) {
const t = this._properties.childs();
t.lockScale.setValueSilently(e), e && (t.autoScale.setValueSilently(!1), t
.percentage.setValueSilently(!1), t.indexedTo100.setValueSilently(!1), t.log
.setValueSilently(!1)), t.percentageDisabled.setValueSilently(e), t
.logDisabled.setValueSilently(e), this._updateAutoScaleDisabledProperty(!0)
}
_setPercentageValueWithDependentProperties(e) {
const t = this._properties.childs();
t.percentage.setValueSilently(e), e && (t.autoScale.setValueSilently(!0), t.log
.setValueSilently(!1), t.lockScale.setValueSilently(!1), t.indexedTo100
.setValueSilently(!1)), this._updateAutoScaleDisabledProperty(!0)
}
_setIndexedTo100ValueWithDependentProperties(e) {
const t = this._properties.childs();
t.indexedTo100.setValueSilently(e), e && (t.autoScale.setValueSilently(!0), t.log
.setValueSilently(!1), t.lockScale.setValueSilently(!1), t.percentage
.setValueSilently(!1)), this._updateAutoScaleDisabledProperty(!0)
}
_setLogValueWithDependentProperties(e) {
const t = this._properties.childs();
t.log.setValueSilently(e), e && (t.lockScale.setValueSilently(!1), t.percentage
.setValueSilently(!1), t.indexedTo100.setValueSilently(!1)), this
._updateAutoScaleDisabledProperty(!0)
}
_recalculatePriceRangeImpl() {
const e = this._invalidatedForRange.visibleBars;
if (null === e) return;
let t = null;
const i = this.sourcesForAutoscale(),
s = this.isPercentage(),
r = this.isIndexedTo100();
let n = 0,
o = 0;
for (const a of i) {
if (!a.properties().visible.value()) continue;
const i = a.firstValue();
if (null === i) continue;
const l = e.firstBar(),
h = e.lastBar(),
u = a.autoScaleInfo(l, h);
let d = u.range;
d && (s ? d = Object(c.toPercentRange)(d, i) : r && (d = Object(c
.toIndexedTo100Range)(d, i)), t = null === t ? d : t.merge(d)),
void 0 !== u.topPixelMargin && (n = Math.max(n, u.topPixelMargin)),
void 0 !== u.bottomPixelMargin && (o = Math.max(o, u.bottomPixelMargin))
}(Math.abs(n - this._topPixelMargin) > 0 || Math.abs(o - this._bottomPixelMargin) >
0) && (this._bottomPixelMargin = o, this._topPixelMargin = n, this._marksCache =
null, this._invalidateInternalHeightCache()), t ? (t.minValue() === t
.maxValue() && (t = new l.PriceRange(t.minValue() - .5, t.maxValue() + .5)),
this.setPriceRange(t)) : this.m_priceRange || this.setPriceRange(new l
.PriceRange(-.5, .5)), this._invalidatedForRange.isValid = !0;
const a = this.mainSource();
null !== a && this._recalculatePriceRangeOnce && (this
._recalculatePriceRangeOnce = !a.priceRangeReady())
}
_makeSureItIsValid() {
this._invalidatedForRange.isValid || (this._invalidatedForRange.isValid = !0, this
._recalculatePriceRangeImpl())
}
_invalidateInternalHeightCache() {
this._internalHeightCache = null, this._internalHeightChanged.fire()
}
_coordinateToLogical(e) {
if (this._makeSureItIsValid(), this.isEmpty()) return 0;
const t = this._invertedCoordinate(e),
i = Object(s.ensureNotNull)(this.priceRange()),
r = i.minValue() + (i.maxValue() - i.minValue()) * ((t - this
.bottomPixelMargin()) / (this.internalHeight() - 1));
return this.logicalToPrice(r)
}
_logicalToCoordinate(e) {
if (this._makeSureItIsValid(), this.isEmpty()) return 0;
e = this.priceToLogical(e);
const t = Object(s.ensureNotNull)(this.priceRange()),
i = this.bottomPixelMargin() + (this.internalHeight() - 1) * (e - t
.minValue()) / (t.maxValue() - t.minValue());
return this._invertedCoordinate(i)
}
_dropScaleCache() {
this._sourcesForAutoscale = null, this._currencyCache = null, this._unitCache = null
}
_invertedCoordinate(e) {
return this.isInverted() ? e : this.height() - 1 - e
}
_initScaleProperties() {
const e = this.isLockScale(),
t = this.properties().childs();
e && (t.percentage.setValue(!1), t.indexedTo100.setValue(!1), t.log.setValue(!1), t
.autoScale.setValue(!1)), t.percentageDisabled.setValue(e), t.logDisabled
.setValue(e), this._updateAutoScaleDisabledProperty(!1), t.percentage.value() &&
(t.log.setValue(!1), t.indexedTo100.setValue(!1)), t.indexedTo100.value() && (t
.log.setValue(!1), t.percentage.setValue(!1))
}
_correctedMargins() {
if (null === this._correctedMarginsCache) {
const e = this.mainSource();
this._correctedMarginsCache = null !== e ? e.correctScaleMargins(this
._margins) : this._margins
}
return this._correctedMarginsCache
}
_getSourcesToUpdateViews() {
return this._sourcesToUpdateViews || (this._sourcesToUpdateViews = this
.m_dataSources.filter(e => !Object(w.isLineTool)(e) || e.isActualSymbol() &&
e.isActualCurrency())), this._sourcesToUpdateViews
}
_mainSourceFormatter() {
const e = this.mainSource();
return (null == e ? void 0 : e.formatter()) || I
}
_priceToPercentOrIndexedTo100IfNeeded(e, t) {
return this.isPercentage() ? Object(c.toPercent)(e, t) : this.isIndexedTo100() ?
Object(c.toIndexedTo100)(e, t) : e
}
}
},
Yjuu: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX"),
o = n.LineToolWidthsProperty,
a = n.LineToolColorsProperty;
class l extends s {
constructor(e, t) {
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"bcXK", 7)).then(({
FibSpeedResistanceArcsPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return l.LevelsCount
}
pointsCount() {
return 2
}
name() {
return "Fib Speed Resistance Arcs"
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
static createProperties(e) {
var t = new r("linetoolfibspeedresistancearcs", e, !1, {
range: [1, 11]
});
return l._configureProperties(t), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "pdv6")))
.FibSpeedResistanceArcsDefinitionsViewModel
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline")
.child("color")
], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child(
"linewidth")), i.push(e.child("level" + r).child("color"));
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
}
}
l.LevelsCount = 11, t.LineToolFibSpeedResistanceArcs = l
},
YlKu: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ApplyLineToolTemplateUndoCommand", (function() {
return r
}));
var s = i("RDU5");
class r extends s.UndoCommand {
constructor(e, t, i) {
super(i), this._source = e, this._newState = t, this._oldState = e.properties()
.state()
}
redo() {
this._source.applyTemplate(this._newState)
}
undo() {
this._source.applyTemplate(this._oldState)
}
}
},
YmeR: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ActionBinder", (function() {
return s
}));
class s {
constructor(e, t, i, s, r = null) {
this._property = t, this._undoModel = i, this._undoText = s, this._action = e, this
.setValue(t.value()), t.subscribe(this, this._propertyChanged), null !== r ? e
.update({
onExecute: r.bind(this)
}) : e.update({
onExecute: this._onActionCallback.bind(this)
})
}
destroy() {
this._property.unsubscribe(this, this._propertyChanged)
}
value() {
return this._action.isChecked()
}
setValue(e) {
this._action.update({
checked: Boolean(e)
})
}
_onActionCallback() {
this._undoModel.setProperty(this._property, this.value(), this._undoText)
}
_propertyChanged(e) {
this.setValue(e.value())
}
}
},
"Yt+L": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return o
}));
var s = i("Eyy1"),
r = i("RDU5"),
n = i("n5al");
class o extends r.UndoCommand {
constructor(e, t, i, r) {
super(r), this._newSourcesUnits = new Map, this._oldSourcesUnits = new Map, this
._showFade = !1, this._chartWidget = i;
const o = i.model().mainSeries();
for (const i of e.seriesLikeSources()) {
if (!i.isVisible()) continue;
const e = t || Object(n.symbolOriginalUnit)(Object(s.ensureNotNull)(i
.symbolInfo()));
this._newSourcesUnits.set(i.id(), e), this._oldSourcesUnits.set(i.id(), i
.unit()), this._showFade = this._showFade || i === o && i.unit() !==
e
}
}
redo() {
this._applyUnits(this._newSourcesUnits)
}
undo() {
this._applyUnits(this._oldSourcesUnits)
}
_applyUnits(e) {
this._showFade && this._chartWidget.screen.show();
const t = this._chartWidget.model().model();
e.forEach((e, i) => {
Object(s.ensureNotNull)(t.dataSourceForId(i)).setUnit(e)
}), this._chartWidget.model().selectionMacro(e => {
e.clearSelection()
})
}
}
},
YuHv: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("AWC/");
function r(e = [], t = []) {
const i = document.createElement("div"),
r = document.createElement("div");
return i.appendChild(r), i.classList.add(s.container), r.classList.add(s.inner), e.forEach(
e => {
i.classList.add(s[e])
}), t.forEach(e => {
i.classList.add(s[e])
}), i
}
},
YzC7: function(e, t, i) {
"use strict";
var s = i("Eyy1"),
r = i("GVHu"),
n = i("n5al"),
o = i("tc+8"),
a = i.n(o),
l = i("Kxc7"),
c = i("oXaB"),
h = i("KcY8");
const u = l.enabled("force_exchange_as_title");
class d extends h.a {
constructor(e, t) {
super(), this._studyCompare = e, this._data = t
}
_updateRendererData(e, t, i) {
e.visible = !1, t.visible = !1;
const s = this._studyCompare.priceScale(),
r = this._studyCompare.lastValueData(this._data.plotIndex, !1);
if (r.noData || null === s || s.isEmpty()) return;
i.background = r.color, i.textColor = this.generateTextColor(r.color), i
.coordinate = r.coordinate, i.floatCoordinate = r.floatCoordinate;
const n = this._studyCompare.model().properties().scalesProperties;
if (n.showSeriesLastValue.value()) {
const t = s.isPercentage();
e.text = t ? r.formattedPricePercentage : r.formattedPriceAbsolute, n
.seriesLastValueMode.value() !== c.PriceAxisLastValueMode
.LastPriceAndPercentageValue ? e.secondLine = "" : e.secondLine = t ? r
.formattedPriceAbsolute : r.formattedPricePercentage, e.visible = !0
}
t.text = "", n.showSymbolLabels.value() && (t.text = this._paneText(), t
.visible = t.text.length > 0)
}
_paneText() {
let e = "";
const t = this._studyCompare.symbolInfo();
return u ? e = Object(n.displayedSymbolExchange)(t) : this._studyCompare.model()
.properties().scalesProperties.showSymbolLabels.value() && (e = Object(n
.displayedSymbolName)(t)), e
}
}
var p = i("it7y"),
_ = i("e92V"),
m = i("mMWL"),
f = i("qFKp"),
g = i("ogJP"),
b = i("EYFt");
class v extends b.a {
constructor(e, t) {
super(e, t), this._emptyValues[0].title = e.guiPlotName("")
}
_hideValues() {
return !1
}
}
const S = f.CheckMobile.any();
class y extends p.StudyDataWindowView {
constructor(e, t) {
super(e, t), this._studyCompare = e
}
_hideValues() {
return !1
}
_createValuesProvider(e, t) {
return new v(e, t)
}
_currentIndex() {
const e = this._model.crossHairSource().lockedIndex;
let t;
return S && (null === this._model.crossHairSource().pane && void 0 === e ||
Object(_.isLineToolName)(m.tool.value()) || null !== this._model
.lineBeingEdited()) ? t = this._study.data().lastIndex() : (t = this
._model.crossHairSource().appliedIndex(), Object(g.isNumber)(t) || (t =
this._study.data().lastIndex())), t
}
}
class w extends y {
constructor(e, t) {
super(e, t), this._additional = null, this._showSeriesOHLC = t.properties()
.paneProperties.legendProperties.showSeriesOHLC, this._showSeriesOHLC.subscribe(
this, this.update)
}
isValuesVisible() {
return this._showSeriesOHLC.value()
}
destroy() {
this._showSeriesOHLC.unsubscribeAll(this)
}
additional() {
return this._additional
}
_updateImpl() {
super._updateImpl()
}
}
var P = i("2kV1"),
C = i("W+6j");
class x extends C.a {
getSplitTitle() {
return this._source.titleInParts(!0, void 0, !1, !1)
}
text() {
return this._source.isActualInterval() ? this._source.isFailed() ?
`${this._source.title(!0, void 0, !1, !1)}: ${this.sourceStatusText()}` :
`${this._source.title(!0, void 0, !1, !1)} ${this.sourceStatusText()}` :
this._source.title(!0, void 0, !1, !1)
}
}
var T = i("WkOR");
i.d(t, "a", (function() {
return E
}));
const I = l.enabled("study_overlay_compare_legend_option"),
M = l.enabled("force_exchange_as_title"),
O = l.enabled("uppercase_instrument_names"),
L = !l.enabled("hide_study_compare_legend_item"),
A = l.enabled("hide_unresolved_symbols_in_legend");
class E extends r.Study {
constructor(e, t, i, s) {
t.hasChild("currencyId") || t.addChild("currencyId", new a.a(null)), t.hasChild(
"unitId") || t.addChild("unitId", new a.a(null)), t.addExclusion(
"currencyId"), t.addExclusion("unitId"), super(e, t, i, s), this
.properties().childs().minTick.subscribe(null, () => this
._recreatePriceFormattingDependencies()), this.properties().childs()
.minTick.subscribe(null, () => this._model.fullUpdate()), this.properties()
.childs().currencyId.subscribe(this, this._onCurrencyChanged), this
.properties().childs().unitId.subscribe(this, this._onUnitChanged), this
.properties().merge({
skipHistogramBaseOnAutoScale: !0
})
}
properties() {
return super.properties()
}
createPriceAxisView(e) {
return new d(this, {
plotIndex: "compare"
})
}
setSymbolCurrencyUnit(e, t, i) {
this._setSymbolCurrencyUnitInternal(e, t, i)
}
symbol() {
return this._properties.inputs.symbol.value()
}
setSymbol(e) {
this.setSymbolCurrencyUnit(e)
}
symbolInfo() {
if (!this._resolvedSymbols) return null;
const e = this._properties.inputs.symbol.value();
if (!e) return null;
let t;
return t = this._resolvedSymbols[this._getSymbolForResolve(e)] || null, t
}
symbolResolved() {
return this.symbolsResolved()
}
symbolSameAsCurrent(e) {
return Object(T.b)(e, this.symbol(), this.symbolInfo())
}
currency() {
return this._properties.currencyId.value() || null
}
setCurrency(e) {
this.setSymbolCurrencyUnit(void 0, e)
}
isConvertedToOtherCurrency() {
return Object(n.isConvertedToOtherCurrency)(this.symbolInfo())
}
unit() {
return this._properties.unitId.value() || null
}
setUnit(e) {
this._properties.unitId.setValue(e)
}
isConvertedToOtherUnit() {
return Object(n.isConvertedToOtherUnit)(this.symbolInfo())
}
style() {
return 2
}
symbolSource() {
return this
}
state(e, t) {
const i = super.state(e, t);
return e && (Object(s.ensureDefined)(i.data).symbols = {
___snapshot: this.symbolInfo() || void 0
}), i
}
symbolTitle(e, t) {
return this.title(!0, {}, !1, e)
}
titleInParts(e, t, i, s) {
const r = this._titleInParts(e, t, i, s).join(", ");
return [O ? r.toUpperCase() : r]
}
tags() {
const e = this.symbol();
return e ? [e] : []
}
statusView() {
return L ? super.statusView() : null
}
guiPlotName(e) {
return this.properties().childs().inputs.childs().symbol.value()
}
canOverrideMinTick() {
return !0
}
canBeHiddenByGlobalFlag() {
return !1
}
valuesProvider() {
return new v(this, this.model())
}
statusProvider(e) {
return new x(this, this._model.properties().scalesProperties.textColor)
}
_createViews() {
this._legendView || (this._legendView = new w(this, this._model)), this
._dataWindowView || (this._dataWindowView = new y(this, this._model)), this
._statusView || (this._statusView = new P.StudyStatusView(this)), super
._createViews()
}
_showLastValueOnPriceScale() {
return this._model.properties().scalesProperties.showSeriesLastValue.value()
}
_onCurrencyChanged() {
this.isStarted() && this._tryChangeInputs(), this._currencyChanged.fire()
}
_onUnitChanged() {
this.isStarted() && this._tryChangeInputs(),
this._unitChanged.fire()
}
_getSymbolObject(e) {
const t = super._getSymbolObject(e),
i = this.currency();
null !== i && (t["currency-id"] = i);
const s = this.unit();
return null !== s && (t["unit-id"] = s), t
}
_getSymbolForApi(e) {
return Object(n.symbolForApi)(this._resolvedSymbolsByInput[e] || null, e)
}
_onSymbolResolved(e, t, i) {
super._onSymbolResolved(e, t, i), this._recreatePriceFormattingDependencies();
const s = t === this.symbol() ? Object(n.extractSymbolNameFromSymbolInfo)(i,
this.symbol()) : null,
r = Object(n.symbolCurrency)(i),
o = Object(n.symbolUnit)(i);
this._setSymbolCurrencyUnitInternal(s || void 0, r, o, i), this.model()
.realignLineTools()
}
_changeInputsImpl(e, t) {
super._changeInputsImpl(e, t), e.symbol !== t.symbol && this._model
.realignLineTools()
}
_createStudyOnServer() {
super._createStudyOnServer(), this._model.realignLineTools()
}
_tryCreateFormatter() {
const e = this.symbolInfo();
return Object(n.createSeriesFormatter)(e, this.properties().childs().minTick
.value())
}
_titleInParts(e, t, i, s) {
const r = this.properties().childs().inputs.childs().symbol.value(),
n = this.symbolInfo(),
o = n && n.exchange && 0 !== n.exchange.length;
let a;
if (M && o && n) a = n.exchange;
else if (n) {
if (a = n.name, I) switch (this._model.mainSeries().properties()
.statusViewStyle.symbolTextSource.value()) {
case "description":
a = n.description;
break;
case "ticker-and-description":
a = `${n.name}, ${n.description}`
} else if (o && !s) return [a, [n.exchange]]
} else a = A ? "" : r;
return [a]
}
_setSymbolCurrencyUnitInternal(e, t, i, s) {
const r = this.properties().childs(),
o = r.inputs.childs().symbol.value(),
a = r.currencyId.value(),
l = r.unitId.value();
if (void 0 !== e && e !== o && r.inputs.childs().symbol.setValueSilently(e),
void 0 !== t && t !== a && r.currencyId.setValueSilently(t), void 0 !== i &&
i !== l && r.unitId.setValueSilently(i), s) this._resolvedSymbolsByInput[
this.symbol()] = s, this._resolvedSymbols[this._getSymbolForResolve(this
.symbol())] = s;
else {
const e = this.symbolInfo();
null !== e && (r.currencyId.setValueSilently(Object(n.symbolCurrency)(e)), r
.unitId.setValueSilently(Object(n.symbolUnit)(e)))
}
r.inputs.childs().symbol.value() !== o && r.inputs.childs().symbol.listeners()
.fire(r.inputs.childs().symbol), r.currencyId.value() !== a && r.currencyId
.listeners().fire(r.currencyId), r.unitId.value() !== l && r.unitId
.listeners().fire(r.unitId)
}
}
},
Z0Sh: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX").LineToolColorsProperty,
o = [4.5, 9, 11.25, 18, 22.5, 36, 45],
a = function() {
for (var e = [], t = o.length - 1, i = 1, s = 0, r = 0; r < 1e10;) r = o[s] * i, e.push(
Math.round(r)), e.push(Math.ceil(-r)), s === t - 1 && (i *= 10), s = (s + 1) % t;
return e.sort((function(e, t) {
return e < t ? -1 : e > t ? 1 : 0
})), e
}();
class l extends s {
constructor(e, t) {
super(e, t || l.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"eg8N", 7)).then(({
GannSquarePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
hLevelsCount() {
return l.HLevelsCount
}
vLevelsCount() {
return l.VLevelsCount
}
pointsCount() {
return 2
}
name() {
return "Gann Box"
}
_alignPriceOnPattern(e, t) {
var i = Math.round(1e6 * (e.price - t.price)) / 1e6;
if (0 === i) return t.price;
for (var s = o[0], r = o[o.length - 1], n = 1, a = Math.abs(i); a < s * n || r * n <
a;) a < s * n ? n *= .1 : r * n < a && (n *= 10);
for (var l = r * n, c = o.length - 2; c >= 0 && !(o[c] * n < a); --c) l = o[c] * n;
return e.price = t.price + (i >= 0 ? l : -l), e
}
_alignTimeOnPattern(e, t) {
var i = e.index - t.index;
if (0 === i) return 0;
for (var s = a.length - 2; s >= 0 && !(a[s] < i); --s);
return s += i > 0 ? 1 : 0, e.index = t.index + a[s], e
}
_alignPointsFixedIncrement(e, t) {
return this._alignTimeOnPattern(e, t), this._alignPriceOnPattern(e, t), e
}
_preparePoint(e, t) {
return t && t.shift() && 0 !== this._points.length && this
._alignPointsFixedIncrement(e, this._points[0]), s.prototype._preparePoint.call(
this, e, t)
}
setPoint(e, t, i) {
if (i && i.shift()) {
var s = 0 === e ? this._points[1] : this._points[0];
this._alignPointsFixedIncrement(t, s)
}
super.setPoint(e, t, i)
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "2liL")))
.GannSquareDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetoolgannsquare", e, !1, {
range: [1, 7],
prefixes: ["h", "v"],
names: ["coeff", "color", "visible"]
});
return l._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [e.child("color"), e.child("fans").child("color")], i = 1; i <= l
.HLevelsCount; i++) t.push(e.child("hlevel" + i).child("color"));
for (i = 1; i <= l.VLevelsCount; i++) t.push(e.child("vlevel" + i).child("color"));
e.addChild("linesColors", new n(t)), e.addExclusion("linesColors")
}
}
l.HLevelsCount = 7, l.VLevelsCount = 7, t.LineToolGannSquare = l
},
Z8aO: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SeriesPriceLinePaneView", (function() {
return n
}));
var s = i("k4w6"),
r = i("8Uy/");
class n extends s.a {
constructor(e) {
super(e), this._lineRendererData.linestyle = r.LINESTYLE_DOTTED
}
_updateImpl() {
if (this._lineRendererData.visible = !1, !this._series.properties()
.showPriceLine.value()) return;
if (12 === this._series.properties().style.value()) return;
const e = this._series.lastValueData(void 0, !0);
e.noData || (this._lineRendererData.visible = !0, this._lineRendererData.y = e
.coordinate, this._lineRendererData.color = this._series.priceLineColor(
e.color), this._lineRendererData.linewidth = this._series
.properties().priceLineWidth.value())
}
}
},
ZAxB: function(e, t, i) {
"use strict";
function s(e) {
return ["text", "integer", "float", "price", "session", "resolution"].includes(e.type) && e
.hasOwnProperty("options")
}
function r(e, t, i) {
for (const s of e)
if (t[s.id] !== i[s.id]) return !1;
return !0
}
i.d(t, "b", (function() {
return s
})), i.d(t, "a", (function() {
return r
}))
},
ZBiT: function(e, t, i) {
e.exports = {
"css-value-pane-controls-padding-left": "1px",
"css-value-pane-controls-padding-right": "5px"
}
},
ZJKN: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "BarsRange", (function() {
return r
}));
var s = i("Eyy1");
class r {
constructor(e, t) {
Object(s.assert)(e <= t,
"The last bar in the bars range should be greater than or equal to the first bar"
), this._firstBar = e, this._lastBar = t
}
firstBar() {
return this._firstBar
}
lastBar() {
return this._lastBar
}
count() {
return this._lastBar - this._firstBar + 1
}
contains(e) {
return this._firstBar <= e && e <= this._lastBar
}
equals(e) {
return this._firstBar === e.firstBar() && this._lastBar === e.lastBar()
}
static compare(e, t) {
return null === e || null === t ? e === t : e.equals(t)
}
}
},
ZjKI: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "CLOSE_POPUPS_AND_DIALOGS_COMMAND", (function() {
return s
}));
const s = "CLOSE_POPUPS_AND_DIALOGS_COMMAND"
},
Zl0W: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolPriceNote", (function() {
return l
}));
var s = i("Eyy1"),
r = i("Ocx9"),
n = i("tc+8"),
o = i.n(n),
a = i("Ss5c");
class l extends a.LineDataSource {
constructor(e, t) {
super(e, t || l.createProperties()), this._labelMovingDelta = null, i.e(
"lt-pane-views").then(i.bind(null, "0s1X")).then(t => {
this._setPaneViews([new t.PriceNotePaneView(this, e)])
})
}
pointsCount() {
return 2
}
properties() {
return super.properties()
}
name() {
return "Price Note"
}
template() {
const e = super.template();
return e.text = this.properties().childs().text.value(), e
}
startMoving(e, t, i) {
if (1 === t) {
if (this.isSourceHidden()) return;
const i = Object(s.ensureDefined)(e.logical),
r = this.points()[1];
this._labelMovingDelta = {
index: r.index - i.index,
price: r.price - i.price
}, this.startChanging(t, i)
} else this._labelMovingDelta = null, super.startMoving(e, t, i)
}
move(e, t, i) {
if (null !== this._labelMovingDelta) {
const t = Object(s.ensureDefined)(e.logical),
r = {
index: t.index + this._labelMovingDelta.index,
price: t.price + this._labelMovingDelta.price
};
this.setPoint(1, r, i), this.updateAllViews()
} else super.move(e, t, i)
}
endMoving(e, t) {
return null !== this._labelMovingDelta ? (this._labelMovingDelta = null, this
.endChanging(!1, e)) : super.endMoving(e)
}
static createProperties(e) {
const t = new r.DefaultProperty("linetoolpricenote", e);
return l._configureProperties(t), t
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "ernH")).then(
e => e.PriceNoteDefinitionsViewModel)
}
_snapTo45DegreesAvailable() {
return !0
}
static _configureProperties(e) {
a.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
"text", new o.a("")), e.addExclusion("text"), e.hasChild(
"backgroundsColors") && e.removeProperty("backgroundsColors"), e
.hasChild("textsColors") && e.removeProperty("textsColors")
}
}
},
ZmuQ: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return o
})), i.d(t, "a", (function() {
return a
}));
var s = i("jCNj"),
r = i("E6p6"),
n = i("5mo2");
class o {
constructor(e, t, i, s) {
this.init(e, t, i, s)
}
init(e, t, i, r) {
this.timezone = s.get_timezone(e), this.spec = new n.SessionSpec(e, t, i, r)
}
}
class a {
alignTime(e) {
if (isNaN(e)) return NaN;
let t = this.indexOfBar(e);
return t === r.SessionStage.POST_SESSION && (this.moveTo(e), t = this.indexOfBar(
e)), t < 0 ? NaN : this.startOfBar(t)
}
}
},
"Zo2/": function(e, t, i) {
"use strict";
(function(t) {
i("YCFM");
var s = i("YFKU").t,
r = i("Eyy1"),
n = r.assert,
o = r.ensureDefined,
a = i("Y7w9").moveToHead,
l = i("iPBr").TimeAxisWidget,
c = i("qJq3").Series,
h = i("Kxc7"),
u = i("YmeR").ActionBinder,
d = i("mKT+").resolveAndShowEditObjectDialog,
p = i("Vdly"),
_ = p.getValue,
m = p.setValue,
f = i("QloM").TabNames,
g = i("cdbK").showGoToDateDialog,
b = i("/3z9"),
v = i("lxNp"),
S = i("7nsU").showConfirmInputsDialog,
y = i("ikwP").disableSelection,
w = i("GVHu").Study,
P = i("8sOK").StudyStub,
C = i("3ClC").isStudy,
x = i("Ss5c").LineDataSource,
T = i("CW80"),
I = T.isLineTool,
M = T.isStudyLineTool,
O = i("fTGZ").BarsMarksContainer,
L = i("7KDR"),
A = L.Action,
E = L.Separator,
k = (i("L/Ed").ToolboxType, i("mMWL")),
D = i("LxhU").Interval,
V = i("n5al"),
B = V.getDefaultStyle,
R = i("pvsv").showSymbolInfoDialog,
N = i("H0vP").InvalidationMask,
j = i("H0vP").InvalidationLevel,
F = i("PT1i").linking,
W = i("JpbW").showChangeIntervalDialogAsync,
H = i("wptU"),
U = H.activateKeyPressHandler,
z = H.showDialog,
G = i("Ocx9").DefaultProperty,
q = i("+6ja"),
Y = q.availableTimezones,
K = q.timezoneIsAvailable,
J = i("0F0w").ChartSession,
Z = i("0YCj"),
X = i("c2JX").Spinner,
$ = i("JWMC").trackEvent,
Q = i("VaSN").lastEventIsTouch,
ee = i("vaqD").LoadingScreen,
te = i("wZIs"),
ie = i("txPx").getLogger("ChartWidget", {
color: "#606"
}),
se = i("2uTr").appendEllipsis,
re = i("U0+/").StudyMetaInfoRepository,
ne = i("VNzU").isMultipleLayout,
oe = i("b1GK").addPerfMark,
ae = i("FQhm"),
le = i("wjVR").ChartWidgetBase,
ce = i("qFKp").CheckMobile.any(),
he = i("uDHo").TIMEFRAMETYPE,
ue = i("jofe").createDeferredPromise,
de = i("GDWD").addPlusButtonProperty,
pe = s("On The Left"),
_e = s("On The Right"),
me = s("Move Scale To Left"),
fe = s("Move Scale To Right");
class ge extends le {
constructor(e, i, s) {
super(e, i, s), this._options.timeScaleWidget && (this._options
.timeScaleWidget.pressedMouseMoveScale = this._options.handleScale
.axisPressedMouseMove.time);
var r = this;
this._startSpinner(this._options.container.value());
var n = this._options.content,
o = this._options.readOnly;
this._removeMaximizeHotkey = null, r._hotkeys = v.createGroup({
desc: "Chart actions",
isDisabled: function() {
return !r._isActive
}
});
var a = this._options.containsData,
l = this._options.onWidget,
c = this._options.onCmeWidget;
c && ie.logWarn("[ChartWidget] 'onCmeWidget' option is depricated");
var h = this._options.widgetCustomer,
u = this._options.timezone,
d = this._options.hideSymbolSearch,
p = this._options.defSymbol,
_ = D.isValid(this._options.defInterval) ? this._options.defInterval :
void 0,
m = parseInt(this._options.defStyle),
f = V.isValidStyle(m) ? m : void 0,
g = this._options.defSessionId,
b = void 0 !== this._options.defTimeframe ? {
value: this._options.defTimeframe.toUpperCase(),
type: he.PeriodBack
} : void 0;
this._chartWidgetCollection = this._options.chartWidgetCollection, this
._content = n, this._initialLoading = this._options.initialLoading, this
._readOnly = o, this._containsData = a, this._showChartEvents = !a &&
this._options.chartEventsEnabled, this._defSymbol = p, this
._defInterval = _, this._defTimeframe = b, this._defStyle = f, this
._onWidget = !!l, this._compareSymbols = this._options.compareSymbols,
this._onWidget && (c ? this._widgetCustomer = "cme" : h && (this
._widgetCustomer = h)), this._hideSymbolSearch = d, this
._frameTime = 30, this._model = null, this._metaInfo = {},
this._drawRafId = 0, this._compareDialog = this._chartWidgetCollection
.getCompareDialogRenderer();
var S = this._contentSeriesProperties();
S && (p = S.symbol, _ = S.interval), void 0 === this._options
.useUserChartPreferences && (this._options.useUserChartPreferences = !
0), this._properties = new G("chartproperties", void 0, void 0, this
._options.useUserChartPreferences);
var y = this._options.useUserChartPreferences ? te.defaults(
"chartproperties.mainSeriesProperties") : te.factoryDefaults(
"chartproperties.mainSeriesProperties");
this._properties.mainSeriesProperties.merge(y), this._properties
.mainSeriesProperties.hasChild("esdBreaksStyle") && this._properties
.mainSeriesProperties.removeProperty("esdBreaksStyle"), _ = _ || y
.interval || "D", V.isValidStyle(f) || (f = V.isValidStyle(y.style) ? y
.style : B(D.isRange(_))), this._properties.mainSeriesProperties
.merge({
visible: !0,
symbol: p || DEFAULT_SYMBOL,
shortName: "",
timeframe: "",
onWidget: this._onWidget,
interval: _,
currencyId: null,
unitId: null,
style: f,
sessionId: g,
lineStyle: {
styleType: te.factoryDefaults(
"chartproperties.mainSeriesProperties.lineStyle.styleType"
)
}
}), this._containsData && this._properties.mainSeriesProperties.merge({
showCountdown: !1
}), u && K(u) && this._properties.timezone.setValue(u), this
._tagsChanged = new t, this._disconnected = new t, this
._reconnectBailout = new t, this._connected = new t, this._onScroll =
new t, this.chartWidgetInitialized = new t, this._chartSession = new J(
ChartApiInstance), this._metaInfoRepository = new re(this
._chartSession), this._timingsMeter = null, this._isActive = this
._options.isActive, this._options.container.subscribe((function(e) {
r._setElement(e)
}), {
callWithLast: !0
});
var w = function() {
r.resize()
};
this._options.width.subscribe(w), this._options.height.subscribe(w), this
._options.visible.subscribe(this._updateTimingsMeterState.bind(this)),
this._aboutToBeDestroyed = new t, this._actions = null, this
._definitionsViewModel = null, this._backgroundTopColorSpawn = null,
this._backgroundBottomColorSpawn = null, this._hintDefferedPromise =
null, this._activeHint = null
}
isInitialized() {
return Boolean(this._inited)
}
compareSymbols() {
return this._compareSymbols
}
async _getChartPropertyDefinitionsViewModel() {
if (null === this._definitionsViewModel) {
const {
ChartPropertyDefinitionsViewModel: e
} = await Promise.all([i.e(27), i.e(61), i.e("general-property-page")])
.then(i.bind(null, "5lPo"));
if (this._isDestroyed) throw new Error(
"Chart widget already destroyed");
await new Promise(e => this.withModel(null, e)), null === this
._definitionsViewModel && (this._definitionsViewModel = new e(this
.model(), this.properties(), this._options))
}
return this._definitionsViewModel
}
_initMaximizeHotkey(e) {
var t = this;
function i(e) {
e.defaultPrevented || b.modifiersFromEvent(e) === b.Modifiers.Alt && e
.stopPropagation()
}
function s(e) {
e.defaultPrevented || b.modifiersFromEvent(e) === b.Modifiers.Alt && (e
.preventDefault(), e.stopPropagation(), t.toggleFullscreen())
}
return e.addEventListener("mousedown", i, !0), e.addEventListener("click",
s, !0),
function() {
e.removeEventListener("mousedown", i, !0), e.removeEventListener(
"click", s, !0)
}
}
toggleFullscreen() {
var e = this.getResizerDetacher();
e.fullscreenable.value() && (e.fullscreen.value() ? e.exitFullscreen() : e
.requestFullscreen())
}
_beginRequestActive() {
var e = this._chartWidgetCollection.activeChartWidget.value() !== this;
this._chartWidgetCollection.activeChartWidget.setValue(this), e && (Q() &&
this._isLineToolModeExceptBrush() && this
.updateCrossHairPositionIfNeeded(), this._justActivated = !0)
}
_endRequestActive() {
var e = this;
this._justActivated && setTimeout((function() {
e._justActivated = !1
}), 0)
}
_requestActive() {
this._beginRequestActive(), this._endRequestActive()
}
justActivated() {
return this._justActivated
}
setTimezone(e) {
e && K(e) ? this._properties.timezone.setValue(e) : console.warn(
"Incorrect timezone: " + JSON.stringify(e))
}
getTimezone() {
return this._properties.timezone.value()
}
refreshMarks() {
this.model().barsMarksSources().forEach((function(e) {
e.refreshData()
}))
}
clearMarks() {
this.model().barsMarksSources().forEach((function(e) {
e.clearMarks()
}))
}
metaInfoRepository() {
return this._metaInfoRepository
}
_init() {
var e = this;
this.hasModel() && this.model().mainSeries().clearData(), this.initColors(),
this._makeDefaultGui();
var t = function() {
e._checkObsoleteTimezone(), e._chartSession && e._chartSession
.connected() && this._model.restart(), this._content && (this
.initColors(), this._updateGui(), this.update()), this
._resizeHandler = function() {
this.adjustSize(), this.paint()
}.bind(this), this._resizeHandler(), this._parent.appendChild(
this._mainDiv), this._spinner && (this._spinner.stop(),
delete this._spinner), this._keydownEventListener =
function(e) {
27 === e.which && e.preventDefault()
}, window.addEventListener("keydown:chart_" + this._id, this
._keydownEventListener), this._initBarsMarksSources(), this
._activateSymbolSearchHotkeys(), this.model().timeScale()
.onScroll().subscribe(this, (function() {
this._onScroll.fire()
})), this._inited = !0
}.bind(this),
i = this._makeDefaultModel();
void 0 === i ? t() : i.then(t)
}
_activateSymbolSearchHotkeys() {
this.readOnly() || this._hideSymbolSearch || U()
}
_checkObsoleteTimezone() {
var e = this._properties.timezone.value();
K(e) || this._properties.timezone.setValue({
UTC: "Etc/UTC",
EST: "America/New_York",
CST: "America/Chicago",
PST: "America/Los_Angeles"
} [e] || "exchange")
}
_initBarsMarksSources() {
var e = this;
this.withModel(this, (function() {
this.model().barsMarksSources().forEach((function(t) {
t.onNeedRepaint.subscribe(e, (function() {
e.model().model()
.lightUpdate()
}))
}))
}))
}
initColors() {
this._properties.scalesProperties.lineColor.listeners().subscribe(this, ge
.prototype.setScaleLineColor), this._properties.scalesProperties
.textColor.listeners().subscribe(this, ge.prototype.setScaleTextColor)
}
_initBackgroundColor() {
null === this._backgroundTopColorSpawn && (this._backgroundTopColorSpawn =
this._model.model().backgroundTopColor().spawn(), this
._backgroundTopColorSpawn.subscribe(this._onBackgroundColorChanged
.bind(this))), null === this._backgroundBottomColorSpawn && (
this._backgroundBottomColorSpawn = this._model.model()
.backgroundColor().spawn(), this._backgroundBottomColorSpawn
.subscribe(this._onBackgroundColorChanged.bind(this)))
}
paneWidgets() {
return this._paneWidgets
}
paneByCanvas(e) {
for (var t = 0; t < this._paneWidgets.length; t++)
if (this._paneWidgets[t].hasCanvas(e)) return this._paneWidgets[t];
return null
}
paneByState(e) {
for (var t = 0; t < this._paneWidgets.length; t++)
if (this._paneWidgets[t].state() === e) return this._paneWidgets[t];
return null
}
timeAxisByCanvas(e) {
return this._timeAxisWidget.hasCanvas(e) ? this._timeAxisWidget : null
}
properties() {
return this._properties
}
emulateCriticalError() {
this._chartSession.removeSeries("-1")
}
readOnly() {
return this._readOnly
}
onDisconnected() {
return this._disconnected
}
onReconnectBailout() {
return this._reconnectBailout
}
onConnected() {
return this._connected
}
onRedraw() {
return this._redraw
}
onScroll() {
return this._onScroll
}
modelCreated() {
return this._modelCreated
}
setResolution(e) {
if (this._model) {
var t = this._model.mainSeries().properties(),
i = s("Change Resolution");
this._model.setResolutionProperty(t.interval, e, this, i)
} else this._properties.mainSeriesProperties.merge({
interval: e
})
}
getResolution() {
return this._model ? this._model.mainSeries().properties().interval
.value() : this._properties.mainSeriesProperties.interval.value()
}
addOverlayStudy(e, t, i) {
var s = this.model();
return this._options.isSymbolAvailable(e).then((function(r) {
if (!r) return null;
var n = s.createStudyInserter({
type: "java",
studyId: "Overlay@tv-basicstudies"
}),
o = {
allowExtendTimeScale: i
};
if (h.enabled("use_overrides_for_overlay")) {
var a = te.factoryDefaults(
"study_Overlay@tv-basicstudies.style");
o.style = a
}
return n.setPropertiesState(o), n.setForceOverlay(t), n
.insert((function() {
return Promise.resolve({
symbol: e
})
}))
}))
}
addCompareStudy(e) {
var t = this.model();
return this._options.isSymbolAvailable(e).then((function(i) {
return i ? t.createStudyInserter({
type: "java",
studyId: "Compare@tv-basicstudies"
}).insert((function() {
return Promise.resolve({
symbol: e
})
})) : null
}))
}
updateActions() {
for (var e = this.actions(), t = this._model.dataSources(), i = !1, r = !1,
n = 0, o = t.length; n < o; n++) {
var a = t[n];
TradingView.isInherited(a.constructor, x) && a.isUserDeletable() && (
i = !0), TradingView.isInherited(a.constructor, w) && a
.removeByRemoveAllStudies() && (r = !0), TradingView.isInherited(a
.constructor, P) && (r = !0)
}
this._readOnly || (e.paneRemoveAllStudies && e.paneRemoveAllStudies.update({
disabled: !r
}), e.paneRemoveAllDrawingTools && e.paneRemoveAllDrawingTools
.update({
disabled: !i
}), e.paneRemoveAllStudiesDrawingTools && e
.paneRemoveAllStudiesDrawingTools.update({
disabled: !r && !i
}));
var l = this,
c = [],
h = function(e) {
return e.id === l.model().model().properties().timezone.value()
};
Y.forEach((function(e) {
if (!e.separator) {
var t = new A({
label: e.title,
checkable: !0,
checked: h(e),
statName: "SetTimeZone",
onExecute: function() {
l.model().setProperty(l.model()
.model().properties()
.timezone, e.id,
"Changed Time Zone")
}
});
c.push(t)
}
}), this), e.applyTimeZone.update({
subItems: c
}), e.addToWatchlist && (e.addToWatchlist.request(), e.addToWatchlist
.updateLabel(this.getSymbol(!0))), e.addToTextNotes && e
.addToTextNotes.update({
label: s("Add Text Note for {symbol}").format({
symbol: this.getSymbol(!0)
})
})
}
applyTheme(e) {
var t = this;
Promise.resolve().then(i.bind(null, "EsvI")).then(i => {
e = e || i.getCurrentTheme().name,
i.loadTheme(e, !0, !0, t._chartWidgetCollection)
})
}
actions() {
return null === this._actions && this._setActions(), this._actions
}
_setActions() {
this._actions && this._actions.addToWatchlist && (this._actions
.addToWatchlist.destroy(), delete this._actions.addToWatchlist);
var e, t = this,
r = [];
if (!this._readOnly) {
r = [new A({
label: s("Eraser"),
payload: "eraser",
statName: "Eraser"
}), new E, new A({
label: s("Trend Line"),
payload: "LineToolTrendLine",
statName: "LineToolTrendLine"
}), new A({
label: s("Horizontal Line"),
payload: "LineToolHorzLine",
statName: "LineToolHorzLine"
}), new A({
label: s("Vertical Line"),
payload: "LineToolVertLine",
statName: "LineToolVertLine"
}), new A({
label: s("Arrow"),
payload: "LineToolArrow",
statName: "LineToolArrow"
}), new A({
label: s("Ray"),
payload: "LineToolRay",
statName: "LineToolRay"
}), new A({
label: s("Extended"),
payload: "LineToolExtended",
statName: "LineToolExtended"
}), new A({
label: s("Parallel Channel"),
payload: "LineToolParallelChannel",
statName: "LineToolParallelChannel"
}), new E, new A({
label: s("Pitchfork"),
payload: "LineToolPitchfork",
statName: "LineToolPitchfork"
}), new A({
label: s("Schiff Pitchfork"),
payload: "LineToolSchiffPitchfork",
statName: "LineToolSchiffPitchfork"
}), new A({
label: s("Pitchfan"),
payload: "LineToolPitchfan",
statName: "LineToolPitchfan"
}), new A({
label: s("Gann Square"),
payload: "LineToolGannSquare",
statName: "LineToolGannSquare"
}), new A({
label: s("Gann Fan"),
payload: "LineToolGannFan",
statName: "LineToolGannFan"
}), new A({
label: s("Fib Retracement"),
payload: "LineToolFibRetracement",
statName: "LineToolFibRetracement"
}), new A({
label: s("Trend-Based Fib Extension"),
payload: "LineToolTrendBasedFibExtension",
statName: "LineToolTrendBasedFibExtension"
}), new A({
label: s("Fib Speed Resistance Fan"),
payload: "LineToolFibSpeedResistanceFan",
statName: "LineToolFibSpeedResistanceFan"
}), new A({
label: s("Fib Time Zone"),
payload: "LineToolFibTimeZone",
statName: "LineToolFibTimeZone"
}), new A({
label: s("Circle Lines"),
payload: "LineToolCircleLines",
statName: "LineToolCircleLines"
}), new A({
label: s("Fib Circles"),
payload: "LineToolFibCircles",
statName: "LineToolFibCircles"
}), new A({
label: s("Fib Speed Resistance Arcs"),
payload: "LineToolFibSpeedResistanceArcs",
statName: "LineToolFibSpeedResistanceArcs"
}), new E, new A({
label: s("Rectangle"),
payload: "LineToolRectangle",
statName: "LineToolRectangle"
}), new A({
label: s("Ellipse"),
payload: "LineToolEllipse",
statName: "LineToolEllipse"
}), new A({
label: s("Triangle"),
payload: "LineToolTriangle",
statName: "LineToolTriangle"
}), new A({
label: s("Polyline"),
payload: "LineToolPolyline",
statName: "LineToolPolyline"
}), new A({
label: s("Path"),
payload: "LineToolPath",
statName: "LineToolPath"
}), new A({
label: s("Arc"),
payload: "LineToolArc",
statName: "LineToolArc"
}), new E, new A({
label: s("Text", {
context: "tool"
}),
payload: "LineToolText",
statName: "LineToolText"
}), new A({
label: s("Anchored Text"),
payload: "LineToolTextAbsolute",
statName: "LineToolTextAbsolute"
}), new A({
label: s("Balloon"),
payload: "LineToolBalloon",
statName: "LineToolBalloon"
}), new A({
label: s("Price Label"),
payload: "LineToolPriceLabel",
statName: "LineToolPriceLabel"
}), new E, new A({
label: s("Elliott Wave Subminuette"),
payload: "LineToolElliottSubminuette",
statName: "LineToolElliottSubminuette"
}), new A({
label: s("Elliott Wave Minor"),
payload: "LineToolElliottMinor",
statName: "LineToolElliottMinor"
}), new A({
label: s("Elliott Wave Circle"),
payload: "LineToolElliottCircle",
statName: "LineToolElliottCircle"
}), new A({
label: s("Elliott Minor Retracement"),
payload: "LineToolElliottMinorRetr",
statName: "LineToolElliottMinorRetr"
}), new A({
label: s("Elliott Major Retracement"),
payload: "LineToolElliottMajorRetr",
statName: "LineToolElliottMajorRetr"
}), new E, new A({
label: s("Brush"),
payload: "LineToolBrush",
statName: "LineToolBrush"
}), new E, new A({
label: s("Forecast"),
payload: "LineToolPrediction",
statName: "LineToolPrediction"
})];
for (var n = function(e) {
k.tool.setValue(e.getPayload())
}, o = 0; o < r.length; o++) r[o] instanceof A && r[o].update({
onExecute: n
});
e = new A({
label: se(s("Settings")),
icon: i("MXV9"),
statName: "ScalesProperties",
onExecute: function() {
t.showGeneralChartProperties(f.scales)
}
})
}
this._hotkeys.add({
desc: "Maximize",
hotkey: v.Modifiers.Alt + 13,
handler: function() {
t.toggleFullscreen()
},
isDisabled: function() {
return !t._options.fullscreenable.value()
}
}), this._hotkeys.add({
desc: "Cancel selection",
hotkey: 27,
handler: function() {
t.selectPointMode().value() ? t
.cancelRequestSelectPoint() : t._model
.selectionMacro((function(e) {
t._cancelCreatingLine(), e
.clearSelection()
}))
},
isDisabled: function() {
var e = 0 === t._model.selection().allSources().length,
i = null === t._model.crossHairSource()
.measurePane(),
s = !t.selectPointMode().value(),
r = e && i && s;
return !t._model || r
}
}), t.withModel(null, (function() {
var e = function() {
t._hotkeys.promote()
};
t._model.onSelectedSourceChanged().subscribe(null, e), t
._model.crossHairSource().measuringEnabled().subscribe(
null, t => {
t && e()
})
}));
var a = new A({
label: s("Reset Chart"),
icon: i("LdoW"),
statName: "ResetChart",
onExecute: this.GUIResetScales.bind(this),
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 82
}),
l = new A({
label: s("Invert Scale"),
statName: "Invert Scale",
checkable: !0,
onExecute: function() {
t._model.invertPriceScale(t._model.mainSeries()
.priceScale())
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 73
}),
c = new A({
label: s("Auto (Fits Data To Screen)"),
checkable: !0,
onExecute: function() {
var e = t._model.mainSeries().priceScale();
t._model.togglePriceScaleAutoScaleMode(e), c.update({
checked: e.isAutoScale()
})
}
}),
d = new A({
label: s("Lock Price To Bar Ratio"),
checkable: !0,
statName: "ToggleLockScale",
onExecute: function() {
t._model.togglePriceScaleLockScaleMode(t._model
.mainSeries().priceScale())
}
}),
p = new A({
label: s("Regular"),
checkable: !0,
statName: "ToggleRegularScale",
onExecute: function() {
var e = t._model.mainSeries().priceScale();
t._model.setPriceScaleRegularScaleMode(e), p.update({
checked: e.isRegular()
})
}
}),
S = new A({
label: s("Percent"),
checkable: !0,
statName: "TogglePercantage",
onExecute: function() {
t._model.togglePriceScalePercentageScaleMode(t._model
.mainSeries().priceScale())
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 80
}),
y = new A({
label: s("Indexed to 100"),
checkable: !0,
statName: "ToggleIndexedTo100",
onExecute: function() {
t._model.togglePriceScaleIndexedTo100ScaleMode(t._model
.mainSeries().priceScale())
}
}),
w = new A({
label: s("Logarithmic"),
statName: "ToggleLogScale",
checkable: !0,
onExecute: function() {
t._model.togglePriceScaleLogScaleMode(t._model
.mainSeries().priceScale())
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 76
}),
P = new A({
label: s("Undo"),
onExecute: function() {
$("GUI", "Undo"), t._model.undoHistory().undo()
},
disabled: !0,
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Mod + 90
}),
C = new A({
label: s("Redo"),
onExecute: function() {
$("GUI", "Redo"), t._model.undoHistory().redo()
},
disabled: !0,
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Mod + 89
});
t.withModel(null, (function() {
t._model.undoHistory().undoStack().onChange().subscribe(t, t
.updateUndoRedo), t._model.undoHistory().redoStack()
.onChange().subscribe(t, t.updateUndoRedo)
}));
var x = [new A({
label: s("Loading")
})],
T = new A({
name: "apply-color-theme",
label: s("Color Theme"),
icon: i("opke"),
subItems: x,
statName: "ColorTheme"
}),
I = new A({
label: s("Time Zone"),
statName: "TimeZone"
}),
M = new A({
label: se(s("Change Symbol")),
statName: "ChangeSymbol",
onExecute: function() {
z({
defaultValue: ""
})
}
});
m("symboledit.dialog_last_entry", "");
var O = {
label: se(s("Change Interval")),
statName: "ChangeInterval",
onExecute: function() {
W({
initVal: F.interval.value(),
selectOnInit: !0
})
}
};
!h.enabled("show_interval_dialog_on_key_press") || this.readOnly() || this
._hideSymbolSearch || (O.shortcutHint = ",", O.hotkeyGroup = this
._hotkeys, O.hotkeyHash = 188);
var L, D, V = new A(O);
if (!TradingView.onWidget()) {
if (this._options.addToWatchlistEnabled) {
const e = {
hotkeyGroup: this._hotkeys
};
L = new WatchListAction(this, e)
}
D = new A({
label: s("Add To Text Notes"),
statName: "AddToTextNotes",
onExecute: function() {
window.runOrSignIn((function() {
TradingView.bottomWidgetBar && (
TradingView.bottomWidgetBar
.toggleWidget("text_notes",
!0), TradingView
.bottomWidgetBar._widgets
.text_notes.addNote(null, t
.getSymbol(!0), t
.getSymbol()))
}), {
source: "Add text note in chart context menu"
})
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 78
})
}
var B = new A({
label: s("Reset Time Scale"),
icon: i("LdoW"),
statName: "ResetScale",
onExecute: function() {
t.model().resetTimeScale()
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Mod + v.Modifiers.Alt + 81
}),
j = new A({
label: s("Insert Drawing Tool"),
subItems: r,
statName: "InsertDravingTool"
}),
H = new A({
label: s("Remove Indicators"),
statName: "RemoveAllIndicators",
onExecute: this.removeAllStudies.bind(this)
}),
U = new A({
label: s("Remove Drawings"),
statName: "RemoveAllDrawingTools",
onExecute: this.removeAllDrawingTools.bind(this)
}),
G = new A({
label: s("All Indicators And Drawing Tools"),
statName: "RemoveAllIndicatorsAndDrawingTools",
onExecute: this.removeAllStudiesDrawingTools.bind(this)
}),
q = this.chartWidgetCollection(),
Y = new A({
label: s("Apply these Indicators to Entire Layout"),
statName: "ApplyIndicatorsToAllCharts",
onExecute: function() {
q.applyIndicatorsToAllCharts(t)
}
}),
K = {
label: se(s("Insert Indicator")),
statName: "InsertIndicator",
onExecute: function() {
t.showIndicators()
}
};
this._options.indicatorsDialogShortcutEnabled && (K.hotkeyGroup = this
._hotkeys, K.hotkeyHash = 191, new A({
label: se(s("Insert Indicator")),
statName: "InsertIndicator",
onExecute: function() {
t.showIndicators()
},
hotkeyGroup: this._hotkeys,
hotkeyHash: 111
}));
var J, Z = new A(K),
X = new A({
label: se(s("Compare or Add Symbol")),
statName: "CompareOrAddSymbol",
onExecute: this.toggleCompareOrAdd.bind(this)
}),
Q = new A({
label: se(s("Compare")),
statName: "Compare",
onExecute: this.toggleCompareOrAdd.bind(this)
}),
ee = new A({
label: se(s("Object Tree")),
statName: "ObjectsTree",
onExecute: this.showObjectsTreePanelOrDialog.bind(this)
}),
te = new A({
label: se(s("Settings")),
icon: i("MXV9"),
statName: "ChartProperties",
onExecute: function() {
t.showGeneralChartProperties()
}
}),
ie = new A({
label: se(s("Settings")),
icon: i("MXV9"),
statName: "MainSeriesProperties",
onExecute: function() {
t.showGeneralChartProperties(f.symbol)
}
}),
re = new A({
label: s("Lock/Unlock"),
statName: "ToggleLockSelectedObject",
onExecute: this.toggleLockSelectedObject.bind(this)
}),
ne = new A({
label: s("Hide"),
icon: i("dmHa"),
statName: "HideSelectedObject",
onExecute: this.hideSelectedObject.bind(this)
});
h.enabled("property_pages") && (J = new A({
label: se(s("Settings")),
icon: i("MXV9"),
statName: "EditSelectedObject",
onExecute: function() {
t.showSelectedSourceProperties()
}
})), this.withModel(null, (function() {
var e = t.model().mainSeries(),
i = e.properties();
i.priceAxisProperties.subscribe(t, t._updateScalesActions),
e.priceScaleAboutToBeChanged().subscribe(t, (
function() {
i.priceAxisProperties.unsubscribeAll(t)
})), e.priceScaleChanged().subscribe(t, (
function() {
i.priceAxisProperties.subscribe(t, t
._updateScalesActions), t
._updateScalesActions()
}))
}));
var oe = new A({
label: s("Scale Price Chart Only"),
checkable: !0,
statName: "ScalePriceChartOnly"
});
oe.binder = new u(oe, this._properties.scalesProperties.scaleSeriesOnly,
this.model(), s("Scale Price Chart Only"));
var ae = this.model().model();
this._properties.scalesProperties.scaleSeriesOnly.listeners().subscribe(
null, (function() {
ae.recalculateAllPanes(), ae.invalidate(N.full())
}));
var le = new A({
label: s("Drawings Toolbar"),
checkable: !0,
statName: "ToggleDrawingToolbar"
}),
ce = this._options.isDrawingToolbarVisible;
ce && (ce.subscribe((function(e) {
le.update({
checked: e
})
}), {
callWithLast: !0
}), le.update({
onExecute: function() {
ce.setValue(!ce.value())
}
}));
var he = new A({
label: s("Stay in Drawing Mode"),
checkable: !0,
statName: "ToggleStayInDrawingMode"
});
he.binder = new u(he, k.properties().stayInDrawingMode, this.model(), s(
"Stay In Drawing Mode"));
var ue = new A({
label: s("Sync drawings to all charts"),
checkable: !0,
statName: "ToggleSyncDrawings"
});
ue.binder = new u(ue, k.properties().drawOnAllCharts, this.model(),
"SyncDrawings");
var ge = new A({
label: s("Lock All Drawing Tools"),
checkable: !0,
statName: "ToggleLockDrawings"
});
ge.binder = new u(ge, k.lockDrawings(), this.model(), s("Lock drawings"), (
function() {
k.lockDrawings().setValue(this.value())
}));
var be = new A({
label: s("Hide All Drawing Tools"),
checkable: !0,
statName: "ToggleHideAllDrawingTools",
hotkeyHash: v.Modifiers.Mod + v.Modifiers.Alt + 72,
hotkeyGroup: this._hotkeys
});
be.binder = new u(be, k.hideAllDrawings(), this.model(), s(
"Hide All Drawing Tools"), (function() {
var e = _("ChartToolsHideMode", "drawings"),
t = k.hideAllDrawings(),
i = k.hideAllIndicators();
switch (e) {
case "drawings":
t.setValue(!t.value());
break;
case "indicators":
i.setValue(!i.value());
break;
default:
t.setValue(!t.value()), i.setValue(!i.value())
}
}));
var ve = new A({
label: s("Hide Marks On Bars"),
checkable: !0,
statName: "ToggleHideMarksOnBars"
});
ve.binder = new u(ve, k.hideMarksOnBars(), this.model(), s(
"Hide Marks On Bars"), (function() {
k.hideMarksOnBars().setValue(this.value())
}));
var Se = new A({
label: s("Symbol Last Price Label"),
checkable: !0,
checked: !1,
statName: "ToggleSymbolLastValue"
});
Se.binder = new u(Se, this.properties().scalesProperties
.showSeriesLastValue, this.model(), s("Show Symbol Last Value"));
var ye = new A({
label: s("Symbol Name Label"),
checkable: !0,
checked: !1,
statName: "ToggleSymbolLabels"
});
ye.binding = new u(ye, this.properties().scalesProperties.showSymbolLabels,
this.model(), "Undo Show Symbol Labels");
var we = new A({
label: s("Indicator Last Value Label"),
checkable: !0,
checked: !1,
statName: "ToggleStudyLastValue"
});
we.binder = new u(we, this.properties().scalesProperties.showStudyLastValue,
this.model(), s("Show Indicator Last Value"));
var Pe = new A({
label: s("Indicator Name Label"),
checkable: !0,
checked: !1,
statName: "ToggleIndicatorsLabels"
});
Pe.binding = new u(Pe, this.properties().scalesProperties
.showStudyPlotLabels, this.model(), "Undo Show Indicator Labels");
var Ce = this.model().mainSeries().properties().highLowAvgPrice,
xe = new A({
label: s("High and low price labels"),
checkable: !0,
checked: !1,
statName: "ToggleHighLowPriceLabels"
});
xe.binding = new u(xe, Ce.highLowPriceLabelsVisible, this.model(), s(
"Show high and low price labels"));
var Te = new A({
label: s("High and low price lines"),
checkable: !0,
checked: !1,
statName: "ToggleHighLowPriceLine"
});
Te.binding = new u(Te, Ce.highLowPriceLinesVisible, this.model(), s(
"Show high and low price lines"));
var Ie = new A({
label: s("Average close price label"),
checkable: !0,
checked: !1,
statName: "ToggleAverageClosePriceLabel"
});
Ie.binding = new u(Ie, Ce.averageClosePriceLabelVisible, this.model(), s(
"Show average close price label"));
var Me = new A({
label: s("Average close price line"),
checkable: !0,
checked: !1,
statName: "ToggleAverageClosePriceLine"
});
Me.binding = new u(Me, Ce.averageClosePriceLineVisible, this.model(), s(
"Show average close price line"));
var Oe = new A({
label: s("Financials Last Value Label"),
checkable: !0,
checked: !1,
statName: "ToggleFundamentalsLastValue"
});
Oe.binder = new u(Oe, this.properties().scalesProperties
.showFundamentalLastValue, this.model(),
"Show Financials Last Value");
var Le = new A({
label: s("Financials Name Label"),
checkable: !0,
checked: !1,
statName: "ToggleFundamentalsLabels"
});
Le.binding = new u(Le, this.properties().scalesProperties
.showFundamentalNameLabel, this.model(),
"Show Financials Name Label");
var Ae = new A({
label: s("Countdown To Bar Close"),
checkable: !0,
checked: !1,
statName: "ToggleCountdown"
});
Ae.binder = new u(Ae, this.model().mainSeries().properties().showCountdown,
this.model(), Ae.getLabel());
var Ee = new A({
label: s("Currency"),
checkable: !0,
checked: !0,
statName: "ToggleScalesCurrency"
});
Ee.binder = new u(Ee, this.properties().scalesProperties.showCurrency, this
.model(), "Change Currency Label Visibility");
var ke = new A({
label: s("Unit"),
checkable: !0,
checked: !0,
statName: "ToggleScalesUnit"
});
ke.binder = new u(ke, this.properties().scalesProperties.showUnit, this
.model(), "Change Unit Label Visibility");
var De = new A({
label: s("Plus Button"),
checkable: !0,
checked: de.value(),
statName: "ToggleAddOrderPlusButton"
});
De.binder = new u(De, de, this.model(), De.getLabel());
var Ve = null;
this._options.goToDateEnabled && (Ve = new A({
label: se(s("Go to Date")),
statName: "GoToDate",
onExecute: function() {
var e = t._chartWidgetCollection.activeChartWidget
.value();
g(e)
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 71
}));
var Be = new A({
label: se(s("Symbol Info")),
icon: i("1pHB"),
checkable: !1,
statName: "SymbolInfo",
onExecute: function() {
var e = t.model().mainSeries().symbol(),
i = t.model().mainSeries().symbolInfo(),
s = t.model().model().availableUnits(),
r = t.model().model().unitConversionEnabled();
R(e, {
symbolInfo: i,
showUnit: r,
unitName: function(e) {
return s.name(e)
}
})
}
}),
Re = new A({
label: pe,
statName: "MergeAllScalesToLeft",
onExecute: function() {
t.model().mergeAllScales("left")
}
}),
Ne = new A({
label: _e,
statName: "MergeAllScalesToRight",
onExecute: function() {
t.model().mergeAllScales("right")
}
}),
je = new A({
label: me,
statName: "MoveScaleToLeft",
onExecute: function() {
t.model().mergeAllScales("left")
}
}),
Fe = new A({
label: fe,
statName: "MoveScaleToRight",
onExecute: function() {
t.model().mergeAllScales("right")
}
});
var We = h.enabled("show_object_tree");
if (this._actions = {
chartProperties: te,
mainSeriesPropertiesAction: ie,
timeScaleReset: B,
chartReset: a,
invertSeriesScale: l,
logSeriesScale: w,
autoSeriesScale: c,
lockSeriesScale: d,
regularSeriesScale: p,
percentSeriesScale: S,
indexedTo100SeriesScale: y,
compareOrAdd: X,
compare: Q,
paneObjectTree: We ? ee : void 0,
insertIndicator: Z,
insertDrawingTool: j,
applyColorTheme: T,
symbolSearch: M,
showSymbolInfoDialog: Be,
changeInterval: V,
seriesHide: ne,
studyHide: ne,
lineToggleLock: re,
lineHide: ne,
scaleSeriesOnly: oe,
drawingToolbarAction: le,
stayInDrawingModeAction: he,
syncModeAction: ue,
lockDrawingsAction: ge,
hideAllDrawingsAction: be,
hideAllMarks: ve,
applyTimeZone: I,
showCountdown: Ae,
showCurrency: Ee,
showUnit: ke,
addPlusButton: De,
showSeriesLastValue: Se,
showHighLowPriceLabels: xe,
showHighLowPriceLines: Te,
showAverageClosePriceLabel: Ie,
showAverageClosePriceLine: Me,
showSymbolLabelsAction: ye,
showStudyLastValue: we,
showStudyPlotNamesAction: Pe,
showFundamentalsLastValueAction: Oe,
showFundamentalNamesAction: Le,
undo: P,
redo: C,
mergeLeftScalesAction: Re,
mergeRightScalesAction: Ne,
moveScaleToLeft: je,
moveScaleToRight: Fe,
moveChartAction: void 0
}, e && (this._actions.scalesProperties = e), L && (this._actions
.addToWatchlist = L), h.enabled("show_source_code") && (this
._actions.viewSourceCode = new A({
label: se(s("Source Code")),
statName: "OpenSelectedObjectSource",
onExecute: this.openSelectedObjectSource.bind(this)
})), !TradingView.onWidget() && h.enabled("text_notes") && (this
._actions.addToTextNotes = D), null !== Ve && (this._actions
.gotoDate = Ve), this.createSessionBreaksActions(), !this
.readOnly()) {
var He = new A({
label: s("Remove"),
icon: i("aVjL"),
statName: "RemoveSelectedObject",
onExecute: function() {
var e = this._chartWidgetCollection
.activeChartWidget.value();
e || (e = this), e.removeSelectedSources()
}.bind(this),
hotkeyGroup: this._hotkeys,
hotkeyHash: b.isMacKeyboard ? 8 : 46
});
this._hotkeys.add({
handler: function() {
this.removeSelectedSources()
}.bind(this),
desc: "Remove selected source",
hotkey: b.isMacKeyboard ? 46 : 8
}), this._actions.insertDrawingTool = j, this._actions
.paneRemoveAllStudies = H, this._actions.paneRemoveAllDrawingTools =
U, this._actions.paneRemoveAllStudiesDrawingTools = G, this._actions
.applyStudiesToAllCharts = Y, this._actions.seriesRemove = He, this
._actions.studyRemove = He, this._actions.lineRemove = He, h
.enabled("property_pages") && (this._actions.format = J), this
._actions.lockDrawingsAction = ge, this._actions
.hideAllDrawingsAction = be, this._actions.hideAllMarks = ve
}
this._actions.showPriceLine = new A({
label: s("Price Line"),
checkable: !0,
statName: "TogglePriceLine"
}), this._actions.showPriceLine.binding = new u(this._actions
.showPriceLine, this.model().mainSeries().properties()
.showPriceLine, this.model(), "Undo Toggle Price Line"), this
.readOnly() || (this._actions.horzLineRightThere = new A({
label: s("Draw Horizontal Line Here"),
onExecute: function() {
t.activePaneWidget && t.activePaneWidget
.drawRightThere("LineToolHorzLine")
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 72
}), this._actions.vertLineRightThere = new A({
label: s("Draw Vertical Line Here"),
onExecute: function() {
t.activePaneWidget && t.activePaneWidget
.drawRightThere("LineToolVertLine")
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 86
}), this._actions.crossLineRightThere = new A({
label: s("Draw Cross Line Here"),
onExecute: function() {
t.activePaneWidget && t.activePaneWidget
.drawRightThere("LineToolCrossLine")
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 67
}), this._actions.trendLine = new A({
label: s("Draw Trend Line"),
onExecute: function() {
t.activePaneWidget && k.tool.setValue(
"LineToolTrendLine")
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 84
}), this._actions.FibRetracement = new A({
label: s("Draw Fib Retracement"),
onExecute: function() {
t.activePaneWidget && k.tool.setValue(
"LineToolFibRetracement")
},
hotkeyGroup: this._hotkeys,
hotkeyHash: v.Modifiers.Alt + 70
})), this._updateScalesActions()
}
options() {
return this._options
}
executeActionById(e) {
if ("takeScreenshot" === e) return console.warn(
'Action "takeScreenshot" is deprecated. Use method "takeScreenshot" instead'
), void this._chartWidgetCollection.takeScreenshot();
"lockDrawingsAction" === e && console.warn(
'Action "lockDrawingsAction" is deprecated. Use method "lockAllDrawingTools" instead'
), "hideAllDrawingsAction" === e && console.warn(
'Action "hideAllDrawingsAction" is deprecated. Use method "hideAllDrawingTools" instead'
), e in this._actions ? this._actions[e] instanceof A && this
._actions[e].execute() : console.warn("Unknown action id: " + e)
}
getCheckableActionState(e) {
if ("lockDrawingsAction" === e) return console.warn(
'Action "lockDrawingsAction" is deprecated. Use method "lockAllDrawingTools" instead'
), null;
if ("hideAllDrawingsAction" === e) return console.warn(
'Action "hideAllDrawingsAction" is deprecated. Use method "hideAllDrawingTools" instead'
), null;
if (e in this._actions) {
var t = this._actions[e];
if (t instanceof A && t.isCheckable()) return t.isChecked();
console.warn("Action " + e + " has no state")
} else console.warn("Unknown action id: " + e);
return null
}
_updateScalesActions() {
if (null !== this._actions) {
var e = this.model().mainSeries(),
t = e.priceScale(),
i = e.properties(),
s = t.isLockScale(),
r = i.style.value() === c.STYLE_PNF;
this._actions.percentSeriesScale.update({
disabled: s || r,
checked: t.isPercentage()
}), this._actions.logSeriesScale.update({
disabled: s || r,
checked: t.isLog()
}), this._actions.regularSeriesScale.update({
disabled: s || r,
checked: t.isRegular()
}), this._actions.indexedTo100SeriesScale.update({
disabled: s || r,
checked: t.isIndexedTo100()
}), this._actions.invertSeriesScale.update({
checked: t.isInverted()
}), this._actions.lockSeriesScale.update({
checked: t.isLockScale()
}), this._actions.autoSeriesScale.update({
checked: t.isAutoScale(),
disabled: t.properties().autoScaleDisabled.value()
})
}
}
removeAllStudies() {
this._model.removeAllStudies()
}
removeAllDrawingTools() {
this._model.removeAllDrawingTools()
}
removeAllStudiesDrawingTools() {
this._model.removeAllStudiesAndDrawingTools()
}
defaultSymbol() {
return this._defSymbol
}
connect() {
this._handler = function(e) {
this._onData(e)
}.bind(this), this._boundOnChartSessionIsConnectedChanged = this
._onChartSessionIsConnectedChanged.bind(this), this._chartSession
.isConnected().subscribe(this._boundOnChartSessionIsConnectedChanged),
this._chartSession.criticalError().subscribe(this, this
._onChartSessionCriticalError), this._chartSession.connect(this
._handler)
}
finishInitWithoutConnect() {
this._chartSession.disable(), this._init(), this.chartWidgetInitialized
.fire()
}
reconnect() {
this._chartSession.disconnect(), this._chartSession.connect()
}
update() {
if (this._model) {
for (var e = 0; e < this._paneWidgets.length; e++) this._paneWidgets[e]
.update();
this._timeAxisWidget && this._timeAxisWidget.update()
}
}
_makeDefaultGui() {
this._makeLoadingScreen(), this._model && (this._makeTimeAxisWidget(), this
._makePaneWidgetsAndSeparators()), this.adjustSize(), this
._updateScalesActions(), y(this._elMainTable), this.update(), this
.paint()
}
widget() {
return this._mainDiv
}
_onBackgroundColorChanged() {
for (var e = 0; e < this._paneWidgets.length; e++) this._paneWidgets[e]
.setCursorForTool();
this.update(), this.model().model().fullUpdate()
}
setScaleLineColor(e) {
this.scaleLineColor = e.value(), this._paneSeparators.forEach((function(e) {
e.update()
})), this.update(), this.paint()
}
setScaleTextColor(e) {
this.scaleTextColor = e.value(), this.update(), this.paint()
}
setTimingsMeter(e) {
this._timingsMeter = e, this._updateTimingsMeterState()
}
ownerDocument() {
return this._parent.ownerDocument
}
_updateTimingsMeterState() {
var e = this._options.visible.value();
null !== this._timingsMeter && (e ? this._timingsMeter.startCollect() : this
._timingsMeter.stopCollect())
}
_update(e) {
var t = e ? e.fullInvalidation() : j.Full,
i = !!e && e.isVisibleTimeRangeLockedOnResize();
if (null !== this._timingsMeter && this._timingsMeter.startDraw(t),
t === j.Full && (this._model ? this._updateGui(i) : this.adjustSize(i)),
e.invalidateForTimeScale() > j.Cursor && this._timeAxisWidget.update(),
this.paint(e), this._dataWindowWidget) {
var s = e.maxPaneInvalidation();
s === j.Full ? this._dataWindowWidget.fullUpdate() : s > j.None && this
._dataWindowWidget.update()
}
for (var r = 0; r < this._paneWidgets.length; r++) this._paneWidgets[r]
.updateStatusWidget(e.invalidateForPane(r).fullInvalidation());
null !== this._timingsMeter && this._timingsMeter.stopDraw(), e && e
.panesOrderInvalidated() && ae.emit("panes_order_changed")
}
_createVolumeIfNeeded() {
var e = h.enabled("create_volume_indicator_by_default") && this._options
.addVolume,
t = !this._content,
i = h.enabled("charting_library_base"),
s = h.enabled("create_volume_indicator_by_default_once"),
r = this._content && !this._content.loading;
e && (t || i && r && !s) && this._model.mainSeries().dataEvents()
.symbolResolved().subscribe(this, (function() {
var e = this;
setTimeout((function() {
var t = e._model.model().mainSeries()
.symbolInfo();
if (t) {
var i = !t.has_no_volume;
if (!e.containsVolume() && i) {
var s = te.factoryDefaults(
"chartproperties.volumePaneSize"
),
r = e._model.model()
.createStudyInserter({
type: "java",
studyId: "Volume@tv-basicstudies"
});
r.setForceOverlay(h.enabled(
"volume_force_overlay")), r
.setPaneSize(s), h.enabled(
"hide_volume_ma") && r
.setPropertiesState({
styles: {
vol_ma: {
visible: !1
}
}
}), r.insert()
} else if (!i && e.containsVolume()) {
var n = e.model().dataSources()
.filter((function(e) {
return e instanceof w &&
"Volume" === e
.metaInfo()
.shortId
}))[0];
e._model.model().removeSource(n)
}
}
}), 0)
}), s)
}
_createSessions(e) {
var t = this.showGeneralChartProperties.bind(this, f.timezoneSessions);
e.createSessions(t)
}
_createPrePostMarket(e) {}
_createChartEventsSource() {
throw new Error("Not implemented")
}
_onChartStyleChanged() {
$("Chart", "Chart Style " + this._model.mainSeries().getStyleShortName()
.toUpperCase())
}
_updateGui(e) {
this._model && (this._makeTimeAxisWidget(), this
._makePaneWidgetsAndSeparators(), this._elMainTable.style
.userSelect = "none", this.adjustSize(e))
}
setVisibleTimeRange(e, t, i, s) {
{
const r = this._model.mainSeries().seriesSource();
this._chartSession.setVisibleTimeRange(r.instanceId(), r.turnaround(),
e, t, i || {}, s)
}
}
_makeLoadingScreen() {
if (h.enabled("lean_chart_load")) {
if (this.screen) return;
this.screen = new ee(this, this._parent)
} else this.screen = new ee(this, this._mainDiv)
}
_makeAvailableOnTVPopup() {
throw new Error("Not implemented")
}
_setSymbol(e, t) {
if (this._model) {
var i = this._model.mainSeries();
if (!t && i.symbolSameAsCurrent(e)) return;
this._model.selectionMacro((function(e) {
e.clearSelection()
})), this._model.setSymbol(this._model.mainSeries(), e)
} else this._properties.mainSeriesProperties.merge({
symbol: e
})
}
setSymbol(e, t) {
return this._setSymbol.apply(this, arguments)
}
loadRange(e) {
this._model && (this.screen.show(), this._model.loadRange(e))
}
getSymbol(e) {
var t;
return (t = this._model ? this._model.mainSeries().properties() : this
._properties.mainSeriesProperties) ? e && t.shortName && t.shortName
.value() ? t.shortName.value() : t.symbol.value() : ""
}
toggleMaximizePane(e) {
if (!(this._paneWidgets.length < 2)) {
this._maximizedPaneWidget ? (this._maximizedPaneWidget.state()
.setMaximized(!1), this._maximizedPaneWidget = null, this
._paneSeparators.forEach((function(e) {
e.show()
}))) : (this._maximizedPaneWidget = e, this._maximizedPaneWidget
.state().setMaximized(!0), this._paneSeparators.forEach((
function(e) {
e.hide()
})));
for (var t = this._paneWidgets.length; t--;) this._paneWidgets[t]
.updateControls(), this._paneWidgets[t].updatePriceAxisWidgets();
this._timeAxisWidget.updatePriceAxisStubs(), this.adjustSize(), this
.updateCrossHairPositionIfNeeded()
}
}
_titlesProvider(e, t) {
var i = this.model(),
s = this._maximizedPaneWidget ? this._maximizedPaneWidget.state() : i
.paneForSource(i.mainSeries()),
r = "right" === e ? s.rightPriceScales() : s.leftPriceScales();
if (r.length < t + 1) return [];
var n = r[t].orderedSources().filter((function(e) {
return e === i.mainSeries() || e instanceof w
}));
return n.reverse(), (n = a(n, i.mainSeries())).map((function(e) {
return e.title(!0, void 0, !1)
}))
}
_menuItemsProvider(e, t) {
var i = this.model(),
s = this._maximizedPaneWidget ? this._maximizedPaneWidget.state() : i
.paneForSource(i.mainSeries()),
r = "right" === e ? s.visibleRightPriceScales() : s
.visibleLeftPriceScales();
if (r.length < t + 1) return [];
var n = r[t],
o = i.panes().indexOf(s),
a = this._paneWidgets[o];
return ("right" === e ? a.rightPriceAxisesContainer() : a
.leftPriceAxisesContainer()).findAxisWidgetForScale(n)
.getContextMenuActions()
}
_makeTimeAxisWidget() {
if (this._timeAxisWidget) this._timeAxisWidget.updatePriceAxisStubs();
else {
var e = this.model();
this._timeAxisWidget = new l(this, this._options.timeScaleWidget, this
._titlesProvider.bind(this), this._menuItemsProvider.bind(this),
this._backgroundBasedTheme), this._elMainTable.appendChild(this
._timeAxisWidget.getElement()), this._timeAxisWidget
.updatePriceAxisStubs(), this._timeAxisWidget.onLabelHovered()
.subscribe(this, (function(t, i) {
var s = this._maximizedPaneWidget ? this
._maximizedPaneWidget.state() : e.paneForSource(e
.mainSeries()),
r = this.paneByState(s).highlightedPriceAxis(),
n = r.value();
(i || n.owner === t.owner) && (r.setValue({
owner: t.owner,
axis: i ? t.axis : null
}), this.model().model().lightUpdate())
}))
}
}
insertStudy(e, t, i, s) {
var r = this;
return new Promise((function(n) {
t ? window.runOrSignIn((function() {
n(r._insertStudy(e, t, i, s))
}), {
source: "study on study"
}) : n(r._insertStudy(e, t, i, s))
})).catch((function() {}))
}
_insertStudy(e, t, i, s) {
var r = this._model.createStudyInserter(e, t, i);
r.setForceOverlay("java" === e.type && "Volume@tv-basicstudies" === e
.studyId && h.enabled("volume_force_overlay"));
var n = this,
o = r.insert((function(e, t, i) {
return new Promise((function(r, o) {
n.selectPointMode().value() && n
.cancelRequestSelectPoint(), s ? r(s(e,
t, i)) : n.isSymbolicStudy(i) ? ($(
"GUI", "Confirmation dialogs",
"Symbol confirmation dialog"),
S(n, i, r, o, "symbol")) : n
.hasConfirmInputs(t) ? ($("GUI",
"Confirmation dialogs",
"Inputs confirmation dialog"),
S(n, i, r, o)) : r({})
}))
}));
return o.catch((function(e) {})), o
}
hasConfirmInputs(e) {
if (void 0 === e) return !1;
for (var t = 0; t < e.length; ++t) {
var i = e[t];
if (void 0 !== i.confirm && i.confirm) return !0
}
return !1
}
isSymbolicStudy(e) {
switch (e.id) {
case "Overlay@tv-basicstudies":
case "CorrelationCoefficient@tv-basicstudies":
case "Correlation Coeff@tv-basicstudies":
case "Spread@tv-basicstudies":
case "Ratio@tv-basicstudies":
return !0;
default:
return !1
}
}
_onChartSessionIsConnectedChanged(e) {
e ? this._onConnection() : this._onDisconnect()
}
_onChartSessionCriticalError(e, t) {
this._disconnected.fire(!0)
}
_onData(e) {
switch (e.method) {
case "reconnect_bailout":
this._reconnectBailout.fire();
break;
default:
this._model.onData(e)
}
}
_onConnection() {
this._online = !0, this._model ? (this._model.restart(), this._updateGui(),
this.update(), this.paint(), this._connected.fire()) : this
.requestMetadata()
}
_onDisconnect() {
this._model && this._model.disconnect(), this._online = !1, this.update(),
this.paint(), this._disconnected.fire()
}
_applyStudiesOverrides() {
Z.overrideDefaults(this._metaInfoRepository.getInternalMetaInfoArray())
}
requestMetadata() {
this._addPerfMark("RequestMetadataStart"), this._metaInfoRepository
.requestMetaInfo().then(function() {
this._addPerfMark("RequestMetadataEnd"), this._inited ? this
.model().model().setStudiesMetaData(this._metaInfoRepository
.getInternalMetaInfoArray(), this._metaInfoRepository
.getMigrations()) : (this._init(), this
.chartWidgetInitialized.fire(), h.enabled(
"charting_library_base") || ie.logDebug(
"initialized"))
}.bind(this))
}
studiesMetaData() {
return this._model.studiesMetaData()
}
getTimeScale() {
return this._timeAxisWidget
}
chartWidgetCollection() {
return this._chartWidgetCollection
}
setSeriesStyle(e, t) {
this._model.setProperty(e.properties().style, t)
}
showObjectsTreePanelOrDialog() {
var e = !1,
t = window.widgetbar;
t && t.isVisible() && (e = "object_tree" === t.setPage("object_tree").name);
e || this.showObjectsTreeDialog()
}
_showChartProperties(e, t, i, s) {
t && (m("properties_dialog.active_tab.chart", t), i.tabName = t);
var r = this;
return new Promise((function(t) {
d(e, r._model, i, r._chartWidgetCollection, s).then((
function(e) {
t(null !== e && e.isVisible() ? e : null)
}))
}))
}
showGeneralChartProperties(e) {
if (!h.enabled("show_chart_property_page")) return Promise.resolve(null);
var t = this;
return this._showChartProperties(this._model.mainSeries(), e, {
doNotCloseOnBgClick: !0,
onResetToDefault: function() {
t._model.restorePreferences(t._model), t.applyTheme(t)
}
}).then((function(e) {
if (null === e) return null;
var i = function() {
e.hide(), t._chartWidgetCollection.activeChartWidget
.unsubscribe(i)
};
return t._chartWidgetCollection.activeChartWidget.subscribe(
i), e
}))
}
showChartPropertiesForSource(e, t, i, s) {
return h.enabled("property_pages") ? e === this._model.model()
.mainSeries() ? this.showGeneralChartProperties(t) : ((i = i || {})
.onResetToDefault = this._model.restorePropertiesForSource.bind(this
._model, e), this._showChartProperties(e, t, i, s)) : Promise
.resolve(null)
}
generalPropertiesDefinitions() {
return this._getChartPropertyDefinitionsViewModel().then((function(e) {
return e.propertyPages()
}))
}
propertiesDefinitionsForSource(e) {
return I(e) || C(e) || M(e) ? e.getPropertyDefinitionsViewModel().then((
function(e) {
return null === e ? null : e.propertyPages()
})).catch((function(e) {
return ie.logWarn(e), null
})) : Promise.resolve(null)
}
toggleCompareOrAdd() {
this._compareDialog.visible().value() ? this._compareDialog.hide() : this
._compareDialog.show()
}
showIndicators(e) {
if (window.studyMarket) return window.studyMarket.visible().value() ?
void window.studyMarket.hide() : (window.studyMarket.show(e), window
.studyMarket)
}
showFundamentals(e) {
if (window.fundamentalsDialog) {
if (!window.fundamentalsDialog.visible().value()) {
var t, i = void 0 !== e ? e.title(!0) : void 0;
if (void 0 !== e) {
var s = e.symbolInfo();
t = null === s ? e.symbol() : s.ticker || s.full_name
}
return window.fundamentalsDialog.show(t, i), window
.fundamentalsDialog
}
window.fundamentalsDialog.hide()
}
}
removeSelectedSources() {
this.removeDataSources(this._model.selection().dataSources())
}
removeDataSources(e) {
var t = e.filter(function(e) {
return e !== this._model.mainSeries() && e !== this._model
.lineBeingCreated() && !(e instanceof O)
}.bind(this));
if (0 !== t.length) {
var i = null;
C(t[0]) && (n(1 === t.length,
"Cannot remove several studies (no multi select for studies)"
), i = t[0]);
t.find((function(e) {
return e.hasAlert.value() && e.isUserDeletable()
}));
i && i.hasChildren() ? showDeleteStudyTreeConfirm(this._model
.removeSelectedSources.bind(this._model)) : this._model
.removeSelectedSources()
}
}
unlinkSelectedLine() {
var e = this._model,
t = e.selection().lineDataSources();
e.unlinkLines(t)
}
copyLineToOtherCharts() {
var e = this._model,
t = e.selection().lineDataSources().filter((function(e) {
return e.isSynchronizable()
}));
e.copyToOtherCharts(t)
}
hideSelectedObject() {
this.hideDataSources(this._model.selection().dataSources())
}
hideDataSources(e) {
if (e.length) {
var t = e.map((function(e) {
return e.properties().visible
})),
i = e.map((function() {
return !1
}));
this._model.setProperties(t, i, "Hide " + e[0].title())
}
}
toggleLockSelectedObject() {
var e = this._model;
e.selection().lineDataSources().forEach((function(t) {
var i = t.properties().frozen.value();
e.setProperty(t.properties().frozen, !i, s(i ? "Unlock" :
"Lock") + " " + t.title())
}))
}
showSelectedSourceProperties() {
var e = this._model.selection().dataSources()[0];
e && this.showSourceProperties(e)
}
showSourceProperties(e) {
var t = null;
e === this._model.mainSeries() && (t = f.symbol), this
.showChartPropertiesForSource(e, t)
}
openSelectedObjectSource(e) {}
tags() {
return this._model ? this._model.calculateDefaultTags() : []
}
state(e, t, i, s) {
if (this._model) {
const r = this._model.state(e, t, i, s);
return r.chartId = this.id(), r
}
return this._content ? this._content : {}
}
asyncState() {
return this._model.asyncState()
}
metaInfo() {
var e = this._metaInfo;
return this._model && (e.systemTags = this._model.calculateDefaultTags()), e
}
onTagsChanged() {
return this._tagsChanged
}
onModelTagsChanged() {
this._tagsChanged.fire()
}
onAboutToBeDestroyed() {
return this._aboutToBeDestroyed
}
destroy() {
this._aboutToBeDestroyed.fire(), null !== this._removeMaximizeHotkey && (
this._removeMaximizeHotkey(), this._removeMaximizeHotkey = null),
0 !== this._drawRafId && this._parent.ownerDocument.defaultView
.cancelAnimationFrame(this._drawRafId), null !== this
._backgroundTopColorSpawn && this._backgroundTopColorSpawn.destroy(),
null !== this._backgroundBottomColorSpawn && this
._backgroundBottomColorSpawn.destroy(), null !== this._timingsMeter && (
this._timingsMeter.stopCollect(), this._timingsMeter = null);
for (var e = 0; e < this._paneWidgets.length; e++) this._paneWidgets[e]
.destroy();
this._paneWidgets.length = 0;
for (e = 0; e < this._paneSeparators.length; e++) this._paneSeparators[e]
.destroy();
for (var t in this._paneSeparators.length = 0, this._hotkeysListener && this
._hotkeysListener.destroy(), this._barsButton && this._barsButton
.destroy(), this._controlBarNavigation && (this
._controlBarNavigation.destroy(), this._controlBarNavigation =
void 0), this._mainDiv && this._mainDiv.remove(), this
._actions) {
var i = this._actions[t];
i instanceof A && (i.destroy(), i.binder && i.binder.destroy())
}
null !== this._timeAxisWidget && (this._timeAxisWidget.destroy(), this
._timeAxisWidget = null), null !== this._definitionsViewModel &&
this._definitionsViewModel.destroy(), this._hotkeys && (this._hotkeys
.destroy(), this._hotkeys = null), this._mainDiv
.removeEventListener("wheel", this._onWheelBound), window
.removeEventListener("keydown:chart_" + this._id, this
._keydownEventListener), super.destroy(), this._chartSession
.criticalError().unsubscribe(this, this._onChartSessionCriticalError),
this._chartSession.isConnected().unsubscribe(this
._boundOnChartSessionIsConnectedChanged), this._chartSession
.destroy()
}
title() {
return s("Chart Properties")
}
symbolProperty() {
return this._model.mainSeries().properties().shortName ? this._model
.mainSeries().properties().shortName : this._model.mainSeries()
.properties().symbol
}
loadContent(e, t) {
this.screen.show();
this.isMaximizedPane() && this.toggleMaximizePane();
for (var i, s = this._model.model().dataSources(), r = 0; r < s
.length; r++) {
var n = s[r];
n !== this._model.mainSeries() && this._model.model().removeSource(n, !
0)
}
this._model.disconnect(), this.activePaneWidget = null, this._model
.mainSeries().purgeSymbolInfo(), e.loading = !0, this._content = e, this
._initialLoading = Boolean(t);
for (r = 0; r < e.panes.length; ++r)
for (var o = 0; o < e.panes[r].sources.length; ++o)
if (e.panes[r].sources[o].state.symbol) {
i = e.panes[r].sources[o].state;
break
} if (!i) throw Error(
"An error occured while determining main series ion the chart");
this._properties.mainSeriesProperties.mergeAndFire({
visible: !0,
symbol: i.symbol,
timeframe: "",
onWidget: this._onWidget,
interval: i.interval || "D",
style: i.style
}), this._init(), this._model.undoHistory().clearStack()
}
_contentSeriesProperties() {
if (this._content)
for (var e = this._content.panes.length; e-- > 0;)
for (var t = this._content.panes[e].sources, i = t.length; i-- > 0;)
if ("MainSeries" === t[i].type) return t[i].state
}
updateUndoRedo() {
this._model && (this.actions().undo.update({
disabled: this._model.undoHistory().undoStack().isEmpty()
}), this.actions().redo.update({
disabled: this._model.undoHistory().redoStack().isEmpty()
}))
}
createSessionBreaksActions(e) {
var t = new A({
label: s("Session Breaks"),
checkable: !0,
statName: "ToggleSessionBreaks"
});
t.binder = new u(t, this._model.chartModel().sessions().properties()
.graphics.vertlines.sessBreaks.visible, this.model(),
"Session Breaks"), this._actions.sessionBreaks = t
}
updateActionForIntradayOnly(e) {
e && e instanceof A && e.update({
disabled: this.model().mainSeries().isDWM()
})
}
containsVolume() {
return this.model().dataSources().some((function(e) {
return e instanceof w && "Volume" === e.metaInfo().shortId
}))
}
containsStudyByPredicate(e) {
return !!this._model && this._model.dataSources().some((function(t) {
if (!(t instanceof w)) return !1;
var i = t.metaInfo();
return e(i)
}))
}
containsStudy(e) {
return this.containsStudyByPredicate((function(t) {
return t.id === e || t.fullId === e
}))
}
isSmall() {
return this._width() < 550 || this._height() < 300
}
onWidget() {
return this._onWidget
}
onCmeWidget() {
return "cme" === this.widgetCustomer()
}
widgetCustomer() {
return this._widgetCustomer
}
resize() {
var e = this._height() + "px",
t = this._width() + "px";
this._mainDiv.style.height = e, this._mainDiv.style.width = t, this
._elMainTable.style.height = e, this._elMainTable.style.width = t, this
._resizeHandler && this._mainDiv && this._resizeHandler()
}
chartSession() {
return this._chartSession
}
onLineCancelled() {
k.resetToCursor()
}
_startSpinner(e) {
this._spinner || e && (this._spinner = (new X).spin(e))
}
isJustClonedChart() {
return !!(this._options || {}).justCloned
}
applyOverrides(e) {
var t = {};
for (var i in e) i.startsWith("mainSeriesProperties.priceAxisProperties") ||
(t[i] = e[i]);
if (applyPropertiesOverrides(this.properties(), null, !1, t, null), this
._model) {
applyPropertiesOverrides(this._model.model().properties(), null, !1, t),
applyPropertiesOverrides(this._model.mainSeries().properties(),
null, !1, t, "mainSeriesProperties"), this._model.model()
.sessions().applyOverrides(t);
const e = this._model.chartModel().watermarkSource();
null !== e && e.applyOverrides(t)
}
}
applyStudiesOverrides(e) {
Z.mergeDefaultsOverrides(e), this._applyStudiesOverrides()
}
setActive(e) {
this._isActive = e, Q() && (e && this.selectPointMode().value() ? this
.startTrackingMode() : this.exitTrackingMode()), this._paneWidgets
.forEach((function(e) {
e.update()
})), e || this.model().selectionMacro((function(e) {
e.clearSelection()
}))
}
isActive() {
return this._isActive
}
trackTime() {
return this._chartWidgetCollection.lock.trackTime
}
crossHairSyncEnabled() {
return this._chartWidgetCollection.lock.crosshair.value()
}
isMultipleLayout() {
return ne(this._chartWidgetCollection.layout.value())
}
selectPointMode() {
return this._model.model().selectPointMode()
}
cancelRequestSelectPoint() {
this._model.model().cancelRequestSelectPoint()
}
requestSelectPoint(e, t, i) {
var s = this;
return new Promise((function(r, n) {
if (l()) {
k.resetToCursor(!0), s._model.lineBeingCreated() && s
._model.cancelCreatingLine();
var o = !1,
a = {};
s._model.model().onPointSelected().subscribe(a, (
function(e, t) {
o = !0, s._isVisible.unsubscribe(l), s
._hideHint(), r({
point: e,
pane: t
})
}), !0), s._model.model().requestSelectPoint(e,
i), s.startTrackingMode(), void 0 !== t && s
._showHint(t), s._isVisible.subscribe(l), s
.selectPointMode().subscribe((function() {
setTimeout((function() {
o || (s.selectPointMode()
.value() || s
._hideHint(), s
._model.model()
.onPointSelected()
.unsubscribeAll(
a), s
._isVisible
.unsubscribe(l),
n("cancelled"))
}))
}), {
once: !0
})
}
function l() {
return !!s.isVisible() || (n(
"Chartwidget must be visible"), s
.cancelRequestSelectPoint(), !1)
}
}))
}
showReplayOrderConfirmationDialog() {
if (!this.model().isInReplay()) return Promise.resolve()
}
_addPerfMark(e) {
oe("ChartWidget." + this._id + "." + e)
}
requestFullscreen() {
this._options.requestFullscreen()
}
getResizerDetacher() {
return this._options
}
_createHint() {
if (null === this._hintDefferedPromise) {
var e = ue();
this._hintDefferedPromise = e;
var t = this;
Promise.all([i.e("react"), i.e(89), i.e("chart-event-hint")]).then(i
.bind(null, "PN5r")).then((function(i) {
e.resolve(new i.ChartEventHintRenderer(t
._chartWidgetCollection.getContainer()))
}))
}
return this._hintDefferedPromise ? o(this._hintDefferedPromise).promise :
null
}
_showHint(e) {
if (h.enabled("popup_hints"))
if (null !== this._activeHint) this._activeHint.show(e);
else {
var t = this,
i = this._createHint();
null !== i && i.then((function(i) {
if (null !== i) {
if (t._activeHint = i, void 0 === e) return;
t._activeHint.show(e)
}
}))
}
}
_hideHint() {
null !== this._activeHint && this._activeHint.hide()
}
}
e.exports.ChartWidget = ge, e.exports.trackingModeIsAvailable = ce
}).call(this, i("aIyQ"))
},
"Zp/P": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "extendAndClipLineSegment", (function() {
return h
})), i.d(t, "getArrowPoints", (function() {
return u
})), i.d(t, "optimalBarWidth", (function() {
return d
})), i.d(t, "optimalCandlestickWidth", (function() {
return p
})), i.d(t, "optimalHiLoWidth", (function() {
return _
})), i.d(t, "interactionTolerance", (function() {
return m
})), i.d(t, "coordinateIsValid", (function() {
return f
})), i.d(t, "setValidLineStyle", (function() {
return g
})), i.d(t, "fillScaledRadius", (function() {
return b
})), i.d(t, "strokeScaledRadius", (function() {
return v
}));
var s = i("aO4+"),
r = i("hBTJ"),
n = i("VaSN"),
o = i("ogJP"),
a = i("jFln");
const l = {
line: 13,
minDistanceBetweenPoints: 10,
series: 14,
curve: 10,
anchor: 13,
esd: 4
},
c = {
line: 3,
minDistanceBetweenPoints: 5,
series: 2,
curve: 3,
anchor: 2,
esd: 0
};
function h(e, t, i, n, o, a) {
if (Object(s.equalPoints)(e, t)) return null;
const l = new s.Point(0, 0),
c = new s.Point(i, n);
if (o) {
if (a) {
const i = Object(r.intersectLineAndBox)(Object(s.lineThroughPoints)(e, t), Object(s
.box)(l, c));
return Array.isArray(i) ? i : null
} {
const i = Object(r.intersectRayAndBox)(t, e, Object(s.box)(l, c));
return null === i || Object(s.equalPoints)(t, i) ? null : Object(s.lineSegment)(t,
i)
}
}
if (a) {
const i = Object(r.intersectRayAndBox)(e, t, Object(s.box)(l, c));
return null === i || Object(s.equalPoints)(e, i) ? null : Object(s.lineSegment)(e, i)
} {
const i = Object(r.intersectLineSegmentAndBox)(Object(s.lineSegment)(e, t), Object(s
.box)(l, c));
return Array.isArray(i) ? i : null
}
}
function u(e, t, i, s) {
const r = .5 * i,
n = Math.sqrt(2),
o = t.subtract(e),
a = o.normalized();
let l = 5 * i;
s && (l = Math.min(l, .35 * o.length()));
const c = 1 * r;
if (l * n * .2 <= c) return [];
const h = a.scaled(l),
u = t.subtract(h),
d = a.transposed(),
p = 1 * l,
_ = d.scaled(p),
m = u.add(_),
f = u.subtract(_),
g = m.subtract(t).normalized().scaled(c),
b = f.subtract(t).normalized().scaled(c),
v = t.add(g),
S = t.add(b),
y = r * (n - 1),
w = d.scaled(y),
P = Math.min(l - 1 * r / n, r * n * 1),
C = a.scaled(P),
x = t.subtract(w),
T = t.add(w),
I = t.subtract(C);
return [
[m, v],
[f, S],
[x, I.subtract(w)],
[T, I.add(w)]
]
}
function d(e, t) {
return t = t || 1, Math.floor(.3 * e * t)
}
function p(e, t) {
if (e >= 2.5 && e <= 4) return Math.floor(3 * t);
const i = 1 - .2 * Math.atan(Math.max(4, e) - 4) / (.5 * Math.PI),
s = Math.floor(e * i * t),
r = Math.floor(e * t),
n = Math.min(s, r);
return Math.max(Math.floor(t), n)
}
function _(e) {
return .4 * e
}
function m() {
return Object(n.lastEventIsTouch)() ? l : c
}
function f(e) {
return null != e && !Object(o.isNaN)(e)
}
function g(e, t) {
void 0 !== t && Object(a.setLineStyle)(e, t)
}
function b(e, t) {
const i = Math.max(1, Math.floor(t)) % 2 ? .5 : 0;
return Math.round(e * t) + i
}
function v(e, t, i) {
const s = Math.max(1, Math.floor(t)) % 2 ? .5 : 0;
return Math.round(e * t) + (s !== i % 2 ? .5 : 0)
}
},
Zp8I: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StepLineDecoration", (function() {
return s
})), i.d(t, "PaneRendererStepLine", (function() {
return f
}));
var s, r = i("GEp6"),
n = i("VdBB"),
o = i("aO4+"),
a = i("jFln"),
l = i("Y7w9"),
c = i("Zp/P"),
h = i("gAom"),
u = i("Tmoa");
! function(e) {
e[e.None = 0] = "None", e[e.Diamonds = 1] = "Diamonds"
}(s || (s = {}));
class d {
initialize(e, t, i, s) {
var r, n, o, l;
const c = e.lineStyle;
t.lineCap = "butt", t.lineJoin = "round";
const h = Math.max(Math.floor(null !== (n = null === (r = s.style) || void 0 === r ?
void 0 : r.width) && void 0 !== n ? n : e.lineWidth * i.pixelRatio));
void 0 !== c && Object(a.setLineStyle)(t, c);
const u = h % 2 ? .5 : 0;
t.moveTo(Math.round(s.x * i.pixelRatio) + u, Math.round(s.y * i.pixelRatio) + u), t
.strokeStyle = null !== (l = null === (o = s.style) || void 0 === o ? void 0 : o
.color) && void 0 !== l ? l : e.lineColor, t.lineWidth = h
}
finishFragment(e) {
e.stroke()
}
hitTest(e, t, i, s, n) {
var a, l;
const h = Math.round((i.x + s.x) / 2),
u = new o.Point(h, i.y),
d = new o.Point(h, s.y),
p = null !== (l = null === (a = i.style) || void 0 === a ? void 0 : a.width) &&
void 0 !== l ? l : e.lineWidth,
_ = Object(c.interactionTolerance)().series + p / 2;
return Math.min(Object(r.distanceToSegment)(i, u, n).distance, Object(r
.distanceToSegment)(u, d, n).distance, Object(r.distanceToSegment)(d, s,
n).distance) <= _
}
applyColor(e, t) {
e.strokeStyle = t
}
applyLineWidth(e, t) {
e.lineWidth = t
}
drawItem(e, t, i, s) {
e.lineTo(i.x, i.y), void 0 !== s && (e.lineTo(s.x, i.y), e.lineTo(s.x, s.y))
}
}
class p {
constructor() {
this._lineWidth = 1
}
initialize(e, t, i, s) {
var r, n, o, a;
this.applyColor(t, null !== (n = null === (r = s.style) || void 0 === r ? void 0 : r
.color) && void 0 !== n ? n : e.lineColor), this._lineWidth = Math.max(Math
.floor(null !== (a = null === (o = s.style) || void 0 === o ? void 0 : o
.width) && void 0 !== a ? a : e.lineWidth * i.pixelRatio))
}
finishFragment(e) {
e.fill()
}
drawItem(e, t, i, s, r) {
if (r && void 0 !== s && !Number.isNaN(s.y)) {
e.save(), e.translate(s.x, s.y), e.rotate(Math.PI / 4);
const i = this._scaleByLineWidth(this._lineWidth);
e.scale(i, i), this._drawItemRotatedAndTranslated(e, t), e.restore()
}
}
applyLineWidth(e, t) {
this._lineWidth = t
}
hitTest(e, t, i, s, r) {
var n, a;
if (!s.valIsNotSameAsPrev) return !1;
const l = Math.round((i.x + s.x) / 2),
c = new o.Point(l, s.y),
h = r.subtract(c),
u = Math.max(Math.floor(null !== (a = null === (n = i.style) || void 0 === n ?
void 0 : n.width) && void 0 !== a ? a : e.lineWidth * t.pixelRatio));
return this._hitTestTranslated(h, u)
}
_scaleByLineWidth(e) {
return Math.sqrt(e)
}
}
class _ extends p {
applyColor(e, t) {
e.fillStyle = t
}
_hitTestTranslated(e, t) {
return Math.abs(e.x) + Math.abs(e.y) < 8 * this._scaleByLineWidth(t) / 2
}
_drawItemRotatedAndTranslated(e, t) {
Object(h.drawRoundRect)(e, -4, -4, 8, 8, 2, !0)
}
}
class m extends p {
applyColor(e, t) {
e.fillStyle = Object(u.applyTransparency)(t, 90)
}
_hitTestTranslated(e, t) {
return Math.abs(e.x) + Math.abs(e.y) < 21 * this._scaleByLineWidth(t) / 2
}
_drawItemRotatedAndTranslated(e, t) {
Object(h.drawRoundRect)(e, -10.5, -10.5, 21, 21, 5, !0)
}
}
class f {
constructor() {
this._data = null
}
setData(e) {
this._data = e
}
hitTest(e, t) {
var i;
const r = this._data;
if (null === r || 0 === r.items.length) return null;
const o = r.items,
a = Object(l.lowerbound)(o, e, (e, t) => e.x <= t.x),
c = Math.max(0, a - 1),
h = Math.min(o.length - 1, a + 1),
u = function(e) {
switch (e) {
case s.Diamonds:
return [new d, new m];
default:
return [new d]
}
}(null === (i = this._data) || void 0 === i ? void 0 : i.decoration);
for (let i = c; i < h; i++) {
const s = o[i],
a = o[i + 1];
if (a && u.some(i => i.hitTest(r, t, s, a, e))) return new n.HitTestResult(n
.HitTestResult.REGULAR)
}
return null
}
draw(e, t) {
if (null === this._data || 0 === this._data.items.length) return;
e.save();
(function(e) {
switch (e) {
case s.Diamonds:
return [new d, new _, new m];
default:
return [new d]
}
})(this._data.decoration).forEach(i => this._drawImpl(e, t, i)), e.restore()
}
_drawImpl(e, t, i) {
var s, r, n, a, l, c, h, u, d, p;
if (null === this._data || 0 === this._data.items.length) return;
const {
lineWidth: _,
lineColor: m,
items: f
} = this._data, g = f.length, b = t.pixelRatio;
let v = Math.max(Math.floor(null !== (r = null === (s = f[0].style) || void 0 ===
s ? void 0 : s.width) && void 0 !== r ? r : _ * b)),
S = v % 2 ? .5 : 0;
i.initialize(this._data, e, t, f[0]), e.beginPath();
for (let s = 0; s < g; s++) {
const r = f[s],
g = f[s + 1],
y = Math.round(r.x * b) + S,
w = Math.round(r.y * b) + S;
if (!g) {
i.drawItem(e, t, Object(o.point)(y, w));
continue
}
const P = Math.round((r.x + g.x) / 2 * b) + S,
C = Math.round(g.y * b) + S;
i.drawItem(e, t, Object(o.point)(y, w), Object(o.point)(P, C), g
.valIsNotSameAsPrev);
const x = null !== (a = null === (n = r.style) || void 0 === n ? void 0 : n
.color) && void 0 !== a ? a : m,
T = null !== (c = null === (l = r.style) || void 0 === l ? void 0 : l
.width) && void 0 !== c ? c : _,
I = null !== (u = null === (h = g.style) || void 0 === h ? void 0 : h
.color) && void 0 !== u ? u : m,
M = null !== (p = null === (d = g.style) || void 0 === d ? void 0 : d
.width) && void 0 !== p ? p : _,
O = x !== I,
L = T !== M;
(O || L) && (i.finishFragment(e), O && i.applyColor(e, I), L && (v = Math.max(1,
Math.floor(M * b)), S = v % 2 ? .5 : 0, i.applyLineWidth(e, v)), e
.beginPath(), e.moveTo(P, C))
}
i.finishFragment(e)
}
}
},
ZsYR: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "OverlayStatusProvider", (function() {
return r
}));
var s = i("W+6j");
class r extends s.a {
getSplitTitle() {
return this._source.titleInParts(!0, void 0, !1, !1)
}
text() {
return this._source.isActualInterval() ? this._source.isFailed() ?
`${this._source.title(!0, void 0, !1, !1)}: ${this.sourceStatusText()}` :
`${this._source.title(!0, void 0, !1, !1)} ${this.sourceStatusText()}` :
this._source.title(!0, void 0, !1, !1)
}
}
},
ZtA1: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX"),
o = n.LineToolWidthsProperty,
a = n.LineToolColorsProperty;
class l extends s {
constructor(e, t) {
super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views")
.then(i.t.bind(null, "6sSH", 7)).then(({
TrendBasedFibExtensionPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return l.LevelsCount
}
pointsCount() {
return 3
}
name() {
return "Trend-Based Fib Extension"
}
migrateVersion(e, t, i) {
1 === e && this.properties().extendLines.setValue(!0)
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
static createProperties(e) {
var t = new r("linetooltrendbasedfibextension", e, !1, {
range: [0, 8]
});
return l._configureProperties(t), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "17v9")))
.FibDrawingsWith24LevelsDefinitionsViewModel
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [e.child("trendline").child("linewidth"), e.child("levelsStyle").child(
"linewidth")], i = [e.child("trendline").child("color")], r = 1; r <= l
.LevelsCount; r++) i.push(e.child("level" + r).child("color"));
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
}
fibLevelsBasedOnLogScale() {
return this.properties().fibLevelsBasedOnLogScale.value() && this.priceScale()
.isLog()
}
}
l.version = 2, l.LevelsCount = 24, t.LineToolTrendBasedFibExtension = l
},
"Zy3/": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "CompositeRenderer", (function() {
return s
}));
class s {
constructor() {
this._renderers = [], this._globalAlpha = 1
}
setGlobalAlpha(e) {
this._globalAlpha = e
}
append(e) {
this._renderers.push(e)
}
insert(e, t) {
this._renderers.splice(t, 0, e)
}
clear() {
this._renderers.length = 0
}
draw(e, t) {
for (let i = 0; i < this._renderers.length; i++) e.save(), e.globalAlpha = this
._globalAlpha, this._renderers[i].draw(e, t), e.restore()
}
drawBackground(e, t) {
e.save(), e.globalAlpha = this._globalAlpha;
for (let i = 0; i < this._renderers.length; i++) {
const s = this._renderers[i];
s.drawBackground && s.drawBackground(e, t)
}
e.restore()
}
hitTest(e, t) {
let i = null;
for (let s = this._renderers.length - 1; s >= 0; s--) {
const r = this._renderers[s].hitTest(e, t);
null !== r && (null === i || r.result() > i.result()) && (i = r)
}
return i
}
doesIntersectWithBox(e) {
return this._renderers.some(t => !!t.doesIntersectWithBox && t.doesIntersectWithBox(
e))
}
}
},
a7Ha: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "LineEnd", (function() {
return s
})),
function(e) {
e[e.Normal = 0] = "Normal", e[e.Arrow = 1] = "Arrow", e[e.Circle = 2] = "Circle"
}(s || (s = {}))
},
aDyP: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("7KDR").Action,
o = i("rCHB").LineToolPitchforkStyle,
a = null,
l = i("j3hX"),
c = l.LineToolWidthsProperty,
h = l.LineToolColorsProperty;
class u extends s {
constructor(e, t) {
super(e, t || u.createProperties()), this._properties.style.listeners().subscribe(
this, u.prototype._recreatePaneView), this._recreatePaneView()
}
levelsCount() {
return u.LevelsCount
}
additionalActions(e) {
for (var t = [], i = ["Original", "Modified Schiff", "Inside", "Schiff"], s = 0; s <
4; s++) {
var r = new n({
checked: this.properties().style.value() === s,
checkable: !0,
label: window.t(i[s]),
payload: {
target: this,
value: s
},
onExecute: function(t) {
var i = t.getPayload(),
s = i.target;
e.setProperty(s.properties().style, i.value,
`Change ${s.name()} Style`), s.updateAllViews(), s
._model.updateSource(s)
}
});
t.push(r)
}
return [t[0], t[3], t[1], t[2]]
}
_recreatePaneView() {
if (null !== a) {
var e = [];
this._properties.style.value() === o.Original ? e = [new a
.PitchforkLinePaneView(this, this._model)
] : this._properties.style.value() === o.Schiff ? e = [new a
.SchiffPitchforkLinePaneView(this, this._model)
] : this._properties.style.value() === o.Schiff2 ? e = [new a
.SchiffPitchfork2LinePaneView(this, this._model)
] : this._properties.style.value() === o.Inside && (e = [new a
.InsidePitchforkLinePaneView(this, this._model)
]), this._setPaneViews(e)
} else i.e("lt-pane-views").then(i.t.bind(null, "cT+B", 7)).then(e => {
null === a && (a = e), this._recreatePaneView()
})
}
pointsCount() {
return 3
}
name() {
return "Pitchfork"
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
static createProperties(e) {
var t = new r("linetoolpitchfork", e, !1, {
range: [0, 8]
});
return u._configureProperties(t), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "HCdA")))
.PitchForkDefinitionsViewModel
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [e.child("median").child("linewidth")], i = [e.child("median").child(
"color")], r = 0; r <= u.LevelsCount; r++) t.push(e.child("level" + r)
.child("linewidth")), i.push(e.child("level" + r).child("color"));
e.addChild("linesColors", new h(i)), e.addChild("linesWidths", new c(t))
}
}
u.LevelsCount = 8, t.LineToolPitchfork = u
},
aILO: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolHeadAndShoulders", (function() {
return o
}));
var s = i("Ocx9"),
r = i("Ss5c"),
n = i("j3hX");
class o extends r.LineDataSource {
constructor(e, t) {
const s = t || o.createProperties();
super(e, s), i.e("lt-pane-views").then(i.bind(null, "Fx2Q")).then(t => {
this._setPaneViews([new t.LineToolHeadAndShouldersPaneView(this,
e)])
})
}
pointsCount() {
return 7
}
name() {
return "Head and Shoulders"
}
properties() {
return super.properties()
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolheadandshoulders", e);
return o._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "/HOw")).then(
e => e.PatternWithBackgroundDefinitionViewModel)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e), e.addChild("linesColors", new n
.LineToolColorsProperty([e.childs().color])), e.addChild("textsColors",
new n.LineToolColorsProperty([e.childs().textcolor]))
}
}
},
aIha: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolFlagMark", (function() {
return a
}));
var s = i("aO4+"),
r = i("Ss5c"),
n = i("Ocx9"),
o = i("j3hX");
class a extends r.LineDataSource {
constructor(e, t) {
super(e, t || a.createProperties()), i.e("lt-pane-views").then(i.bind(null,
"y/56")).then(({
FlagMarkPaneView: e
}) => {
const t = new e(this, this.model());
t.setAnchors(new s.Point(0, 0)), this._setPaneViews([t])
})
}
pointsCount() {
return 1
}
name() {
return "Flag Mark"
}
properties() {
return super.properties()
}
static createProperties(e) {
e && void 0 === e.flagColor && (e.flagColor = "#318757");
const t = new n.DefaultProperty("linetoolflagmark", e);
return a._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "w/mY")).then(
e => e.FlagMarkDefinitionsViewModel)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e), e.addChild("backgroundsColors", new o
.LineToolColorsProperty([e.childs().flagColor])), e.addExclusion(
"backgroundsColors")
}
}
a.version = 2
},
aIyQ: function(e, t, i) {
"use strict";
(function(e) {
const t = i("txPx").getLogger("Common.Delegate");
function s() {
this._listeners = []
}
function r(e) {
return !e.singleshot
}
s.prototype.subscribe = function(e, t, i) {
const s = {
object: e,
member: t,
singleshot: !!i,
skip: !1
};
this._listeners.push(s)
}, s.prototype.unsubscribe = function(e, t) {
for (let i = 0; i < this._listeners.length; ++i) {
const s = this._listeners[i];
if (s.object === e && s.member === t) {
s.skip = !0, this._listeners.splice(i, 1);
break
}
}
}, s.prototype.unsubscribeAll = function(e) {
for (let t = this._listeners.length - 1; t >= 0; --t) {
const i = this._listeners[t];
i.object === e && (i.skip = !0, this._listeners.splice(t, 1))
}
}, s.prototype.destroy = function() {
delete this._listeners
}, s.prototype.fire = function() {
const e = this._listeners;
this._listeners = this._listeners.filter(r);
const i = e.length;
for (let s = 0; s < i; ++s) {
const i = e[s];
if (!i.skip) try {
i.member.apply(i.object || null, arguments)
} catch (e) {
t.logError(e.stack || e.message)
}
}
}, "undefined" != typeof window && (window.Delegate = s), e && e.exports && (e
.exports = s)
}).call(this, i("YuTi")(e))
},
"aO4+": function(e, t, i) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
}), t.equalBoxes = t.box = t.halfplaneThroughPoint = t.halfplane = t.lineSegment = t
.lineThroughPoints = t.line = t.equalPoints = t.point = t.Point = void 0;
var s = function() {
function e(e, t) {
this.x = e, this.y = t
}
return e.prototype.add = function(t) {
return new e(this.x + t.x, this.y + t.y)
}, e.prototype.addScaled = function(t, i) {
return new e(this.x + i * t.x, this.y + i * t.y)
}, e.prototype.subtract = function(t) {
return new e(this.x - t.x, this.y - t.y)
}, e.prototype.dotProduct = function(e) {
return this.x * e.x + this.y * e.y
}, e.prototype.crossProduct = function(e) {
return this.x * e.y - this.y * e.x
}, e.prototype.signedAngle = function(e) {
return Math.atan2(this.crossProduct(e), this.dotProduct(e))
}, e.prototype.angle = function(e) {
return Math.acos(this.dotProduct(e) / (this.length() * e.length()))
}, e.prototype.length = function() {
return Math.sqrt(this.x * this.x + this.y * this.y)
}, e.prototype.scaled = function(t) {
return new e(this.x * t, this.y * t)
}, e.prototype.normalized = function() {
return this.scaled(1 / this.length())
}, e.prototype.transposed = function() {
return new e(-this.y, this.x)
}, e.prototype.clone = function() {
return new e(this.x, this.y)
}, e
}();
function r(e, t) {
return new s(e, t)
}
function n(e, t) {
return e.x === t.x && e.y === t.y
}
function o(e, t, i) {
if (0 === e && 0 === t) throw new Error("A and B can not be both equal to zero.");
return {
A: e,
B: t,
C: i
}
}
function a(e, t) {
return {
edge: e,
isPositive: t
}
}
t.Point = s, t.point = r, t.equalPoints = n, t.line = o, t.lineThroughPoints = function(e, t) {
if (n(e, t)) throw new Error("Points should be distinct");
return o(e.y - t.y, t.x - e.x, e.x * t.y - t.x * e.y)
}, t.lineSegment = function(e, t) {
if (n(e, t)) throw new Error("Points of a segment should be distinct");
return [e, t]
}, t.halfplane = a, t.halfplaneThroughPoint = function(e, t) {
return a(e, e.A * t.x + e.B * t.y + e.C > 0)
}, t.box = function(e, t) {
return {
min: r(Math.min(e.x, t.x), Math.min(e.y, t.y)),
max: r(Math.max(e.x, t.x), Math.max(e.y, t.y))
}
}, t.equalBoxes = function(e, t) {
return n(e.min, t.min) && n(e.max, t.max)
}
},
aR4w: function(e, t, i) {
"use strict";
var s = i("Eyy1"),
r = i("Hr11"),
n = i("LxhU"),
o = i("ocLq"),
a = i("oamr");
class l extends a.a {
constructor(e, t, i, r, n, o) {
super(e), Object(s.assert)(t < i),
this._priceLow = this._mixinJSONObject.createDoubleField(t, "priceLow"),
this._priceHigh = this._mixinJSONObject.createDoubleField(i, "priceHigh"),
this._rate = this._mixinJSONObject.createDoubleArrayField(r, "rate"), this
._firstBarTime = this._mixinJSONObject.createTimeField(n, "firstBarTime"),
this._lastBarTime = this._mixinJSONObject.createTimeField(o, "lastBarTime")
}
isNaN() {
return super.isNaN() || Number.isNaN(this._priceLow.get()) || Number.isNaN(this
._priceHigh.get()) || 0 === this._rate.get().length
}
jsonName() {
return "hhists"
}
primitiveData() {
return {
id: this.id(),
priceHigh: this._priceHigh.get(),
priceLow: this._priceLow.get(),
rate: this._rate.get().slice(),
firstBarTime: this._firstBarTime.get(),
lastBarTime: this._lastBarTime.get()
}
}
setPriceLow(e) {
this._priceLow.set(e) && this._processObjUpdate()
}
priceLow() {
return this._priceLow.get()
}
priceHigh() {
return this._priceHigh.get()
}
setPriceHigh(e) {
this._priceHigh.set(e) && this._processObjUpdate()
}
rate() {
return this._rate.get().slice()
}
setRate(e) {
this._rate.set(e) && this._processObjUpdate()
}
rateAt(e) {
return this._rate.get()[e]
}
ratesSum() {
let e = 0;
for (const t of this._rate.get()) !Number.isNaN(t) && Number.isFinite(t) && (
e += t);
return e
}
firstBarTime() {
return this._firstBarTime.get()
}
setFirstBarTime(e) {
this._firstBarTime.set(e) && this._processObjUpdate()
}
lastBarTime() {
return this._lastBarTime.get()
}
setLastBarTime(e) {
this._lastBarTime.set(e) && this._processObjUpdate()
}
}
var c = i("WYmP");
class h {
constructor(e, t, i) {
this.index = e, this.offset = i, this.level = t
}
isNaN() {
return Number.isNaN(this.level)
}
equals(e) {
return e instanceof h && (!this.isNaN() && (!e.isNaN() && (this.index === e.index &&
this.offset === e.offset && o.Std.equal(this.level, e.level))))
}
getLevel() {
return this.level
}
getIndex() {
return this.index
}
}
class u extends a.a {
constructor(e, t) {
super(e), this._points = [], t && (this._points = t)
}
addPoint(e) {
this._processObjUpdate(), this._points.push(e)
}
addPoints(e) {
this._processObjUpdate(), this._points.push(...e)
}
setPoint(e, t) {
const i = this._points[e];
t.equals(i) || (this._processObjUpdate(), this._points[e] = t)
}
point(e) {
const t = this._points[e];
return new h(t.index, t.level, t.offset)
}
points() {
return this._points
}
pointsCount() {
return this._points.length
}
setPoints(e) {
if (e.length === this._points.length) {
let t = !0;
for (let i = 0; i < e.length; ++i)
if (!e[i].equals(this._points[i])) {
t = !1;
break
} if (t) return
}
this._processObjUpdate(), this._points = [], this._points.push(...e)
}
clearPoints() {
this._processObjUpdate(), this._points = []
}
isNaN() {
return super.isNaN() || this._points.length < 3
}
jsonName() {
return "polygons"
}
primitiveData() {
return {
id: this.id(),
points: this._points.map(e => ({
index: e.index,
offset: e.offset,
level: e.level
}))
}
}
}
class d extends a.a {
constructor(e, t, i, s, r = !1, n = !1) {
super(e), this._endIndex = this._mixinJSONObject.createTimeField(i, "endIndex"),
this._extendLeft = this._mixinJSONObject.createField(r, "extendLeft"), this
._extendRight = this._mixinJSONObject.createField(n, "extendRight"), this
._level = this._mixinJSONObject.createDoubleField(s, "level"), this
._startIndex = this._mixinJSONObject.createTimeField(t, "startIndex")
}
isNaN() {
return super.isNaN() || Number.isNaN(this._level.get()) || this._startIndex
.get() < 0 || this._endIndex.get() < 0 || this._startIndex.get() === this
._endIndex.get() && !this._extendLeft.get() && !this._extendRight.get()
}
jsonName() {
return "horizlines"
}
primitiveData() {
return {
id: this.id(),
startIndex: this._startIndex.get(),
endIndex: this._endIndex.get(),
extendLeft: this._extendLeft.get(),
extendRight: this._extendRight.get(),
level: this._level.get()
}
}
startIndex() {
return this._startIndex.get()
}
setStartIndex(e) {
this._startIndex.set(e) && this._processObjUpdate()
}
endIndex() {
return this._endIndex.get()
}
setEndIndex(e) {
this._endIndex.set(e) && this._processObjUpdate()
}
level() {
return this._level.get()
}
setLevel(e) {
this._level.set(e) && this._processObjUpdate()
}
isExtendLeft() {
return this._extendLeft.get()
}
setExtendLeft(e) {
this._extendLeft.set(e) && this._processObjUpdate()
}
extendLeft() {
return this.isExtendLeft()
}
isExtendRight() {
return this._extendRight.get()
}
setExtendRight(e) {
this._extendRight.set(e) && this._processObjUpdate()
}
extendRight() {
return this.isExtendRight()
}
}
i.d(t, "a", (function() {
return _
}));
class p {
constructor() {
this._map = new Map
}
get(e) {
const t = this._innerMap(e.start);
return t && t.get(e.end)
}
set(e, t) {
this._innerMap(e.start, !0).set(e.end, t)
}
clear() {
this._map.clear()
}
size() {
let e = 0;
return this._map.forEach(t => e += t.size), e
}
_innerMap(e, t) {
let i = this._map.get(e);
return void 0 === i && t && (i = new Map, this._map.set(e, i)), i
}
}
class _ {
constructor(e, t, i, r, n, o, a, l, h, u, d, _, m, f) {
this._freezedBoxes = new c.a, this._freezedHists = new c.a, this._freezedPocs =
new c.a, this._freezedVAHists = new c.a, this._currentHistsGr = new c.a, this
._currentVAHistsGr = new c.a, this._currentHists = [], this._currentHistsMap =
new p, this._currentBox = null, this._currentPoc = null, this
._historyBarSet = [], this._prevRtBar = null, this._minPrice = Number
.POSITIVE_INFINITY, this._maxPrice = Number.NEGATIVE_INFINITY, this
._leftBoxTime = null, this._rightBoxTime = null, this._needRecalc = !1, this
._largestHistItem = null, this._rowsLayout = null, this._currentVAStart = 0,
this._currentVAEnd = 0, this._previousVAStart = 0, this._previousVAEnd = 0, this
._idsGenerator = null, Object(s.assert)(1 === e || 2 === e), this
._numOfSubHists = e, this._outHists = r, this._outBoxLines = n, this
._outPocLines = o, this._extendPocLeftRight = a, this._outVAHists = l, this
._vaVolumePercent = h, this._rowsLayoutSupplier = u, this._outHists.addStable(
this._freezedHists), this._outVAHists.addStable(this._freezedVAHists), this
._maxHHistItems = d, this._layoutIsAutoselected = f, this._leftBoxTimeMutable =
_, this._rightBoxTimeMutable = m, this._ctx = t, this._seriesGetter = i
}
update(e) {
this._supplyRowsLayout(this._ctx), null === this._currentBox && this
._initCurrentBox(), null === this._currentPoc && this._initCurrentPoc();
const t = this._timeScale().get(e);
this._leftBoxTime = this._leftBoxTimeMutable, this._rightBoxTime = this
._rightBoxTimeMutable, this._ctx.symbol.isLastBar && !Number.isNaN(this
._rightBoxTime) && (this._rightBoxTime = Math.min(t + n.Interval.parse(this
._ctx.symbol.interval + this._ctx.symbol.resolution).inMilliseconds(
t) - 1, this._rightBoxTime));
const i = o.Std.greaterOrEqual(this._seriesClose().get(e), this._seriesOpen().get(
e)),
s = {
high: this._seriesHigh().get(e),
low: this._seriesLow().get(e),
volume: this._seriesVol().get(e),
isUp: i,
time: t
};
this._updateCurrentHistogram(s), this._currentHists.length > 0 && (this
._largestHistItem = this._getLargestHistItem(), this._updateCurrentPoc(),
this._seriesGetter.developingPoc().set(this._currentPoc.level()), this
._updateValueArea(), this._vaVolumePercent > 0 && (this._seriesGetter
.developingVAHigh().set(this._currentHists[this._currentVAEnd]
.priceHigh()), this._seriesGetter.developingVALow().set(this
._currentHists[this._currentVAStart].priceLow()))), this
._updateCurrentBox(), this._rebuildOutData()
}
setIdsGeneratorProxy(e) {
this._idsGenerator = e
}
nextGraphicsObjId() {
return Object(s.ensureNotNull)(this._idsGenerator).nextGraphicsObjId()
}
pushEraseObjCmd(e, t) {
Object(s.ensureNotNull)(this._idsGenerator).pushEraseObjCmd(e, t)
}
popEraseCmds() {
return Object(s.ensureNotNull)(this._idsGenerator).popEraseCmds()
}
_timeScale() {
return this._seriesGetter.time()
}
_seriesLow() {
return this._seriesGetter.low()
}
_seriesHigh() {
return this._seriesGetter.high()
}
_seriesVol() {
return this._seriesGetter.volume()
}
_seriesOpen() {
return this._seriesGetter.open()
}
_seriesClose() {
return this._seriesGetter.close()
}
_freezeCurrentHistogramAndCleanup() {
null !== this._currentBox && this._freezedBoxes.add(this._currentBox), o.Std
.greater(this._getVolume(this._currentHists), 0) && (this._freezedHists.addAll(
this._currentHistsGr), this._freezedVAHists.addAll(this
._currentVAHistsGr), null !== this._currentPoc && this._freezedPocs.add(
this._currentPoc)), this._currentHists = [], this._currentHistsGr.clear(),
this._currentHistsMap.clear(), this._initCurrentBox(), this._initCurrentPoc(),
this._currentVAHistsGr.clear(), this._historyBarSet = [], this._minPrice =
Number.POSITIVE_INFINITY, this._maxPrice = Number.NEGATIVE_INFINITY, this
._prevRtBar = null, this._leftBoxTime = null, this._rightBoxTime = null
}
_supplyRowsLayout(e) {
null === this._rowsLayout && e.symbol.isFirstBar && e.symbol.isNewBar && (this
._rowsLayout = this._rowsLayoutSupplier())
}
_updateCurrentHistogram(e) {
if (this._needRecalc = !1, o.Std.greater(this._minPrice, e.low) && (this._minPrice =
e.low, this._needRecalc = !0), o.Std.less(this._maxPrice, e.high) && (this
._maxPrice = e.high, this._needRecalc = !0), this._ctx.symbol.isBarClosed &&
this._historyBarSet.length > 0) {
const t = this._historyBarSet[this._historyBarSet.length - 1];
t.time === e.time && (this._prevRtBar = t, this._historyBarSet.pop())
}
this._needRecalc && 0 === Object(s.ensureNotNull)(this._rowsLayout).type() ? (this
._recalculateCurrentResultsOnHistoryBarSet(), this
._applyUpdateToCurrentResults(e, !1)) : this._applyUpdateToCurrentResults(e,
!0), this._ctx.symbol.isBarClosed ? (Object(s.assert)(null === this
._prevRtBar || e.time === this._prevRtBar.time), this._historyBarSet
.push(e), this._prevRtBar = null) : this._prevRtBar = e
}
_getMidLevel(e) {
return (e.priceHigh() + e.priceLow()) / 2
}
_getMidLevelFromList(e) {
return e.length % 2 == 0 ? e[e.length / 2].priceLow() : this._getMidLevel(e[Math
.floor(e.length / 2)])
}
_getLargestHistItem() {
let e = [],
t = this._currentHists[0];
for (const i of this._currentHists) o.Std.greater(i.ratesSum(), t.ratesSum()) ? (t =
i,
e = [t]) : o.Std.equal(i.ratesSum(), t.ratesSum()) && e.push(i);
if (e.length > 1) {
const i = this._getMidLevelFromList(this._currentHists);
t = e[e.length - 1];
for (let s = e.length - 2; s >= 0; s--) {
const r = e[s];
o.Std.lessOrEqual(Math.abs(this._getMidLevel(r) - i), Math.abs(this
._getMidLevel(t) - i)) && (t = r)
}
}
return t
}
_initCurrentPoc() {
this._currentPoc = new d(this, 0, 0, 0)
}
_updateCurrentPoc() {
const e = Object(s.ensureNotNull)(this._currentPoc);
e.setStartIndex(Object(s.ensureNotNull)(this._leftBoxTime)), e.setEndIndex(Object(s
.ensureNotNull)(this._rightBoxTime)), e.setExtendLeft(this
._extendPocLeftRight), e.setExtendRight(this._extendPocLeftRight);
const t = this._getMidLevel(Object(s.ensureNotNull)(this._largestHistItem));
e.setLevel(t)
}
_getVolume(e) {
let t = 0;
for (const i of e) t += i.ratesSum();
return t
}
_getPocHistItemIndex() {
for (let e = 0; e < this._currentHists.length; e++)
if (this._currentHists[e] === this._largestHistItem) return e;
return -1
}
_calculateValueArea() {
const e = this._getPocHistItemIndex();
Object(s.assert)(e >= 0, "ERROR - PocHistItemIndex == " + e), this._currentVAStart =
e - 1, this._currentVAEnd = e + 1;
const t = this._getVolume(this._currentHists) * this._vaVolumePercent * .01;
let i = this._currentHists[e].ratesSum(),
r = 0,
n = null;
for (; o.Std.lessOrEqual(i + r, t) && (i += r, 0 === n ? --this._currentVAStart :
1 === n && ++this._currentVAEnd, -1 !== this._currentVAStart || this
._currentVAEnd !== this._currentHists.length);) {
let t, i;
if (this._currentVAStart > -1)
if (t = this._currentHists[this._currentVAStart].ratesSum(), this
._currentVAEnd < this._currentHists.length)
if (i = this._currentHists[this._currentVAEnd].ratesSum(), o.Std
.greater(t, i)) r = t, n = 0;
else if (o.Std.greater(i, t)) r = i, n = 1;
else {
const s = Math.abs(e - this._currentVAStart),
o = Math.abs(e - this._currentVAEnd);
s < o ? (r = t, n = 0) : o <= s && (r = i, n = 1)
} else r = t, n = 0;
else r = this._currentHists[this._currentVAEnd].ratesSum(), n = 1
}
this._currentVAStart++, this._currentVAEnd--
}
_isVA(e) {
return e.priceHigh() > this._getMidLevel(this._currentHists[this
._currentVAStart]) && e.priceLow() < this._getMidLevel(this._currentHists[
this
._currentVAEnd])
}
_updateValueArea() {
if (this._calculateValueArea(), this._needRecalc || this._previousVAStart !== this
._currentVAStart || this._previousVAEnd !== this._currentVAEnd) {
let e = 0,
t = 0;
for (; e < this._currentHistsGr.size() && t < this._currentVAHistsGr.size();) {
for (; e < this._currentHistsGr.size() && !this._isVA(this._currentHistsGr
.get(e));) e++;
for (; t < this._currentVAHistsGr.size() && this._isVA(this
._currentVAHistsGr.get(t));) t++;
if (e < this._currentHistsGr.size() && t < this._currentVAHistsGr.size()) {
const i = this._currentHistsGr.get(e);
this._currentHistsGr.set(e, this._currentVAHistsGr.get(t)), this
._currentVAHistsGr.set(t, i)
}
}
for (; e < this._currentHistsGr.size(); e++) {
const t = this._currentHistsGr.get(e);
this._isVA(t) && (this._currentHistsGr.remove(e), e--, this
._currentVAHistsGr.add(t))
}
for (; t < this._currentVAHistsGr.size(); t++) {
const e = this._currentVAHistsGr.get(t);
this._isVA(e) || (this._currentVAHistsGr.remove(t), t--, this
._currentHistsGr.add(e))
}
}
this._previousVAStart = this._currentVAStart, this._previousVAEnd = this
._currentVAEnd
}
_initCurrentBox() {
this._currentBox = new u(this)
}
_updateCurrentBox() {
let e = this._minPrice,
t = this._maxPrice;
this._currentHists.length > 0 && (e = this._currentHists[0].priceLow(), t = this
._currentHists[this._currentHists.length - 1].priceHigh());
const i = [],
r = Object(s.ensureNotNull)(this._leftBoxTime),
n = Object(s.ensureNotNull)(this._rightBoxTime);
i.push(new h(r, e)), i.push(new h(r, t)), i.push(new h(n, t)), i.push(new h(n, e)),
Object(s.ensureNotNull)(this._currentBox).setPoints(i)
}
_recalculateCurrentResultsOnHistoryBarSet() {
for (let e = 0; e < this._currentHists.length; ++e) this._currentHists[e].erase();
this._currentHists = [], this._currentHistsGr.clear(), this._currentVAHistsGr
.clear(), this._currentHistsMap.clear();
for (let e = 0; e < this._historyBarSet.length; e++) this._addHistoryBarToHistogram(
this._historyBarSet[e], e, this._currentHists, this._currentHistsMap, 1);
this._currentHists.length > 0 && (this._largestHistItem = this
._getLargestHistItem(), this._updateCurrentPoc()), this._updateCurrentBox()
}
_applyUpdateToCurrentResults(e, t) {
t && null !== this._prevRtBar && this._addHistoryBarToHistogram(this._prevRtBar,
this._historyBarSet.length - 1, this._currentHists, this._currentHistsMap, -
1), this._addHistoryBarToHistogram(e, this._historyBarSet.length - 1, this
._currentHists, this._currentHistsMap, 1), this
._updateLastBarTimeInHistogram(this._currentHists)
}
_addHistoryBarToHistogram(e, t, i, r, n) {
Object(s.assert)(-1 === n || 1 === n, "Please set sign argument either +1 or -1");
const a = e.low,
l = e.high,
c = isNaN(e.volume) ? 0 : e.volume,
h = e.isUp,
u = Object(s.ensureNotNull)(this._rowsLayout);
u.init(this._ctx.symbol.minTick, this._minPrice, this._maxPrice, a, l);
const d = u.rowWidth();
if (!o.Std.greater(d, 0)) return;
u.calculate();
const p = u.getIndexLowVbP(),
_ = u.getIndexHighVbP(),
m = u.getStartPrice();
if (p === _) {
const e = p * d + m,
t = (p + 1) * d + m;
this._updateResult({
start: e,
end: t
}, n * c, h, i, r)
} else {
let e = 0;
for (let t = p; t <= _; t++) {
const s = t * d + m,
o = (t + 1) * d + m,
u = this._rowCoeff(s, o, a, l),
p = u * c;
e += u, this._updateResult({
start: s,
end: o
}, n * p, h, i, r)
}
Object(s.assert)(o.Std.equal(e, 1, .05),
"totalCoeff not equal 1! totalConf = " + e)
}
}
_updateResult(e, t, i, r, n) {
const a = this._createRates(i, t);
Object(s.assert)(null !== this._leftBoxTime,
"leftBoxTime is not set (equals null)"), Object(s.assert)(null !== this
._rightBoxTime, "rightBoxTime is not set (equals null)");
const c = Object(s.ensureNotNull)(this._leftBoxTime),
h = Object(s.ensureNotNull)(this._rightBoxTime);
let u = n.get(e);
if (void 0 === u) u = new l(this, e.start, e.end, a, c, h), n.set(e, u), this
._verifyHistogramSizeIsNotTooLarge(n.size()), this._currentHistsGr.add(u), _
._addInOrder(u, r, 0, r.length, (e, t) => {
let i = o.Std.compare(e.firstBarTime(), t.firstBarTime());
return 0 !== i ? i : (i = o.Std.compare(e.priceLow(), t.priceLow()),
0 !== i ? i : o.Std.compare(e.priceHigh(), t.priceHigh()))
});
else {
const e = [];
for (let t = 0; t < a.length; t++) e[t] = u.rateAt(t) + a[t];
u.setRate(e)
}
}
_rebuildOutData() {
const e = this._currentHistsMap.size(),
t = this._currentHists.length,
i = this._currentHistsGr.size(),
r = this._currentVAHistsGr.size();
Object(s.assert)(e === t && t === i + r,
`Collections of HHistItems are out of sync ${e} ${t} ${i} ${r}`), this
._outPocLines.clear(), this._outPocLines.addAll(this._freezedPocs),
o.Std.greater(this._getVolume(this._currentHists), 0) ? (this._outHists
.setVariable(this._currentHistsGr), this._outPocLines.add(Object(s
.ensureNotNull)(this._currentPoc)), this._outVAHists.setVariable(this
._currentVAHistsGr)) : (this._outHists.setVariable(null), this
._outVAHists.setVariable(null)), this._outBoxLines.clear(), this
._outBoxLines.addAll(this._freezedBoxes), this._outBoxLines.add(Object(s
.ensureNotNull)(this._currentBox))
}
_verifyHistogramSizeIsNotTooLarge(e) {
if (this._layoutIsAutoselected) return;
if (e <= this._maxHHistItems) return;
const t = Object(s.ensureNotNull)(this._rowsLayout);
0 === t.type() ? o.Std.error(
'Histogram is too large, please reduce "Row Size" input.') : (Object(s
.assert)(1 === t.type(), "Unexpected rowsLayout type " + t.type()), o
.Std.error('Histogram is too large, please increase "Row Size" input.'))
}
_createRates(e, t) {
if (1 === this._numOfSubHists) return [t];
if (2 === this._numOfSubHists) {
const i = [0, 0];
return i[e ? 0 : 1] = t, i
}
return Object(s.assert)(!1, "Incorrect value of numOfSubHists = " + this
._numOfSubHists), []
}
_updateLastBarTimeInHistogram(e) {
const t = Object(s.ensureNotNull)(this._rightBoxTime);
for (const i of e) i.setLastBarTime(t)
}
_rowCoeff(e, t, i, s) {
const r = s - i;
return (t - e - Math.max(t - s, 0) - Math.max(0, i - e)) / r
}
static _addInOrder(e, t, i, s, n) {
if (i === s) return void t.splice(i, 0, e);
const o = Object(r.toInt)((i + s) / 2),
a = t[o];
n(e, a) < 0 ? _._addInOrder(e, t, i, o, n) : n(e, a) > 0 ? _._addInOrder(e, t, o +
1, s, n) : t.splice(o, 0, e)
}
}
},
aVjL: function(e, t) {
e.exports =
''
},
b1GK: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "addPerfMark", (function() {
return c
})), i.d(t, "startPerfMeasure", (function() {
return h
})), i.d(t, "endPerfMeasure", (function() {
return u
})), i.d(t, "perfMeasureOperation", (function() {
return d
}));
var s = i("e3/o");
function r() {}
const n = console.timeStamp ? console.timeStamp.bind(console) : r,
o = window.performance && performance.mark ? performance.mark.bind(performance) : r,
a = window.performance && performance.measure ? performance.measure.bind(performance) : r,
l = window.performance && performance.clearMarks ? performance.clearMarks.bind(
performance) : r;
function c(e) {
n(e), o(e)
}
function h(e) {
o(e)
}
function u(e) {
a(e, e), l(e)
}
async function d(e, t) {
const i = `measure-${e}-${Object(s.randomHash)()}`;
o(i);
try {
return await t()
} finally {
a(e, i), l(i)
}
}
},
bJYc: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SetPropertyUndoCommand", (function() {
return n
}));
var s = i("RDU5"),
r = i("Ocx9");
class n extends s.UndoCommand {
constructor(e, t, i, s, r) {
super(i), this._targetObj = e, this._newValue = t, this._oldValue = this
._targetObj.value(), this._model = s, r && this.setCustomFlag(
"doesnt_affect_save", !0)
}
redo() {
Object(r.saveDefaultProperties)(!0), this._targetObj.setValue(this._newValue),
Object(r.saveDefaultProperties)(!1), this._model.recalculateAllPanes(), this
._model.lightUpdate()
}
undo() {
Object(r.saveDefaultProperties)(!0), this._targetObj.setValue(this._oldValue),
Object(r.saveDefaultProperties)(!1), this._model.recalculateAllPanes(), this
._model.lightUpdate()
}
}
},
bKFv: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "StatsPosition", (function() {
return s
})),
function(e) {
e[e.Left = 0] = "Left", e[e.Center = 1] = "Center", e[e.Right = 2] = "Right"
}(s || (s = {}))
},
bOGh: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("RDU5");
class r extends s.UndoCommand {
constructor(e) {
super(e, !1), this._subcommands = []
}
addCommand(e) {
this._subcommands.push(e)
}
isEmpty() {
return 0 === this._subcommands.length
}
redo() {
for (let e = 0; e < this._subcommands.length; e++) this._subcommands[e].redo()
}
undo() {
for (let e = this._subcommands.length - 1; e >= 0; e--) this._subcommands[e]
.undo()
}
commands() {
return this._subcommands
}
}
},
bSeV: function(e, t, i) {},
bTqm: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolCypherPattern", (function() {
return n
}));
var s = i("NJRZ"),
r = i("Ocx9");
class n extends s.LineTool5PointsPattern {
constructor(e, t) {
super(e, t || n.createProperties())
}
name() {
return "Cypher Pattern"
}
static createProperties(e) {
const t = new r.DefaultProperty("linetoolcypherpattern", e);
return n._configureProperties(t), t
}
_loadPaneViews(e) {
i.e("lt-pane-views").then(i.bind(null, "mjK7")).then(t => {
this._setPaneViews([new t.CypherPaneView(this, e)])
})
}
static _configureProperties(e) {
s.LineTool5PointsPattern._configureProperties(e)
}
}
},
bc0y: function(e, t, i) {},
biIa: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SeriesWaterlinePaneView", (function() {
return a
}));
var s = i("k4w6"),
r = i("//lt"),
n = i("VdBB"),
o = i("8Uy/");
class a extends s.a {
constructor(e) {
super(e);
const t = {
cursorType: r.PaneCursorType.VerticalResize,
activeItem: 0,
areaName: n.AreaName.SourceItemMove
};
this._lineRenderer.setHitTest(new n.HitTestResult(n.HitTestResult.MOVEPOINT,
t)), this._lineRendererData.visible = !0, this._lineRendererData
.linestyle =
o.LINESTYLE_SPARSE_DOTTED
}
_updateImpl() {
const e = this._series.properties().baselineStyle,
t = Math.abs(100 - e.baseLevelPercentage.value());
this._lineRendererData.y = Math.round(this._series.priceScale().height() * (t /
100)), this._lineRendererData.color = e.baselineColor.value()
}
}
},
bmVy: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyStatusType", (function() {
return r
})), i.d(t, "convertStudyStatusToString", (function() {
return n
}));
const s = window.t("loading...");
var r;
function n(e, t) {
if (e.type === r.Loading) return t ? s : "loading...";
if (e.type === r.Error) {
const i = e.errorDescription,
s = t ? window.t(i.error) : i.error;
if (i.ctx) {
const e = {};
return Object.entries(i.ctx).forEach(([t, i]) => {
e[t] = i.toString()
}), s.format(e)
}
return s
}
return ""
}! function(e) {
e[e.Undefined = 0] = "Undefined", e[e.Loading = 1] = "Loading", e[e.Completed = 2] =
"Completed", e[e.Error = 3] = "Error"
}(r || (r = {}))
},
"bv/X": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolSineLine", (function() {
return n
}));
var s = i("Ocx9"),
r = i("Ss5c");
class n extends r.LineDataSource {
constructor(e, t) {
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.bind(null,
"piZW")).then(e => {
this._setPaneViews([new e.SineLinePaneView(this, this._model)])
})
}
pointsCount() {
return 2
}
name() {
return "Sine Line"
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolsineline", e);
return n._configureProperties(t), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "LX4V")))
.CyclicAndSineLinesPatternDefinitionsViewModel
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e)
}
}
},
c2JX: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "renderSpinnerTemplate", (function() {
return n
})), i.d(t, "Spinner", (function() {
return a
}));
i("SzKR");
var s = i("gWrr"),
r = i("Owlf");
function n(e = "") {
return '\n\t\t\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\x3c!--\n\t\t\t\t--\x3e
\n\t\t\t
\n\t\t
\n\t'
}
const o = Object(s.b)(
'\n\t\t\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\x3c!--\n\t\t\t\t--\x3e
\n\t\t\t
\n\t\t
\n\t'
);
class a {
constructor(e) {
this._shown = !1, this._el = o.cloneNode(!0), this.setSize(e || r.a)
}
spin(e) {
return this._el.classList.add("tv-spinner--shown"), void 0 === this._container && (
this._container = e, void 0 !== e && e.appendChild(this._el)), this
._shown = !0, this
}
stop(e) {
return e && void 0 !== this._container && this._container.removeChild(this._el),
this._el.classList.remove("tv-spinner--shown"), this._shown = !1, this
}
setStyle(e) {
return Object.keys(e).forEach(t => {
const i = e[t];
void 0 !== i && this._el.style.setProperty(t, i)
}), this
}
setSize(e) {
const t = void 0 !== e ? "tv-spinner--size_" + e : "";
return this._el.className =
`tv-spinner ${t} ${this._shown ? "tv-spinner--shown" : ""}`, this
}
getEl() {
return this._el
}
destroy() {
this.stop(), delete this._el, delete this._container
}
}
},
c44N: function(e, t, i) {
"use strict";
function s(e, t) {
return e.pixelRatio === t.pixelRatio
}
i.r(t), i.d(t, "areEqualPaneRenderParams", (function() {
return s
}))
},
c7G1: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return s
})), i.d(t, "a", (function() {
return r
})), i.d(t, "c", (function() {
return n
}));
class s {
constructor(e, t) {
this.id = e, this.type = t
}
primitiveData() {
return {
action: "one",
id: this.id,
type: this.type
}
}
}
class r {
primitiveData() {
return {
action: "all"
}
}
}
class n {
constructor() {
this.erase = [], this.create = null, this._modified = !1
}
primitiveData(e) {
if (this.isNaN()) return null;
const t = {},
i = this.create && this.create.primitiveData(e);
return null !== i && (t.create = i), null !== this.erase && this.erase.length > 0 &&
(t.erase = this.erase.map(e => e.primitiveData())), void 0 === t.create &&
void 0 === t.erase ? null : t
}
setCreate(e) {
this.create = e, this.create.forEachList(e => e.setOwner(this))
}
isNaN() {
return (null === this.erase || 0 === this.erase.length) && null === this.create
}
isModified() {
return this._modified
}
setModified(e) {
this._modified = e
}
dirty() {
this._modified = !0
}
setOwner(e) {
throw new Error("Unsupported")
}
}
},
cBZt: function(e, t, i) {
"use strict";
function s(e, t) {
return `${e}@${t}`
}
function r(e) {
return e.replace(/(@[^-]+-[^-]+).*$/, "$1")
}
i.r(t), i.d(t, "studyIdString", (function() {
return s
})), i.d(t, "extractStudyId", (function() {
return r
}))
},
cKqi: function(e, t, i) {
"use strict";
var s = i("aO4+").Point,
r = i("qJq3").Series,
n = i("GVHu").Study,
o = i("FBsw").OverlayPriceAxisView,
a = i("KtbP").PanePriceAxisView,
l = i("x0JF"),
c = l.SeriesAreaPaneView,
h = l.SeriesLinePaneView,
u = l.SeriesHollowCandlesPaneView,
d = l.SeriesCandlesPaneView,
p = l.SeriesBarsPaneView,
_ = l.SeriesBaselinePaneView,
m = i("biIa").SeriesWaterlinePaneView,
f = i("2kV1").StudyStatusView,
g = i("JjUe").OverlayDataWindowView,
b = i("z8/4").OverlayLegendView,
v = i("qXYw").OverlayLegendValuesProvider,
S = i("ZsYR").OverlayStatusProvider,
y = i("38az").SeriesBarColorer,
w = i("l4sv").HorizontalLineRenderer,
P = i("Kxc7"),
C = i("6sst").OverlayStudyPriceLineAxisView,
x = i("n5al").createSeriesFormatter,
T = i("y/Xm").StudyOverlayBase,
I = i("qFKp").CheckMobile.any() && !1,
M = !P.enabled("hide_study_overlay_legend_item");
class O {
constructor(e, t) {
this._source = e, this._model = t, this._points = [new s(0, 0)], this
._lineRenderer = new w
}
update() {
if (this._visible = !1, this._source.properties().showPriceLine.value()) {
var e = this._source.lastValueData(void 0, !0);
e.noData || (this._visible = !0, this._points = [new s(0, e.coordinate)], this
._color = e.color)
}
}
renderer() {
var e = {};
return e.width = this._model.timeScale().width(), e.height = this._source
.priceScale().height(), e.y = this._points[0].y, e.color = this._color, e
.linewidth = 1, e.linestyle = CanvasEx.LINESTYLE_DOTTED, e.visible = this
._visible, this._lineRenderer.setData(e), this._lineRenderer
}
}
t.study_Overlay = class extends T {
constructor(e, t, i, s) {
super(e, t, i, s), this._formatter = null, this._paneView = null;
var r = this;
this.properties().minTick.listeners().subscribe(null, (function() {
r._recreatePriceFormattingDependencies(), r.updateAllViews(), r
._model.fullUpdate()
}))
}
_showLastValueOnPriceScale() {
return this._model.properties().scalesProperties.showSeriesLastValue.value()
}
_createViews() {
this._priceAxisViews = [];
var e = new o(this);
this._priceAxisViewsBase = [e];
var t = new C(this);
this._priceLinesAxisViews = [t], this._paneViews = [], this
._labelPaneViews = [];
var i = null,
s = null;
switch (this._properties.style.value()) {
case r.STYLE_BARS:
s = new p(this, this._model);
break;
case r.STYLE_CANDLES:
s = new d(this, this._model);
break;
case r.STYLE_HOLLOW_CANDLES:
s = new u(this, this._model);
break;
case r.STYLE_LINE:
s = new h(this, this._model);
break;
case r.STYLE_AREA:
s = new c(this, this._model);
break;
case r.STYLE_BASELINE:
s = new _(this, this._model), i = new m(this)
}
s && this._paneViews.push(s), null !== i && this._paneViews.push(i),
this._paneViews.push(new O(this, this._model)), this._dataWindowView || (
this._dataWindowView = new g(this, this._model)), this._legendView || (
this._legendView = new b(this, this._model)), this._statusView || (this
._statusView = new f(this)), this._priceAxisViews = [].concat(this
._priceAxisViewsBase, this._hlinesPriceAsisViews, this
._horizlinesPriceAsisViews), this._labelPaneViews.push(new a(e, this,
this._model))
}
barColorer() {
return new y(this)
}
start(e) {
this._formatter = null, n.prototype.start.apply(this, arguments), this
.priceScale() && this.priceScale().updateFormatter(), I && this
._setQuotesSymbol(this.symbol())
}
_tryCreateFormatter() {
return x(this.symbolInfo(), this.properties().minTick.value())
}
formatter() {
return this._formatter || this._recreateFormatter(), this._formatter
}
_tryChangeInputs() {
n.prototype._tryChangeInputs.call(this), this.m_formatter = null, this
.priceScale().updateFormatter()
}
stop(e) {
n.prototype.stop.call(this, e), this._quotesProvider.setQuotesSessionSymbol(
null)
}
_onQuotesUpdate(e, t) {
!this._legendView || void 0 === t.values.change && void 0 === t.values
.change_percent || (this._legendView.update(), this._model.updateSource(
this))
}
destroy() {
this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._quotesProvider
.destroy(), super.destroy()
}
tags() {
var e = [],
t = this.symbolInfo();
return t ? e.push(t.name) : this._properties.inputs.symbol.value() && e.push(
this._properties.inputs.symbol.value()), e
}
statusView() {
return M ? n.prototype.statusView.call(this) : null
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(61), i.e(62), i.e(
"study-property-pages-with-definitions")]).then(i.bind(null,
"WUYT"))).StudyOverlayDefinitionsViewModel
}
defaultPlotIdForAlert() {
return ""
}
changeStyles() {
this.data().each((function(e, t) {
t[TradingView.STYLE_PLOT] = null
})), n.prototype.changeStyles.call(this)
}
valuesProvider() {
return new v(this, this.model())
}
statusProvider(e) {
return new S(this, this.model())
}
canBeHiddenByGlobalFlag() {
return !1
}
}
},
cPgM: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ScaledPaneRenderer", (function() {
return s
})), i.d(t, "ScaledPaneRendererWrapper", (function() {
return r
}));
class s {
draw(e, t) {
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this._drawImpl(
e, {
...t,
pixelRatio: 1
}), e.restore()
}
drawBackground(e, t) {
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this
._drawBackgroundImpl(e, {
...t,
pixelRatio: 1
}), e.restore()
}
_drawBackgroundImpl(e, t) {}
}
class r {
constructor(e) {
this._base = e
}
hitTest(e, t) {
return this._base.hitTest(e, t)
}
draw(e, t) {
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this._base.draw(
e, {
...t,
pixelRatio: 1
}), e.restore()
}
drawBackground(e, t) {
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.translate(.5, .5), this._base
.drawBackground && this._base.drawBackground(e, {
...t,
pixelRatio: 1
}), e.restore()
}
}
},
cWHH: function(e, t, i) {
"use strict";
(function(t, s) {
var r = i("Eyy1").ensureNotNull,
n = i("Vdly"),
o = i("gP14").ChartModelBase,
a = i("CW80"),
l = a.isLineTool,
c = a.isStudyLineTool,
h = i("2+aH").Crosshair,
u = i("rY0k").Watermark,
d = i("hY3j").Grid,
p = i("22xp").TimeScale,
_ = i("qFKp").CheckMobile,
m = i("H0vP").InvalidationMask,
f = i("H0vP").InvalidationLevel,
g = i("GVHu"),
b = g.Study,
v = i("Qq0B").NonSeriesStudy,
S = i("3ClC"),
y = S.createStudy,
w = S.isStudy,
P = S.isFundamentalStudy,
C = g.prepareStudyProperties,
x = i("K4L1"),
T = i("qJq3").Series,
I = i("mMWL"),
M = i("wZIs").defaults,
O = i("Ocx9").DefaultProperty,
L = i("Qtjj").TimeSynchronizer,
A = i("txPx").getLogger("Chart.ChartModel"),
E = i("Y5iK").MainSeriesScaleRatioProperty,
k = i("FaJS").scaleRatio,
D = i("MROS").ModelSelection,
V = i("Y7w9").subtract,
B = i("VgjZ").PriceAxisRendererOptionsProvider,
R = i("/YGI").StudyInserter,
N = i("3t3b").dateFormatProperty,
j = i("/tGj").isSymbolSource,
F = i("gaBL").sourceNewCurrencyOnPinningToPriceScale,
W = i("SwuQ").sourceNewUnitOnPinningToPriceScale,
H = i("FQhm"),
U = i("i126").StudyColorRotatorFactory,
z = i("Kxc7"),
G = i("jeZR").AppliedTimeFrame,
q = z.enabled("auto_enable_symbol_labels");
z.enabled("fix_left_edge");
function Y() {
this._selection.clear()
}
function K(e) {
this._selection.remove(e)
}
function J(e, t) {
var i = this._selection.isSelected(e);
i && this._lastSelectedHittestData === t || e && !e.isSelectionEnabled() || (this
._lastSelectedHittestData = t || null, i || this._selection.add(e))
}
class Z extends o {
constructor(e, i, r, n, o, a, l, c) {
super(e, i, r, n, o, a, l, c), this._modelIntervals = [], this
._rendererOptionsProvider = new B(this), this.setStudiesMetaData(this
._studiesMetaInfoRepository.getInternalMetaInfoArray(), this
._studiesMetaInfoRepository.getMigrations()), I.init();
var _ = this;
this._panes = [], this.m_gridSource = new d;
var m = this._readOnly ? new t(M(
"chartproperties.paneProperties.crossHairProperties")) : this
._properties.paneProperties.crossHairProperties;
this.m_crossHairSource = new h(this, m, this._options.crossHair), this
.m_crossHairSource.selectPointMode().subscribe((function(e) {
if (e && _.lineBeingCreated()) {
var t = I.tool.value();
_.cancelCreatingLine(), I.tool.setValue(t)
}
})), this._tagsChanged = new s;
var f = new O("chartproperties.mainSeriesProperties");
f.addExclusion("minTick"), f.addExclusion("priceAxisProperties.lockScale"),
f.addExclusion("priceAxisProperties.percentage"), f.addExclusion(
"priceAxisProperties.indexedTo100"), f.addExclusion(
"priceAxisProperties.isInverted"), f.addExclusion(
"priceAxisProperties.log"), f.addExclusion(
"priceAxisProperties.logDisabled"), f.addExclusion(
"priceAxisProperties.percentageDisabled"), f.addExclusion(
"priceAxisProperties.autoScaleDisabled"), f.merge(r
.mainSeriesProperties.state()), this._timeScale = new p(this, this
._options.timeScale);
var g = {
countdownEnabled: this._options.countdownEnabled,
lastPriceAnimationEnabled: this._options.lastPriceAnimationEnabled
};
this.m_mainSeries = new T(this, f, g, n), this.m_mainSeries.onStyleChanged()
.subscribe(this._timeScale, this._timeScale.invalidateVisibleBars), this
.m_mainSeries.properties().showCountdown.subscribe(this, (function() {
this.m_mainSeries.updateAllViews(), this.fullUpdate()
})),
this._timeScale.visibleBarsStrictRangeChanged().subscribe(this
.m_mainSeries, this.m_mainSeries.clearHighLowAvgPriceCache), this
.createPane(void 0, {
axisProperties: f.priceAxisProperties.state(["autoScale"])
});
var b = this._panes[0];
b.setStretchFactor(2 * b.stretchFactor()), this._selection = new D, this
._selectedSourceChanged = new s, this._properties.listeners().subscribe(
this, Z.prototype.propertyChangeHandler), this._properties.timezone
.listeners().subscribe(null, (function() {
_._chartApi && _._chartApi.connected() && _._chartApi
.switchTimezone(_.timezone())
})), this._timeScale.defaultRightOffsetProperty().listeners().subscribe(
null, (function() {
_.recalculateAllPanes()
})), b.addDataSource(this.m_mainSeries, this._panes[0]
.findSuitableScale(this.m_mainSeries)), this
._mainSeriesScaleRatioProperty = new E(this), this.m_mainSeries
.dataEvents().completed().subscribe(this, function() {
this._scrollingState && this.gotoTime()
}.bind(this)), this.m_mainSeries.onIntervalChanged().subscribe(this, (
function() {
this._recalcVRStudiesParams.oldStartVisibleIndex = NaN, this
._recalcVRStudiesParams.oldEndVisibleIndex = NaN
})), this._readOnly || (f.addChild("priceAxisProperties", this
.m_mainSeries.m_priceScale.properties()), this._properties
.paneProperties.legendProperties.showStudyTitles.listeners()
.subscribe(this, (function(e) {
e.value() || _._properties.paneProperties
.legendProperties.showStudyArguments.setValue(!1)
}))), this._barsMarksSources = l(this);
for (var v = 0; v < this._barsMarksSources.length; v++) this
._barsMarksSources[v].setOwnerSource(this.m_mainSeries);
this._syncPointCache = {}, this._watermarkSource = this._options
.watermarkEnabled ? new u(this, this.m_mainSeries) : null, I
.hideAllDrawings().subscribe(this, this._onDrawingsVisibilityChanged), I
.hideAllIndicators().subscribe(this, this
._onIndicatorsVisibilityChanged), this._properties.scalesProperties
.listeners().subscribe(this, Z.prototype.fullUpdate), this
._studyInserted = new s, this._studyShiftColorStartOffset = void 0, this
._linePointBeingEdited = null, this._lineBeingEdited = null, N
.subscribe(this, this._updateDateTimeFormatter), this.mainSeries()
.properties().interval.subscribe(this, this._updateDateTimeFormatter),
this._updateDateTimeFormatter(), this._studyColorRotatorFactory = new U(
this), this._dataSourceCollectionChanged.subscribe(this, this
._updateShowLegendProperty.bind(this)), this._properties
.paneProperties.legendProperties.showLegend.subscribe(this, this
._updateShowLegendProperty), this._appliedTimeFrame = new G(this),
this.mainSeries().onTimeFrameApplied().subscribe(this, (function(e) {
var t = null !== e ? {
res: this.mainSeries().interval(),
val: e
} : null;
this.appliedTimeFrame().setValue(t)
}))
}
applyPreferences(e) {
for (var t in e) void 0 !== this._properties[t] && "m_mainSeries" !== this
._properties[t] && this._properties[t].mergeAndFire(e[t]);
void 0 !== e.timeScale && this._timeScale.defaultRightOffsetProperty()
.setValue(e.timeScale.defaultRightOffset), this._properties
.saveDefaults(), this.m_mainSeries.applyPreferences(e.mainSeries), this
.sessions().applyPreferences(e.sessions), this.recalculateAllPanes(),
this.fullUpdate()
}
setStudiesMetaData(e, t) {
this._studiesMetaData = e,
this._studyVersioning = new x(this._studiesMetaData, t)
}
isSnapshot() {
return this._isSnapshot
}
timezone() {
return this._properties.timezone.value()
}
initConnection() {
this._chartApi.switchTimezone(this.timezone())
}
updatePane(e) {
var t = this._paneInvalidationMask(e);
this.invalidate(t)
}
fullUpdate() {
this.invalidate(m.full())
}
lightUpdate() {
this.invalidate(m.light())
}
studiesMetaData() {
return this._studiesMetaData
}
studyVersioning() {
return this._studyVersioning
}
disconnect() {
this.sessions().stop();
for (var e, t = this.dataSources(), i = 0; i < t.length; i++)(e = t[i])
.disconnect && e.disconnect();
this._timeScale.disconnect()
}
restart() {
this.initConnection(), this._timeScale.reset(), this.m_mainSeries.restart();
for (var e, t = this.dataSources(), i = 0; i < t.length; i++)(e = t[i])
.restart && e !== this.m_mainSeries && e.restart();
this.sessions().restart()
}
startNotStartedStudies() {
if (!this.m_mainSeries.isStarted()) throw new Error(
"Cannot start studies: main series is not started");
for (var e = this.dataSources(), t = 0; t < e.length; t++) w(e[t]) && !e[t]
.isStarted() && e[t].restart && e[t] !== this.m_mainSeries && e[t]
.restart()
}
readOnly() {
return this._readOnly
}
properties() {
return this._properties
}
chartApi() {
return this._chartApi
}
propertyChangeHandler() {
this.lightUpdate()
}
_onDrawingsVisibilityChanged(e) {
for (var t = !1 === e.value(), i = this.dataSources(), s = 0; s < i
.length; s++) {
var r = i[s],
n = l(r) && r.properties().visible.value();
t && n ? H.emit("drawing_event", r.id(), "show") : !t && n && H.emit(
"drawing_event", r.id(), "hide")
}
this.selectionMacro((function(e) {
e.clearSelection()
}))
}
_onIndicatorsVisibilityChanged() {
var e = this.allStudies().filter((function(e) {
return e.properties().visible.value() && e
.canBeHiddenByGlobalFlag()
}));
if (0 !== e.length) {
for (var t = !1, i = 0; i < e.length; i++)
if (this.selection().isSelected(e[i])) {
t = !0;
break
} t ? this.selectionMacro((function(e) {
e.clearSelection()
})) : this.lightUpdate()
}
}
updateAllPaneViews() {
for (var e = 0; e < this._panes.length; e++) {
this._panes[e].updateAllViews()
}
}
mainSeries() {
return this.m_mainSeries
}
timeScale() {
return this._timeScale
}
gridSource() {
return this.m_gridSource
}
watermarkSource() {
return this._watermarkSource
}
crossHairSource() {
return this.m_crossHairSource
}
publishedChartsTimelineSource() {
return null
}
barsMarksSources() {
return this._barsMarksSources
}
barMarksSourceForId(e) {
for (var t = 0; t < this._barsMarksSources.length; t++)
if (this._barsMarksSources[t].id() === e) return this._barsMarksSources[
t];
return null
}
priceScaleSlotsCount() {
var e = 0,
t = 0;
this._panes.forEach((function(i) {
e = Math.max(i.leftPriceScales().length, e), t = Math.max(i
.rightPriceScales().length, t)
}));
var i = e + t;
if (_.any()) {
var s = this.paneForSource(this.mainSeries()),
r = s.priceScalePosition(this.mainSeries().priceScale()),
n = "right" === r;
return "overlay" === r && (n = s.rightPriceScales().length > 0), n ? {
left: 0,
right: 1,
totallySlots: i
} : {
left: 1,
right: 0,
totallySlots: i
}
}
return {
left: e,
right: t,
totallySlots: e + t
}
}
startScrollPrice(e, t, i) {
e.startScrollPrice(t, i)
}
scrollPriceTo(e, t, i) {
e.scrollPriceTo(t, i), this.invalidate(this._paneInvalidationMask(e, f
.Light))
}
endScrollPrice(e, t) {
e.endScrollPrice(t), this.invalidate(this._paneInvalidationMask(e, f.Light))
}
setPriceAutoScale(e, t, i) {
e.setPriceAutoScale(t, i), this.invalidate(this._paneInvalidationMask(e, f
.Light))
}
updateScales(e, t) {
this._undoModel._chartWidget._updateScalesActions()
}
mainSeriesScaleRatioProperty() {
return this._mainSeriesScaleRatioProperty
}
mainSeriesScaleRatioPropertyOnChanged() {
this._mainSeriesScaleRatioProperty.listeners().fire(this
._mainSeriesScaleRatioProperty)
}
mainSeriesScaleRatio() {
return k(this._timeScale, this.m_mainSeries.priceScale())
}
setMainSeriesScaleRatio(e) {
this.paneForSource(this.m_mainSeries).applyPriceScaleRatio(this.m_mainSeries
.priceScale(), e)
}
startScrollTime(e) {
this._timeScale.startScroll(e), this._isTimeScrolling = !0
}
scrollTimeTo(e) {
this._timeScale.scrollTo(e), this.recalculateAllPanes(), this.lightUpdate(),
this._setScalesResetAvailable(!0)
}
endScrollTime() {
this._timeScale.endScroll(), this.lightUpdate(), this
.recalcVisibleRangeStudies(), this._isTimeScrolling = !1
}
recalcStudyBasedLineTools() {
this.dataSources().forEach((function(e) {
c(e) && e.recalcStudyIfNeeded && e.recalcStudyIfNeeded()
}))
}
restoreTimeScaleState(e) {
this._timeScale.restoreState(e), this.recalculateAllPanes(), this
.lightUpdate(), this._setScalesResetAvailable(!0)
}
restoreFactoryDefaults(e) {
e.restoreFactoryDefaults(), this.recalcVisibleRangeStudies(!0)
}
selectionMacro(e) {
var t = this.selection().allSources();
e({
removeSourceFromSelection: K.bind(this),
addSourceToSelection: J.bind(this),
clearSelection: Y.bind(this),
selection: this.selection.bind(this)
});
var i = V(t, this.selection().allSources()),
s = V(this.selection().allSources(), t);
s.concat(t).forEach((function(e) {
e.updateAllViews()
})), i.forEach((function(e) {
var t = e.hasAlert && e.hasAlert.value() && e
.getAlertSync();
t && t.set("selected", !1)
})), s.forEach((function(e) {
var t = e.hasAlert && e.hasAlert.value() && e
.getAlertSync();
t && t.set("selected", !0)
})), this.lightUpdate(), (i.length > 0 || s.length > 0) && this
._selectedSourceChanged.fire()
}
checkLineToolSelection() {
this._selection.checkLineToolSelection()
}
onSelectedSourceChanged() {
return this._selectedSourceChanged
}
selection() {
return this._selection
}
orderedDataSources(e) {
var t = [];
t.push(this.m_crossHairSource);
for (var i = 0; i < this._panes.length; i++) {
var s = this._panes[i].sourcesByGroup().all().slice();
e && s.reverse(), t = t.concat(s)
}
return t
}
dataSourceForId(e) {
for (var t, i = 0; i < this._panes.length; ++i)
if (t = this._panes[i].dataSourceForId(e)) return t;
return null
}
children(e, t) {
return this.dataSources().filter((function(i) {
return (!0 !== t || !w(i) || !i.isChildStudy()) && i
.ownerSource() === e
}))
}
onSyncScrollNeeded(e) {
var t = this._undoModel._chartWidget;
if (t._chartWidgetCollection) {
var i = this.mainSeries().syncModel();
if (i) {
var s = 1e3 * this._timeScale.points().roughTime(e, i.projectTime
.bind(i));
t._chartWidgetCollection.syncScroll(s, this)
}
}
}
createSyncPoint(e, t) {
var i = this._syncPointCache[e.uniqueId()];
if (i) {
var s = i[t.uniqueId()];
if (s) return s
} else this._syncPointCache[e.uniqueId()] = {};
var r = new L(e, t);
return this._syncPointCache[e.uniqueId()][t.uniqueId()] = r, r
}
updateTimeScale(e, t, i, s, r, n, o) {
if (o) {
this._timeScale.reset();
for (var a = this.dataSources(), l = 0; l < a.length; l++) a[l]
.clearData && a[l].clearData()
}
if (s.length > 0)
for (a = this.dataSources(), l = 0; l < a.length; l++) a[l].moveData &&
a[l].moveData(s);
var c = this._timeScale.indexToTimePoint(this._timeScale.baseIndex());
this._timeScale.update(e, t, i, n);
var h = "ChartModel.prototype.updateTimeScale(" + e + "," + t + "," + i
.length + "," + s.length + "," + n.length + "," + o + ")";
if (h += "TimeScale: {first:" + this._timeScale.points().firstIndex() +
",last:" + this._timeScale.points().lastIndex() + "}", void 0 !== r) {
var u = this._timeScale.indexToTimePoint(r),
d = null !== c && null !== u && u > c;
this._updateBaseIndex(r, d)
}
A.logDebug(h), this.recalculateAllPanes(), this.lightUpdate()
}
updateTimeScaleBaseIndex(e) {
var t = this.mainSeries().bars();
t.isEmpty() || this._updateBaseIndex(r(t.lastIndex()), e && e.index > 0)
}
_updateBaseIndex(e, t) {
var i = this.timeScale(),
s = i.baseIndex(),
r = i.visibleBarsStrictRange(),
n = i.logicalRange();
if (null !== n && t) {
var o = n.contains(s),
a = e - s,
l = o ? null : i.rightOffset() - a;
if (!this._options.shiftVisibleRangeOnNewBar && o) {
var c = i.indexToCoordinate(s) + i.barSpacing() / 2 + 1,
h = s - n.left() + a,
u = c / h;
if (u >= i.minBarSpacing()) i.setBarSpacing(u), l = i.width() / u -
h;
else r.lastBar() !== s && (l = i.rightOffset() - a)
}
null !== l && i.setRightOffset(l)
}
i.setBaseIndex(e)
}
recalculatePane(e) {
e && e.recalculate()
}
recalculateAllPanes() {
for (var e = 0; e < this._panes.length; ++e) this._panes[e].recalculate();
this.updateAllPaneViews(), this.crossHairSource().updateAllViews()
}
_invalidateBarColorerCaches() {
for (var e = this.dataSources(), t = 0; t < e.length; ++t) {
var i = e[t];
i instanceof T && i.invalidateBarColorerCache()
}
}
createStudyInserter(e) {
return new R(e, this._studiesMetaInfoRepository, {
createStudy: this.insertStudyWithParams.bind(this)
})
}
insertStudyWithParams(e, t, i, s, r, o, a, l, c, h, u) {
null == o && (o = this.mainSeries());
var d = null;
if (!r && void 0 !== e.groupingKey) {
var p = this.findNonOverlayStudyWithGroupingKey(e.groupingKey);
null !== p && (d = p.pane)
}
null === d && (r || e.is_price_study ? d = this.paneForSource(o) : (d = this
.createPane(), void 0 !== h && d.setPaneSize(h))),
"Compare@tv-basicstudies" === e.id && this.m_mainSeries.priceScale()
.setMode({
log: !1,
percentage: !0
});
var _ = Object.assign({}, s, {
inputs: t
}),
m = C(e, _, d, this.studyVersioning(), o),
f = y(this, m, o, e, u);
this._recalcVisibleRangeStudiesImpl({
studies: [f],
oldEndVisibleIndex: -1,
oldStartVisibleIndex: -1,
force: !0,
timerId: null
});
var g = d.findSuitableScale(f, o, a);
if (g === this.mainSeries().priceScale() && j(f)) {
var b = l ? F(f, g, this, !0) : null,
v = c ? W(f, g, this, !0) : null;
null === b && null === v || f.setSymbolCurrencyUnit(void 0, b || void 0,
v || void 0)
}
return j(f) && d.hasDataSource(this.mainSeries()) && q && !n.getBool(
"enable_symbol_labels_on_inserting_compare_once", !1) && (this
.properties().scalesProperties.showSymbolLabels.setValue(!0), n
.setValue("enable_symbol_labels_on_inserting_compare_once", !0)), f
.start(), null !== i && d.id() === i.paneId ? d.insertDataSource(f, g, i
.zorder) : d.addDataSource(f, g), f.properties().linkedToSeries && f
.properties().linkedToSeries.value() && f.setOwnerSource(this
.mainSeries()), this.recalculatePane(d), this.fullUpdate(), this
._invalidateBarColorerCaches(), this._recalcVisibleRangeStudiesImpl({
studies: [f],
force: !0
}), this._recalcColorStudiesImpl({
studies: [f],
force: !0
}),
this._studyInserted.fire(f), f
}
studyInserted() {
return this._studyInserted
}
detachSource(e, t) {
var i = this.paneForSource(e);
if (i) return i.removeDataSource(e), i.isEmpty() ? (this
._lineBeingCreated && i === this._paneBeingCreatedLineOn && this
.cancelCreatingLine(), this.removePane(i, t), !0) : (this
.fullUpdate(), !1)
}
removeSource(e, t) {
this.selectionMacro((function(t) {
t.removeSourceFromSelection(e)
})), this._sourcesBeingMoved.includes(e) && (this._sourcesBeingMoved =
this._sourcesBeingMoved.filter((function(t) {
return t !== e
})), this._sourcesBeingMoved.length || (this._lineItemBeingMoved =
null)), e === this._lineBeingEdited && (this._lineBeingEdited =
null, I.isToolEditingNow.setValue(!1)), e === this
._lineBeingCreated && (this._lineBeingCreated = null, I
.isToolCreatingNow.setValue(!1)), e.stop && e.stop();
var i = this.detachSource(e, t);
const s = this.mainSeries().priceScale();
return w(e) && j(e) && e.priceScale() === s && s.isPercentage() && 1 === s
.seriesLikeSources().length && s.setMode({
percentage: !1
}), this.fullUpdate(), this._invalidateBarColorerCaches(), w(e) && (H
.emit("study_event", e.id(), "remove"), e.isChildStudy() && e
.source().unsetChild(e)), e.destroy && e.destroy(), l(e) && H.emit(
"drawing_event", e.id(), "remove"), i
}
_unmergeAvailable(e) {
return e === this.m_mainSeries || TradingView.isInherited(e.constructor,
b) && !e.isLinkedToSeries() && !TradingView.isInherited(e
.constructor,
v) && e.showInObjectTree()
}
isMergeUpAvailableForSource(e) {
return !!this._unmergeAvailable(e) && this.paneForSource(e) !== this
.panes()[0]
}
isMergeDownAvailableForSource(e) {
if (!this._unmergeAvailable(e)) return !1;
var t = this.paneForSource(e),
i = this.panes();
return t !== i[i.length - 1]
}
isUnmergeAvailableForSource(e) {
return !!this._unmergeAvailable(e) && this.paneForSource(e).dataSources()
.filter(this._unmergeAvailable, this).length > 1
}
lineBeingEdited() {
return this._lineBeingEdited
}
linePointBeingEdited() {
return this._linePointBeingEdited
}
calculateDefaultTags() {
for (var e = [], t = this.dataSources(), i = 0; i < t.length; i++) {
var s = t[i];
s.tags && (e = e.concat(s.tags()))
}
return e
}
_sendTo(e, t) {
var i = {},
s = this;
for (var r in e.forEach((function(e) {
var t = s.paneForSource(e),
r = s._panes.indexOf(t);
i[r] || (i[r] = []), i[r].push(e)
})), i) {
t(s._panes[r], i[r])
}
this.fullUpdate()
}
sendToBack(e) {
this._sendTo(e, (function(e, t) {
e.sendToBack(t)
}))
}
bringToFront(e) {
this._sendTo(e, (function(e, t) {
e.bringToFront(t)
}))
}
clearAllStudies() {
for (var e = this.dataSources(), t = 0; t < e.length; t++) e[t].clearData &&
e[t].clearData()
}
allLineTools() {
return this._getAllSources(l)
}
getStudyById(e) {
var t = this.dataSourceForId(e);
return null !== t && w(t) ? t : null
}
getLineToolById(e) {
var t = this.dataSourceForId(e);
return null !== t && l(t) ? t : null
}
getStudyById(e) {
var t = this.dataSourceForId(e);
return t instanceof b ? t : null
}
_initAlertsList() {
throw new Error("Not implemented")
}
_addAlertLabelToChart(e) {
throw new Error("Not implemented")
}
_removeAlertLabelFromChart(e) {
throw new Error("Not implemented")
}
_removeAllAlertLabelsFromChart() {
throw new Error("Not implemented")
}
getAlertsList() {
return Promise.resolve(null)
}
resetAlertList() {}
setInterval(e, t) {
var i = setInterval(e, t);
return this._modelIntervals.push(i), i
}
clearInterval(e) {
clearInterval(e);
var t = this._modelIntervals.indexOf(e);
t > -1 && this._modelIntervals.splice(t, 1)
}
clearIntervals() {
for (var e = 0; e < this._modelIntervals.length; e++) clearInterval(this
._modelIntervals[e]);
this._modelIntervals = []
}
destroy() {
this.mainSeries().properties().childs().showCountdown.unsubscribeAll(this),
this.mainSeries().onTimeFrameApplied().unsubscribeAll(this), this
._appliedTimeFrame.destroy();
for (var e = 0; e < this._barsMarksSources.length; e++) this
._barsMarksSources[e].destroy();
this.clearIntervals(), I.hideAllDrawings().unsubscribe(this, this
._onDrawingsVisibilityChanged), I.hideAllIndicators().unsubscribe(
this, this._onIndicatorsVisibilityChanged), this
.resetDeferredStudies();
for (e = 0; e < this._barsMarksSources.length; e++) this._barsMarksSources[
e].destroy();
for (e = 0; e < this._panes.length; e++) this._panes[e].destroy();
this._panes.length = 0, this._sessions = null, this.m_mainSeries
.onStyleChanged().unsubscribe(this._timeScale, this._timeScale
.invalidateVisibleBars), this._timeScale
.visibleBarsStrictRangeChanged().unsubscribe(this.m_mainSeries, this
.m_mainSeries.clearHighLowAvgPriceCache), this._timeScale.destroy(),
N.unsubscribe(this, this._updateDateTimeFormatter), this.mainSeries()
.properties().interval.unsubscribe(this, this._updateDateTimeFormatter),
this._trendLineStatsCache && this._trendLineStatsCache.destroy(), this
._fibRetracementLabelsCache && this._fibRetracementLabelsCache
.destroy(), this._properties.paneProperties.legendProperties.showLegend
.unsubscribeAll(this), this._dataSourceCollectionChanged.unsubscribeAll(
this), this.m_crossHairSource.destroy(), super.destroy()
}
countUserStudies(e) {
var t = 0;
e = e || {};
for (var i = 0; i < this._panes.length; i++)
for (var s = this._panes[i].dataSources(), r = 0; r < s.length; r++) {
var n = s[r];
if (w(n) && !P(n) && n.showInObjectTree()) {
var o = n.metaInfo && n.metaInfo();
if (o) {
var a = o.id;
if (e.dontCountVolume && "Volume@tv-basicstudies" === a)
continue;
if (e.dontCountCompare && "Compare@tv-basicstudies" === a)
continue;
if (e.dontCountOverlay && "Overlay@tv-basicstudies" === a)
continue
}
t++
}
}
return t
}
isJustClonedChart() {
return this._undoModel.isJustClonedChart()
}
restoreSource(e, t, i, s, r) {
var n, o;
n = e ? this.createPane(t) : this.panes()[t];
var a = s.type.toLowerCase().startsWith("study");
if (!(o = a ? n.restoreStudy(s) : n.restoreLineTool(s))) return null;
var l = null;
s.ownerSource && (l = n.dataSourceForId(s.ownerSource)), o.setOwnerSource(
l);
var c = null;
if (r ? c = n.getPriceScaleById(r.id) : o.ownerSource() && (c = o
.ownerSource().priceScale()), c) o.setPriceScale(c), c
.addDataSource(o);
else {
c = n.createPriceScaleAtPosition(r.position, r.priceScaleIndex);
r && r.id && c.setId(r.id), o.setPriceScale(c), c.addDataSource(o)
}
if (!e && i && i.overlayPriceScales) {
var h = this.dataSources().filter((function(e) {
return void 0 !== i.overlayPriceScales[e.id()]
}));
h.forEach(n.removeSourceFromPriceScale.bind(n));
var u = new Map;
h.forEach((function(e) {
var t, s = i.overlayPriceScales[e.id()];
u.has(s.id) ? t = u.get(s.id) : ((t = n
.createPriceScaleAtPosition("overlay"))
.restoreState(s), u.set(s.id, t)), t
.addDataSource(e), e.setPriceScale(t)
}))
}
return o.start(), o.restore && o.restore(), e && n.restoreState(i, !1, this
.version()),
a && (this.recalculateAllPanes(), this.mainSeries()
.invalidateBarColorerCache(), this.fullUpdate()), o
}
selectPointMode() {
return this.m_crossHairSource.selectPointMode()
}
cancelRequestSelectPoint() {
this.m_crossHairSource.cancelRequestSelectPoint()
}
requestSelectPoint(e, t) {
return this.m_crossHairSource.requestSelectPoint(e, t)
}
onPointSelected() {
return this.m_crossHairSource.onPointSelected()
}
isSeriesStyleSupported(e) {
return this.m_mainSeries.isStyleSupported(e)
}
getStudyShiftColorStartOffset() {
return this._studyShiftColorStartOffset
}
setStudyShiftColorStartOffset(e) {
this._studyShiftColorStartOffset = e
}
isInReplay() {
return this.m_mainSeries.isInReplay()
}
onInReplayStateChanged() {
return new s
}
switchToReplay(e, t) {
0
}
switchToRealtime() {
0
}
rendererOptionsProvider() {
return this._rendererOptionsProvider
}
priceAxisRendererOptions() {
return this._rendererOptionsProvider.options()
}
magnet() {
return this._magnet
}
isPriceScaleVisible(e) {
var t = this.paneForSource(e.mainSource()),
i = t.priceScalePosition(e);
if ("overlay" === i) return !0;
var s = this.priceScaleSlotsCount();
return t.priceScaleIndex(e, i) < s[i]
}
studyMetaInfoRepository() {
return this._studiesMetaInfoRepository
}
studiesColorRotatorFactory() {
return this._studyColorRotatorFactory
}
}
e.exports = Z
}).call(this, i("tc+8"), i("aIyQ"))
},
cZRT: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
class s {
constructor() {
this._retries = 5, this._cache = null, this._tryLoad = e => {
this._retries = this._retries - 1;
this._startLoading().then(e, 0 !== this._retries ? () => setTimeout(() =>
this._tryLoad(e), 3e3) : void 0)
}
}
load() {
return this._cache || (this._cache = new Promise(this._tryLoad)), this._cache
}
}
},
cdbK: function(e, t, i) {
"use strict";
function s(e) {
return Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(12), i
.e(16), i.e(17), i.e(23), i.e(34), i.e(42), i.e(43), i.e(49), i.e(50), i.e(76),
i.e(0), i.e(2), i.e(5), i.e(7), i.e(10), i.e(15), i.e(32), i.e(40), i.e(46), i
.e("go-to-date-dialog-impl")
]).then(i.bind(null, "uUY/")).then(t => t.showGoToDateDialog(e))
}
i.r(t), i.d(t, "showGoToDateDialog", (function() {
return s
}))
},
cgFQ: function(e, t, i) {
"use strict";
var s = i("Tmoa"),
r = i("ikwP");
const n = /[1-9]/g;
class o {
constructor() {
this._data = null
}
setData(e) {
this._data = e
}
draw(e, t, i) {
if (null === this._data || !this._data.visible || 0 === this._data.text.length)
return;
const s = this._data;
e.font = t.font;
const o = Math.round(t.widthCache.measureText(e, s.text, n));
if (o <= 0) return;
e.save();
const a = t.paddingHorizontal,
l = o + 2 * a,
c = l / 2;
let h = s.coordinate,
u = Math.floor(h - c) + .5;
if (s.alwaysInViewPort) {
const e = s.width;
u < 0 ? (h += Math.abs(0 - u), u = Math.floor(h - c) + .5) : u + l > e && (h -=
Math.abs(e - (u + l)), u = Math.floor(h - c) + .5)
}
const d = u + l,
p = Math.ceil(0 + t.borderSize + t.offsetSize + t.paddingTop + t.fontSize + t
.paddingBottom);
e.fillStyle = s.background;
const _ = Math.round(u * i),
m = Math.round(0 * i),
f = Math.round(d * i),
g = Math.round(p * i),
b = Math.round(2 * i);
e.beginPath(), e.moveTo(_, m), e.lineTo(_, g - b), e.arcTo(_, g, _ + b, g, b), e
.lineTo(f - b, g), e.arcTo(f, g, f, g - b, b), e.lineTo(f, m), e.fill();
const v = 0 + t.borderSize + t.offsetSize + t.paddingTop + t.fontSize / 2;
e.textAlign = "left", e.textBaseline = "middle", e.fillStyle = s.color;
const S = t.widthCache.yMidCorrection(e, "Apr0");
e.translate((u + a) * i, (v + S) * i), Object(r.drawScaled)(e, i, () => e.fillText(s
.text, 0, 0)), e.restore()
}
}
i.d(t, "a", (function() {
return a
}));
class a {
constructor(e) {
this._renderer = new o, this._rendererData = {
background: "",
color: "",
coordinate: 0,
text: "",
visible: !1,
width: 0,
alwaysInViewPort: !0
}, this._invalidated = !0, this._model = e, this._renderer.setData(this
._rendererData)
}
update() {
this._invalidated = !0
}
renderer() {
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
._renderer
}
coordinate() {
return this._rendererData.coordinate
}
_getAlwaysInViewPort() {
return !0
}
_updateImpl() {
const e = this._rendererData;
if (e.visible = !1, this._model.timeScale().isEmpty()) return;
const t = this._getIndex();
if (null === t) return;
e.visible = !0, e.width = this._model.timeScale().width(), e.background = this
._getBgColor(), e.color = Object(s.colorFromBackground)(e.background), e
.coordinate = this._model.timeScale().indexToCoordinate(t), e.alwaysInViewPort =
this._getAlwaysInViewPort();
const i = this._model.timeScale().indexToUserTime(t);
e.text = null !== i ? this._model.dateTimeFormatter().format(i) : "", this
._invalidated = !1
}
}
},
d700: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return r
})), i.d(t, "a", (function() {
return n
}));
var s = i("/3z9");
function r(e) {
if ("INPUT" === e.tagName) {
const t = e.type;
return "text" === t || "email" === t || "number" === t || "password" === t ||
"search" === t || "tel" === t || "url" === t
}
return "TEXTAREA" === e.tagName || e.isContentEditable
}
function n(e, t) {
if (!t) return !1;
const i = 255 & e;
if (27 === i || i >>> 4 == 7) return !1;
switch (e ^ i) {
case s.Modifiers.Alt:
return (38 === i || 40 === i) && "SELECT" === t.tagName || r(t);
case s.Modifiers.Alt + s.Modifiers.Shift:
return r(t);
case s.Modifiers.Mod:
if (67 === i || !s.isMacKeyboard && 45 === i) {
const e = t.ownerDocument && t.ownerDocument.getSelection();
if (e && !e.isCollapsed) return !0
}
return r(t);
case s.Modifiers.Mod + s.Modifiers.Shift:
return i >= 33 && i <= 40 && r(t);
case s.Modifiers.Shift:
case 0:
return !!(9 !== i || t.ownerDocument && t !== t.ownerDocument.body && t !== t
.ownerDocument.documentElement) && ((13 === i || 32 === i || ! function(e) {
if ("BUTTON" === e.tagName) return !0;
if ("INPUT" === e.tagName) {
const t = e.type;
if ("submit" === t || "button" === t || "reset" === t ||
"checkbox" === t || "radio" === t) return !0
}
return !1
}(t)) && ("form" in t || t.isContentEditable))
}
return !1
}
},
dDSx: function(e, t, i) {
"use strict";
(function(e) {
var s = i("Ss5c").LineDataSource,
r = i("//lZ").doAnimate,
n = i("onDC").ChartUndoModelBase,
o = (i("Ocx9").saveDefaultProperties, i("GVHu").Study),
a = i("8sOK").StudyStub,
l = i("vwKG").showTooManyStudiesNotice,
c = (i("RDU5").UndoCommand, i("YlKu").ApplyLineToolTemplateUndoCommand),
h = i("s9sR").SetResolutionUndoCommand,
u = i("FKaq").SetPriceScaleSelectionStrategyCommand,
d = i("CsKN").SetScaleRatioPropertiesCommand,
p = i("/YGI").StudyInserter,
_ = i("JWMC").trackEvent,
m = i("txPx").getLogger("Chart.ChartUndoModel"),
f = i("QTwd").RestoreDefaultsPreferencesUndoCommand,
g = i("bJYc").SetPropertyUndoCommand,
b = i("pOzK").SetPriceScaleModeCommand,
v = i("7MWe").PriceScaleChangeUndoCommand,
S = i("LxhU").Interval,
y = i("ri5u").ChartLoadThemeUndoCommand;
t.ChartUndoModel = class extends n {
constructor(t, i, s, r, n, o, a, l, c) {
super(t, i, s, r, n, o, a, l, c), this._onSimpleZoomIn = new e, this
._onSimpleZoomOut = new e, this.beginUndoMacro = a.beginUndoMacro
.bind(a), this.endUndoMacro = a.endUndoMacro.bind(a), this
.createUndoCheckpoint = a.createUndoCheckpoint.bind(a), this
.undoToCheckpoint = a.undoToCheckpoint.bind(a)
}
version() {
return this.m_model.version()
}
onData(e) {
switch (e.method) {
case "timescale_update":
var t = e.params;
this.m_model.updateTimeScale(t.index, t.zoffset, t.changes, t
.index_diff, t.baseIndex, t.marks, t.clear);
break;
case "timescale_completed":
var i = e.params[0];
this.m_model.timeScale().onTimeScaleCompleted(i)
}
}
paneForSource(e) {
return this.m_model.paneForSource(e)
}
createPane(e) {
return this.m_model.createPane(e)
}
readOnly() {
return this.m_model.readOnly()
}
restart() {
this.m_model.restart()
}
disconnect() {
this.m_model.disconnect()
}
studiesMetaData() {
return this.m_model.studiesMetaData()
}
studyVersioning() {
return this.m_model.studyVersioning()
}
chartModel() {
return this._model()
}
_model() {
return this.m_model
}
pushUndoCommand(e) {
this._pushUndoCommand(e)
}
_pushUndoCommand(e) {
this._undoHistory.pushUndoCommand(e)
}
startScrollPrice(e, t, i) {
t.isAutoScale() || (this._initialPriceScrollState = t.state(), this
._initialPriceScrollPos = i, this.chartModel().startScrollPrice(
e, t, i))
}
scrollPriceTo(e, t, i) {
t.isAutoScale() || (this._initialPriceScrollPos && Math.abs(this
._initialPriceScrollPos - i) > 20 && (this.pushUndoCommand(
new v(this.m_model, e, t, this._initialPriceScrollState)
), delete this._initialPriceScrollState, delete this
._initialPriceScrollPos), this.chartModel().scrollPriceTo(e,
t, i))
}
endScrollPrice(e, t) {
t.isAutoScale() || (delete this._initialPriceScrollState, delete this
._initialPriceScrollPos, this.chartModel().endScrollPrice(e, t))
}
setPriceAutoScale(e, t, i) {
this.pushUndoCommand(new v(this.m_model, e, t, t.state())), this
.chartModel().setPriceAutoScale(e, t, i)
}
setWidth(e) {
this.m_model.setWidth(e)
}
setPaneHeight(e, t) {
this.m_model.setPaneHeight(e, t)
}
gridSource() {
return this.m_model.gridSource()
}
watermarkSource() {
return this.m_model.watermarkSource()
}
addAlertsSource(e) {
return this.m_model.addAlertsSource(e)
}
alertsSources() {
return this.m_model.alertsSources()
}
publishedChartsTimelineSource() {
return this.m_model.publishedChartsTimelineSource()
}
barsMarksSources() {
return this.m_model.barsMarksSources()
}
barMarksSourceForId(e) {
return this.m_model.barMarksSourceForId(e)
}
crossHairSource() {
return this.m_model.crossHairSource()
}
model() {
return this.m_model
}
chartWidget() {
return this._chartWidget
}
mainSeries() {
return this.m_model.m_mainSeries
}
mainSeriesScaleRatioProperty() {
return this.m_model.mainSeriesScaleRatioProperty()
}
panes() {
return this.m_model.panes()
}
timeScale() {
return this.m_model.timeScale()
}
selectionMacro(e) {
return this.m_model.selectionMacro(e)
}
setHoveredSource(e, t) {
this.m_model.setHoveredSource(e, t)
}
selection() {
return this.m_model.selection()
}
onSelectedSourceChanged() {
return this.m_model.onSelectedSourceChanged()
}
hoveredSource() {
return this.m_model.hoveredSource()
}
activeStrategySource() {
return this.m_model.activeStrategySource()
}
invalidate(e) {
this.m_model.invalidate(e)
}
setCurrentPosition(e, t, i, s) {
this.m_model.setCurrentPosition(e, t, i, s)
}
setAndSaveCurrentPosition(e, t, i, s) {
this.m_model.setAndSaveCurrentPosition(e, t, i, s)
}
canCreateStudy(e) {
return this.model().chartApi().chartApi().isCanCreateStudy(e)
}
_isCountedStudy(e) {
throw new Error("Not implemented")
}
checkIfFeatureAvailable(e, t) {
var i = this.canCreateStudy(),
s = t && t instanceof o;
return !this.readOnly() && s && (i = this.canCreateStudy(!0)), !!i || (
s || l(), !1)
}
createStudyInserter(e, t, i) {
var s = this,
r = null,
n = {
createStudy: function(e, t, i, n, o, a, l, c, h, u, d) {
return s.checkIfFeatureAvailable(e, a) ? (_("studies",
"Study_" + e.id),
"Compare@tv-basicstudies" === e.id && _(
"compare", "symbol:" + t.symbol), s
._insertStudy(e, t, n, o, a, l, c, h, u, r, d)
) : (m.logNormal("Cannot insert study " + e.id),
null)
}
};
void 0 !== i && (n.createStub = function() {
var e = s.m_model.insertStudyStub(i);
return r = {
targetPaneId: s.m_model.paneForSource(e).id(),
targetZOrder: e.zorder()
}, e.id()
}, n.removeStub = function(e) {
return s.m_model.removeStudyStub(e)
});
var o = new p(e, this.m_model._studiesMetaInfoRepository, n);
return o.setParentSource(t), o
}
setProperty(e, t, i, s) {
if (e && e.value() !== t) {
var r = new g(e, t, i, this.m_model, s);
this.pushUndoCommand(r), this.emitEvent("setProperty")
}
}
setProperties(e, t, i) {
var s = this;
this.beginUndoMacro(i), this.m_model.selectionMacro((function() {
for (var r = 0; r < e.length; r++) s.setProperty(e[r],
t[r], i)
})), this.endUndoMacro()
}
setPriceScaleMode(e, t, i) {
for (var s = Object.keys(e), r = t.mode(), n = !1, o = 0; o < s
.length; o++)
if (r[s[o]] !== e[s[o]]) {
n = !0;
break
} if (n) {
var a = new b(e, t, i, this.m_model);
this.pushUndoCommand(a)
}
}
setPriceScaleSelectionStrategy(e) {
if (this.m_model.properties().priceScaleSelectionStrategyName
.value() !== e) {
_("Chart", "Change PriceScale Selection Strategy");
var t = "Set Price Scale Selection Stretegy to " + e;
this.beginUndoMacro(t), this.setProperty(this.m_model.properties()
.priceScaleSelectionStrategyName, e, t);
var i = new u(this.m_model, e, t);
this.pushUndoCommand(i), this.endUndoMacro()
}
}
setScaleRatioProperty(e, t, i) {
if (e.value() !== t) {
var s = new d(e, t, i, this.m_model);
this.pushUndoCommand(s)
}
}
setResolutionProperty(e, t, i, s) {
if (!S.isEqual(e.value(), t)) {
var r = new h(e, t, i, s);
this.pushUndoCommand(r)
}
}
lineBeingCreated() {
return this.m_model.lineBeingCreated()
}
paneBeingCreatedLineOn() {
return this.m_model.paneBeingCreatedLineOn()
}
cancelCreatingLine() {
this.m_model.cancelCreatingLine()
}
lineCancelled() {
return this.m_model.lineCancelled()
}
lineBeingEdited() {
return this.m_model.lineBeingEdited()
}
sourcesBeingMoved() {
return this.m_model.sourcesBeingMoved()
}
dataSources() {
return this.m_model.dataSources()
}
orderedDataSources(e) {
return this.m_model.orderedDataSources(e)
}
dataSourceForId(e) {
return this.m_model.dataSourceForId(e)
}
state(e, t, i, s) {
return this.m_model.state(e, t, i, s)
}
asyncState() {
return this.m_model.asyncState()
}
calculateDefaultTags() {
return this.m_model.calculateDefaultTags()
}
onTagsChanged() {
return this.m_model.onTagsChanged()
}
_removeAllStudiesImpl() {
for (var e = this.m_model.dataSources(), t = 0; t < e.length; t++) {
var i = e[t];
(TradingView.isInherited(i.constructor, o) && !i.isChildStudy() && i
.removeByRemoveAllStudies() || TradingView.isInherited(i
.constructor, a)) && this.removeSource(i)
}
}
removeAllStudies() {
this.beginUndoMacro(window.t("Remove all studies")), this
._removeAllStudiesImpl(), this.endUndoMacro()
}
_removeAllDrawingToolsImpl(e) {
var t = this;
this.selectionMacro((function() {
t.lineBeingCreated() && t.cancelCreatingLine();
for (var i = t.dataSources(), r = 0; r < i
.length; r++) {
var n = i[r];
TradingView.isInherited(n.constructor, s) && n
.isActualSymbol() && n.isUserDeletable() && (
e && e !== n.toolname || t.removeSource(n))
}
}))
}
removeAllDrawingTools(e) {
this.beginUndoMacro(window.t("Remove Drawings")), this
._removeAllDrawingToolsImpl(), this.endUndoMacro()
}
removeAllStudiesAndDrawingTools() {
this.beginUndoMacro(window.t("Remove all studies and drawing tools")),
this._removeAllDrawingToolsImpl(), this._removeAllStudiesImpl(),
this.endUndoMacro()
}
moveLeft() {
try {
this.beginUndoMacro("Move Left")
} catch (e) {
return
}
var e = this.m_model.timeScale().width(),
t = this;
r({
to: e / 5,
onStep: function(e) {
t.startScrollTime(e), t.scrollTimeTo(0), t
.endScrollTime()
},
onComplete: function() {
t.endUndoMacro()
}
})
}
moveRight() {
try {
this.beginUndoMacro("Move Right")
} catch (e) {
return
}
var e = this.m_model.timeScale().width(),
t = this;
r({
to: e / 5,
onStep: function(e) {
t.startScrollTime(0), t.scrollTimeTo(e), t
.endScrollTime()
},
onComplete: function() {
t.endUndoMacro()
}
})
}
scrollChart(e) {
this.m_model.scrollEnabled() && (this.startScrollTime(0), this
.scrollTimeTo(e), this.endScrollTime())
}
scrollChartByBar(e) {
if (this.m_model.scrollEnabled()) {
var t = e * this.m_model.timeScale().barSpacing();
this.startScrollTime(0), this.scrollTimeTo(t), this.endScrollTime()
}
}
restorePreferences() {
var e = new f(this.model());
this.pushUndoCommand(e)
}
applyPreferences(e) {
throw new Error("Not implemented")
}
chartLoadTheme(e, t, i, s) {
var r = new y(e, t, i);
s ? r.redo() : this.pushUndoCommand(r)
}
applyLineToolTemplate(e, t, i) {
this.beginUndoMacro(i), this.saveLineToolState(e, i);
var s = new c(e, t, i);
this.pushUndoCommand(s), this.saveLineToolState(e, i), this
.endUndoMacro(), this.model().updateSource(e)
}
onSimpleZoomIn() {
return this._onSimpleZoomIn
}
onSimpleZoomOut() {
return this._onSimpleZoomOut
}
getAlertsList() {
return this.m_model.getAlertsList()
}
isJustClonedChart() {
return this._chartWidget.isJustClonedChart()
}
trackTime() {
return this._chartWidget.trackTime()
}
isInReplay() {
return this.m_model.isInReplay()
}
switchToReplay(e, t) {}
switchToRealtime() {}
togglePriceScaleAutoScaleMode(e) {
var t = {
autoScale: !e.isAutoScale()
};
this.setPriceScaleMode(t, e, "Auto Scale")
}
togglePriceScaleLockScaleMode(e) {
var t = {
lockScale: !e.isLockScale()
};
this.setPriceScaleMode(t, e, "Lock Scale")
}
setPriceScaleRegularScaleMode(e) {
this.setPriceScaleMode({
log: !1,
percentage: !1,
indexedTo100: !1
}, e, "Regular")
}
togglePriceScaleIndexedTo100ScaleMode(e) {
var t = {
indexedTo100: !e.isIndexedTo100()
};
this.setPriceScaleMode(t, e, "Indexed to 100")
}
togglePriceScalePercentageScaleMode(e) {
var t = {
percentage: !e.isPercentage()
};
this.setPriceScaleMode(t, e, "Percent")
}
togglePriceScaleLogScaleMode(e) {
var t = {
log: !e.isLog()
};
this.setPriceScaleMode(t, e, "Logarithmic")
}
invertPriceScale(e) {
var t = e.properties().isInverted;
this.setProperty(t, !t.value(), "Invert Scale")
}
removePane(e) {
var t = this.m_model.panes()[e].dataSources().slice();
this.removeSources(t, !1, "Remove pane")
}
destroy() {
this.model().destroy()
}
}
}).call(this, i("aIyQ"))
},
dOnf: function(e, t, i) {
"use strict";
function s(e) {
let t;
if ("object" != typeof e || null == e || "number" == typeof e.nodeType) t = e;
else if (e instanceof Date) t = new Date(e.valueOf());
else if (Array.isArray(e)) {
t = [];
let i = 0;
const r = e.length;
for (; i < r; i++) Object.prototype.hasOwnProperty.call(e, i) && (t[i] = s(e[i]))
} else {
t = {};
for (const i in e) Object.prototype.hasOwnProperty.call(e, i) && (t[i] = s(e[i]))
}
return t
}
i.r(t), i.d(t, "deepCopy", (function() {
return s
}))
},
dTSQ: function(e, t, i) {
"use strict";
function s(e) {
return e.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&")
}
i.r(t), i.d(t, "regExpEscape", (function() {
return s
}))
},
"dUJ+": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "replaceGraphicsTimesWithTimePointIndexIndex", (function() {
return n
}));
const s = new Map([
["horizlines", e => [e.startIndex, e.endIndex]],
["hhists", e => [e.firstBarTime, e.firstBarTime]],
["vertlines", e => [e.index]],
["polygons", e => e.points.map(e => e.index)]
]),
r = new Map([
["horizlines", (e, t) => {
const i = e;
i.startIndex = t.get(i.startIndex), i.endIndex = t.get(i.endIndex)
}],
["hhists", (e, t) => {
const i = e;
i.firstBarTime = t.get(i.firstBarTime), i.lastBarTime = t.get(i.lastBarTime)
}],
["vertlines", (e, t) => {
const i = e;
i.index = t.get(i.index)
}],
["polygons", (e, t) => {
const i = e;
for (const e of i.points) e.index = t.get(e.index)
}]
]);
function n(e) {
const t = e.data && e.data.graphicsCmds && e.data.graphicsCmds.create;
if (!t) return [];
const i = new Map,
n = new Set;
s.forEach((e, s) => {
const r = t[s];
if (r)
for (const t of r)
for (const s of t.data) {
const t = e(s);
for (const e of t) i.set(e, -1), n.add(e)
}
});
const o = Array.from(n).sort((e, t) => e - t);
return o.forEach((e, t) => i.set(e, t)), r.forEach((e, s) => {
const r = t[s];
if (r)
for (const t of r)
for (const s of t.data) e(s, i)
}), o
}
},
dfhE: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "STATUS_OFFLINE", (function() {
return s
})), i.d(t, "STATUS_RESOLVING", (function() {
return r
})), i.d(t, "STATUS_LOADING", (function() {
return n
})), i.d(t, "STATUS_READY", (function() {
return o
})), i.d(t, "STATUS_INVALID_SYMBOL", (function() {
return a
})), i.d(t, "STATUS_SNAPSHOT", (function() {
return l
})), i.d(t, "STATUS_EOD", (function() {
return c
})), i.d(t, "STATUS_PULSE", (function() {
return h
})), i.d(t, "STATUS_DELAYED", (function() {
return u
})), i.d(t, "STATUS_DELAYED_STREAMING", (function() {
return d
})), i.d(t, "STATUS_NO_BARS", (function() {
return p
})), i.d(t, "STATUS_REPLAY", (function() {
return _
})), i.d(t, "STATUS_ERROR", (function() {
return m
})), i.d(t, "SERIES_STATUS_TEXT", (function() {
return f
})), i.d(t, "STYLE_LINE_TYPE_MARKERS", (function() {
return g
})), i.d(t, "STYLE_LINE_TYPE_STEP", (function() {
return b
})), i.d(t, "STYLE_LINE_TYPE_SIMPLE", (function() {
return v
})), i.d(t, "STYLE_BARS", (function() {
return S
})), i.d(t, "STYLE_CANDLES", (function() {
return y
})), i.d(t, "STYLE_LINE", (function() {
return w
})), i.d(t, "STYLE_AREA", (function() {
return P
})), i.d(t, "STYLE_RENKO", (function() {
return C
})), i.d(t, "STYLE_KAGI", (function() {
return x
})), i.d(t, "STYLE_PNF", (function() {
return T
})), i.d(t, "STYLE_PB", (function() {
return I
})), i.d(t, "STYLE_HEIKEN_ASHI", (function() {
return M
})), i.d(t, "STYLE_HOLLOW_CANDLES", (function() {
return O
})), i.d(t, "STYLE_BASELINE", (function() {
return L
})), i.d(t, "STYLE_RANGE", (function() {
return A
})), i.d(t, "STYLE_HILO", (function() {
return E
})), i.d(t, "STYLE_SHORT_NAMES", (function() {
return k
})), i.d(t, "SYMBOL_STRING_DATA", (function() {
return D
}));
const s = 0,
r = 1,
n = 2,
o = 3,
a = 4,
l = 5,
c = 6,
h = 7,
u = 8,
d = 9,
p = 10,
_ = 11,
m = 12,
f = {
[s]: "connecting",
[r]: "loading",
[n]: "loading",
[o]: "realtime",
[a]: "invalid",
[l]: "snapshot",
[c]: "endofday",
[h]: "endofday",
[u]: "delayed",
[d]: "delayed_streaming",
[p]: "forbidden",
[_]: "replay",
[m]: "error"
},
g = 0,
b = 1,
v = 2,
S = 0,
y = 1,
w = 2,
P = 3,
C = 4,
x = 5,
T = 6,
I = 7,
M = 8,
O = 9,
L = 10,
A = 11,
E = 12,
k = {
0: "bar",
1: "candle",
9: "hollowCandle",
2: "line",
3: "area",
4: "renko",
7: "pb",
5: "kagi",
6: "pnf",
8: "ha",
10: "baseline",
11: "range",
12: "hilo"
},
D = {
4: {
type: "BarSetRenko@tv-prostudies",
basicStudyVersion: 40
},
7: {
type: "BarSetPriceBreak@tv-prostudies",
basicStudyVersion: 34
},
5: {
type: "BarSetKagi@tv-prostudies",
basicStudyVersion: 34
},
6: {
type: "BarSetPnF@tv-prostudies",
basicStudyVersion: 34
},
8: {
type: "BarSetHeikenAshi@tv-basicstudies",
basicStudyVersion: 60
},
11: {
type: "BarSetRange@tv-basicstudies",
basicStudyVersion: 72
}
}
},
dhFz: function(e, t, i) {
"use strict";
function s(e) {
return Boolean(e.isNaN)
}
i.d(t, "a", (function() {
return s
}))
},
di4O: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "watermarkProperty", (function() {
return h
})), i.d(t, "restoreWatermarkPropertyDefaults", (function() {
return u
}));
var s = i("eJTA"),
r = i("Vdly"),
n = i("tc+8"),
o = i.n(n);
const a = {
visibility: !1,
color: "rgba(80, 83, 94, 0.25)"
};
function l() {
const e = r.getJSON("symbolWatermark");
let t = Object.assign({}, a, e);
if (void 0 === e) {
if (void 0 !== r.getJSON("chartproperties")) {
const e = r.getJSON("chartproperties").symbolWatermarkProperties;
if (void 0 !== e) {
const i = Object(s.tryParseRgba)(e.color);
t = Object.assign(t, e), null !== i && (0 !== i[3] ? t.visibility = !0 : (i[3] =
.25, t.color = Object(s.rgbaToString)(i)))
}
}
delete t.transparency
}
return t
}
let c = null;
function h() {
return null === c && (c = new o.a(l()), r.onSync.subscribe(null, () => {
null !== c && c.mergeAndFire(l())
}), c.listeners().subscribe(null, () => {
null !== c && r.setJSON("symbolWatermark", c.state())
})), c
}
function u() {
null !== c && c.mergeAndFire(a)
}
},
dmHa: function(e, t) {
e.exports =
''
},
e1Hy: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("EYFt");
class r extends s.a {
constructor(e, t) {
super(e, t), this._showStudyValues = t.properties().paneProperties
.legendProperties.showStudyValues
}
getValues(e) {
const t = super.getValues(e),
i = this._showStudyValues.value();
for (const e of t) e.visible = e.visible && i;
return t
}
}
},
e1ZQ: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return p
})), i.d(t, "a", (function() {
return _
})), i.d(t, "c", (function() {
return m
}));
var s = i("YFKU"),
r = i("kcTO");
const n = {
1: () => Object(s.t)("Jan"),
2: () => Object(s.t)("Feb"),
3: () => Object(s.t)("Mar"),
4: () => Object(s.t)("Apr"),
5: () => Object(s.t)("May", {
context: "short"
}),
6: () => Object(s.t)("Jun"),
7: () => Object(s.t)("Jul"),
8: () => Object(s.t)("Aug"),
9: () => Object(s.t)("Sep"),
10: () => Object(s.t)("Oct"),
11: () => Object(s.t)("Nov"),
12: () => Object(s.t)("Dec")
},
o = (e, t) => (t ? e.getMonth() : e.getUTCMonth()) + 1,
a = (e, t) => t ? e.getFullYear() : e.getUTCFullYear(),
l = (e, t) => Object(r.numberToStringWithLeadingZero)(((e, t) => t ? e.getDate() : e
.getUTCDate())(e, t), 2),
c = (e, t) => n[o(e, t)](),
h = (e, t) => Object(r.numberToStringWithLeadingZero)(o(e, t), 2),
u = (e, t) => Object(r.numberToStringWithLeadingZero)(a(e, t) % 100, 2),
d = (e, t) => Object(r.numberToStringWithLeadingZero)(a(e, t), 4),
p = {
"dd MMM 'yy": (e, t) => `${l(e, t)} ${c(e, t)} '${u(e, t)}`,
"MMM dd, yyyy": (e, t) => `${c(e, t)} ${l(e, t)}, ${d(e, t)}`,
"MMM dd": (e, t) => `${c(e, t)} ${l(e, t)}`,
"yyyy-MM-dd": (e, t) => `${d(e, t)}-${h(e, t)}-${l(e, t)}`,
"yy-MM-dd": (e, t) => `${u(e, t)}-${h(e, t)}-${l(e, t)}`,
"yy/MM/dd": (e, t) => `${u(e, t)}/${h(e, t)}/${l(e, t)}`,
"yyyy/MM/dd": (e, t) => `${d(e, t)}/${h(e, t)}/${l(e, t)}`,
"dd-MM-yyyy": (e, t) => `${l(e, t)}-${h(e, t)}-${d(e, t)}`,
"dd-MM-yy": (e, t) => `${l(e, t)}-${h(e, t)}-${u(e, t)}`,
"dd/MM/yy": (e, t) => `${l(e, t)}/${h(e, t)}/${u(e, t)}`,
"dd/MM/yyyy": (e, t) => `${l(e, t)}/${h(e, t)}/${d(e, t)}`,
"MM/dd/yy": (e, t) => `${h(e, t)}/${l(e, t)}/${u(e, t)}`,
"MM/dd/yyyy": (e, t) => `${h(e, t)}/${l(e, t)}/${d(e, t)}`
},
_ = Object.keys(p),
m = () => -1 !== ["ja", "ko", "zh", "zh_TW"].indexOf(window.language || "") ? "yyyy-MM-dd" :
"dd MMM 'yy"
},
"e3/o": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "guid", (function() {
return r
})), i.d(t, "randomHash", (function() {
return n
})),
i.d(t, "randomHashN", (function() {
return o
}));
const s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
function r() {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, e => {
const t = 16 * Math.random() | 0;
return ("x" === e ? t : 3 & t | 8).toString(16)
})
}
function n() {
return o(12)
}
function o(e) {
let t = "";
for (let i = 0; i < e; ++i) {
const e = Math.floor(Math.random() * s.length);
t += s[e]
}
return t
}
},
e92V: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "isMtpPredictorToolName", (function() {
return n
})), i.d(t, "isStudyLineToolName", (function() {
return o
})), i.d(t, "isLineToolName", (function() {
return a
})), i.d(t, "isLineDrawnWithPressedButton", (function() {
return l
})), i.d(t, "isLineToolDrawWithoutPoints", (function() {
return c
})), i.d(t, "isImageToolName", (function() {
return h
})), i.d(t, "isTextToolName", (function() {
return u
}));
var s = i("OH2X");
const r = new Set([]);
function n(e) {
return r.has(e)
}
function o(e) {
return "LineToolRegressionTrend" === e || "LineToolVbPFixed" === e ||
"LineToolFixedRangeVolumeProfile" === e
}
function a(e) {
return e in s || o(e)
}
function l(e) {
return "LineToolBrush" === e || "LineToolHighlighter" === e
}
function c(e) {
return "LineToolTweet" === e
}
function h(e) {
return "LineToolImage" === e
}
function u(e) {
switch (e) {
case "LineToolBalloon":
case "LineToolText":
case "LineToolTextAbsolute":
case "LineToolCallout":
case "LineToolNote":
case "LineToolNoteAbsolute":
case "LineToolSignpost":
return !0
}
return !1
}
},
eCE5: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return n
})), i.d(t, "a", (function() {
return a
}));
var s = i("Eyy1"),
r = i("LxhU");
function n(e, t) {
let i = t.multiplier();
if (t.isTicks() && (e.ticks = !0), t.isSeconds() && (i < 60 ? (e.seconds = !0, e
.secondsFrom = Math.min(e.secondsFrom, i), e.secondsTo = Math.max(e.secondsTo,
i)) : (i /= 60, t = new r.Interval(r.ResolutionKind.Minutes, i))), t
.isMinutes())
if (i < 60) e.minutes = !0, e.minutesFrom = Math.min(e.minutesFrom, i), e.minutesTo =
Math.max(e.minutesTo, i);
else {
const t = Math.floor(i / 60);
e.hours = !0, e.hoursFrom = Math.min(e.hoursFrom, t), e.hoursTo = Math.max(e
.hoursTo, t)
} t.isDays() && (e.days = !0, e.daysFrom = Math.min(e.daysFrom, i), e.daysTo = Math.max(
e.daysTo, i)), t.isWeeks() && (e.weeks = !0, e.weeksFrom = Math.min(e.weeksFrom, i),
e.weeksTo = Math.max(e.weeksTo, i)), t.isMonths() && (e.months = !0, e.monthsFrom =
Math.min(e.monthsFrom, i), e.monthsTo = Math.max(e.monthsTo, i)), t.isRange() && (e
.ranges = !0)
}
function o(e, t, i, s) {
return e && s >= t && s <= i
}
function a(e, t) {
const i = t.childs();
switch (e.kind()) {
case r.ResolutionKind.Ticks:
return i.ticks.value();
case r.ResolutionKind.Seconds:
if (e.multiplier() < 60) return o(i.seconds.value(), i.secondsFrom.value(), i
.secondsTo.value(), e.multiplier()); {
const t = Math.floor(e.multiplier() / 60);
return o(i.minutes.value(), i.minutesFrom.value(), i.minutesTo.value(), t)
}
case r.ResolutionKind.Minutes:
if (e.multiplier() < 60) return o(i.minutes.value(), i.minutesFrom.value(), i
.minutesTo.value(), e.multiplier()); {
const t = Math.floor(e.multiplier() / 60);
return o(i.hours.value(), i.hoursFrom.value(), i.hoursTo.value(), t)
}
case r.ResolutionKind.Days:
return o(i.days.value(), i.daysFrom.value(), i.daysTo.value(), e
.multiplier());
case r.ResolutionKind.Weeks:
return o(i.weeks.value(), i.weeksFrom.value(), i.weeksTo.value(), e
.multiplier());
case r.ResolutionKind.Months:
return o(i.months.value(), i.monthsFrom.value(), i.monthsTo.value(), e
.multiplier());
case r.ResolutionKind.Range:
return i.ranges.value()
}
return Object(s.assert)(!1, "Unsupported resolution: " + e.value()), !1
}
},
eJTA: function(e, t, i) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
});
var s = i("ivNn");
function r(e, t, i) {
return s.isNaN(t) || t < e ? e : t > i ? i : Math.round(t)
}
function n(e, t, i) {
return s.isNaN(t) || t < e ? e : t > i ? i : Math.round(1e4 * t) / 1e4
}
function o(e) {
return r(0, e, 255)
}
function a(e) {
return r(0, e, 255)
}
function l(e) {
return r(0, e, 255)
}
function c(e) {
return n(0, e, 1)
}
function h(e) {
return n(0, e, 1)
}
function u(e) {
return n(0, e, 1)
}
function d(e) {
return n(0, e, 1)
}
function p(e) {
return n(0, e, 1)
}
function _(e) {
return n(0, e, 1)
}
function m(e) {
var t = e[0] / 255,
i = e[1] / 255,
s = e[2] / 255,
r = Math.min(t, i, s),
n = Math.max(t, i, s),
o = 0,
a = 0,
l = (r + n) / 2;
if (r === n) o = 0, a = 0;
else {
var c = n - r;
switch (a = l > .5 ? c / (2 - n - r) : c / (n + r), n) {
case t:
o = ((i - s) / c + (i < s ? 6 : 0)) / 6;
break;
case i:
o = ((s - t) / c + 2) / 6;
break;
case s:
o = ((t - i) / c + 4) / 6
}
}
return [o, a, l]
}
function f(e, t, i) {
return i < 0 && (i += 1), i > 1 && (i -= 1), i < 1 / 6 ? e + 6 * (t - e) * i : i < .5 ? t :
i < 2 / 3 ? e + (t - e) * (2 / 3 - i) * 6 : e
}
function g(e) {
var t, i, s, r = e[0],
n = e[1],
c = e[2];
if (0 === n) t = i = s = c;
else {
var h = c < .5 ? c * (1 + n) : c + n - c * n,
u = 2 * c - h;
t = f(u, h, r + 1 / 3), i = f(u, h, r), s = f(u, h, r - 1 / 3)
}
return [o(255 * t), a(255 * i), l(255 * s)]
}
t.normalizeRedComponent = o, t.normalizeGreenComponent = a, t.normalizeBlueComponent = l, t
.normalizeAlphaComponent = c, t.rgb = function(e, t, i) {
return [o(e), a(t), l(i)]
}, t.areEqualRgb = function(e, t) {
return e[0] === t[0] && e[1] === t[1] && e[2] === t[2]
}, t.rgba = function(e, t, i, s) {
if (Array.isArray(e)) {
var r = e;
return s = t, [r[0], r[1], r[2], c(s)]
}
var n = t;
return i = i || 0, s = s || 0, [o(e), a(n), l(i), c(s)]
}, t.areEqualRgba = function(e, t) {
return e[0] === t[0] && e[1] === t[1] && e[2] === t[2] && e[3] === t[3]
}, t.normalizeHue = h, t.normalizeHslSaturation = u, t.normalizeHsvSaturation = d, t
.normalizeLightness = p, t.normalizeValue = _, t.hsl = function(e, t, i) {
return [h(e), u(t), p(i)]
}, t.areEqualHsl = function(e, t) {
return e[0] === t[0] && e[1] === t[1] && e[2] === t[2]
}, t.hsv = function(e, t, i) {
return [h(e), d(t), _(i)]
}, t.areEqualHsv = function(e, t) {
return e[0] === t[0] && e[1] === t[1] && e[2] === t[2]
}, t.rgbToHsl = m, t.hslToRgb = g, t.rgbToHsv = function(e) {
var t = e[0],
i = e[1],
s = e[2],
r = t / 255,
n = i / 255,
o = s / 255,
a = Math.min(r, n, o),
l = Math.max(r, n, o),
c = l - a,
h = 0,
u = 0 === l ? 0 : c / l,
d = l;
if (l === a) h = 0;
else switch (l) {
case t:
h = ((n - o) / c + (n < o ? 6 : 0)) / 6;
break;
case i:
h = ((o - r) / c + 2) / 6;
break;
case s:
h = ((r - n) / c + 4) / 6
}
return [h, u, d]
}, t.hsvToRgb = function(e) {
var t = e[0],
i = e[1],
s = e[2],
r = Math.floor(6 * t),
n = 6 * t - r,
c = s * (1 - i),
h = s * (1 - n * i),
u = s * (1 - (1 - n) * i),
d = 0,
p = 0,
_ = 0;
switch (r % 6) {
case 0:
d = s, p = u, _ = c;
break;
case 1:
d = h, p = s, _ = c;
break;
case 2:
d = c, p = s, _ = u;
break;
case 3:
d = c, p = h, _ = s;
break;
case 4:
d = u, p = c, _ = s;
break;
case 5:
d = s, p = c, _ = h
}
return [o(255 * d), a(255 * p), l(255 * _)]
};
var b = [.199, .687, .114];
function v(e) {
return b[0] * e[0] + b[1] * e[1] + b[2] * e[2]
}
function S(e, t, i) {
void 0 === i && (i = .05);
var s = m(e),
r = s[0] + t * i;
return s[0] = h(r - Math.floor(r)), g(s)
}
function y(e, t, i) {
void 0 === i && (i = .05);
var s = e[0],
r = e[1],
n = e[2],
o = e[3],
a = S([s, r, n], t, i);
return [a[0], a[1], a[2], o]
}
t.rgbToGrayscale = v, t.distanceRgb = function(e, t) {
var i = e[0],
s = e[1],
r = e[2],
n = t[0] - i,
o = t[1] - s,
a = t[2] - r;
return Math.sqrt(n * n + o * o + a * a)
}, t.invertRgb = function(e) {
return [255 - e[0], 255 - e[1], 255 - e[2]]
}, t.darkenRgb = function(e, t) {
var i = m(e);
return g([i[0], i[1], p(i[2] - t / 100)])
}, t.blendRgba = function(e, t) {
var i = e[0],
s = e[1],
r = e[2],
n = e[3],
h = t[0],
u = t[1],
d = t[2],
p = t[3],
_ = c(1 - (1 - p) * (1 - n));
return [o(h * p / _ + i * n * (1 - p) / _), a(u * p / _ + s * n * (1 - p) / _), l(d *
p / _ + r * n * (1 - p) / _), _]
}, t.shiftRgb = S, t.shiftRgba = y, t.shiftColor = function(e, t, i) {
return void 0 === i && (i = .05), E(y(V(e), t, i))
};
var w, P, C, x, T = {
aliceblue: "#f0f8ff",
antiquewhite: "#faebd7",
aqua: "#00ffff",
aquamarine: "#7fffd4",
azure: "#f0ffff",
beige: "#f5f5dc",
bisque: "#ffe4c4",
black: "#000000",
blanchedalmond: "#ffebcd",
blue: "#0000ff",
blueviolet: "#8a2be2",
brown: "#a52a2a",
burlywood: "#deb887",
cadetblue: "#5f9ea0",
chartreuse: "#7fff00",
chocolate: "#d2691e",
coral: "#ff7f50",
cornflowerblue: "#6495ed",
cornsilk: "#fff8dc",
crimson: "#dc143c",
cyan: "#00ffff",
darkblue: "#00008b",
darkcyan: "#008b8b",
darkgoldenrod: "#b8860b",
darkgray: "#a9a9a9",
darkgreen: "#006400",
darkkhaki: "#bdb76b",
darkmagenta: "#8b008b",
darkolivegreen: "#556b2f",
darkorange: "#ff8c00",
darkorchid: "#9932cc",
darkred: "#8b0000",
darksalmon: "#e9967a",
darkseagreen: "#8fbc8f",
darkslateblue: "#483d8b",
darkslategray: "#2f4f4f",
darkturquoise: "#00ced1",
darkviolet: "#9400d3",
deeppink: "#ff1493",
deepskyblue: "#00bfff",
dimgray: "#696969",
dodgerblue: "#1e90ff",
feldspar: "#d19275",
firebrick: "#b22222",
floralwhite: "#fffaf0",
forestgreen: "#228b22",
fuchsia: "#ff00ff",
gainsboro: "#dcdcdc",
ghostwhite: "#f8f8ff",
gold: "#ffd700",
goldenrod: "#daa520",
gray: "#808080",
green: "#008000",
greenyellow: "#adff2f",
honeydew: "#f0fff0",
hotpink: "#ff69b4",
indianred: "#cd5c5c",
indigo: "#4b0082",
ivory: "#fffff0",
khaki: "#f0e68c",
lavender: "#e6e6fa",
lavenderblush: "#fff0f5",
lawngreen: "#7cfc00",
lemonchiffon: "#fffacd",
lightblue: "#add8e6",
lightcoral: "#f08080",
lightcyan: "#e0ffff",
lightgoldenrodyellow: "#fafad2",
lightgreen: "#90ee90",
lightgrey: "#d3d3d3",
lightpink: "#ffb6c1",
lightsalmon: "#ffa07a",
lightseagreen: "#20b2aa",
lightskyblue: "#87cefa",
lightslateblue: "#8470ff",
lightslategray: "#778899",
lightsteelblue: "#b0c4de",
lightyellow: "#ffffe0",
lime: "#00ff00",
limegreen: "#32cd32",
linen: "#faf0e6",
magenta: "#ff00ff",
maroon: "#800000",
mediumaquamarine: "#66cdaa",
mediumblue: "#0000cd",
mediumorchid: "#ba55d3",
mediumpurple: "#9370d8",
mediumseagreen: "#3cb371",
mediumslateblue: "#7b68ee",
mediumspringgreen: "#00fa9a",
mediumturquoise: "#48d1cc",
mediumvioletred: "#c71585",
midnightblue: "#191970",
mintcream: "#f5fffa",
mistyrose: "#ffe4e1",
moccasin: "#ffe4b5",
navajowhite: "#ffdead",
navy: "#000080",
oldlace: "#fdf5e6",
olive: "#808000",
olivedrab: "#6b8e23",
orange: "#ffa500",
orangered: "#ff4500",
orchid: "#da70d6",
palegoldenrod: "#eee8aa",
palegreen: "#98fb98",
paleturquoise: "#afeeee",
palevioletred: "#d87093",
papayawhip: "#ffefd5",
peachpuff: "#ffdab9",
peru: "#cd853f",
pink: "#ffc0cb",
plum: "#dda0dd",
powderblue: "#b0e0e6",
purple: "#800080",
red: "#ff0000",
rosybrown: "#bc8f8f",
royalblue: "#4169e1",
saddlebrown: "#8b4513",
salmon: "#fa8072",
sandybrown: "#f4a460",
seagreen: "#2e8b57",
seashell: "#fff5ee",
sienna: "#a0522d",
silver: "#c0c0c0",
skyblue: "#87ceeb",
slateblue: "#6a5acd",
slategray: "#708090",
snow: "#fffafa",
springgreen: "#00ff7f",
steelblue: "#4682b4",
tan: "#d2b48c",
teal: "#008080",
thistle: "#d8bfd8",
tomato: "#ff6347",
turquoise: "#40e0d0",
violet: "#ee82ee",
violetred: "#d02090",
wheat: "#f5deb3",
white: "#ffffff",
whitesmoke: "#f5f5f5",
yellow: "#ffff00",
yellowgreen: "#9acd32"
};
function I(e, t) {
return t in e
}
function M(e) {
var t = w.re.exec(e);
return null !== t ? w.parse(t) : null
}
function O(e) {
var t = P.re.exec(e);
return null !== t ? P.parse(t) : null
}
function L(e) {
var t = C.re.exec(e);
return null !== t ? C.parse(t) : null
}
function A(e) {
var t = x.re.exec(e);
return null !== t ? x.parse(t) : null
}
function E(e) {
return "rgba(" + e[0] + ", " + e[1] + ", " + e[2] + ", " + e[3] + ")"
}
function k(e) {
if (e = e.toLowerCase(), I(T, e)) {
var t = O(T[e]);
if (null !== t) return t;
throw new Error("Invalid named color definition")
}
var i = M(e);
if (null !== i) return i;
var s = O(e);
if (null !== s) return s;
var r = L(e);
if (null !== r) return r;
var n = A(e);
return null !== n ? [n[0], n[1], n[2]] : null
}
function D(e) {
if (e = e.toLowerCase(), I(T, e)) {
var t = O(T[e]);
if (null !== t) return [t[0], t[1], t[2], 1];
throw new Error("Invalid named color definition")
}
var i = M(e);
if (null !== i) return [i[0], i[1], i[2], 1];
var s = O(e);
if (null !== s) return [s[0], s[1], s[2], 1];
var r = L(e);
if (null !== r) return [r[0], r[1], r[2], 1];
var n = A(e);
return null !== n ? n : null
}
function V(e) {
var t = D(e);
if (null !== t) return t;
throw new Error("Passed color string does not match any of the known color representations")
}! function(e) {
e.re = /^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/, e.parse =
function(e) {
return [o(parseInt(e[1], 10)), a(parseInt(e[2], 10)), l(parseInt(e[3], 10))]
}
}(w || (w = {})), t.rgbToString = function(e) {
return "rgb(" + e[0] + ", " + e[1] + ", " + e[2] + ")"
},
function(e) {
e.re = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, e.parse = function(e) {
return [o(parseInt(e[1], 16)), a(parseInt(e[2], 16)), l(parseInt(e[3], 16))]
}
}(P || (P = {})), t.rgbToHexString = function(e) {
var t = e[0],
i = e[1],
s = e[2],
r = t.toString(16),
n = i.toString(16),
o = s.toString(16);
return "#" + (1 === r.length ? "0" : "") + r + (1 === n.length ? "0" : "") + n + (1 ===
o.length ? "0" : "") + o
},
function(e) {
e.re = /^#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])$/, e.parse = function(e) {
return [o(parseInt(e[1] + e[1], 16)), a(parseInt(e[2] + e[2], 16)), l(parseInt(
e[3] + e[3], 16))]
}
}(C || (C = {})),
function(e) {
e.re =
/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/,
e.parse = function(e) {
return [o(parseInt(e[1], 10)), a(parseInt(e[2], 10)), l(parseInt(e[3], 10)), c(
parseFloat(e[4]))]
}
}(x || (x = {})), t.rgbaToString = E, t.rgbToBlackWhiteString = function(e, t) {
if (t < 0 || t > 255) throw new Error(
"invalid threshold value, valid values are [0, 255]");
return v(e) >= t ? "white" : "black"
}, t.tryParseRgb = k, t.parseRgb = function(e) {
var t = k(e);
if (null !== t) return t;
throw new Error(
"Passed color string does not match any of the known color representations")
}, t.tryParseRgba = D, t.parseRgba = V
},
eqEH: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "registerService", (function() {
return o
})), i.d(t, "unregisterService", (function() {
return a
})), i.d(t, "hasService", (function() {
return l
})),
i.d(t, "service", (function() {
return c
})), i.d(t, "waitServiceRegistered", (function() {
return h
}));
var s = i("jofe");
const r = {},
n = new Map;
function o(e, t) {
if (l(e)) throw new Error("Service already registered");
r[e.id] = t;
const i = n.get(e.id);
void 0 !== i && (n.delete(e.id), i.resolve(t))
}
function a(e) {
if (!l(e)) throw new Error("Service not found");
r[e.id] = void 0
}
function l(e) {
return void 0 !== r[e.id]
}
function c(e) {
const t = r[e.id];
if (void 0 === t) throw new Error("ServiceLocator: Service " + e.id + " not found");
return t
}
function h(e) {
if (l(e)) return Promise.resolve(c(e));
let t = n.get(e.id);
return void 0 === t && (t = Object(s.createDeferredPromise)(), n.set(e.id, t)), t.promise
}
},
f6yo: function(e, t, i) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
}), t.pointInCircle = t.pointInPolygon = t.pointInBox = t.pointInTriangle = t
.pointInHalfplane = void 0;
var s = i("hBTJ");
t.pointInHalfplane = function(e, t) {
var i = t.edge;
return i.A * e.x + i.B * e.y + i.C > 0 === t.isPositive
}, t.pointInTriangle = function(e, t, i, r) {
var n = t.add(i).scaled(.5).add(r).scaled(.5),
o = s.intersectLineSegments(t, i, n, e);
return null === o && (null === (o = s.intersectLineSegments(i, r, n, e)) && null === (
o = s.intersectLineSegments(r, t, n, e)))
}, t.pointInBox = function(e, t) {
return e.x >= t.min.x && e.x <= t.max.x && e.y >= t.min.y && e.y <= t.max.y
}, t.pointInPolygon = function(e, t) {
for (var i = t.length - 1, s = !1, r = e.x, n = e.y, o = 0; o < t.length; o++) {
var a = t[o],
l = t[i];
(a.y < n && l.y >= n || l.y < n && a.y >= n) && a.x + (n - a.y) / (l.y - a.y) * (l
.x - a.x) < r && (s = !s), i = o
}
return s
}, t.pointInCircle = function(e, t, i) {
return (e.x - t.x) * (e.x - t.x) + (e.y - t.y) * (e.y - t.y) <= i * i
}
},
fFKx: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return o
})), i.d(t, "a", (function() {
return a
}));
var s = i("Eyy1"),
r = i("tqok"),
n = i("hsV8");
function o(e, t) {
if (e.startIndex >= t.length || e.endIndex >= t.length) return null;
const i = t[e.startIndex],
n = t[e.endIndex];
return i === r.INVALID_TIME_POINT_INDEX || n === r.INVALID_TIME_POINT_INDEX ? null : (
Object(s.assert)(i <= n, "startIndex should not exceed endIndex"), {
startIndex: i,
endIndex: n,
level: e.level,
extendLeft: e.extendLeft,
extendRight: e.extendRight
})
}
function a(e, t, i) {
const s = Object(n.ensureTimePointIndexIndex)(i.indexOf(e.startIndex)),
r = Object(n.ensureTimePointIndexIndex)(i.indexOf(e.endIndex));
return {
id: t,
...e,
startIndex: s,
endIndex: r
}
}
},
fJhV: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineDataSourceTimeAxisView", (function() {
return n
}));
var s = i("cgFQ"),
r = i("Ulff");
class n extends s.a {
constructor(e, t) {
super(e.model()), this._active = !1, this._source = e, this._pointIndex = t
}
setActive(e) {
this._active = e
}
_getBgColor() {
return this._active ? r.a.active : r.a.common
}
_getIndex() {
if (!this._model.selection().isSelected(this._source)) return null;
const e = this._source.timeAxisPoints();
return e.length <= this._pointIndex ? null : e[this._pointIndex].index
}
}
},
fPdn: function(e, t, i) {
"use strict";
window.TradingView = window.TradingView || {}, window.requireAll = function(e) {
return e.keys().map(e)
}, i("6jKD"), i("bZMm"), i("YFKU"), i("8+VR").setClasses(), i("jjqu"), i("w9cH").install(),
i("qFKp"), i("ogJP"), i("jFln"), i("HbRj"), i("VVxS"), i("CLNU"), i("mZrn"), i("Vdly"), i(
"+GxX")
},
fRER: function(e, t, i) {
"use strict";
i.r(t),
i.d(t, "DropdownApi", (function() {
return s
}));
class s {
constructor(e, t) {
this._headerToolbar = e, this._dropdownId = t
}
applyOptions(e) {
this._headerToolbar.updateDropdown(this._dropdownId, e)
}
remove() {
this._headerToolbar.removeDropdown(this._dropdownId)
}
}
},
fTGZ: function(e, t, i) {
"use strict";
(function(e, s, r) {
var n = i("Eyy1").ensureNotNull,
o = i("Ss5c").LineDataSource,
a = i("ogJP").isNumber,
l = i("BOPY").BarsMarksContainerPaneView,
c = i("BOPY").BarsMarksContainerRenderer,
h = i("Bt3k").TooltipRenderer,
u = i("LxhU").Interval,
d = i("n5al").isPriceSourceStyle,
p = i("txPx").getLogger("Chart.BarsMarksContainer");
class _ extends o {
constructor(t, i) {
var a = t._undoModel._chartWidget,
l = a.onWidget(),
c = !1;
c = l ? a._options && !a._options.hideIdeas : !!e.enabled("bars_marks") &&
TVSettings.getBool("BarsMarksContainer.visibile", !1), i ? i.merge({
visible: c,
frozen: !1
}) : i = new s({
visible: c,
frozen: !1
}), i.visible.listeners().subscribe(null, (function(t) {
l || a._containsData || !e.enabled("bars_marks") ||
TVSettings.setValue("BarsMarksContainer.visibile", !!t
.value()), u._tooltip && u._tooltip.removeAll()
})), o._configureProperties(i), super(t, i);
var u = this;
this.onNeedRepaint = new r, this._requests = [], this._marks = {}, this
._loadedRange = null, this._getDataTimeout = null, this
._collectedRange = null, this._model.mainSeries()
.onSymbolIntervalChanged().subscribe(this, this.clearMarks), this._model
.mainSeries().dataEvents().symbolResolved().subscribe(this, this
.clearMarks), this._model.mainSeries().dataEvents().completed()
.subscribe(this, (function() {
var e = this._model.mainSeries().data();
if (0 !== e.size()) {
var t = n(e.first()).index,
i = n(e.last()).index,
s = this.timeScale();
this.getData({
start: s.indexToTimePoint(t),
end: s.indexToTimePoint(i)
})
}
})), this._initialize(), this.pinnedTooltips = {}, this._tooltip =
new h(this._createTooltip.bind(this), this)
}
_initialize(e) {
throw new Error("Child class must override this member")
}
onClicked() {
throw new Error("Child class must override this member")
}
_getData(e) {
throw new Error("Child class must override this member")
}
_createTooltip() {
throw new Error("Child class must override this member")
}
updateDotData(e, t) {
return t
}
updatePlateData(e, t) {}
isAvailableInFloatingWidget() {
return !1
}
_plateViewData(e) {
return {}
}
pinTooltip(e, t) {
this.pinnedTooltips[e] = t
}
timeScale() {
return this._model.timeScale()
}
getIntervalInTicks() {
var e = this._model.mainSeries().properties().interval.value(),
t = u.parse(e);
if (!t.isValid()) throw new TypeError("Unexpected interval");
return t.isRange() ? 60 : t.inMilliseconds() / 1e3
}
getVisibleTickMarksRange() {
if (this.timeScale().isEmpty()) return {
start: 0,
end: 0
};
var e, t = this.timeScale().visibleBarsStrictRange();
return t.lastBar() > this.timeScale().points().firstIndex() && t
.firstBar() < this.timeScale().points().lastIndex() ? (e = t.lastBar() <
this.timeScale().points().lastIndex() ? this.timeScale()
.indexToTimePoint(t.lastBar()) : this._maxDate, {
start: (t = {
start: this.timeScale().indexToTimePoint(Math.max(t
.firstBar(), this.timeScale().points()
.firstIndex())),
end: e
}).start ? t.start : void 0,
end: t.end ? t.end : void 0
}) : {
start: 0,
end: 0
}
}
getVisibleRangePlates() {
var e = [],
t = this.getVisibleTickMarksRange(),
i = this.getIntervalInTicks();
return Object.keys(this._marks).forEach((function(s) {
var r = this._marks[s],
n = r.tickmark;
n >= t.start && n <= t.end + i && e.push(r)
}), this), e
}
getPublishedPlates() {
var e = {},
t = this;
return is_authenticated ? (this.getVisibleRangePlates().forEach((function(
i) {
i.is_public && (t.pinnedTooltips[i.id] || i.user__id ===
user.id) && (e[i.id] = i)
})), e) : e
}
filterDisplayedPlates(e) {
return e = e.reduce(function(e, t) {
var i = this._getIndex(t.tickmark);
return e[i] = e[i] || [], e[i].push(t), e
}.bind(this), {}), e = Object.keys(e).reduce(function(t, i) {
var s = e[i];
return s = (s = s.sort((function(e, t) {
return t.views_count - e.views_count
}))).slice(0, this._maxPlatesPerBar), t.concat(s)
}.bind(this), [])
}
_layout(e) {
switch (e) {
default:
case 0:
return "up";
case 1:
return "down";
case 2:
return "up";
case 3:
case 4:
case 5:
case 6:
return "up"
}
}
_theme(e) {
switch (e) {
default:
case 0:
return "neutral";
case 1:
return "green";
case 2:
return "red";
case 3:
return "yellow";
case 4:
return "blue";
case 5:
return "green";
case 6:
return "red"
}
}
_offset(e, t, i) {
var s;
switch (e) {
default:
case "up":
s = null === i ? t[TradingView.HIGH_PLOT] : i(t);
break;
case "down":
s = null === i ? t[TradingView.LOW_PLOT] : i(t)
}
return this.priceScale().priceToCoordinate(s, this.ownerSource()
.firstValue())
}
_getIndex(e) {
return this.timeScale().timePointToIndex(e)
}
getViewData() {
return {
barWidth: this.barWidth(),
plates: this.getPlatesViewData(),
tooltip: this._tooltip
}
}
barWidth() {
return this.timeScale().barSpacing()
}
getPlatesViewData() {
var e = this._model.mainSeries();
if (e.data().isEmpty()) return [];
for (var t = d(e.style()) ? e.barFunction() : null, i = this
.filterDisplayedPlates(this.getVisibleRangePlates()), s = this,
r = {}, n = this._model.lastHittestData(), o = (i = (i = i.map(
function(e) {
var i = this._getIndex(e.tickmark),
o = this._getBar(i);
if (null === o) return !1;
var a, l = this._layout(e.direction),
c = this._theme(e.direction),
h = null !== n && n.id === e.id,
u = this.timeScale().indexToCoordinate(i),
d = this._offset(l, o, t),
p = this.priceScale().isInverted();
return i in r || (r[i] = {
up: 0,
down: 0
}), a = r[i][l]++, TradingView.merge({
id: e.id,
x: u,
y: d,
yInverted: p,
order: a,
direction: l,
theme: c,
hovered: h,
pinned: !0 === s.pinnedTooltips[e.id],
user__id: e.user__id,
label: e.label,
labelFontColor: e.labelFontColor ||
"#444",
minSize: e.minSize || 5
}, this._plateViewData(e))
}.bind(this))).filter((function(e) {
return !!e
}))).filter((function(e) {
return !0 === e.hovered
})), a = 0; a < i.length; a++) null != o[0] && i[a].user__id === o[
0].user__id && (i[a].highlightByAuthor = !0);
return i.sort((function(e, t) {
return e.hovered && !t.hovered ? 1 : 0
})), i
}
_getBar(e) {
return this._model.mainSeries().data().valueAt(e)
}
paneViews() {
var e = this;
return this._properties.visible.value() ? [new l(this, (function(t) {
return new c(t.getViewData(), e)
}))] : []
}
dataWindowView() {
return null
}
priceAxisViews() {
return null
}
statusView() {
return null
}
updateAllViews() {}
pointsCount() {
return 0
}
properties() {
return this._properties
}
_rangeDifference(e) {
return e = Object.assign({}, e), this._loadedRange && (e.start < this
._loadedRange.start ? e.end = this._loadedRange.start : e.end > this
._loadedRange.end && (e.start = this._loadedRange.end)), e
}
_rangeUnion(e, t) {
return e = Object.assign({}, e), t && (e.start = Math.min(t.start, e.start),
e.end = Math.max(t.end, e.end)), e
}
_pushGetDataStack(e) {
a(e.start) && a(e.end) ? (this._getDataTimeout && clearTimeout(this
._getDataTimeout), this._collectedRange = this._rangeUnion(e,
this._collectedRange), this._getDataTimeout = setTimeout(
function() {
this._getData(this._collectedRange), this._getDataTimeout =
this._collectedRange = null
}.bind(this), 300)) : p.logError("Wrong tickmark range")
}
roundRange(e) {
return {
start: Math.round(e.start),
end: Math.round(e.end)
}
}
refreshData() {
this.getData(this._lastRange)
}
getData(e) {
a(e.start) && a(e.end) ? (this._lastRange = e, (e = Object.assign({}, e))
.end = this._maxDate, this._pushGetDataStack(e)) : p.logError(
"Wrong range")
}
_abortAllRequests() {
this._requests.forEach((function(e) {
e.abort()
})), this._requests = [], this._getDataTimeout && clearTimeout(this
._getDataTimeout), this._getDataTimeout = this._collectedRange =
null
}
clearMarks() {
this._abortAllRequests(), this._marks = {}, this._loadedRange = null
}
}
_.prototype._maxDate = Math.round(new Date(2037, 0, 1).getTime() / 1e3), _.prototype
._maxPlatesPerBar = 10, t.BarsMarksContainer = _
}).call(this, i("Kxc7"), i("tc+8"), i("aIyQ"))
},
fZEr: function(e, t, i) {
"use strict";
async function s(e, t) {
const s = await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(16), i.e(17), i
.e(28), i.e(88), i.e(0), i.e(2), i.e(15), i.e("simple-dialog")
]).then(i.bind(null, "EcUf"));
return s.showSimpleDialog(e, s.renameModule, t)
}
async function r(e, t) {
const s = await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(16), i.e(17), i
.e(28), i.e(88), i.e(0), i.e(2), i.e(15), i.e("simple-dialog")
]).then(i.bind(null, "EcUf"));
return s.showSimpleDialog(e, s.confirmModule, t)
}
async function n(e, t) {
const s = await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i.e(16), i.e(17), i
.e(28), i.e(88), i.e(0), i.e(2), i.e(15), i.e("simple-dialog")
]).then(i.bind(null, "EcUf"));
return s.showSimpleDialog(e, s.warningModule, t)
}
i.r(t), i.d(t, "showRename", (function() {
return s
})), i.d(t, "showConfirm", (function() {
return r
})), i.d(t, "showWarning", (function() {
return n
}))
},
fgLi: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "DataSource", (function() {
return l
}));
var s = i("hY0g"),
r = i.n(s),
n = i("e3/o"),
o = i("aIyQ"),
a = i.n(o);
class l {
constructor() {
this.hasAlert = new r.a(!1), this._zorder = 0, this.m_priceScale = null, this._id =
Object(n.randomHashN)(6), this._ownerSource = null, this._userEditEnabled = !0,
this._onPriceScaleChanged = new a.a, this._isSelectionEnabled = !0, this
._ownerSourceChanged = new a.a, this._zOrderChanged = new a.a
}
id() {
return this._id
}
preferNoScale() {
return !1
}
idForAlert() {
return this._id
}
setId(e) {
this._id = e
}
zorder() {
return this._zorder
}
setZorder(e) {
"number" == typeof e && this._zorder !== e && (this._zorder = e, this._zOrderChanged
.fire(e))
}
isSpeciallyZOrderedSource() {
return !1
}
title() {
throw new Error("Implement this fun in a subclass")
}
priceScale() {
return this.m_priceScale
}
setPriceScale(e) {
this.m_priceScale = e, this._onPriceScaleChanged.fire()
}
ownerSource() {
return this._ownerSource
}
setOwnerSource(e) {
this._ownerSource = e, this._ownerSourceChanged.fire()
}
ownerSourceChanged() {
return this._ownerSourceChanged
}
zOrderChanged() {
return this._zOrderChanged
}
isSavedInChart(e) {
return !0
}
isSavedInStudyTemplates() {
return !0
}
isRemovedByStudyTemplates() {
return !0
}
hasContextMenu() {
return !0
}
showInObjectTree() {
return !0
}
setUserEditEnabled(e) {
this._userEditEnabled = e
}
userEditEnabled() {
return this._userEditEnabled
}
canBeHidden() {
return this.userEditEnabled()
}
isUserDeletable() {
return this.userEditEnabled()
}
canHasAlert() {
return !1
}
properties() {
throw new Error("Implement this fun in a subclass")
}
isVisible() {
return this.properties().visible.value()
}
statusView() {
return null
}
dataWindowView() {
return null
}
legendView() {
return null
}
marketStatusModel() {
return null
}
dataUpdatedModeModel() {
return null
}
dataProblemModel() {
return null
}
priceAxisViews(e, t) {
return null
}
timeAxisViews() {
return null
}
updateAllViews() {}
paneViews() {
return null
}
labelPaneViews() {
return null
}
isFailed() {
return !1
}
isLoading() {
return !1
}
isPhantom() {
return !1
}
isChildStudy() {
return !1
}
hasChildren() {
return !1
}
canHaveChildren() {
return !1
}
onClickOutside() {}
getSourceIcon() {
return null
}
state(e) {
throw new Error("Implement this fun in a subclass")
}
onPriceScaleChanged() {
return this._onPriceScaleChanged
}
doesMovingAffectsUndo() {
return !0
}
isMultiPaneAvailable() {
return !1
}
isMultiPaneEnabled() {
return !1
}
copiable() {
return !1
}
cloneable() {
return !1
}
movable() {
return !1
}
isIncludedInAutoScale() {
return !1
}
isHoveredEnabled() {
return this.isSelectionEnabled()
}
isSelectionEnabled() {
return this._isSelectionEnabled
}
setSelectionEnabled(e) {
this._isSelectionEnabled = e
}
firstValue() {
return null
}
priceRange(e, t) {
return null
}
autoScaleInfo(e, t) {
return {
range: this.priceRange(e, t)
}
}
}
},
fs3R: function(e, t) {
e.exports =
''
},
g5Qf: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "getFavoriteDrawingToolbarPromise", (function() {
return o
})), i.d(t, "createFavoriteDrawingToolbar", (function() {
return a
}));
i("YFKU");
var s = i("yMne");
let r = null,
n = null;
function o() {
return n
}
function a() {
null === n && (n = Promise.all([i.e("react"), i.e(1), i.e(4), i.e(6), i.e(11), i.e(12), i.e(
13), i.e(14), i.e(17), i.e(21), i.e(22), i.e(24), i.e(28), i.e(33), i.e(
41), i.e(48), i.e(51), i.e(52), i.e(60), i.e(67), i.e(75), i.e(0), i.e(
5), i.e(30), i.e(38), i.e("line-tools-icons"), i.e(53), i.e(54), i.e(
"floating-toolbars")]).then(i.bind(null, "gmn6")).then(({
FavoriteDrawingToolbar: e
}) => (r = null !== r ? r : new e({
left: window.innerWidth / 2,
top: s.b + 61
}), r)))
}
},
gASG: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Ocx9"),
r = i("Ss5c"),
n = i("tc+8"),
o = i.n(n),
a = i("+FzY"),
l = i("aIyQ"),
c = i.n(l);
class h {
constructor(e) {
this._image = null, this._currentImageURL = null, this._imageReady = !1, this
._ready = new c.a, this._source = e, this.updateImage()
}
updateImage() {
const e = this.imageURL();
this._currentImageURL !== e && (this._currentImageURL = e, this._image = null, this
._imageReady = !1, null !== this._currentImageURL && (this._image =
new Image, this._image.onload = () => {
this._imageReady = !0, this._ready.fire()
},
this._image.crossOrigin = "anonymous", this._image.src = this
._currentImageURL))
}
itemIndex() {
return 1
}
labelIndex() {
return 0
}
image() {
return this._imageReady && this.showPlate() ? this._image : null
}
showPlate() {
return this._props().childs().showImage.value()
}
backgroundPlateColor(e) {
return this._props().childs().plateColor.value()
}
ready() {
return this._ready
}
type() {
return this._props().childs().itemType.value()
}
category() {
return 1
}
index() {
const e = this._source.points();
return 0 === e.length ? null : e[0].index
}
imageURL() {
const e = this._props().childs().emoji.value();
return Object(a.a)(e, "png") || null
}
sourceImage() {
return null
}
additionalImageURL() {
return null
}
additionalImageSource() {
return null
}
name() {
return ""
}
headline() {
return this._props().childs().text.value()
}
text() {
return ""
}
fullTextAst() {
return null
}
position() {
return this._props().childs().position.value()
}
fontSize() {
return this._props().childs().fontSize.value()
}
fontBold() {
return this._props().childs().bold.value()
}
fontItalic() {
return this._props().childs().italic.value()
}
sourceLabel() {
return null
}
_props() {
return this._source.properties()
}
}
class u extends o.a {
constructor(e) {
super(), this._source = e, e.pointAdded().subscribe(this, () => this.listeners()
.fire(this)), e.pointChanged().subscribe(this, () => this.listeners()
.fire(this))
}
value() {
const e = this._source.properties().childs().position.value();
return parseFloat(e.toFixed(2))
}
setValue(e) {
this._source.properties().childs().position.setValue(e), this._source.model()
.updateSource(this._source), this.listeners().fire(this), this._source
.syncMultichartState({
pricesChanged: !1,
indexesChanged: !1
})
}
}
var d = i("j8de");
class p extends d.a {
constructor(e, t) {
super(e, t), this._source = e
}
_setPointImpl(e) {
this._source.setPointAndChangeIndex(this._pointIndex, e)
}
}
var _ = i("j3hX"),
m = i("Eyy1"),
f = i("jvrd"),
g = i("mMWL");
class b extends r.LineDataSource {
constructor() {
super(...arguments), this._startMovingAnchorY = NaN
}
priceSource() {
return this.ownerSource()
}
addPoint(e, t, i) {
return super.addPoint(this._updatePositionAndCorrectPoint(e), t, i)
}
setPoint(e, t, i) {
super.setPoint(e, this._updatePositionAndCorrectPoint(t, !this.isPhantom() && !
this._allowChangeAnchorHorizontally()), i), this._syncPosition()
}
setPointAndChangeIndex(e, t, i) {
super.setPoint(e, this._updatePositionAndCorrectPoint(t, !1), i), this
._syncPosition()
}
startMoving(e, t, i, s) {
s || (this._startMovingAnchorY = Object(m.ensureNotNull)(this
._anchorYCoordinate())), super.startMoving(e, t, i)
}
move(e, t, i, s) {
var r;
const n = Object(m.ensureDefined)(Object(m.ensureNotNull)(this
.startMovingPoint()).logical),
o = Object(m.ensureDefined)(e.logical);
if (!s && 0 === t) {
const e = this._points[0],
t = o.index - n.index,
i = Object(m.ensureNotNull)(this.priceScale()),
s = Object(m.ensure)(null === (r = this.ownerSource()) || void 0 === r ?
void 0 : r.firstValue()),
a = i.priceToCoordinate(o.price, s) - i.priceToCoordinate(n.price, s),
l = this._startMovingAnchorY + a,
c = i.coordinateToPrice(l, s);
this._updatePositionAndCorrectPoint({
index: e.index + t,
price: c
})
}
super.move(e, t, i), s || this._syncPosition()
}
_allowChangeAnchorHorizontally() {
return !1
}
_updatePositionAndCorrectPoint(e, t) {
t && (e.index = this._points[0].index);
const i = this.priceSource();
if (null === i) return e;
const s = i.priceScale(),
r = i.firstValue();
if (null === s || s.isEmpty() || null === r) return e;
const n = s.height();
let o = n / 2,
a = e.price >= s.coordinateToPrice(o, r) ? 1 : -1;
const l = this._model.mainSeries();
if (i === l) {
const t = l.data().search(this._baseSeriesIndexForPoint(e));
if (null !== t) {
const i = Object(f.g)(l, t, -1),
n = Object(f.g)(l, t, 1);
a = e.price >= i ? 1 : -1, o = s.priceToCoordinate(1 === a ? n : i, r),
e.price = 1 === a ? Math.max(n, e.price) : e.price
}
}
const c = 1 === (-1 === a !== s.isInverted() ? -1 : 1) ? o : n - o,
h = s.priceToCoordinate(e.price, r),
u = Math.min(n, Math.abs(h - o)),
d = Math.max(0, Math.min(100, 100 * u / c)) * a;
return this.properties().childs().position.setValue(d), e
}
_baseSeriesIndexForPoint(e) {
return e.index
}
_syncPosition() {
const e = this.linkKey().value();
if (null !== e) {
const t = {
position: this.properties().childs().position.value()
};
Object(g.changeLineStyle)({
linkKey: e,
state: t,
model: this._model
})
}
}
_anchorYCoordinate() {
const e = this.priceSource();
if (null === e) return null;
const t = e.priceScale(),
i = e.firstValue();
if (null === t || t.isEmpty() || null === i) return null;
const s = this._model.mainSeries(),
r = this.customEvent();
if (null === r) return null;
let n = null;
if (e === s && (n = Object(f.f)(s, r)), null === n && (n = Object(f.c)(r, t,
i)), null === n) return null;
const o = r.position(),
a = t.priceToCoordinate(n.price, i);
return Object(f.d)(o, t.height(), a, Object(f.e)(o, t.isInverted()))
}
}
i.d(t, "LineToolSignpost", (function() {
return v
}));
class v extends b {
constructor(e, t) {
const s = t || v.createProperties();
super(e, s), this._item = new h(this), this.properties().childs().emoji.subscribe(
this, () => this._item.updateImage()), this._item.ready().subscribe(this,
() => this._model.updateSource(this)), i.e("lt-pane-views").then(i.bind(
null,
"KFbh")).then(t => {
this._setPaneViews([new t.SignpostPaneView(this, e)])
})
}
isItemHovered(e) {
return !1
}
isItemSelected(e) {
return !1
}
isHidden(e) {
return !1
}
items() {
return [this.customEvent()]
}
priceSource() {
return this.ownerSource()
}
pointsCount() {
return 1
}
properties() {
return super.properties()
}
name() {
return "Signpost"
}
customEvent() {
return this._item
}
showInObjectTree() {
return !this.isPhantom() && super.showInObjectTree()
}
isPhantom() {
return this._model.isPhantomLine(this)
}
clonePositionOffset() {
return {
barOffset: 1,
xCoordOffset: 0,
yCoordOffset: 0
}
}
template() {
const e = super.template(),
t = this.properties().childs();
return e.text = t.text.value(), e.position = t.position.value(), e
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolsignpost", e);
return v._configureProperties(t), t.hasChild("text") || t.addChild("text", new o.a(
window.t("Text"))), t.hasChild("position") || t.addChild("position", new o
.a(50)), t.addExclusion("text"), t.addExclusion("position"), t.addChild(
"backgroundsColors", new _.LineToolColorsProperty([t.childs().plateColor])),
t
}
_createPointProperty(e) {
super._createPointProperty(e);
const t = this._pointsProperty.childs().points[e];
t.removeProperty("price"), t.removeProperty("bar"), t.addChild("price", new u(
this)), t.addChild("bar", new p(this, 0))
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text),
this.properties().childs().position.setValue(e.position)
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e("lt-property-pages-with-definitions")])
.then(i.bind(null, "zb1A")).then(e => e.SignpostDefinitionsViewModel)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e)
}
}
v.supportPhantomMode = !0
},
gAom: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "clearRectWithGradient", (function() {
return o
})), i.d(t, "fillRectInnerBorder", (function() {
return a
})), i.d(t, "drawHorizontalLine", (function() {
return l
})), i.d(t, "drawVerticalLine", (function() {
return c
})), i.d(t, "drawRoundRect", (function() {
return u
})), i.d(t, "drawRoundRectWithInnerBorder", (function() {
return d
})), i.d(t, "fillRectWithBorder", (function() {
return p
})), i.d(t, "createCircle", (function() {
return _
}));
var s = i("aO4+"),
r = i("jFln"),
n = i("972a");
function o(e, t, i, s, r, n, o) {
e.save(), e.globalCompositeOperation = "copy";
const a = e.createLinearGradient(0, 0, 0, r);
a.addColorStop(0, n), a.addColorStop(1, o), e.fillStyle = a, e.fillRect(t, i, s, r), e
.restore()
}
function a(e, t, i, s, r, n) {
e.fillRect(t + n, i, s - 2 * n, n), e.fillRect(t + n, i + r - n, s - 2 * n, n), e.fillRect(
t, i, n, r), e.fillRect(t + s - n, i, n, r)
}
function l(e, t, i, s) {
e.beginPath();
const r = e.lineWidth % 2 ? .5 : 0;
e.moveTo(i, t + r), e.lineTo(s, t + r), e.stroke()
}
function c(e, t, i, s) {
e.beginPath();
const r = e.lineWidth % 2 ? .5 : 0;
e.moveTo(t + r, i), e.lineTo(t + r, s), e.stroke()
}
function h(e, t) {
return Array.isArray(e) ? e.map(e => 0 === e ? e : e + t) : e + t
}
function u(e, t, i, s, r, n, o) {
let a, l, c, h;
if (Array.isArray(n))
if (2 === n.length) {
const e = Math.max(0, n[0]),
t = Math.max(0, n[1]);
a = e, l = e, c = t, h = t
} else {
if (4 !== n.length) throw new Error(
"Wrong border radius - it should be like css border radius");
a = Math.max(0, n[0]), l = Math.max(0, n[1]), c = Math.max(0, n[2]), h = Math.max(0,
n[3])
}
else {
const e = Math.max(0, n);
a = e, l = e, c = e, h = e
}
o || e.beginPath(), e.moveTo(t + a, i), e.lineTo(t + s - l, i), 0 !== l && e.arcTo(t + s, i,
t + s, i + l, l), e.lineTo(t + s, i + r - c), 0 !== c && e.arcTo(t + s, i + r, t +
s - c, i + r, c), e.lineTo(t + h, i + r), 0 !== h && e.arcTo(t, i + r, t, i + r - h,
h), e.lineTo(t, i + a), 0 !== a && e.arcTo(t, i, t + a, i, a)
}
function d(e, t, i, s, o, a, l = 0, c = 0, d = "", p = n.b.Solid) {
if (e.save(), !c || !d || d === a) return u(e, t, i, s, o, l), e.fillStyle = a, e.fill(),
void e.restore();
const _ = c / 2;
if ("transparent" !== a) {
const r = "transparent" !== d && p !== n.b.Solid;
u(e, r ? t : t + c, r ? i : i + c, r ? s : s - 2 * c, r ? o : o - 2 * c, r ? l : h(l, -
c)), e.fillStyle = a, e.fill()
}
if ("transparent" !== d) {
u(e, t + _, i + _, s - c, o - c, h(l, -_)), e.lineWidth = c, e.strokeStyle = d, Object(r
.setLineStyle)(e, p), e.closePath(), e.stroke()
}
e.restore()
}
function p(e, t, i, n, o, a, l, c, h, u, d, p, _, m, f) {
const g = u ? 0 : t,
b = d ? _ : n;
if (void 0 !== a && (e.fillStyle = a, e.fillRect(g, i, b - g + m, o - i)), void 0 !== l &&
c > 0) {
if (e.beginPath(), Object(r.setLineStyle)(e, h), void 0 !== f) {
const t = f.map(e => e * c);
Object(r.setLineDash)(e, t)
}
let a = Object(s.point)(0, 0),
u = Object(s.point)(0, 0),
d = Object(s.point)(0, 0),
_ = Object(s.point)(0, 0);
switch (p) {
case "outer": {
const e = .5 * c;
d = Object(s.point)(0, e), _ = Object(s.point)(0, e), a = Object(s.point)(e, -
c), u = Object(s.point)(e, -c);
break
}
case "center": {
const e = c % 2 ? .5 : 0,
t = c % 2 ? .5 : m;
d = Object(s.point)(.5 * c - e, -e), _ = Object(s.point)(t + .5 * c, -e), a =
Object(s.point)(-e, e + .5 * c),
u = Object(s.point)(t, e + .5 * c);
break
}
case "inner": {
const e = .5 * c;
d = Object(s.point)(0, -e), _ = Object(s.point)(1, -e), a = Object(s.point)(-e,
c), u = Object(s.point)(1 - e, c);
break
}
}
e.lineWidth = c, e.strokeStyle = l, e.moveTo(g - d.x, i - d.y), e.lineTo(b + _.x, i - _
.y), e.moveTo(n + u.x, i + u.y), e.lineTo(n + u.x, o - u.y), e.moveTo(g - d.x,
o + d.y), e.lineTo(b + _.x, o + _.y), e.moveTo(t - a.x, i + a.y), e.lineTo(t - a
.x, o - a.y), e.stroke()
}
}
function _(e, t, i, s) {
e.beginPath(), e.arc(t, i, s, 0, 2 * Math.PI, !1), e.closePath()
}
},
gLxC: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("tc+8"),
n = i("Ocx9").DefaultProperty;
class o extends s {
constructor(e, t) {
super(e, t || o.createProperties()), this.version = o.version, i.e("lt-pane-views")
.then(i.bind(null, "Dz+H")).then(({
NotePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 1
}
name() {
return "Note"
}
getTooltipWidth() {
return o.TOOLTIP_WIDTH
}
getTooltipPadding() {
return o.TOOLTIP_PADDING
}
getTooltipLineSpacing() {
return o.TOOLTIP_LINESPACING
}
template() {
var e = s.prototype.template.call(this);
return e.text = this.properties().childs().text.value(), e
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
}
static createProperties(e) {
void 0 !== e && void 0 !== e.markerColor && void 0 === e.borderColor && (e
.borderColor = e.markerColor);
var t = new n("linetoolnote", e);
return o._configureProperties(t), t
}
state(e) {
var t = s.prototype.state.call(this, e);
return e && (t.state.fixedSize = !1), t
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "74nv")))
.NoteDefinitionsViewModel
}
static _configureProperties(e) {
s._configureProperties(e), e.hasChild("text") || e.addChild("text", new r(window.t(
"Text"))), e.addExclusion("text")
}
}
o.TOOLTIP_WIDTH = 300, o.TOOLTIP_PADDING = 10, o.TOOLTIP_LINESPACING = 5, o.version = 1;
class a extends o {
constructor(e, t) {
super(e, t || a.createProperties())
}
title() {
return window.t("Anchored Note")
}
name() {
return "Anchored Note"
}
isFixed() {
return !0
}
hasEditableCoordinates() {
return !1
}
static createProperties(e) {
var t = new n("linetoolnoteabsolute", e);
return a._configureProperties(t), t
}
static _configureProperties(e) {
o._configureProperties(e)
}
}
t.LineToolNote = o, t.LineToolNoteAbsolute = a
},
gMtF: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolRiskRewardPriceAxisView", (function() {
return r
}));
var s = i("KcY8");
class r extends s.a {
constructor(e, t) {
super(), this._source = e, this._data = t
}
_updateRendererData(e, t, i) {
if (e.visible = !1, !this._showAxisLabel()) return;
const s = this._source.priceScale();
if (0 === this._source.points().length || null === s || s.isEmpty()) return;
const r = this._source.ownerSource(),
n = null !== r ? r.firstValue() : null;
if (null === n) return;
const o = this._data.priceProperty.value(),
a = this._data.colorProperty.value();
i.background = a, i.textColor = this.generateTextColor(a), i.coordinate = s
.priceToCoordinate(o, n), e.text = s.formatPrice(o, n), e.visible = !0
}
_showAxisLabel() {
return this._source.properties().childs().showPriceLabels.value()
}
}
},
gP14: function(e, t, i) {
"use strict";
i.r(t);
var s = i("hbEN"),
r = i("Eyy1"),
n = i("aO4+"),
o = i("eJTA"),
a = i("HGP3"),
l = i("oiZD"),
c = i("JWMC"),
h = i("jofe"),
u = i("vTIA"),
d = i("GxN8"),
p = i("8sOK"),
_ = i("LxhU"),
m = i("tc+8"),
f = i.n(m),
g = i("gvrv"),
b = i("jenN"),
v = i("kcTO"),
S = i("Ocx9"),
y = i("wZIs"),
w = i("oV8k"),
P = i("Kxc7"),
C = i("n5al"),
x = i("sDZI");
const T = new v.PriceFormatter;
class I extends w.a {
constructor(e, t, i) {
super(e, t), this._studySource = null, this._paneViews = [], this._metaInfo =
null, this._destroyed = !1, this._isStarted = !1, this._loadedGraphics =
null, this._doubleClickHandler = i;
const s = t.mainSeries();
this._properties = new S.DefaultProperty("sessions"), Object(y
.applyDefaultsOverrides)(this._properties.childs().graphics, void 0, !1,
"sessions"), this._removeDuplicateProperties(), this._properties
.subscribe(this, this._onPropertiesChanged), t.studyMetaInfoRepository()
.findById({
type: "java",
studyId: "Sessions@tv-basicstudies"
}).then(e => {
this._destroyed || null === this._loadedGraphics && (this
._setMetaInfo(e), null !== this._metaInfo && (this
._studySource = new g.a(t.chartApi(), s.seriesSource(),
"sessions_", this._metaInfo), this
._createPaneViews(), this._studySource.dataCleared()
.subscribe(this, this.updateAllViews), this._studySource
.dataUpdated().subscribe(this, this.updateAllViews),
this._studySource.setInputs({}), this
._processHibernate()))
}), t.timeScale().onReset().subscribe(this, this._clearData), t.timeScale()
.logicalRangeChanged().subscribe(this, this.updateAllViews), t.mainSeries()
.sessionIdProxyProperty().subscribe(this, this
._updateVisibleOfPreAndPostMarketBackground), t.mainSeries()
.properties().interval.subscribe(this, this._processHibernate), this
._updateVisibleOfPreAndPostMarketBackground(t.mainSeries().properties()
.sessionId)
}
applyOverrides(e) {
Object(y.applyPropertiesOverrides)(this._properties.childs().graphics, void 0, !
1, e, "sessions"), this._model.updateSource(this)
}
start() {
this._isStarted = !0, this._processHibernate()
}
restart() {
this._clearData(), P.enabled("stop_study_on_restart") && this.stop(), this
.start()
}
isStarted() {
return this._isStarted
}
stop() {
this._isStarted = !1, null !== this._studySource && this._studySource.stop()
}
isHoveredEnabled() {
return !1
}
paneViews(e) {
return this._paneViews
}
updateAllViews() {
this._paneViews.forEach(e => e.update())
}
updateViewsForPane(e) {
this.updateAllViews()
}
destroy() {
this._destroyed = !0, null !== this._studySource && (this._studySource
.dataCleared().unsubscribeAll(this), this._studySource.dataUpdated()
.unsubscribeAll(this), this._studySource.destroy(), this._studySource =
null), this._model.timeScale().logicalRangeChanged().unsubscribeAll(
this), this._model.timeScale().onReset().unsubscribeAll(this), this
._model.mainSeries().sessionIdProxyProperty().unsubscribeAll(this), this
._model.mainSeries().properties().interval.unsubscribeAll(this), this
._properties.unsubscribeAll(this)
}
series() {
return this._model.mainSeries()
}
priceScale() {
return this.series().priceScale()
}
graphics() {
return this._loadedGraphics || Object(r.ensureNotNull)(this._studySource)
.graphics()
}
properties() {
return this._properties
}
graphicsInfo() {
return Object(r.ensureNotNull)(this._metaInfo).graphics
}
firstValue(e) {
return this._model.mainSeries().firstValue()
}
formatter() {
return T
}
state(e) {
const t = {
properties: this._properties.state()
};
return e && null !== this._metaInfo && (t.data = {
graphics: Object(b.saveStudyGraphics)(this.graphics()),
metaInfo: this._metaInfo
}), t
}
restoreState(e, t) {
const i = e.properties;
this._migrateOutOfSessionProperty(i), this._properties.mergeAndFire(i), this
._removeDuplicateProperties(), this
._updateVisibleOfPreAndPostMarketBackground(this._model.mainSeries()
.properties().sessionId), void 0 !== e.data && t && (this
._loadStudyGraphics(e.data.graphics), this._setMetaInfo(e.data
.metaInfo), this._createPaneViews())
}
restoreOldState(e, t) {
const i = {
properties: {
graphics: e.state.graphics
}
};
void 0 !== e.data && void 0 !== e.metaInfo && t && (i.data = {
metaInfo: e.metaInfo,
graphics: e.data.graphics
}), this.restoreState(i, t)
}
applyPreferences(e) {
this._properties.mergePreferences(e)
}
metaInfo() {
return Object(r.ensureNotNull)(this._metaInfo)
}
_loadStudyGraphics(e) {
const t = e.backgrounds;
if (void 0 !== t) {
const e = t.findIndex(e => "inSession" === e.styleId); - 1 !== e && t
.splice(e, 1)
}
this._loadedGraphics = Object(b.loadStudyGraphics)(e)
}
_setMetaInfo(e) {
const t = e.graphics.backgrounds;
void 0 !== t && void 0 !== t.inSession && delete t.inSession, this._metaInfo = e
}
_updateVisibleOfPreAndPostMarketBackground(e) {
const t = !Object(C.isRegularSessionId)(e.value());
this._outOfSessionVisibilityProperty().setValue(t), this
._preMarketVisibilityProperty().setValue(t), this
._postMarketVisibilityProperty().setValue(t)
}
_clearData() {
null !== this._studySource && this._studySource.clearData()
}
_createPaneViews() {
const e = {
doubleClickHandler: this._doubleClickHandler
};
Object(b.createGraphicsPaneViews)(this, this._model, e).then(e => {
this._paneViews = e, this._model.lightUpdate()
})
}
_onPropertiesChanged() {
this._processHibernate(), this.updateAllViews()
}
_processHibernate() {
if (null !== this._studySource) {
const e = this._canBeHibernated(),
t = this._isHibernated(),
i = this._studySource.isStarted();
!t && e && i ? this._studySource.stop() : !t || e || i || this._studySource
.start()
}
}
_canBeHibernated() {
const e = this._model.mainSeries(),
t = this._preMarketVisibilityProperty().value() && this
._postMarketVisibilityProperty().value() && this
._outOfSessionVisibilityProperty().value();
return e.isDWM() || !t && !this._vertLinesVisibleProperty().value()
}
_isHibernated() {
return this._isStarted && (null === this._studySource || !this._studySource
.isStarted())
}
_outOfSessionVisibilityProperty() {
return this._properties.childs().graphics.childs().backgrounds.childs()
.outOfSession.childs().visible
}
_preMarketVisibilityProperty() {
return this._properties.childs().graphics.childs().backgrounds.childs()
.preMarket.childs().visible
}
_postMarketVisibilityProperty() {
return this._properties.childs().graphics.childs().backgrounds.childs()
.postMarket.childs().visible
}
_vertLinesVisibleProperty() {
return this._properties.childs().graphics.childs().vertlines.childs().sessBreaks
.childs().visible
}
_removeDuplicateProperties() {
this._properties.hasChild("properties") && (this._properties.removeProperty(
"properties"), Object(S.saveDefaultProperties)(!0), this._properties
.childChanged("", null),
Object(S.saveDefaultProperties)(!1))
}
_migrateOutOfSessionProperty(e) {
const t = e.graphics.backgrounds;
if (void 0 !== t) {
const i = t.outOfSession;
i.color === Object(r.ensureDefined)(x.sessionsPreferencesDefault.graphics
.backgrounds).outOfSession.color || "postMarket" in t || (e.graphics
.backgrounds = {
...t,
postMarket: {
color: i.color,
transparency: i.transparency,
visible: i.visible
},
preMarket: {
color: i.color,
transparency: i.transparency,
visible: i.visible
}
})
}
}
}
var M = i("3ClC"),
O = i("aIyQ"),
L = i.n(O),
A = i("hY0g"),
E = i.n(A),
k = i("H0vP"),
D = i("iDOr"),
V = i("MbIA"),
B = i("gQ5K"),
R = i("3t3b"),
N = i("4kQX"),
j = i("mPvX"),
F = i("mMWL"),
W = i("txPx"),
H = i("CW80"),
U = i("e3/o"),
z = i("ogJP"),
G = i("Tmoa"),
q = i("fTGZ"),
Y = i("4vW/");
function K(e, t) {
return e.code < t.code ? -1 : e.code > t.code ? 1 : 0
}
class J {
constructor(e) {
this._convertibleItems = e, this._idsToItems = new Map;
for (const t of e) this._idsToItems.set(t.id, t)
}
convertible(e) {
return void 0 !== this._idsToItems.get(e)
}
size() {
return this._convertibleItems.length
}
filterConvertible(e, t) {
const i = this._convertibleItems.filter(function(e, t) {
return i => !e.has(i.id) && t(i.id)
}(e, t));
return i.sort(K), i
}
}
class Z {
constructor(e) {
this._allGroups = new Set, this._idToName = new Map, this._idToDescription =
new Map, this._groupedUnitIds = new Map, this._groupedUnits = new Map, this
._groupById = new Map, this._size = 0, this._units = e;
for (const t in e)
if (e.hasOwnProperty(t)) {
this._allGroups.add(t), this._groupedUnitIds.set(t, new Set(e[t].map(e => e
.id))), this._groupedUnits.set(t, e[t]);
for (const i of e[t]) this._size++, this._idToName.set(i.id, i.name), this
._idToDescription.set(i.id, i.description), this._groupById.set(i.id, t)
}
}
unitsChanged(e) {
return this._units !== e
}
size() {
return this._size
}
name(e) {
return this._idToName.get(e) || e
}
description(e) {
return this._idToDescription.get(e) || e
}
unitGroupById(e) {
return this._groupById.get(e) || null
}
allGroups() {
return new Set(this._allGroups)
}
unitsByGroups(e) {
const t = [];
return e.forEach(e => {
const i = this._groupedUnits.get(e);
void 0 !== i && t.push({
name: e,
units: i
})
}), t
}
convertible(e, t) {
for (const i of t) {
const t = this._groupedUnitIds.get(i);
if (void 0 !== t && t.has(e)) return !0
}
return !1
}
}
var X = i("ivNn");
class $ {
constructor(e) {
this._source = null, this._sourcePane = null, this
._currentToolSupportsPhantomMode = !1, this._model = e
}
destroy() {
this._source = null, this._sourcePane = null
}
source() {
return this._source
}
onToolChanged() {
this._removeSource();
const e = this._model.currentTool();
this._currentToolSupportsPhantomMode = Object(H.isLineToolName)(e) && Object(H
.supportsPhantomMode)(e)
}
onCursorPositionUpdated() {
if (!this._currentToolSupportsPhantomMode) return;
const e = this._model.crossHairSource();
if (this._sourcePane !== e.pane && this._removeSource(), null === e.pane || !Object(
X.isNumber)(e.index) || !Object(X.isNumber)(e.price)) return void this
._removeSource();
const t = {
index: e.index,
price: e.price
};
null !== this._source ? this._source.setPoint(0, t) : (this._source = this._model
.createLineTool(e.pane, t, this._model.currentTool(), void 0, null), this
._sourcePane = e.pane)
}
_removeSource() {
null !== this._source && (this._model.removeSource(this._source), this._source =
null, this._sourcePane = null)
}
}
var Q = i("k9/m"),
ee = i("4o++"),
te = i("zL3Q");
class ie {
align(e, t, i) {
let s = e;
if (!Object(te.a)().value()) return s;
const n = i.mainDataSource();
if (null === n) return s;
const o = n.model().mainSeries();
if (n !== o) return s;
const a = o.priceScale(),
l = o.bars();
if (a.isEmpty() || !l.contains(t)) return s;
const c = l.valueAt(t);
if (null === c) return s;
const h = [];
null !== o.priceSource() ? h.push(o.barFunction()(c)) : h.push(c[1], c[2], c[3], c[
4]);
const u = Object(r.ensure)(o.firstValue()),
d = h.map(e => ({
y: a.priceToCoordinate(e, u),
price: e
})),
p = a.priceToCoordinate(e, u);
d.sort((e, t) => Math.abs(e.y - p) - Math.abs(t.y - p));
const _ = d[0];
return (Object(te.b)().value() === ee.MagnetMode.StrongMagnet || Math.abs(_.y - p) <
50) && (s = _.price), s
}
}
var se = i("Qb4w"),
re = i("jCNj"),
ne = i("OLhd");
i.d(t, "ChartModelBase", (function() {
return ce
}));
const oe = Object(W.getLogger)("Chart.ChartModel");
function ae(e, t) {
const i = e.indexOf(t);
return -1 !== i && (e.splice(i, 1), !0)
}
const le = {
isSnapshot: !1,
readOnly: !1,
watermarkEnabled: !0,
shiftVisibleRangeOnNewBar: !0,
currencyConversionEnabled: !1,
unitConversionEnabled: !1,
countdownEnabled: !0,
lastPriceAnimationEnabled: !0
};
class ce {
constructor(e, t, i, r, n, o, a, c) {
this._onRearrangePanes = new L.a, this._lineToolsGroupModel = new j
.LineToolsGroupModel, this._sourcesBeingMoved = [], this._lineItemBeingMoved =
null, this._lineBeingEdited = null, this._linePointBeingEdited = null, this
._linePointBeingChanged = null, this._customSourceBeingMovedHitTestData = null,
this._customSourceBeingMoved = null, this._dataSourceCollectionChanged = new L
.a, this._sourceProperitesChanged = new L.a, this._sourceZOrderChanged = new L
.a, this._dataSourceSymbolResolved = new L.a, this._sessions = null, this
._currentTool = "", this._lineBeingCreated = null, this
._paneBeingCreatedLineOn = null, this._lineCancelled = new L.a, this
._phantomSourceContainer = new $(this), this._destroyed = !1, this
._isSettingsExternalPosition = !1, this._isTimeScrolling = !1, this._magnet =
new ie, this._scrollingState = null, this._panes = [], this._tagsChanged = new L
.a, this._strategySources = [], this._strategySourcesChange = new L.a, this
._activeStrategySource = new E.a(null), this._panesCollectionChanged = new L.a,
this._scrollEnabled = P.enabled("chart_scroll"), this._zoomEnabled = P.enabled(
"chart_zoom"), this._isScalesResetAvailableChanged = new L.a, this
._isScalesResetAvailable = !1, this._esdWatcher = null, this._alertsWatcher =
null, this._hoveredSource = null, this._hoveredSourceChanged = new L.a, this
._lastHoveredHittestData = null, this._lastSelectedHittestData = null, this
._topmostCustomSources = [], this._fgCustomSources = [], this
._bgCustomSources = [], this._allCustomSources = [], this._customSourcesMap =
new Map, this._multiPaneSources = [], this._showLegendProperty = new f.a, this
._id = Object(U.guid)(), this._chartSaveTime = null, this
._availableCurrenciesList = null, this._availableCurrencies = new J([]), this
._availableUnitsObject = null, this._availableUnits = new Z({}), this
._shouldBeSavedEvenIfHidden = !1, this._watchedThemeSpawn = l.watchedTheme
.spawn(), this._gradientColorsCache = null, this._recalcVRStudiesParams = {},
this._recalcColorStudiesParams = {},
this._recalcVisibleRangeStudiesImplDebounced = Object(s.default)(this
._recalcVisibleRangeStudiesImpl.bind(this, this._recalcVRStudiesParams), 500
), this._recalcColorStudiesImplDebounced = Object(s.default)(this
._recalcColorStudiesImpl.bind(this, this._recalcColorStudiesParams), 250),
this._width = 0, this._resetScales = new L.a, this._chartThemeLoaded = new L.a,
this._chartApi = e, this._invalidateHandler = t, this._undoModel = o, this
._properties = i, this._options = Object(z.merge)(Object(z.clone)(le), c), this
._studiesMetaInfoRepository = n, this._readOnly = this._options.readOnly, this
._isSnapshot = this._options.isSnapshot, this._chartSaveTime = (new Date)
.valueOf(), this._backgroundColor = new E.a(this._getBackgroundColor()), this
._backgroundTopColor = new E.a(this._getBackgroundColor(!0)), this._properties
.childs().paneProperties.childs().background.subscribe(this, this
._updateBackgroundColor), this._properties.childs().paneProperties.childs()
.backgroundType.subscribe(this, this._updateBackgroundColor), this._properties
.childs().paneProperties.childs().backgroundGradientStartColor.subscribe(this,
this._updateBackgroundColor), this._properties.childs().paneProperties
.childs().backgroundGradientEndColor.subscribe(this, this
._updateBackgroundColor), this._backgroundColor.subscribe(this
.recalcColorStudies.bind(this, !1)), this._watchedThemeSpawn.subscribe(this
._updateBackgroundColor.bind(this))
}
version() {
return 3
}
chartSaveTime() {
return this._chartSaveTime
}
setChartSaveTime(e) {
this._chartSaveTime = e
}
destroy() {
this._phantomSourceContainer.destroy(), this._hoveredSourceChanged.destroy(),
null !== this._watermarkSource && (this._watermarkSource.destroy(), this
._watermarkSource = null), Array.from(this._customSourcesMap.keys())
.forEach(this._removeCustomSource, this), Object(r.assert)(0 === this
._topmostCustomSources.length), Object(r.assert)(0 === this._fgCustomSources
.length), Object(r.assert)(0 === this._bgCustomSources.length), Object(r
.assert)(0 === this._allCustomSources.length), Object(r.assert)(0 === this
._customSourcesMap.size), null !== this._esdWatcher && (this._esdWatcher
.destroy(), this._esdWatcher = null), null !== this._alertsWatcher && (this
._alertsWatcher.destroy(), this._alertsWatcher = null), this._properties
.childs().paneProperties.childs().background.unsubscribeAll(this), this
._properties.childs().paneProperties.childs().backgroundType.unsubscribeAll(
this), this._properties.childs().paneProperties.childs()
.backgroundGradientEndColor.unsubscribeAll(this), this._properties.childs()
.paneProperties.childs().backgroundGradientStartColor.unsubscribeAll(this), this
._watchedThemeSpawn.destroy(), this._destroyed = !0
}
undoModel() {
return this._undoModel
}
addStrategySource(e) {
-1 === this._strategySources.indexOf(e) && (this._strategySources.push(e), this
._strategySourcesChange.fire(), this.setActiveStrategySource(e))
}
removeStrategySource(e) {
const t = this._strategySources.indexOf(e);
if (-1 !== t) {
if (this._strategySources.splice(t, 1)[0] === this._activeStrategySource
.value() && this.unsetActiveStrategySource(), this._strategySources.length >
0
) {
const e = this._strategySources[this._strategySources.length - 1];
this.setActiveStrategySource(e)
}
this._strategySourcesChange.fire()
}
}
setActiveStrategySource(e) {
-1 !== this._strategySources.indexOf(e) && this._activeStrategySource.setValue(e)
}
unsetActiveStrategySource() {
this._activeStrategySource.setValue(null)
}
activeStrategySource() {
return this._activeStrategySource
}
strategySources() {
return this._strategySources
}
strategySourcesChange() {
return this._strategySourcesChange
}
setScrollEnabled(e) {
this._scrollEnabled = e
}
scrollEnabled() {
return this._scrollEnabled
}
setZoomEnabled(e) {
this._zoomEnabled = e
}
zoomEnabled() {
return this._zoomEnabled
}
zoomToViewport(e, t, i, s, r) {
this.setTimeViewport(e, t);
let n = Math.min(i, s),
o = Math.max(i, s);
const a = r.defaultPriceScale();
a.isPercentage() || a.setMode({
autoScale: !1
}), a.isLog() && (n = a.priceToLogical(n), o = a.priceToLogical(o)), a
.setPriceRange(new se.PriceRange(n, o)), this.recalculateAllPanes(), this
.invalidate(this._paneInvalidationMask(r, k.InvalidationLevel.Light)), this
._setScalesResetAvailable(!0)
}
setTimeViewport(e, t) {
this.timeScale().zoomToBarsRange(e, t), this.recalculateAllPanes(), this
.recalcVisibleRangeStudies(), this.lightUpdate()
}
onTagsChanged() {
return this._tagsChanged
}
canZoomIn() {
return this._timeScale.canZoomIn() && this._zoomEnabled
}
canZoomOut() {
return this._timeScale.canZoomOut() && this._zoomEnabled
}
onPaneTagsChanged() {
this._tagsChanged.fire()
}
panesCollectionChanged() {
return this._panesCollectionChanged
}
dataSourceCollectionChanged() {
return this._dataSourceCollectionChanged
}
symbolSourceResolved() {
return this._dataSourceSymbolResolved
}
sourceProperitesChanged() {
return this._sourceProperitesChanged
}
sourceZOrderChanged() {
return this._sourceZOrderChanged
}
updateCrosshairPositionByOriginCoords() {
const e = this.crossHairSource(),
t = e.pane;
let i = e.originX(),
s = e.originY();
if (Number.isFinite(i) || (i = e.x, s = e.y), null !== t && Number.isFinite(i) &&
Number.isFinite(s)) {
const e = this._timeScale.coordinateToVisibleIndex(i);
let n = NaN;
const o = t.defaultPriceScale();
if (!o.isEmpty()) {
const e = Object(r.ensureNotNull)(t.mainDataSource()).firstValue();
null !== e && (n = o.coordinateToPrice(s, Object(r.ensureNotNull)(e)))
}
this.crossHairSource().setPosition(e, n, t) && this._undoModel.chartWidget()
.isActive() && this._syncCrosshair()
}
}
zoomTime(e, t, i) {
if (!this._zoomEnabled) return;
const s = this.timeScale();
if (s.isEmpty() || 0 === t) return;
const r = s.width();
e = Math.max(1, Math.min(e, r - 2)), s.zoom(e, t, i), this.recalculateAllPanes(),
this.lightUpdate(), this.recalcVisibleRangeStudies(), this
._setScalesResetAvailable(!0)
}
linePointBeingEdited() {
return this._linePointBeingEdited
}
linePointBeingChanged() {
return this._linePointBeingChanged
}
dataSources() {
const e = [this.crossHairSource()];
for (const t of this._panes)
for (const i of t.dataSources()) e.push(i);
return e
}
priceDataSources() {
const e = [];
for (const t of this._panes)
for (const i of t.priceDataSources()) e.push(i);
return e
}
lineToolsGroupModel() {
return this._lineToolsGroupModel
}
restoreLineToolsGroups(e) {
this._lineToolsGroupModel = j.LineToolsGroupModel.fromState(this, e)
}
realignLineTools() {
for (const e of this._panes) e.realignLineTools() && this
._dataSourceCollectionChanged.fire(e)
}
updateSource(e) {
const t = this._invalidationMaskForSource(e);
null !== t && this.invalidate(t)
}
updateSourcePriceScale(e) {
const t = this._invalidationMaskForSourcePriceScale(e);
null !== t && this.invalidate(t)
}
replaceStudyStub(e, t) {
const i = this.paneForSource(e);
if (null === i) return !1;
const s = e.priceScale(),
r = e.zorder(),
n = e.ownerSource();
return this.paneForSource(e) === i ? i.replaceSource(e, t, s) : (i.insertDataSource(
t, s, r), this.removeSource(e)), t.setOwnerSource(n), this.dataSources()
.forEach(i => {
i.ownerSource() === e && i.setOwnerSource(t)
}), t.start(), this.recalculatePane(i), this.fullUpdate(), !0
}
insertStudyStub(e) {
const t = this.mainSeries(),
i = Object(r.ensureNotNull)(this.paneForSource(t)),
s = new p.StudyStub(this, null, e),
n = i.createPriceScaleAtPosition("overlay");
return i.addDataSource(s, n, !1), this.recalculatePane(i), this.fullUpdate(), s
}
removeStudyStub(e) {
const t = this.dataSourceForId(e);
return null === t ? (oe.logNormal("StudyStub id=" + e +
" is not found in chart model"), !1) : (this.removeSource(t), !0)
}
setHoveredSource(e, t = null) {
const i = this._hoveredSource !== e;
if (!i && this._lastHoveredHittestData === t) return;
this._lastHoveredHittestData = t;
let s = null;
if (this._hoveredSource) {
this._hoveredSource.updateAllViews(), s = new k.InvalidationMask(k
.InvalidationLevel.Cursor);
const e = this._invalidationMaskForSource(this._hoveredSource, k
.InvalidationLevel.Light);
null !== e && s.merge(e)
}
if (this._hoveredSource = e, e) {
e.updateAllViews(), s || (s = new k.InvalidationMask(k.InvalidationLevel
.Cursor));
const t = this._invalidationMaskForSource(e, k.InvalidationLevel.Light);
null !== t && s.merge(t)
}
s && this.invalidate(s), i && this._hoveredSourceChanged.fire(e)
}
hoveredSource() {
return this._hoveredSource
}
hoveredSourceChanged() {
return this._hoveredSourceChanged
}
lastHittestData() {
return this._lastHoveredHittestData || this.lastSelectedHittestData()
}
lastSelectedHittestData() {
var e;
return this._lastSelectedHittestData || ((null === (e = this
._customSourceBeingMovedHitTestData) || void 0 === e ? void 0 : e
.beingMoved) ? this._customSourceBeingMovedHitTestData : null)
}
syncTimeWithModel(e, t) {
const i = this.mainSeries().syncModel();
if (null === i) return;
const s = 1e3 * this.createSyncPoint(Object(r.ensureNotNull)(e.mainSeries()
.syncModel()), i).sourceTimeToTargetTime(t / 1e3),
n = Object(re.get_timezone)(this.timezone());
let o = Object(re.utc_to_cal)(n, s);
this.mainSeries().isDWM() && (o = i.getSession().spec.correctTradingDay(o), Object(
re.set_hms)(o, 0, 0, 0, 0, Object(re.get_timezone)("Etc/UTC"))), this
._gotoTimeImpl(o.getTime(), {
centerIfVisible: !1
})
}
gotoTime(e) {
return this._gotoTimeImpl(e, {
centerIfVisible: !0
})
}
paneForSource(e) {
if (!Object(d.a)(e)) return Array.from(this._customSourcesMap.values()).includes(
e) ? this.paneForSource(this.mainSeries()) : null;
for (let t = this._panes.length - 1; t >= 0; t--)
if (this._panes[t].hasDataSource(e)) return this._panes[t];
return e instanceof q.BarsMarksContainer ? this.paneForSource(this.mainSeries()) :
null
}
allStudies(e) {
const t = e ? e => Object(M.isStudy)(e) && !Object(M.isESDStudy)(e) : M.isStudy;
return this._getAllSources(t)
}
findNonOverlayStudyWithGroupingKey(e, t) {
const i = void 0 !== t ? [t] : this._panes;
for (const t of i) {
const i = t.dataSources().find(i => Object(M.isStudy)(i) && i.metaInfo()
.groupingKey === e && !t.isOverlay(i));
if (void 0 !== i) return {
pane: t,
study: i
}
}
return null
}
movePaneUp(e) {
this.movePane(e, e - 1)
}
movePaneDown(e) {
this.movePane(e, e + 1)
}
movePane(e, t) {
const i = this._panes[e];
this._panes.splice(e, 1), this._panes.splice(t, 0, i), this._panesCollectionChanged
.fire(this._panes), this._onRearrangePanes.fire(), this.invalidate(k
.InvalidationMask.panesOrder())
}
backgroundColor() {
return this._backgroundColor
}
backgroundTopColor() {
return this._backgroundTopColor
}
backgroundColorAtYPercentFromTop(e) {
const t = this.backgroundColor().value(),
i = this.backgroundTopColor().value();
if (t === i) return t;
if (e = Math.max(0, Math.min(100, Math.round(100 * e))), null === this
._gradientColorsCache || this._gradientColorsCache.topColor !== i || this
._gradientColorsCache.bottomColor !== t) this._gradientColorsCache = {
topColor: i,
bottomColor: t,
colors: new Map
};
else {
const t = this._gradientColorsCache.colors.get(e);
if (void 0 !== t) return t
}
const s = Object(G.gradientColorAtPercent)(i, t, e / 100);
return this._gradientColorsCache.colors.set(e, s), s
}
backgroundCounterColor() {
const e = this.backgroundColor().value();
if (void 0 === this._lastBackgroundColor || void 0 === this._lastOriginalColor ||
e !== this._lastBackgroundColor) {
const t = Object(o.rgbToBlackWhiteString)(Object(o.parseRgb)(e), 150);
this._lastBackgroundColor = e, this._lastOriginalColor = "black" === t ?
"white" : "black"
}
return this._lastOriginalColor
}
isDark() {
return "white" === this.backgroundCounterColor()
}
defaultResolutions() {
return this.chartApi().defaultResolutions()
}
availableCurrencies() {
const e = this._getAvailableCurrencies();
return e.length !== this._availableCurrencies.size() && (this._availableCurrencies =
new J(e)), this._availableCurrencies
}
currencyConversionEnabled() {
return this._options.currencyConversionEnabled
}
availableUnits() {
const e = this._getAvailableUnits();
return this._availableUnits.unitsChanged(e) && (this._availableUnits = new Z(e)),
this._availableUnits
}
unitConversionEnabled() {
return this._options.unitConversionEnabled
}
studyTemplate(e, t, i) {
const s = {
panes: [],
version: this.version()
};
for (const e of this.panes()) s.panes.push(e.state(!0, !1, !0));
const r = this.mainSeries();
return e && (s.symbol = r.symbol(), i && (s.currency = r.currency()), i && (s.unit =
r.unit())), t && (s.interval = r.interval()), s
}
restoreLineToolState(e, t) {
e.restorePoints(t.points, t.indexes || []), e.properties().merge(t.state), e
.restoreData && e.restoreData(t), e.linkKey().setValue(t.linkKey || null), e
.createServerPoints(), this.fullUpdate();
const i = e.linkKey().value();
null !== i && Object(F.restoreLineToolState)({
model: this,
linkKey: i,
state: t
})
}
updateLineTools() {
for (const e of this.dataSources()) Object(H.isLineTool)(e) && (e
.tryCreateServerPoints(), e.checkAlert && e.checkAlert())
}
onResetScales() {
return this._resetScales
}
startMovingSources(e, t, i, s, n, o) {
if (this._sourcesBeingMoved = e, this._lineItemBeingMoved = i, this
._sourcesBeingMoved.forEach(e => {
const a = Object(r.ensureNotNull)(this.paneForSource(e)),
l = Object(H.isLineTool)(e),
c = l && e.linkKey().value();
if (!1 !== c && null !== c && s.has(c) && l && e.isFixed()) {
const t = Object(r.ensureDefined)(s.get(c)),
l = {
screen: this._percentPositionToPoint(t, a)
};
e.startMoving(l, i, n, o)
} else e.startMoving(t, i, n, o);
const h = this._paneInvalidationMask(a, k.InvalidationLevel.Light);
this.invalidate(h)
}), !o) {
const s = e.filter(H.isLineTool).filter(e => e.linkKey().value() && e
.isSynchronizable()).map(e => e.linkKey().value());
if (s.length && t.logical) {
const o = this.externalTimeStamp(t.logical.index),
a = {
linkKeys: s,
model: this,
symbol: this.mainSeries().symbol(),
point: {
price: t.logical.price,
timeStamp: o
},
itemIndex: null !== i ? i : void 0,
envState: n,
pointPositionPercents: new Map
};
e.forEach(e => {
if (Object(H.isLineTool)(e)) {
const i = e.linkKey().value();
if (i && e.isSynchronizable() && e.isFixed()) {
const s = Object(r.ensureNotNull)(this.paneForSource(
e));
a.pointPositionPercents.set(i, this
._pointToPercentPosition(Object(r.ensureDefined)
(t.screen), s))
}
}
}), Object(F.startMovingLineTool)(a)
}
}
F.isToolMovingNow.setValue(!0)
}
moveSources(e, t, i, s) {
if (this._sourcesBeingMoved.filter(e => !e.isLocked || !e.isLocked()).forEach(n => {
const o = Object(H.isLineTool)(n) ? n.linkKey().value() : null;
if (null !== o && t.has(o)) {
const e = Object(r.ensureNotNull)(this.paneForSource(n)),
a = Object(r.ensureDefined)(t.get(o)),
l = {
screen: this._percentPositionToPoint(a, e)
};
n.move(l, this._lineItemBeingMoved, i, s)
} else n.move(e, this._lineItemBeingMoved, i, s)
}), this.lightUpdate(), !s && e.logical) {
const t = this._sourcesBeingMoved.filter(H.isLineTool).filter(e => e
.isSynchronizable() && !!e.linkKey().value()).map(e => e.linkKey()
.value()),
s = this.externalTimeStamp(e.logical.index),
n = {
linkKeys: t,
model: this,
point: {
price: e.logical.price,
timeStamp: s
},
envState: i,
pointPositionPercents: new Map
};
this._sourcesBeingMoved.filter(H.isLineTool).forEach(t => {
if (t.linkKey().value() && t.isSynchronizable() && t.isFixed()) {
const i = Object(r.ensureNotNull)(this.paneForSource(t));
n.pointPositionPercents.set(t.linkKey().value(), this
._pointToPercentPosition(Object(r.ensureDefined)(e
.screen), i))
}
}), Object(F.moveLineTool)(n)
}
}
endMovingSources(e, t) {
const i = this._sourcesBeingMoved.map(i => {
const s = Object(r.ensureNotNull)(this.paneForSource(i)),
n = i.endMoving(e, t),
o = this._paneInvalidationMask(s, k.InvalidationLevel.Light);
return o.invalidateAll(k.InvalidationLevel.Light), this.invalidate(o), n
}),
s = this._sourcesBeingMoved.filter(H.isLineTool).filter(e => e
.isSynchronizable() && !!e.linkKey().value()).map(e => e.linkKey().value()),
n = this._sourcesBeingMoved.filter(H.isLineTool).filter(e => e
.isSynchronizable() && !!e.linkKey).map(e => {
const t = {
points: e.normalizedPoints(),
interval: this.mainSeries().interval()
};
return e.isFixed() && (t.pointPositionPercents = e
.calcPositionPercents()), t
});
s.length && Object(F.finishMovingLineTool)({
linkKeys: s,
model: this,
finalStates: n,
changes: i
}), this._sourcesBeingMoved = [], this._lineItemBeingMoved = null, F
.isToolMovingNow.setValue(!1)
}
sourcesBeingMoved() {
return this._sourcesBeingMoved
}
setMovingCustomSource(e, t) {
this._customSourceBeingMoved = e, this._customSourceBeingMovedHitTestData = null !==
t ? {
beingMoved: !1,
...t
} : null
}
processingCustomSourceMove() {
null !== this._customSourceBeingMovedHitTestData && (this
._customSourceBeingMovedHitTestData.beingMoved = !0)
}
customSourceMovingHitTestData() {
return this._customSourceBeingMovedHitTestData
}
customSourceBeingMoved() {
return null !== this._customSourceBeingMovedHitTestData && this
._customSourceBeingMovedHitTestData.beingMoved ? this._customSourceBeingMoved :
null
}
width() {
return this._width
}
setWidth(e, t) {
this._width = e, this._timeScale.setWidth(e, t);
for (const t of this._panes) t.setWidth(e);
this.recalculateAllPanes(), this.recalcVisibleRangeStudies()
}
setPaneHeight(e, t) {
e.setHeight(t), this.recalculateAllPanes(), this.lightUpdate()
}
isScalesResetAvailableChanged() {
return this._isScalesResetAvailableChanged
}
isScalesResetAvailable() {
return this._isScalesResetAvailable
}
panes() {
return this._panes
}
paneForId(e) {
return this._panes.find(t => t.id() === e) || null
}
createPane(e, t, i) {
const s = this._undoModel.chartWidget();
s.isMaximizedPane() && s.toggleMaximizePane();
const r = this._properties.childs().paneProperties;
t && r.merge(t);
const n = new D.Pane(this._timeScale, r, this, i);
return void 0 !== e ? this._panes.splice(e, 0, n) : this._panes.push(n), n
.onTagsChanged().subscribe(this, ce.prototype.onPaneTagsChanged), n
.dataSourcesCollectionChanged().subscribe(this, () => this
._dataSourceCollectionChanged.fire(n)), n.sourcePropertiesChanged()
.subscribe(this, e => this._sourceProperitesChanged.fire(n, e)), n
.sourceZOrderChanged().subscribe(this, e => this._sourceZOrderChanged.fire(n,
e)), n.symbolSourceResolved().subscribe(this, e => this
._dataSourceSymbolResolved.fire(n, e)), this._panesCollectionChanged.fire(
this._panes), this.invalidate(k.InvalidationMask.panesOrder()), n
}
removePane(e) {
const t = this._undoModel.chartWidget();
t.isMaximizedPane() && t.toggleMaximizePane();
const i = e;
i.destroy();
const s = this._panes.indexOf(i); - 1 !== s && (this._panes.splice(s, 1), e
.dataSourcesCollectionChanged().unsubscribeAll(this), e
.sourcePropertiesChanged().unsubscribeAll(this), e.onTagsChanged()
.unsubscribeAll(this), e.symbolSourceResolved().unsubscribeAll(this));
this.crossHairSource().pane === e && this.clearCurrentPosition(), this
._panesCollectionChanged.fire(this._panes), this.invalidate(k.InvalidationMask
.panesOrder())
}
changePanesHeight(e, t) {
if (this._panes.length < 2) return;
Object(r.assert)(e >= 0 && e < this._panes.length, "Invalid pane index");
const i = this._panes[e],
s = this._panes.reduce((e, t) => e + t.stretchFactor(), 0),
n = this._panes.reduce((e, t) => e + t.height(), 0),
o = n - 30 * (this._panes.length - 1);
t = Math.min(o, Math.max(30, t));
const a = s / n,
l = i.height();
i.setStretchFactor(t * a);
let c = t - l,
h = this._panes.length - 1;
for (const e of this._panes)
if (e !== i) {
const t = Math.min(o, Math.max(30, e.height() - c / h));
c -= e.height() - t, h -= 1;
const i = t * a;
e.setStretchFactor(i)
} this.fullUpdate()
}
clearCurrentPosition() {
const e = this.crossHairSource();
e.clearPosition(), Object(r.ensureNotNull)(e.dataWindowView()).update();
const t = this._panes;
for (let e = t.length; e--;) {
const i = t[e].dataSources();
for (let e = i.length; e--;) {
const t = i[e].dataWindowView();
t && t.update();
const s = i[e].legendView();
s && s.update()
}
}
this.invalidate(k.InvalidationMask.cursor());
const i = this._undoModel.chartWidget();
i.chartWidgetCollection().syncCrosshair(null, i), this._phantomSourceContainer
.onCursorPositionUpdated()
}
setAndSaveCurrentPosition(e, t, i, s) {
this.crossHairSource().saveOriginCoords(e, t), this.setCurrentPosition(e, t, i, s)
}
setCurrentPosition(e, t, i, s) {
let n = NaN;
const o = this._timeScale.coordinateToVisibleIndex(e),
a = i.defaultPriceScale();
let l = null;
a.isEmpty() || (l = Object(r.ensureNotNull)(i.mainDataSource()).firstValue(),
null !== l && (n = a.coordinateToPrice(t, l)));
const c = this.crossHairSource(),
h = c.selectPointMode().value(),
u = this.currentTool(),
d = this.mainSeries();
if (!this._isSettingsExternalPosition && (this._lineBeingCreated || this
._lineBeingEdited || Object(H.isLineToolName)(u) || Object(F.toolIsMeasure)(
u)) && (n = this._magnet.align(n, o, i), null !== l && c
.saveOriginCoords(c.originX(), a.priceToCoordinate(n, l))), this
._isTimeScrolling) {
if (!this._isSettingsExternalPosition && h) {
const e = d.bars().firstIndex(),
t = d.bars().lastIndex();
if (null !== e && null !== t) {
const s = Math.min(Math.max(o, e), t);
s !== o && this._setCorrectedPositionToCrosshair(s, n, l, i)
}
} else c.setPosition(c.index, n, i);
return
}
c.setOnHoveredChartWidget(!0), c.setPosition(o, n, i), Object(r.ensureNotNull)(c
.dataWindowView()).update();
const p = this._panes;
for (let e = p.length; e--;) {
const t = p[e].dataSources();
for (let e = t.length; e--;) {
const i = t[e].dataWindowView();
i && i.update();
const s = t[e].legendView();
s && s.update()
}
}
const _ = d.syncModel();
if (this.crossHairSource().startMeasurePoint() || this._lineBeingCreated ? this
.lightUpdate() : this.invalidate(k.InvalidationMask.cursor()), this
._lineBeingCreated) {
const e = this._lineBeingCreated.linkKey().value();
if (!this._isSettingsExternalPosition) {
this._lineBeingCreated.setLastPoint({
index: o,
price: n
}, s), this._lineBeingCreated.updateAllViews();
const t = Object(r.ensureNotNull)(this._lineBeingCreated.lastPoint());
if (t.price === n && t.index === o || this._setCorrectedPositionToCrosshair(
t.index, t.price, l, i), _ && e) {
const i = this._timeScale.points().roughTime(t.index, _.projectTime
.bind(_));
Object(F.setLineToolLastPoint)({
model: this,
linkKey: e,
point: {
timeStamp: Object(r.ensureNotNull)(i),
price: t.price
}
})
}
}
}
if (!this._isSettingsExternalPosition && null !== this._lineBeingEdited && null !==
this._linePointBeingEdited) {
this.changeLinePoint({
index: o,
price: n
}, s);
const e = this._lineBeingEdited.getPoint(this._linePointBeingEdited);
null !== e && this._setCorrectedPositionToCrosshair(e.index, e.price, l, i)
}
if (!this._isSettingsExternalPosition && h) {
const e = d.bars().firstIndex(),
t = d.bars().lastIndex();
if (null !== e && null !== t) {
const s = Math.min(Math.max(o, e), t);
s !== o && this._setCorrectedPositionToCrosshair(s, n, l, i)
}
}
this._syncCrosshair(s)
}
setExternalPosition(e, t) {
let i;
const s = this.crossHairSource();
if (s.setOnHoveredChartWidget(!1), null !== e && Object(z.isNumber)(e.timeStamp)) {
const t = this.mainSeries().syncModel();
if (t) {
const s = this.createSyncPoint(e.syncModel, t).sourceTimeToTargetTime(e
.timeStamp);
i = this._timeScale.points().roughIndex(s, t.distance.bind(t))
}
}
if (null !== e && null != i && Number.isFinite(i) && void 0 !== e.price && Number
.isFinite(e.price)) {
this._isSettingsExternalPosition = !0;
const n = Object(r.ensureNotNull)(this.paneForSource(this.mainSeries())),
o = this._timeScale.indexToCoordinate(i),
a = Object(r.ensureNotNull)(n.mainDataSource()).firstValue();
if (null !== a) {
const i = this.mainSeries().priceScale().priceToCoordinate(e.price, a);
s.clearOriginCoords(), this.setCurrentPosition(o, i, n, t)
}
return s.setOnHoveredChartWidget(!1), void(this._isSettingsExternalPosition = !
1)
}
null != i && Number.isFinite(i) ? (s.clearOriginCoords(), s.setPosition(i, NaN,
null)) : (s.clearPosition(), Object(r.ensureNotNull)(s.dataWindowView())
.update());
const n = this.dataSources();
for (let e = n.length; e--;) {
const t = n[e].dataWindowView();
t && t.update();
const i = n[e].legendView();
i && i.update()
}
this.invalidate(k.InvalidationMask.cursor())
}
startScaleTime(e) {
this._timeScale.startScale(e)
}
scaleTimeTo(e) {
this._timeScale.scaleTo(e), this.recalculateAllPanes(), this.lightUpdate(), this
._setScalesResetAvailable(!0)
}
endScaleTime() {
this._timeScale.endScale(), this.lightUpdate(), this.recalcVisibleRangeStudies()
}
resetTimeScale() {
this._timeScale.restoreDefault(), this.recalculateAllPanes(), this
.recalcVisibleRangeStudies(), this.lightUpdate(), this._resetScales.fire(), this
._setScalesResetAvailable(!1)
}
startScalePrice(e, t, i) {
e.startScalePrice(t, i)
}
scalePriceTo(e, t, i) {
e.scalePriceTo(t, i), this.mainSeries().priceScale().isLockScale() ? this
.lightUpdate() : this.invalidate(this._paneInvalidationMask(e, k
.InvalidationLevel.Light)), this._setScalesResetAvailable(!0)
}
endScalePrice(e, t) {
e.endScalePrice(t), this.invalidate(this._paneInvalidationMask(e, k
.InvalidationLevel.Light))
}
resetPriceScale(e, t) {
this._setScalesResetAvailable(!1), e.resetPriceScale(t), this.invalidate(this
._paneInvalidationMask(e, k.InvalidationLevel.Light))
}
restorePriceScaleState(e, t, i) {
e.restorePriceScaleState(t, i), this.invalidate(this._paneInvalidationMask(e, k
.InvalidationLevel.Light))
}
currentTool() {
return this._currentTool
}
setCurrentTool(e) {
this._currentTool !== e && (Object(H.isLineToolName)(e) && this.selectionMacro(
e => {
e.clearSelection()
}), this._currentTool = e, this._phantomSourceContainer.onToolChanged())
}
onRearrangePanes() {
return this._onRearrangePanes
}
finishLineTool(e) {
const t = e.linkKey().value();
Object(F.drawOnAllCharts)().value() && null !== t && e.isSynchronizable() && Object(
F.finishLineTool)({
linkKey: t,
model: this
})
}
startChangingLinetool(e, t, i, s, n) {
this._lineBeingEdited = e, this._linePointBeingChanged = t || null, this
._linePointBeingEdited = void 0 === i ? null : i, F.isToolEditingNow.setValue(!
0), this._lineBeingEdited.startChanging(i, t, n);
const o = Object(r.ensureNotNull)(this.paneForSource(e));
this._lineBeingEdited.startDragPoint && void 0 !== i && void 0 !== t && this
._lineBeingEdited.startDragPoint(i, t), n || void 0 === i || void 0 === t ||
this._lineBeingEdited.setPoint(i, t, s, n), this._lineBeingEdited
.updateAllViews();
const a = this._paneInvalidationMask(o, k.InvalidationLevel.Light);
this.invalidate(a);
const l = e.linkKey().value();
if (l && e.isSynchronizable() && void 0 !== i && void 0 !== t) {
const e = Object(r.ensureNotNull)(this.externalTimeStamp(t.index));
Object(F.startChangingLineTool)({
linkKey: l,
model: this,
symbol: this.mainSeries().symbol(),
point: {
price: t.price,
timeStamp: e
},
pointIndex: i,
envState: s || null
})
}
}
createLineTool(e, t, i, s, o, a) {
if (Object(r.assert)(Object(H.isLineToolName)(i),
"Cannot create unknown line tool: " + i), "LineToolExecution" !== i &&
Object(c.trackEvent)("drawings", "Study_Drawing_" + i), s) {
const e = s.state();
s = Object(H.createLineToolProperties)(i, e)
}
const l = Object(H.createLineTool)(i, this, s, null),
h = !l.linkKey().value() && !o;
Object(F.drawOnAllCharts)().value() ? l.linkKey().setValue(o || Object(U.randomHash)
()) : l.linkKey().setValue(o), a = a || Object(r.ensureNotNull)(e
.mainDataSource()), s || Object(H.prepareLineToolPropertiesByOwnerSource)(l
.properties(), a), l.setOwnerSource(a);
const u = a.priceScale();
let d;
if (e.addDataSource(l, u, !1), l.isFixed()) {
const i = Object(r.ensureNotNull)(Object(r.ensureNotNull)(e.mainDataSource())
.firstValue()),
s = this._timeScale.indexToCoordinate(t.index),
o = Object(r.ensureNotNull)(u).priceToCoordinate(t.price, i);
d = l.addFixedPoint(new n.Point(s, o))
} else d = l.addPoint(t);
return d || (this._lineBeingCreated = l, this._paneBeingCreatedLineOn = e, F
.isToolCreatingNow.setValue(!0)), h && l.enableCurrentIntervalVisibility(),
this.fullUpdate(), l
}
endChangingLinetool(e, t) {
const i = Object(r.ensureNotNull)(this._lineBeingEdited),
s = i.endChanging(!1, e);
this._lineBeingEdited = null, F.isToolEditingNow.setValue(!1), this
._linePointBeingEdited = null, this._linePointBeingChanged = null, this
.lightUpdate();
const n = {
points: i.normalizedPoints(),
interval: this.mainSeries().interval()
},
o = i.linkKey().value();
null !== o && i.isSynchronizable() && Object(F.finishChangingLineTool)({
model: this,
linkKey: o,
symbol: this.mainSeries().symbol(),
finalState: n,
changes: s
})
}
continueCreatingLine(e, t, i, s) {
const n = Object(r.ensureNotNull)(this._lineBeingCreated),
o = n.addPoint(e, t, i);
n.updateAllViews();
const a = new k.InvalidationMask(k.InvalidationLevel.Light);
return o && (this._paneBeingCreatedLineOn = null, this._lineBeingCreated = null, F
.isToolCreatingNow.setValue(!1)), this.invalidate(a), o
}
cancelCreatingLine() {
if (!this._lineBeingCreated) return;
const e = this._lineBeingCreated;
this.removeSource(this._lineBeingCreated), this._lineBeingCreated = null, this
._lineCancelled.fire(), F.isToolCreatingNow.setValue(!1), Object(F
.drawOnAllCharts)().value() && e.isSynchronizable() && Object(F
.cancelLineTool)({
model: this
})
}
lineBeingCreated() {
return this._lineBeingCreated
}
paneBeingCreatedLineOn() {
return this._paneBeingCreatedLineOn
}
lineCancelled() {
return this._lineCancelled
}
isPhantomLine(e) {
return this._phantomSourceContainer.source() === e
}
changeLinePoint(e, t, i) {
const s = Object(r.ensureNotNull)(this._lineBeingEdited),
n = Object(r.ensureNotNull)(this._linePointBeingEdited);
let o = e.price,
a = e.index;
if (s.setPoint(n, e, t), !i) {
const e = s.getPoint(n);
null !== e && (a = e.index, o = e.price)
}
s.updateAllViews(), this.lightUpdate();
const l = s.linkKey().value();
if (!i && null !== l && s.isSynchronizable()) {
const e = Object(r.ensureNotNull)(this._linePointBeingChanged),
i = {
indexesChanged: a !== e.index,
pricesChanged: o !== e.price
},
c = s.getChangePointForSync(n);
if (null !== c) {
const e = this.externalTimeStamp(a);
null !== e && (o = c.price, Object(F.changeLineTool)({
linkKey: l,
model: this,
symbol: this.mainSeries().symbol(),
point: {
price: o,
timeStamp: e
},
envState: t,
changes: i
}))
}
}
}
changeLinePoints(e, t, i) {
const s = e.points(),
n = e.linkKey().value();
!i && n && e.isSynchronizable() && t.forEach((t, i) => {
const o = s[i],
a = o.price !== t.price,
l = o.index !== t.index;
if (e.getChangePointForSync(i)) {
const e = Object(r.ensureNotNull)(this.externalTimeStamp(t.index));
Object(F.changeLineTool)({
linkKey: n,
model: this,
symbol: this.mainSeries().symbol(),
point: {
price: t.price,
timeStamp: e
},
changes: {
pricesChanged: a,
indexesChanged: l
}
})
}
}), e.setPoints(t), e.updateAllViews(), this.lightUpdate()
}
addCustomSource(e, t, i = u.CustomSourceLayer.Foreground) {
this._customSourcesMap.has(e) && oe.logWarn(
`Attempt to add the same custom source multiple time "${e}"`), oe.logNormal(
`Adding custom source "${e}"`);
const s = t(e, this);
switch (i) {
case u.CustomSourceLayer.Background:
this._bgCustomSources.push(s);
break;
case u.CustomSourceLayer.Foreground:
this._fgCustomSources.push(s);
break;
case u.CustomSourceLayer.Topmost:
this._topmostCustomSources.push(s);
break;
default:
throw new Error("Unknown custom sources layer " + i)
}
this._allCustomSources.push(s), this._customSourcesMap.set(e, s), this.lightUpdate()
}
removeCustomSource(e) {
this._removeCustomSource(e), this.lightUpdate()
}
hasCustomSource(e) {
return this._customSourcesMap.has(e)
}
customSourceForName(e) {
return this._customSourcesMap.get(e) || null
}
customSourceName(e) {
let t = null;
return this._customSourcesMap.forEach((i, s) => {
i === e && (t = s)
}), t
}
customSources(e) {
switch (e) {
case u.CustomSourceLayer.Background:
return this._bgCustomSources;
case u.CustomSourceLayer.Foreground:
return this._fgCustomSources;
case u.CustomSourceLayer.Topmost:
return this._topmostCustomSources;
default:
return this._allCustomSources
}
}
addMultiPaneSource(e) {
this._multiPaneSources.push(e), this.lightUpdate()
}
removeMultiPaneSource(e) {
const t = this._multiPaneSources.indexOf(e); - 1 === t ? oe.logWarn(
"Attempt to remove multi-pane source which does not exist in the model") :
this._multiPaneSources.splice(t, 1), this.lightUpdate()
}
multiPaneSources(e) {
return this._multiPaneSources.filter(t => !e.hasDataSource(t))
}
dateTimeFormatter() {
return this._dateTimeFormatter
}
dateFormatter() {
return this._dateFormatter
}
timeFormatter() {
return this._timeFormatter
}
sessions() {
return Object(r.ensureNotNull)(this._sessions)
}
createSessions(e) {
Object(r.assert)(null === this._sessions, "Sessions are already created"), this
.addCustomSource("sessions", (t, i) => (this._sessions = new I(t, i, e), this
._sessions.start(), this._sessions), u.CustomSourceLayer.Background)
}
createPrePostMarket(e) {
this.addCustomSource("prePostMarket", (t, i) => new PrePostMarket(t, i, e))
}
theme() {
const e = this.properties().paneProperties.state();
delete e.topMargin, delete e.bottomMargin;
const t = this.mainSeries().state().state;
t && (delete t.symbol, delete t.interval, delete t.currencyId, delete t.unitId);
const i = {
mainSourceProperties: t,
sessions: this.sessions().properties().state(),
chartProperties: {
paneProperties: e,
scalesProperties: this.properties().scalesProperties.state()
}
};
return i.version = this.version(), i
}
onChartThemeLoaded() {
return this._chartThemeLoaded
}
chartThemeLoaded() {
this._chartThemeLoaded.fire()
}
shouldBeSavedEvenIfHidden() {
return this._shouldBeSavedEvenIfHidden
}
setShouldBeSavedEvenIfHidden(e) {
this._shouldBeSavedEvenIfHidden = e
}
externalTimeStamp(e) {
const t = this.mainSeries().syncModel();
return this.timeScale().points().roughTime(e, t && t.projectTime.bind(t))
}
syncESD() {
null !== this._esdWatcher && this._esdWatcher.syncESDStudies()
}
recalcVisibleRangeStudies(e) {
this._recalcVRStudiesParams.force = this._recalcVRStudiesParams.force || Boolean(e),
this._recalcVisibleRangeStudiesImplDebounced()
}
recalcColorStudies(e) {
this._recalcColorStudiesParams.force = this._recalcColorStudiesParams.force ||
Boolean(e), this._recalcColorStudiesImplDebounced()
}
alertsWatcher() {
return this._alertsWatcher
}
showLegend() {
return this._showLegendProperty
}
id() {
return this._id
}
recalculatePriceRangeOnce() {
const e = this.mainSeries();
for (const t of this._panes)
for (const i of t.priceDataSources()) i.symbolSource() === e && i
.disablePriceRangeReady()
}
invalidate(e) {
var t;
null === (t = this._invalidateHandler) || void 0 === t || t.call(this, e)
}
appliedTimeFrame() {
return this._appliedTimeFrame.appliedTimeFrame()
}
_createESDWatcher() {}
_updateDateTimeFormatter() {
const e = R.dateFormatProperty.value(),
t = new B.DateFormatter(e);
if (this._dateFormatter = t, this.mainSeries().isDWM()) this._dateTimeFormatter = t,
this._timeFormatter = new N.TimeFormatter("%h:%m");
else {
const t = _.Interval.parse(this.mainSeries().interval()),
i = t.isSeconds() || t.isTicks() ? "%h:%m:%s" : "%h:%m";
this._dateTimeFormatter = new V.a({
dateFormat: e,
timeFormat: i,
dateTimeSeparator: " "
}), this._timeFormatter = new N.TimeFormatter(i)
}
}
_setScalesResetAvailable(e) {
this._isScalesResetAvailable !== e && (this._isScalesResetAvailable = e, this
._isScalesResetAvailableChanged.fire())
}
_invalidationMaskForSource(e, t = k.InvalidationLevel.Light) {
if (e === this.crossHairSource()) return k.InvalidationMask.cursor();
if (this._watermarkSource === e) return this._paneInvalidationMask(Object(r
.ensureNotNull)(this.paneForSource(this.mainSeries())), t);
if (-1 !== this._allCustomSources.indexOf(e)) {
const e = new k.InvalidationMask;
return e.invalidateAll(t), e
}
if (!Object(d.a)(e)) return null;
if (e.isMultiPaneEnabled()) return new k.InvalidationMask(t);
const i = this.paneForSource(e);
return null !== i ? this._paneInvalidationMask(i, t) : null
}
_paneInvalidationMask(e, t = k.InvalidationLevel.Light) {
const i = new k.InvalidationMask,
s = this._panes.indexOf(e);
return i.invalidateAllPane(s, t), i
}
_invalidationMaskForSourcePriceScale(e, t = k.InvalidationLevel.Light) {
if (!Object(d.a)(e)) return new k.InvalidationMask(t);
const i = this.paneForSource(e);
if (null === i) return null;
let s = e.priceScale();
if (null === s) return null;
const r = this._panes.indexOf(i);
let n = i.priceScalePosition(s);
if ("overlay" === n) {
const e = this._panes[r].defaultPriceScale();
s = e, n = i.priceScalePosition(e)
}
const o = i.priceScaleIndex(s, n);
if (void 0 === o) return null;
const a = new k.InvalidationMask;
return a.invalidatePriceScale(r, n, o, t), a
}
_removeCustomSource(e) {
const t = this._customSourcesMap.get(e);
if (void 0 === t) return void oe.logWarn(
`Attempt to remove custom source which does not exist in the model - "${e}"`
);
oe.logNormal(`Removing custom source "${e}"`),
this.selectionMacro(e => {
e.removeSourceFromSelection(t)
}), this._hoveredSource === t && this.setHoveredSource(null), this
._customSourceBeingMoved === t && this.setMovingCustomSource(null, null);
const i = ae(this._bgCustomSources, t),
s = ae(this._fgCustomSources, t),
n = ae(this._topmostCustomSources, t),
o = ae(this._allCustomSources, t);
Object(r.assert)(i || s || n, "Source should be presented in one of the layers"),
Object(r.assert)(o, "Source should be presented in the array"), this
._customSourcesMap.delete(e), t.destroy()
}
_updateShowLegendProperty() {
const e = this._properties.childs().paneProperties.childs().legendProperties
.childs().showLegend,
t = this._showLegendProperty;
if (e.value()) t.setValue(!0);
else {
for (const e of this._panes) {
let i = 0;
for (const s of e.dataSources())
if (s !== this.mainSeries() && null !== s.statusView() && (i++, i > 1))
return void t.setValue(!1)
}
t.setValue(!0)
}
}
_pointToPercentPosition(e, t) {
return {
x: e.x / this._timeScale.width(),
y: e.y / Object(r.ensureNotNull)(Object(r.ensureNotNull)(t.mainDataSource())
.priceScale()).height()
}
}
_percentPositionToPoint(e, t) {
const i = e.x * this._timeScale.width(),
s = e.y * Object(r.ensureNotNull)(Object(r.ensureNotNull)(t.mainDataSource())
.priceScale()).height();
return new n.Point(i, s)
}
_recalcVisibleRangeStudiesImpl(e) {
var t;
if (e.timerId = null, this.timeScale().isEmpty()) return;
const i = this.timeScale().visibleBarsStrictRange();
if (null === i) return;
const s = this.mainSeries().nearestData(i.firstBar(), Q.PlotRowSearchMode
.NearestRight),
r = this.mainSeries().nearestData(i.lastBar(), Q.PlotRowSearchMode.NearestLeft),
n = this.mainSeries().bars().lastIndex(),
o = s ? s.index : void 0,
a = r ? r.index : void 0,
l = o === e.oldStartVisibleIndex,
c = a === e.oldEndVisibleIndex;
if (l && c && !e.force) return;
e.force = !1, e.oldStartVisibleIndex = void 0 !== o ? o : NaN, e
.oldEndVisibleIndex = void 0 !== a ? a : NaN;
const h = {
first_visible_bar_time: 1e3 * Math.floor(s && s.value ? s.value[0] : 0),
last_visible_bar_time: 1e3 * Math.floor(r && r.value ? r.value[0] : 0),
subscribeRealtime: r && r.index === n
},
u = null !== (t = e.studies) && void 0 !== t ? t : this.priceDataSources();
e.studies = void 0;
for (const e of u)
if (Object(M.isStudy)(e)) {
const t = e.metaInfo().inputs,
i = [];
for (const e of t) h.hasOwnProperty(e.id) && i.push(e.id);
const s = e.properties().inputs;
for (const e of i) s[e].setValueSilently(h[e]);
i.length > 0 && s.listeners().fire(s)
}
}
_recalcColorStudiesImpl(e) {
var t;
if (e.timerId = null, this.timeScale().isEmpty()) return;
const i = this.backgroundColor().value(),
s = this.isDark() ? a.colorsPalette["color-cold-gray-200"] : a.colorsPalette[
"color-cold-gray-900"],
r = i === e.oldBgColor,
n = s === e.oldFgColor;
if (r && n && !e.force) return;
e.force = !1, e.oldBgColor = i, e.oldFgColor = s;
const o = {
chart_bgcolor: i,
chart_fgcolor: s
},
l = null !== (t = e.studies) && void 0 !== t ? t : this.priceDataSources();
e.studies = void 0;
for (const e of l)
if (Object(M.isStudy)(e)) {
const t = e.metaInfo(),
i = t.inputs,
s = t.isRGB,
r = [];
for (const e of i) o.hasOwnProperty(e.id) && r.push(e.id);
const n = e.properties().inputs;
for (const e of r) n[e].setValueSilently(s ? Object(G.colorToInteger)(o[
e]) : o[e]);
r.length > 0 && n.listeners().fire(n)
}
}
_getAllSources(e) {
const t = [];
for (const i of this._panes) {
const s = i.sourcesByGroup().all();
for (const i of s) e(i) && t.push(i)
}
return t
}
_getAvailableCurrencies() {
return this._options.currencyConversionEnabled ? Object(z.isArray)(this
._availableCurrenciesList) ? this._availableCurrenciesList : (null !== this
._availableCurrenciesList || (this._availableCurrenciesList = this
.chartApi().availableCurrencies(), this._availableCurrenciesList.then(
e => {
this._destroyed || (this._availableCurrenciesList = e, this
.lightUpdate())
}).catch(e => {
oe.logWarn(
"An error occurred while getting currencies config: " +
e)
})), []) : []
}
_getAvailableUnits() {
return this._options.unitConversionEnabled ? this
._availableUnitsObject instanceof Promise || null === this
._availableUnitsObject ? (null !== this._availableUnitsObject || (this
._availableUnitsObject = this.chartApi().availableUnits(), this
._availableUnitsObject.then(e => {
this._destroyed || (this._availableUnitsObject = e, this
.lightUpdate())
}).catch(e => {
oe.logWarn("An error occurred while getting units config: " + e)
})), {}) : this._availableUnitsObject : {}
}
_getBackgroundColor(e) {
const t = this._properties.childs().paneProperties.childs();
if (t.backgroundType.value() === Y.ColorType.Gradient) {
const i = t.backgroundGradientStartColor.value(),
s = t.backgroundGradientEndColor.value();
return e ? i : s
}
return t.background.value()
}
_updateBackgroundColor() {
this._backgroundColor.setValue(this._getBackgroundColor()), this._backgroundTopColor
.setValue(this._getBackgroundColor(!0))
}
_syncCrosshair(e) {
if (!this._isSettingsExternalPosition) {
const t = this._undoModel.chartWidget(),
i = this._undoModel.mainSeries(),
s = i.syncModel(),
r = this._undoModel.crossHairSource(),
n = r.pane;
if (null !== s && null !== n) {
const o = {
timeStamp: this._timeScale.points().roughTime(r.index, s.projectTime
.bind(s)),
syncModel: s
};
n.mainDataSource() === i && (o.price = r.price, o.symbol = i.symbol()), o
.syncModel = s;
let a = this._lineBeingCreated || null !== this._linePointBeingEdited ||
Boolean(this._sourcesBeingMoved.length);
a = a && Object(F.drawOnAllCharts)().value(), t.chartWidgetCollection()
.syncCrosshair(o, t, a, e)
}
this._phantomSourceContainer.onCursorPositionUpdated()
}
}
_gotoTimeImpl(e, t) {
const i = this.timeScale(),
s = this.mainSeries();
let n;
if (void 0 !== e) {
if (this._scrollingState && this._scrollingState.deferred.reject(), n = Object(h
.createDeferredPromise)(), !s.isDWM()) {
const t = s.symbolInfo();
if (null !== t) {
let i = this.properties().timezone.value();
"exchange" === i && (i = t.timezone);
const r = Object(re.cal_to_utc)(Object(re.get_timezone)(i), new Date(
e)),
n = Object(ne.createTimeToBarTimeAligner)(s.interval(), t)(r);
e = Object(re.utc_to_cal)(Object(re.get_timezone)(i), n).getTime()
}
}
this._scrollingState = {
targetDate: e,
deferred: n,
centerIfVisible: t.centerIfVisible
}
} else {
if (!this._scrollingState) return oe.logError(
"scrollTo called without an argument"), Promise.reject();
e = this._scrollingState.targetDate, n = this._scrollingState.deferred
}
if (void 0 === i.tickMarks().minIndex) return n.resolve(void 0), n.promise;
let o = ((e, t) => {
if ((e => Object(r.ensureNotNull)(i.tickMarks().indexToTime(Object(r
.ensureDefined)(i.tickMarks().minIndex))).valueOf() - e)(t) <
0) {
let n = i.tickMarks().nearestIndex(t);
const o = s.bars().lastIndex();
if (null === o) return null;
n = Math.min(n, o);
let a = Object(r.ensureNotNull)(i.tickMarks().indexToTime(n))
.valueOf();
for (; a < t && n < o;) n++, a = Object(r.ensureNotNull)(i
.tickMarks().indexToTime(n)).valueOf();
const l = Object(r.ensureNotNull)(i.visibleBarsStrictRange()),
c = l.lastBar() - l.firstBar();
return !e && l.contains(n) || i.zoomToBarsRange(n - c / 2, n + c /
2), {
timestamp: Object(r.ensureNotNull)(i.indexToTimePoint(n))
}
}
return null
})(this._scrollingState.centerIfVisible, this._scrollingState.targetDate);
if (!o) {
const t = Object(r.ensureDefined)(i.tickMarks().minIndex),
n = Object(r.ensureNotNull)(i.visibleBarsStrictRange()),
a = n.lastBar() - n.firstBar();
if (s.endOfData()) i.zoomToBarsRange(t - a / 2, t + a / 2), o = {
timestamp: Object(r.ensureNotNull)(i.indexToTimePoint(t)),
eod: !0
};
else {
const t = i.tickMarks().estimateLeft(e);
i.requestMoreHistoryPoints(Math.ceil(t + a / 2))
}
}
return o && (this.fullUpdate(), this._scrollingState = null, n.resolve(o)), n
.promise
}
_setCorrectedPositionToCrosshair(e, t, i, s) {
const n = this.crossHairSource();
n.setPosition(e, t, s);
const o = this._timeScale.indexToCoordinate(e),
a = s.defaultPriceScale().priceToCoordinate(t, Object(r.ensureNotNull)(i));
n.saveOriginCoords(o, a)
}
}
},
gQ5K: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "DateFormatter", (function() {
return n
}));
var s = i("iboI"),
r = i("e1ZQ");
class n {
constructor(e = "yyyy-MM-dd") {
this._dateFormatFunc = r.b[e]
}
format(e) {
return s.customFormatters && s.customFormatters.dateFormatter ? s.customFormatters
.dateFormatter.format(e) : this._dateFormatFunc(e, !1)
}
formatLocal(e) {
return s.customFormatters.dateFormatter ? s.customFormatters.dateFormatter
.formatLocal ? s.customFormatters.dateFormatter.formatLocal(e) : s
.customFormatters.dateFormatter.format(e) : this._dateFormatFunc(e, !0)
}
}
},
gWrr: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
})), i.d(t, "b", (function() {
return n
}));
const s = new WeakMap;
function r(e, t) {
let i, r;
return i = null == t ? document.documentElement : 9 === t.nodeType ? t.documentElement : t,
s && (r = s.get(i)), r || (r = i.ownerDocument.createRange(), r.selectNodeContents(i),
s && s.set(i, r)), r.createContextualFragment(e)
}
function n(e, t) {
const i = r(e, t);
let s;
if ("firstElementChild" in i) s = i.firstElementChild;
else {
s = null;
for (let e = 0; e < i.childNodes.length; e++) {
const t = i.childNodes[e];
if (1 === t.nodeType) {
s = t;
break
}
}
}
return null !== s && i.removeChild(s), s
}
},
gaBL: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "sourceNewCurrencyOnPinningToPriceScale", (function() {
return r
}));
var s = i("/tGj");
function r(e, t, i, r) {
let n = null;
if (i.currencyConversionEnabled() && Object(s.isSymbolSource)(e)) {
const s = i.availableCurrencies(),
o = t.currency(s),
a = e.currency();
null !== o && null !== o.selectedCurrency && !o.allCurrenciesAreOriginal && o
.selectedCurrency !== a && (r && null === a || null !== a && s.convertible(a)) && (
n = o.selectedCurrency)
}
return n
}
},
gf4d: function(e, t, i) {
"use strict";
var s = i("Eyy1").assert,
r = i("MSvv").StudyLineDataSource,
n = i("tqok").INVALID_TIME_POINT_INDEX,
o = "RegressionTrend@tv-basicstudies";
function a(e) {
return void 0 !== e.startPrice && void 0 !== e.endPrice
}
class l extends r {
constructor(e, t, s) {
s = s || e.studyMetaInfoRepository().findByIdSync({
type: "java",
studyId: o
});
var n = t || r._createPropertiesFromStudyMetaInfo(s, e.studyVersioning());
super(e, s, "linreg_", n), this._trendData = null, i.e("lt-pane-views").then(i.t
.bind(null, "IMGS", 7)).then(({
RegressionTrendPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
formatter() {
s(!1, "This method should never be called")
}
pointsCount() {
return 2
}
clearData() {
this._trendData = null, super.clearData()
}
state(e) {
var t = r.prototype.state.call(this, e);
return e ? Object.assign({}, t, {
nonseriesdata: this._trendData
}) : t
}
restoreData(e) {
super.restoreData(e), this._trendData = e.nonseriesdata ? e.nonseriesdata : null
}
startIndex() {
if (null === this._trendData || null === this._indexes) return null;
var e = this._indexes[this._trendData.startIndex];
return e !== n ? e : null
}
endIndex() {
if (null === this._trendData || null === this._indexes) return null;
var e = this._indexes[this._trendData.endIndex];
return e !== n ? e : null
}
baseLine() {
return null === this._trendData ? null : this._trendData.baseLine
}
downLine() {
return null === this._trendData ? null : this._trendData.downLine
}
upLine() {
return null === this._trendData ? null : this._trendData.upLine
}
pearsons() {
return null === this._trendData ? null : this._trendData.pearsons
}
recalcStudyIfNeeded() {
this._onStudyInputsMayChange()
}
_studyInputs(e) {
s(2 === e.length, "all the line tool points should be defined");
var t = e[0],
i = e[1];
if (t.index === i.index) return null;
const r = this._getPointTime(t.index <= i.index ? t : i, !0),
n = this._getPointTime(i.index >= t.index ? i : t, !0);
if (null === r || null === n) return this._subscribeApplyInputsOnSeriesCompleted(),
null;
var o = 1e3 * r,
a = 1e3 * n;
return {
"upper diviation": this.properties().inputs["upper diviation"].value(),
"lower diviation": this.properties().inputs["lower diviation"].value(),
"use upper diviation": this.properties().inputs["use upper diviation"].value(),
"use lower diviation": this.properties().inputs["use lower diviation"].value(),
"first bar time": o,
"last bar time": a,
source: this.properties().inputs.source.value()
}
}
_onDataUpdated(e, t, i) {
null !== t && (t.indexes_replace || (this._trendData = t.data), this._indexes = i,
super._onDataUpdated(e, t, i))
}
_updateAnchorsPrice() {
!this._trendData || TradingView.isNaN(this._trendData.baseLine.startPrice) ||
TradingView.isNaN(this._trendData.baseLine.endPrice) || (this._points[0].price =
this._trendData.baseLine.startPrice, this._points[1].price = this._trendData
.baseLine.endPrice)
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(61), i.e(62), i.e(
"study-property-pages-with-definitions")]).then(i.bind(null, "4lou")))
.RegressionTrendDefinitionsViewModel
}
_isReady() {
return this._trendData && void 0 !== this._trendData.startIndex && void 0 !== this
._trendData.endIndex && a(this._trendData.upLine) && a(this._trendData
.baseLine) && a(this._trendData.downLine)
}
static createProperties(e) {
return r._createPropertiesFromStudyIdAndState(o, e)
}
static createPropertiesFromStudyMetaInfoAndState(e, t, i, s) {
return r.createPropertiesFromStudyMetaInfoAndState(e, t, i, s)
}
static studyId() {
return o
}
cloneable() {
return !1
}
}
l.prototype.version = 2, t.LineToolRegressionTrend = l
},
gvrv: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return m
}));
var s = i("Eyy1"),
r = i("aIyQ"),
n = i.n(r),
o = i("k9/m"),
a = i("hsV8"),
l = i("jy4L"),
c = i("w4Ji"),
h = i("jenN"),
u = i("txPx");
const d = Object(u.getLogger)("Chart.StudyDataSource");
var p, _;
! function(e) {
e[e.Undefined = 0] = "Undefined", e[e.Loading = 1] = "Loading", e[e.Completed = 2] =
"Completed", e[e.Error = 3] = "Error"
}(p || (p = {})),
function(e) {
e[e.Idle = 0] = "Idle", e[e.AwaitingConnection = 1] = "AwaitingConnection", e[e
.AwaitingParent = 2] = "AwaitingParent", e[e.AwaitingFirstDataUpdate = 3] =
"AwaitingFirstDataUpdate", e[e.Active = 4] = "Active"
}(_ || (_ = {}));
class m {
constructor(e, t, i, s) {
this._inputs = null, this._status = _.Idle, this._studyId = null, this
._turnaroundCounter = 1, this._studyStatus = {
type: p.Undefined
}, this._studyStatusChanged = new n.a, this._graphics = new h.LiveStudyGraphics,
this._dataCleared = new n.a, this._dataUpdated = new n.a, this
._boundOnGatewayIsConnectedChanged = this._onGatewayIsConnectedChanged.bind(
this), this._ongoingDataUpdate = Promise.resolve(), this._gateway = e, this
._metaInfo = s, this._seriesSource = t, this._turnaroundPrefix = i, this
._plots = new o.PlotList(Object(c.studyPlotFunctionMap)(s), c
.studyEmptyPlotValuePredicate), this._gateway.isConnected().subscribe(this
._boundOnGatewayIsConnectedChanged)
}
destroy() {
this.stop(), this._gateway.isConnected().unsubscribe(this
._boundOnGatewayIsConnectedChanged), this._dataUpdated.destroy(), this
._dataCleared.destroy(), this._studyStatusChanged.destroy()
}
metaInfo() {
return this._metaInfo
}
inputs() {
return this._inputs
}
setInputs(e) {
this._inputs = e, null !== this._studyId && (this._turnaroundCounter++, this
._onStudyStatusChangedTo({
type: p.Undefined
}), this._gateway.modifyStudy(this._studyId, this._turnaround(), e, this
._onMessage.bind(this)), this._status === _.Active && this
._changeStatusTo(_.AwaitingFirstDataUpdate))
}
isStarted() {
return this._status !== _.Idle
}
isActive() {
return this._status === _.Active
}
start() {
this.isStarted() ? d.logNormal(
"start: data source is already started, nothing to do") : (Object(s.assert)(
null !== this._inputs,
"Inputs should be defined when starting a study data source"), this
._gateway.isConnected().value() ? this._createStudy() : this
._changeStatusTo(_.AwaitingConnection))
}
stop() {
this.isStarted() ? (null !== this._studyId && (this._gateway.removeStudy(this
._studyId), this._studyId = null, this._onStudyStatusChangedTo({
type: p.Undefined
})), this._changeStatusTo(_.Idle)) : d.logNormal(
"stop: data source is already stopped, nothing to do")
}
studyId() {
return this._studyId
}
studyStatus() {
return this._studyStatus
}
studyStatusChanged() {
return this._studyStatusChanged
}
plots() {
return this._plots
}
graphics() {
return this._graphics
}
clearData() {
this._plots.clear(), this._graphics.clear(), this._dataCleared.fire()
}
stopAndStealData() {
Object(s.assert)(this._status === _.Active,
"Couldn't steal data from non-active data source"), this.stop();
const e = this._plots,
t = this._graphics.extract();
return this._plots = new o.PlotList(Object(c.studyPlotFunctionMap)(this._metaInfo),
c.studyEmptyPlotValuePredicate), {
plots: e,
graphics: t
}
}
dataCleared() {
return this._dataCleared
}
dataUpdated() {
return this._dataUpdated
}
moveData(e) {
this._ongoingDataUpdate = this._ongoingDataUpdate.then(() => {
this._plots.move(e)
})
}
_changeStatusTo(e) {
Object(s.assert)(this._status !== e,
"Source and destination status should be distinct"), d.logNormal(
`Status changed from ${_[this._status]} to ${_[e]}`), this._status = e
}
_createStudy() {
const e = this._seriesSource.instanceId();
null !== e ? this._createStudyUsingParentId(e) : (this._changeStatusTo(_
.AwaitingParent), this._seriesSource.dataEvents().completed().subscribe(
this, this._onSeriesCompleted, !0))
}
_createStudyUsingParentId(e) {
Object(s.assert)(this._status !== _.Active,
'Status should not be "Active" when creating a study'), Object(s.assert)(
this._studyStatus.type === p.Undefined,
'Study status should be "Undefined" when creating a study'), Object(s
.assert)(null === this._studyId,
"Study id should be empty when creating a study"), this._studyId = Object(l
.makeNextStudyId)(), this._gateway.createStudy(this._studyId, this
._turnaround(), e, this._metaInfo.fullId + ("tv-basicstudies" === this
._metaInfo.packageId ? "" : "!"), Object(s.ensureNotNull)(this._inputs),
this._onMessage.bind(this)), this._changeStatusTo(_.AwaitingFirstDataUpdate)
}
_onGatewayIsConnectedChanged(e) {
e ? this._onGatewayConnected() : this._onGatewayDisconnected()
}
_onGatewayConnected() {
this._status === _.AwaitingConnection && this._createStudy()
}
_onGatewayDisconnected() {
this._status !== _.Idle && this._status !== _.AwaitingConnection && (this._studyId =
null, this._changeStatusTo(_.AwaitingConnection), this._studyStatus.type !==
p.Undefined && this._onStudyStatusChangedTo({
type: p.Undefined
})), this._turnaroundCounter = 1
}
_onSeriesCompleted() {
this._status === _.AwaitingParent && this._createStudyUsingParentId(Object(s.ensure)
(this._seriesSource.instanceId()))
}
_onStudyStatusChangedTo(e) {
const t = this._studyStatus;
this._studyStatus = e, d.logNormal(
`Study status type changed from ${p[t.type]} to ${p[e.type]}`), this
._studyStatusChanged.fire(t, e)
}
_onMessage(e) {
if ("data_update" === e.method) {
const {
customId: t,
turnaround: i,
plots: r,
nonseries: n
} = e.params;
t === this._studyId && this._checkTurnaround(i) && this._onDataUpdate(r, Object(
s.ensureDefined)(n))
} else if ("study_loading" === e.method) {
const [t, i, s] = e.params;
t === this._studyId && this._checkTurnaround(i) && this._onStudyLoading(s)
} else if ("study_completed" === e.method) {
const [t, i, s] = e.params;
t === this._studyId && this._checkTurnaround(i) && this._onStudyCompleted(s)
} else if ("study_error" === e.method) {
const [t, i, s, r, n] = e.params;
t === this._studyId && this._checkTurnaround(i) && this._onStudyError(s, r, n)
} else "clear_data" === e.method && this._checkTurnaround(e.params.turnaround) &&
this.clearData()
}
_onDataUpdate(e, t) {
const i = Object(a.unpackNonSeriesData)(t.d);
return this._ongoingDataUpdate = this._ongoingDataUpdate.then(() => i, () => i)
.then(this._onDataUnpacked.bind(this, e, t.indexes)), this._ongoingDataUpdate
}
_onDataUnpacked(e, t, i) {
this._status !== _.Idle && (this._status === _.AwaitingFirstDataUpdate && (this
._changeStatusTo(_.Active), this.clearData()), this._mergePlots(e),
null !== i && (i.indexes_replace ? (Object(s.assert)("nochange" !== t), this
._graphics.replaceIndexesTo(t)) : ("nochange" !== t && this
._graphics.replaceIndexesTo(t),
void 0 !== i.graphicsCmds && this._graphics.processCommands(i
.graphicsCmds, this._metaInfo.graphics))), this._dataUpdated.fire(e,
i, t))
}
_onStudyLoading(e) {
this._onStudyStatusChangedTo({
type: p.Loading,
startTime: Date.now()
})
}
_onStudyError(e, t, i) {
this.clearData();
const s = "string" == typeof e ? {
error: e.split(":", 2)[0]
} : e;
this._onStudyStatusChangedTo({
type: p.Error,
errorDescription: s
})
}
_onStudyCompleted(e) {
this._onStudyStatusChangedTo({
type: p.Completed
})
}
_mergePlots(e) {
this._plots.merge(e)
}
_turnaround() {
return `${this._turnaroundPrefix}${this._turnaroundCounter}`
}
_checkTurnaround(e) {
const t = this._turnaround();
return e === t || e === this._seriesSource.turnaround() || e ===
`${this._seriesSource.turnaround()}_${t}`
}
}
},
gyZD: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PaneRendererLine", (function() {
return l
}));
var s = i("aO4+"),
r = i("GEp6"),
n = i("VdBB"),
o = i("jFln"),
a = i("Zp/P");
class l {
constructor(e) {
this._data = e
}
hitTest(e, t) {
const i = Object(a.interactionTolerance)().series + this._data.lineWidth / 2;
let o = 0,
l = this._data.items.length - 1;
for (; l - o > 2;) {
const t = Math.round((l + o) / 2);
this._data.items[t].x <= e.x ? o = t : l = t
}
o = Math.max(1, o - 1), l = Math.min(this._data.items.length - 1, l + 1);
for (let t = o; t <= l; ++t) {
const o = this._data.items[t - 1],
a = this._data.items[t],
l = o.x,
c = a.x;
if (Object(r.distanceToSegment)(new s.Point(l, o.y), new s.Point(c, a.y), new s
.Point(e.x, e.y)).distance <= i) return this._data.hittest ? this._data
.hittest : new n.HitTestResult(n.HitTestResult.REGULAR)
}
return null
}
draw(e, t) {
e.save(), e.scale(t.pixelRatio, t.pixelRatio), e.lineCap = "square", e.lineJoin =
"round", e.strokeStyle = this._data.lineColor, e.fillStyle = this._data
.lineColor, e.lineWidth = this._data.lineWidth, Object(o.setLineStyle)(e, this
._data.lineStyle), Object(a.setValidLineStyle)(e, this._data.lineStyle),
this._data.simpleMode ? this._drawSimpleMode(e, t.pixelRatio) : this._drawLines(
e), e.restore()
}
_drawSimpleMode(e, t) {
if (e.beginPath(), this._walkLine(e, this._data.items, !1, NaN), e.stroke(), this
._data.withMarkers) {
e.save(), e.scale(1 / t, 1 / t);
const i = Math.max(1, Math.floor(t)) % 2 / 2,
s = (this._data.lineWidth + 2) * t + i,
r = 2 * Math.PI;
e.beginPath();
for (let n = this._data.items.length; n--;) {
const o = this._data.items[n];
if (o) {
const n = Math.round(o.x * t) + i,
a = o.y * t;
e.moveTo(n, a), e.arc(n, a, s, 0, r)
}
}
e.fill(), e.restore()
}
}
_walkLine(e, t, i, s) {
if (!t) return;
const r = .25 * this._data.barSpacing;
let n, o, l, c, h;
const u = a.coordinateIsValid;
for (let e = 0; e < t.length; e++) {
const i = t[e];
if (u(i.y)) {
o = i, n = e;
break
}
}
if (void 0 !== n && void 0 !== o)
for (let o = n; o < t.length; o++) {
c = t[o], h = t[o + 1] || {};
const a = Math.round(c.x);
if (u(c.y))
if (l && u(l.y)) e.lineTo(a, c.y), i && !u(h.y) && e.lineTo(a, s);
else if (h && u(h.y)) i ? (o !== n && e.lineTo(a, s), e.lineTo(a, c
.y)) : e.moveTo(a, c.y);
else if (i) {
if (0 === o) continue;
o !== n && e.lineTo(a - r, s), e.lineTo(a - r, c.y), e.lineTo(a + r, c
.y), e.lineTo(a + r, s)
} else e.moveTo(a - r, c.y), e.lineTo(a + r, c.y);
l = c
}
}
_drawLines(e) {
if (!this._data.items.length) return;
let t, i, s;
const r = .25 * this._data.barSpacing,
n = a.coordinateIsValid;
e.beginPath();
const o = this._data.items[0];
o && e.moveTo(o.x, o.y);
let l, c = e.strokeStyle,
h = e.lineWidth;
for (let o = 1; o < this._data.items.length; ++o) {
let _, m, f;
t = this._data.items[o - 1], i = this._data.items[o], s = this._data.items[o +
1], i.style && !this._data.forceLineColor ? (_ = i.style.color, m = i
.style.width, f = i.style.style) : (_ = this._data.lineColor, m = this
._data.lineWidth, f = this._data.lineStyle), this._data
.ignorePaletteLineWidth && (m = this._data.lineWidth);
(_ !== c || m !== h || f !== l) && (c = _, h = m, l = f, e.stroke(), e
.beginPath(), e.strokeStyle = _, e.lineWidth = m, Object(a
.setValidLineStyle)(e, f), e.moveTo(t.x, t.y)), u = t, p = s, n((d = i)
.y) && (n(u.y) ? e.lineTo(d.x, d.y) : p && n(p.y) ? e.moveTo(d.x, d.y) :
(e.moveTo(d.x - r, d.y), e.lineTo(d.x + r, d.y)))
}
var u, d, p;
e.stroke()
}
}
},
gzUS: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PointsetsManager", (function() {
return o
}));
var s = i("LxhU"),
r = i("txPx");
const n = Object(r.getLogger)("ChartApi.PointsetsManager");
class o {
constructor() {
this._pointsetsDataBySymbol = new Map
}
destroy() {
this._pointsetsDataBySymbol.clear()
}
createPointset(e, t, i, s, r) {
let o = this._pointsetsDataBySymbol.get(t);
void 0 === o && (o = new Map, this._pointsetsDataBySymbol.set(t, o));
const a = [];
for (const t of s) {
const [i, s] = t;
"number" != typeof i || Number.isNaN(i) ? n.logWarn(
`Pointset time is invalid: id=${e}, ${i} of type ${typeof i}`) : a
.push({
point: t,
extrapolation: r.extrapolateTimeWithOffsetToTime(1e3 * i, s)
})
}
s.length === a.length && o.set(e, {
resolution: i,
points: a
})
}
removePointset(e) {
const t = [];
this._pointsetsDataBySymbol.forEach((i, s) => {
i.delete(e), 0 === i.size && t.push(s)
});
for (const e of t) this._pointsetsDataBySymbol.delete(e)
}
invalidatePointsetsForSymbol(e, t) {
const i = this._pointsetsDataBySymbol.get(e);
void 0 !== i && i.forEach((e, i) => {
if (s.Interval.isEqual(e.resolution, t))
for (const t of e.points) null !== t.extrapolation && t
.extrapolation.exact && (t.extrapolation.exact = !1)
})
}
getUpdatesForSymbol(e, t, i, s) {
const r = new Map,
n = this._pointsetsDataBySymbol.get(e);
return void 0 !== n && n.forEach((e, n) => {
const o = this._refreshPointsetData(e, t, i, s);
null !== o && r.set(n, o)
}), r
}
_refreshPointsetData(e, t, i, r) {
if (s.Interval.isEqual(e.resolution, t))
for (let t = 0; t < e.points.length; ++t) {
const s = e.points[t];
if (null !== s.extrapolation && s.extrapolation.exact) continue;
const [r, n] = s.point;
s.extrapolation = i.extrapolateTimeWithOffsetToTime(1e3 * r, n)
}
const o = [];
for (let i = 0; i < e.points.length; ++i) {
const s = e.points[i];
if (null === s.extrapolation) return null;
const a = r.indexOfTime(s.extrapolation.timeMs);
if (null === a) return n.logWarn(
`Cannot get index of time: time=${s.extrapolation.timeMs}, ${e.resolution} -> ${t}`
), null;
o.push({
index: i,
value: [a.index, a.timeMs / 1e3]
})
}
return o
}
}
},
h24c: function(e, t, i) {
"use strict";
var s = i("Kxc7"),
r = i("pPtI"),
n = i("PT1i"),
o = i("LxhU");
i.d(t, "d", (function() {
return a
})), i.d(t, "c", (function() {
return l
})), i.d(t, "a", (function() {
return c
})), i.d(t, "b", (function() {
return h
}));
new RegExp("^quandl", "i");
function a(e) {
let t;
t = /^[,\s]*(\d*)\s*([hdwmst]?)\s*$/i;
const i = t.exec(e) || [],
s = ~~i[1],
r = i[2] && i[2].toUpperCase() || null,
n = {
qty: !s && r ? 1 : s,
unit: r
};
return n.error = !s && !r, n.intraday = !(n.error || n.unit && "H" !== n.unit && "S" !== n
.unit && "T" !== n.unit), n
}
function l(e) {
if (s.enabled("allow_supported_resolutions_set_only")) {
const t = o.Interval.normalize(e);
return null !== t && Object(r.isAvailable)(t)
} {
const t = a(e);
if (t.error) return !1;
if (t.intraday) return n.linking.intraday.value(); {
const e = n.linking.supportedResolutions.value();
return !e || null !== t.unit && !!~e.indexOf(t.unit)
}
}
}
function c() {
let e = !1;
return s.enabled("show_spread_operators") && (e = !0), e
}
function h(e) {
return !e.ctrlKey && (!e.metaKey && (!!e.charCode && (!(!e.which || e.which <= 32) && (
null === e.target || !/^(input|textarea)$/i.test(e.target.tagName)))))
}
},
hBTJ: function(e, t, i) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
}), t.intersectPolygons = t.intersectPolygonAndHalfplane = t.intersectRayAndBox = t
.intersectLineAndBox = t.intersectLineSegments = t.intersectLines = t
.intersectLineSegmentAndBox = void 0;
var s = i("Eyy1"),
r = i("aO4+"),
n = i("GEp6"),
o = i("f6yo");
function a(e, t) {
var i = e.A,
s = t.A,
n = e.B,
o = t.B,
a = e.C,
l = t.C,
c = i * o - s * n;
if (Math.abs(c) < 1e-6) return null;
var h = (n * l - o * a) / c,
u = (s * a - i * l) / c;
return new r.Point(h, u)
}
function l(e, t, i, s) {
var r = function(e, t, i, s) {
var r = t.subtract(e),
n = s.subtract(i),
o = r.x * n.y - r.y * n.x;
if (Math.abs(o) < 1e-6) return null;
var a = e.subtract(i);
return (a.y * n.x - a.x * n.y) / o
}(e, t, i, s);
if (null === r) return null;
var o = t.subtract(e).scaled(r).add(e),
a = n.distanceToSegment(i, s, o);
return Math.abs(a.distance) < 1e-6 ? r : null
}
function c(e, t) {
for (var i = 0, s = e; i < s.length; i++) {
var n = s[i];
if (r.equalPoints(n, t)) return !1
}
return e.push(t), !0
}
function h(e, t) {
return !(e.length > 0 && (r.equalPoints(e[e.length - 1], t) || r.equalPoints(e[0], t))) && (
e.push(t), !0)
}
function u(e, t) {
for (var i = [], s = 0; s < e.length; ++s) {
var n = e[s],
l = e[(s + 1) % e.length],
c = r.lineThroughPoints(n, l);
if (o.pointInHalfplane(n, t)) {
if (h(i, n), !o.pointInHalfplane(l, t)) null !== (u = a(c, t.edge)) && h(i, u)
} else if (o.pointInHalfplane(l, t)) {
var u;
null !== (u = a(c, t.edge)) && h(i, u)
}
}
return i.length >= 3 ? i : null
}
t.intersectLineSegmentAndBox = function(e, t) {
var i = e[0].x,
s = e[0].y,
n = e[1].x,
o = e[1].y,
a = t.min.x,
l = t.min.y,
c = t.max.x,
h = t.max.y;
function u(e, t, i, s, r, n) {
var o = 0;
return e < i ? o |= 1 : e > r && (o |= 2), t < s ? o |= 4 : t > n && (o |= 8), o
}
for (var d = u(i, s, a, l, c, h), p = u(n, o, a, l, c, h), _ = !1, m = 0;;) {
if (m > 1e3) throw new Error("Cohen - Sutherland algorithm: infinity loop");
if (m++, !(d | p)) {
_ = !0;
break
}
if (d & p) break;
var f = d || p,
g = void 0,
b = void 0;
8 & f ? (g = i + (n - i) * (h - s) / (o - s), b = h) : 4 & f ? (g = i + (n - i) * (
l - s) / (o - s), b = l) : 2 & f ? (b = s + (o - s) * (c - i) / (n - i), g =
c) : (b = s + (o - s) * (a - i) / (n - i), g = a), f === d ? d = u(i = g,
s = b, a, l, c, h) : p = u(n = g, o = b, a, l, c, h)
}
return _ ? r.equalPoints(r.point(i, s), r.point(n, o)) ? r.point(i, s) : r.lineSegment(r
.point(i, s), r.point(n, o)) : null
}, t.intersectLines = a, t.intersectLineSegments = l, t.intersectLineAndBox = function(e,
t) {
var i = t.min.x,
n = t.min.y,
o = t.max.x,
a = t.max.y;
if (0 === e.A) {
var l = -e.C / e.B;
return n <= l && l <= a ? r.lineSegment(r.point(i, l), r.point(o, l)) : null
}
if (0 === e.B) {
var h = -e.C / e.A;
return i <= h && h <= o ? r.lineSegment(r.point(h, n), r.point(h, a)) : null
}
var u = [],
d = function(t) {
var i = function(e, t) {
return -(e.C + e.A * t) / e.B
}(e, t);
n <= i && i <= a && c(u, new r.Point(t, i))
},
p = function(t) {
var s = function(e, t) {
return -(e.C + e.B * t) / e.A
}(e, t);
i <= s && s <= o && c(u, new r.Point(s, t))
};
switch (d(i), p(n), d(o), p(a), u.length) {
case 0:
return null;
case 1:
return u[0];
case 2:
return r.equalPoints(u[0], u[1]) ? u[0] : r.lineSegment(u[0], u[1])
}
return s.assert(!1, "We should have at most two intersection points"), null
}, t.intersectRayAndBox = function(e, t, i) {
var s = l(e, t, i.min, new r.Point(i.max.x, i.min.y)),
n = l(e, t, new r.Point(i.max.x, i.min.y), i.max),
a = l(e, t, i.max, new r.Point(i.min.x, i.max.y)),
c = l(e, t, new r.Point(i.min.x, i.max.y), i.min),
h = [];
if (null !== s && s >= 0 && h.push(s), null !== n && n >= 0 && h.push(n), null !== a &&
a >= 0 && h.push(a), null !== c && c >= 0 && h.push(c), 0 === h.length) return null;
h.sort((function(e, t) {
return e - t
}));
var u = o.pointInBox(e, i) ? h[0] : h[h.length - 1];
return e.addScaled(t.subtract(e), u)
}, t.intersectPolygonAndHalfplane = u, t.intersectPolygons = function(e, t) {
for (var i = e, s = 0; s < t.length && null !== i; ++s) {
var n = t[s],
o = t[(s + 1) % t.length],
a = t[(s + 2) % t.length],
l = r.lineThroughPoints(n, o);
i = u(i, r.halfplaneThroughPoint(l, a))
}
return i
}
},
hGf4: function(e, t, i) {
"use strict";
(function(e, t) {
var s = i("UXvI").default,
r = i("hbEN").default,
n = i("kcTO").PriceFormatter;
const {
uniq: o
} = i("L6rT");
var a, l = i("e3/o"),
c = i("i/Bj").parseUpdateMode,
h = i("FIi8").deepExtend;
function u(t, i) {
this.options = Object.assign({
throttleTimeout: 125
}, i), this._connected = !1, this._symbol_data = {}, this._subscriptions = {},
this.onConnect = new e, this.onDisconnect = new e, this._quoteApi = new a(window
.ChartApiInstance), this._type = t || "full", this._delayUpdateFastSymbols =
r(this._updateFastSymbols, 250), this._throttledSymbolData = {}, this
._formatterValuesCache = {}, this._waitingForFormatters = {}, this
._snapshotValuesCache = {}, this._waitingForSnapshot = {}, this.connect()
}
a = i("wi9r"), u.prototype.destroy = function() {
this._quoteApi.destroy(), this._quoteApi = null, this._connected = !1, this
.onDisconnect.fire()
}, u.prototype.typeFields = {}, u.prototype.typeFields.simple = [
"base-currency-logoid", "ch", "chp", "currency-logoid", "currency_code",
"current_session", "description", "exchange", "format", "fractional",
"is_tradable", "language", "local_description", "logoid", "lp", "lp_time",
"minmov", "minmove2", "original_name", "pricescale", "pro_name", "short_name",
"type", "update_mode", "volume"
], u.prototype.typeFields.simpleDetailed = [].concat(u.prototype.typeFields.simple,
["ask", "bid", "fundamentals", "high_price", "is_tradable", "low_price",
"open_price", "prev_close_price", "rch", "rchp", "rtc", "rtc_time",
"status", "basic_eps_net_income", "beta_1_year",
"earnings_per_share_basic_ttm", "industry", "market_cap_basic",
"price_earnings_ttm", "sector", "volume", "dividends_yield", "timezone"
]), u.prototype.typeFields.full = [], u.prototype.typeFields.watchlist = []
.concat(u.prototype.typeFields.simple, ["rchp", "rtc", "country_code",
"provider_id"
]), u.prototype.typeFields.portfolio = ["pro_name", "short_name",
"exchange", "description", "sector", "type", "currency_code", "currency_id",
"ch", "chp", "logoid", "currency-logoid", "base-currency-logoid",
"earnings_per_share_forecast_next_fq", "earnings_release_next_date",
"earnings_release_date", "earnings_per_share_fq", "lp", "volume",
"average_volume", "market_cap_basic", "total_revenue",
"earnings_per_share_basic_ttm", "price_earnings_ttm", "beta_1_year",
"dps_common_stock_prim_issue_fy", "dividends_yield"
], u.prototype.connect = function(e) {
this._quoteApi.connect(this.quoteHandler.bind(this))
},
u.prototype.quoteHandler = function(e) {
var t = e.method,
i = e.params;
switch (t) {
case "connected":
this._connected || (this._connected = !0, this.onConnected());
break;
case "quote_list_fields":
break;
case "quote_symbol_data":
this._connected && this.onSymbolData(i[0]);
break;
case "quote_completed":
this._connected && this.onSymbolData({
symbolname: i[0],
complete: performance.now(),
values: {}
});
break;
case "disconnected":
this._connected && (this._connected = !1, this.onDisconnect.fire())
}
}, u.prototype.onConnected = function() {
this.setFields();
var e = Object.keys(this._symbol_data);
e.length && (this._quoteApi.quoteAddSymbols(e, {
forcePermission: !0
}), this._delayUpdateFastSymbols()), this.onConnect.fire()
}, u.prototype.setFields = function() {
var e = u.prototype.typeFields[this._type];
e && e.length && this._quoteApi.quoteSetFields(e)
}, u.prototype.onSymbolData = function(e) {
var t = e.symbolname,
i = this._throttledSymbolData[t];
i || (i = this._throttledSymbolData[t] = {
fnDispatch: s(this.dipatchSymbolData.bind(this), this.options
.throttleTimeout)
}), i.cache ? h(i.cache, e) : i.cache = e, i.fnDispatch(t)
}, u.prototype._parseUpdateMode = function(e) {
var t = c(e.update_mode);
null !== t && (e.update_mode = t.mode, e.update_mode_seconds = t.interval)
}, u.prototype.dipatchSymbolData = function(e) {
var t = this._symbol_data[e],
i = this._throttledSymbolData[e].cache;
if (delete this._throttledSymbolData[e].cache, this._symbol_data[e])
for (var s in h(t, i), t.values && this._parseUpdateMode(t.values), this
._subscriptions) {
var r = this._subscriptions[s];
r.has(e) && r.get(e).forEach((function(e) {
e(t, i)
}))
}
}, u.prototype.subscribe = function(e, t, i) {
this._subscriptions[e] = this._subscriptions[e] || new Map;
var s = this._subscriptions[e];
t = [].concat(t);
var r = [];
t.forEach((function(e) {
this._symbol_data[e] ? s && s.has(e) || this._symbol_data[e]
.subscribers_count++ : (this._symbol_data[e] = {
subscribers_count: 1
}, r.push(e)), s.has(e) || s.set(e, []), s.get(e).push(i), s
.get(e).fast = !0, this._symbol_data[e] && this
._symbol_data[e].values && i(this._symbol_data[e], this
._symbol_data[e])
}), this), r.length && this._connected && (this._quoteApi.quoteAddSymbols(
r, {
forcePermission: !0
}), this._delayUpdateFastSymbols())
}, u.prototype.unsubscribe = function(e, t, i) {
t = [].concat(t);
for (var s = this._subscriptions[e], r = [], n = 0; n < t.length; n++) {
var o = t[n];
if (s)
if (s.has(o) && i) {
var a = s.get(o).indexOf(i);
~a && s.get(o).splice(a, 1), s.get(o).length || s.delete(o)
} else s.delete(o);
s && 0 === s.size && delete this._subscriptions[e], this._symbol_data
.hasOwnProperty(o) && (s && !s.has(o) && this._symbol_data[o]
.subscribers_count--, this._symbol_data[o].subscribers_count || (
delete this._symbol_data[o], r.push(o)))
}
r.length && this._connected && (this._quoteApi.quoteRemoveSymbols(r), this
._delayUpdateFastSymbols())
}, u.prototype.setFastSymbols = function(e, t) {
if (this._subscriptions[e])
for (var i = this._subscriptions[e], s = Array.from(i.keys()), r = 0; r < s
.length; ++r) {
var n = s[r];
i.get(n).fast = -1 !== t.indexOf(n)
}
this._delayUpdateFastSymbols()
}, u.prototype._updateFastSymbols = function() {
if (this._connected) {
var e = this._fastSymbols();
0 === e.length ? this._quoteApi.quoteHibernateAll() : this._quoteApi
.quoteFastSymbols(e)
}
},
u.prototype._delayUpdateFastSymbols = u.prototype._updateFastSymbols, u.prototype
._fastSymbols = function() {
var e = [];
for (var t in this._subscriptions)
for (var i = this._subscriptions[t], s = Array.from(i.keys()), r = 0; r < s
.length; ++r) {
var n = s[r];
i.get(n).fast && e.push(n)
}
return e = o(e)
}, u.prototype.formatter = function(e, t) {
var i = this;
if (this._waitingForFormatters[e]) return this._waitingForFormatters[e];
function s(e) {
var i = t && !e.fractional ? 1 : e.minmov;
return new n(e.pricescale, i, e.fractional, e.minmove2)
}
var r = new Promise((function(t, r) {
if (i._formatterValuesCache[e]) t(s(i._formatterValuesCache[
e]));
else {
var n = l.guid();
i.subscribe(n, [e], (function(o) {
"error" === o.status && (i
._waitingForFormatters[e] = null, r(
"Quotes snapshot is not received"
)),
function(e) {
return e && null != e.pricescale &&
null != e.minmov
}(o.values) && (i._waitingForFormatters[
e] = null, i
._formatterValuesCache[e] = o
.values, t(s(o.values)), i
.unsubscribe(n, e))
}))
}
}));
return this._waitingForFormatters[e] = r, r
}, u.prototype.snapshot = function(e) {
var t = this;
if (this._waitingForSnapshot[e]) return this._waitingForSnapshot[e];
var i = new Promise((function(i, s) {
if (t._snapshotValuesCache[e]) i(t._snapshotValuesCache[e]);
else {
var r = l.guid();
t.subscribe(r, [e], (function(n) {
"error" === n.status && (t
._waitingForSnapshot[e] = null, s(
"Quotes snapshot is not received"
));
var o = n.values;
o && o.minmov && o.pricescale && o
.description && (t._waitingForSnapshot[
e] = null, t
._snapshotValuesCache[e] = o, i(o),
t.unsubscribe(r, e))
}))
}
}));
return this._waitingForSnapshot[e] = i, i
}, TradingView.QuoteSessionMultiplexer = u, t && t.exports && (t.exports = u)
}).call(this, i("aIyQ"), i("YuTi")(e))
},
hOqT: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "getTranslatedSymbolDescription", (function() {
return s
}));
i("YFKU");
function s(e) {
return e.description || ""
}
},
hP9j: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolPolyline", (function() {
return l
}));
var s = i("Eyy1"),
r = i("aO4+"),
n = i("Ocx9"),
o = i("Zp/P"),
a = i("Ss5c");
class l extends a.LineDataSource {
constructor(e, t) {
const s = t || l.createProperties();
super(e, s), i.e("lt-pane-views").then(i.bind(null, "C2CE")).then(t => {
this._setPaneViews([new t.PolylinePaneView(this, e)])
})
}
pointsCount() {
return -1
}
properties() {
return super.properties()
}
name() {
return "Polyline"
}
hasEditableCoordinates() {
return !1
}
addPoint(e, t, i) {
var n;
const a = Object(s.ensureNotNull)(this.priceScale()),
l = this._model.timeScale().indexToCoordinate(e.index),
c = e.price,
h = Object(s.ensure)(null === (n = this.ownerSource()) || void 0 === n ?
void 0 : n.firstValue()),
u = a.priceToCoordinate(c, h),
d = Object(o.interactionTolerance)().minDistanceBetweenPoints;
if (this._points.length > 0) {
const e = this._points[this._points.length - 1],
t = this._model.timeScale().indexToCoordinate(e.index),
i = e.price,
s = a.priceToCoordinate(i, h);
if (new r.Point(l, u).subtract(new r.Point(t, s)).length() < d) return this
._lastPoint = null, this.normalizePoints(), this
.createServerPoints(), !0;
const n = this._points[0],
o = this._model.timeScale().indexToCoordinate(n.index),
c = n.price,
p = a.priceToCoordinate(c, h);
if (new r.Point(l, u).subtract(new r.Point(o, p)).length() < d) return this
.properties().childs().filled.setValue(!0), this._lastPoint = null,
this.normalizePoints(), this.createServerPoints(), !0
}
return super.addPoint(e, t, i)
}
setPoint(e, t, i) {
var n;
super.setPoint(e, t, i);
const a = this.priceScale();
if (!(this._model.timeScale().isEmpty() || null === a || a.isEmpty() || e !==
this._points.length - 1 && 0 !== e)) {
const i = Object(s.ensure)(null === (n = this.ownerSource()) || void 0 ===
n ? void 0 : n.firstValue()),
l = this._model.timeScale().indexToCoordinate(t.index),
c = a.priceToCoordinate(t.price, i),
h = e === this._points.length - 1 ? this._points[0] : this._points[this
._points.length - 1],
u = this._model.timeScale().indexToCoordinate(h.index),
d = a.priceToCoordinate(h.price, i);
new r.Point(l, c).subtract(new r.Point(u, d)).length() < Object(o
.interactionTolerance)().minDistanceBetweenPoints && this
.properties().childs().filled.setValue(!0)
}
}
static createProperties(e) {
const t = new n.DefaultProperty("linetoolpolyline", e);
return l._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "91EF")).then(
e => e.PolylinesDefinitionsViewModel)
}
static _configureProperties(e) {
a.LineDataSource._configureProperties(e), e.addExclusion("filled")
}
}
},
hXqA: function(e, t, i) {
"use strict";
var s = i("c7G1");
class r {
constructor() {
this.isUpdate = !1, this.graphicsCmds = new s.c, this._offsetsChanged = !1, this
._disableGraphicsAndData = !1
}
isNaN() {
return this.graphicsCmds.isNaN()
}
primitiveData(e) {
const t = {};
if (!this._disableGraphicsAndData) {
const i = this.graphicsCmds.primitiveData(e);
null !== i && (t.graphicsCmds = i)
}
return this.isUpdate && (t.isUpdate = !0), void 0 === t.graphicsCmds ? void 0 : t
}
disable() {
this._disableGraphicsAndData = !0
}
checkForChangeAndResetChangedState(e) {
const t = this._offsetsChanged,
i = this.graphicsCmds.isModified();
this.graphicsCmds.setModified(!1), this._offsetsChanged = !1;
return i || t || 0 !== e.length
}
}
var n = i("ogJP"),
o = i("dhFz");
function a(e) {
return Boolean(e.isPosted)
}
class l {
isIgnoredObj(e, t) {
return l.isIgnoredObjDefault(e, t)
}
static isIgnoredObjDefault(e, t) {
if (void 0 === t) return l.isIgnoredObjNaNable(e);
const i = e[t];
return l.isIgnoredByGeneralRules(e, t) || l.isIgnoredObjNaNable(i) || l
.isIgnoredObjListOfNaNables(i)
}
static isIgnoredObjNaNable(e) {
return Object(o.a)(e) && e.isNaN()
}
static isIgnoredObjListOfNaNables(e) {
if (!Object(n.isArray)(e)) return !1;
let t = !0;
for (const i of e)
if (!Object(o.a)(i) || !i.isNaN()) {
t = !1;
break
} return t
}
static isIgnoredObjPosted(e) {
return a(e) && e.isPosted()
}
static isIgnoredObjErased(e) {
return a(e) && e.isErased()
}
static isIgnoredByGeneralRules(e, t) {
const i = e[t];
return Object(n.isArray)(i) && 0 === i.length
}
}
class c {
isIgnoredObj(e, t) {
if (void 0 === t) return l.isIgnoredObjDefault(e) || l.isIgnoredObjErased(e);
const i = e[t];
return l.isIgnoredObjDefault(e, t) || l.isIgnoredObjErased(i)
}
}
class h {
isIgnoredObj(e, t) {
if (void 0 === t) return l.isIgnoredObjDefault(e) || l.isIgnoredObjErased(e) || l
.isIgnoredObjPosted(e);
const i = e[t];
return l.isIgnoredObjDefault(e, t) || l.isIgnoredObjErased(i) || l
.isIgnoredObjPosted(i)
}
}
i.d(t, "a", (function() {
return u
}));
class u extends class extends class {
constructor(e) {
this._dataObj = new r, this._isDirty = !1, this._eraseCmds = [],
this._enableCmdDataStudy = e
}
init(e) {
this._dataObj.graphicsCmds.setCreate(e), this.update(!0)
}
dataObj() {
return this._dataObj
}
setEraseCmds(e) {
this._eraseCmds = e
}
resetDirtyState() {
this._isDirty = !1
}
disable() {
this._dataObj.disable()
}
} {
constructor(e) {
super(e), this._snapshotPredicate = new c, this._dataSnapShot = {}
}
getData() {
return this._dataSnapShot
}
getUpdate() {
return this._isDirty ? this._dataSnapShot : {}
}
update(e) {
(this._dataObj.checkForChangeAndResetChangedState(this._eraseCmds) || e) && (
null !== this._dataObj.graphicsCmds.create && (this._dataObj.graphicsCmds.create
.deleteErasedObjs(), this._dataObj.graphicsCmds.erase = [new s.a]), this
._makeSnapshot(), this._isDirty = !0)
}
_makeSnapshot() {
this._json = this._dataObj.primitiveData(this._snapshotPredicate), this
._dataSnapShot = {
json: this._json
}
}
} {
constructor(e) {
super(e), this._updatePredicate = new h, this._sendShapshotOnly = !0, this
._isFirstNotForcedUpdate = !0
}
update(e) {
(this._dataObj.checkForChangeAndResetChangedState(this._eraseCmds) || e) && (
null !== this._dataObj.graphicsCmds.create && (this._dataObj.graphicsCmds
.erase = [new s.a]), this._dataObj.isUpdate = !0, this._makeSnapshot(),
null !== this._dataObj.graphicsCmds.create && (this._dataObj.graphicsCmds
.erase = this._eraseCmds), this._dataObj.isUpdate = !0, this._jsonUpdate =
this._dataObj.primitiveData(this._updatePredicate), null !== this._dataObj
.graphicsCmds.create && this._dataObj.graphicsCmds.create
.deleteErasedAndMarkPostedObjs(), this._sendShapshotOnly = e || this
._isFirstNotForcedUpdate, this._isFirstNotForcedUpdate = Boolean(e), this
._isDirty = !0)
}
getUpdate() {
return this._isDirty ? this._enableCmdDataStudy ? {
json: this._sendShapshotOnly ? this._json : void 0,
jsonUpdate: this._sendShapshotOnly ? void 0 : this._jsonUpdate
} : {
json: this._json,
jsonUpdate: this._sendShapshotOnly ? void 0 : this._jsonUpdate
} : {}
}
}
},
hY0g: function(e, t, i) {
"use strict";
(function(e) {
var t = i("txPx").getLogger("Common.WatchedValue");
function s() {}
function r(e) {
if (!(this instanceof r)) return new r(e);
arguments.length > 0 && (this._value = e), this._listeners = []
}
r.prototype.value = function() {
return this._owner ? this._owner._value : this._value
}, r.prototype.setValue = function(e, i) {
var s = this._owner ? this._owner : this;
if ("function" == typeof s.hook && (e = s.hook(e)), s.writeLock) return s
._value;
var r = s._value === e || Number.isNaN(s._value) && Number.isNaN(e);
if (!i && r && s.hasOwnProperty("_value")) return e;
s._value = e;
for (var n = s._listeners.slice(), o = 0, a = 0; a < n.length; a++) {
n[a].once && (s._listeners.splice(a - o, 1), o++);
try {
n[a].cb(e)
} catch (e) {
t.logError(e.stack || e.message)
}
}
return e
}, r.prototype.deleteValue = function() {
var e = this._owner ? this._owner : this;
if (e.hasOwnProperty("_value")) {
if (e.writeLock) return e._value;
delete e._value;
for (var i = e._listeners.slice(), s = 0, r = 0; r < i.length; r++) {
i[r].once && (e._listeners.splice(r - s, 1), s++);
try {
i[r].cb()
} catch (e) {
t.logError(e.stack || e.message)
}
}
}
}, r.prototype.subscribe = function(e, i) {
if ("function" != typeof e) throw new TypeError("callback must be a function");
var s = !!i && !!i.once,
r = !!i && !!i.callWithLast,
n = this._owner ? this._owner : this;
if (r && n.hasOwnProperty("_value")) {
try {
e(n._value)
} catch (e) {
t.logError(e.stack || e.message)
}
if (s) return
}
n._listeners.push({
cb: e,
owner: this,
once: !!i && !!i.once
})
}, r.prototype.unsubscribe = function(e) {
var t = this._owner ? this._owner : this;
void 0 === e && (e = null);
for (var i = t._listeners, s = i.length; s--;) i[s].owner !== this && t !==
this || i[s].cb !== e && null !== e || i.splice(s, 1)
}, r.prototype.listeners = function() {
return (this._owner ? this._owner : this)._listeners
}, r.prototype.readonly = function() {
if (this._readonlyInstance) return this._readonlyInstance;
var e = this._readonlyInstance = new s;
return e.subscribe = this.subscribe.bind(this), e.unsubscribe = this.unsubscribe
.bind(this), e.value = this.value.bind(this), e.when = this.when.bind(this),
e.spawn = function() {
return this.spawn().readonly()
}.bind(this), this.destroy && (e.destroy = this.destroy.bind(this)), e
}, r.prototype.spawn = function(e) {
var i = new r;
return delete i._listeners, i._owner = this._owner || this, i.destroy =
function() {
if ("function" == typeof e) try {
e()
} catch (e) {
t.logError(e.stack || e.message)
}
this.unsubscribe(), delete this._owner
}, i
}, r.prototype.when = function(e) {
var i = this;
if (this.value()) try {
e()
} catch (e) {
t.logError(e.stack || e.message)
} else {
var s = function(t) {
t && (i.unsubscribe(s), e())
};
i.subscribe(s)
}
}, r.prototype.opposite = function() {
if (!this._opposite) {
var e = this,
t = new r(!this.value());
this.subscribe((function(e) {
t.setValue(!e)
})), t.subscribe((function(t) {
e.setValue(!t)
})), this._opposite = t
}
return this._opposite
}, "undefined" != typeof window && (window.WatchedValue = r), e && e.exports && (e
.exports = r)
}).call(this, i("YuTi")(e))
},
hY3j: function(e, t, i) {
"use strict";
var s = i("PAcw").GridRenderer;
function r() {
this._id = "grid", this.visible = !0, this.horzLinesVisible = !0, this.horzLinesColor =
"white", this.horzLinesStyle = "", this.vertLinesVisible = !0, this.vertLinesColor =
"white", this.vertLinesStyle = ""
}
function n(e, t) {
this.source = e, this.pane = t, this._renderer = new s
}
r.prototype.id = function() {
return this._id
}, r.prototype.paneViews = function(e) {
return [new n(this, e)]
}, n.prototype.update = function() {}, n.prototype.renderer = function() {
var e = {};
return this.pane.defaultPriceScale().isEmpty() || this.pane.timeScale().isEmpty() ?
null : (e.horzLinesVisible = !0, e.vertLinesVisible = !0, e.horzLinesColor = this
.pane._model.properties().paneProperties.horzGridProperties.color.value(), e
.vertLinesColor = this.pane._model.properties().paneProperties
.vertGridProperties.color.value(), e.horzLineStyle = this.pane._model
.properties().paneProperties.horzGridProperties.style.value(), e.vertLineStyle =
this.pane._model.properties().paneProperties.vertGridProperties.style.value(), e
.priceMarks = this.pane.defaultPriceScale().marks(), e.timeMarks = this.pane
.timeScale().marks(), e.w = this.pane.width(), e.h = this.pane.height(), this
._renderer.setData(e), this._renderer)
}, t.Grid = r
},
hezA: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyPriceAxisView", (function() {
return r
}));
var s = i("KcY8");
class r extends s.a {
constructor(e, t) {
super(), this._model = e.model(), this._source = e, this._data = t
}
_updateRendererData(e, t, i) {
e.visible = !1, t.visible = !1;
const s = this._source.model(),
r = this._source.priceScale();
if (null === r) return;
if (!s.isPriceScaleVisible(r)) return;
const n = this._source.lastValueData(this._data.plotIndex, !1);
if (n.noData) return;
i.background = n.color;
let o = n.color;
"transparent" === o && (o = this._model.properties().scalesProperties
.backgroundColor.value()), i.textColor = this.generateTextColor(o), i
.coordinate = n.coordinate, i.floatCoordinate = n.floatCoordinate, this
._showAxisLabel() && (e.text = n.text, e.visible = !0), this
._updatePaneRendererData(t)
}
_showPaneLabel() {
return this._model.properties().scalesProperties.showStudyPlotLabels.value()
}
_showAxisLabel() {
return this._model.properties().scalesProperties.showStudyLastValue.value()
}
_updatePaneRendererData(e) {
e.text = "", this._showPaneLabel() && (e.text = this._source.priceLabelText(this
._data.plotIndex), e.visible = !0)
}
}
},
hfHJ: function(e, t, i) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
}), t.transformPoint = t.translationMatrix = t.scalingMatrix = t.rotationMatrix = t
.multiplyMatrices = t.identityMatrix = void 0;
var s = i("aO4+");
t.identityMatrix = function() {
return [
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]
]
}, t.multiplyMatrices = function(e, t) {
for (var i = [
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
], s = 0; s < 3; s++)
for (var r = 0; r < 3; r++)
for (var n = 0; n < 3; n++) i[s][r] += e[s][n] * t[n][r];
return i
}, t.rotationMatrix = function(e) {
var t = Math.cos(e),
i = Math.sin(e);
return [
[t, -i, 0],
[i, t, 0],
[0, 0, 1]
]
}, t.scalingMatrix = function(e, t) {
return [
[e, 0, 0],
[0, t, 0],
[0, 0, 1]
]
}, t.translationMatrix = function(e, t) {
return [
[1, 0, e],
[0, 1, t],
[0, 0, 1]
]
}, t.transformPoint = function(e, t) {
for (var i = [t.x, t.y, 1], r = [0, 0, 0], n = 0; n < 3; n++)
for (var o = 0; o < 3; o++) r[n] += i[o] * e[n][o];
return new s.Point(r[0], r[1])
}
},
hsV8: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ensureTimePointIndexIndex", (function() {
return n
})), i.d(t, "unpackNonSeriesData", (function() {
return o
}));
var s = i("JmuD"),
r = i("qySK");
function n(e) {
if (e < 0) throw new Error("TimePointIndexIndex should be non-negative integer");
return e
}
async function o(e) {
if ("" === e) return null;
const t = JSON.parse(e);
if (!Object(s.isObject)(t) || "function" == typeof t) throw new Error(
"Non-object content in the non-series envelope");
if (Object(s.hasProperty)(t, "indexes_replace")) return {
indexes_replace: !0
};
const i = {
indexes_replace: !1
};
if (Object(s.hasProperty)(t, "offsets") && (i.offsets = t.offsets), Object(s
.hasProperty)(t, "isUpdate")) {
if ("boolean" != typeof t.isUpdate) throw new Error(
'Invalid type of "isUpdate" field');
i.isUpdate = t.isUpdate
}
return Object(s.hasProperty)(t, "data") && (i.data = t.data), Object(s.hasProperty)(t,
"graphicsCmds") && (i.graphicsCmds = Object(r.b)(t.graphicsCmds)), i
}
},
htUT: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ChartChangesWatcher", (function() {
return n
}));
var s = i("aIyQ"),
r = i.n(s);
class n {
constructor(e, t, i) {
this._hasChanges = !1, this._undoHistory = e, this._chartSaver = t, this
._globalEvents = i, this._onValueChanged = new r.a, this._subscribe()
}
destroy() {
this._unsubscribe(), this._onValueChanged.destroy()
}
hasChanges() {
return this._hasChanges
}
getOnChange() {
return this._onValueChanged
}
_subscribe() {
this._globalEvents.subscribe("chart_loaded", this._handleChartLoaded, this), this
._undoHistory.undoStack().onChange().subscribe(this, this
._handleChangeUndoStack), this._chartSaver.chartSaved().subscribe(this, this
._handleChartSaved)
}
_unsubscribe() {
this._globalEvents.unsubscribe("chart_loaded", this._handleChartLoaded, this), this
._undoHistory.undoStack().onChange().unsubscribe(this, this
._handleChangeUndoStack), this._chartSaver.chartSaved().unsubscribe(this,
this._handleChartSaved)
}
_setChanges(e) {
this._hasChanges !== e && (this._hasChanges = e, this._onValueChanged.fire(e))
}
_handleChartLoaded() {
this._setChanges(!1)
}
_handleChangeUndoStack(e) {
e && !e.customFlag("doesnt_affect_save") && this._setChanges(!0)
}
_handleChartSaved(e) {
e && this._setChanges(!1)
}
}
},
"hyq/": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "pivotPointsStandardStudyItem", (function() {
return h
}));
var s = i("ocLq"),
r = i("LxhU");
class n {
constructor() {
this.p = NaN, this.r1 = NaN, this.s1 = NaN, this.r2 = NaN, this.s2 = NaN, this.r3 =
NaN, this.s3 = NaN, this.r4 = NaN, this.s4 = NaN, this.r5 = NaN, this.s5 = NaN,
this.startIndex__t = NaN, this.endIndex__t = NaN
}
}
class o {
constructor() {
this.pivots = []
}
}
function a(e, t) {
e.setUTCMonth(e.getUTCMonth() + t)
}
function l(e, t) {
if (s.Std.ismonthly(e)) {
let i = new Date(t);
return i.getUTCDay() < function(e, t) {
return new Date(t, e, 0).getDate()
}(i.getUTCMonth(), i.getUTCFullYear()) ? (a(i, s.Std.interval(e)), i = s.Std
.add_days_considering_dst("Etc/UTC", i, 1 - i.getUTCDay())) : (i = s.Std
.add_days_considering_dst("Etc/UTC", i, 1), a(i, s.Std.interval(e))), i
.valueOf()
}
return t + r.Interval.parse(e.symbol.resolution).inMilliseconds(t)
}
function c(e, t) {
switch (t) {
case "Auto":
return function(e) {
const t = r.Interval.parse(e.symbol.interval + e.symbol.resolution);
switch (t.kind()) {
case r.ResolutionKind.Weeks:
case r.ResolutionKind.Months:
return "12M";
case r.ResolutionKind.Days:
return "1M";
case r.ResolutionKind.Minutes:
return t.multiplier() >= 1 && t.multiplier() <= 15 ? "1D" : "1W";
case r.ResolutionKind.Seconds:
case r.ResolutionKind.Ticks:
return "1D"
}
throw new Error("Unexpected resolution type: " + e.symbol.resolution)
}(e);
case "Daily":
return "1D";
case "Weekly":
return "1W";
case "Monthly":
return "1M";
case "Yearly":
return "12M";
default:
throw new Error("No such pivTimeFrame: " + t)
}
}
const h = {
name: "Pivot Points Standard",
metainfo: {
_metainfoVersion: 44,
defaults: {
inputs: {
kind: "Traditional",
lookBack: 15,
pivTimeFrame: "Auto",
showHistoricalPivots: !0
},
precision: "4"
},
description: "Pivot Points Standard",
id: "PivotPointsStandard@tv-basicstudies-80",
inputs: [{
defval: "Traditional",
id: "kind",
name: "Type",
options: ["Traditional", "Fibonacci", "Woodie", "Classic", "DeMark",
"Camarilla"
],
type: "text"
}, {
defval: !0,
id: "showHistoricalPivots",
name: "Show historical pivots",
type: "bool"
}, {
defval: "Auto",
id: "pivTimeFrame",
name: "Pivots Timeframe",
options: ["Auto", "Daily", "Weekly", "Monthly", "Yearly"],
type: "text"
}, {
defval: 15,
id: "lookBack",
max: 5e3,
min: 2,
name: "Number of Pivots Back",
type: "integer"
}],
is_price_study: !0,
linkedToSeries: !0,
shortDescription: "Pivots"
},
constructor: class {
constructor() {
this._secondaryRes = "1D", this._firstMainSeriesBarTime = NaN
}
init(e, t) {
const i = t(0),
r = t(1),
n = t(2),
a = t(3);
this._data = new o, this._firstMainSeriesBarTime = NaN, this._kindPP =
function(e) {
switch (e) {
case "Traditional":
return 0;
case "Fibonacci":
return 1;
case "Woodie":
return 2;
case "Classic":
return 3;
case "DeMark":
return 4;
case "Camarilla":
return 5;
default:
throw new Error("Unknown kind " + e)
}
}(i), this._showHistoricalPivots = r, this._historicalPivotsToKeep =
a, this._pivTimeFrame = n, this._isValidResolution = function(e,
t) {
return (!s.Std.isdaily(e) || "Daily" !== t) && ((!s.Std
.isweekly(e) || "Daily" !== t && "Weekly" !== t) &&
(!s.Std.ismonthly(e) || "Daily" !== t && "Weekly" !==
t && "Monthly" !== t))
}(e, this._pivTimeFrame), this._isValidResolution || s.Std.error(
"You cannot see this pivot timeframe on this resolution"), this
._isValidResolution && (this._secondaryRes = c(e, this
._pivTimeFrame)), e.new_sym(e.symbol.tickerid, this
._secondaryRes)
}
main(e) {
if (!this._isValidResolution) return null;
if (e.symbol.time) return isNaN(this._firstMainSeriesBarTime) && (this
._firstMainSeriesBarTime = e.symbol.time, this
._removeUnusedPivots()), e.symbol.isLastBar && e.symbol
.isNewBar ? this._createResponse() : null;
e.select_sym(1);
const t = e.new_var(s.Std.open(e)),
i = e.new_var(s.Std.high(e)),
r = e.new_var(s.Std.low(e)),
o = e.new_var(s.Std.close(e)),
a = e.new_var(s.Std.time(e)),
c = this._data,
h = t.get(0),
u = a.get(0),
d = t.get(1),
p = i.get(1),
_ = r.get(1),
m = o.get(1),
f = e.symbol.isLastBar;
if (0 !== c.pivots.length && e.symbol.isNewBar) {
const e = c.pivots[c.pivots.length - 1];
e.endIndex__t !== u && (e.endIndex__t = u)
}
if (0 === e.symbol.index || !e.symbol.isNewBar) return e.select_sym(0),
null;
const g = function(e, t, i, r, o, a, l, c) {
const h = new n;
let u = NaN;
const d = i - r;
switch (c) {
case 0:
u = (i + r + o) / 3, h.p = u, h.r1 = 2 * u - r, h.s1 =
2 * u - i, h.r2 = u + (i - r), h.s2 = u - (i - r), h
.r3 = 2 * u + (i - 2 * r), h.s3 = 2 * u - (2 * i -
r), h.r4 = 3 * u + (i - 3 * r), h.s4 = 3 * u - (
3 * i - r), h.r5 = 4 * u + (i - 4 * r), h.s5 =
4 * u - (4 * i - r);
break;
case 1:
u = (i + r + o) / 3, h.p = u, h.r1 = u + .382 * d, h
.s1 = u - .382 * d, h.r2 = u + .618 * d, h.s2 = u -
.618 * d, h.r3 = u + d, h.s3 = u - d;
break;
case 2:
u = (i + r + 2 * e) / 4, h.p = u, h.r1 = 2 * u - r, h
.s1 = 2 * u - i, h.r2 = u + d, h.s2 = u - d, h.r3 =
i + 2 * (u - r), h.s3 = r - 2 * (i - u), h.r4 = h
.r3 + d, h.s4 = h.s3 - d;
break;
case 3:
u = (i + r + o) / 3, h.p = u, h.r1 = 2 * u - r, h.s1 =
2 * u - i, h.r2 = u + d, h.s2 = u - d, h.r3 = u +
2 * d, h.s3 = u - 2 * d, h.r4 = u + 3 * d, h.s4 =
u - 3 * d;
break;
case 4:
let n = NaN;
n = s.Std.equal(t, o) ? i + r + 2 * o : s.Std.greater(o,
t) ? 2 * i + r + o : 2 * r + i + o, u = n / 4, h
.p = u, h.r1 = n / 2 - r, h.s1 = n / 2 - i;
break;
case 5:
u = (i + r + o) / 3, h.p = u, h.r1 = o + 1.1 * d / 12, h
.s1 = o - 1.1 * d / 12, h.r2 = o + 1.1 * d / 6, h
.s2 = o - 1.1 * d / 6, h.r3 = o + 1.1 * d / 4, h
.s3 = o - 1.1 * d / 4, h.r4 = o + 1.1 * d / 2, h
.s4 = o - 1.1 * d / 2;
break;
default:
throw new Error("Unknown kind")
}
return h.startIndex__t = a, h.endIndex__t = l, h
}(h, d, p, _, m, u, l(e, u), this._kindPP);
return e.select_sym(0), this._showHistoricalPivots || (c.pivots = []), c
.pivots.push(g), c.pivots.length > this._historicalPivotsToKeep && c
.pivots.shift(), f ? this._createResponse() : null
}
_createResponse() {
return 0 === this._data.pivots.length ? null : {
nonseries: !0,
type: "non_series_data",
data: {
data: this._data
}
}
}
_removeUnusedPivots() {
const e = Math.max(this._data.pivots.findIndex(e => e.startIndex__t >
this._firstMainSeriesBarTime) - 1, 0);
e > 0 && this._data.pivots.splice(0, e)
}
}
}
},
"i/Bj": function(e, t, i) {
"use strict";
function s(e) {
if (void 0 === e) return null;
const t = e.match(/(delayed_streaming)_([\d]{1,4})/);
return null === t ? null : {
mode: t[1],
interval: parseInt(t[2])
}
}
i.r(t), i.d(t, "parseUpdateMode", (function() {
return s
}))
},
i126: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyColorRotatorFactory", (function() {
return h
}));
var s = i("HGP3"),
r = i("eJTA"),
n = i("Tmoa"),
o = i("3ClC");
const a = ["color-sky-blue-400", "color-banana-yellow-700", "color-deep-blue-500",
"color-grapes-purple-a700", "color-iguana-green-500", "color-minty-green-a700",
"color-ripe-red-a200", "color-berry-pink-200", "color-tv-blue-a100",
"color-tan-orange-a200", "color-sky-blue-a400", "color-deep-blue-a100",
"color-grapes-purple-400", "color-iguana-green-a700", "color-minty-green-200",
"color-ripe-red-200", "color-berry-pink-a200", "color-ripe-red-500",
"color-grapes-purple-500", "color-deep-blue-400", "color-tv-blue-a200",
"color-sky-blue-500", "color-iguana-green-400", "color-minty-green-400",
"color-banana-yellow-600", "color-tan-orange-500", "color-berry-pink-400",
"color-ripe-red-300", "color-grapes-purple-300", "color-deep-blue-300",
"color-tv-blue-300", "color-sky-blue-300", "color-iguana-green-300",
"color-minty-green-300", "color-banana-yellow-400", "color-tan-orange-300",
"color-berry-pink-300", "color-tan-orange-a700"
];
class l {
constructor(e) {
this._offset = 0, this._offset = e
}
getColor(e) {
if (0 === this._offset) return e;
const t = a[(this._offset - 1) % a.length],
i = s.colorsPalette[t],
o = Object(n.isHexColor)(e) ? 1 : Object(r.parseRgba)(e)[3];
return Object(n.generateColor)(i, Object(n.alphaToTransparency)(o))
}
}
class c {
constructor(e, t) {
this._offset = e, this._modelStartOffset = t
}
getColor(e) {
if (Object(n.isHexColor)(e)) {
const t = Object(r.parseRgb)(e);
return Object(r.rgbToHexString)(Object(r.shiftRgb)(t, this._offset, this
._modelStartOffset))
} {
const t = Object(r.parseRgba)(e);
return Object(r.rgbaToString)(Object(r.shiftRgba)(t, this._offset, this
._modelStartOffset))
}
}
}
class h {
constructor(e) {
this._chartModel = e
}
getColorRotator(e) {
const t = Object(o.studyColorRotationMode)(e);
if (null === t) return null;
const i = this._calcDefaultColorsOffset(e);
switch (t) {
case "loop":
return new l(i);
case "shift": {
const e = this._chartModel.getStudyShiftColorStartOffset();
return new c(i, e)
}
}
}
_calcDefaultColorsOffset(e) {
let t = 0;
const i = Object(o.useSameColorRotationComparator)(e);
return this._chartModel.dataSources().filter(o.isStudy).forEach(s => {
i(e, s.metaInfo()) && t++
}), t
}
}
},
i6cO: function(e, t, i) {
"use strict";
var s;
function r(e) {
e.lineWidth = void 0, e.lineStyle = void 0;
for (let t = 0; t < e.colors.length; t++) e.colors[t] = void 0;
return e
}
function n() {
return {
colors: [void 0, void 0, void 0, void 0, void 0, void 0, void 0]
}
}
i.r(t), i.d(t, "ColorerType", (function() {
return s
})), i.d(t, "clearStyle", (function() {
return r
})), i.d(t, "createEmptyStyle", (function() {
return n
})),
function(e) {
e[e.Main = 0] = "Main", e[e.Background = 1] = "Background", e[e.Text = 2] = "Text", e[e
.Border = 3] = "Border", e[e.Wick = 4] = "Wick", e[e.Up = 5] = "Up", e[e.Down =
6] = "Down"
}(s || (s = {}))
},
i80N: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("Ocx9").DefaultProperty;
class n extends s {
constructor(e, t) {
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"8MBc", 7)).then(({
FibSpiralPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 2
}
name() {
return "Fib Spiral"
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "nBUU")))
.FibSpiralDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetoolfibspiral", e);
return n._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
t.LineToolFibSpiral = n
},
iDOr: function(e, t, i) {
"use strict";
(function(e) {
var s = i("Y7w9").moveToHead,
r = i("704P").ExecutionsPositionController,
n = i("Ss5c").LineDataSource,
o = i("7ktv").PriceDataSource,
a = i("CW80").isLineTool,
l = i("1Wlv").PriceScale,
c = i("MWAT").createPriceScaleSelectionStrategy,
h = i("yfAl").PaneBase,
u = i("s1Gx").sortSources;
class d extends h {
constructor(t, i, s, r) {
super(t, i, s, r), this.m_timeScale = t, this.m_height = 0, this.m_width =
0, this.m_mainDataSource = null, this._properties = i, this._model = s,
this._destroyed = new e, s.properties().priceScaleSelectionStrategyName
.listeners().subscribe(null, function(e) {
this._priceScaleSelectionStrategy = c(e.value()), this
._priceScaleSelectionStrategy.apply(this)
}.bind(this)), this.m_timeScale.barSpacingChanged().subscribe(this,
function() {
this.m_mainDataSource === this._model.mainSeries() && this
._recalculatePriceScaleByScaleRatio(this.m_mainDataSource
.priceScale())
}.bind(this)), i.topMargin.listeners().subscribe(this, d.prototype
._updateMargins), i.bottomMargin.listeners().subscribe(this, d
.prototype._updateMargins), this._updateMargins(), this
._maximized = !1
}
destroy() {
this._properties.topMargin.listeners().unsubscribe(this, d.prototype
._updateMargins), this._properties.bottomMargin.listeners()
.unsubscribe(this, d.prototype._updateMargins), this._model.properties()
.priceScaleSelectionStrategyName.listeners().unsubscribeAll(this), this
.m_timeScale.barSpacingChanged().unsubscribeAll(this), this
._leftPriceScales.concat(this._rightPriceScales).forEach((function(e) {
e.modeChanged().unsubscribeAll(this), e.priceRangeChanged()
.unsubscribeAll(this), e.internalHeightChanged()
.unsubscribeAll(this)
}), this);
for (var e = 0; e < this.m_dataSources.length; e++) {
var t = this.m_dataSources[e];
this.removeSourceFromPriceScale(t), t.destroy && t.destroy()
}
this._destroyed.fire()
}
model() {
return this._model
}
width() {
return this.m_width
}
height() {
return this.m_height
}
setWidth(e) {
this.m_width = e, this.updateAllViews()
}
setHeight(e) {
this.m_height = e, this._leftPriceScales.forEach((function(t) {
t.setHeight(e)
})), this._rightPriceScales.forEach((function(t) {
t.setHeight(e)
}));
for (var t = 0; t < this.m_dataSources.length; t++) {
var i = this.m_dataSources[t];
this.isOverlay(i) && i.priceScale() && i.priceScale().setHeight(e)
}
this.updateAllViews()
}
leftPriceScales() {
return this._leftPriceScales
}
rightPriceScales() {
return this._rightPriceScales
}
visibleLeftPriceScales() {
var e = this._model.priceScaleSlotsCount();
if (this._leftPriceScales.length > e.left) {
var t = s(this._leftPriceScales, this.mainDataSource().priceScale());
return t.splice(e.left), t
}
return this._leftPriceScales
}
visibleRightPriceScales() {
var e = this._model.priceScaleSlotsCount();
if (this._rightPriceScales.length > e.right) {
var t = s(this._rightPriceScales, this.mainDataSource().priceScale());
return t.splice(e.right), t
}
return this._rightPriceScales
}
timeScale() {
return this.m_timeScale
}
_processMainSourceChange() {
var e;
if (null === this.m_mainDataSource)
for (var t = 0; t < this.m_dataSources.length; t++) {
if ((r = this.m_dataSources[t]) instanceof o && !this.isOverlay(
r) && (!r.properties().linkedToSeries || !r.properties()
.linkedToSeries.value())) {
this.m_mainDataSource = r, e = !0;
break
}
}
if (this.m_mainDataSource && e) {
var i = [];
for (t = 0; t < this.m_dataSources.length; t++) {
(r = this.m_dataSources[t]) instanceof n && i.push(r)
}
i = u(i);
for (t = 0; t < i.length; t++) this.move(i[t], this.m_mainDataSource
.priceScale(), !0)
} else if (!this.m_mainDataSource || this.isOverlay(this
.m_mainDataSource) && 0 === this.nonOverlayPricesSourcesCount()) {
var s = null;
if (this.m_dataSources.includes(this._model.mainSeries())) s = this
._model.mainSeries();
else
for (t = 0; t < this.m_dataSources.length; t++) {
var r;
if ((r = this.m_dataSources[t]) instanceof o && this.isOverlay(
r) && r.showInObjectTree()) {
s = r;
break
}
}
if (null !== s) {
var a = this.m_mainDataSource === s;
this.m_mainDataSource = s;
var l = this.createNewPriceScaleIfPossible();
if (a && s === this._model.mainSeries()) {
var c = s.priceScale();
this._model.children(s, !0).forEach(e => {
this.removeSourceFromPriceScale(e), l.addDataSource(
e), e.setPriceScale(l)
}), this.removePriceScale(c)
}
this.move(s, l, !0), this.recalculatePriceScale(s.priceScale())
}
}
}
startScrollPrice(e, t) {
e.startScroll(t)
}
scrollPriceTo(e, t) {
e.scrollTo(t), this.updateAllViews()
}
endScrollPrice(e) {
e.endScroll()
}
setPriceAutoScale(e, t) {
e.setMode({
autoScale: t
}), this.timeScale().isEmpty() || this.recalculatePriceScale(e)
}
defaultPriceScale() {
var e = this.m_mainDataSource ? this.m_mainDataSource.priceScale() : null;
return null === e && (e = new l(this._model.properties().scalesProperties)),
e
}
_priceScaleIsPrice(e) {
var t = e.mainSource();
return !!t && (!!TradingView.isInherited(t.constructor, TradingView
.Series) || !!TradingView.isInherited(t.constructor, TradingView
.Study) && t.metaInfo().is_price_study)
}
findSuitableScale(e, t, i) {
return this._priceScaleSelectionStrategy.findSuitableScale(this, e, t, i)
}
createNewPriceScaleIfPossible() {
return this._priceScaleSelectionStrategy.createNewPriceScaleIfPossible(this)
}
canCreateNewPriceScale() {
return this._priceScaleSelectionStrategy.canCreateNewPriceScale(this)
}
mainDataSource() {
return this.m_mainDataSource
}
recalculate() {
this.recalculatePriceScale(this.m_rightPriceScale), this
.recalculatePriceScale(this.m_leftPriceScale);
for (var e = 0; e < this.m_dataSources.length; e++) {
var t = this.m_dataSources[e];
this.isOverlay(t) && !a(t) && this.recalculatePriceScale(t.priceScale())
}
this.updateAllViews(), this._model.updatePane(this)
}
createDrawingsCaches() {
r.recreateOrderedByBarsSourcesCache(this)
}
clearDrawingCaches() {
r.clearOrderedByBarsSourcesCache()
}
_invalidateSourcesCache() {
this._cachedOrderedSources.clear(), this._leftPriceScales.forEach((function(
e) {
e.invalidateSourcesCache()
})), this._rightPriceScales.forEach((function(e) {
e.invalidateSourcesCache()
}))
}
onDestroyed() {
return this._destroyed
}
clearSeries(e) {
for (var t = this.m_dataSources.length - 1; t >= 0; t--) TradingView
.isInherited(this.m_dataSources[t].constructor, TradingView.Series) &&
this._removeSourceFromCollections(t, e)
}
nonOverlayPricesSourcesCount() {
return this.m_dataSources.filter((function(e) {
return (!e.properties().linkedToSeries || !e.properties()
.linkedToSeries.value()) && (TradingView
.isInherited(e.constructor, o) && e
.showInObjectTree() && !this.isOverlay(e))
}), this).length
}
canHaveMoreNoScaleSources() {
return this.nonOverlayPricesSourcesCount() > 1
}
actionNoScaleIsEnabled(e) {
return !(!this.isOverlay(e) && TradingView.isInherited(e.constructor, o)) ||
this.canHaveMoreNoScaleSources()
}
executionsPositionController() {
return this._executionsPositionController || (this
._executionsPositionController = new r(this, this._model
.timeScale())), this._executionsPositionController
}
setMaximized(e) {
this._maximized = e
}
isMaximized() {
return this._maximized
}
properties() {
return this._properties
}
priceScaleRatio() {
return this._currentPriceScaleRatio
}
getPriceScaleById(e) {
var t = this.m_dataSources.find((function(t) {
return null !== t.priceScale() && t.priceScale().id() === e
}));
return void 0 === t ? null : t.priceScale()
}
setPriceScaleSelectionStrategy(e) {
this._priceScaleSelectionStrategy = e, e.apply(this)
}
priceScaleIndex(e, t) {
switch (t) {
case "left":
return this.leftPriceScales().indexOf(e);
case "right":
return this.rightPriceScales().indexOf(e)
}
}
}
d.DEFAULT_STRETCH_FACTOR = 1e3, d.PANE_ANIMATION_DURATION = 500, t.Pane = d
}).call(this, i("aIyQ"))
},
iPBr: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "TimeAxisWidget", (function() {
return y
}));
var s = i("Eyy1"),
r = i("XlJ7"),
n = i("S8xo"),
o = i("ikwP"),
a = i("H0vP"),
l = i("ogJP"),
c = i("u+0B"),
h = i("zDbI"),
u = i("aIyQ"),
d = i.n(u),
p = i("mE5r"),
_ = i("8OdW"),
m = i("7KDR"),
f = i("3/8U"),
g = i("GxN8"),
b = i("JWMC"),
v = i("5VQP");
i("xrEm");
const S = {
contextMenuEnabled: !0,
timezoneMenuEnabled: !0,
pressedMouseMoveScale: !0
};
class y {
constructor(e, t, i, s, r) {
this._rendererOptions = null, this._onLabelHovered = new d.a, this._mousedown = !1,
this._currentCursorClassName = "invalid", this._options = Object(l.merge)(
Object(l.clone)(S), t || {}), this.chart = e, this._properties = e
.properties().childs().scalesProperties, this._element = document.createElement(
"tr"), this._backgroundBasedTheme = r;
const a = () => this.backgroundColor(),
c = () => {
throw new Error("Time axis does not support real price scales")
},
h = {
titlesProvider: i,
stubContextMenuProvider: (e, t) => {
const i = this.getContextMenuActions(!0);
let r = s(e, t);
if (r[r.length - 1] === this.chart.actions().scalesProperties) {
const e = [new m.Separator].concat(i);
Array.prototype.splice.apply(r, [r.length - 2, 0, ...e])
} else r.push(new m.Separator), r = r.concat(i);
return r
},
backgroundBasedTheme: r,
rendererOptionsProvider: e.model().model().rendererOptionsProvider(),
getBackgroundTopColor: a,
getBackgroundBottomColor: a,
showHorizontalBorder: !0
};
this._lhsStubContainer = new p.a(this._properties, "left", c, h, this._options
.priceAxisLabelsOptions), this._lhsStubContainer.onLabelHovered().subscribe(
this, (e, t) => {
this._onLabelHovered.fire(e, t)
}), this._rhsStubContainer = new p.a(this._properties, "right", c, h, this
._options.priceAxisLabelsOptions),
this._rhsStubContainer.onLabelHovered().subscribe(this, (e, t) => {
this._onLabelHovered.fire(e, t)
}), this._element.appendChild(this._lhsStubContainer.getElement()), this._cell =
document.createElement("td"), this._element.appendChild(this._cell), this._cell
.classList.add("chart-markup-table", "time-axis"), this._cell.style.height =
"25px", this._dv = document.createElement("div"), this._dv.style.width = "100%",
this._dv.style.height = "100%", this._dv.style.position = "relative", this._dv
.style.overflow = "hidden", this._cell.appendChild(this._dv), this
._canvasConfiguredHandler = () => this.chart.model().model().lightUpdate(), this
._canvasBinding = Object(o.createBoundCanvas)(this._dv, new o.Size(16, 16)),
this._canvasBinding.subscribeCanvasConfigured(this._canvasConfiguredHandler);
const u = this._canvasBinding.canvas;
u.style.position = "absolute", u.style.zIndex = "1", u.style.left = "0", u.style
.top = "0", this._topCanvasConfiguredHandler = () => this.chart.model().model()
.lightUpdate(), this._topCanvasBinding = Object(o.createBoundCanvas)(this._dv,
new o.Size(16, 16)), this._topCanvasBinding.subscribeCanvasConfigured(this
._topCanvasConfiguredHandler);
const f = this._topCanvasBinding.canvas;
f.style.position = "absolute", f.style.zIndex = "2", f.style.left = "0", f.style
.top = "0", this._element.appendChild(this._rhsStubContainer.getElement()), this
.restoreDefaultCursor(), this.update(), this._minVisibleSpan = _.MINUTE_SPAN,
this._mouseEventHandler = new n.MouseEventHandler(this._topCanvasBinding.canvas,
this, {
treatVertTouchDragAsPageScroll: !0,
treatHorzTouchDragAsPageScroll: !1
}), this.size = new o.Size(0, 0)
}
destroy() {
this._mouseEventHandler.destroy(), this._topCanvasBinding
.unsubscribeCanvasConfigured(this._topCanvasConfiguredHandler), this
._topCanvasBinding.destroy(), this._canvasBinding.unsubscribeCanvasConfigured(
this._canvasConfiguredHandler), this._canvasBinding.destroy(), this
._rhsStubContainer.onLabelHovered().unsubscribeAll(this), this._lhsStubContainer
.onLabelHovered().unsubscribeAll(this), this._lhsStubContainer.destroy(), this
._rhsStubContainer.destroy(), this.chart.properties().childs().paneProperties
.childs().background.unsubscribeAll(this)
}
setCursor(e) {
let t = "";
"grabbing" !== e && "ew-resize" !== e || (t = "time-axis--cursor-" + e), this
._currentCursorClassName !== t && (this._currentCursorClassName && this._cell
.classList.remove(this._currentCursorClassName), t && this._cell.classList
.add(t), this._currentCursorClassName = t, this._cell.style.cursor)
}
restoreDefaultCursor() {
this.setCursor("")
}
getElement() {
return this._element
}
optimalHeight() {
const e = this.rendererOptions();
return Math.ceil(e.borderSize + e.offsetSize + e.fontSize + e.paddingTop + e
.paddingBottom + e.labelBottomOffset)
}
setSizes(e, t, i) {
this.size && this.size.equals(e) || (this.size = e, this._canvasBinding
.resizeCanvas({
width: e.w,
height: e.h
}), this._topCanvasBinding.resizeCanvas({
width: e.w,
height: e.h
}), this._cell.style.width = e.w + "px", this._cell.style.height = e.h +
"px"), this._lhsStubContainer.setSizes(e.h, t), this._rhsStubContainer
.setSizes(e.h, i)
}
hardResetCanvas() {
this.size && (Object(o.hardResizeCanvas)(this._canvasBinding, this.size),
Object(o.hardResizeCanvas)(this._topCanvasBinding, this.size))
}
rendererOptions() {
if (!this._rendererOptions || this._rendererOptions.fontSize !== this.fontSize()) {
const e = this.fontSize();
this._rendererOptions = {
borderSize: 1,
offsetSize: 5,
fontSize: e,
font: Object(r.makeFont)(e, h.CHART_FONT_FAMILY, ""),
widthCache: new c.TextWidthCache,
paddingTop: 3 * e / 12,
paddingBottom: 3 * e / 12,
paddingHorizontal: 9 * e / 12,
labelBottomOffset: 4 * e / 12
}
}
return this._rendererOptions
}
backgroundColor() {
return this.chart.model().model().backgroundColor().value()
}
lineColor() {
return this._properties.childs().lineColor.value()
}
textColor() {
return this._properties.childs().textColor.value()
}
fontSize() {
return this._properties.childs().fontSize.value()
}
baseFont() {
return Object(r.makeFont)(this.fontSize(), h.CHART_FONT_FAMILY)
}
baseBoldFont() {
return Object(r.makeFont)(this.fontSize(), h.CHART_FONT_FAMILY, "", "bold")
}
hasCanvas(e) {
return this._canvasBinding.canvas === e || this._topCanvasBinding.canvas === e
}
onLabelHovered() {
return this._onLabelHovered
}
getScreenshotData() {
return {
content: this._canvasBinding.canvas.toDataURL(),
canvas: this._canvasBinding.canvas,
contentWidth: this.size.w,
contentHeight: this.size.h,
lhsStub: this._lhsStubContainer.getScreenshotData(),
rhsStub: this._rhsStubContainer.getScreenshotData()
}
}
getContextMenuActions(e) {
const t = this.chart;
t.updateActions();
const i = t.actions(),
s = [];
return e || s.push(i.timeScaleReset, new m.Separator), this._options
.timezoneMenuEnabled && s.push(i.applyTimeZone), s.push(i.sessionBreaks), s
}
update() {
if (!this.chart.hasModel()) return;
const e = this.chart.model().timeScale().marks();
if (e) {
this._minVisibleSpan = _.YEAR_SPAN;
for (const t of e) this._minVisibleSpan = Math.min(t.span, this._minVisibleSpan)
}
}
updatePriceAxisStubs() {
const e = this.chart.model().model(),
t = this.chart.isMaximizedPane() ? Object(s.ensureNotNull)(this.chart
.maximizedPaneWidget()).state() : e.paneForSource(e.mainSeries());
if (!t) return;
const i = e.priceScaleSlotsCount();
this._lhsStubContainer.setScales([], i.left, t.leftPriceScales().length, i.left + i
.right), this._rhsStubContainer.setScales([], i.right, t.rightPriceScales()
.length, i.left + i.right)
}
paint(e) {
if (e === a.InvalidationLevel.None) return;
const t = Object(o.getContext2D)(this._topCanvasBinding.canvas);
if (e > a.InvalidationLevel.Cursor) {
const i = Object(o.getContext2D)(this._canvasBinding.canvas),
s = this._canvasBinding.pixelRatio;
this.drawBackground(i, s), this.chart.hasModel() && (this.drawBorder(i, s), this
.drawTickMarks(i, s), this.drawBackLabels(i, s), this
.drawCrossHairLabel(t, s)), this._lhsStubContainer.paintStubs(e), this
._rhsStubContainer.paintStubs(e)
}
this.drawCrossHairLabel(t, this._topCanvasBinding.pixelRatio)
}
drawBackground(e, t) {
if (Object(o.clearRect)(e, 0, 0, Math.ceil(this.size.w * t) + 1, Math.ceil(this.size
.h * t) + 1, this.backgroundColor()), !this.chart.hasModel()) return;
const i = this.chart.model();
if (!i.timeScale().isEmpty()) {
const s = i.model().selection().lineDataSources().reduce((e, t) => {
const i = t.timeAxisPoints();
return 0 === i.length ? e : e.concat(i)
}, []);
s.length > 0 && this._hightlightBackground(e, s, t)
}
const s = i.model().crossHairSource();
s.startMeasurePoint() && this._hightlightBackground(e, s.measurePoints(), t)
}
drawBorder(e, t) {
e.save(), e.fillStyle = this.lineColor();
const i = Math.max(1, Math.floor(this.rendererOptions().borderSize * t)),
s = Math.ceil(this.size.w * t);
e.fillRect(0, 0, s + 1, i), e.restore()
}
drawTickMarks(e, t) {
const i = this.chart.model().timeScale().marks();
if (!i || 0 === i.length) return;
let s = i.reduce((e, t) => e.span > t.span ? e : t, i[0]).span;
s > 30 && s < 40 && (s = 30), e.save(), e.strokeStyle = this.lineColor();
const r = this.rendererOptions(),
n = r.borderSize + r.offsetSize + r.paddingTop + r.fontSize / 2;
e.textAlign = "center", e.textBaseline = "middle", e.fillStyle = this.textColor(),
Object(o.drawScaled)(e, t, () => {
e.font = this.baseFont();
for (let t = 0; t < i.length; t++) {
const r = i[t];
r.span < s && e.fillText(r.label, r.coord, n)
}
e.font = this.baseBoldFont();
for (let t = 0; t < i.length; t++) {
const r = i[t];
r.span >= s && e.fillText(r.label, r.coord, n)
}
}), e.restore()
}
drawBackLabels(e, t) {
var i;
e.save();
const s = new Set,
r = this.chart.model().model();
let n = r.dataSources();
const o = r.selection().allSources();
for (const e of o) s.add(e);
r.hoveredSource() && s.add(r.hoveredSource());
for (const e of r.sourcesBeingMoved()) s.add(e);
const a = r.customSourceBeingMoved();
null !== a && s.add(a);
const l = null !== (i = r.lineBeingEdited()) && void 0 !== i ? i : r
.lineBeingCreated();
l && s.add(l), s.add(this.chart.model().crossHairSource()), n = n.concat(r
.customSources());
const c = this.rendererOptions();
for (let i = 0; i < n.length; i++) {
const r = n[i];
if (!s.has(r) && r.timeAxisViews) {
const i = r.timeAxisViews();
if (i)
for (let s = 0; s < i.length; s++) i[s].renderer().draw(e, c, t)
}
}
e.restore()
}
drawCrossHairLabel(e, t) {
var i;
e.save(), e.clearRect(0, 0, Math.ceil(this.size.w * t) + 1, Math.ceil(this.size.h *
t) + 1);
const s = this.chart.model().model(),
r = [],
n = null !== (i = s.lineBeingEdited()) && void 0 !== i ? i : s
.lineBeingCreated();
if (n && n.timeAxisViews) {
const e = n.timeAxisViews();
e && e.length && r.push(e)
}
const o = s.customSourceBeingMoved();
this._addViewsOrMaxMin(null === o ? [] : [o], r), this._addViewsOrMaxMin(s
.sourcesBeingMoved(), r), this._addViewsOrMaxMin(s.selection().allSources(),
r);
const a = s.hoveredSource();
if (a && Object(g.a)(a) && !s.selection().isSelected(a) && a.timeAxisViews) {
const e = a.timeAxisViews();
e && e.length && r.push(e)
}
const l = s.crossHairSource(),
c = l.timeAxisViews && l.timeAxisViews();
c && c.length && r.push(c);
const h = this.rendererOptions();
for (const i of r)
for (const s of i) e.save(), s.renderer().draw(e, h, t), e.restore();
e.restore()
}
mouseDownEvent(e) {
this._mouseDownOrTouchStartEvent(e)
}
touchStartEvent(e) {
this._mouseOrTouchEnterEvent(e), this._mouseDownOrTouchStartEvent(e)
}
mouseDownOutsideEvent() {
this._zoomAvailable() && this._mousedown && (this._mousedown = !1, this.chart
.model().endScaleTime(), this.restoreDefaultCursor())
}
pressedMouseMoveEvent(e) {
this._pressedMouseOrTouchMoveEvent(e)
}
touchMoveEvent(e) {
this._pressedMouseOrTouchMoveEvent(e)
}
mouseUpEvent(e) {
this._mouseUpOrTouchEndEvent(e)
}
touchEndEvent(e) {
this._mouseUpOrTouchEndEvent(e), this._mouseOrTouchLeaveEvent(e)
}
contextMenuEvent(e) {
this._contextMenuOrTouchContextMenuEvent(e)
}
touchContextMenuEvent(e) {
this._contextMenuOrTouchContextMenuEvent(e)
}
mouseEnterEvent(e) {
this._mouseOrTouchEnterEvent(e)
}
mouseLeaveEvent(e) {
this._mouseOrTouchLeaveEvent(e)
}
mouseDoubleClickEvent(e) {
this._mouseDoubleClickOrDoubleTapEvent(e)
}
doubleTapEvent(e) {
this._mouseDoubleClickOrDoubleTapEvent(e)
}
_hightlightBackground(e, t, i) {
const s = this.chart.model().timeScale();
let r = t[0].index,
n = t[0].index;
for (let e = 1; e < t.length; e++) r = Math.min(r, t[e].index), n = Math.max(n, t[e]
.index);
const a = Math.floor(s.indexToCoordinate(r) * i),
l = Math.ceil(s.indexToCoordinate(n) * i);
Object(o.fillRect)(e, a, 0, l - a, Math.ceil(this.size.h * i) + 1, f.a)
}
_addViewsOrMaxMin(e, t) {
if (e.length <= 1) {
for (const i of e)
if (i.timeAxisViews) {
const e = i.timeAxisViews();
e && e.length && t.push(e)
}
} else t.push(this._minMaxViews(e))
}
_minMaxViews(e) {
const t = [];
let i = 1 / 0,
s = -1 / 0,
r = null,
n = null;
for (const t of e)
if (t.timeAxisViews) {
const e = t.timeAxisViews();
if (e && e.length)
for (let t = 0; t < e.length; ++t) {
const o = e[t],
a = o.coordinate();
a >= s && (s = a, n = o), a <= i && (i = a, r = o)
}
} return n && t.push(n), r && t.push(r), t
}
_zoomAvailable() {
return !this.chart.model().timeScale().isEmpty() && this.chart.model().model()
.zoomEnabled() && this._options.pressedMouseMoveScale
}
_mouseDownOrTouchStartEvent(e) {
if (this._mousedown || !this._zoomAvailable()) return;
this._mousedown = !0;
const t = this.chart.model();
t.timeScale().isEmpty() || t.startScaleTime(e.localX)
}
_pressedMouseOrTouchMoveEvent(e) {
this._zoomAvailable() && this.chart.model().scaleTimeTo(e.localX)
}
_mouseUpOrTouchEndEvent(e) {
this._zoomAvailable() && (this._mousedown = !1, this.chart.model().endScaleTime(),
this.restoreDefaultCursor())
}
_contextMenuOrTouchContextMenuEvent(e) {
this._options.contextMenuEnabled && this._createContextMenu().then(t => t.show(e))
}
_mouseOrTouchEnterEvent(e) {
this._zoomAvailable() && this.setCursor("ew-resize")
}
_mouseOrTouchLeaveEvent(e) {
this.restoreDefaultCursor()
}
_mouseDoubleClickOrDoubleTapEvent(e) {
Object(b.trackEvent)("GUI", "Double click time scale"), this.chart.model()
.resetTimeScale()
}
_createContextMenu() {
return v.ContextMenuManager.createMenu(this.getContextMenuActions(), {
statName: "TimeScaleContextMenu"
})
}
}
},
iR50: function(e) {
e.exports = JSON.parse(
'{"color-white":"#ffffff","color-black":"#000000","color-cold-gray-50":"#F8F9FD","color-cold-gray-100":"#F0F3FA","color-cold-gray-150":"#E0E3EB","color-cold-gray-200":"#D1D4DC","color-cold-gray-250":"#C1C4CD","color-cold-gray-300":"#B2B5BE","color-cold-gray-350":"#A3A6AF","color-cold-gray-400":"#9598A1","color-cold-gray-450":"#868993","color-cold-gray-500":"#787B86","color-cold-gray-550":"#6A6D78","color-cold-gray-600":"#5D606B","color-cold-gray-650":"#50535E","color-cold-gray-700":"#434651","color-cold-gray-750":"#363A45","color-cold-gray-800":"#2A2E39","color-cold-gray-850":"#1E222D","color-cold-gray-900":"#131722","color-cold-gray-950":"#0C0E15","color-ripe-red-50":"#FFEBEE","color-ripe-red-100":"#FFCDD2","color-ripe-red-200":"#ef9a9a","color-ripe-red-300":"#E57373","color-ripe-red-400":"#EF5350","color-ripe-red-500":"#F44336","color-ripe-red-600":"#E53935","color-ripe-red-700":"#D32F2F","color-ripe-red-800":"#C62828","color-ripe-red-900":"#B71C1C","color-ripe-red-a200":"#FF5252","color-ripe-red-a700":"#862226","color-ripe-red-a800":"#5B1E24","color-ripe-red-a900":"#351E25","color-tan-orange-50":"#FFF3E0","color-tan-orange-100":"#FFE0B2","color-tan-orange-200":"#FFCC80","color-tan-orange-300":"#ffb74d","color-tan-orange-400":"#FFA726","color-tan-orange-500":"#FF9800","color-tan-orange-600":"#FB8C00","color-tan-orange-700":"#F57C00","color-tan-orange-800":"#EF6C00","color-tan-orange-900":"#e65100","color-tan-orange-a200":"#ffab40","color-tan-orange-a400":"#ff9100","color-tan-orange-a700":"#FF6D00","color-iguana-green-100":"#C8E6C9","color-iguana-green-200":"#A5D6A7","color-iguana-green-300":"#81c784","color-iguana-green-400":"#66BB6A","color-iguana-green-500":"#4caf50","color-iguana-green-600":"#43a047","color-iguana-green-700":"#388e3c","color-iguana-green-800":"#2E7D32","color-iguana-green-900":"#1B5E20","color-iguana-green-a700":"#00c853","color-banana-yellow-100":"#FFF9C4","color-banana-yellow-200":"#FFF59D","color-banana-yellow-300":"#FFF176","color-banana-yellow-400":"#ffee58","color-banana-yellow-500":"#ffeb3b","color-banana-yellow-600":"#fdd835","color-banana-yellow-700":"#fbc02d","color-banana-yellow-800":"#f9a825","color-banana-yellow-900":"#F57F17","color-banana-yellow-a400":"#ffea00","color-banana-yellow-a700":"#ffd600","color-tv-blue-50":"#E3EFFD","color-tv-blue-100":"#BBD9FB","color-tv-blue-200":"#90BFF9","color-tv-blue-300":"#5B9CF6","color-tv-blue-400":"#3179F5","color-tv-blue-500":"#2962FF","color-tv-blue-600":"#1E53E5","color-tv-blue-700":"#1848CC","color-tv-blue-800":"#143EB3","color-tv-blue-900":"#0C3299","color-tv-blue-a100":"#82b1ff","color-tv-blue-a200":"#448aff","color-tv-blue-a400":"#2979ff","color-tv-blue-a600":"#2962FF","color-tv-blue-a700":"#143A87","color-tv-blue-a800":"#142E61","color-tv-blue-a900":"#132042","color-deep-blue-100":"#D1C4E9","color-deep-blue-200":"#B39DDB","color-deep-blue-300":"#9575cd","color-deep-blue-400":"#7e57c2","color-deep-blue-500":"#673ab7","color-deep-blue-700":"#512da8","color-deep-blue-800":"#4527A0","color-deep-blue-900":"#311B92","color-deep-blue-a100":"#b388ff","color-deep-blue-a700":"#6200EA","color-minty-green-50":"#E0F2F1","color-minty-green-100":"#B2DFDB","color-minty-green-200":"#80cbc4","color-minty-green-300":"#4db6ac","color-minty-green-400":"#26a69a","color-minty-green-500":"#009688","color-minty-green-600":"#00897b","color-minty-green-700":"#00796b","color-minty-green-800":"#00695C","color-minty-green-900":"#004D40","color-minty-green-a400":"#1de9b6","color-minty-green-a700":"#00BFA5","color-grapes-purple-50":"#F3E5F5","color-grapes-purple-100":"#E1BEE7","color-grapes-purple-200":"#CE93D8","color-grapes-purple-300":"#ba68c8","color-grapes-purple-400":"#ab47bc","color-grapes-purple-500":"#9c27b0","color-grapes-purple-600":"#8e24aa","color-grapes-purple-700":"#7b1fa2","color-grapes-purple-800":"#6A1B9A","color-grapes-purple-900":"#4A148C","color-grapes-purple-a200":"#E040FB","color-grapes-purple-a400":"#D500F9","color-grapes-purple-a700":"#aa00ff","color-berry-pink-100":"#F8BBD0","color-berry-pink-200":"#f48fb1","color-berry-pink-300":"#f06292","color-berry-pink-400":"#ec407a","color-berry-pink-500":"#e91e63","color-berry-pink-600":"#D81B60","color-berry-pink-700":"#C2185B","color-berry-pink-800":"#AD1457","color-berry-pink-900":"#880E4F","color-berry-pink-a100":"#ff80ab","color-berry-pink-a200":"#ff4081","color-sky-blue-100":"#B2EBF2","color-sky-blue-200":"#80DEEA","color-sky-blue-300":"#4dd0e1","color-sky-blue-400":"#26c6da","color-sky-blue-500":"#00bcd4","color-sky-blue-600":"#00acc1","color-sky-blue-700":"#0097A7","color-sky-blue-800":"#00838F","color-sky-blue-900":"#006064","color-sky-blue-a400":"#00e5ff","color-sky-blue-a700":"#00B8D4","color-deep-blue-600":"#5E35B1","color-facebook":"#1877F2","color-deep-facebook":"#1564CA","color-twitter":"#1DA1F2","color-deep-twitter":"#188CD3","color-youtube":"#FF0000","color-linkedin":"#007BB5","color-aqua-spring":"#ebf9f5","color-army-green":"#3d2c12","color-army-green-2":"#31230d","color-athens-gray-1":"#f2f3f5","color-athens-gray-2":"#f7f8fa","color-athens-gray-3":"#eceff2","color-black-180":"#b4b4b4","color-blue-dianne":"#21384d","color-bluish":"#2185cc","color-bright-gray":"#363c4e","color-brownish-grey":"#8d6e63","color-carnation":"#f04561","color-catskill-white":"#e1ecf2","color-charade":"#2f3241","color-charcoal-grey":"#323337","color-curious-blue":"#299dcd","color-dark-blue-grey":"#123440","color-darkness-blue-grey":"#12213b","color-dark-grey":"#292a2d","color-dark-grey-blue":"#28415a","color-dark-sky-blue":"#37a6ef","color-deep-sea-blue":"#016087","color-ebony-clay":"#262b3e","color-foam":"#d7f0fb","color-gull-gray":"#9db2bd","color-humming-bird":"#d3eef9","color-keppel-1":"#37bc9b","color-keppel-2":"#34b293","color-lavender-blush":"#ffedf0","color-lightish-purple":"#a75ee8","color-loblolly":"#c5cbce","color-manatee":"#878ca8","color-mandy":"#eb4d5c","color-medium-blue":"#2e7bb2","color-milk-chocolate":"#6f2626","color-mirage-1":"#131722","color-mirage-2":"#171b29","color-mirage-3":"#1c2030","color-mischka":"#d6d8e0","color-morning-glory":"#9addcc","color-oslo-gray":"#8b8e95","color-pale":"#fff2cf","color-pale-grey-1":"#f9fafb","color-pale-grey-2":"#e7ebee","color-pale-sky":"#6b7988","color-picton-blue-1":"#3bb3e4","color-puerto-rico":"#3bc2a1","color-purple-brown":"#4e2934","color-purple-brown-2":"#3d2028","color-radical-red":"#ff4a68","color-regent-gray":"#8797a5","color-scooter":"#38acdb","color-silver-tree":"#53b987","color-slate-gray":"#758696","color-sundown":"#ffa4b3","color-sunglow":"#ffca3b","color-tan-hide":"#ff9850","color-trout-1":"#4c525e","color-trout-2":"#4f5966","color-violet-1":"#332738","color-violet-2":"#271d2b","color-white-ice":"#ebf7fc","color-wild-watermelon":"#ff5773","color-readonly-input":"#b4b4b4","color-brand-dark":"#2a2c39","color-seeking-alpha-brand":"#ff7200"}'
)
},
iboI: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "customFormatters", (function() {
return s
}));
const s = {
dateFormatter: null,
timeFormatter: null,
tickMarkFormatter: null
}
},
icPo: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolIcon", (function() {
return o
}));
var s = i("Ocx9"),
r = i("Ss5c"),
n = i("j3hX");
class o extends r.LineDataSource {
constructor(e, t) {
super(e, t || o.createProperties()), this._sizeScale = NaN, this.version = 1,
document.fonts && document.fonts.check && document.fonts.load && !document
.fonts.check("12px FontAwesome") && document.fonts.load("12px FontAwesome",
"☺").then(() => {
this._isDestroyed || e.updateSource(this)
}), i.e("lt-pane-views").then(i.bind(null, "8GeE")).then(t => {
this._setPaneViews([new t.IconPaneView(this, e)])
})
}
pointsCount() {
return 1
}
name() {
return "Icon"
}
hasEditableCoordinates() {
return !1
}
getAnchorLimit() {
return 80
}
applyTemplate(e) {
delete e.icon, super.applyTemplate(e)
}
startChanging(e, t) {
super.startChanging(e, t);
const i = this.properties().childs();
i.size.value() < 80 ? this._sizeScale = i.size.value() / 80 : this._sizeScale =
1
}
getChangePointForSync(e) {
return null
}
setPoint(e, t, i) {
const s = Object.assign({}, t),
r = this.pointToScreenPoint(this.points()[0])[1],
n = this.pointToScreenPoint(s)[1],
o = this.properties().childs();
if (0 === e || 1 === e) {
const t = n.subtract(r).normalized(),
i = -t.x;
let s = Math.acos(i);
Math.asin(t.y) > 0 && (s = 2 * Math.PI - s), 0 === e && (s += Math.PI), o
.angle.setValue(s)
} else {
let e = 2 * n.subtract(r).length();
e *= this._sizeScale, o.size.setValue(e), o.scale.setValue(1)
}
}
endChanging(e, t) {
const i = super.endChanging(e, t);
return this._sizeScale = NaN, i
}
properties() {
return super.properties()
}
getSourceIcon() {
return {
type: "text",
text: String.fromCharCode(this.properties().childs().icon.value())
}
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolicon", e);
return o._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "XCOO")).then(
e => e.IconsDefinitionsViewModel)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e), e.addChild("backgroundsColors", new n
.LineToolColorsProperty([e.childs().color])), e.addExclusion("angle"), e
.addExclusion("scale")
}
}
},
ijBy: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SetChartLayoutCommand", (function() {
return n
}));
var s = i("RDU5"),
r = i("VNzU");
class n extends s.UndoCommand {
constructor(e, t) {
super("Change Chart Layout to " + r.layouts[t].title), this
._chartWidgetCollection = e, this._newLayoutType = t, this._oldLayoutType =
e.layout.value()
}
redo() {
this._chartWidgetCollection.setLayout(this._newLayoutType)
}
undo() {
this._chartWidgetCollection.setLayout(this._oldLayoutType)
}
}
},
ikwP: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "Size", (function() {
return o
})), i.d(t, "getCanvasDevicePixelRatio", (function() {
return a
})), i.d(t, "getContext2D", (function() {
return l
})), i.d(t, "getPrescaledContext2D", (function() {
return c
})), i.d(t, "getPretransformedContext2D", (function() {
return h
})), i.d(t, "hardResizeCanvas", (function() {
return u
})), i.d(t, "resizeCanvasPreservingContent", (function() {
return d
})), i.d(t, "fillRect", (function() {
return p
})),
i.d(t, "clearRect", (function() {
return _
})), i.d(t, "drawScaled", (function() {
return m
})), i.d(t, "createDisconnectedCanvas", (function() {
return f
})), i.d(t, "createDisconnectedBoundCanvas", (function() {
return g
})), i.d(t, "createBoundCanvas", (function() {
return v
})), i.d(t, "calcTextHorizontalShift", (function() {
return S
})), i.d(t, "disableSelection", (function() {
return y
}));
var s = i("f2KN"),
r = i("Eyy1"),
n = i("Ialn");
class o {
constructor(e, t) {
this.w = e, this.h = t
}
equals(e) {
return this.w === e.w && this.h === e.h
}
}
function a(e) {
var t, i;
return Math.max(1, (null === (i = null === (t = e.ownerDocument) || void 0 === t ? void 0 :
t.defaultView) || void 0 === i ? void 0 : i.devicePixelRatio) || 1)
}
function l(e) {
const t = Object(r.ensureNotNull)(e.getContext("2d"));
return t.setTransform(1, 0, 0, 1, 0, 0), t
}
function c(e) {
const t = Object(r.ensureNotNull)(e.getContext("2d")),
i = a(e);
return t.setTransform(i, 0, 0, i, 0, 0), t
}
function h(e, t) {
const i = Object(r.ensureNotNull)(e.canvas.getContext("2d"));
return i.setTransform(e.pixelRatio, 0, 0, e.pixelRatio, 0, 0), t || i.translate(.5, .5), i
}
function u(e, t) {
e.resizeCanvas({
width: 0,
height: 0
}), e.resizeCanvas({
width: t.w,
height: t.h
})
}
function d(e, t) {
const i = g(document, t),
s = c(i.canvas);
return s.save(), s.setTransform(1, 0, 0, 1, 0, 0), s.drawImage(e.canvas, 0, 0, e.canvasSize
.width * e.pixelRatio, e.canvasSize.height * e.pixelRatio), s.restore(), i
}
function p(e, t, i, s, r, n) {
e.save(), e.translate(-.5, -.5), e.fillStyle = n, e.fillRect(t, i, s, r), e.restore()
}
function _(e, t, i, s, r, n) {
e.save(), e.translate(-.5, -.5), e.globalCompositeOperation = "copy", e.fillStyle = n, e
.fillRect(t, i, s, r), e.restore()
}
function m(e, t, i) {
e.save(), e.scale(t, t), i(), e.restore()
}
function f(e, t, i) {
const s = b(e);
return void 0 === i && (i = a(s)), s.width = t.w * i, s.height = t.h * i, s
}
function g(e, t) {
const i = b(e),
r = Object(s.a)(i, {
allowDownsampling: !1
});
return r.resizeCanvas({
width: t.w,
height: t.h
}), r
}
function b(e) {
const t = e.createElement("canvas");
return y(t), t
}
function v(e, t) {
const i = b(Object(r.ensureNotNull)(e.ownerDocument));
e.appendChild(i);
const n = Object(s.a)(i, {
allowDownsampling: !1
});
return n.resizeCanvas({
width: t.w,
height: t.h
}), n
}
function S(e, t) {
return "center" === e.textAlign ? 0 : Object(n.isRtl)() ? "start" === e.textAlign ||
"right" === e.textAlign ? t : 0 : "start" === e.textAlign || "left" === e.textAlign ?
0 : t
}
function y(e) {
e.style.userSelect = "none", e.style.webkitUserSelect = "none", e.style.msUserSelect =
"none", e.style.MozUserSelect = "none", e.style.webkitTapHighlightColor = "transparent"
}
},
isVH: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("Ocx9").DefaultProperty,
n = i("j3hX").LineToolColorsProperty;
class o extends s {
constructor(e, t) {
super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"D4q4", 7)).then(({
TrianglePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 3
}
name() {
return "Triangle"
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "Zd1D")))
.GeneralFiguresDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetooltriangle", e);
return o._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e), e.addChild("linesColors", new n([e.childs().color]))
}
}
t.LineToolTriangle = o
},
it7y: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyDataWindowView", (function() {
return n
}));
var s = i("4miz"),
r = i("EYFt");
class n extends s.b {
constructor(e, t) {
super(), this._invalidated = !0, this._study = e, this._model = t, this
._valueProvider = this._createValuesProvider(e, t), this._items = this
._valueProvider.getItems().map(e => new s.a(e.title, "")), this.update()
}
update() {
this._invalidated = !0
}
items() {
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
._items
}
study() {
return this._study
}
_updateImpl() {
this._header = this._study.title(!0), this._title = this._study.title();
const e = this._valueProvider.getValues(this._currentIndex());
for (let t = 0; t < e.length; ++t) {
const i = e[t],
s = this._items[t];
s.setValue(i.value), s.setVisible(i.visible), s.setColor(i.color)
}
}
_currentIndex() {
const e = this._model.crossHairSource().lockedIndex;
return void 0 !== e ? e : null !== this._model.crossHairSource().pane ? this
._model.crossHairSource().appliedIndex() : null
}
_createValuesProvider(e, t) {
return new r.a(e, t)
}
}
},
iu9X: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return r
})), i.d(t, "a", (function() {
return n
}));
var s = i("Eyy1");
class r {
constructor() {
this._horizlines = [], this._hhists = [], this._polygons = [], this._vertlines = [],
this._containersCache = [], this._containerNamesCache = [], this
._containersMapCache = new Map, this._addToCache("horizlines", this
._horizlines), this._addToCache("hhists", this._hhists), this._addToCache(
"polygons", this._polygons), this._addToCache("vertlines", this._vertlines)
}
primitiveData(e) {
const t = {};
let i = !1;
for (const s of this._containerNamesCache) {
const r = [],
n = this.getObjsContainer(s);
for (const t of n) {
if (t.isNaN()) continue;
const i = t.primitiveData(e);
i.data.length > 0 && r.push(i)
}
r.length > 0 && (t[s] = r, i = !0)
}
return i ? t : null
}
deleteErasedAndMarkPostedObjs() {
this.forEachList(e => {
e.deleteErasedItems(), e.markPostedItems()
})
}
deleteErasedObjs() {
this.forEachList(e => e.deleteErasedItems())
}
getObjsContainer(e) {
return Object(s.ensureDefined)(this._containersMapCache.get(e))
}
forEachList(e) {
for (const t of this._containersCache)
for (const i of t) e(i.data)
}
_addToCache(e, t) {
this._containersCache.push(t), this._containerNamesCache.push(e), this
._containersMapCache.set(e, t)
}
}
class n {
constructor(e, t) {
this.styleId = e, this.data = t
}
isNaN() {
return this.data.isNaN()
}
primitiveData(e) {
return {
styleId: this.styleId,
data: this.data.primitivesData(e)
}
}
}
},
ivNn: function(e, t, i) {
"use strict";
function s(e) {
return Math.round(1e10 * e) / 1e10
}
Object.defineProperty(t, "__esModule", {
value: !0
}), t.alignTo = t.fixComputationError = t.isNaN = t.isInteger = t.isNumber = void 0, t
.isNumber = function(e) {
return "number" == typeof e && isFinite(e)
}, t.isInteger = function(e) {
return "number" == typeof e && e % 1 == 0
}, t.isNaN = function(e) {
return !(e <= 0 || e > 0)
}, t.fixComputationError = s, t.alignTo = function(e, t) {
var i = e / t,
r = Math.floor(i),
n = i - r;
return n > 2e-10 ? s(n > .5 ? (r + 1) * t : r * t) : e
}
},
j3hX: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolMultiplePropertyBaseImpl", (function() {
return l
})), i.d(t, "LineToolCollectedProperty", (function() {
return c
})),
i.d(t, "LineToolWidthsProperty", (function() {
return h
})), i.d(t, "LineToolColorsProperty", (function() {
return u
})), i.d(t, "MultipleLineWidthsProperty", (function() {
return p
})), i.d(t, "MultipleLineColorsProperty", (function() {
return _
}));
var s = i("txPx"),
r = i("aIyQ"),
n = i.n(r);
const o = Object(s.getLogger)("Chart.LineToolCollectedProperty");
class a {
applyValue(e, t) {
e.setValue(t)
}
}
class l {
constructor(e, t) {
this._onChange = new n.a, this._properties = e, e.forEach(e => e.subscribe(this,
() => {
this._onChange.fire(this)
})), this._showIfProperty = t
}
visible() {
var e;
return !this._showIfProperty || (null === (e = this._showIfProperty) || void 0 ===
e ? void 0 : e.value())
}
value() {
if (0 === this._properties.length) return o.logError(
"Incorrect call, should not request value of 0 properties"), "mixed";
const e = this._properties[0].value();
return 1 === this._properties.length || this._properties.every(t => t.value() ===
e) ? e : "mixed"
}
state() {}
merge() {}
destroy() {
this._properties.forEach(e => e.unsubscribeAll(this))
}
subscribe(e, t) {
this._onChange.subscribe(e, t)
}
unsubscribe(e, t) {
this._onChange.unsubscribe(e, t)
}
unsubscribeAll(e) {
this._onChange.unsubscribeAll(e)
}
}
class c extends l {
setValue(e, t, i) {
if ("mixed" === e) return;
const s = null != i ? i : new a;
this._properties.forEach(t => s.applyValue(t, e))
}
}
class h extends c {}
class u extends c {
firstColor() {
return this._properties[0].value()
}
}
class d extends l {
setValue(e, t, i) {
if ("mixed" === e) return;
const s = null != i ? i : new a;
this._properties.forEach(t => t.setValue(e, void 0, s))
}
}
class p extends d {}
class _ extends d {}
},
j8de: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("tc+8"),
r = i.n(s);
class n extends r.a {
constructor(e, t) {
super(), this._lineSource = e, this._pointIndex = t
}
value() {
return this._lineSource.points()[this._pointIndex].index
}
setValue(e) {
const t = this._lineSource.points()[this._pointIndex];
t.index = e, this._lineSource.startChanging(this._pointIndex, t), this
._setPointImpl(t), this._lineSource.model().updateSource(this._lineSource),
this._listeners.fire(this);
const i = this._lineSource.endChanging(!0, !1);
this._lineSource.syncMultichartState(i)
}
_setPointImpl(e) {
this._lineSource.setPoint(this._pointIndex, e)
}
}
},
jA0t: function(e, t, i) {
"use strict";
var s = function() {
var e = {};
function t(e) {
return e.is_price_study
}
function i(e, t) {
var i = t.slice(0).toLowerCase();
if (e) {
for (var s = 0; s < e.length; ++s)
if (e[s].description.toLowerCase() === i || e[s].shortDescription
.toLowerCase() === i) return e[s];
throw new Error("Can't find metainfo for `" + t + "`")
}
throw new Error("There is no studies metainfo at all")
}
var s = {
bool: function(e) {
return !!e
},
integer: function(e) {
return parseInt(e)
},
float: function(e) {
return parseFloat(e)
},
string: function(e) {
return e
}
};
return e.getStudyRecordFromArray = function(e, r) {
return function(e, r) {
var n;
if (!Array.isArray(e)) return {
id: (n = i(r.model().studiesMetaData(), e)).id,
overlay: t(n)
};
for (var o, a = e.slice(0), l = a[0], c = t(n = i(r.model()
.studiesMetaData(), l)), h = n.inputs.map((function(e) {
return {
id: e.id,
type: e.type,
name: e.name
}
})), u = a.splice(1), d = 0; d < u.length; ++d) {
o || (o = {});
var p = s[h[d].type] || s.string;
o[h[d].id] = p(u[d])
}
return {
id: n.id,
name: l,
overlay: c,
inputs: o
}
}(e, r)
},
e
}();
e.exports = s
},
jCNj: function(e, t, i) {
"use strict";
var s = i("99ZO"),
r = i("3UA0").tzData;
function n(e) {
this._name = e;
var t = r[e];
if (t || (t = {
time: [],
offset: []
}, this._invalid = !0), t.time.length !== t.offset.length && (t = {
time: [],
offset: []
}, this._invalid = !0), !t.time_utc) {
for (var i = t.time, s = t.offset, n = i.length, o = new Array(n), a = 0; a < n; a++) i[
a] *= 1e3, s[a] *= 1e3, o[a] = i[a] - s[a];
t.time_utc = o
}
this.tz = t
}
function o(e, t) {
var i = e.length;
if (0 === i) return -1;
if (isNaN(t)) throw Error("Key is NaN");
for (var s = 0, r = i - 1, n = a((s + r) / 2);;) {
if (e[n] > t) {
if ((r = n - 1) < s) return n
} else if (r < (s = n + 1)) return n < i - 1 ? n + 1 : -1;
n = a((s + r) / 2)
}
}
n.prototype.offset_utc = function(e) {
return n._offset(this.tz.time_utc, this.tz.offset, e)
}, n.prototype.offset_loc = function(e) {
return n._offset(this.tz.time, this.tz.offset, e)
}, n.prototype.name = function() {
return this._name
}, n.prototype.correction_loc = function(e) {
var t = this.tz.time,
i = this.tz.offset,
s = o(t, e);
if (s < 1) return 0;
var r = i[s] - i[s - 1];
if (r > 0 && e - t[s - 1] <= r) return r;
return 0
}, n.prototype.is_valid = function() {
return !this._invalid
}, n._offset = function(e, t, i) {
var s = o(e, i);
return -1 === s ? 0 : t[s]
};
var a = function(e) {
return 0 | e
},
l = function(e) {
return 60 * e * 1e3
},
c = function(e, t) {
return h(e) - h(t)
},
h = function(e) {
return e < 0 ? a(e / 1e3) - (e % 1e3 != 0 ? 1 : 0) : a(e / 1e3)
};
function u(e) {
return e % 4 == 0 && (e % 100 != 0 || e % 400 == 0)
}
var d = {
0: 0,
1: 31,
2: 59,
3: 90,
4: 120,
5: 151,
6: 181,
7: 212,
8: 243,
9: 273,
10: 304,
11: 334
},
p = {
...s.WeekDays,
...s.Months,
YEAR: 1,
MONTH: 2,
WEEK_OF_YEAR: 3,
DAY_OF_MONTH: 5,
DAY_OF_YEAR: 6,
DAY_OF_WEEK: 7,
HOUR_OF_DAY: 11,
MINUTE: 12,
SECOND: 13,
minutesPerDay: 1440,
millisecondsPerDay: l(1440),
get_minutes_from_hhmm: function(e) {
return -1 !== e.indexOf(":") && (e = e.split(":").join("")), e % 100 + 60 * a(
e / 100)
},
get_year: function(e) {
return e.getUTCFullYear()
},
get_month: function(e) {
return e.getUTCMonth()
},
get_hours: function(e) {
return e.getUTCHours()
},
get_minutes: function(e) {
return e.getUTCMinutes()
},
get_seconds: function(e) {
return e.getUTCSeconds()
},
get_day_of_month: function(e) {
return e.getUTCDate()
},
get_day_of_week: function(e) {
return e.getUTCDay() + 1
},
get_day_of_year: function(e) {
var t = e.getUTCMonth(),
i = d[t];
return t > p.JANUARY + 1 && u(e.getUTCFullYear()) && (i += 1), i + e
.getUTCDate()
},
get_week_of_year: function(e) {
var t = new Date(Date.UTC(e.getUTCFullYear(), 0, 1)).getUTCDay(),
i = 0 === t ? 1 : 8 - t,
s = p.get_day_of_year(e) - i;
return Math.ceil(s / 7) + 1
},
get_minutes_from_midnight: function(e) {
return 60 * p.get_hours(e) + p.get_minutes(e)
},
set_hms: function(e, t, i, s, r, n) {
e.setUTCHours(t), e.setUTCMinutes(i), e.setUTCSeconds(s), e.setUTCMilliseconds(
r), p.correct_time(e, n)
},
correct_time: function(e, t) {
var i = e.getTime(),
s = t.correction_loc(i);
e.setTime(i + s)
},
add_days_considering_dst: function(e, t, i) {
var s = e.offset_utc(t),
r = this.clone(t);
this.add_date(r, i);
var n = e.offset_utc(r);
return r.setTime(r.getTime() + s - n), r
},
add_date: function(e, t) {
e.setTime(e.getTime() + t * p.millisecondsPerDay)
},
add_minutes: function(e, t) {
e.setTime(e.getTime() + l(t))
},
clone: function(e) {
return new Date(e.getTime())
},
get_days_per_year: function(e) {
var t = e.getUTCFullYear();
return this.days_per_year(t)
},
days_per_year: function(e) {
return u(e) ? 366 : 365
},
get_days_in_month: function(e, t) {
let i;
switch (e) {
case 0:
case 2:
case 4:
case 6:
case 7:
case 9:
case 11:
i = 31;
break;
case 1:
i = 28, u(t) && i++;
break;
default:
i = 30
}
return i
},
get_part: function(e, t) {
switch (t) {
case p.YEAR:
return p.get_year(e);
case p.MONTH:
return p.get_month(e);
case p.DAY_OF_MONTH:
return p.get_day_of_month(e);
case p.WEEK_OF_YEAR:
return p.get_week_of_year(e);
case p.DAY_OF_WEEK:
return p.get_day_of_week(e);
case p.HOUR_OF_DAY:
return p.get_hours(e);
case p.MINUTE:
return p.get_minutes(e);
case p.DAY_OF_YEAR:
return p.get_day_of_year(e);
case p.SECOND:
return p.get_seconds(e);
default:
return e.getTime()
}
},
time_minutes: l,
time_seconds: function(e) {
return 1e3 * e
},
time_minutes_diff: function(e, t) {
return a(c(e, t) / 60)
},
time_seconds_diff: c,
utc_to_cal: function(e, t) {
return new Date(p.utc_to_cal_ts(e, t))
},
utc_to_cal_ts: function(e, t) {
return t + e.offset_utc(t)
},
get_cal: function(e, t, i, s, r, n, o) {
var a = new Date(Date.UTC(t, i, s, r || 0, n || 0, o || 0)),
l = e.offset_utc(+a);
return new Date(a.valueOf() - l)
},
get_cal_from_unix_timestamp_ms: function(e, t) {
return new Date(t + e.offset_utc(t))
},
get_cal_utc: function(e, t, i) {
return new Date(Date.UTC(e, t, i))
},
cal_to_utc: function(e, t) {
var i = t.getTime();
return i - e.offset_loc(i)
},
get_timezone: function(e) {
return new n(e)
},
shift_day: function(e, t) {
var i = e - 1;
return (i += t) > 6 ? i %= 7 : i < 0 && (i = (7 + i % 7) % 7), i + 1
}
};
e.exports = p
},
jFln: function(e, t, i) {
"use strict";
var s = i("Hr11"),
r = s.greaterThan,
n = s.lessThan,
o = window.CanvasEx = i("8Uy/");
o.computeDashPattern = function(e) {
return [
[e.lineWidth, 2 * e.lineWidth],
[5 * e.lineWidth, 6 * e.lineWidth],
[6 * e.lineWidth, 6 * e.lineWidth],
[e.lineWidth, 4 * e.lineWidth],
[2 * e.lineWidth, e.lineWidth]
][e.lineStyle - 1]
}, o.drawLine = function(e, t, i, s, r) {
isFinite(t) && isFinite(s) && isFinite(i) && isFinite(r) && (e.lineStyle !== o
.LINESTYLE_SOLID ? o.drawDashedLine(e, t, i, s, r) : o.drawSolidLine(e, t, i, s,
r))
}, o.drawArrow = function(e, t, i, s, r, n) {
if (isFinite(t) && isFinite(s) && isFinite(i) && isFinite(r)) {
var o = Math.round(n / 2),
a = t + o,
l = s + o;
e.beginPath(), e.moveTo(l, r), e.lineTo(a, i), e.moveTo(t, i + o), e.lineTo(a, i), e
.lineTo(t + n, i + o), e.stroke()
}
}, o.drawSolidLine = function(e, t, i, s, r) {
e.beginPath(), e.moveTo(t, i), e.lineTo(s, r), e.stroke()
}, o.setLineStyle = function(e, t) {
e.lineStyle = t;
var i = [];
t !== o.LINESTYLE_SOLID && (i = o.computeDashPattern(e)), o.setLineDash(e, i)
}, o.setLineDash = function(e, t) {
"function" == typeof e.setLineDash ? e.setLineDash(t) : void 0 !== e.mozDash ? e
.mozDash = t : void 0 !== e.webkitLineDash && (e.webkitLineDash = t)
}, o.drawPoly = function(e, t, i) {
e.beginPath(), e.moveTo(t[0].x, t[0].y);
for (var s = 0; s < t.length; s++) {
var r = t[s];
e.lineTo(r.x, r.y)
}
e.closePath(), e.stroke(), i && e.fill()
}, o.drawDashedLine = function(e, t, i, s, r) {
e.save();
var n = o.computeDashPattern(e);
if (e.beginPath(), "function" == typeof e.setLineDash) e.setLineDash(n);
else if (void 0 !== e.mozDash) e.mozDash = n;
else {
if (void 0 === e.webkitLineDash) return o.dashedLineTo(e, t, i, s, r, n), e
.stroke(), void e.restore();
e.webkitLineDash = n
}
e.moveTo(t, i), e.lineTo(s, r), e.stroke(), e.restore()
}, o.drawDashedLineHorizontal = function(e, t, i, s) {
e.save();
var r = o.computeDashPattern(e),
n = 0,
a = e.lineWidth,
l = a / 2;
e.translate(-l, -l);
for (var c = !0, h = t + s; t < h;) {
var u = r[n];
c && e.fillRect(t, i, u, a), c = !c, t += u,
n = n === r.length - 1 ? 0 : n + 1
}
e.restore()
}, o.drawDashedLineVertical = function(e, t, i, s) {
e.save();
var r = o.computeDashPattern(e),
n = 0,
a = e.lineWidth,
l = a / 2;
e.translate(-l, -l);
for (var c = !0, h = i + s; i < h;) {
var u = r[n];
c && e.fillRect(t, i, a, u), c = !c, i += u, n = n === r.length - 1 ? 0 : n + 1
}
e.restore()
}, o.dashedLineTo = function(e, t, i, s, o, a) {
var l = {
thereYet: r,
cap: Math.min
},
c = {
thereYet: r,
cap: Math.min
};
i - o > 0 && (c.thereYet = n, c.cap = Math.max), t - s > 0 && (l.thereYet = n, l.cap =
Math.max), e.moveTo(t, i);
for (var h = t, u = i, d = 0, p = !0; !l.thereYet(h, s) || !c.thereYet(u, o);) {
var _ = Math.atan2(o - i, s - t),
m = a[d];
h = l.cap(s, h + Math.cos(_) * m), u = c.cap(o, u + Math.sin(_) * m), p ? e.lineTo(
h, u) : e.moveTo(h, u), d = (d + 1) % a.length, p = !p
}
}, o.setFont = function(e, t) {
if (e.font !== t) try {
e.font = t
} catch (e) {}
}, "undefined" != typeof CanvasRenderingContext2D && (CanvasRenderingContext2D.prototype
.setFont = function(e) {
o.setFont(this, e)
}, CanvasRenderingContext2D.prototype.lineStyle = o.LINESTYLE_SOLID), e.exports = o
},
jJ9X: function(e, t, i) {},
jRfx: function(e, t, i) {
"use strict";
i.d(t, "c", (function() {
return o
})), i.d(t, "a", (function() {
return a
})), i.d(t, "b", (function() {
return l
}));
var s = i("Eyy1"),
r = i("3u3j");
class n extends r.a {
constructor(e, t, i) {
super(e, t, i), this._restorePane = !1
}
redo() {
const e = this._chartModel.panes().length,
t = this._chartModel.panes()[this._targetPaneIndex()],
i = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
._sourceId)),
r = Object(s.ensureNotNull)(this._chartModel.paneForSource(i)),
n = this._chartModel.children(i, !0);
r.bulkActionMacro(() => {
n.forEach(e => this._chartModel.detachSource(e)), this
._restorePane = this._chartModel.detachSource(i)
});
const o = "overlay" === this._initialPriceScalePosition ? this
._initialPriceScalePosition : void 0,
a = t.findSuitableScale(i, void 0, o),
l = 0 === a.dataSources().length;
if (t.bulkActionMacro(() => {
t.addDataSource(i, a, !1), n.forEach(e => t.addDataSource(e, a, !1))
}), i === this._chartModel.mainSeries()) {
const e = t.priceScalePosition(a);
t.movePriceScale(a, e, 0)
}
if (l) {
Object(s.ensureNotNull)(i.priceScale()).restoreState(this
._newPriceScaleState(t.isOverlay(i)))
}
this._chartModel.fullUpdate(), e !== this._chartModel.panes().length && this
._chartModel.setShouldBeSavedEvenIfHidden(!0)
}
undo() {
let e;
e = this._restorePane ? this._chartModel.createPane(this._initialPaneIndex) :
this._chartModel.panes()[this._initialPaneIndex];
const t = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(this
._sourceId)),
i = Object(s.ensureNotNull)(this._chartModel.paneForSource(t)),
r = this._chartModel.children(t, !0);
i.bulkActionMacro(() => {
r.forEach(e => this._chartModel.detachSource(e)), this._chartModel
.detachSource(t)
});
let n = e.getPriceScaleById(this._initialPriceScaleId);
null === n && (n = e.createPriceScaleAtPosition(this._initialPriceScalePosition,
this._initialPriceScaleIndex)), e.bulkActionMacro(() => {
e.addDataSource(t, n, !0), r.forEach(t => e.addDataSource(t, n, !1))
}), Object(s.ensureNotNull)(t.priceScale()).restoreState(this
._originalPriceScaleState()), this._chartModel.fullUpdate()
}
}
class o extends n {
constructor(e, t, i) {
super(e, t, i)
}
_targetPaneIndex() {
return this._initialPaneIndex - 1
}
}
class a extends n {
constructor(e, t, i) {
super(e, t, i)
}
_targetPaneIndex() {
return this._initialPaneIndex + 1
}
}
class l extends n {
constructor(e, t, i, s) {
super(e, t, s), this._targetPane = i
}
_targetPaneIndex() {
return this._targetPane
}
}
},
jTis: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "CalloutConsts", (function() {
return s
})),
function(e) {
e[e.RoundRadius = 8] = "RoundRadius", e[e.TextMargins = 2] = "TextMargins", e[e
.MinWidth = 100] = "MinWidth"
}(s || (s = {}))
},
jeZR: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "AppliedTimeFrame", (function() {
return r
}));
var s = i("QfUd");
class r {
constructor(e) {
this._appliedTimeFrame = new s.a(null), this._appliedTimeFrameInfo = null, this
._appliedTimeFrameChangedBound = this._appliedTimeFrameChanged.bind(this), this
._model = e, e.mainSeries().dataEvents().seriesTimeFrame().subscribe(this, this
._onSeriesTimeFrame), this._appliedTimeFrame.subscribe(this
._appliedTimeFrameChangedBound)
}
destroy() {
this._appliedTimeFrame.unsubscribe(this._appliedTimeFrameChangedBound), this._model
.timeScale().logicalRangeChanged().unsubscribeAll(this), this._model
.mainSeries().dataEvents().seriesTimeFrame().unsubscribeAll(this)
}
appliedTimeFrame() {
return this._appliedTimeFrame
}
_appliedTimeFrameChanged() {
this._model.timeScale().logicalRangeChanged().unsubscribe(this, this
._invalidateAppliedTimeFrame)
}
_onSeriesTimeFrame(e, t, i, s) {
if (s) {
const e = this._model.timeScale();
this._appliedTimeFrameInfo = {
logicalRange: e.logicalRange(),
baseIndex: e.baseIndex()
}, e.logicalRangeChanged().subscribe(this, this._invalidateAppliedTimeFrame)
}
}
_invalidateAppliedTimeFrame() {
if (null === this._appliedTimeFrameInfo) return;
const e = this._model.timeScale(),
t = e.logicalRange(),
i = e.baseIndex(),
s = this._appliedTimeFrameInfo.logicalRange,
r = this._appliedTimeFrameInfo.baseIndex;
(null === t || null === s || Math.abs(i - t.left() - (r - s.left())) >= .01 || Math
.abs(i - t.right() - (r - s.right())) >= .01) && this._appliedTimeFrame
.setValue(null)
}
}
},
jenN: function(e, t, i) {
"use strict";
i.r(t);
var s = i("txPx"),
r = i("7Fue"),
n = i("xWfy"),
o = i("qySK"),
a = i("KcY8");
class l extends a.a {
constructor(e, t) {
super(), this._source = e, this._data = t
}
_updateRendererData(e, t, i) {
e.visible = !1;
const s = this._source.priceScale(),
r = this._source.properties().visible.value();
if (!s || s.isEmpty() || !r) return;
const n = this._source.properties().graphics[this._data.lineType][this._data
.styleId
];
if (!(n.visible && n.visible.value() && n.showPrice && n.showPrice.value()))
return;
const o = this._source.firstValue();
if (null === o) return;
const a = this._data.line.level,
l = n.color.value();
i.background = l, i.textColor = this.generateTextColor(l), i.coordinate = s
.priceToCoordinate(a, o), e.text = s.formatPrice(a, o), e.visible = !0
}
}
i.d(t, "createGraphicsPaneViews", (function() {
return d
})), i.d(t, "createGraphicsPriceAxisViews", (function() {
return _
})), i.d(t, "isStudyGraphicsEmpty", (function() {
return r.a
})), i.d(t, "StaticStudyGraphics", (function() {
return n.a
})), i.d(t, "emptyStudyGraphics", (function() {
return n.b
})), i.d(t, "loadStudyGraphics", (function() {
return n.c
})), i.d(t, "saveStudyGraphics", (function() {
return n.d
})), i.d(t, "LiveStudyGraphics", (function() {
return o.a
}));
const c = Object(s.getLogger)("Chart.StudyGraphics"),
h = new Set(["dwgtablecells"]);
async function u(e, t, s, r) {
switch (e) {
case "hhists":
return new((await i.e("study-pane-views").then(i.bind(null, "Gj0v")))
.HHistPaneView)(t, s, r);
case "horizlines":
return new((await i.e("study-pane-views").then(i.bind(null, "1sos")))
.HorizLinePaneView)(t, s, r);
case "vertlines":
return new((await i.e("study-pane-views").then(i.bind(null, "psYU")))
.VertLinePaneView)(t, s, r);
case "polygons":
return new((await i.e("study-pane-views").then(i.bind(null, "BJvp")))
.PolygonPaneView)(t, s, r)
}
return null
}
async function d(e, t, i) {
const s = [],
r = Object.keys(e.graphicsInfo());
r.sort((e, t) => p(e) - p(t));
for (const n of r) {
const r = await u(n, e, t, i);
null !== r ? s.push(r) : h.has(n) || c.logWarn(n +
" is not supported by this build of graphics subsystem, skipping")
}
return s
}
function p(e) {
switch (e) {
case "polygons":
return -100;
case "trendchannels":
return -90;
default:
return 0
}
}
function _(e) {
const t = Object.keys(e.graphicsInfo()),
i = [];
for (const s of t) switch (s) {
case "hlines":
e.graphics().hlines().forEach((t, r) => {
t.forEach(t => {
void 0 !== t.level && i.push(new l(e, {
line: {
level: t.level
},
styleId: r,
lineType: s
}))
})
});
break;
case "horizlines":
e.graphics().horizlines().forEach((t, r) => {
t.forEach(t => {
void 0 !== t.level && i.push(new l(e, {
line: {
level: t.level
},
styleId: r,
lineType: s
}))
})
})
}
return i
}
},
jkoZ: function(e, t, i) {
"use strict";
var s = i("XlJ7").makeFont,
r = i("XlJ7").parseFont,
n = (0, i("txPx").getLogger)("Model.ChartTradingUtils"),
o = {
_fontHeightCache: {},
_parsedColorCache: {},
_parseColor: function(e) {
if (this._parsedColorCache[e]) return this._parsedColorCache[e];
var t = document.createElement("div");
t.style.color = e;
var i = t.style.color.match(
/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i) || t.style.color
.match(
/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d*\.?\d+)\s*\)$/i),
s = {
r: i[1],
g: i[2],
b: i[3],
a: i[4] || "1"
};
return this._parsedColorCache[e] = s, s
},
getColorFromProperties: function(e, t) {
var i = 1 - t.value() / 100,
s = this._parseColor(e.value());
return "rgba(" + s.r + "," + s.g + "," + s.b + "," + i + ")"
},
setColorToProperties: function(e, t, i) {
var s = this._parseColor(e);
t.setValue("rgb(" + s.r + "," + s.g + "," + s.b + ")");
var r = 100 * (1 - s.a);
i.setValue(Math.max(0, Math.min(r, 100)))
},
getFontFromProperties: function(e, t, i, r) {
return s(t.value(), e.value(), r.value() ? "italic" : "", i.value() ? "bold" :
"")
},
setFontToProperties: function(e, t, i, s, o) {
var a = r(e);
null !== a ? (a.family.length > 0 && t.setValue(a.family), i.setValue(a.size), s
.setValue(a.bold), o.setValue(a.italic)) : n.logError("Invalid font: " +
e)
},
fontHeight: function(e) {
if (!this._fontHeightCache[e]) {
var t = document.createElement("span");
t.appendChild(document.createTextNode("height")), document.body.appendChild(
t), t.style.cssText = "font: " + e +
"; white-space: nowrap; display: inline;";
var i = t.offsetHeight;
document.body.removeChild(t), this._fontHeightCache[e] = Math.ceil(i)
}
return this._fontHeightCache[e]
},
drawPolyHoverOrPress: function(e, t, i, s) {
s ? (e.save(), e.fillStyle = "rgba(0, 0, 0, 0.15)", CanvasEx.drawPoly(e, t, !0),
e.restore()) : i && (e.save(), e.fillStyle = "rgba(0, 0, 0, 0.1)",
CanvasEx.drawPoly(e, t, !0), e.restore())
},
repaint: function(e) {
e.lightUpdate()
},
roundToMinTick: function(e, t) {
var i = 1 / e.mainSource().base();
return i * Math.round(t / i)
}
};
e.exports = o
},
jofe: function(e, t, i) {
"use strict";
function s() {
let e, t;
return {
promise: new Promise((i, s) => {
e = i, t = s
}),
reject: t,
resolve: e
}
}
i.r(t), i.d(t, "createDeferredPromise", (function() {
return s
}))
},
jpZi: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return o
}));
var s = i("Eyy1"),
r = (i("YFKU"), i("HbRj"), i("RDU5"));
const n = window.t("Exclude line tools from group {group}");
class o extends r.UndoCommand {
constructor(e, t, i) {
super(n.format({
group: t.name()
})), this._model = e, this._groupId = t.id, this._groupName = t.name(), this
._lineToolsIds = i.map(e => e.id())
}
redo() {
const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(
this._groupId)),
t = this._lineToolsIds.map(e => this._model.dataSourceForId(e));
e.excludeLineTools(t), 0 === e.lineTools().length && this._model
.lineToolsGroupModel().removeGroup(e)
}
undo() {
const e = this._lineToolsIds.map(e => this._model.dataSourceForId(e)),
t = this._model.lineToolsGroupModel().groupForId(this._groupId);
null !== t ? t.addLineTools(e) : this._model.lineToolsGroupModel().createGroup(
e, this._groupName, this._groupId)
}
}
},
jvrd: function(e, t, i) {
"use strict";
i.d(t, "g", (function() {
return n
})), i.d(t, "e", (function() {
return a
})), i.d(t, "d", (function() {
return l
})), i.d(t, "c", (function() {
return c
})), i.d(t, "f", (function() {
return h
})), i.d(t, "a", (function() {
return u
})), i.d(t, "b", (function() {
return d
}));
var s = i("Eyy1"),
r = i("k9/m");
function n(e, t, i) {
const s = e.barFunction();
switch (e.style()) {
case 3:
case 10:
case 2:
return s(t.value);
default:
return t.value[-1 === i ? 3 : 2]
}
}
function o(e) {
return e >= 0 ? 1 : -1
}
function a(e, t) {
return -1 === o(e) !== t ? -1 : 1
}
function l(e, t, i, s) {
const r = Math.min(t, Math.max(0, 1 === s ? i : t - i));
return i - s * Math.abs(r * e / 100)
}
function c(e, t, i) {
const s = e.index();
return null === s ? null : {
index: s,
price: t.coordinateToPrice(t.height() / 2, i)
}
}
function h(e, t) {
const i = e.data().bars(),
s = i.first(),
a = i.last();
if (null === s || null === a) return null;
let l;
const c = t.index();
if (null === c) {
if (void 0 === t.time) return null;
const e = t.time(),
n = s.value[0],
o = a.value[0];
if (e < n - 86400 || e > o) return null;
l = i.searchByTime(e, r.PlotRowSearchMode.NearestRight, 4)
} else l = i.search(c);
return null === l ? null : {
index: l.index,
price: n(e, l, o(t.position()))
}
}
function u(e, t, i) {
const s = c(e, t, i);
if (null === s) return null;
const r = a(e.position(), t.isInverted());
return {
index: s.index,
price: s.price,
poleStartY: t.height(),
visualDirection: 1,
positionPointDirection: r
}
}
function d(e, t) {
const i = h(e, t),
r = e.priceScale(),
n = Object(s.ensureNotNull)(e.firstValue());
if (null === i) return u(t, r, n);
let o = 0;
const l = e.properties(),
c = e.model().timeScale(),
d = r.priceToCoordinate(i.price, n);
switch (e.style()) {
case 3:
o = l.areaStyle.linewidth.value() / 2;
break;
case 2:
o = l.lineStyle.linewidth.value() / 2;
break;
case 10:
const e = Math.abs(100 - l.baselineStyle.baseLevelPercentage.value());
o = r.height() * e / 100 > d ? l.baselineStyle.topLineWidth.value() / 2 : l
.baselineStyle.bottomLineWidth.value() / 2;
break;
case 1:
case 9:
case 8:
case 12:
o = 3;
break;
case 0:
o = l.barStyle.thinBars.value() ? 3 : Math.max(3, .25 * c.barSpacing());
break;
case 11:
o = l.rangeStyle.thinBars.value() ? 3 : Math.max(3, .25 * c.barSpacing());
break;
case 4:
case 7:
o = 3;
break;
case 5:
o = Math.max(4, .25 * c.barSpacing());
break;
case 6:
o = Math.max(5, .25 * c.barSpacing())
}
const p = a(t.position(), r.isInverted()),
_ = d - p * o;
return {
index: i.index,
price: i.price,
poleStartY: _,
visualDirection: p,
positionPointDirection: p
}
}
},
jy4L: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "makeNextSymbolId", (function() {
return r
})), i.d(t, "makeNextStudyId", (function() {
return o
}));
let s = 0;
function r() {
return s++, "ss_" + s
}
let n = 0;
function o() {
return n++, "st" + n
}
},
k4w6: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
}));
var s = i("2ijp");
class r extends s.a {
constructor(e) {
super(), this._series = e, this._model = e.model()
}
}
},
"k9/m": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PlotRowSearchMode", (function() {
return l
})), i.d(t, "PlotList", (function() {
return u
})), i.d(t, "mergeMinMax", (function() {
return d
})), i.d(t, "mergePlotRows", (function() {
return p
}));
var s = i("Eyy1"),
r = i("Y7w9"),
n = i("tqok"),
o = i("txPx");
const a = Object(o.getLogger)("Chart.PlotList");
var l;
! function(e) {
e[e.NearestLeft = -1] = "NearestLeft", e[e.Exact = 0] = "Exact", e[e.NearestRight = 1] =
"NearestRight"
}(l || (l = {}));
function c(e) {
return e.index
}
function h(e) {
return e.value[0]
}
class u {
constructor(e = null, t = null) {
this._items = [], this._start = 0, this._end = 0, this._shareRead = !1, this
._minMaxCache = new Map, this._rowSearchCacheByIndex = new Map, this
._rowSearchCacheByIndexWithoutEmptyValues = new Map, this
._rowSearchCacheByTime = new Map, this._rowSearchCacheByTimeWithoutEmptyValues =
new Map, this._plotFunctions = e || new Map, this._emptyValuePredicate = t
}
clear() {
this._items = [], this._start = 0, this._end = 0, this._shareRead = !1, this
._minMaxCache.clear(), this._invalidateSearchCaches()
}
first() {
return this.size() > 0 ? this._items[this._start] : null
}
last() {
return this.size() > 0 ? this._items[this._end - 1] : null
}
firstIndex() {
return this.size() > 0 ? this._indexAt(this._start) : null
}
lastIndex() {
return this.size() > 0 ? this._indexAt(this._end - 1) : null
}
size() {
return this._end - this._start
}
isEmpty() {
return 0 === this.size()
}
contains(e) {
return null !== this.search(e, l.Exact)
}
valueAt(e) {
const t = this.search(e);
return null !== t ? t.value : null
}
add(e, t) {
if (this._shareRead) return a.logDebug(
"add: readonly collection modification attempt"), !1;
const i = {
index: e,
value: t
},
s = this._nonCachedSearch(e, l.Exact, c);
return this._invalidateSearchCaches(), null === s ? (this._items.splice(this
._lowerbound(e, c), 0, i), this._start = 0, this._end = this._items
.length, !0) : (this._items[s] = i, !1)
}
search(e, t = l.Exact, i) {
return this._searchImpl(e, t, this._rowSearchCacheByIndex, this
._rowSearchCacheByIndexWithoutEmptyValues, c, i)
}
searchByTime(e, t = l.Exact, i) {
return this._searchImpl(e, t, this._rowSearchCacheByTime, this
._rowSearchCacheByTimeWithoutEmptyValues, h, i)
}
fold(e, t) {
let i = t;
for (let t = this._start; t < this._end; ++t) {
i = e(this._indexAt(t), this._valueAt(t), i)
}
return i
}
findFirst(e, t) {
const i = void 0 !== t && Math.min(this._start + t, this._end) || this._end;
for (let t = this._start; t < i; ++t) {
const i = this._indexAt(t),
s = this._valueAt(t);
if (e(i, s)) return {
index: i,
value: s
}
}
return null
}
findLast(e, t) {
const i = void 0 !== t && Math.max(this._end - t, this._start) || this._start;
for (let t = this._end - 1; t >= i; --t) {
const i = this._indexAt(t),
s = this._valueAt(t);
if (e(i, s)) return {
index: i,
value: s
}
}
return null
}
each(e) {
for (let t = this._start; t < this._end; ++t) {
if (e(this._indexAt(t), this._valueAt(t))) break
}
}
reduce(e, t) {
let i = t;
for (let t = this._start; t < this._end; ++t) {
i = e(i, this._indexAt(t), this._valueAt(t))
}
return i
}
range(e, t) {
const i = new u(this._plotFunctions, this._emptyValuePredicate);
return i._items = this._items, i._start = this._lowerbound(e, c), i._end = this
._upperbound(t), i._shareRead = !0, i
}
rangeIterator(e, t) {
const i = this._lowerbound(e, c),
s = this._upperbound(t);
if (i === s) return {
hasNext: () => !1,
next: () => {
throw new Error("Invalid operation")
}
};
let r = i - 1;
return {
hasNext: () => r < s - 1,
next: () => (r += 1, this._items[r])
}
}
minMaxOnRangeCached(e, t, i) {
if (this.isEmpty()) return null;
let s = null;
for (const r of i) {
s = d(s, this._minMaxOnRangeCachedImpl(e - r.offset, t - r.offset, r.name))
}
return s
}
minMaxOnRange(e, t, i) {
if (this.isEmpty()) return null;
let s = null;
for (const r of i) {
s = d(s, this._minMaxOnRange(e - r.offset, t - r.offset, r.name))
}
return s
}
merge(e) {
return this._shareRead ? (a.logDebug(
"merge: readonly collection modification attempt"), null) : 0 === e.length ?
null : this.isEmpty() || e[e.length - 1].index < this._items[0].index ? this
._prepend(e) : e[0].index > this._items[this._items.length - 1].index ? this
._append(e) : 1 === e.length && e[0].index === this._items[this._items.length -
1].index ? (this._updateLast(e[0]), e[0]) : this._merge(e)
}
addTail(e, t = !1) {
let i = 0;
t && this._end - this._start > 0 && (i = 1, this._items[this._end - this._start - 1]
.value = e[0].value);
for (let t = i; t < e.length; ++t) {
const i = e[t],
s = this.lastIndex();
if (null === s) {
a.logError("Can't add tail to the empty plotlist");
break
}
this.add(s + 1, i.value)
}
this._invalidateSearchCaches()
}
move(e) {
if (this._shareRead) return void a.logDebug(
"move: readonly collection modification attempt");
if (0 === e.length) return;
const t = this._items.slice();
for (const i of e) {
const e = this._bsearch(i.old, c);
if (null !== e && void 0 !== t[e])
if (i.new === n.INVALID_TIME_POINT_INDEX) t[e] = void 0;
else {
t[e] = {
index: i.new,
value: t[e].value
};
const s = this._bsearch(i.new, c);
if (null !== s) {
const e = t[s];
void 0 !== e && e.index === i.new && (t[s] = void 0)
}
}
}
this._items = t.filter(e => void 0 !== e).sort((e, t) => e.index - t.index), this
._invalidateSearchCaches(), this._minMaxCache.clear(), this._start = 0, this
._end = this._items.length
}
remove(e) {
if (this._shareRead) return a.logDebug(
"remove: readonly collection modification attempt"), null;
const t = this._nonCachedSearch(e, l.NearestRight, c);
if (null === t) return null;
const i = this._items.splice(t);
return this._end = this._items.length, this._minMaxCache.clear(), this
._invalidateSearchCaches(), i.length > 0 ? i[0] : null
}
state() {
return {
start: this._start,
end: this._end,
data: this._items,
shareread: this._shareRead
}
}
restoreState(e) {
e ? (this._start = e.start, this._end = e.end, this._shareRead = e.shareread, this
._items = e.data, this._minMaxCache.clear(), this._invalidateSearchCaches()
) : this.clear()
}
_indexAt(e) {
return this._items[e].index
}
_valueAt(e) {
return this._items[e].value
}
_length() {
return this._items.length
}
_searchImpl(e, t, i, s, r, n) {
const o = void 0 !== n ? i : s,
a = void 0 !== n ? 1e4 * (t + 1) + n : t;
let l = o.get(e);
if (void 0 !== l) {
const e = l.get(a);
if (void 0 !== e) return e
}
const c = this._nonCachedSearch(e, t, r, n);
if (null === c) return null;
const h = {
index: this._indexAt(c),
value: this._valueAt(c)
};
return void 0 === l && (l = new Map, o.set(e, l)), l.set(a, h), h
}
_nonCachedSearch(e, t, i, s) {
const r = this._lowerbound(e, i),
n = r === this._end || e !== i(this._items[r]);
if (n && t !== l.Exact) switch (t) {
case l.NearestLeft:
return this._searchNearestLeft(r, s);
case l.NearestRight:
return this._searchNearestRight(r, s);
default:
throw new TypeError("Unknown search mode")
}
if (void 0 === s || n || t === l.Exact) return n ? null : r;
switch (t) {
case l.NearestLeft:
return this._nonEmptyNearestLeft(r, s);
case l.NearestRight:
return this._nonEmptyNearestRight(r, s);
default:
throw new TypeError("Unknown search mode")
}
}
_nonEmptyNearestRight(e, t) {
const i = Object(s.ensure)(this._emptyValuePredicate),
r = Object(s.ensure)(t);
for (; e < this._end && i(this._valueAt(e), r);) e += 1;
return e === this._end ? null : e
}
_nonEmptyNearestLeft(e, t) {
const i = Object(s.ensureNotNull)(this._emptyValuePredicate),
r = Object(s.ensure)(t);
for (; e >= this._start && i(this._valueAt(e), r);) e -= 1;
return e < this._start ? null : e
}
_searchNearestLeft(e, t) {
if (e === this._start) return null;
const i = e - 1,
s = i !== this._end ? i : null;
return void 0 !== t && null !== s ? this._nonEmptyNearestLeft(s, t) : s
}
_searchNearestRight(e, t) {
const i = e,
s = i !== this._end ? i : null;
return void 0 !== t && null !== s ? this._nonEmptyNearestRight(s, t) : s
}
_bsearch(e, t) {
const i = this._lowerbound(e, t);
return i !== this._end && e === t(this._items[i]) ? i : null
}
_lowerbound(e, t) {
return Object(r.lowerbound)(this._items, e, (e, i) => t(e) < i, this._start, this
._end)
}
_upperbound(e) {
return Object(r.upperbound)(this._items, e, (e, t) => t.index > e, this._start, this
._end)
}
_plotMinMax(e, t, i) {
let s = null;
const r = this._plotFunctions.get(i);
if (void 0 === r) throw new Error(`Plot "${i}" is not registered`);
for (let i = e; i < t; i++) {
const e = r(this._items[i].value);
null == e || Number.isNaN(e) || (null === s ? s = {
min: e,
max: e
} : (e < s.min && (s.min = e), e > s.max && (s.max = e)))
}
return s
}
_invalidateCacheForRow(e) {
const t = Math.floor(e.index / 30);
this._minMaxCache.forEach(e => e.delete(t))
}
_prepend(e) {
return Object(s.assert)(!this._shareRead, "collection should not be readonly"),
Object(s.assert)(0 !== e.length, "plotRows should not be empty"), this
._invalidateSearchCaches(), this._minMaxCache.clear(), this._items = e.concat(
this._items), this._start = 0, this._end = this._items.length, e[0]
}
_append(e) {
return Object(s.assert)(!this._shareRead, "collection should not be readonly"),
Object(s.assert)(0 !== e.length, "plotRows should not be empty"), this
._invalidateSearchCaches(), this._minMaxCache.clear(), this._items = this._items
.concat(e), this._start = 0, this._end = this._items.length, e[0]
}
_updateLast(e) {
Object(s.assert)(!this.isEmpty(), "plot list should not be empty");
const t = this._items[this._end - 1];
Object(s.assert)(t.index === e.index, "last row index should match new row index"),
this._invalidateCacheForRow(e), this._invalidateSearchCaches(), this._items[this
._end - 1] = e
}
_merge(e) {
return Object(s.assert)(0 !== e.length, "plot rows should not be empty"), this
._invalidateSearchCaches(), this._minMaxCache.clear(), this._items = p(this
._items, e), this._start = 0, this._end = this._items.length, e[0]
}
_minMaxOnRangeCachedImpl(e, t, i) {
if (this.isEmpty()) return null;
let r = null;
const n = Object(s.ensureNotNull)(this.firstIndex()),
o = Object(s.ensureNotNull)(this.lastIndex()),
a = Math.max(e, n),
l = Math.min(t, o),
c = 30 * Math.ceil(a / 30),
h = Math.max(c, 30 * Math.floor(l / 30));
r = d(r, this._minMaxOnRange(a, Math.min(c, t, l), i));
let u = this._minMaxCache.get(i);
void 0 === u && (u = new Map, this._minMaxCache.set(i, u));
for (let e = Math.max(c + 1, a); e < h; e += 30) {
const t = Math.floor(e / 30);
let s = u.get(t);
if (void 0 === s) {
const e = 30 * t,
r = 30 * (t + 1) - 1;
s = this._minMaxOnRange(e, r, i), u.set(t, s)
}
r = d(r, s)
}
r = d(r, this._minMaxOnRange(h, l, i));
return r
}
_minMaxOnRange(e, t, i) {
return this._plotMinMax(this._lowerbound(e, c), this._upperbound(t), i)
}
_invalidateSearchCaches() {
this._rowSearchCacheByIndex.clear(), this._rowSearchCacheByIndexWithoutEmptyValues
.clear(), this._rowSearchCacheByTime.clear(), this
._rowSearchCacheByTimeWithoutEmptyValues.clear()
}
}
function d(e, t) {
if (null === e) return t;
if (null === t) return e;
return {
min: Math.min(e.min, t.min),
max: Math.max(e.max, t.max)
}
}
function p(e, t) {
const i = function(e, t) {
const i = e.length,
s = t.length;
let r = i + s,
n = 0,
o = 0;
for (; n < i && o < s;) e[n].index < t[o].index ? n++ : e[n].index > t[o].index ?
o++ : (n++, o++, r--);
return r
}(e, t),
s = new Array(i);
let r = 0,
n = 0;
const o = e.length,
a = t.length;
let l = 0;
for (; r < o && n < a;) e[r].index < t[n].index ? (s[l] = e[r], r++) : e[r].index > t[n]
.index ? (s[l] = t[n], n++) : (s[l] = t[n], r++, n++), l++;
for (; r < o;) s[l] = e[r], r++, l++;
for (; n < a;) s[l] = t[n], n++, l++;
return s
}
},
kIXa: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("Ocx9").DefaultProperty;
class n extends s {
constructor(e, t) {
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"am+t", 7)).then(({
TimeCyclesPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 2
}
name() {
return "Time Cycles"
}
setPoint(e, t, i) {
var s = Object.assign({}, t),
r = this._points[0],
n = this._points[1];
r.price = s.price, n.price = s.price, this._points[e] = s, this.normalizePoints()
}
addPoint(e, t, i) {
var r = s.prototype.addPoint.call(this, e, t, !0);
if (r) {
var n = this._points[0];
this._points[1].price = n.price, i || (this.normalizePoints(), this
.createServerPoints())
}
return r
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "BABJ")))
.TimeCyclesPatternDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetooltimecycles", e);
return n._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
t.LineToolTimeCycles = n
},
kNVT: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "setSymbolSearchCompleteOverrideFunction", (function() {
return r
})), i.d(t, "getSymbolSearchCompleteOverrideFunction", (function() {
return n
}));
let s = e => Promise.resolve(e);
function r(e) {
s = e
}
function n() {
return s
}
},
kcTO: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "formatterOptions", (function() {
return l
})), i.d(t, "numberToStringWithLeadingZero", (function() {
return c
})), i.d(t, "isFormatterHasForexAdditionalPrecision", (function() {
return h
})), i.d(t, "PriceFormatter", (function() {
return u
}));
var s = i("YFKU"),
r = i("ogJP"),
n = i("Ialn"),
o = i("txPx");
const a = Object(o.getLogger)("Chart.PriceFormatter"),
l = {
decimalSign: ".",
decimalSignFractional: "'"
};
function c(e, t) {
if (!Object(r.isNumber)(e)) return "n/a";
if (!Object(r.isInteger)(t)) throw new TypeError("invalid length");
if (t < 0 || t > 16) throw new TypeError("invalid length");
if (0 === t) return e.toString();
return ("0000000000000000" + e.toString()).slice(-t)
}
function h(e) {
return "hasForexAdditionalPrecision" in e
}
class u {
constructor(e, t, i, n) {
if (this.type = "price", this._formatterErrors = {
custom: Object(s.t)("Price format is invalid."),
fraction: Object(s.t)("Fraction part is invalid."),
secondFraction: Object(s.t)("Second fraction part is invalid.")
}, t || (t = 1), Object(r.isNumber)(e) && Object(r.isInteger)(e) || (e = 100),
e < 0) throw new TypeError("invalid base");
this._priceScale = e, this._minMove = t, this._minMove2 = n, i && void 0 !== n &&
n > 0 && 2 !== n && 4 !== n && 8 !== n ? a.logDebug("invalid minmove2") : (this
._fractional = i, this.calculateDecimal())
}
isFractional() {
return !!this._fractional
}
state() {
return {
fractional: this._fractional,
fractionalLength: this._fractionalLength,
minMove: this._minMove,
minMove2: this._minMove2,
priceScale: this._priceScale
}
}
calculateDecimal() {
if (this._fractionalLength = 0, this._priceScale > 0 && this._minMove > 0) {
let e = this._priceScale;
for (this._fractional && this._minMove2 && (e /= this._minMove2); e > 1;) e /=
10, this._fractionalLength++
}
}
format(e, t, i, s = !0, r = !0) {
let o, a = "";
return e < 0 ? (a = !1 === s ? "" : "−", e = -e) : e && !0 === t && (a = "+"), o =
this._fractional ? a + this._formatAsFractional(e, i) : a + this
._formatAsDecimal(e, i), r ? Object(n.forceLTRStr)(o) : o
}
parse(e) {
return e = (e = Object(n.stripLTRMarks)(e)).replace("−", "-"), this._fractional ?
this._minMove2 ? this._parseAsDoubleFractional(e) : this
._parseAsSingleFractional(e) : this._parseAsDecimal(e)
}
hasForexAdditionalPrecision() {
return !this._fractional && 10 === this._minMove2
}
static serialize(e) {
return e.state()
}
static deserialize(e) {
return new u(e.priceScale, e.minMove, e.fractional, e.minMove2)
}
_formatAsDecimal(e, t) {
//格式化价格
if (this.type == "price") {
var price = "0.00";
//如果价格大于1则保留2位小数
if (e > 1) {
price = e.toFixed(2)
} else {
//否则
let splitList = e.toString().split(".")
let num = 0
if (splitList[1]) {
for (var i = 0; i < splitList[1].length; i++) {
if (splitList[1][i] == "0") {
num++
} else {
//如果不为0了 直接中断
break;
}
}
}
if (num >= 4) {
var last = "" + splitList[1].substring(num, splitList[1].length)
if (last.length >= 5) {
if (parseInt(last[4]) >= 5) {
price = '0.0{' + num + '}' + (parseInt(last[0] + last[1] + last[2] + last[
3]) + 1)
} else {
price = '0.0{' + num + '}' + last[0] + last[1] + last[2] + last[3]
}
} else {
price = '0.0{' + num + '}' + last
}
} else {
price = Number(e).toFixed(5)
}
}
return price
} else {
let i;
t = t || 0, i = this._fractional ? Math.pow(10, this._fractionalLength || 0) :
Math
.pow(10, t) * this._priceScale / this._minMove;
const s = 1 / i;
let r;
if (i > 1) r = Math.floor(e);
else {
const t = Math.floor(Math.round(e / s) * s);
r = 0 === Math.round((e - t) / s) ? t : t + s
}
let n = "";
if (i > 1) {
let s = +(Math.round(e * i) - r * i).toFixed(this._fractionalLength);
s >= i && (s -= i, r += 1);
const o = void 0 !== this._fractionalLength ? this._fractionalLength : NaN;
n = l.decimalSign + c(+s.toFixed(this._fractionalLength) * this._minMove,
o +
t), n = this._removeEndingZeros(n, t)
}
return r.toString() + n
}
}
_getFractPart(e, t) {
const i = [0, 5],
s = [0, 2, 5, 7];
return 2 === t ? void 0 === i[e] ? -1 : i[e] : 4 === t ? void 0 === s[e] ? -1 : s[
e] : e
}
_formatAsFractional(e, t) {
const i = this._priceScale / this._minMove;
let s = Math.floor(e),
r = t ? Math.floor(e * i) - s * i : Math.round(e * i) - s * i;
r === i && (r = 0, s += 1);
let n = "";
if (t) {
let o = (e - s - r / i) * i;
o = Math.round(o * Math.pow(10, t)), n = c(o, t), n = this._removeEndingZeros(n,
t)
}
if (!this._fractionalLength) throw new Error("_fractionalLength is not calculated");
let o = "";
if (this._minMove2) {
const e = r % this._minMove2;
r = (r - e) / this._minMove2;
const t = c(r, this._fractionalLength),
i = this._getFractPart(e, this._minMove2);
o = t + l.decimalSignFractional + i
} else r = this._getFractPart(r, this._priceScale), o = c(r * this._minMove, this
._fractionalLength);
return s.toString() + l.decimalSignFractional + o + n
}
_removeEndingZeros(e, t) {
for (let i = 0; i < t && "0" === e[e.length - 1]; i++) e = e.substr(0, e.length -
1);
return e
}
_parseAsDecimal(e) {
let t = new RegExp(/^(-?)[0-9]+$/).exec(e);
if (t) {
const t = parseFloat(e);
return {
value: t,
res: !0,
suggest: this.format(t)
}
}
if (t = new RegExp("^(-?)[0-9]+\\" + l.decimalSign + "[0-9]*$").exec(e), t) {
const t = parseFloat(e.replace(l.decimalSign, "."));
return {
value: t,
res: !0,
suggest: this.format(t)
}
}
return {
error: this._formatterErrors.custom,
res: !1
}
}
_patchFractPart(e, t) {
const i = {
0: 0,
5: 1
},
s = {
0: 0,
2: 1,
5: 2,
7: 3
};
return 2 === t ? void 0 === i[e] ? -1 : i[e] : 4 === t ? void 0 === s[e] ? -1 : s[
e] : e
}
_parseAsSingleFractional(e) {
let t = new RegExp(/^(-?)[0-9]+$/).exec(e);
if (t) {
const t = parseFloat(e);
return {
value: t,
res: !0,
suggest: this.format(t)
}
}
if (t = new RegExp("^(-?)([0-9]+)\\" + l.decimalSignFractional + "([0-9]+)$").exec(
e), t) {
const e = !!t[1],
i = parseInt(t[2]),
s = this._priceScale,
r = this._patchFractPart(parseInt(t[3]), s);
if (r >= s || r < 0) return {
error: this._formatterErrors.fraction,
res: !1
};
let n = i + r / s;
return e && (n = -n), {
value: n,
res: !0,
suggest: this.format(n)
}
}
return {
error: this._formatterErrors.custom,
res: !1
}
}
_parseAsDoubleFractional(e) {
let t = new RegExp(/^(-?)[0-9]+$/).exec(e);
if (t) {
const t = parseFloat(e);
return {
value: t,
res: !0,
suggest: this.format(t)
}
}
if (t = new RegExp("^(-?)([0-9]+)\\" + l.decimalSignFractional + "([0-9]+)\\" + l
.decimalSignFractional + "([0-9]+)$").exec(e), t) {
const e = !!t[1],
i = parseInt(t[2]),
s = void 0 !== this._minMove2 ? this._minMove2 : NaN,
r = this._priceScale / s,
n = this._minMove2,
o = this._patchFractPart(parseInt(t[3]), r),
a = this._patchFractPart(parseInt(t[4]), n);
if (o >= r || o < 0) return {
error: this._formatterErrors.fraction,
res: !1
};
if (void 0 !== n && a >= n || a < 0) return {
error: this._formatterErrors.secondFraction,
res: !1
};
let l = void 0 !== n ? i + o / r + a / (r * n) : NaN;
return e && (l = -l), {
value: l,
res: !0,
suggest: this.format(l)
}
}
return {
error: this._formatterErrors.custom,
res: !1
}
}
}
},
krs7: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("O+9b"),
n = i("ocLq"),
o = i("KG+6"),
a = i("LxhU"),
l = i("8LSp"),
c = i("aR4w"),
h = i("WYmP");
class u extends c.a {
constructor(e, t, i, s, r, n, o, a, l, c, u) {
super(e, t, i, n, new h.a, o, !0, a, l, () => c, u, s, r, !1), this
._firstBarTime = s, this._lastBarTime = r
}
update(e) {
this._supplyRowsLayout(this._ctx), this.timeInRequestedRange(e) && super.update(
e)
}
timeInRequestedRange(e) {
const t = this._timeScale().get(e);
return this._firstBarTime <= t && t < this._lastBarTime
}
}
var d = i("iu9X"),
p = i("c7G1"),
_ = i("hXqA"),
m = i("WTyR"),
f = i("rWtV");
i.d(t, "VolumeProfileVisibleRange", (function() {
return g
})), i.d(t, "volumeProfileVisibleRangeStudyItem", (function() {
return b
}));
class g extends r.a {
constructor() {
super(...arguments), this._rowsLayout = "Number Of Rows", this._rowSize = 24,
this._volume = "Up/Down", this._firstBarTime = 0, this._lastBarTime = 0,
this._vaVolumePercent = 70, this._anInt = 0, this._eraseCmds = []
}
nextGraphicsObjId() {
return ++this._anInt
}
pushEraseObjCmd(e, t) {
this._eraseCmds.push(new p.b(e, t))
}
popEraseCmds() {
const e = this._eraseCmds;
return this._eraseCmds = [], e
}
init(e, t) {
this._studyDataUpdate = new _.a(!0),
this._hists = new l.a, this._pocLines = new h.a, this._valueAreaHists =
new l.a;
const i = new d.b;
i.getObjsContainer("hhists").push(new d.a("histBars2", this._hists)), i
.getObjsContainer("hhists").push(new d.a("histBarsVA", this
._valueAreaHists)), i.getObjsContainer("horizlines").push(new d.a(
"pocLines", this._pocLines)), this._studyDataUpdate.init(i), this
._rowsLayout = t(0), this._rowSize = t(1), this._volume = t(2), this
._firstBarTime = t(3), this._lastBarTime = t(4), this._vaVolumePercent = t(
5), this.verifyRowSizeInput(this._rowSize, this._rowsLayout), this
._originalResolution = a.Interval.parse(e.symbol.interval + e.symbol
.resolution);
const n = this._lastBarTime + this._originalResolution.inMilliseconds(this
._lastBarTime);
0 === this._firstBarTime && 0 === this._lastBarTime ? this._basicResolution =
this._originalResolution : this._basicResolution = this
.findBasicResolutionForFromTo(this._originalResolution, this._firstBarTime,
n, Object(s.ensureDefined)(e.symbol.info)), this._hasSecondarySymbol = !
this._originalResolution.isEqualTo(this._basicResolution), this
._hasSecondarySymbol && e.new_sym(e.symbol.tickerid, this._basicResolution
.value());
const o = this._getRowsLayout(this._rowsLayout, this._rowSize);
this._vbPCheckHaveVolumeExpr = new m.a(this), this._volumeByPriceExpr = new u(
Object(r.c)(this._volume), e, this, this._firstBarTime, n, this._hists,
this._pocLines, this._valueAreaHists, this._vaVolumePercent, o, Object(r
.b)()), this._volumeByPriceExpr.setIdsGeneratorProxy(this), this
._developingPocSeries = new f.a, this._developingVAHighSeries = new f.a,
this._developingVALowSeries = new f.a
}
main(e, t, i) {
this._hasSecondarySymbol && e.select_sym(1), this._timeSeries = e
.new_unlimited_var(), this._openSeries = e.new_unlimited_var(), this
._highSeries = e.new_unlimited_var(), this._lowSeries = e
.new_unlimited_var(), this._closeSeries = e.new_unlimited_var(), this
._volumeSeries = e.new_unlimited_var();
const r = {
type: "composite",
data: []
};
if (i && i.period === this._basicResolution.value() && (this._timeSeries.set(n
.Std.time(e)), this._openSeries.set(n.Std.open(e)), this._highSeries
.set(n.Std.high(e)), this._lowSeries.set(n.Std.low(e)), this
._closeSeries.set(n.Std.close(e)), this._volumeSeries.set(n.Std.volume(
e)), this._developingPocSeries.addHist(n.Std.time(e)), this
._developingVAHighSeries.addHist(n.Std.time(e)), this
._developingVALowSeries.addHist(n.Std.time(e)), this
._vbPCheckHaveVolumeExpr.update(0, e.symbol.isLastBar), this
._volumeByPriceExpr.update(0), this._developingPocSeries
.removeLastIfNaN(), this._developingVAHighSeries.removeLastIfNaN(), this
._developingVALowSeries.removeLastIfNaN(), e.symbol.isLastBar)) {
this._studyDataUpdate.setEraseCmds(this.popEraseCmds()), this
._studyDataUpdate.update();
const e = this._studyDataUpdate.getUpdate();
e.json && r.data.push({
nonseries: !0,
type: "study_graphics",
data: e.json
}), e.jsonUpdate && r.data.push({
nonseries: !0,
type: "study_graphics",
data: e.jsonUpdate
})
}
if (this._hasSecondarySymbol && e.select_sym(0), i && i.period === this
._originalResolution.value()) {
Object(s.assert)(e.symbol.time === i.time);
const t = i.time,
n = t + this._originalResolution.inMilliseconds(t) - 1;
if (t && t >= this._firstBarTime) {
const e = this._developingPocSeries.getLeftOrEqual(n),
t = this._developingVAHighSeries.getLeftOrEqual(n),
i = this._developingVALowSeries.getLeftOrEqual(n);
r.data.push([e, t, i])
} else r.data.push([NaN, NaN, NaN])
}
return r
}
time() {
return this._timeSeries
}
open() {
return this._openSeries
}
high() {
return this._highSeries
}
low() {
return this._lowSeries
}
close() {
return this._closeSeries
}
volume() {
return this._volumeSeries
}
developingPoc() {
return this._developingPocSeries
}
developingVAHigh() {
return this._developingVAHighSeries
}
developingVALow() {
return this._developingVALowSeries
}
}
const b = {
constructor: g,
name: "Volume Profile Visible Range",
metainfo: {
_metainfoVersion: 51,
id: "VbPVisible@tv-basicstudies-49",
description: "Volume Profile Visible Range",
shortDescription: "VPVR",
format: {
type: "volume"
},
is_price_study: !0,
linkedToSeries: !0,
palettes: {},
inputs: [{
id: "rowsLayout",
name: "Rows Layout",
defval: "Number Of Rows",
options: ["Number Of Rows", "Ticks Per Row"],
type: "text"
}, {
id: "rows",
name: "Row Size",
defval: 24,
max: 1e6,
min: 1,
type: "integer"
}, {
id: "volume",
name: "Volume",
defval: "Up/Down",
options: ["Up/Down", "Total"],
type: "text"
}, {
id: "first_visible_bar_time",
name: "First Visible Bar Time",
defval: 0,
isHidden: !0,
max: 253370764800,
min: -253370764800,
type: "time"
}, {
id: "last_visible_bar_time",
name: "Last Visible Bar Time",
defval: 0,
isHidden: !0,
max: 253370764800,
min: -253370764800,
type: "time"
}, {
id: "vaVolume",
name: "Value Area Volume",
defval: 70,
max: 100,
min: 0,
type: "integer"
}],
plots: [{
id: "developingPoc",
type: "line"
}, {
id: "developingVAHigh",
type: "line"
}, {
id: "developingVALow",
type: "line"
}],
graphics: {
hhists: {
histBars2: {
location: o.b.Relative,
title: "Volume Profile",
titles: ["Up Volume", "Down Volume"]
},
histBarsVA: {
location: o.b.Relative,
title: "Value Area",
titles: ["Value Area Up", "Value Area Down"]
}
},
horizlines: {
pocLines: {
name: "POC",
showPrice: !0
}
}
},
defaults: {
graphics: {
hhists: {
histBars2: {
colors: ["#1592e6", "#fbc123"],
direction: o.a.RightToLeft,
percentWidth: 30,
showValues: !1,
transparencies: [76, 76],
valuesColor: "#424242",
visible: !0
},
histBarsVA: {
colors: ["#1592e6", "#fbc123"],
direction: o.a.RightToLeft,
percentWidth: 30,
showValues: !1,
transparencies: [30, 30],
valuesColor: "#424242",
visible: !0
}
},
horizlines: {
pocLines: {
color: "#ff0000",
style: 0,
visible: !0,
width: 2
}
}
},
inputs: {
first_visible_bar_time: 0,
last_visible_bar_time: 0,
rows: 24,
rowsLayout: "Number Of Rows",
vaVolume: 70,
volume: "Up/Down"
},
styles: {
developingPoc: {
color: "#ff0000",
linestyle: 0,
linewidth: 1,
plottype: 9,
trackPrice: !1,
transparency: 0,
visible: !1
},
developingVAHigh: {
color: "#0000ff",
linestyle: 0,
linewidth: 1,
plottype: 9,
trackPrice: !1,
transparency: 0,
visible: !1
},
developingVALow: {
color: "#0000ff",
linestyle: 0,
linewidth: 1,
plottype: 9,
trackPrice: !1,
transparency: 0,
visible: !1
}
}
},
styles: {
developingPoc: {
histogramBase: 0,
title: "Developing Poc"
},
developingVAHigh: {
histogramBase: 0,
title: "Developing VA High"
},
developingVALow: {
histogramBase: 0,
title: "Developing VA Low"
}
}
}
}
},
"l+oz": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ChartSaverBase", (function() {
return s
}));
class s {
constructor(e) {
this._chartWidgetCollection = e
}
_getCommonSavingInfo(e) {
const t = this._chartWidgetCollection,
i = this._chartWidgetCollection.chartsSymbols(),
s = i[t.activeChartWidget.value().id()],
r = {
...(n = s, {
...n,
legs: JSON.stringify(null !== (o = n.legs) && void 0 !== o ? o : [])
})
};
var n, o;
const a = t.metaInfo;
return a.id.value() && (r.id = a.id.value()), r.name = a.name.value() || "", r
.description = a.description.value() || "", r.charts_symbols = function(e) {
const t = {};
for (const i of Object.keys(e)) t[i] = {
symbol: e[i].symbol
};
return JSON.stringify(t)
}(i), r.is_realtime = r.is_realtime = e ? "0" : "1", r
}
}
},
l4sv: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "HorizontalLineRenderer", (function() {
return a
}));
var s = i("VdBB"),
r = i("jFln"),
n = i("gAom"),
o = i("Zp/P");
class a {
constructor() {
this._data = null, this._hitTest = new s.HitTestResult(s.HitTestResult.REGULAR)
}
setData(e) {
this._data = e
}
setHitTest(e) {
this._hitTest = e
}
hitTest(e) {
if (null === this._data || !1 === this._data.visible) return null;
const t = Object(o.interactionTolerance)().line,
i = Math.abs(e.y - this._data.y) <= t + this._data.linewidth / 2,
s = void 0 === this._data.left || this._data.left - e.x <= t,
r = void 0 === this._data.right || e.x - this._data.right <= t;
return i && s && r ? this._hitTest : null
}
draw(e, t) {
if (null === this._data) return;
if (!1 === this._data.visible) return;
if (this._data.y < -this._data.linewidth / 2 || this._data.y > t.cssHeight + this
._data.linewidth / 2) return;
const i = t.pixelRatio;
e.lineCap = "butt", e.strokeStyle = this._data.color, e.lineWidth = Math.max(1, Math
.floor(this._data.linewidth * i)), void 0 !== this._data.linestyle &&
Object(r.setLineStyle)(e, this._data.linestyle);
const s = void 0 !== this._data.left ? Math.max(this._data.left, 0) : 0,
o = void 0 !== this._data.right ? Math.min(this._data.right, t.cssWidth) : t
.cssWidth,
a = Math.round(this._data.y * i),
l = Math.floor(s * i),
c = Math.ceil(o * i);
Object(n.drawHorizontalLine)(e, a, l, c)
}
}
},
l7y7: function(e, t) {
e.exports =
''
},
lA7n: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Kxc7"),
r = i("ulZB");
class n extends r.b {
constructor(e, t) {
super(e, t, "FAVORITE_CHARTS_CHANGED", "loadChartDialog.favorites", {})
}
}
var o = i("zUrt"),
a = i("FBuY"),
l = i("Vdly"),
c = i("/z0S"),
h = i("sQaR");
i.d(t, "LoadChartService", (function() {
return u
}));
class u extends h.a {
constructor(e = null) {
super(), this._favoriteChartsService = new n(a.TVXWindowEvents, l), this
._chartWidgetCollection = null, this._promise = null, this._dialog = null,
this._subscribe = e => {
this._setVisibility(e)
}, this._getChartEntry = e => ({
id: e.id,
url: e.url,
title: e.name,
symbol: e.short_symbol,
interval: e.interval,
toolsCount: 0,
modified: e.modified_iso,
active: () => this._isActiveChart(e.id),
openAction: () => o.backend.loadChart(e),
deleteAction: () => o.backend.removeChart(e.image_url).then(() =>
this._deleteChart(e.id)),
favoriteAction: this._updateFavorites
}), this._updateFavorites = e => this._favoriteChartsService.set(e), this
._isActiveChart = e => null !== this._chartWidgetCollection && e === this
._chartWidgetCollection.metaInfo.id.value(), this._deleteChart = e => {
this._isActiveChart(e) && (s.enabled("saveload_storage_customization") ?
null !== this._chartWidgetCollection && this
._chartWidgetCollection.clearChartMetaInfo() : location.href =
"/chart/" + location.search)
}, this._chartWidgetCollection = e
}
showLoadDialog() {
Object(c.a)(this._showLoadDialog.bind(this), {
source: "Load chart",
sourceMeta: "Chart"
})
}
show() {
this.showLoadDialog()
}
hide() {
var e, t;
null === (e = this._dialog) || void 0 === e || e.hide(), null === (t = this
._dialog) || void 0 === t || t.visible().unsubscribe(this._subscribe)
}
_showLoadDialog() {
(s.enabled("saveload_requires_authentication") && !window.is_authenticated ?
Promise.resolve([]) : o.backend.getCharts()).then(e => e.map(this
._getChartEntry)).then(e => {
const t = this._promise = Promise.all([i.e("redux"), i.e("react"), i
.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(12),
i.e(19), i.e(22), i.e(24), i.e(63), i.e(80), i.e(0), i
.e(2), i.e(5), i.e(7), i.e(10), i.e(18), i.e(20), i.e(
56), i.e("load-chart-dialog")
]).then(i.bind(null, "EgWQ")).then(i => {
if (this._promise === t) {
this._dialog && (this._dialog.hide(), this._dialog
.visible().unsubscribe(this._subscribe));
const t = {
charts: e,
favoriteChartsService: this
._favoriteChartsService,
chartWidgetCollection: this
._chartWidgetCollection
};
this._dialog = new i.LoadChartDialogRenderer(t),
this._dialog.visible().subscribe(this
._subscribe), this._dialog.show()
}
})
})
}
}
},
lCO3: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "Version", (function() {
return r
}));
var s = i("Eyy1");
class r {
constructor(e, t) {
this._major = e, this._minor = t
}
major() {
return this._major
}
minor() {
return this._minor
}
isZero() {
return 0 === this._major && 0 === this._minor
}
toString() {
return this._major + "." + this._minor
}
compareTo(e) {
return this._major < e._major ? -1 : this._major > e._major ? 1 : this._minor < e
._minor ? -1 : this._minor > e._minor ? 1 : 0
}
isLess(e) {
return this.compareTo(e) < 0
}
isLessOrEqual(e) {
return this.compareTo(e) <= 0
}
isEqual(e) {
return 0 === this.compareTo(e)
}
isGreater(e) {
return this.compareTo(e) > 0
}
isGreaterOrEqual(e) {
return this.compareTo(e) >= 0
}
static parse(e) {
if (e instanceof r) return new r(e.major(), e.minor());
if ("number" == typeof e) return Object(s.assert)(Math.floor(e) === e,
"Version should not be a float number"), new r(e, 0);
if ("string" == typeof e) {
const t = e.split(".");
if (1 === t.length) {
const i = parseInt(t[0], 10);
return Object(s.assert)(!isNaN(i), "Bad version string: " + e), new r(i, 0)
}
if (2 === t.length) {
const i = parseInt(t[0], 10);
Object(s.assert)(!isNaN(i), "Bad version string: " + e);
const n = parseInt(t[1], 10);
return Object(s.assert)(!isNaN(n), "Bad version string: " + e), new r(i, n)
}
throw new Error("Bad version string (one dot expected): " + e)
}
throw new Error("Bad version: " + e)
}
}
r.ZERO = new r(0, 0)
},
lJvs: function(e, t, i) {
"use strict";
var s = i("aO4+").Point,
r = i("vAx0").ESDPaneView,
n = i("fTGZ").BarsMarksContainer,
o = i("mMWL"),
a = i("FQhm"),
l = i("zDbI").CHART_FONT_FAMILY,
c = i("Tmoa").generateColor,
h = i("XlJ7").makeFont;
class u extends r {
constructor(e, t, i) {
super(e, t, i), this.source = t, this.stylesCache = {}, this.templatesCache = {},
this._lollipops = {}, this._lollipopsCounter = 0, this._itemIndexToId = new Map,
this._createLollipops()
}
_createLollipops() {
var e = this.source._model.timeScale(),
t = r.prototype._getY.call(this.source),
i = this.source._model.lastHittestData(),
n = this.source._model.hoveredSource(),
o = this;
Object.keys(this.source._marks).forEach((function(r) {
var a = this.source._marks[r],
l = a.id,
c = a.index;
if (null !== c) {
var h = l === o.getLastClickedLollipopId(),
u = void 0 !== o._lollipops[l] ? o._lollipops[l].itemIndex :
o._lollipopsCounter++;
o._itemIndexToId.has(u) || o._itemIndexToId.set(u, l);
var d = n === this.source && null !== i && i.activeItem === u;
o._lollipops[l] = {
id: l,
itemIndex: u,
basePoint: new s(e.indexToCoordinate(c) + 1, t),
hovered: d,
active: h,
barY: null,
label: a.label,
color: a.color,
items: a.tooltip,
visible: !0
}
}
}), this), r.prototype._createRenderers.call(this)
}
createTooltipContent(e) {
return e.items ? {
title: e.items[0],
subTitle: e.items[1],
style: {
color: e.color
}
} : null
}
clearCaches() {
this.clearLastClicked(), this._lollipops = {}, this._lollipopsCounter = 0
}
update() {
this._createLollipops(), this._invalidated = !1
}
renderer() {
return this.update(), r.prototype.renderer.call(this)
}
_generateStyle(e, t, i) {
var s = e + t + i;
if (!(s in this.stylesCache)) {
var r = "hovered" === e,
n = "active" === e,
o = r || n,
a = "white";
n ? a = t : r && (a = c(t, 85)) === t && (n = !0);
var u = {
strokeStyle: t,
lineWidth: 1,
fillStyle: "white",
barLine: {
lineStyle: CanvasEx.LINESTYLE_DASHED
},
lollipop: {
width: 23,
height: 23,
lineWidth: 1.5,
bottom: 2,
fillStyle: a,
fillCircle: o,
strokeStyle: t,
text: {
label: i,
strokeStyle: n ? "white" : t,
font: h(12, l)
}
}
};
this.stylesCache[s] = u
}
return this.stylesCache[s]
}
getStyle(e) {
var t = e.active ? "active" : e.hovered ? "hovered" : "default";
return this._generateStyle(t, e.color, e.label)
}
createText(e, t) {
"string" == typeof e.items ? t.addTextLine(e.items) : Array.isArray(e.items) && e
.items.forEach((function(e) {
t.addTextLine(e)
}))
}
hasTooltip(e) {
return e.items && e.items.length
}
_getLollipopIdByIndex(e) {
return this._itemIndexToId.get(e)
}
}
e.exports = class extends n {
constructor(e) {
super(e), this.toolname = "UserDefinedTimescaleMarks";
var t = this;
o.hideMarksOnBars().subscribe(this, (function() {
t._properties.visible.setValue(!o.hideMarksOnBars().value())
})), this._paneView = new u(e, this, this._showTooltip.bind(this)), this
._requestedPointsets = new Set
}
_initialize(e) {
this._properties.visible.setValue(!0)
}
userEditEnabled() {
return !1
}
_plateViewData(e) {
return {
text: e.text
}
}
onClicked(e) {
var t = this._paneView._getLollipopIdByIndex(e.activeItem);
a.emit("onTimescaleMarkClick", t)
}
clearMarks() {
var e = this._model.chartApi();
if (e.connected()) {
var t = this;
Object.keys(this._marks).forEach((function(i) {
var s = t._getPointsetId(i);
e.removePointset(s)
}))
}
this._requestedPointsets.clear(), super.clearMarks(), this._paneView
.clearCaches(), this.onNeedRepaint.fire()
}
_getData(e) {
var t = this._model.mainSeries().symbolInfo();
if (t) {
var i = this.roundRange(this._rangeDifference(e)),
s = this,
r = this._model.mainSeries(),
n = r.seriesSource().symbolInstanceId(),
o = r.properties().interval.value();
ChartApiInstance.getTimescaleMarks(t, i.start, i.end, (function(t) {
var i = s._model.chartApi();
t.forEach((function(e) {
e.index = null;
var t = e.id,
r = s._getPointsetId(t),
a = s._marks[t];
if (a && null !== a.index && (a.tickmark ===
e.tickmark ? e.index = a.index : s
._requestedPointsets.has(r) && i
.connected() && (i.removePointset(
r), s._requestedPointsets
.delete(r))), s._marks[t] = e,
null === e.index && i.connected()) {
s._requestedPointsets.add(r);
var l = [
[e.tickmark, 0]
];
i.createPointset(r, "turnaround", n, o,
l, (function(e) {
s._onPointsetData(e)
}))
}
}), s), s._loadedRange = s._rangeUnion(e, s
._loadedRange), s.onNeedRepaint.fire()
}), o)
}
}
_getPointsetId(e) {
return "pointsetMark_" + e
}
_onPointsetData(e) {
var t = e.params.customId.split("_")[1],
i = this._marks[t],
s = e.params.plots;
i && 1 === s.length && (i.index = s[0].value[0])
}
updatePlateData(e, t) {
return t.barWidth = this.barWidth(), t.text = e.text, t.tooltipMargin = -1 *
Math.max(e.minSize / 2, .4 * this.barWidth()), t
}
hasContextMenu() {
return !1
}
paneViews() {
return this._properties.visible.value() ? [this._paneView] : []
}
_showTooltip(e, t) {
var s = t();
if (s) {
var r = this._model.timeScale(),
n = [r.onScroll(), r.barSpacingChanged(), this._model.mainSeries()
.onSymbolIntervalChanged()
],
o = this.onClickOutside.bind(this);
return Promise.all([i.e("react"), i.e(6), i.e(11), i.e(90), i.e(0), i.e(5),
i.e("lollipop-tooltip-renderer")
]).then(i.bind(null, "qKHM")).then((function({
showLollipopTooltip: t
}) {
t({
items: s,
position: e,
customCloseSubscriptions: n,
onClose: o,
onClickOutside: o
})
}))
}
}
onClickOutside(e) {
this._paneView.onClickOutside(e)
}
}
},
"lNN+": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolTrianglePattern", (function() {
return o
}));
var s = i("Ocx9"),
r = i("Ss5c"),
n = i("j3hX");
class o extends r.LineDataSource {
constructor(e, t) {
const s = t || o.createProperties();
super(e, s), i.e("lt-pane-views").then(i.bind(null, "Jej9")).then(t => {
this._setPaneViews([new t.LineToolTrianglePatternPaneView(this, e)])
})
}
pointsCount() {
return 4
}
name() {
return "Triangle Pattern"
}
properties() {
return super.properties()
}
static createProperties(e) {
const t = new s.DefaultProperty("linetooltrianglepattern", e);
return o._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "/HOw")).then(
e => e.PatternWithBackgroundDefinitionViewModel)
}
static _configureProperties(e) {
r.LineDataSource._configureProperties(e), e.addChild("linesColors", new n
.LineToolColorsProperty([e.childs().color])), e.addChild("textsColors",
new n.LineToolColorsProperty([e.childs().textcolor])), e.addChild(
"backgroundsColors", new n.LineToolColorsProperty([e.childs()
.backgroundColor
]))
}
}
},
lReN: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolsGroupControllerApi", (function() {
return o
}));
var s = i("s1Gx"),
r = i("Eyy1"),
n = i("CW80");
class o {
constructor(e, t) {
this._controller = e, this._model = t
}
createGroupFromSelection() {
return this._controller.createGroupFromSelection().id
}
removeGroup(e) {
const t = Object(r.ensureDefined)(this._groupById(e));
this._controller.removeGroup(t)
}
groups() {
return this._controller.groups().map(e => e.id)
}
shapesInGroup(e) {
const t = Object(r.ensureDefined)(this._groupById(e));
return Object(s.sortSources)(t.lineTools()).map(e => e.id())
}
excludeShapeFromGroup(e, t) {
const i = Object(r.ensureDefined)(this._groupById(e)),
s = Object(r.ensureNotNull)(this._model.dataSourceForId(t));
Object(r.assert)(Object(n.isLineTool)(s), "Passed shapeId is not a line tool"), this
._controller.excludeLineToolFromGroup(i, s)
}
availableZOrderOperations(e) {
const t = Object(r.ensureDefined)(this._groupById(e));
return this._controller.availableZOrderOperations(t)
}
bringToFront(e) {
const t = Object(r.ensureDefined)(this._groupById(e));
this._controller.bringToFront(t)
}
bringForward(e) {
const t = Object(r.ensureDefined)(this._groupById(e));
this._controller.bringForward(t)
}
sendBackward(e) {
const t = Object(r.ensureDefined)(this._groupById(e));
this._controller.sendBackward(t)
}
sendToBack(e) {
const t = Object(r.ensureDefined)(this._groupById(e));
this._controller.sendToBack(t)
}
insertAfter(e, t) {
const i = Object(r.ensureDefined)(this._groupById(e)),
s = Object(r.ensureNotNull)(this._groupById(t) || this._model.dataSourceForId(
t));
this._controller.insertAfter(i, s)
}
insertBefore(e, t) {
const i = Object(r.ensureDefined)(this._groupById(e)),
s = Object(r.ensureNotNull)(this._groupById(t) || this._model.dataSourceForId(
t));
this._controller.insertBefore(i, s)
}
groupVisibility(e) {
return Object(r.ensureDefined)(this._groupById(e)).visibility()
}
setGroupVisibility(e, t) {
const i = Object(r.ensureDefined)(this._groupById(e));
this._controller.setGroupVisibility(i, t)
}
groupLock(e) {
return Object(r.ensureDefined)(this._groupById(e)).locked()
}
setGroupLock(e, t) {
const i = Object(r.ensureDefined)(this._groupById(e));
this._controller.setGroupLock(i, t)
}
getGroupName(e) {
return Object(r.ensureDefined)(this._groupById(e)).name()
}
setGroupName(e, t) {
const i = Object(r.ensureDefined)(this._groupById(e));
this._controller.setGroupName(i, t)
}
canBeGroupped(e) {
const t = e.map(e => Object(r.ensureNotNull)(this._model.dataSourceForId(e)));
return !t.some(e => !Object(n.isLineTool)(e)) && this._controller.canBeGroupped(t)
}
_groupById(e) {
return this._controller.groups().find(t => t.id === e)
}
}
},
lUQk: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("qFKp"),
n = i("JWMC"),
o = i("FQhm"),
a = i("txPx"),
l = i("7ktv"),
c = i("XPit"),
h = i("tc+8"),
u = i.n(h),
d = i("n5al"),
p = i("kcTO"),
_ = i("dfhE"),
m = i("nBJD"),
f = i("YFKU"),
g = i("Kxc7"),
b = i.n(g),
v = i("hOqT"),
S = i("X0WL"),
y = i("xDuj");
const w = b.a.enabled("hide_resolution_in_legend");
function P(e) {
const t = "QUANDL" === (e = e || {}).exchange,
i = {
symbolDescription: "",
interval: "",
exchange: "",
chartStyle: "",
sessionDescription: "",
provider: "",
ticker: ""
};
if (e.description && t)
if (2 === e.description.split("/").length) i.symbolDescription = e.description.split(
"/")[1];
else {
e.description.split("'").filter(e => e.length).forEach(e => {
let t = [];
t = e && ("/" === e[0] || /\d+\/\(?/.test(e)) ? [e] : e.split("/")
.filter(e => e.length), i.symbolDescription += t[2 === t.length ?
1 : 0]
})
}
else e.description ? i.symbolDescription = e.description : i.symbolDescription = e.symbol;
if (e.interval && (i.interval = Object(y.translatedIntervalString)(e.interval)), t && e
.description) {
const t = /[\w_]+\/[\w_]+/.exec(e.description);
t && t[0] ? i.provider = t[0].split("/")[0] : i.provider = e.description.split("/")[0]
}
return e.exchange && (i.exchange = e.exchange), i.chartStyle = function(e) {
return e.inputs, 8 === e.style ? window.t("Heikin Ashi") : ""
}(e), e.sessionDescription && (i.sessionDescription = e.sessionDescription), e.ticker &&
(i.ticker = e.ticker), i
}
const C = Object(f.t)("Symbol Error"),
x = g.enabled("hide_unresolved_symbols_in_legend");
class T extends S.a {
constructor(e, t, i, s) {
super(t), this._series = e, this._statusViewProperties = i, this._options = s ||
{}
}
text() {
return function(e) {
const t = P(e);
return (t.symbolDescription + (t.interval ? ", " + t.interval : "") +
function(e, t = ", ") {
return (e.provider ? `${t}${e.provider}` : "") + (e
.exchange ? `${t}${e.exchange}` : "") + (e
.chartStyle ? `${t}${e.chartStyle}` : "") + (e
.sessionDescription ?
`${t}${e.sessionDescription}` : "")
}(t)).replace(/'/g, "")
}(this._getTitleGenerationOptions())
}
getSplitTitle() {
return function(e) {
const t = P(e),
i = t.symbolDescription.replace(/'/g, ""),
s = function(e) {
const t = [];
e.provider && t.push(e.provider);
e.exchange && t.push(e.exchange);
e.chartStyle && t.push(e.chartStyle);
e.sessionDescription && t.push(e.sessionDescription);
return t
}(t).map(e => e.replace(/'/g, "")),
r = [];
return t.ticker && r.push(t.ticker), r.push(i), w || r.push(t
.interval || ""), r.push(...s), r
}(this._getTitleGenerationOptions())
}
bold() {
return !1
}
size() {
return this._statusViewProperties.childs().fontSize.value() + "px"
}
errorStatus() {
const e = this._series.seriesErrorMessage();
return null !== e ? {
error: e,
title: C
} : null
}
_getTitleGenerationOptions() {
const e = this._series.symbolInfo(),
t = this._statusViewProperties.childs().symbolTextSource.value();
return {
description: "ticker" === t ? e && e.name || void 0 : Object(v
.getTranslatedSymbolDescription)({
pro_name: e && e.pro_name || void 0,
short_name: e && e.name || void 0,
description: e && e.description || void 0,
short_description: e && e.short_description || void 0,
local_description: e && e.local_description || void 0,
language: e && e.language || void 0
}),
exchange: this._statusViewProperties.childs().showExchange.value() && e && e
.exchange || void 0,
symbol: x && null === e ? "" : this._series.symbol(),
interval: this._statusViewProperties.childs().showInterval.value() && !this
._options.hideResolution ? this._series.interval() : void 0,
style: this._series.properties().childs().style.value(),
inputs: this._series.getInputsProperties().state(),
boxSize: this._series.data().boxSize,
reversalAmount: this._series.data().reversalAmount,
ticker: "ticker-and-description" === t ? e && e.name || void 0 : ""
}
}
}
class I extends m.a {
constructor(e, t, i) {
super(new T(e, t, i)), this._invalidated = !0, this._series = e, this._series
.onRestarted().subscribe(this, this.update), this._series.dataEvents()
.symbolResolved().subscribe(this, this.update), this._series.dataEvents()
.completed().subscribe(this, this.update), this._series.boxSizeValue()
.subscribe(this.update.bind(this)), i.childs().symbolTextSource.listeners()
.subscribe(this, this.update)
}
getSeriesPrecision() {
let e = 4;
const t = this._series.symbolInfo();
return t && t.pricescale && (e = Math.round(Math.log(t.pricescale) / Math.log(
10))), e
}
round(e) {
const t = this.getSeriesPrecision(),
i = Math.round(e * Math.pow(10, t)) / Math.pow(10, t);
return i ? i.toString() : ""
}
update() {
this._invalidated = !0
}
text() {
return this._updateImpl(), super.text()
}
color() {
return this._updateImpl(), super.color()
}
bold() {
return this._updateImpl(), super.bold()
}
size() {
return this._updateImpl(), super.size()
}
getSplitTitle() {
return this._updateImpl(), this._statusProvider.getSplitTitle()
}
_updateImpl() {
this._invalidated && (this._bold = this._statusProvider.bold(), this._size =
this._statusProvider.size(), this._text = this._statusProvider.text(),
this._invalidated = !1)
}
}
var M = i("4miz"),
O = i("mMWL"),
L = i("6I19"),
A = i("CW80");
const E = r.CheckMobile.any(),
k = b.a.enabled("hide_resolution_in_legend");
class D extends M.b {
constructor(e, t) {
super(), this._invalidated = !0, this._series = e, this._model = t, this
._valuesProvider = this._createValuesProvider(e, t), this._items = this
._valuesProvider.getItems().map(e => new M.a(e.title, "")), this.update()
}
update() {
this._invalidated = !0
}
items() {
return this._invalidated && (this._updateImpl(), this._invalidated = !1), this
._items
}
series() {
return this._series
}
_updateImpl() {
const e = this._series.symbolInfo();
if (e) {
const t = [e.name];
k || t.push(Object(y.translatedIntervalString)(this._series.interval())), t
.push(e.exchange), this._header = t.join(", "), this._title = e
.description
} else this._header = this._series.symbol();
const t = this._model.crossHairSource().appliedIndex(),
i = this._valuesProvider.getValues(t);
for (let e = 0; e < i.length; ++e) {
const t = i[e],
s = this._items[e];
s.setValue(t.value), s.setVisible(t.visible), s.setColor(t.color)
}
}
_createValuesProvider(e, t) {
return new L.a(e, t)
}
_showLastPriceAndChangeOnly() {
return E && (null === this._model.crossHairSource().pane || Object(A
.isLineToolName)(O.tool.value()) || null !== this._model
.lineBeingEdited())
}
}
const V = {
open: Object(f.t)("O", {
context: "in_legend"
}),
high: Object(f.t)("H", {
context: "in_legend"
}),
low: Object(f.t)("L", {
context: "in_legend"
}),
close: Object(f.t)("C", {
context: "in_legend"
}),
hl2: Object(f.t)("HL2", {
context: "in_legend"
}),
hlc3: Object(f.t)("HLC3", {
context: "in_legend"
}),
ohlc4: Object(f.t)("OHLC4", {
context: "in_legend"
})
};
class B extends L.a {
constructor(e, t) {
super(e, t), this._showBarChange = t.properties().paneProperties
.legendProperties.showBarChange, this._showSeriesOHLC = t.properties()
.paneProperties.legendProperties.showSeriesOHLC, this._seriesStyle = e
.properties().childs().style, this._emptyValues[0].title = V.open, this
._emptyValues[1].title = V.high, this._emptyValues[2].title = V.low, this
._emptyValues[3].title = V.close, this._emptyValues[6].title = "", this
._emptyValues[4].title = ""
}
getValues(e) {
const t = super.getValues(e),
i = this._showSeriesOHLC.value(),
s = this._showBarChange.value(),
r = 12 === this._series.style(),
n = t[6];
if (n.visible = n.visible && s && !r, this._showLastPriceAndChangeOnly()) {
const e = t[5];
return e.visible = e.visible && i, t
}
const o = Object(d.isPriceSourceStyle)(this._seriesStyle.value()),
a = i && !o,
l = i && o;
return t[0].visible = a && !r, t[1].visible = a, t[2].visible = a, t[3]
.visible = a && !r, t[4].visible = l, t
}
}
const R = window.t("At close");
class N extends D {
constructor(e, t) {
super(e, t), this._showBarChange = t.properties().paneProperties.legendProperties
.showBarChange, this._showSeriesOHLC = t.properties().paneProperties
.legendProperties.showSeriesOHLC, this._showBarChange.subscribe(this, this
.update), this._showSeriesOHLC.subscribe(this, this.update)
}
isValuesVisible() {
return this._showSeriesOHLC.value() || this._showBarChange.value()
}
additional() {
return null
}
marketTitle() {
const e = this._series.marketStatusModel().status().value();
return this._showLastPriceAndChangeOnly() && ("pre_market" === e ||
"post_market" === e) ? R + ":" : ""
}
destroy() {
this._showBarChange.unsubscribeAll(this), this._showSeriesOHLC.unsubscribeAll(this)
}
_createValuesProvider(e, t) {
return new B(e, t)
}
}
var j = i("hY0g"),
F = i.n(j),
W = i("x2L+");
class H {
constructor(e, t) {
this._marketStatus = new F.a(null), this._lastMarketStatus = null, W.b.subscribe(
this, () => this._update()), this._quotesProvider = e, this._quotesProvider
.quotesUpdate().subscribe(this, this._update.bind(this)), this
._resetSubscription = t, this._resetSubscription.subscribe(this, this
._resetStatus)
}
destroy() {
W.b.unsubscribeAll(this), this._quotesProvider.quotesUpdate().unsubscribeAll(this),
this._resetSubscription.unsubscribeAll(this)
}
status() {
return this._marketStatus
}
_resetStatus() {
this._marketStatus.setValue(null)
}
_update(e = {}) {
void 0 !== e.values && (this._lastMarketStatus = e.values.current_session),
"market" !== this._lastMarketStatus || W.b.value() ? this._marketStatus
.setValue(this._lastMarketStatus) : this._resetStatus()
}
}
var U = i("LxhU"),
z = i("+DwS"),
G = i("8woN"),
q = i.n(G);
const Y = ["DJ", "CBOE", "JSE"];
var K = i("Cf1E");
const J = Object(a.getLogger)("Chart.Definitions.Series");
function Z(e) {
const t = [];
return ! function(e) {
return "index" === e.type && Y.includes(e.listed_exchange)
}(e) ? t.push("DelayToRealtime") : t.push("DelayNoRealtime"), t
}
function X(e, t) {
const i = [];
return void 0 !== (s = e.delay) && s > 0 ? Z(e) : function(e, t) {
return q.a.hasEodSymbols(e.full_name) || t === _.STATUS_EOD
}(e, t) ? (i.push("EOD"), i) : i;
var s
}
class $ {
constructor(e, t, i) {
this._dataUpdatedModeStatus = new F.a(null), this._symbolInfo = Object(z.a)(e
.getter, e.onChange), this._status = Object(z.a)(t.getter, t.onChange), this
._symbolInfo.subscribe(this._update.bind(this)), this._status.subscribe(this
._update.bind(this)), this._resetSubscription = i, this._resetSubscription
.subscribe(this, this._resetStatus)
}
destroy() {
this._symbolInfo.destroy(), this._status.destroy(), this._resetSubscription
.unsubscribeAll(this)
}
status() {
return this._dataUpdatedModeStatus.readonly()
}
symbolName() {
const e = this._symbolInfo.value();
return null !== e ? e.name : ""
}
time() {
const e = this._symbolInfo.value(),
t = null !== e && e.delay && e.delay > 0 ? e.delay : 900;
return Math.round(t / 60)
}
listedExchange() {
const e = this._symbolInfo.value();
return null !== e ? e.listed_exchange : ""
}
async description() {
const e = this._symbolInfo.value();
if (null === e) return "";
let t = {};
try {
t = Object(s.ensureNotNull)(await async function(e) {
return null
}())
} catch (e) {
J.logWarn("Cannot get exchange " + Object(K.a)(e))
}
return t.description || e.listed_exchange
}
exchange() {
const e = this._symbolInfo.value();
return null !== e ? e.exchange : ""
}
firstReplacedByBatsExchange() {
const e = this._symbolInfo.value();
return e && null
}
_resetStatus() {
this._dataUpdatedModeStatus.setValue(null)
}
_update() {
const e = this._symbolInfo.value();
if (null === e) return void this._dataUpdatedModeStatus.setValue(null);
const t = this._status.value();
if ("string" == typeof t) return void this._dataUpdatedModeStatus.setValue(null);
if (t === _.STATUS_LOADING || t === _.STATUS_RESOLVING) return;
const i = X(e, t);
0 !== i.length ? this._dataUpdatedModeStatus.setValue(i) : this
._dataUpdatedModeStatus.setValue(null)
}
}
var Q = i("QfUd"),
ee = i("ogJP");
class te {
constructor(e, t) {
this._dataProblem = new Q.a(null), this._quotesProvider = e, this._quotesProvider
.quotesUpdate().subscribe(this, this._update.bind(this)), this
._resetSubscription = t, this._resetSubscription.subscribe(this, this
._resetStatus)
}
destroy() {
this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._resetSubscription
.unsubscribeAll(this)
}
status() {
return this._dataProblem
}
_resetStatus() {
this._dataProblem.setValue(null)
}
_update(e) {
void 0 === e.values || void 0 === e.values.data_problem ? this._resetStatus() : this
._dataProblem.setValue(Object(ee.clone)(e.values.data_problem))
}
}
var ie = i("wOSo"),
se = i("Tmoa"),
re = i("KcY8"),
ne = i("oXaB");
function oe(e) {
return e < 10 ? "0" + e : e.toString()
}
const ae = [0, 1, 2, 3, 9, 8, 10],
le = g.enabled("force_exchange_as_title"),
ce = {
alwaysShowGlobalLast: !1,
visibleOnHistoryOnly: !1,
showCountdown: !0,
showSymbolLabel: !0
};
class he extends re.a {
constructor(e, t, i) {
super(), this._previousCountdown = "", this._source = e, this._model = t, this
._options = {
...ce,
...i
}
}
updateCountdown() {
this._countdownText() !== this._previousCountdown && (this.update(), this._model
.updateSourcePriceScale(this._source))
}
_getSource() {
return this._source
}
_getModel() {
return this._model
}
_isCountdownEnabled() {
return this._options.showCountdown
}
_countdownText() {
const e = U.Interval.parse(this._source.interval());
if (e.isDWM() || e.isTicks() || e.isSeconds() && 1 === e.multiplier())
return "";
const t = this._source.data().bars().last();
if (null === t) return "";
const i = 1e3 * Object(s.ensure)(t.value[0]),
r = U.Interval.parse(this._source.interval()).inMilliseconds(),
n = i.valueOf() + r;
let o = Math.round((n - this._currentTime()) / 1e3);
if (o <= 0) return "";
o = Math.min(o, r / 1e3);
let a = null;
o >= 3600 && (a = oe(Math.floor(o / 3600))), o %= 3600;
const l = oe(Math.floor(o / 60));
o %= 60;
const c = oe(Math.floor(o));
return null !== a ? `${a}:${l}:${c}` : `${l}:${c}`
}
_updateRendererData(e, t, i) {
if (e.visible = !1, t.visible = !1, !this._source.isVisible()) return;
const s = this._source.properties().childs();
if (12 === s.style.value()) return;
if (this._options.visibleOnHistoryOnly) {
const e = this._model.timeScale().visibleBarsStrictRange(),
t = this._source.data().last();
if (null === e || null === t || e.contains(t.index)) return
}
const r = this._model.properties().scalesProperties;
let n = r.showSeriesLastValue.value(),
o = this._isCountdownEnabled() && -1 !== ae.indexOf(s.style.value()) && s
.showCountdown.value(),
a = this._options.showSymbolLabel && r.showSymbolLabels.value();
const l = r.seriesLastValueMode.value() === ne.PriceAxisLastValueMode
.LastPriceAndPercentageValue,
c = this._source.lastValueData(void 0, this._options.alwaysShowGlobalLast);
if (c.noData) return;
const h = 8 === s.style.value();
if ((n || o || a) && h && s.haStyle.showRealLastPrice.value()) {
const e = this._source.lastValueData(void 0, !1),
t = this._source.lastValueData(void 0, !0);
e.noData || t.noData || e.index !== t.index || (n = !1, o = !1, a = !1)
}
if (n || o) {
const t = this._axisFirstLineText(c, n);
e.text = t, i.textColor = this.generateTextColor(i.background), e
.textColor = i.textColor;
const s = this._source.priceScale().isPercentage(),
r = n && l ? s ? c.formattedPriceAbsolute : c.formattedPricePercentage :
"";
e.secondLine = r, i.secondLineTextColor = i.textColor;
const a = o ? this._countdownText() : "";
this._previousCountdown = a, e.thirdLine = a, i.thirdLineTextColor = Object(
se.generateColor)(i.textColor, 25), 0 === t.length && 0 === r
.length && 0 === a.length || (e.visible = !0)
}
a && (t.text = this._paneText(a), t.visible = t.text.length > 0), i.background =
this._source.priceLineColor(c.color), i.coordinate = c.coordinate, i
.floatCoordinate = c.floatCoordinate
}
_paneText(e) {
let t = "";
const i = this._source.symbolInfo();
return le ? t = Object(d.displayedSymbolExchange)(i) : e && (t = Object(d
.displayedSymbolName)(i)), t
}
_axisFirstLineText(e, t) {
return t ? this._source.priceScale().isPercentage() ? e
.formattedPricePercentage : e.formattedPriceAbsolute : ""
}
_currentTime() {
return Date.now() + 1e3 * this._source.serverTimeOffset()
}
}
var ue = i("TmNs"),
de = i("k9/m");
class pe extends he {
lastPrice() {
return this._getSource().data().lastProjectionPrice
}
_updateRendererData(e, t, i) {
e.visible = !1, t.visible = !1;
const r = this._getModel(),
n = this._getSource(),
o = n.priceScale(),
a = r.timeScale(),
l = this.lastPrice();
if (a.isEmpty() || o.isEmpty() || void 0 === l) return;
const c = a.visibleBarsStrictRange();
if (null === c) return;
const h = c.firstBar(),
u = c.lastBar(),
d = n.data(),
p = d.search(u, de.PlotRowSearchMode.NearestLeft);
if (null === p) return;
const _ = n.nearestIndex(h, de.PlotRowSearchMode.NearestRight);
if (void 0 === _) return;
const m = n.model().properties().scalesProperties,
f = Object(s.ensureNotNull)(d.valueAt(_))[4];
let g = i.background,
b = m.showSeriesLastValue.value(),
v = !1,
S = !1,
y = !1;
const w = n.lastValueData(4, !1),
P = n.properties();
if (8 === P.style.value() && P.haStyle.showRealLastPrice.value()) {
const e = n.lastValueData(4, !0);
if (e.noData || e.color === i.background || (g = e.color), !e.noData && !w
.noData) {
const t = e.index === w.index;
v = t && m.showSymbolLabels.value(), S = m.seriesLastValueMode.value() ===
ne.PriceAxisLastValueMode.LastPriceAndPercentageValue, b = b && t, y =
t && this._isCountdownEnabled() && P.showCountdown.value()
}
} else {
g = n.barColorer().barStyle(p.index, !0).barColor
}
if (i.background = g, i.textColor = this.generateTextColor(g), i
.secondLineTextColor = i.textColor, i.thirdLineTextColor = Object(se
.generateColor)(i.textColor, 25), i.coordinate = o.priceToCoordinate(l, f),
e.visible = b || y, !w.noData) {
w.text = o.formatPrice(l, f), w.formattedPriceAbsolute = o.formatPriceAbsolute(
l), w.formattedPricePercentage = o.formatPricePercentage(l, f, !0), e
.text = this._axisFirstLineText(w, b);
const i = n.priceScale().isPercentage();
e.secondLine = b && S ? i ? w.formattedPriceAbsolute : w
.formattedPricePercentage : "", e.thirdLine = y ? this._countdownText() :
"", t.text = this._paneText(v)
}
t.visible = v
}
}
var _e = i("KtbP"),
me = i("2ijp"),
fe = i("HGP3"),
ge = i("8Uy/");
const be = {
light: {
lineStyle: ge.LINESTYLE_DOTTED,
lineWidth: 1,
textColor: fe.colorsPalette["color-cold-gray-900"],
backgroundColor: fe.colorsPalette["color-tv-blue-50"],
lineColor: fe.colorsPalette["color-cold-gray-500"]
},
dark: {
lineStyle: ge.LINESTYLE_DOTTED,
lineWidth: 1,
textColor: fe.colorsPalette["color-white"],
backgroundColor: fe.colorsPalette["color-tv-blue-a800"],
lineColor: fe.colorsPalette["color-cold-gray-500"]
}
};
function ve(e) {
return e ? be.dark : be.light
}
class Se extends me.a {
constructor(e, t, i) {
super(), this._model = e, this._isVisible = t, this._getValue = i
}
_updateImpl() {
const e = this._lineRendererData;
if (e.visible = !1, !this._isVisible.value()) return;
const t = this._model.mainSeries(),
i = t.priceScale(),
s = t.firstValue(),
r = this._getValue();
if (null === s || null === r) return;
const n = ve(this._model.isDark());
e.visible = !0, e.y = i.priceToCoordinate(r, s), e.linestyle = n.lineStyle, e
.linewidth = n.lineWidth, e.color = n.lineColor
}
}
class ye extends re.a {
constructor(e, t, i, s) {
super(), this._model = e, this._label = t, this._isVisible = i, this._getValue =
s
}
_updateRendererData(e, t, i) {
if (e.visible = !1, t.visible = !1, !this._isVisible.value()) return;
const s = this._model.mainSeries(),
r = s.priceScale(),
n = s.firstValue(),
o = this._getValue();
if (null === n || null === o) return;
const a = ve(this._model.isDark());
e.visible = !0, t.visible = !0, e.text = r.formatPriceAbsolute(o), t.text = this
._label, i.coordinate = r.priceToCoordinate(o, n), i.background = a
.backgroundColor, i.textColor = a.textColor
}
}
class we extends ue.PriceLineAxisView {
constructor(e, t, i) {
super(), this._model = e, this._isLineVisible = t, this._getValue = i
}
_isVisible() {
return this._isLineVisible.value()
}
_lineWidth() {
return ve(this._model.isDark()).lineWidth
}
_lineStyle() {
return ve(this._model.isDark()).lineStyle
}
_priceLineColor(e) {
return ve(this._model.isDark()).lineColor
}
_value() {
const e = this._model.mainSeries(),
t = e.priceScale(),
i = e.firstValue(),
s = this._getValue();
if (null === i || null === s) return {
noData: !0
};
const r = t.priceToCoordinate(s, i);
return {
noData: !1,
floatCoordinate: r,
coordinate: r,
color: "",
formattedPricePercentage: "",
formattedPriceAbsolute: "",
text: "",
index: 0
}
}
}
const Pe = Object(f.t)("High"),
Ce = Object(f.t)("Low"),
xe = Object(f.t)("Avg");
function Te(e, t, i, s, r, n) {
const o = new Se(e, r, n),
a = new ye(e, i, s, n);
return {
paneView: o,
panePriceAxisView: new _e.PanePriceAxisView(a, t, e),
priceAxisView: a,
priceLineAxisView: new we(e, r, n)
}
}
var Ie = i("aIyQ"),
Me = i.n(Ie),
Oe = i("WkOR"),
Le = i("aO4+");
class Ae {
constructor() {
this._data = null
}
setData(e) {
this._data = e
}
data() {
return this._data
}
draw(e, t) {
const i = this._data;
if (null === i) return;
const s = t.pixelRatio;
e.save();
const r = Math.max(1, Math.floor(s)),
n = r % 2 / 2,
o = Math.round(i.center.x * s) + n,
a = i.center.y * s;
e.fillStyle = i.seriesLineColor, e.beginPath();
const l = Math.max(2, 1.5 * i.seriesLineWidth) * s;
e.arc(o, a, l, 0, 2 * Math.PI, !1), e.fill(), e.fillStyle = i.fillColor, e
.beginPath(), e.arc(o, a, i.radius * s, 0, 2 * Math.PI, !1), e.fill(), e
.lineWidth = r, e.strokeStyle = i.strokeColor, e.beginPath(), e.arc(o, a, i
.radius * s + r / 2, 0, 2 * Math.PI, !1), e.stroke(), e.restore()
}
hitTest(e, t) {
return null
}
}
function Ee(e) {
return e
}
const ke = [{
start: 0,
end: .25,
startRadius: 4,
endRadius: 10,
startFillAlpha: .25,
endFillAlpha: 0,
startStrokeAlpha: .4,
endStrokeAlpha: .8,
easing: Ee
}, {
start: .25,
end: .525,
startRadius: 10,
endRadius: 14,
startFillAlpha: 0,
endFillAlpha: 0,
startStrokeAlpha: .8,
endStrokeAlpha: 0,
easing: Ee
}, {
start: .525,
end: 1,
startRadius: 14,
endRadius: 14,
startFillAlpha: 0,
endFillAlpha: 0,
startStrokeAlpha: 0,
endStrokeAlpha: 0,
easing: Ee
}];
function De(e, t, i, s) {
const r = i + (s - i) * t;
return Object(se.applyTransparency)(e, Object(se.alphaToTransparency)(r))
}
function Ve(e, t) {
const i = e % 2600 / 2600;
let s;
for (const e of ke)
if (i >= e.start && i <= e.end) {
s = e;
break
} if (void 0 === s) throw new Error("Last price animation internal logic error");
const r = s.easing((i - s.start) / (s.end - s.start));
return {
fillColor: De(t, r, s.startFillAlpha, s.endFillAlpha),
strokeColor: De(t, r, s.startStrokeAlpha, s.endStrokeAlpha),
radius: (n = r, o = s.startRadius, a = s.endRadius, o + (a - o) * n)
};
var n, o, a
}
class Be {
constructor(e) {
this._renderer = new Ae, this._invalidated = !0, this._stageInvalidated = !0, this
._startTime = performance.now(), this._endTime = this._startTime - 1, this
._series = e
}
update(e) {
if (this._invalidated = !0, e) {
const e = performance.now(),
t = this._endTime - e;
if (t > 0) return void(t < 650 && (this._endTime += 2600));
this._startTime = e, this._endTime = e + 2600
}
}
invalidateStage() {
this._stageInvalidated = !0
}
animationActive() {
return performance.now() <= this._endTime
}
stopAnimation() {
this._endTime = this._startTime - 1
}
renderer(e, t) {
return this._invalidated ? (this._updateImpl(e, t), this._invalidated = !1, this
._stageInvalidated = !1) : this._stageInvalidated && (this
._updateRendererDataStage(), this._stageInvalidated = !1), this._renderer
}
_updateImpl(e, t) {
this._renderer.setData(null);
const i = this._series.model().timeScale(),
s = i.visibleBarsStrictRange(),
r = this._series.firstValue(),
n = this._series.lastValueData(void 0, !0, !0);
if (null === s || null === r || void 0 === n.index || void 0 === n.price || !s
.contains(n.index)) return;
const o = new Le.Point(i.indexToCoordinate(n.index), this._series.priceScale()
.priceToCoordinate(n.price, r)),
a = n.color,
l = this._series.properties();
let c;
switch (this._series.style()) {
case 3:
c = l.areaStyle.linewidth.value();
break;
case 10:
const t = l.baselineStyle,
i = Math.round(e * (Math.abs(100 - t.baseLevelPercentage.value()) /
100));
c = o.y <= i ? t.topLineWidth.value() : t.bottomLineWidth.value();
break;
default:
c = l.lineStyle.linewidth.value()
}
const h = Ve(this._duration(), a);
this._renderer.setData({
seriesLineColor: a,
seriesLineWidth: c,
fillColor: h.fillColor,
strokeColor: h.strokeColor,
radius: h.radius,
center: o
})
}
_updateRendererDataStage() {
const e = this._renderer.data();
if (null !== e) {
const t = Ve(this._duration(), e.seriesLineColor);
e.fillColor = t.fillColor, e.strokeColor = t.strokeColor, e.radius = t.radius
}
}
_duration() {
return this.animationActive() ? performance.now() - this._startTime : 2599
}
}
var Re = i("H0vP"),
Ne = i("BZtw");
i.d(t, "SeriesBase", (function() {
return Ue
}));
const je = g.enabled("price_scale_always_last_bar_value"),
Fe = g.enabled("display_data_mode"),
We = (r.CheckMobile.any(), Object(a.getLogger)("Chart.Series")),
He = {
countdownEnabled: !0,
lastPriceAnimationEnabled: !0
};
class Ue extends l.PriceDataSource {
constructor(e, t, i, r) {
super(e), this.chartWidgetInitialized = new Me.a, this
.requestingIntradayWhenNotSupported = new Me.a, this
.requestingResolutionWhenNotSupported = new Me.a, this._paneView = null,
this._priceStep = null, this._symbolInfo = null, this._prevSymbolInfo =
null, this._isPrePostMarketPricesForbiddenProperty = new u.a(!0), this
._highLowAvgPriceCache = new Map,
this._prevClosePriceAxisView = null, this._priceScaleChanged = new Me.a,
this._priceScaleAboutToBeChanged = new Me.a, this._onRestarted = new Me.a,
this._onStatusChanged = new Me.a, this._extendedHoursChanged = new Me.a,
this._tagsChanged = new Me.a, this._sessionIdChanged = new Me.a, this
._currency = null, this._unit = null, this._endOfData = !1, this
._lineStyleLastPriceCirclePaneView = new Be(this), this
._prevClosePriceLineView = null, this._dataPoweredBy = null, this
._loading = !0, this._seriesLoaded = !1, this._status = 0, this
._boxSizeValue = new F.a, this._base = 100, this._pointValue = 1, this
._formatter = new p.PriceFormatter(this._base), this
._ignoreMinMoveFormatter = new p.PriceFormatter(this._base), this
._ignoreMinMovePriceStep = null, this._lastBarCloseTime = null, this
._onSessionIdPropertyChangedBound = this._onSessionIdPropertyChanged.bind(
this), this._ignoreSessionIdProxyPropertyChanges = !1, this
._lastPriceAnimationActive = !1, this._currentSession = "out_of_session",
this._onStyleChanged = new Me.a, this._intervalObj = null, this
._obsoleteZOrder = 0, this._seriesErrorMessage = null, this._seriesSource =
new Ne.a(e.chartApi(), "s", r);
const n = this._seriesSource.dataEvents();
n.symbolResolved().subscribe(this, this._onSymbolResolved), n.symbolError()
.subscribe(this, this._onSymbolError), n.seriesTimeFrame().subscribe(this,
this._onSeriesTimeFrame), n.seriesError().subscribe(this, this
._onSeriesError), n.loading().subscribe(this, this._onSeriesLoading), n
.completed().subscribe(this, this._onSeriesCompleted), n.dataUpdated()
.subscribe(this, this._onDataUpdated), n.barReceived().subscribe(this, this
._onBarReceived), this._quotesProvider = new ie.a, this._quotesProvider
.quotesUpdate().subscribe(this, this._onQuotesUpdate);
const o = t.childs();
if (t.hasChild("extendedHours")) {
Object(s.ensureDefined)(o.extendedHours).value() && !t.hasChild(
"sessionId") && t.addChild("sessionId", new u.a("extended")), t
.removeProperty("extendedHours")
}
t.hasChild("sessionId") || t.addChild("sessionId", new u.a("regular")), this
._setProperties(t), this._sessionIdProxyProperty = new u.a(o.sessionId
.value()), o.sessionId.subscribe(this, () => this
._updateSessionIdProxyProperty()), this._sessionIdProxyProperty
.subscribe(this, this._onSessionIdProxyPropertyChanged), this._options =
Object(ee.merge)(Object(ee.clone)(He), i), this._prevChartStyle = o.style
.value();
const a = new he(this, e, {
alwaysShowGlobalLast: !0,
showCountdown: i.countdownEnabled
});
this._priceAxisView = a;
let l = null;
je || (l = new he(this, e, {
visibleOnHistoryOnly: !0,
showSymbolLabel: !1,
showCountdown: !1,
alwaysShowGlobalLast: !1
})), this._priceLinePriceAxisView = new ue.SeriesPriceLineAxisView(this),
this._priceLineAxisViews = [this._priceLinePriceAxisView];
const c = new pe(this, e, {
showCountdown: i.countdownEnabled
});
this._priceAxisViews = [a, c], null !== l && this._priceAxisViews.push(l), this
._panePriceAxisView = new _e.PanePriceAxisView(a, this, e), this
._historyPricePanePriceAxisView = null !== l ? new _e.PanePriceAxisView(l,
this, e) : null, this._projectionPriceAxisView = new _e
.PanePriceAxisView(c, this, e), this._labelPaneViews = [this
._panePriceAxisView, this._projectionPriceAxisView
],
null !== this._historyPricePanePriceAxisView && this._labelPaneViews.push(
this._historyPricePanePriceAxisView), this._highLowAvgPaneViews = [],
this._createHighLowAvgViews(), this._subscribeRestartToSessionIdChange();
const h = this.properties();
h.visible.subscribe(this, this._updateLastPriceAnimationActive), this
._updateLastPriceAnimationActive(), this._dataWindowView = new D(this, e),
this._legendView = new N(this, e), this._statusView = new I(this, this
._model.properties().scalesProperties.textColor, h.statusViewStyle),
this._marketStatusModel = new H(this._quotesProvider, h.symbol.listeners()),
this._dataUpdatedModeModel = Fe ? new $({
getter: this.symbolInfo.bind(this),
onChange: n.symbolResolved()
}, {
getter: this.status.bind(this),
onChange: this._onStatusChanged
}, h.symbol.listeners()) : null, this._dataProblemModel = new te(this
._quotesProvider, h.symbol.listeners())
}
seriesErrorMessage() {
return this._seriesErrorMessage
}
destroy() {
this._quotesProvider.quotesUpdate().unsubscribeAll(this), this._model
.timeScale().visibleBarsStrictRangeChanged().unsubscribeAll(this), this
._unsubscribeRestartToSessionIdChange()
}
zorder() {
return 0
}
quotesProvider() {
return this._quotesProvider
}
currentSession() {
return this._currentSession
}
labelPaneViews() {
return this._labelPaneViews
}
topPaneViews() {
if (this._lastPriceAnimationActive) {
const e = this._lineStyleLastPriceCirclePaneView;
return e.animationActive() && setTimeout(() => this._model.invalidate(Re
.InvalidationMask.cursor()), 0), e.invalidateStage(), [e]
}
return null
}
priceAxisViews(e, t) {
return e.findTargetPriceAxisViews(this, t, this._priceAxisViews, this
._priceLineAxisViews)
}
clearHighLowAvgPriceCache() {
this._highLowAvgPriceCache.clear()
}
priceScaleChanged() {
return this._priceScaleChanged
}
priceScaleAboutToBeChanged() {
return this._priceScaleAboutToBeChanged
}
isStatusBad() {
return 12 === this.status() || 4 === this.status() || 10 === this.status()
}
isStatusError() {
return 12 === this.status()
}
actualSymbol() {
return Object(d.actualSymbol)(this.symbolInfo(), this.symbol())
}
proSymbol() {
return Object(d.proSymbol)(this.symbolInfo(), this.symbol())
}
onStyleChanged() {
return this._onStyleChanged
}
style() {
return this.properties().style.value()
}
symbolSameAsCurrent(e) {
return Object(Oe.b)(e, this.m_symbol, this.symbolInfo())
}
symbolInfo() {
return this._symbolInfo
}
symbolResolved() {
return this.dataEvents().symbolResolved()
}
formatter(e = !0) {
return e ? this._formatter : this._ignoreMinMoveFormatter
}
priceStep(e = !0) {
return e ? this._priceStep : this._ignoreMinMovePriceStep
}
interval() {
return this.properties().interval.value()
}
intervalObj() {
const e = this.interval();
if (null !== this._intervalObj && this._intervalObj.resolutionString === e)
return this._intervalObj.interval;
const t = U.Interval.parse(e);
return this._intervalObj = {
resolutionString: e,
interval: t
}, t
}
prevClose() {
const e = this.priceScale();
if (e.isEmpty() || this.data().isEmpty()) return null;
const t = this.quotes(),
i = this.firstValue();
if (null === t || null === i) return null;
const s = t.prev_close_price;
return void 0 === s ? null : {
coordinate: e.priceToCoordinate(s, i),
floatCoordinate: e.priceToCoordinate(s, i),
formattedPricePercentage: e.formatPricePercentage(s, i, !0),
formattedPriceAbsolute: e.formatPriceAbsolute(s)
}
}
hasClosePrice() {
return 12 !== this.properties().style.value()
}
isDWM() {
return this.intervalObj().isDWM()
}
nearestValue(e, t, i) {
const s = this.nearestData(e, i);
return s ? s.value[t] : void 0
}
onStatusChanged() {
return this._onStatusChanged
}
onRestarted() {
return this._onRestarted
}
onExtendedHoursChanged() {
return this._extendedHoursChanged
}
sessionId() {
return this.properties().sessionId.value()
}
sessionIdChanged() {
return this._sessionIdChanged
}
autoScaleInfo(e, t) {
const i = this.priceRange(e, t);
if (null === this._paneView) return {
range: i
};
const s = this._paneView;
return {
range: i,
topPixelMargin: s.topPixelMargin ? s.topPixelMargin() : void 0,
bottomPixelMargin: s.bottomPixelMargin ? s.bottomPixelMargin() : void 0
}
}
onChartStyleChanged() {
this._updateBarFunction(), this.isNeedRestart() && (this.data().clear(), this
.model().timeScale().scrollToRealtime(!1), this.restart());
const e = this.properties();
this._prevChartStyle = e.style.value(), this._onStyleChanged.fire(e.style
.value()), this.invalidateBarStylesCache(), this
._updateLastPriceAnimationActive()
}
sessionIdProxyProperty() {
return this._sessionIdProxyProperty
}
isPrePostMarketPricesForbiddenProperty() {
return this._isPrePostMarketPricesForbiddenProperty
}
quotes() {
return this.data().isEmpty() ? null : this._quotesProvider.quotes()
}
base() {
return this._base
}
pointValue() {
return this._pointValue
}
barCloseTime() {
return this._lastBarCloseTime
}
barFunction() {
return this._barFunction
}
setSymbolCurrencyUnit(e, t, i) {
const s = this.properties(),
r = void 0 !== e && e !== s.symbol.value(),
n = void 0 !== t && t !== s.currencyId.value(),
o = void 0 !== i && i !== s.unitId.value();
r && s.symbol.setValueSilently(e), n && s.currencyId.setValueSilently(t), o && s
.unitId.setValueSilently(i), r && s.symbol.listeners().fire(s.symbol), n &&
s.currencyId.listeners().fire(s.currencyId), o && s.unitId.listeners().fire(
s.unitId)
}
setSymbol(e) {
this.setSymbolCurrencyUnit(e)
}
currency() {
return this.properties().currencyId.value() || null
}
setCurrency(e) {
this.setSymbolCurrencyUnit(void 0, e)
}
isConvertedToOtherCurrency() {
return Object(d.isConvertedToOtherCurrency)(this.symbolInfo())
}
unit() {
return this.properties().unitId.value() || null
}
setUnit(e) {
this.properties().unitId.setValue(e)
}
isConvertedToOtherUnit() {
return Object(d.isConvertedToOtherUnit)(this.symbolInfo())
}
symbolSource() {
return this
}
title() {
return this.symbolTitle()
}
symbolTitle(e, t) {
let i = this.properties().symbol.value();
const s = this.symbolInfo();
return null !== s && (i = Object(d.symbolTitle)(s, e)), t ? i :
`${i}, ${Object(y.translatedIntervalString)(this.properties().interval.value())}`
}
setObsoleteZOrder(e) {
this._obsoleteZOrder = e
}
obsoleteZOrder() {
return this._obsoleteZOrder
}
valuesProvider() {
return new B(this, this.model())
}
statusProvider(e) {
return new T(this, this._model.properties().scalesProperties.textColor, this
.properties().statusViewStyle, e)
}
open(e) {
const t = this.data().valueAt(e);
return t && t[1]
}
high(e) {
const t = this.data().valueAt(e);
return t && t[2]
}
low(e) {
const t = this.data().valueAt(e);
return t && t[3]
}
close(e) {
const t = this.data().valueAt(e);
return t && t[4]
}
moveItem(e, t, i) {
if (10 === this.style() && 0 === t) {
const t = this.priceScale(),
i = this.properties().baselineStyle,
s = t.height(),
r = 100 - e.y / s * 100,
n = r < 0 ? 0 : Math.round(10 * r) / 10;
i.baseLevelPercentage.setValue(Math.max(Math.min(n, 100), 0))
}
}
endOfData() {
return this._endOfData
}
dataPoweredBy() {
return null
}
boxSizeValue() {
return this._boxSizeValue
}
isUserDeletable() {
return !1
}
changeSymbol() {
this.setSymbolIntervalCurrencyDelayed(), this.model().checkLineToolSelection()
}
changeInterval() {
this.setSymbolIntervalCurrencyDelayed()
}
changeTimeFrame() {
Object(n.trackEvent)("GUI", "Change timeframe")
}
onTagsChanged() {
return this._tagsChanged
}
_updateBarFunction() {
if (12 === this.properties().style.value()) this._barFunction = Object(c
.barFunction)("low");
else {
const e = this.priceSource() || "close";
this._barFunction = Object(c.barFunction)(e)
}
}
_setProperties(e) {
e.hasChild("timeframe") || e.merge({
timeframe: ""
}), e.hasChild("shortName") || e.merge({
shortName: ""
}), e.hasChild("currencyId") || e.addChild("currencyId", new u.a(null)), e
.hasChild("unitId") || e.addChild("unitId", new u.a(null)), this
._properties = e;
const t = e.childs();
t.symbol.listeners().subscribe(this, this.changeSymbol), t.interval.listeners()
.subscribe(this, this.changeInterval), t.currencyId.listeners().subscribe(
this, this._changeCurrency), t.unitId.listeners().subscribe(this, this
._changeUnit), t.timeframe.listeners().subscribe(this, this
.changeTimeFrame), e.subscribe(this, this._onPropertiesChanged)
}
_updateSessionIdProxyProperty(e) {
const t = this._properties.childs().sessionId.value();
let i = t;
if (e) {
const e = this.symbolInfo();
null !== e && (i = e.subsession_id || t)
}
this._ignoreSessionIdProxyPropertyChanges = !0, this._sessionIdProxyProperty
.setValue(i), this._ignoreSessionIdProxyPropertyChanges = !1
}
_onSessionIdProxyPropertyChanged() {
this._ignoreSessionIdProxyPropertyChanges || this._properties.childs().sessionId
.setValue(this._sessionIdProxyProperty.value()), this
._updateLastPriceAnimationActive()
}
_onSeriesLoading(e) {
this._loading = !0, this._setStatus(2)
}
_onDataUpdated(e, t) {
if (this.hasDelayedSymbolIntervalChange()) {
if (this._willSymbolIntervalCurrencyChanged()) return void We.logNormal(
"command comes during symbol/interval changing");
We.logNormal(
"data_update comes when symbol interval delay present but symbol/interval should not be changed"
)
}
t ? this._endOfData = !1 : this._lastPriceAnimationActive && this
._seriesLoaded && this._lineStyleLastPriceCirclePaneView.update(!0), this
._lastBarCloseTime = e && e.closeTime || null, this._boxSizeValue.setValue(
this.data().boxSize), this._statusView.update(), this
.clearHighLowAvgPriceCache();
const i = this.model(),
r = Object(s.ensureNotNull)(i.paneForSource(this));
i.recalculatePane(r), i.updateSource(this), i.updateLineTools()
}
_setStatus(e) {
this._status = e, this._statusView.update(), this.model().updateSource(this),
this._onStatusChanged.fire()
}
_willSymbolIntervalCurrencyChanged() {
const e = this.properties(),
t = this._checkIntervalWillChanged(e.interval.value()),
i = this._checkSymbolWillChanged(e.symbol.value()),
s = this._checkCurrencyWillChanged(e.currencyId.value()),
r = this._checkUnitWillChanged(e.unitId.value());
return i || t || s || r
}
_checkSymbolWillChanged(e) {
return !this.symbolSameAsCurrent(e)
}
_checkIntervalWillChanged(e) {
return !U.Interval.isEqual(this.m_interval, e)
}
_recreateFormatter() {
this._formatter = Object(d.createSeriesFormatter)(this.symbolInfo(), this
.properties().minTick.value()), this._ignoreMinMoveFormatter = Object(d
.createSeriesFormatter)(this.symbolInfo(), this.properties().minTick
.value(), !0), this.priceScale() && this.priceScale().updateFormatter(),
this._formatterChanged.fire()
}
_recreatePriceStep() {
const {
minMove: e,
priceScale: t
} = Object(d.getSeriesPriceFormattingState)(this.symbolInfo()), i = e / t;
this._ignoreMinMovePriceStep = 1 / t, this._priceStep !== i && (this
._priceStep = i, this._priceStepChanged.fire())
}
_recreatePriceFormattingDependencies() {
this._recreateFormatter(), this._recreatePriceStep()
}
_onQuotesUpdate(e, t) {
e.values.current_session !== this._currentSession && (this._currentSession = e
.values.current_session, this._updateLastPriceAnimationActive())
}
_updateIsPrePostMarketPricesForbiddenProperty() {
const e = !this.isDWM() && !Object(d.isRegularSessionId)(this
.sessionIdProxyProperty().value());
this._isPrePostMarketPricesForbiddenProperty.setValue(e)
}
_getSymbolForApi() {
return Object(d.symbolForApi)(this.symbolInfo() || this._prevSymbolInfo, this
.symbol())
}
_getSymbolObject() {
const e = this._getExtendedSymbolObject();
if (_.SYMBOL_STRING_DATA.hasOwnProperty(this.properties().style.value())) {
return {
symbol: e,
type: this.styleStudyInfo(this.getStyleShortName() + "Style").studyId +
"!",
inputs: this.getInputsProperties().state()
}
}
return e
}
_getExtendedSymbolObject() {
const e = {
symbol: this._getSymbolForApi()
};
null !== this.currency() && (e["currency-id"] = this.currency());
const t = this.unit();
return null !== t && (e["unit-id"] = t), e
}
_changeCurrency() {
this.setSymbolIntervalCurrencyDelayed(), this.model().checkLineToolSelection(),
this._currencyChanged.fire()
}
_changeUnit() {
this.setSymbolIntervalCurrencyDelayed(), this.model().checkLineToolSelection(),
this._unitChanged.fire()
}
_checkCurrencyWillChanged(e) {
return this._currency !== e
}
_checkUnitWillChanged(e) {
return this._unit !== e
}
_createHighLowAvgViews() {
const e = this.properties().highLowAvgPrice,
t = this._getHighLowAvgPrice.bind(this),
i = function(e, t, i, s) {
const r = i.childs(),
n = Te(e, t, Pe, r.highLowPriceLabelsVisible, r
.highLowPriceLinesVisible, () => s(0)),
o = Te(e, t, Ce, r.highLowPriceLabelsVisible, r
.highLowPriceLinesVisible, () => s(1)),
a = Te(e, t, xe, r.averageClosePriceLabelVisible, r
.averageClosePriceLineVisible, () => s(2));
return {
paneViews: [n.paneView, o.paneView, a.paneView],
panePriceAxisViews: [n.panePriceAxisView, o.panePriceAxisView, a
.panePriceAxisView
],
priceAxisViews: [n.priceAxisView, o.priceAxisView, a.priceAxisView],
priceLineAxisViews: [n.priceLineAxisView, o.priceLineAxisView, a
.priceLineAxisView
]
}
}(this._model, this, e, t);
this._highLowAvgPaneViews.push(...i.paneViews), this._labelPaneViews.push(...i
.panePriceAxisViews), this._priceAxisViews.push(...i.priceAxisViews),
this._priceLineAxisViews.push(...i.priceLineAxisViews)
}
_getHighLowAvgPrice(e) {
if (!this._highLowAvgPriceCache.has(e)) {
const t = this._model.timeScale().visibleBarsStrictRange();
if (null === t) return null;
const i = this._model.mainSeries().bars(),
s = t.firstBar(),
r = t.lastBar();
if (2 === e) {
const e = function(e, t, i) {
const s = Object(c.barFunction)("close");
let r = 0,
n = 0;
for (let o = t; o <= i; o++) {
const t = e.valueAt(o);
null !== t && (r += s(t), n++)
}
return n ? r / n : null
}(i, s, r);
if (null === e) return null;
this._highLowAvgPriceCache.set(2, e)
} else {
const e = function(e, t, i) {
return e.minMaxOnRangeCached(t, i, [{
name: "low",
offset: 0
}, {
name: "high",
offset: 0
}])
}(i, s, r);
if (null === e) return null;
this._highLowAvgPriceCache.set(1, e.min), this._highLowAvgPriceCache
.set(0, e.max)
}
}
return this._highLowAvgPriceCache.get(e)
}
_onSessionIdPropertyChanged() {
this._sessionIdChanged.fire(), this.isDWM() || (this.restart(), this
._updateLastPriceAnimationActive())
}
_subscribeRestartToSessionIdChange() {
this.properties().sessionId.subscribe(this, this
._onSessionIdPropertyChangedBound)
}
_unsubscribeRestartToSessionIdChange() {
this.properties().sessionId.unsubscribe(this, this
._onSessionIdPropertyChangedBound)
}
_updateLastPriceAnimationActive() {
if (!this._options.lastPriceAnimationEnabled) return;
const e = this._lastPriceAnimationActive,
t = this.properties(),
i = t.style.value();
if (this._model.isSnapshot() || !t.visible.value() || 3 !== i && 10 !== i &&
2 !== i) this._lastPriceAnimationActive = !1;
else {
const e = this.currentSession(),
t = !Object(d.isRegularSessionId)(this.sessionIdProxyProperty()
.value()) && !this.isDWM();
this._lastPriceAnimationActive = "market" === e || t && ("pre_market" ===
e || "post_market" === e)
}
this._lastPriceAnimationActive && e !== this._lastPriceAnimationActive && this
.model().invalidate(Re.InvalidationMask.cursor())
}
_onPropertiesChanged(e) {
const t = this._properties.childs();
e !== t.symbol && e !== t.interval && e !== t.timeframe && (this._tagsChanged
.fire(), this.createPaneView(), this.updateAllViews(), this.model()
.updateSource(this), Object(o.emit)("series_properties_changed", this
._id))
}
}
},
"lW/c": function(e, t, i) {
"use strict";
i.r(t);
i("YFKU");
var s = i("hY0g"),
r = i.n(s),
n = i("HySD");
class o {
constructor(e) {
this._document = e, this.isFullscreen = new r.a;
const t = () => {
const e = ["fullscreenElement", "webkitFullscreenElement",
"mozFullscreenElement", "mozFullScreenElement",
"msFullscreenElement"
];
for (let t = 0; t < e.length; t++) {
const i = e[t];
if (i in this._document) {
this.isFullscreen.setValue(!!this._document[i]);
break
}
}
};
t();
for (const i of ["fullscreenchange", "webkitfullscreenchange",
"mozfullscreenchange", "MSFullscreenChange"
]) e.addEventListener(i, t, !1)
}
enter() {
const e = this._document.documentElement;
for (const t of ["requestFullscreen", "mozRequestFullScreen",
"webkitRequestFullscreen", "msRequestFullscreen"
])
if ("function" == typeof e[t]) {
e[t]();
break
} this.isFullscreen.setValue(!0)
}
exit() {
const e = this._document;
for (const t of ["exitFullscreen", "mozCancelFullScreen", "mozExitFullscreen",
"webkitExitFullscreen", "msExitFullscreen"
])
if ("function" == typeof e[t]) {
e[t]();
break
} this.isFullscreen.setValue(!1)
}
}
class a {
constructor(e) {
let t;
this.isVisible = new r.a(!0);
let i = null;
for (const s of ["", "moz", "ms", "webkit"]) {
const r = s ? s + "Hidden" : "hidden";
if (r in e) {
t = s + "visibilitychange", i = () => {
this.isVisible.setValue(!e[r])
}, i(), e.addEventListener(t, i, !1);
break
}
}
this.destroy = () => {
i && (e.removeEventListener(t, i, !1), i = null)
}
}
}
var l = i("mNbo"),
c = i("Eyy1"),
h = i("qFKp");
i.d(t, "Root", (function() {
return u
}));
class u {
constructor(e) {
this._updateDocumentHeight = e => {
"visual" === this._viewportType && this._window.document.documentElement
.style.setProperty("height", e + "px", "important")
}, this._window = e, this._fullscreenApi = new o(e.document), this
._viewportType = h.isChrome || Object(l.isOnMobileAppPage)("any") || !this
._window.visualViewport ? "quirks" : "visual", "visual" === this._viewportType ?
this._viewport = Object(c.ensureDefined)(this._window.visualViewport) : this
._viewport = this._window;
const t = this._layoutSizeSensor = this._window.document.createElement("div");
t.id = "layout-size-sensor", t.style.position = "fixed", t.style.top = "0", t.style
.left = "0", t.style.right = "0", t.style.bottom = "0", t.style.pointerEvents =
"none", t.style.visibility = "hidden", this._initFullscreen()
}
allocate() {
this.free();
const e = this._window.document,
t = e.createElement("div");
t.classList.add("js-rootresizer__contents"), t.style.position = "relative", t.style
.width = "100%", t.style.height = "100%", e.body.insertAdjacentElement(
"afterbegin", t), e.body.insertAdjacentElement("afterbegin", this
._layoutSizeSensor), this._visibilityApi = new a(this._window.document);
const i = {
alive: new r.a(!0),
fullscreenable: new r.a(!0),
container: new r.a(t),
width: new r.a,
height: new r.a,
availWidth: new r.a,
availHeight: new r.a,
visible: this._visibilityApi.isVisible,
fullscreen: this._fullscreenApi.isFullscreen,
remove: () => {
i.alive.setValue(!1)
},
attach: () => {
i.alive.setValue(!1), this._window.close()
},
requestFullscreen: () => {
this._requestFullscreen()
},
exitFullscreen: () => {
this._exitFullscreen()
}
};
return i.alive.subscribe(e => {
e || i !== this._area || this.free()
}), this._area = i, this._resizeHandler = () => {
const e = this._width(i) || 800,
t = this._height(i) || 600;
i.availHeight.setValue(t), i.availWidth.setValue(e), i.height.setValue(t), i
.width.setValue(e)
}, this._area.height.subscribe(this._updateDocumentHeight, {
callWithLast: !0
}), this._resizeHandler(), this._viewport.addEventListener("resize", this
._resizeHandler), new n.ResizerDetacherState(i).bridge()
}
free() {
if (this._resizeHandler && (this._viewport.removeEventListener("resize", this
._resizeHandler), this._resizeHandler = void 0), this._visibilityApi && (
this._visibilityApi.destroy(), this._visibilityApi = void 0), this._area) {
const e = this._area;
this._area = void 0, e.height.unsubscribe(this._updateDocumentHeight), e.alive
.setValue(!1);
const t = e.container.value(),
i = null == t ? void 0 : t.parentElement;
i && (i.removeChild(t), i.removeChild(this._layoutSizeSensor))
}
}
_height(e) {
if ("visual" === this._viewportType) return this._layoutSizeSensor.clientHeight;
return e.container.value().clientHeight
}
_width(e) {
return e.container.value().clientWidth
}
_requestFullscreen() {
this._fullscreenApi.enter()
}
_exitFullscreen() {
this._fullscreenApi.exit()
}
_initFullscreen() {
this._fullscreenApi.isFullscreen.subscribe(e => {
this._resizeHandler && this._resizeHandler()
})
}
}
},
ltKl: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SeriesApi", (function() {
return l
}));
var s = i("Eyy1"),
r = i("jRfx"),
n = i("HGup"),
o = i("/ToI"),
a = i("GD+X");
class l {
constructor(e, t) {
this._series = e, this._undoModel = t, this._model = t.model()
}
isUserEditEnabled() {
return this._series.userEditEnabled()
}
setUserEditEnabled(e) {
this._series.setUserEditEnabled(e)
}
mergeUp() {
this._model.isMergeUpAvailableForSource(this._series) && new r.c(this._model, this
._series, "").redo()
}
mergeDown() {
this._model.isMergeDownAvailableForSource(this._series) && new r.a(this._model, this
._series, "").redo()
}
unmergeUp() {
this._model.isUnmergeAvailableForSource(this._series) && new n.c(this._model, this
._series, "").redo()
}
unmergeDown() {
this._model.isUnmergeAvailableForSource(this._series) && new n.a(this._model, this
._series, "").redo()
}
detachToRight() {
new o.b(this._model, this._series, this._pane(), "right", "").redo()
}
detachToLeft() {
new o.b(this._model, this._series, this._pane(), "left", "").redo()
}
detachNoScale() {
new o.b(this._model, this._series, this._pane(), "overlay", "").redo()
}
changePriceScale(e) {
const t = Object(s.ensureNotNull)(this._model.paneForSource(this._series));
switch (e) {
case "new-left":
new o.b(this._model, this._series, t, "left", "").redo();
break;
case "new-right":
new o.b(this._model, this._series, t, "right", "").redo();
break;
case "no-scale":
Object(s.assert)(t.actionNoScaleIsEnabled(this._series),
"Unable to leave a pane without any non-overlay price scale"), new o
.b(this._model, this._series, t, "overlay", "").redo();
break;
default:
const i = this._model.dataSourceForId(e);
if (null === i) throw new Error(`There is no study with entityId='${e}'`);
const r = this._model.paneForSource(i) === t;
Object(s.assert)(r, "Study should be on the main pane");
const n = Object(s.ensureNotNull)(i.priceScale());
new o.a(this._model, this._series, t, n, "").redo()
}
}
isVisible() {
return this._series.properties().visible.value()
}
setVisible(e) {
this._series.properties().visible.setValue(e)
}
bringToFront() {
this._model.bringToFront([this._series])
}
sendToBack() {
this._model.sendToBack([this._series])
}
entityId() {
return this._series.id()
}
chartStyleProperties(e) {
return this._series.properties().child(c(e)).state(["inputs", "inputsInfo"])
}
setChartStyleProperties(e, t) {
this._series.properties().child(c(e)).mergeAndFire(t)
}
barsCount() {
return this._series.bars().size()
}
symbolSource() {
return {
symbol: this._series.symbol(),
currencyId: this._series.currency(),
unitId: this._series.unit()
}
}
isLoading() {
return this._series.isLoading()
}
data() {
return this._series.data()
}
priceScale() {
return new a.a(this._undoModel, this._series.priceScale())
}
_pane() {
return Object(s.ensureNotNull)(this._model.paneForSource(this._series))
}
}
function c(e) {
switch (e) {
case 0:
return "barStyle";
case 1:
return "candleStyle";
case 2:
return "lineStyle";
case 3:
return "areaStyle";
case 4:
return "renkoStyle";
case 5:
return "kagiStyle";
case 6:
return "pnfStyle";
case 7:
return "pbStyle";
case 8:
return "haStyle";
case 9:
return "hollowCandleStyle";
case 10:
return "baselineStyle";
case 11:
return "rangeStyle";
case 12:
return "hiloStyle";
default:
Object(s.ensureNever)(e)
}
throw new Error("unsupported chart style: " + e)
}
},
lxNp: function(e, t, i) {
"use strict";
i.r(t);
var s = i("/3z9"),
r = i("d700"),
n = i("hY0g"),
o = i.n(n);
var a = i("JWMC");
class l {
constructor(e, t) {
this._group = e, this.hotkey = t.hotkey,
this.handler = t.handler, this.desc = t.desc, this.element = t.element || null,
t.isDisabled ? "function" == typeof t.isDisabled ? this.isDisabled = t
.isDisabled : this.isDisabled = () => !0 : this.isDisabled = () => !1
}
destroy() {
this._group && (this._group.remove(this), this._group = null)
}
}
class c {
constructor(e, t) {
this._actions = [], this._manager = e, this.modal = !(!t || !t.modal), t && (this
.desc = t.desc), t && t.isDisabled ? "function" == typeof t.isDisabled ?
this.isDisabled = t.isDisabled : this.isDisabled = () => !0 : this.isDisabled =
() => !1, this._manager.registerGroup(this)
}
add(e) {
const t = new l(this, e);
return this._actions.push(t), t
}
remove(e) {
for (let t = this._actions.length; t-- > 0;) this._actions[t] === e && this._actions
.splice(t, 1)
}
handleHotkey(e, t) {
for (let i = this._actions.length; i-- > 0;) {
const r = this._actions[i];
if (r.hotkey === e && ((!r.element || t.target && r.element.contains(t
.target)) && !r.isDisabled())) return r.handler(t), t.preventDefault(),
Object(a.trackEvent)("Keyboard Shortcuts", Object(s.humanReadableHash)(
e)), !0
}
return !1
}
promote() {
this._manager.promoteGroup(this)
}
destroy() {
this._actions.length = 0, this._manager.unregisterGroup(this)
}
}
i.d(t, "pressedKeys", (function() {
return u
})), i.d(t, "createGroup", (function() {
return d
})), i.d(t, "registerWindow", (function() {
return p
})), i.d(t, "unregisterWindow", (function() {
return _
})), i.d(t, "Modifiers", (function() {
return s.Modifiers
}));
const h = new class {
constructor() {
this._groups = [], this._pressedKeys = new o.a(0), this._keyDownListener =
e => {
if (e.defaultPrevented) return;
const t = Object(s.hashFromEvent)(e);
if (this._pressedKeys.setValue(t), !Object(r.a)(t, e.target))
for (let i = this._groups.length; i-- > 0;) {
const s = this._groups[i];
if (!s.isDisabled()) {
if (s.handleHotkey(t, e)) return;
if (s.modal) return
}
}
}, this._keyUpListener = e => {
const t = Object(s.hashFromEvent)(e);
this._pressedKeys.setValue(t)
}, this._blurEvent = () => {
this._pressedKeys.setValue(0)
}, this._mouseEvent = e => {
const t = Object(s.modifiersFromEvent)(e),
i = 255 & this._pressedKeys.value();
this._pressedKeys.setValue(t | i)
}
}
listen(e) {
e.addEventListener("keydown", this._keyDownListener), e.addEventListener(
"keyup", this._keyUpListener), e.addEventListener("blur", this
._blurEvent), e.addEventListener("mousemove", this._mouseEvent)
}
unlisten(e) {
e.removeEventListener("keydown", this._keyDownListener), e.removeEventListener(
"keyup", this._keyUpListener), e.removeEventListener("blur", this
._blurEvent), e.removeEventListener("mousemove", this._mouseEvent)
}
registerGroup(e) {
this._groups.push(e)
}
unregisterGroup(e) {
for (let t = this._groups.length; t--;) this._groups[t] === e && this._groups
.splice(t, 1)
}
promoteGroup(e) {
let t = this._groups.length - 1;
for (let i = this._groups.length; i--;) {
if (this._groups[i] === e) return void(i !== t && (this._groups.splice(i,
1), this._groups.splice(t, 0, e)));
this._groups[i].modal && (t = i - 1)
}
}
pressedKeys() {
return this._pressedKeys
}
},
u = h.pressedKeys();
function d(e) {
return new c(h, e)
}
function p(e) {
h.listen(e)
}
function _(e) {
h.unlisten(e)
}
p(window)
},
"m/3z": function(e, t, i) {
"use strict";
i.d(t, "d", (function() {
return d
})), i.d(t, "c", (function() {
return p
})), i.d(t, "b", (function() {
return _
})), i.d(t, "a", (function() {
return m
}));
var s = i("lxNp"),
r = i("/3z9"),
n = i("d700"),
o = i("hY0g"),
a = i.n(o),
l = i("KnF9");
const c = new a.a(Boolean(s.pressedKeys.value() & r.Modifiers.Shift)),
h = new a.a(Boolean(s.pressedKeys.value() & r.Modifiers.Mod)),
u = new a.a(Boolean(s.pressedKeys.value() & r.Modifiers.Alt));
function d() {
return c
}
function p() {
return h
}
function _() {
return new l.a({
altKey: u.value(),
ctrlKey: p().value(),
metaKey: p().value(),
shiftKey: d().value()
})
}
s.pressedKeys.subscribe(e => {
c.setValue(Boolean(e & r.Modifiers.Shift)), h.setValue(Boolean(e & r.Modifiers
.Mod)), u.setValue(Boolean(e & r.Modifiers.Alt))
});
class m {
constructor(e, t) {
this._pressedKeyCode = null, this._boundKeydownHandler = null, this
._boundKeyupHandler = null, this._chartWidget = e, this._parent = t, this
._boundKeydownHandler = this._keydownHandler.bind(this), this
._boundKeyupHandler = this._keyupHandler.bind(this), this._parent.ownerDocument
.addEventListener("keydown", this._boundKeydownHandler), this._parent
.ownerDocument.addEventListener("keyup", this._boundKeyupHandler)
}
destroy() {
null !== this._boundKeydownHandler && (this._parent.ownerDocument
.removeEventListener("keydown", this._boundKeydownHandler), this
._boundKeydownHandler = null), null !== this._boundKeyupHandler && (this
._parent.ownerDocument.removeEventListener("keyup", this
._boundKeyupHandler), this._boundKeyupHandler = null)
}
_keydownHandler(e) {
this._chartWidget.hasModel() && window.document.activeElement === window.document
.body && this._chartWidget.isActive() && (this._handleMoveDrawingsKeyDown(e) ||
this._handleScrollKeyDown(e) || this._handleZoomKeyDown(e)) && e
.preventDefault()
}
_keyupHandler(e) {
this._chartWidget.hasModel() && this._handleScrollKeyUp(e)
}
_handleMoveDrawingsKeyDown(e) {
const t = 255 & Object(r.hashFromEvent)(e),
i = this._chartWidget.model();
switch (t) {
case 37:
return i.moveSelectedToolsLeft();
case 39:
return i.moveSelectedToolsRight();
case 38:
return i.moveSelectedToolsUp();
case 40:
return i.moveSelectedToolsDown()
}
return !1
}
_handleScrollKeyDown(e) {
if (null !== this._pressedKeyCode) return !1;
const t = Object(r.hashFromEvent)(e),
i = 255 & t,
s = Object(r.modifiersFromEvent)(e);
let o;
if (37 === i) o = 1;
else {
if (39 !== i) return !1;
o = -1
}
return !(r.isMacKeyboard && s === r.Modifiers.Mod || s !== r.Modifiers.Mod && s !==
r.Modifiers.Alt && s !== r.Modifiers.None) && (!Object(n.a)(t, e.target) &&
(this._pressedKeyCode = i, s === r.Modifiers.None ? this._chartWidget
.scrollHelper().moveByBar(o) : this._chartWidget.scrollHelper().move(o),
!0))
}
_handleScrollKeyUp(e) {
if (null === this._pressedKeyCode) return !1;
const t = Object(r.hashFromEvent)(e);
if (Object(n.a)(t, e.target)) return !1;
return (255 & t) === this._pressedKeyCode && (this._pressedKeyCode = null, this
._chartWidget.scrollHelper().stopMove(), !0)
}
_handleZoomKeyDown(e) {
const t = Object(r.hashFromEvent)(e),
i = 255 & t;
if (Object(r.modifiersFromEvent)(e) !== r.Modifiers.Mod || Object(n.a)(t, e.target))
return !1;
const s = this._chartWidget.model();
if (38 === i) s.zoomIn();
else {
if (40 !== i) return !1;
s.zoomOut()
}
return !0
}
}
},
"m/cY": function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("tc+8"),
r = i.n(s);
function n(e) {
return new r.a(e)
}
},
mE5r: function(e, t, i) {
"use strict";
var s = i("Eyy1"),
r = i("ikwP"),
n = i("gAom"),
o = i("H0vP"),
a = i("aO4+"),
l = i("XlJ7"),
c = i("EsvI"),
h = i("OsWk"),
u = i("rL76"),
d = i("zDbI");
const p = parseInt(u.labelheight),
_ = parseInt(u.bottommargin);
function m(e) {
return e / 11
}
class f {
constructor() {
this._wrapper = document.createElement("div"), this._element = document
.createElement("div"), this._labelElement = document.createElement("div"), this
._gearElement = document.createElement("div"), this._currentScale = 1, this
._info = null, this._mode = "auto", this._wrapper.appendChild(this._element),
this._wrapper.classList.add(u.wrapper), this._element.classList.add(u.label),
this._labelElement.className = u.symbol, this._element.appendChild(this
._labelElement), this._gearElement.className = u.gear, this._gearElement
.innerHTML = h, this._element.appendChild(this._gearElement)
}
getElement() {
return this._wrapper
}
setMode(e) {
this._mode !== e && (this._mode = e)
}
align(e, t) {
const i = m(t);
Math.abs(i - this._currentScale) > .1 && (this._currentScale = i, Math.abs(this
._currentScale - 1) > .1 ? this._element.style.transform =
`scale(${this._currentScale})` : (this._currentScale = 1, this._element
.style.transform = ""))
}
drawLabelForScreenshot(e, t) {
if (null === this._info || "gear" === this._mode) return;
const i = Object(l.makeFont)(t.fontSize, d.CHART_FONT_FAMILY);
e.fillStyle = c.themes[t.theme].getThemedColor("color-price-axis-label-back"), e
.globalAlpha = .5, e.beginPath();
const s = m(t.fontSize) * p / 2,
r = Object(a.point)(t.offset + t.width / 2, t.height / 2);
e.arc(r.x, r.y, s, 0, 2 * Math.PI, !0), e.fill(), e.globalAlpha = 1, e.fillStyle = c
.themes[t.theme].getThemedColor("color-price-axis-label-text"), e.textAlign =
"center", e.font = i, e.textBaseline = "middle", e.fillText(this._info.label, r
.x, r.y)
}
setAxisNameInfo(e) {
this._info = e, null !== e && (this._labelElement.textContent = e.label)
}
static height(e) {
return (p + _) * e
}
}
var g = i("aIyQ"),
b = i.n(g),
v = i("S8xo"),
S = i("5VQP"),
y = i("CPmC");
const w = {
enableTooltip: !0,
showLabels: !0,
enableMenu: !0,
enableHighlight: !0
};
class P {
constructor(e, t, i, s, n) {
this._invalidated = !0, this._size = new r.Size(0, 0), this._offset = 0, this
._axisInfo = null, this._onLabelHovered = new b.a, this._highlighted = !1, this
._labelMode = "auto", this._fixedLabelMode = null, this
._canvasConfiguredHandler = () => this.update(), this._isLeft = "left" === e,
this._rendererOptionsProvider = s.rendererOptionsProvider, this
._sourcesTitlesProvider = s.sourcesTitlesProvider, this
._contextMenuItemsProvider = s.contextMenuItemsProvider, this
._backgroundBasedTheme = s.backgroundBasedTheme, this._getBackgroundTopColor = s
.getBackgroundTopColor, this._getBackgroundBottomColor = s
.getBackgroundBottomColor, this._showHorizontalBorder = Boolean(s
.showHorizontalBorder), this._properties = t, this._axisInfo = i, this
._labelOptions = {
...w,
...n
}, this._properties.lineColor.subscribe(this, this._onPropertyChanged), this
._cell = document.createElement("div"), this._cell.classList.add(u[
"price-axis-stub"]), this._labelOptions.enableTooltip && this._cell
.classList.add("apply-common-tooltip"), this._cell.style.width = "25px", this
._cell.style.height = "100%", this._cell.style.position = "absolute", this._cell
.style.left = "0", this._cell.style.overflow = "hidden", this._labelOptions
.showLabels ? (this._label = new f,
this._label.setAxisNameInfo(this._axisInfo), this._cell.appendChild(this
._label.getElement()), this._labelOptions.enableTooltip && Object(y.b)(
this._cell, "text", e => this._tooltipContent())) : this._label = null,
this._mouseEventHandler = new v.MouseEventHandler(this._cell, this, {
treatHorzTouchDragAsPageScroll: !0,
treatVertTouchDragAsPageScroll: !0
}), this._canvasBinding = Object(r.createBoundCanvas)(this._cell, new r.Size(16,
16)), this._canvasBinding.subscribeCanvasConfigured(this
._canvasConfiguredHandler);
const o = this._canvasBinding.canvas;
o.style.position = "absolute", o.style.left = "0", o.style.top = "0"
}
destroy() {
this._canvasBinding.unsubscribeCanvasConfigured(this._canvasConfiguredHandler), this
._canvasBinding.destroy(), this._properties.lineColor.unsubscribe(this, this
._onPropertyChanged), this._mouseEventHandler.destroy()
}
mouseEnterEvent(e) {
this._mouseOrTouchEnterEvent(e)
}
touchStartEvent(e) {
this._mouseOrTouchEnterEvent(e)
}
mouseLeaveEvent(e) {
this._mouseOrTouchLeaveEvent(e)
}
touchEndEvent(e) {
this._mouseOrTouchLeaveEvent(e)
}
mouseClickEvent(e) {
this._mouseClickOrTapEvent(e)
}
tapEvent(e) {
this._mouseClickOrTapEvent(e)
}
update() {
this._invalidated = !0
}
getElement() {
return this._cell
}
onLabelHovered() {
return this._onLabelHovered
}
setSizeAndOffset(e, t) {
if (e.w < 0 || e.h < 0) throw new Error(
"Try to set invalid size to PriceAxisStub " + JSON.stringify(e));
this._size.equals(e) || (this._size = e, this._canvasBinding.resizeCanvas({
width: e.w,
height: e.h
}), this._cell.style.width = e.w + "px", this._cell.style.minWidth = e.w +
"px", this._cell.style.height = e.h + "px", this._invalidated = !0), this
._offset !== t && (this._offset = t, this._cell.style.left = t + "px")
}
paint(e) {
if (e < o.InvalidationLevel.Full && !this._invalidated) return;
if (0 === this._size.w || 0 === this._size.h) return;
this._invalidated = !1;
const t = Object(r.getContext2D)(this._canvasBinding.canvas);
this._drawBackground(t, this._canvasBinding.pixelRatio), this._drawVerticalBorder(t,
this._canvasBinding.pixelRatio), this._showHorizontalBorder && this
._drawHorizontalBorder(t, this._canvasBinding.pixelRatio)
}
hardResetCanvas() {
Object(r.hardResizeCanvas)(this._canvasBinding, this._size)
}
getWidth() {
return this._size.w
}
getImage() {
const e = Object(r.createDisconnectedCanvas)(document, this._size),
t = Object(r.getPrescaledContext2D)(e),
i = this._getBackgroundTopColor(),
s = this._getBackgroundBottomColor();
return i === s ? Object(r.clearRect)(t, 0, 0, this._size.w, this._size.h, i) :
Object(n.clearRectWithGradient)(t, 0, 0, this._size.w, this._size.h, i, s), t
.drawImage(this._canvasBinding.canvas, 0, 0, this._size.w, this._size.h),
null !== this._label && this._label.drawLabelForScreenshot(t, {
offset: 0,
width: this._size.w,
height: this._size.h,
fontSize: this._properties.fontSize.value(),
theme: this._backgroundBasedTheme.value()
}), e
}
setLabelMode(e) {
e !== this._labelMode && (this._labelMode = e, null !== this._label && this._label
.setMode(e), this._cell.classList.toggle(u["fixed-gear"], "gear" === e),
this._cell.classList.toggle(u["fixed-symbol"], "symbol" === e), this._cell
.classList.toggle("apply-common-tooltip", "symbol" !== e && this
._labelOptions.enableTooltip))
}
_setHighlighted(e) {
this._labelOptions.enableHighlight && (this._onLabelHovered.fire("stubButton", e),
this._highlighted !== e && (this._highlighted = e, this._invalidated = !0))
}
_onPropertyChanged() {
this._invalidated = !0
}
_drawVerticalBorder(e, t) {
const i = this._size.w;
e.save(), e.fillStyle = this._properties.lineColor.value();
const s = Math.max(1, Math.floor(this._rendererOptionsProvider.options()
.borderSize * t)),
r = this._isLeft ? Math.floor(i * t) - s : 0,
n = Math.ceil(this._size.h * t);
e.fillRect(r, 0, s, n + 1), e.restore()
}
_drawHorizontalBorder(e, t) {
e.save(), e.fillStyle = this._properties.lineColor.value();
const i = Math.max(1, Math.floor(this._rendererOptionsProvider.options()
.borderSize * t)),
s = Math.ceil(this._size.w * t),
r = this._isLeft ? 0 : i;
e.fillRect(r, 0, s - i, i), e.restore()
}
_drawBackground(e, t) {
const i = Math.ceil(t * this._size.w),
s = Math.ceil(t * this._size.h),
o = this._getBackgroundTopColor(),
a = this._getBackgroundBottomColor();
if (o === a ? Object(r.clearRect)(e, 0, 0, i + 1, s + 1, o) : Object(n
.clearRectWithGradient)(e, 0, 0, i + 1, s + 1, o, a), this._highlighted) {
const t = c.themes[this._backgroundBasedTheme.value()].getThemedColor(
"color-price-axis-highlight");
Object(r.fillRect)(e, 0, 0, i + 1, s + 1, t), e.globalAlpha = 1
}
}
_tooltipContent() {
return this._sourcesTitlesProvider().join("\n")
}
_mouseOrTouchEnterEvent(e) {
null !== this._label && "symbol" !== this._labelMode && this._labelOptions
.enableHighlight && this._setHighlighted(!0)
}
_mouseOrTouchLeaveEvent(e) {
"symbol" !== this._labelMode && this._setHighlighted(!1)
}
_mouseClickOrTapEvent(e) {
e.preventDefault(), null === this._fixedLabelMode && "symbol" !== this._labelMode &&
this._labelOptions.enableMenu && this._labelOptions.showLabels ? (this
._fixedLabelMode = this._labelMode, this.setLabelMode("gear"), S
.ContextMenuManager.createMenu(this._contextMenuItemsProvider(), {
statName: "PriceScaleLabelContextMenu"
}, () => {
this.setLabelMode(Object(s.ensureNotNull)(this._fixedLabelMode)),
this._fixedLabelMode = null
}).then(e => e.show((e, t) => {
const i = this._cell.getBoundingClientRect();
return {
clientX: this._isLeft ? i.left : i.right - e,
clientY: i.top - Math.min(t, i.top),
overrideHeight: i.top < t ? i.top : void 0
}
}, this.getElement(), !0))) : S.ContextMenuManager.hideAll()
}
}
var C = i("Daqx");
i.d(t, "a", (function() {
return x
}));
class x {
constructor(e, t, i, s, n) {
this._axises = [], this._stubs = [], this._size = new r.Size(0, 0), this
._onLabelHovered = new b.a, this._scalesProperties = e, this
._priceAxisWidgetFactory = i, this._rendererOptionsProvider = s
.rendererOptionsProvider, this._titlesProvider = s.titlesProvider, this
._stubContextMenuProvider = s.stubContextMenuProvider, this
._backgroundBasedTheme = s.backgroundBasedTheme, this._getBackgroundTopColor = s
.getBackgroundTopColor, this._getBackgroundBottomColor = s
.getBackgroundBottomColor, this._showHorisontalBorder = Boolean(s
.showHorizontalBorder), this._labelsOptions = {
...w,
...n
};
const o = this._scalesProperties.childs();
this._stubProperties = {
lineColor: o.lineColor,
fontSize: o.fontSize
}, this._side = t, this._cell = document.createElement("td"), this._cell
.classList.add("chart-markup-table", "price-axis-container"), this._cell.style
.width = "25px", this._cell.style.position = "relative"
}
destroy() {
this.setScales([], 0, 0, 0)
}
onLabelHovered() {
return this._onLabelHovered
}
setScales(e, t, i, r) {
for (; e.length > this._axises.length && this._axises.length < t;) {
const e = Object(C.a)(this._side, this._axises.length),
t = this._priceAxisWidgetFactory(this._side, this._rendererOptionsProvider,
this._scalesProperties, e, this._backgroundBasedTheme);
this._axises.push(t), this._cell.appendChild(t.getElement())
}
for (; e.length < this._axises.length;) {
const e = Object(s.ensureDefined)(this._axises.pop());
this._cell.removeChild(e.getElement()), e.destroy()
}
for (let t = 0; t < this._axises.length; ++t) this._axises[t].setPriceScale(e[t]);
const n = t - e.length,
o = Math.max(0, n);
for (; this._stubs.length > o;) {
const e = Object(s.ensureDefined)(this._stubs.pop());
e.onLabelHovered().unsubscribeAll(this), this._cell.removeChild(e.getElement()),
e.destroy()
}
for (; this._stubs.length < n;) {
const e = this._labelsOptions.showLabels ? Object(C.a)(this._side, this._stubs
.length) : null,
t = this._stubs.length,
i = new P(this._side, this._stubProperties, e, this._stubParams(t), this
._labelsOptions);
i.onLabelHovered().subscribe(this, (t, i) => {
this._labelsOptions.showLabels && this._labelsOptions
.enableHighlight && this._onLabelHovered.fire({
owner: t,
axis: Object(s.ensureNotNull)(e)
}, i)
}), this._stubs.push(i), this._cell.appendChild(i.getElement())
}
const a = this._labelsOptions.enableMenu;
1 === r ? this._stubs.forEach((e, t) => e.setLabelMode(a ? "gear" : "symbol")) :
this._stubs.forEach((e, t) => e.setLabelMode(t < i && a ? "auto" : "symbol"))
}
getElement() {
return this._cell
}
optimalWidths() {
return this._axises.map(e => e.optimalWidth())
}
setSizes(e, t) {
this._size = new r.Size(t.reduce((e, t) => e + t, 0), e), this._cell.style.width =
this._size.w + "px", this._cell.style.minWidth = this._size.w + "px", this._cell
.style.height = this._size.h + "px", t.length !== this._axises.length + this
._stubs.length && Object(s.assert)(t.length === this._axises.length + this
._stubs.length, "Widgets count should be the same as widths one");
let i = 0;
this._forEachWidgetFromLeft((s, n) => {
const o = t[n];
s.setSizeAndOffset(new r.Size(o, e), i), i += o
})
}
update() {
this._axises.forEach(e => e.update()), this._stubs.forEach(e => e.update())
}
paint(e) {
this._axises.forEach((t, i) => t.paint(e(i))), this._stubs.forEach((t, i) => t
.paint(e(i)))
}
paintStubs(e) {
this._stubs.forEach(t => t.paint(e))
}
hardResetCanvas() {
this._axises.forEach(e => e.hardResetCanvas()), this._stubs.forEach(e => e
.hardResetCanvas())
}
restoreDefaultCursor() {
this._axises.forEach(e => e.restoreDefaultCursor())
}
getWidth() {
return this._size.w
}
findAxisWidgetForScale(e) {
const t = this._axises.find(t => t.priceScale() === e);
return void 0 === t ? null : t
}
getScreenshotData() {
const e = this._getImage();
return {
content: e.toDataURL(),
canvas: e,
contentHeight: this._size.h,
contentWidth: this._size.w
}
}
getImage() {
return this._getImage()
}
slotsCount() {
return this._axises.length + this._stubs.length
}
highlightPriceAxisByLabel(e) {
this._axises.forEach(t => {
const i = t.axisInfo();
t.setHighlighted(null !== i && i.equals(e))
})
}
axes() {
return this._axises
}
_stubParams(e) {
return {
rendererOptionsProvider: this._rendererOptionsProvider,
backgroundBasedTheme: this._backgroundBasedTheme,
sourcesTitlesProvider: () => this._titlesProvider(this._side, e),
contextMenuItemsProvider: () => this._stubContextMenuProvider(this._side, e),
getBackgroundTopColor: this._getBackgroundTopColor,
getBackgroundBottomColor: this._getBackgroundBottomColor,
showHorizontalBorder: this._showHorisontalBorder
}
}
_getImage() {
const e = Object(r.createDisconnectedCanvas)(document, this._size),
t = Object(r.getPrescaledContext2D)(e);
let i = 0;
return this._forEachWidgetFromLeft((e, s) => {
const r = e.getWidth();
0 !== r && (t.drawImage(e.getImage(), i, 0, r, this._size.h), i += r)
}), e
}
_forEachWidgetFromLeft(e) {
const t = [...this._axises, ...this._stubs],
i = "left" === this._side,
s = i ? -1 : t.length,
r = i ? -1 : 1;
for (let n = i ? t.length - 1 : 0; n !== s; n += r) e(t[n], n, t)
}
}
},
"mKT+": function(e, t, i) {
"use strict";
i.r(t);
var s = i("QloM");
function r(e, t, s, r, n) {
return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(6), i.e(8), i.e(
9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i.e(19), i.e(21),
i.e(22), i.e(23), i.e(26), i.e(29), i.e(33), i.e(34), i.e(35), i.e(36), i.e(39),
i.e(42), i.e(43), i.e(45), i.e(49), i.e(50), i.e(59), i.e(64), i.e(65), i.e(86),
i.e(0), i.e(2), i.e(5), i.e(7), i.e(10), i.e(15), i.e(18), i.e(20), i.e(25), i
.e(27), i.e(30), i.e(31), i.e(32), i.e(37), i.e(40), i.e(44), i.e(47), i.e(46),
i.e(55), i.e(58), i.e("new-edit-object-dialog")
]).then(i.bind(null, "Y5hB")).then(i => {
const s = new(0, i.EditObjectDialogRenderer)(e, t, r, n);
return s.show(), s
})
}
var n = i("3ClC");
let o = null;
var a = i("USzt"),
l = i("CW80");
i.d(t, "resolveAndShowEditObjectDialog", (function() {
return h
}));
const c = {
[s.TabNames.symbol]: "symbol",
[s.TabNames.legend]: "legend",
[s.TabNames.scales]: "scales",
[s.TabNames.trading]: "trading",
[s.TabNames.events]: "events",
[s.TabNames.timezoneSessions]: "appearance",
[s.TabNames.text]: "text",
[s.TabNames.style]: "style"
};
async function h(e, t, s = {}, h, u) {
const d = h.activeChartWidget.value();
if (Object(l.isStudyLineTool)(e) && function(e) {
return [a.a].some(t => e instanceof t)
}(e)) return d.propertiesDefinitionsForSource(e).then(i => null !== i ? r(e, t, 0,
u, i) : null);
if (Object(n.isStudy)(e) && function(e) {
const {
shortId: t
} = e.metaInfo();
return "Overlay" === t
}(e) || Object(l.isLineTool)(e)) return d.propertiesDefinitionsForSource(e).then(
r => {
if (null !== r) {
const {
tabName: n
} = s;
return function(e) {
return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(
3), i.e(4), i.e(6), i.e(8), i.e(9), i.e(11),
i.e(12), i.e(13), i.e(14), i.e(16), i.e(17), i
.e(19), i.e(21), i.e(22), i.e(23), i.e(26), i.e(
33), i.e(34), i.e(35), i.e(36), i.e(39), i
.e(42), i.e(43), i.e(45), i.e(49), i.e(65), i.e(
96), i.e(0), i.e(2), i.e(5), i.e(7), i.e(
10), i.e(15), i.e(18), i.e(20), i.e(25), i
.e(
27), i.e(30), i.e(31), i.e(32), i.e(37), i
.e(
40), i.e(44), i.e(47), i.e(58), i.e(
"source-properties-editor")
]).then(i.bind(null, "CbZh")).then(t => {
const i = new(0, t
.SourcePropertiesEditorRenderer)(e);
return null !== o && o.hide(), i.show(), o = i,
i
})
}({
propertyPages: r,
model: t,
source: e,
activePageId: n && c[n]
})
}
return null
});
if (Object(n.isStudy)(e) && !Object(n.isESDStudy)(e)) return r(e, t, 0, u); {
const {
tabName: t
} = s, i = Object(n.isESDStudy)(e) ? "events" : t && c[t], r = h
.getChartPropertiesDialogRenderer();
return r.setActivePage(i), r.show()
}
}
},
mMWL: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "toolIsCursor", (function() {
return d
})),
i.d(t, "toolIsMeasure", (function() {
return p
})), i.d(t, "resetToCursor", (function() {
return _
})), i.d(t, "lockTimeAxisTime", (function() {
return y
})), i.d(t, "tool", (function() {
return w
})), i.d(t, "iconTool", (function() {
return P
})), i.d(t, "cursorTool", (function() {
return C
})), i.d(t, "isToolCreatingNow", (function() {
return x
})), i.d(t, "isToolEditingNow", (function() {
return T
})), i.d(t, "isToolMovingNow", (function() {
return I
})), i.d(t, "isDirectionalMovementActive", (function() {
return M
})), i.d(t, "createdLineTool", (function() {
return O
})), i.d(t, "continuedLineTool", (function() {
return L
})), i.d(t, "cancelledLineTool", (function() {
return A
})), i.d(t, "beenSetLineToolLastPoint", (function() {
return E
})), i.d(t, "startedMovingLineTool", (function() {
return k
})), i.d(t, "movedLineTool", (function() {
return D
})), i.d(t, "finishedMovingLineTool", (function() {
return V
})), i.d(t, "startedChangingLineTool", (function() {
return B
})), i.d(t, "changedLineTool", (function() {
return R
})), i.d(t, "finishedChangingLineTool", (function() {
return N
})), i.d(t, "removedLineTool", (function() {
return j
})), i.d(t, "finishedLineTool", (function() {
return F
})), i.d(t, "changedLineStyle", (function() {
return W
})), i.d(t, "copiedLineTool", (function() {
return H
})), i.d(t, "restoredLineTool", (function() {
return U
})), i.d(t, "restoredLineToolState", (function() {
return z
})), i.d(t, "createLineTool", (function() {
return Y
})), i.d(t, "continueLineTool", (function() {
return K
})), i.d(t, "cancelLineTool", (function() {
return J
})), i.d(t, "setLineToolLastPoint", (function() {
return Z
})), i.d(t, "startMovingLineTool", (function() {
return X
})), i.d(t, "moveLineTool", (function() {
return $
})), i.d(t, "finishMovingLineTool", (function() {
return Q
})), i.d(t, "startChangingLineTool", (function() {
return ee
})), i.d(t, "changeLineTool", (function() {
return te
})), i.d(t, "finishChangingLineTool", (function() {
return ie
})), i.d(t, "removeLineTool", (function() {
return se
})), i.d(t, "finishLineTool", (function() {
return re
})), i.d(t, "changeLineStyle", (function() {
return ne
})), i.d(t, "copyLineTool", (function() {
return oe
})), i.d(t, "restoreLineTool", (function() {
return ae
})), i.d(t, "restoreLineToolState", (function() {
return le
})), i.d(t, "init", (function() {
return ue
})), i.d(t, "runOnDrawingStateReady", (function() {
return de
})), i.d(t, "properties", (function() {
return pe
})), i.d(t, "hideAllDrawings", (function() {
return _e
})), i.d(t, "hideAllIndicators", (function() {
return me
})), i.d(t, "lockDrawings", (function() {
return fe
})), i.d(t, "hideMarksOnBars", (function() {
return ge
})), i.d(t, "drawOnAllCharts", (function() {
return be
})), i.d(t, "lockTimeAxis", (function() {
return ve
}));
var s = i("Eyy1"),
r = i("m/cY"),
n = i("Ocx9"),
o = i("hY0g"),
a = i.n(o),
l = i("aIyQ"),
c = i.n(l),
h = i("Vdly"),
u = i("FQhm");
function d(e) {
return "cursor" === e || "arrow" === e || "dot" === e
}
function p(e) {
return "measure" === e
}
function _(e = !1) {
if (!e && m) {
if (m.childs().stayInDrawingMode.value()) return
}
w.setValue(C.value())
}
let m = null,
f = null,
g = null,
b = null,
v = null,
S = null;
const y = new a.a,
w = new a.a,
P = new a.a,
C = new a.a,
x = new a.a(!1),
T = new a.a(!1),
I = new a.a(!1),
M = new a.a(!1),
O = new c.a,
L = new c.a,
A = new c.a,
E = new c.a,
k = new c.a,
D = new c.a,
V = new c.a,
B = new c.a,
R = new c.a,
N = new c.a,
j = new c.a,
F = new c.a,
W = new c.a,
H = new c.a,
U = new c.a,
z = new c.a;
function G(e, t) {
const i = t || {
value: !1
};
return t => {
i.value || (i.value = !0, e.fire(t), i.value = !1)
}
}
const q = {
value: !1
},
Y = G(O, q),
K = G(L, q),
J = G(A, q),
Z = G(E, q),
X = G(k),
$ = G(D),
Q = G(V),
ee = G(B),
te = G(R),
ie = G(N),
se = G(j),
re = G(F),
ne = G(W, q),
oe = G(H, q),
ae = G(U),
le = G(z);
let ce = !1,
he = [];
function ue() {
ce || (w.setValue(h.getValue("chart.cursorPreference", "cursor")), w.subscribe(e => d(e) &&
C.setValue(e), {
callWithLast: !0
}), C.subscribe(e => {
e && h.setValue("chart.cursorPreference", e)
}), m = new n.DefaultProperty("drawings"), f = Object(r.a)(), g = Object(r.a)(), b =
Object(r.a)(), v = Object(r.a)(), S = Object(r.a)(), f.setValue(!1), g.setValue(!1),
b.setValue(!1), v.setValue(!1), S.setValue(!1), w.subscribe(() => {
Object(u.emit)("onSelectedLineToolChanged")
}), ce = !0, he.forEach(e => e()), he = [])
}
function de(e) {
ce ? e() : he.push(e)
}
function pe() {
return Object(s.ensureNotNull)(m)
}
function _e() {
return Object(s.ensureNotNull)(f)
}
function me() {
return Object(s.ensureNotNull)(g)
}
function fe() {
return Object(s.ensureNotNull)(b)
}
function ge() {
return Object(s.ensureNotNull)(v)
}
function be() {
return pe().childs().drawOnAllCharts
}
function ve() {
return Object(s.ensureNotNull)(S)
}
},
mNbo: function(e, t, i) {
"use strict";
function s(e, t = !1) {
return !1
}
function r(e) {
return e
}
i.r(t), i.d(t, "isOnMobileAppPage", (function() {
return s
})), i.d(t, "urlWithMobileAppParams", (function() {
return r
}))
},
mPvX: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolsGroupModel", (function() {
return o
}));
var s = i("aIyQ"),
r = i.n(s),
n = i("UqOQ");
class o {
constructor(e) {
this._onChanged = new r.a, this._groups = [], this._groups = e || [], this._groups
.forEach(e => {
e.onChanged().subscribe(null, t => this._onChanged.fire(e.id, t))
})
}
groups() {
return this._groups.filter(e => e.isActualSymbol())
}
groupsForAllSymbols() {
return this._groups
}
createGroup(e, t, i) {
t = t || this._generateNextName();
const s = new n.a(e, t, i);
this._groups.push(s), s.onChanged().subscribe(null, e => this._onChanged.fire(s.id,
e));
const r = {
visibilityChanged: !1,
lockedChanged: !1,
titleChanged: !1,
isActualIntervalChanged: !1,
affectedLineTools: e.map(e => e.id())
};
return this._onChanged.fire(s.id, r), s
}
addGroup(e) {
this._groups.push(e), e.onChanged().subscribe(null, t => this._onChanged.fire(e.id,
t)), this._onChanged.fire(e.id)
}
removeGroup(e) {
const t = this._groups.findIndex(t => t.id === e.id);
this._groups.splice(t, 1), this._onChanged.fire(e.id)
}
groupForId(e) {
return this._groups.find(t => t.id === e) || null
}
groupForLineTool(e) {
return this._groups.find(t => t.containsLineTool(e)) || null
}
removeLineTools(e) {
this._groups.forEach(t => t.excludeLineTools(e));
this._groups.filter(e => 0 === e.lineTools().length).forEach(e => this.removeGroup(
e))
}
state(e) {
return {
groups: (e ? this._groups.filter(e => e.isActualSymbol()) : this._groups).map(
e => e.state())
}
}
onChanged() {
return this._onChanged
}
fireChangedAll() {
this._groups.forEach(e => {
this._onChanged.fire(e.id)
})
}
static fromState(e, t) {
const i = [];
for (const s of t.groups) {
const t = n.a.fromState(e, s);
null !== t && i.push(t)
}
return new o(i)
}
_generateNextName() {
const e = new Set(this.groups().map(e => e.name()));
for (let t = 1;; t++) {
const i = "Group " + t,
s = "Group_" + t;
if (!e.has(i) && !e.has(s)) return i
}
}
}
},
mZrn: function(e, t, i) {
"use strict";
i.r(t);
var s = i("FBuY"),
r = i("JWMC"),
n = i("+6II");
function o(e, t = !1) {
("attachEvent" in document ? "complete" === document.readyState : "loading" !== document
.readyState) ? t ? setTimeout(() => e(), 1) : e(): document.addEventListener(
"DOMContentLoaded", () => e())
}
new Promise(e => {
o(e)
});
const a = /\b(msie|trident)\b/i.test(navigator.userAgent) ? 1 : 0;
function l(e) {
return e.offsetWidth + a < e.scrollWidth
}
o(() => {
document.addEventListener("mouseenter", e => {
const t = e.target;
var i;
t instanceof HTMLElement && t.matches(".apply-overflow-title") && ((i =
t).getAttribute("title") || i.offsetWidth + a >= i
.scrollWidth || i.setAttribute("title", i.textContent || ""))
}, !0), document.addEventListener("mouseenter", e => {
const t = e.target;
if (t instanceof HTMLElement && t.matches(".apply-overflow-tooltip")) {
if (t.matches(".apply-overflow-tooltip--check-children")) {
let e = !1;
const i = t.children;
for (let t = 0; t < i.length; t++) {
const s = i[t];
if (s instanceof HTMLElement && l(s)) {
e = !0;
break
}
}
if (!e) return
} else if (!l(t)) return;
let e = "";
e = t.matches && t.matches(".apply-overflow-tooltip--allow-text") ?
t.textContent || "" : Array.from(t.childNodes).reduce((e, t) =>
(t.nodeType === Node.TEXT_NODE && e.push(t.textContent ||
""), e), []).join("").trim(), Object(n.c)(t, {
text: e
});
const i = () => {
Object(n.a)(), ["mouseleave", "mousedown"].forEach(e => t
.removeEventListener(e, i))
};
["mouseleave", "mousedown"].forEach(e => t.addEventListener(e, i))
}
}, !0)
});
var c = i("aIyQ"),
h = i.n(c),
u = i("VVxS"),
d = i("FIi8");
let p;
function _(e) {
window.iframeAuthWidget && !1 === window.user.profile_data_filled && (window
.iframeAuthWidget.preventClose = !0);
const t = window.user.available_offers || {};
window.TVSettings && window.TVSettings.sync(window.user.settings), window.is_authenticated ?
(e || (initOfferLoginStateChangeButton(), onGoPro() && window.user.is_pro && window
.location.reload()), !1 === window.user.profile_data_filled && (Object(r
.trackEvent)("Conversion", "First login"), delete window.user
.profile_data_filled)) : (Object.keys(t).forEach(e => {
const i = e;
t[i].available_for_anons || delete t[i]
}), window.user = {
username: "Guest",
following: "0",
followers: "0",
ignore_list: [],
available_offers: t
}, u.TVLocalStorage.removeItem("trial_availiable"))
}
p = window.loginStateChange ? window.loginStateChange : window.loginStateChange = new h.a, p
.subscribe(null, _), s.TVXWindowEvents.on("loginStateChange", e => {
const t = JSON.parse(e);
window.user = t.user, window.is_authenticated = !!t.is_authenticated, p.fire()
}), s.TVXWindowEvents.on("signOut", () => {
! function() {
if (window.initData.lfs) {
const e = document.getElementsByClassName("js-admin-warning")[0];
document.body.removeChild(e)
}
let e = !0;
[/^\/chart\//, /^\/share-your-love\//].forEach(t => {
t.test(window.location.pathname) && (e = !1)
}), e && window.location.reload()
}()
}), (() => {
const e = {};
window.crossTabSyncUserAttr = e => {
const t = {};
e instanceof Array ? e.forEach(e => {
t[e] = window.user[e]
}) : t[e] = window.user[e],
s.TVXWindowEvents.emit("user-obj-changed", JSON.stringify(t))
}, s.TVXWindowEvents.on("user-obj-changed", t => {
const i = JSON.parse(t);
let s;
for (s in i)
if (i.hasOwnProperty(s)) {
window.user[s] = i[s];
(e[s] || []).forEach(e => {
e.fire(i[s])
})
}
})
})(), window.TradingView.changeLoginState = e => {
window.is_authenticated = !!e, s.TVXWindowEvents.emit("loginStateChange", JSON
.stringify({
is_authenticated: window.is_authenticated,
user: window.user
})), p.fire()
}, window.loginUser = function(e, t) {
window.TVDialogs && window.TVDialogs.signModal && window.TVDialogs.signModal.close(),
window.user = Object(d.deepExtend)({}, e), window.TradingView.changeLoginState(!0),
"function" == typeof t && window.TVDialogs && window.TVDialogs.signModal ? window
.TVDialogs.signModal.on("signinSuccess", () => {
t()
}) : "function" == typeof t && t()
}, window.loginRequiredDelegate = new h.a, window.runOrSignIn = (e, t) => {
t || (t = {}), e()
}, window.onLoginStateChange = _, window.TradingView.setTrialAvailiable = e => {
u.TVLocalStorage.setItem("trial_availiable", e ? "1" : "0")
}, window.TradingView.notificationsChanged = new h.a
},
me8f: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolBalloon", (function() {
return h
}));
var s = i("YFKU"),
r = i("Ocx9"),
n = i("Ss5c"),
o = i("tc+8"),
a = i.n(o),
l = i("j3hX");
const c = Object(s.t)("Comment");
class h extends n.LineDataSource {
constructor(e, t) {
const s = t || h.createProperties();
super(e, s), i.e("lt-pane-views").then(i.bind(null, "Hyqq")).then(t => {
this._setPaneViews([new t.BalloonPaneView(this, e)])
})
}
pointsCount() {
return 1
}
name() {
return "Balloon"
}
properties() {
return super.properties()
}
template() {
const e = super.template();
return e.text = this.properties().childs().text.value(), e
}
static createProperties(e) {
const t = new r.DefaultProperty("linetoolballoon", e);
return h._configureProperties(t), t
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "RhWr")).then(
e => e.BalloonDefinitionsViewModel)
}
static _configureProperties(e) {
n.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
"text", new a.a(c)), e.addExclusion("text"), e.addChild("linesColors",
new l.LineToolColorsProperty([e.childs().borderColor])), e.addChild(
"textsColors", new l.LineToolColorsProperty([e.childs().color]))
}
}
},
mf9N: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("GD+X"),
n = i("96Yh"),
o = i("ogJP"),
a = i("RDU5");
class l extends a.UndoCommand {
constructor(e, t, i) {
super("Change Pane Height"), this._model = e, this._paneIndex = t, this
._paneHeight = i, this._prevStretchFactors = this._model.panes().map(e => e
.stretchFactor())
}
redo() {
this._model.changePanesHeight(this._paneIndex, this._paneHeight)
}
undo() {
const e = this._model.panes();
for (let t = 0; t < e.length; ++t) e[t].setStretchFactor(Object(s.ensureDefined)
(this._prevStretchFactors[t]));
this._model.fullUpdate()
}
}
i.d(t, "PaneApi", (function() {
return c
}));
class c {
constructor(e, t) {
this._priceScales = new WeakMap, this._pane = e, this._chartWidget = t
}
hasMainSeries() {
return this._pane.containsMainSeries()
}
getLeftPriceScales() {
return this._pane.leftPriceScales().map(this._getPriceScaleApi, this)
}
getRightPriceScales() {
return this._pane.rightPriceScales().map(this._getPriceScaleApi, this)
}
getMainSourcePriceScale() {
const e = this._pane.mainDataSource();
if (null === e) return null;
const t = e.priceScale();
return null === t || this._pane.isOverlay(e) ? null : this._getPriceScaleApi(t)
}
setMaximized(e) {
if (this._pane.isMaximized() !== e)
for (const e of this._chartWidget.paneWidgets())
if (e.state() === this._pane) {
this._chartWidget.toggleMaximizePane(e);
break
}
}
legendLoaded() {
const e = this._chartWidget.paneByState(this._pane);
return Boolean(e && e.statusWidget())
}
getAllEntities() {
const e = this._pane.model();
return this._pane.sourcesByGroup().allIncludingHidden().map(t => Object(n
.entityForDataSource)(e, t)).filter(o.notNull).filter(e => null !== e.name)
}
getHeight() {
return this._pane.height()
}
setHeight(e) {
const t = this._chartWidget.model().model(),
i = t.panes();
Object(s.assert)(i.length > 1,
"Unable to change pane's height if there is only one pane");
const r = i.indexOf(this._pane);
Object(s.assert)(-1 !== r, "Invalid pane index");
const n = new l(t, r, e);
this._chartWidget.model().undoHistory().pushUndoCommand(n)
}
moveTo(e) {
const t = this.paneIndex();
t !== e && (Object(s.assert)(e >= 0 && e < this._chartWidget.paneWidgets().length,
"Invalid pane index"), this._chartWidget.model().movePane(t, e))
}
paneIndex() {
return this._chartWidget.model().model().panes().indexOf(this._pane)
}
_getPriceScaleApi(e) {
let t = this._priceScales.get(e);
return void 0 === t && (t = new r.a(this._chartWidget.model(), e), this._priceScales
.set(e, t)), t
}
}
},
mkn5: function(e, t, i) {
"use strict";
(function(t, s) {
i("AE9l"), i("YFKU");
var r = i("UCjq").PaneWidgetBase,
n = i("1IXQ").scaleRatioForContextMenuTransformer(7),
o = i("CW80").isLineToolName,
a = i("YmeR").ActionBinder,
l = i("7KDR"),
c = l.Action,
h = l.Separator,
u = i("mMWL"),
d = i("FQhm"),
p = i("S8xo").MouseEventHandler;
e.exports.PaneWidget = class extends r {
constructor(e, i, s, r) {
super(e, i, s, r), this.setCursorForTool(), this._mouseEventHandler =
new p(this._topCanvasBinding.canvas, this, {
treatVertTouchDragAsPageScroll: !this._options.handleScroll
.vertTouchDrag,
treatHorzTouchDragAsPageScroll: !this._options.handleScroll
.horzTouchDrag
}), this.actions = [], this.readonlyActions = [], this
._prevHoveredHittest = null, this._chart.withModel(this, (
function() {
var e = this._chartUndoModel();
e.onSimpleZoomIn().subscribe(this, this
._updateCrosshairOnZoom), e.onSimpleZoomOut()
.subscribe(this, this._updateCrosshairOnZoom)
})), this._highlightedPriceAxis = new t({
owner: "",
axis: null
}), this._highlightedPriceAxis.subscribe(function(e) {
this._highlightPriceAxisByLabel(e.axis)
}.bind(this)), this._prevPinchScale = 0, this._isDestroyed = !1
}
destroy() {
for (var e in super.destroy(), this._prevHoveredHittest = null, this
._mouseEventHandler.destroy(), this._rowElement.parentElement
.removeChild(this._rowElement), this) delete this[e];
this._isDestroyed = !0
}
_highlightPriceAxisByLabel(e) {
this._lhsPriceAxisesContainer.highlightPriceAxisByLabel(e), this
._rhsPriceAxisesContainer.highlightPriceAxisByLabel(e)
}
chart() {
return this._chart
}
stretchFactor() {
return this._state ? this._state._stretchFactor : 0
}
setStretchFactor(e) {
this.hasState() && (this._state._stretchFactor = e)
}
hideInplaceEditor() {
return !!this._inplaceEditor && (this._inplaceEditor.remove(), this
._inplaceEditor = void 0, !0)
}
drawRightThere(e) {
if (o(e)) {
var t = this._chartUndoModel(),
i = t.crossHairSource(),
s = t.model().magnet().align(i.price, i.index, this._state);
t.createLineTool(this.state(), {
index: i.index,
price: s
}, e)
}
}
createRemoveMenu() {
var e = this._chart.actions();
return new c({
label: window.t("Remove"),
statName: "Remove",
subItems: [e.paneRemoveAllStudies, e
.paneRemoveAllDrawingTools, e
.paneRemoveAllStudiesDrawingTools
]
})
}
_customActions() {
var e = {
top: [],
bottom: [],
remove: []
},
t = this._chartUndoModel().timeScale(),
i = this._state && this._state.defaultPriceScale();
if (!s.enabled("custom_items_in_context_menu")) return e;
var r, n = t.isEmpty() ? void 0 : t.indexToUserTime(t.coordinateToIndex(
this._contextMenuX));
if (i && !i.isEmpty()) {
var o = this._state.mainDataSource().firstValue();
r = i.coordinateToPrice(this._contextMenuY, o)
}
return d.emit("onContextMenu", {
unixtime: n ? n / 1e3 : void 0,
price: r,
callback: function(t) {
[].concat(t).forEach((function(t) {
var i;
t.text && (t.text.length > 1 &&
"-" === t.text[0] ? e.remove
.push(t.text.slice(1)) : (
i = "-" === t.text ?
new h : new c({
label: t.text,
onExecute: t
.click
}), t.position &&
"top" === t.position ? e
.top.push(i) : e.bottom
.push(i)))
}))
}
}), e
}
update() {
this._lhsPriceAxisesContainer.update(), this._rhsPriceAxisesContainer
.update(), null !== this._legendWidget && this._legendWidget
.update(), this.updateControls()
}
createActionLockScale(e) {
if (!(e instanceof TradingView.Series)) return null;
var t = n(e.priceScale(), this._chartUndoModel().model()
.mainSeriesScaleRatio()),
i = new c({
checkable: e.priceScale().isLockScale(),
label: window.t("Lock Scale") + " " + t,
statName: "LockScale"
});
return i._binding = new a(i, e.priceScale().properties().lockScale, this
._chartUndoModel(), "Lock Scale", (function() {
var t = {
lockScale: this.value()
};
this._undoModel.setPriceScaleMode(t, e.priceScale(),
this._undoText)
})), i
}
_updateCrosshairOnZoom() {
if (u.lockTimeAxis().value()) {
var e = this._chartUndoModel().crossHairSource();
e.setPosition(e.index, e.price, this.state())
}
}
highlightedPriceAxis() {
return this._highlightedPriceAxis
}
}
}).call(this, i("hY0g"), i("Kxc7"))
},
n0Bl: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "migrateShortcut", (function() {
return o
}));
var s = i("/3z9");
function r(e) {
if ("number" == typeof e) return e;
switch (e.toLowerCase()) {
case "ctrl":
return s.Modifiers.Control;
case "shift":
return s.Modifiers.Shift;
case "alt":
return s.Modifiers.Alt;
default:
return e.toUpperCase().charCodeAt(0)
}
}
function n(e) {
let t = 0;
for (let i = 0; i < e.length; i++) t |= r(e[i]);
return t
}
function o(e) {
return "number" == typeof e ? e : "string" == typeof e ? n(e.split("+")) : Array.isArray(
e) ? n(e) : 0
}
},
n40Z: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolVertLine", (function() {
return h
}));
var s = i("Eyy1"),
r = i("aO4+"),
n = i("Ocx9"),
o = i("tc+8"),
a = i.n(o),
l = i("Ss5c"),
c = i("GmZZ");
class h extends l.LineDataSource {
constructor(e, t) {
const s = t || h.createProperties();
super(e, s), this._timeAxisView = new c.a(this), this._paneViewFactory = null,
this.properties().childs().extendLine.subscribe(this, () => e
.lightUpdate()),
i.e("lt-pane-views").then(i.bind(null, "BSCN")).then(t => {
this._paneViewFactory = i => new t.VertLinePaneView(this, e, i),
this._model.lightUpdate()
})
}
destroy() {
this.properties().childs().extendLine.unsubscribeAll(this), super.destroy()
}
pointsCount() {
return 1
}
properties() {
return super.properties()
}
name() {
return "Vertical Line"
}
timeAxisViews() {
return this.isSourceHidden() ? null : this.properties().childs().showTime
.value() ? [this._timeAxisView] : null
}
updateAllViews() {
super.updateAllViews(), this._timeAxisView.update()
}
canHasAlert() {
return !0
}
template() {
const e = super.template();
return e.text = this.properties().childs().text.value(), e.showLabel = this
.properties().childs().showLabel.value(), e
}
isMultiPaneAvailable() {
return !0
}
isMultiPaneEnabled() {
return this.properties().childs().extendLine.value()
}
paneViews(e) {
return e = Object(s.ensureDefined)(e), this.isMultiPaneEnabled() || this._model
.paneForSource(this) === e ? (null === this._getPaneViews(e) && null !==
this._paneViewFactory && this._setPaneViews([this._paneViewFactory(e)],
e, !0), super.paneViews(e)) : null
}
priceAxisViews() {
return null
}
priceAxisPoints() {
return []
}
pointToScreenPoint(e) {
const t = this._model.timeScale();
if (t.isEmpty()) return [new r.Point(0, 0), new r.Point(0, 0)];
const i = t.indexToCoordinate(e.index),
s = new r.Point(i, 0);
return [s, s]
}
convertYCoordinateToPriceForMoving(e) {
return 0
}
static createProperties(e) {
null != e && (void 0 === e.textOrientation && (e.textOrientation =
"horizontal"), void 0 === e.extendLine && (e.extendLine = !1));
const t = new n.DefaultProperty("linetoolvertline", e);
return h._configureProperties(t), t
}
_getAlertPlots() {
const e = this._points[0],
t = {
index: e.index,
price: e.price + 1
};
return [this._linePointsToAlertPlot([e, t], null, !0, !0)]
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "FkpW")).then(
e => e.VerticalLineDefinitionsViewModel)
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text ||
""), this.properties().childs().showLabel.setValue(Boolean(e.showLabel))
}
static _configureProperties(e) {
l.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
"text", new a.a("")), e.addExclusion("text"), e.addExclusion(
"showLabel")
}
}
},
n5al: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "isRequiringRestartSeriesStyles", (function() {
return v
})), i.d(t, "isRangeBasedStyle", (function() {
return S
})), i.d(t, "isRangeStyle", (function() {
return y
})), i.d(t, "isTimeBasedStyle", (function() {
return w
})), i.d(t, "isValidStyle", (function() {
return P
})), i.d(t, "isSingleValueBasedStyle", (function() {
return C
})), i.d(t, "setLastUsedStyle", (function() {
return x
})), i.d(t, "getLastUsedStyle", (function() {
return T
})), i.d(t, "getDefaultStyle", (function() {
return I
})), i.d(t, "getChartStyleByResolution", (function() {
return M
})), i.d(t, "chartStyleStudyId", (function() {
return O
})), i.d(t, "preparePriceAxisProperties", (function() {
return L
})), i.d(t, "hasProjection", (function() {
return E
})), i.d(t, "isPriceSourceStyle", (function() {
return k
})), i.d(t, "getSeriesPriceFormattingState", (function() {
return D
})),
i.d(t, "createSeriesFormatter", (function() {
return V
})), i.d(t, "symbolCurrencyConvertible", (function() {
return B
})), i.d(t, "symbolCurrency", (function() {
return R
})), i.d(t, "symbolOriginalCurrency", (function() {
return N
})), i.d(t, "symbolBaseCurrency", (function() {
return j
})), i.d(t, "isConvertedToOtherCurrency", (function() {
return F
})), i.d(t, "symbolUnitConvertible", (function() {
return W
})), i.d(t, "symbolUnit", (function() {
return H
})), i.d(t, "symbolOriginalUnit", (function() {
return U
})), i.d(t, "isConvertedToOtherUnit", (function() {
return z
})), i.d(t, "symbolUnitConvertibleGroupsIfExist", (function() {
return G
})), i.d(t, "symbolCurrentContract", (function() {
return q
})), i.d(t, "extractSymbolNameFromSymbolInfo", (function() {
return Y
})), i.d(t, "symbolTitle", (function() {
return K
})), i.d(t, "displayedSymbolName", (function() {
return J
})), i.d(t, "displayedSymbolExchange", (function() {
return Z
})), i.d(t, "actualSymbol", (function() {
return X
})), i.d(t, "proSymbol", (function() {
return $
})), i.d(t, "symbolForApi", (function() {
return Q
})), i.d(t, "isRegularSessionId", (function() {
return ee
}));
var s = i("Vdly"),
r = i("dfhE"),
n = i("LxhU"),
o = i("kcTO"),
a = i("Kxc7"),
l = i("Eyy1"),
c = i("nEwK"),
h = i("GH0z");
const u = a.enabled("pay_attention_to_ticker_not_symbol"),
d = a.enabled("uppercase_instrument_names"),
p = a.enabled("charting_library_single_symbol_request"),
_ = a.enabled("use_ticker_on_symbol_info_update"),
m = [4, 5, 6, 7, 8],
f = [4, 5, 6, 7, 8, 11],
g = [0, 1, 9, 2, 3, 10],
b = [2, 10, 3];
function v(e) {
return -1 !== m.indexOf(e)
}
function S(e) {
return -1 !== f.indexOf(e)
}
function y(e) {
return 11 === e
}
function w(e) {
return -1 !== g.indexOf(e)
}
function P(e) {
return S(e) || w(e)
}
function C(e) {
switch (e) {
case 3:
case 10:
case 2:
return !0;
default:
return !1
}
}
function x(e) {
P(e) && 11 !== e && s.setValue("chart.lastUsedStyle", e)
}
function T() {
const e = s.getInt("chart.lastUsedStyle");
return void 0 === e ? 1 : e
}
function I(e) {
return e ? 11 : 1
}
function M(e, t) {
const i = y(t),
s = n.Interval.isRange(e);
return !i && s ? I(!0) : i && !s ? I(!1) : t
}
function O(e, t) {
const i = r.SYMBOL_STRING_DATA[e];
return void 0 === i ? null : t ? `${i.type}-${i.basicStudyVersion}` : i.type
}
function L(e) {
const t = e.priceAxisProperties,
i = t.lockScale.value(),
s = 6 === e.style.value();
(s || i) && (t.log.setValue(!1), t.percentage.setValue(!1)), t.logDisabled.setValue(!(!s &&
!i)), t.percentageDisabled.setValue(!(!s && !i))
}
const A = [4, 7, 5, 6];
function E(e) {
return -1 !== A.indexOf(e)
}
function k(e) {
return b.includes(e)
}
function D(e, t = "default", i = !1) {
let s, r, n = 100,
o = 1;
if ("default" === t) null != e && (n = e.pricescale, o = e.minmov, s = e.fractional, r = e
.minmove2);
else {
let e = t.split(",");
3 !== e.length && (e = ["100", "1", "false"]), n = parseInt(e[0]), o = parseInt(e[1]),
s = "true" === e[2]
}
return i && (o = 1), {
priceScale: n,
minMove: o,
fractional: s,
minMove2: r
}
}
function V(e, t, i = !1) {
if ("default" === t && null != e && ("volume" === e.formatter || "volume" === e.format))
return new c.VolumeFormatter(2);
if ("default" === t && null != e && ("percent" === e.formatter || "percent" === e.format))
return new h.PercentageFormatter;
const {
priceScale: s,
minMove: r,
fractional: n,
minMove2: a
} = D(e, t, i);
return new o.PriceFormatter(s, r, n, a)
}
function B(e) {
return null !== e && "spread" !== e.type
}
function R(e, t, i) {
if (null === e) return null;
const s = !t || i ? e.currency_id : e.currency_code;
return void 0 === s || "" === s ? null : s
}
function N(e, t) {
return (t ? e.original_currency_code : e.original_currency_id) || R(e, t)
}
function j(e) {
return e.base_currency_id || null
}
function F(e) {
return !(null === e || !B(e)) && (void 0 !== e.original_currency_id && e
.original_currency_id !== e.currency_id)
}
function W(e) {
return null !== e && "spread" !== e.type
}
function H(e) {
if (null === e) return null;
const t = e.unit_id;
return void 0 === t || "" === t ? null : t
}
function U(e) {
return e.original_unit_id || H(e)
}
function z(e) {
return !(null === e || !W(e)) && (void 0 !== e.original_unit_id && e.original_unit_id !== e
.unit_id)
}
function G(e) {
return null !== e && W(e) ? e.unit_conversion_types || null : []
}
function q(e) {
return "futures" === e.type && e.front_contract || null
}
function Y(e, t) {
let i = e && (e.pro_name || e.full_name || e.name);
return p && t ? i = t : _ && e && e.ticker && (i = e.ticker), d && i && (i = i
.toUpperCase()), i
}
function K(e, t) {
return t ? e.name : `${e.name}, ${e.exchange}`
}
function J(e) {
let t = e && (q(e) || e.name) || "";
return t.length > 40 && (t = t.substr(0, 37) + "..."), t.trim()
}
function Z(e) {
const t = e ? e.exchange : "";
return d ? t.toUpperCase() : t
}
function X(e, t) {
return null !== e ? e.full_name : t
}
function $(e, t) {
return null !== e ? e.pro_name : t
}
function Q(e, t) {
return u && e ? Object(l.ensureDefined)(e.ticker) : X(e, t)
}
function ee(e) {
return "regular" === e || "us_regular" === e
}
},
nBJD: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
class s {
constructor(e) {
this._text = "", this._color = "", this._size = "13px", this._bold = !1, this
._statusProvider = e
}
text() {
return this._text
}
getSplitTitle() {
return [this._text]
}
color() {
return this._statusProvider.color()
}
bold() {
return this._bold
}
size() {
return this._size
}
}
},
nEwK: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PLACE_HOLDER", (function() {
return a
})), i.d(t, "VolumeFormatter", (function() {
return l
}));
var s = i("YFKU"),
r = i("zXvd"),
n = i("ogJP"),
o = i("ivNn");
const a = "---";
class l {
constructor(e) {
this.type = "volume", this._numericFormatter = new r.NumericFormatter, this
._fractionalValues = void 0 !== e && e > 0, this._precision = e
}
state() {
return {
precision: this._precision
}
}
format(e, t) {
if (!Object(n.isNumber)(e)) return a;
let i = "";
return e < 0 ? (i = "−", e = -e) : e > 0 && t && (i = "+"), e >= 1e100 ? Object(s.t)
("N/A") : (!this._fractionalValues || e >= 995 ? e = Math.round(e) : this
._fractionalValues && (e = +e.toFixed(this._precision)), e < 995 ? i + this
._formatNumber(e) : e < 999995 ? i + this._formatNumber(e / 1e3) + "K" : e <
999999995 ? (e = 1e3 * Math.round(e / 1e3), i + this._formatNumber(e /
1e6) + "M") : e < 999999999995 ? (e = 1e6 * Math.round(e / 1e6), i +
this._formatNumber(e / 1e9) + "B") : (e = 1e9 * Math.round(e / 1e9), i +
this._formatNumber(e / 1e12) + "T"))
}
parse(e) {
if ("---" === e) return {
error: "not a number",
res: !1,
value: NaN
};
const t = {
K: 1e3,
M: 1e6,
B: 1e9
},
i = e.slice(-1);
if (t.hasOwnProperty(i)) {
const s = this._numericFormatter.parse(e.slice(0, -1));
return Object(n.isNumber)(s) ? {
res: !0,
value: s * t[i]
} : {
error: "not a number",
res: !1,
value: NaN
}
} {
const t = this._numericFormatter.parse(e);
return Object(n.isNumber)(t) ? {
res: !0,
value: t
} : {
error: "not a number",
res: !1,
value: NaN
}
}
}
static serialize(e) {
return e.state()
}
static deserialize(e) {
return new l(e.precision)
}
_formatNumber(e) {
return this._fractionalValues && (e = Object(o.fixComputationError)(e)), this
._numericFormatter.format(e).replace(/(\.[1-9]*)0+$/, (e, t) => t)
}
}
},
nW7S: function(e, t, i) {
"use strict";
(function(e) {
var s = i("aO4+").Point,
r = i("Ss5c").LineDataSource,
n = i("Ocx9").DefaultProperty;
class o extends e {
constructor(e) {
super(), this._lineSource = e
}
value() {
var e = 180 * this._lineSource._angle / Math.PI;
return Math.round(e)
}
setValue(e) {
var t = e * Math.PI / 180;
this._lineSource._angle = t;
var i = this._lineSource.pointToScreenPoint(this._lineSource.points()[0])[
0],
r = Math.cos(this._lineSource._angle),
n = -Math.sin(this._lineSource._angle),
o = new s(r, n),
a = i.addScaled(o, this._lineSource._distance),
l = this._lineSource.screenPointToPoint(a);
this._lineSource._points[1] = l, this._lineSource._model.updateSource(this
._lineSource), this._lineSource.updateAllViews(), this._lineSource
._model.updateSource(this._lineSource)
}
}
class a extends r {
constructor(e, t) {
super(e, t || a.createProperties()), this._properties.addChild("angle",
new o(this)), i.e("lt-pane-views").then(i.t.bind(null, "XHET", 7))
.then(({
TrendAnglePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
isSynchronizable() {
return !1
}
pointsCount() {
return 2
}
name() {
return "Trend Angle"
}
_calculateAngle() {
var e = this.pointToScreenPoint(this.points()[0])[0],
t = this.pointToScreenPoint(this.points()[1])[0],
i = t.subtract(e);
i.length() > 0 ? (i = i.normalized(), this._angle = Math.acos(i.x), i.y >
0 && (this._angle = -this._angle), this._distance = t.subtract(e)
.length()) : delete this._angle, this.properties().hasOwnProperty(
"angle") && this.properties().angle.listeners().fire(this
.properties().angle)
}
addPoint(e, t) {
var i = r.prototype.addPoint.call(this, e, t);
return i && this._calculateAngle(), i
}
setLastPoint(e, t) {
super.setLastPoint(e, t), this.points().length > 1 && this._calculateAngle()
}
axisPoints() {
if (this.points().length < 2) return [];
var e = [this.points()[0]],
t = this.pointToScreenPoint(this.points()[0])[1],
i = Math.cos(this._angle) * this._distance,
r = -Math.sin(this._angle) * this._distance,
n = t.add(new s(i, r)),
o = this.screenPointToPoint(n);
return e.push(o), e
}
setPoint(e, t, i) {
super.setPoint(e, t, i), this.points().length > 1 && 1 === e && this
._calculateAngle()
}
restoreData(e) {
this._angle = e.angle, this._distance = e.distance
}
state(e) {
var t = r.prototype.state.call(this, e);
return t.angle = this._angle, t.distance = this._distance, t
}
cloneData(e) {
this._angle = e._angle, this._distance = e._distance
}
canHasAlert() {
return !0
}
_getAlertPlots() {
return [this._linePointsToAlertPlot(this._points, null, this.properties()
.extendLeft.value(), this.properties().extendRight.value())]
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null,
"o1gc"))).TrendAngleDefinitionsViewModel
}
_snapTo45DegreesAvailable() {
return !0
}
static createProperties(e) {
var t = new n("linetooltrendangle", e);
return a._configureProperties(t), t
}
static _configureProperties(e) {
r._configureProperties(e)
}
}
t.LineToolTrendAngle = a
}).call(this, i("tc+8"))
},
"nd9+": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolGannComplex", (function() {
return h
}));
var s = i("aO4+"),
r = i("Eyy1"),
n = i("T6Of"),
o = i("Ss5c"),
a = i("FaJS"),
l = i("LAp3"),
c = i("j3hX");
class h extends o.LineDataSource {
constructor(e, t) {
super(e, t || h.createProperties()), this.version = 2, this
._scaleRatioFormatter = new n.LimitedPrecisionNumericFormatter(7), i.e(
"lt-pane-views").then(i.bind(null, "X4Cb")).then(({
GannComplexPaneView: e
}) => {
this._setPaneViews([new e(this, this.model())])
});
const s = this.properties();
this._adjustScaleRatio(s), s.subscribe(this, this._adjustScaleRatio), s.childs()
.scaleRatio.subscribe(this, this._correctFirstPoint), this
._syncStateExclusions = ["scaleRatio"], s.addExclusion("scaleRatio"), this
.properties().onRestoreFactoryDefaults().subscribe(this, this
._handleRestoringFactoryDefaults), this._onTemplateApplying.subscribe(
this, this._handleTemplateApplying), this._onTemplateApplied.subscribe(
this, this._correctFirstPoint)
}
properties() {
return super.properties()
}
migrateVersion(e, t, i) {
1 === e && (this._points.length >= this.pointsCount() ? setTimeout(() => this
._migratePoint()) : this._timePoint.length >= this.pointsCount() &&
this._pointAdded.subscribe(this, this._migratePoint))
}
destroy() {
const e = this.properties();
e.unsubscribe(this, this._adjustScaleRatio), e.childs().scaleRatio.unsubscribe(
this, this._correctFirstPoint), this.properties()
.onRestoreFactoryDefaults().unsubscribe(this, this
._handleRestoringFactoryDefaults), this._onTemplateApplying.unsubscribe(
this, this._handleTemplateApplying), this._onTemplateApplied
.unsubscribe(this, this._correctFirstPoint), super.destroy()
}
pointsCount() {
return 2
}
name() {
return "Gann Square"
}
addPoint(e, t, i) {
this._points.length > 1 && this._points.pop();
const s = super.addPoint(e, t, i),
n = this.priceScale();
return !Object(r.ensureNotNull)(n).isLog() && s && this._correctFirstPoint(), s
}
setPoint(e, t, i) {
super.setPoint(e, t, i), void 0 !== i && i.shift() ? this._correctPoint(e) :
this._correctScaleRatio()
}
setLastPoint(e, t) {
const i = this.priceScale();
Object(r.ensureNotNull)(i).isLog() || (this._points[1] = e, this._correctPoint(
1)), super.setLastPoint(e, t)
}
isReversed() {
return this.properties().childs().reverse.value()
}
levelsCount() {
return this.properties().childs().levels.childCount()
}
levels() {
const e = [],
t = this.properties().childs(),
i = t.levels.childCount();
for (let s = 0; s < i; s++) {
const i = t.levels.childs()[s].childs();
e.push({
index: s,
visible: i.visible.value(),
color: i.color.value(),
width: i.width.value()
})
}
return e
}
fanLinesCount() {
return this.properties().childs().fanlines.childCount()
}
fanLines() {
const e = [],
t = this.properties().childs(),
i = t.fanlines.childCount();
for (let s = 0; s < i; s++) {
const i = t.fanlines.childs()[s].childs();
e.push({
index: s,
visible: i.visible.value(),
x: i.x.value(),
y: i.y.value(),
color: i.color.value(),
width: i.width.value()
})
}
return e
}
arcsCount() {
return this.properties().childs().arcs.childCount()
}
arcs() {
const e = [],
t = this.properties().childs(),
i = t.arcs.childCount();
for (let s = 0; s < i; s++) {
const i = t.arcs.childs()[s].childs();
e.push({
index: s,
visible: i.visible.value(),
x: i.x.value(),
y: i.y.value(),
color: i.color.value(),
width: i.width.value()
})
}
return e
}
arcsBackgroundTransparency() {
return this.properties().childs().arcsBackground.childs().transparency.value()
}
isArcsBackgroundFilled() {
return this.properties().childs().arcsBackground.childs().fillBackground.value()
}
isLabelsVisible() {
return this.properties().childs().showLabels.value()
}
getLabelsStyle() {
const e = this.properties().childs(),
{
font: t,
fontSize: i,
bold: s,
italic: r
} = e.labelsStyle.childs(),
n = e.levels.childCount();
return {
textColor: e.levels.childs()[n - 1].childs().color.value(),
font: t.value(),
fontSize: i.value(),
bold: s.value(),
italic: r.value()
}
}
getScaleRatioStep() {
return 1e-7
}
getScaleRatioFormatter() {
return this._scaleRatioFormatter
}
getPriceDiff() {
const e = this.points();
if (e.length < 2) return null;
const [t, i] = e;
return i.price - t.price
}
getIndexDiff() {
const e = this.points();
if (e.length < 2) return null;
const [t, i] = e;
return i.index - t.index
}
getScaleRatio() {
const e = this.getPriceDiff(),
t = this.getIndexDiff();
return null !== e && null !== t && 0 !== t ? Math.abs(e / t) : null
}
static createProperties(e) {
const t = Object(l.a)("linetoolganncomplex", e);
return h._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "WfUZ")).then(
e => e.GannComplexAndFixedDefinitionsViewModel)
}
static _configureProperties(e) {
o.LineDataSource._configureProperties(e);
const t = [],
i = [],
s = e.childs(); {
const e = s.levels.childCount();
for (let r = 0; r < e; r++) {
const e = s.levels.childs()[r].childs();
t.push(e.width), i.push(e.color)
}
} {
const e = s.fanlines.childCount();
for (let r = 0; r < e; r++) {
const e = s.fanlines.childs()[r].childs();
t.push(e.width), i.push(e.color)
}
} {
const e = s.arcs.childCount();
for (let r = 0; r < e; r++) {
const e = s.arcs.childs()[r].childs();
t.push(e.width), i.push(e.color)
}
}
e.addChild("linesColors", new c.LineToolColorsProperty(i)), e.addChild(
"linesWidths", new c.LineToolWidthsProperty(t))
}
_correctScaleRatio() {
const e = this.properties().childs(),
t = this.getScaleRatio();
e.scaleRatio.setValue(t)
}
_getAdjustedScaleRatio() {
const e = this.model().mainSeries().priceScale(),
t = this.model().timeScale();
return Object(a.scaleRatio)(t, e)
}
_adjustScaleRatio(e) {
const t = e.scaleRatio.value();
"" !== t && null !== t || e.scaleRatio.setValue(this._getAdjustedScaleRatio())
}
_correctPoint(e) {
if (this._points.length < 2) return;
const t = this.getIndexDiff();
if (null === t) return;
const i = this.properties().childs().scaleRatio.value();
if (null !== i) {
const s = this._points[e],
r = 0 === e ? this._points[1] : this._points[0],
n = s.price - r.price > 0,
o = s.index - r.index > 0;
let a = n && !o || !n && o ? -1 : 1;
0 === e && (a = -a), s.price = r.price + a * t * i, this._pointChanged.fire(
e)
}
this.normalizePoints()
}
_correctFirstPoint() {
this._correctPoint(this.isReversed() ? 0 : 1)
}
_handleRestoringFactoryDefaults() {
this.properties().childs().scaleRatio.setValue(this._getAdjustedScaleRatio())
}
_handleTemplateApplying(e) {
"" === e.scaleRatio && (e.scaleRatio = this._getAdjustedScaleRatio())
}
_migratePoint() {
if (this.points().length < this.pointsCount()) return;
const e = this._getScreenPoints();
if (null === e) return;
const t = this.screenPointToPoint(e[1]);
this.setPoint(1, t), this._pointAdded.unsubscribe(this, this._migratePoint)
}
_getScreenPoints() {
const e = this._calcAngle();
if (null === e) return null;
let [t, i] = this.points();
this.isReversed() && ([t, i] = [i, t]);
const r = this.pointToScreenPoint(t)[0],
n = this.pointToScreenPoint(i)[0],
o = Math.sqrt(Math.pow(r.x - n.x, 2) + Math.pow(r.y - n.y, 2)),
a = new s.Point(Math.cos(e), -Math.sin(e)),
l = a.normalized(),
c = l.x < 0 ? -1 : 1,
h = l.y < 0 ? -1 : 1;
return [r.addScaled(a, o), r.add(new s.Point(5 * o * c, 5 * o * h))]
}
_calcAngle() {
const [e, t] = this.points(), i = this.pointToScreenPoint(e)[0];
let s = this.pointToScreenPoint(t)[0].subtract(i);
if (s.length() > 0) {
s = s.normalized();
let e = Math.acos(s.x);
return s.y > 0 && (e = -e), e
}
return null
}
}
},
nda6: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "TimeSpanFormatter", (function() {
return s
}));
i("YFKU");
class s {
format(e) {
const t = e < 0;
e = Math.abs(e);
const i = Math.floor(e / 86400);
e -= 86400 * i;
const s = Math.floor(e / 3600);
e -= 3600 * s;
const r = Math.floor(e / 60);
e -= 60 * r;
let n = "";
return i && (n += i + window.t("d", {
context: "dates"
}) + " "), s && (n += s + window.t("h", {
context: "dates"
}) + " "), r && (n += r + window.t("m", {
context: "dates"
}) + " "), e && (n += e + window.t("s", {
context: "dates"
}) + " "), t && (n = "-" + n), n.trim()
}
}
},
"ng+v": function(e, t, i) {
"use strict";
i.r(t);
var s = i("aO4+"),
r = i("Eyy1"),
n = i("FQhm"),
o = i("txPx"),
a = i("fgLi"),
l = i("mMWL"),
c = i("aIyQ"),
h = i.n(c),
u = i("tc+8"),
d = i.n(u),
p = i("j3hX");
class _ extends d.a {
constructor(e, t) {
super(), this._lineSource = e, this._pointIndex = t, e.pointAdded().subscribe(
this, e => {
this._pointIndex === e && this._listeners.fire(this)
}), e.pointChanged().subscribe(this, e => {
this._pointIndex === e && this._listeners.fire(this)
})
}
value() {
const e = this._lineSource.points()[this._pointIndex].price,
t = Object(r.ensureNotNull)(this._lineSource.ownerSource()).formatter();
if (t.parse) {
const i = t.format(e),
s = t.parse(i);
return s.res ? s.value : e
}
return e
}
setValue(e) {
const t = this._lineSource.points()[this._pointIndex];
t.price = parseFloat("" + e), this._lineSource.startChanging(this._pointIndex,
t), this._lineSource.setPoint(this._pointIndex, t), this._lineSource
.model().updateSource(this._lineSource), this._listeners.fire(this);
const i = this._lineSource.endChanging(!0, !1);
this._lineSource.syncMultichartState(i)
}
}
var m = i("j8de"),
f = i("LxhU"),
g = i("dOnf"),
b = i("Ocx9"),
v = i("WkOR"),
S = i("n5al"),
y = i("hY0g"),
w = i.n(y),
P = i("H0vP"),
C = i("pPtI"),
x = i("eCE5");
i.d(t, "LineDataSourceBase", (function() {
return O
}));
const T = Object(o.getLogger)("Chart.LineDataSource");
class I {
constructor() {
this._states = []
}
start(e) {
this._states.push(e)
}
finish(e) {
const t = Object(r.ensureDefined)(this._states.pop());
return s = t, (i = e).length !== s.length ? {
indexesChanged: !0,
pricesChanged: !0
} : i.reduce((e, t, i) => {
const r = s[i];
return e.indexesChanged = e.indexesChanged || t.index !== r.index, e
.pricesChanged = e.pricesChanged || t.price !== r.price, e
}, {
indexesChanged: !1,
pricesChanged: !1
});
var i, s
}
isEmpty() {
return 0 === this._states.length
}
}
let M = 0;
class O extends a.DataSource {
constructor(e, t) {
super(), this._currentPointsetId = null, this._pointChanged = new h.a, this
._pointAdded = new h.a, this._alertUndoMode = !1, this._priceAxisViews = [],
this._timeAxisViews = [], this._timePoint = [], this._points = [], this
._lastPoint = null, this._paneViews = new Map, this
._normalizedPointsChanged = new h.a,
this._fixedPointsChanged = new h.a, this._changeStatesStack = new I, this
._startMovingPoint = null, this._currentMovingPoint = null, this
._fixedPoints = [], this._isActualSymbol = !1, this._isActualInterval = !1,
this._isActualCurrency = !1, this._isActualUnit = !1, this
._onIsActualIntervalChange = new h.a, this._linkKey = new w.a(null), this
._model = e, this._properties = t, this.localAndServerAlertsMismatch = !1, e
.mainSeries().symbolResolved().subscribe(this, this
._onMainSeriesSymbolResolved)
}
destroy() {
this._paneViews.forEach((e, t) => this._destroyPanePaneViews(t)), this._model
.mainSeries().symbolResolved().unsubscribeAll(this)
}
linkKey() {
return this._linkKey
}
boundToSymbol() {
return !0
}
points() {
const e = [];
for (let t = 0; t < this._points.length; t++) {
const i = this._points[t];
e.push({
index: i.index,
price: i.price,
time: i.time
})
}
return this._lastPoint && e.push({
index: this._lastPoint.index,
price: this._lastPoint.price
}), !this.isFixed() && this._currentMovingPoint && this._startMovingPoint &&
this._correctPoints(e), e
}
timeAxisPoints() {
return this.points()
}
priceAxisPoints() {
return this.points()
}
normalizedPoints() {
return this._timePoint
}
normalizedPointsChanged() {
return this._normalizedPointsChanged
}
fixedPointsChanged() {
return this._fixedPointsChanged
}
widthsProperty() {
var e;
return null !== (e = this._properties.childs().linesWidths) && void 0 !== e ?
e : null
}
lineColorsProperty() {
var e;
return null !== (e = this._properties.childs().linesColors) && void 0 !== e ?
e : null
}
backgroundColorsProperty() {
var e;
return null !== (e = this._properties.childs().backgroundsColors) && void 0 !==
e ? e : null
}
textColorsProperty() {
var e;
return null !== (e = this._properties.childs().textsColors) && void 0 !== e ?
e : null
}
pointsProperty() {
return this._pointsProperty
}
startMoving(e, t, i, s) {
this.isFixed() && this.restoreFixedPoints(), this._startMovingPoint = e
}
move(e, t, i, s) {
if (i && (i.shiftOnly() || i.controlShift()))
if (this.isFixed()) {
const t = this._alignScreenPointHorizontallyOrVertically(Object(r
.ensureDefined)(e.screen));
this._currentMovingPoint = {
screen: t
}
} else {
const t = this._alignPointHorizontallyOrVertically(Object(r
.ensureDefined)(e.logical));
this._currentMovingPoint = {
logical: t
}
}
else this._currentMovingPoint = e;
this.updateAllViews()
}
endMoving(e, t) {
let i = !1,
s = !1;
if (this._currentMovingPoint && this._startMovingPoint) {
if (this.isFixed()) this._correctFixedPoints(this._fixedPoints) && this
._fixedPointsChanged.fire();
else {
const e = Object(r.ensureDefined)(this._currentMovingPoint.logical),
t = Object(r.ensureDefined)(this._startMovingPoint.logical);
i = e.index !== t.index, s = e.price !== t.price;
if (this._correctPoints(this._points)) {
n.emit("drawing_event", this._id, "move");
for (let e = 0; e < this._points.length; e++) this._pointChanged
.fire(e)
}
}
this._startMovingPoint = null, this._currentMovingPoint = null
}
const o = {
indexesChanged: i,
pricesChanged: s
};
return this.isFixed() ? (this.calcPositionPercents(), this.updateAllViews(),
o) : (this.updateAllViews(), i && !e ? (this._properties.childs()
.interval
.setValue(this._model.mainSeries().interval()), this
.normalizePoints(), this.createServerPoints()) : (this
._copyPricesWithoutNormalization(), this._normalizedPointsChanged
.fire()),
(s || i) && this.synchronizeAlert(!this._alertUndoMode), o)
}
startMovingPoint() {
return this._startMovingPoint ? {
...this._startMovingPoint
} : null
}
currentMovingPoint() {
return this._currentMovingPoint ? {
...this._currentMovingPoint
} : null
}
startChanging(e, t) {
void 0 !== e && void 0 !== t && (e < this._priceAxisViews.length && this
._priceAxisViews[e].setActive(!0), e < this._timeAxisViews.length &&
this._timeAxisViews[e].setActive(!0)), this._changeStatesStack.start(
this.points())
}
endChanging(e, t) {
const i = this._changeStatesStack.finish(this.points());
i.indexesChanged && this._changeStatesStack.isEmpty() ? (this._properties
.childs().interval.setValue(this._model.mainSeries().interval()), this
.normalizePoints(), t || this.createServerPoints()) : (this
._copyPricesWithoutNormalization(), this._normalizedPointsChanged.fire()
);
for (let e = 0; e < this._priceAxisViews.length; e++) this._priceAxisViews[e]
.setActive(!1);
for (let e = 0; e < this._timeAxisViews.length; e++) this._timeAxisViews[e]
.setActive(!1);
return this.synchronizeAlert(!e), i
}
setPoint(e, t, i, s) {
if (i && i.shift() && this._snapTo45DegreesAvailable()) {
const i = 0 === e ? 1 : e - 1;
this._snapPoint45Degree(t, this.points()[i])
}
this._points[e].index === t.index ? (this._points[e].price = t.price, this
._pointChanged.fire(e)) : (this._points[e] = t, this._pointChanged.fire(
e))
}
getPoint(e) {
return this.points()[e] || null
}
setLastPoint(e, t) {
this._lastPoint = this._preparePoint(e, t), this.updateAllViews()
}
lastPoint() {
return this._lastPoint
}
getChangePointForSync(e) {
return this.getPoint(e)
}
setPoints(e) {
this._points = e
}
clearData() {
this._points = []
}
denormalizeTimePoints() {
let e = [];
for (let t = 0; t < this._timePoint.length; t++) {
const i = this._model.timeScale().denormalizeTimePoint(this._timePoint[t]);
if (void 0 === i) {
e = [];
break
}
e.push({
index: i,
price: this._timePoint[t].price
})
}
e.length > 0 && (this._points = e)
}
restorePoints(e, t, i) {
this._timePoint = Object(g.deepCopy)(e), this._points = t, i || this
.denormalizeTimePoints()
}
calcIsActualSymbol() {
if (this._model.mainSeries().hasDelayedSymbolIntervalChange()) return;
const e = this.ownerSource();
if (null === e) this._isActualSymbol = !1;
else {
const t = Object(r.ensureNotNull)(e.symbolSource());
this._migrateSymbolProperty();
const i = this._properties.childs().symbol,
s = i.value();
if (this._isActualSymbol = t.symbolSameAsCurrent(s), this._isActualSymbol) {
const e = t.symbol();
Object(v.a)(s, e) || (T.logWarn(
'Possible drawing "migrating" detected from "' + s +
'" to "' + e + '"'), T.logWarn("Series symbolInfo: " + JSON
.stringify(t.symbolInfo())), T.logWarn("" + (new Error)
.stack)), i.setValue(e)
}
}
this.calcIsActualInterval(), this.calcIsActualCurrency(), this
.calcIsActualUnit(), this._onSourceHiddenMayChange()
}
calcIsActualCurrency() {
const e = this.ownerSource();
if (null === e) return void(this._isActualCurrency = !1);
const t = this._properties.childs().currencyId.value();
if (null !== t) {
const i = e.symbolSource();
if (null === i) return;
this._isActualCurrency = t === Object(S.symbolCurrency)(i.symbolInfo(),
void 0, !0)
} else {
const t = Object(r.ensureNotNull)(e.symbolSource()).symbolInfo();
this._isActualCurrency = null !== t && Object(S.symbolCurrency)(t) ===
Object(S.symbolOriginalCurrency)(t)
}
this._onSourceHiddenMayChange()
}
calcIsActualUnit() {
const e = this.ownerSource();
if (null === e) return void(this._isActualUnit = !1);
const t = this._properties.childs().unitId.value();
if (null !== t) this._isActualUnit = t === Object(r.ensureNotNull)(e
.symbolSource()).unit();
else {
const t = Object(r.ensureNotNull)(e.symbolSource()).symbolInfo();
this._isActualUnit = null !== t && Object(S.symbolUnit)(t) === Object(S
.symbolOriginalUnit)(t)
}
this._onSourceHiddenMayChange()
}
calcIsActualInterval() {
const e = this._isActualInterval,
t = this._properties,
i = this._model.mainSeries();
this._isActualInterval = Object(x.a)(f.Interval.parse(i.interval()), t.childs()
.intervalsVisibilities), !this._isActualInterval && this._model
.selection().isSelected(this) && this._model.selectionMacro(e => e
.removeSourceFromSelection(this)), this._isActualInterval !== e && this
._onIsActualIntervalChange.fire(), this._onSourceHiddenMayChange()
}
paneViews(e) {
if (this.isSourceHidden()) return null;
const t = this._getPaneViews(this.isMultiPaneAvailable() ? e : void 0);
if (null === t) return null;
if (1 === t.length) return [t[0]];
const i = [];
for (let e = t.length - 1; e >= 0; --e) i.push(t[e]);
return i
}
detachAlert() {
const e = this.getAlertSync();
if (e && this._alertCallbacks) {
const t = this._alertCallbacks;
e.off("destroy", t.remove), e.off("change:hovered", t.hovered), e.off(
"change:selected", t.selected)
}
this.hasAlert.setValue(!1), this._alertId = void 0
}
start() {
this.createServerPoints()
}
onData(e) {
"pointset_error" !== e.method ? e.params.customId === this
._currentPointsetIdWithPrefix() && this._onPointsetUpdated(e.params.plots) :
T.logError(`Error getting pointset: ${e.params[0]} ${e.params[1]}`)
}
isActualSymbol() {
return this._isActualSymbol
}
isActualCurrency() {
return this._isActualCurrency
}
isActualInterval() {
return this._isActualInterval
}
isActualUnit() {
return this._isActualUnit
}
onIsActualIntervalChange() {
return this._onIsActualIntervalChange
}
setOwnerSource(e) {
null !== this._ownerSource && (this._ownerSource.currencyChanged()
.unsubscribeAll(this), this._ownerSource.unitChanged().unsubscribeAll(
this)), super.setOwnerSource(e), e && (this.setPriceScale(e
.priceScale()), e.currencyChanged().subscribe(this, this
.calcIsActualCurrency), e.unitChanged().subscribe(this, this
.calcIsActualUnit), this.calcIsActualSymbol(), this
._migrateZOrder())
}
dataAndViewsReady() {
return this._paneViews.size > 0
}
pointAdded() {
return this._pointAdded
}
pointChanged() {
return this._pointChanged
}
addPoint(e, t, i) {
const s = this._preparePoint(e, t);
return this._addPointIntenal(s, t, i)
}
updateAllViewsAndRedraw() {
this.updateAllViews(), this._model.updateSource(this)
}
restoreExternalPoints(e, t) {
if (this._timePoint = Object(g.deepCopy)(e.points), t.indexesChanged) {
if (this.properties().interval.setValue(e.interval), !this.isActualSymbol())
return this._clearServerPoints(), void this._normalizedPointsChanged
.fire();
this.createServerPoints()
} else {
const t = Math.min(this._points.length, e.points.length);
for (let i = 0; i < t; i++) this._points[i].price = e.points[i].price
}
this._normalizedPointsChanged.fire()
}
isSourceHidden() {
return !this._properties.childs().visible.value() || Object(l.hideAllDrawings)()
.value() && this.canBeHidden() || !this._isActualInterval || !this
._isActualSymbol || !this._isActualCurrency || !this._isActualUnit
}
createServerPoints() {
if (!this._isActualSymbol) return;
if (!this._model.chartApi().isConnected().value()) return;
if (this._clearServerPoints(), this._model.timeScale().isEmpty()) return;
if (0 === this._timePoint.length && this._points.length > 0 && this
.normalizePoints(), !this._readyToCreatePointset()) return;
this._currentPointsetId = ++M;
const e = Object(r.ensureNotNull)(this._model.mainSeries().seriesSource()
.symbolInstanceId()),
t = this._pointsForPointset(),
i = Object(C.getServerInterval)(this.properties().interval.value());
this._model.chartApi().createPointset(this._currentPointsetIdWithPrefix(),
"turnaround", e, i, t, this.onData.bind(this))
}
finish() {}
tryCreateServerPoints() {
this.isFixed() || this.isSourceHidden() || null === this._currentPointsetId &&
this.createServerPoints()
}
stop() {
this._clearServerPoints()
}
restart() {
this.isFixed() || (this._currentPointsetId = null, this.createServerPoints())
}
isStarted() {
return null !== this._currentPointsetId
}
convertYCoordinateToPriceForMoving(e, t) {
var i;
const s = Object(r.ensureNotNull)(this.priceScale());
if (s.isEmpty()) return null;
const n = this.ownerSource(),
o = Object(r.ensure)(null === (i = n || t) || void 0 === i ? void 0 : i
.firstValue());
return s.coordinateToPrice(e, o)
}
syncMultichartState(e) {
const t = {
points: this._timePoint,
interval: this._model.mainSeries().interval()
},
i = this.linkKey().value();
if (null !== i && this.isSynchronizable()) {
const s = {
model: this._model,
linkKey: i,
symbol: this._model.mainSeries().symbol(),
finalState: t,
changes: e
};
Object(l.finishChangingLineTool)(s)
}
}
enableCurrentIntervalVisibility() {
const e = this.properties().intervalsVisibilities.state();
Object(x.b)(e, f.Interval.parse(this._model.mainSeries().interval())), this
.properties().intervalsVisibilities.mergeAndFire(e)
}
clonePositionOffset() {
return this.isFixed() ? {
barOffset: 0,
xCoordOffset: 20,
yCoordOffset: 20
} : {
barOffset: 0,
xCoordOffset: 0,
yCoordOffset: -40
}
}
_pointsForPointset() {
return this._timePoint.map(e => [e.time_t, e.offset])
}
_snapPoint45Degree(e, t, i) {
const s = this._model.timeScale(),
n = s.indexToCoordinate(t.index),
o = s.indexToCoordinate(e.index) - n,
a = Object(r.ensureNotNull)(this.priceScale()),
l = t.price,
c = e.price,
h = Object(r.ensureNotNull)(Object(r.ensureNotNull)(this.ownerSource())
.firstValue()),
u = a.priceToCoordinate(l, h),
d = a.priceToCoordinate(c, h) - u,
p = Math.round(Math.atan2(o, d) / Math.PI * 4);
if (2 === Math.abs(p)) i || (e.price = l);
else if (0 === Math.abs(p) || 4 === Math.abs(p)) i || (e.index = t.index);
else {
const t = Math.sqrt(o * o + d * d),
i = o < 0 ? -1 : 1,
r = d < 0 ? -1 : 1;
let l = Math.max(Math.abs(d), Math.abs(o));
l /= l * Math.sqrt(2) / t;
const c = Math.round(s.coordinateToIndex(n + l * i)),
p = Math.abs(s.indexToCoordinate(c) - n),
_ = a.coordinateToPrice(u + p * r, h);
e.index = c, e.price = _
}
}
normalizePoint(e) {
return {
...this._model.timeScale().normalizeBarIndex(e.index),
price: e.price
}
}
normalizePoints() {
this._timePoint = [];
for (let e = 0; e < this._points.length; e++)
if (void 0 !== this._points[e].index) {
const t = this.normalizePoint(this._points[e]);
if (!t.time_t) {
this._timePoint = [];
break
}
this._timePoint.push(t)
} this._normalizedPointsChanged.fire()
}
_setPaneViews(e, t, i) {
this._paneViews.set(t, e), void 0 !== t && i && t.onDestroyed().subscribe(this,
() => this._destroyPanePaneViews(t)), this._model.lightUpdate()
}
_getPaneViews(e) {
return this._paneViews.get(e) || null
}
_updateAllPaneViews() {
this._paneViews.forEach(e => {
for (const t of e) t.update()
})
}
_alignPointHorizontallyOrVertically(e) {
const t = this.pointToScreenPoint(e)[1],
i = Object(r.ensureDefined)(Object(r.ensureNotNull)(this._startMovingPoint)
.logical),
s = this.pointToScreenPoint(i)[1],
n = Math.abs(s.x - t.x),
o = Math.abs(s.y - t.y);
if (n < 10 && o < 10) return e;
return {
index: n < o ? i.index : e.index,
price: n < o ? e.price : i.price
}
}
_alignScreenPointHorizontallyOrVertically(e) {
const t = Object(r.ensureDefined)(Object(r.ensureNotNull)(this
._startMovingPoint).screen),
i = Math.abs(t.x - e.x),
n = Math.abs(t.y - e.y);
return i < 10 && n < 10 ? e : i < n ? new s.Point(t.x, e.y) : new s.Point(e.x, t
.y)
}
_correctPoints(e) {
const t = Object(r.ensureDefined)(Object(r.ensureNotNull)(this
._currentMovingPoint).logical),
i = Object(r.ensureDefined)(Object(r.ensureNotNull)(this._startMovingPoint)
.logical),
s = t.index - i.index,
n = t.price - i.price;
if (0 === s && 0 === n) return !1;
for (let t = 0; t < e.length; t++) {
const i = e[t];
i.index = i.index + s, i.price += n, e[t] = i
}
return !0
}
_correctFixedPoints(e) {
const t = Object(r.ensureDefined)(Object(r.ensureNotNull)(this
._currentMovingPoint).screen),
i = Object(r.ensureDefined)(Object(r.ensureNotNull)(this._startMovingPoint)
.screen),
s = t.subtract(i);
if (s.length() >= 1) {
for (let t = 0; t < e.length; t++) e[t] = e[t].add(s);
return !0
}
return !1
}
_currentPointsetIdWithPrefix() {
return "pointset_" + this._currentPointsetId
}
_clearServerPoints() {
null !== this._currentPointsetId && this._model.chartApi().isConnected()
.value() && this._model.chartApi().removePointset(this
._currentPointsetIdWithPrefix()), this._currentPointsetId = null
}
_createPointProperty(e) {
const t = this._pointsProperty.childs().points;
t.addProperty("" + e, {});
const i = t[e];
i.addChild("price", new _(this, e)), i.addChild("bar", new m.a(this, e))
}
_createPointsProperties() {
this._pointsProperty = new d.a, this._pointsProperty.addChild("points", new d
.a);
for (let e = 0; e < this.pointsCount(); e++) this._createPointProperty(e)
}
_alignPointToRangeOfActualData(e) {
const t = Object(r.ensureNotNull)(this._model.mainSeries().bars().firstIndex()),
i = Object(r.ensureNotNull)(this._model.mainSeries().bars().lastIndex());
let s = Math.max(e.index, t);
return s = Math.min(s, i), {
...e,
index: s
}
}
_migrateSymbolProperty() {
const e = this._properties.childs();
if (e.symbolStateVersion.value() < 2) {
const t = Object(r.ensureNotNull)(this.ownerSource()),
i = Object(r.ensureNotNull)(t.symbolSource());
if (i === this._model.mainSeries()) return void e.symbolStateVersion
.setValueSilently(2);
if (null === i.symbolInfo()) return;
this._model.mainSeries().symbolSameAsCurrent(e.symbol.value()) && e.symbol
.setValueSilently(i.symbol()), e.symbolStateVersion.setValueSilently(2)
}
}
_migrateZOrder() {
const e = this._properties.childs();
e.zOrderVersion.value() < 2 && (this.ownerSource() === this.model()
.mainSeries() && this.setZorder(this.zorder() - this.model()
.mainSeries()
.obsoleteZOrder()), e.zOrderVersion.setValueSilently(2))
}
_preparePoint(e, t) {
const i = e;
return t && t.shift() && this.points().length >= 2 && this
._snapTo45DegreesAvailable() && this._snapPoint45Degree(i, this.points()[
this.points().length - 2]), i
}
_addPointIntenal(e, t, i) {
this._points.push(e);
const s = this._points.length === this.pointsCount();
return s ? (this._lastPoint = null, i || (this.normalizePoints(), this
.createServerPoints())) : this._lastPoint = e, this._pointAdded.fire(
this._points.length - 1), s
}
_onSourceHiddenMayChange() {
this._model.invalidate(P.InvalidationMask.validateAction(() => {
this._isDestroyed || this._processHibernate()
}))
}
_processHibernate() {
this.isSourceHidden() ? this.isStarted() && this.stop() : this.isStarted() ||
this.start()
}
_onPointsetUpdated(e) {
if (0 === e.length) return;
for (let t = 0; t < e.length; t++) {
const i = e[t],
s = this._timePoint[i.index],
r = {
index: i.value[0],
time: new Date(1e3 * i.value[1]),
price: s.price
};
this._points.length <= i.index ? (this._points.push(r), this._pointAdded
.fire(this._points.length - 1)) : (this._points[i.index] = r, this
._pointChanged.fire(i.index))
}
const t = this;
t.checkAlert && t.checkAlert(), this.updateAllViewsAndRedraw()
}
_snapTo45DegreesAvailable() {
return !1
}
_onMainSeriesSymbolResolved() {
const e = this.ownerSource();
null === e || this._model.mainSeries() === e.symbolSource() || this
.isSourceHidden() || this.createServerPoints()
}
_readyToCreatePointset() {
return this._timePoint.length > 0
}
static _addCollectedProperties(e) {
e.hasChild("linewidth") && e.addChild("linesWidths", new p
.LineToolWidthsProperty([Object(r.ensureDefined)(e.child("linewidth"))])
), e.hasChild("linecolor") && e.addChild("linesColors", new p
.LineToolColorsProperty([Object(r.ensureDefined)(e.child("linecolor"))])
), e.hasChild("backgroundColor") && e.addChild("backgroundsColors",
new p.LineToolColorsProperty([Object(r.ensureDefined)(e.child(
"backgroundColor"))])), e.hasChild("textColor") && e.addChild(
"textsColors", new p.LineToolColorsProperty([Object(r.ensureDefined)(e
.child("textColor"))])), e instanceof b.DefaultProperty && (e
.addExclusion("linesWidths"), e.addExclusion("linesColors"), e
.addExclusion("backgroundsColors"), e.addExclusion("textsColors"))
}
static _initialSymbolStateVersion() {
return 1
}
static _initialZOrderVersion() {
return 1
}
_destroyPanePaneViews(e) {
const t = this._paneViews.get(e);
if (void 0 !== t)
for (const e of t) e.destroy && e.destroy();
void 0 !== e && e.onDestroyed().unsubscribeAll(this), this._paneViews.delete(e)
}
_copyPricesWithoutNormalization() {
const e = Math.min(this._points.length, this._timePoint.length);
for (let t = 0; t < e; t++) this._timePoint[t].price = this._points[t].price
}
}
},
nqXy: function(e, t, i) {
"use strict";
function s(e, t) {
let {
deltaX: i,
deltaY: s
} = e;
switch (i /= 100, s /= 100, t.deltaMode) {
case t.DOM_DELTA_PAGE:
i *= 120, s *= 120;
break;
case t.DOM_DELTA_LINE:
i *= 32, s *= 32
}
return {
deltaX: i,
deltaY: s
}
}
i.d(t, "a", (function() {
return r
}));
class r {
constructor() {
this._totalDeltaX = 0, this._totalDeltaY = 0, this._prevWheelTime = 0
}
processWheel(e) {
e.timeStamp - this._prevWheelTime > 100 && this._reset(),
this._totalDeltaX += e.deltaX, this._totalDeltaY += e.deltaY, this
._prevWheelTime = e.timeStamp;
const t = {
deltaX: e.deltaX,
deltaY: e.deltaY
};
return 0 === this._totalDeltaX || 0 === this._totalDeltaY || (Math.abs(this
._totalDeltaX) >= Math.abs(3 * this._totalDeltaY) && (t.deltaY = 0),
Math.abs(this._totalDeltaY) >= Math.abs(3 * this._totalDeltaX) && (t
.deltaX = 0)), s(t, e)
}
_reset() {
this._totalDeltaX = 0, this._totalDeltaY = 0
}
}
},
o2pV: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SelectionIndexes", (function() {
return r
}));
var s = i("Eyy1");
class r {
constructor(e) {
this._baseIndex = null, this._offsetInBar = null, this._offsetInTime = null, this
._barsBetweenPoints = null, this._timescale = e
}
indexes() {
const e = this._timescale.visibleBarsStrictRange();
if (null === e) return [];
const t = e.firstBar(),
i = e.lastBar();
if (null === this._offsetInTime || null === this._barsBetweenPoints) {
const e = this._timescale.barSpacing();
this._barsBetweenPoints = Math.floor(120 / e), this._offsetInBar = i % this
._barsBetweenPoints, this._offsetInTime = this._timescale.indexToTimePoint(
this._offsetInBar), this._baseIndex = this._timescale.baseIndex()
}
const r = this._timescale.baseIndex();
this._baseIndex !== r && (this._baseIndex = r, this._offsetInBar = Object(s
.ensureNotNull)(this._timescale.timePointToIndex(this._offsetInTime)));
const n = Object(s.ensureNotNull)(this._offsetInBar),
o = [];
let a = Math.floor((t - n) / this._barsBetweenPoints);
const l = Math.floor((i - n) / this._barsBetweenPoints);
for (; a <= l; a++) o.push(n + a * this._barsBetweenPoints);
return o
}
clear() {
this._offsetInBar = null, this._offsetInTime = null, this._baseIndex = null, this
._barsBetweenPoints = null
}
}
},
oIoN: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("Ocx9").DefaultProperty;
class n extends s {
constructor(e, t) {
super(e, t || n.createProperties()), this.version = n.version, i.e("lt-pane-views")
.then(i.t.bind(null, "pBAL", 7)).then(({
DisjointChannelPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 3
}
name() {
return "Disjoint Channel"
}
hasEditableCoordinates() {
return !1
}
addPoint(e, t) {
return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e,
this.points()[this.points().length - 2]), s.prototype.addPoint.call(this, e)
}
setLastPoint(e, t) {
return t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e,
this.points()[this.points().length - 2]), s.prototype.setLastPoint.call(
this, e)
}
setPoint(e, t, i) {
var s = .5 * (this._points[1].price + this._points[2].price);
if (i && i.shift() && 1 === e) {
this._snapPoint45Degree(t, this.points()[0])
}
if (e < 3 && super.setPoint(e, t), 0 !== e && 2 !== e) {
if (1 === e) {
var r = this._points[1].price - s;
this._points[2].price = this._points[1].price - 2 * r
} else if (3 === e) {
r = t.price - this._points[2].price;
this._points[0].price = this._points[1].price - r, this._points[0].index = t
.index
}
this.normalizePoints()
}
}
getPoint(e) {
if (e < 3) return s.prototype.getPoint.call(this, e);
var t = this._points[0].price - this._points[2].price;
return {
index: this._points[0].index,
price: this._points[1].price - t
}
}
canHasAlert() {
return !0
}
_getAlertPlots() {
var e = this._points[0],
t = this._points[1],
i = [];
e.index <= t.index ? (i.push(e), i.push(t)) : (i.push(t), i.push(e));
var s = this._points[2];
s.time = t.time, s.index = t.index;
var r, n, o, a, l = {
price: s.price + (t.price - e.price),
time: e.time,
index: e.index
},
c = [];
s.index <= l.index ? (c.push(s), c.push(l)) : (c.push(l), c.push(s)), i[0].price >
c[0].price ? (r = i, n = c) : c[0].price > i[0].price || c[1].price > i[1]
.price ? (r = c, n = i) : (r = i, n = c);
var h = this.properties().extendLeft.value(),
u = this.properties().extendRight.value();
return e.index <= t.index ? (o = h, a = u) : (o = u, a = h), [this
._linePointsToAlertPlot(r, "Upper", o, a), this._linePointsToAlertPlot(n,
"Lower", o, a)
]
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "vm8R")))
.GeneralTrendFiguresDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetooldisjointangle", e);
return n._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
n.version = 1, t.LineToolDisjointChannel = n
},
oV8k: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return s
}));
class s {
constructor(e, t) {
this._id = e, this._model = t
}
id() {
return this._id
}
isHoveredEnabled() {
return !0
}
isSelectionEnabled() {
return !1
}
priceScale() {
return null
}
paneViews(e) {
return []
}
labelPaneViews(e) {
return []
}
priceAxisViews(e, t) {
return []
}
updateViewsForPane(e) {
e.containsMainSeries() && this.updateAllViews()
}
}
},
oXaB: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "PriceAxisLastValueMode", (function() {
return s
})),
function(e) {
e[e.LastPriceAndPercentageValue = 0] = "LastPriceAndPercentageValue", e[e
.LastValueAccordingToScale = 1] = "LastValueAccordingToScale"
}(s || (s = {}))
},
oamr: function(e, t, i) {
"use strict";
var s = i("ocLq");
class r {
constructor(e, t, i, s) {
this._value = e, this._name = t, this._owner = i, this._comparer = void 0 !== s ?
s : (e, t) => null == e ? null != t : e === t
}
getName() {
return this._name
}
set(e) {
const t = this._comparer(this._value, e);
return t && this._owner.dirty(), this._value = e, t
}
get() {
return this._value
}
}
class n {
constructor(e, t, i) {
this._owner = null, this._value = e, this._name = t, this._owner = i
}
getName() {
return this._name
}
set(e) {
return this._value !== e && (this._value = e, null !== this._owner && this._owner
.dirty(), !0)
}
get() {
return this._value
}
}
class o extends r {
constructor(e, t, i, s) {
super(e, t, i, s)
}
}
class a {
constructor(e) {
this._owner = e
}
createField(e, t) {
return new r(e, t, this)
}
createDoubleField(e, t) {
return new r(e, t, this, (e, t) => !s.Std.equal(e, t))
}
createDoubleArrayField(e, t) {
return new o(e, t, this, (e, t) => {
if (e === t) return !1;
const i = e.length;
if (t.length !== i) return !0;
for (let r = 0; r < i; r++) {
const i = e[r],
n = t[r];
if (!s.Std.equal(i, n)) return !0
}
return !1
})
}
createTimeField(e, t) {
return new n(e, t, this)
}
dirty() {
null !== this._owner && this._owner.dirty()
}
setOwner(e) {
this._owner = e
}
}
i.d(t, "a", (function() {
return l
}));
class l {
constructor(e) {
this._mixinJSONObject = new a(this), this._state = 0, this._owner = null, this
._gen = e, this._id = e.nextGraphicsObjId(), this._id2 = this._mixinJSONObject
.createField(this.id(), "id")
}
dirty() {
null !== this._owner && this._owner.dirty()
}
setOwner(e) {
this._owner = e
}
id() {
return this._id
}
unsetOwner(e) {
this._owner === e && (this._owner = null)
}
state() {
return this._state
}
erase() {
1 === this._state && this._gen.pushEraseObjCmd(this._id, this.jsonName()), this
._state = 2, this.dirty()
}
markAsPosted() {
1 !== this._state && (this._state = 1, this.dirty())
}
isErased() {
return 2 === this._state
}
isPosted() {
return 1 === this._state
}
isNaN() {
return !1
}
_processObjUpdate() {
1 === this._state && (this._gen.pushEraseObjCmd(this._id, this.jsonName()), this
._id = this._gen.nextGraphicsObjId(), this._id2.set(this._id), this._state =
0), this.dirty()
}
}
},
ocLq: function(e, t, i) {
"use strict";
(function(t) {
var s = i("5B3K").StudyError,
r = i("Y7w9"),
n = i("ogJP").inherit,
o = i("E6p6").SessionStage,
a = i("LxhU").Interval,
l = i("OLhd").createDwmAligner,
c = i("OLhd").createTimeToBarTimeAligner,
h = i("5fI3").decodeExtendedSymbol,
u = i("5fI3").encodeExtendedSymbolOrGetSimpleSymbolString,
d = function() {
var e, p = "undefined" != typeof window ? window : t,
_ = p.PineJsCalendar ? p.PineJsCalendar : i("jCNj"),
m = i("IiTo"),
f = i("IDnv").extrapolateBarsFrontToTime,
g = {};
function b(e, t, i, s, r) {
var n = r,
o = 0;
if (isNaN(e.get(t - 1))) return {
index: NaN,
value: NaN
};
for (var a = 0; a < t; ++a) s(e.get(a), n) && (o = a, n = e.get(a));
return {
index: o,
value: n
}
}
function v(e, t, i, s, r) {
this._areaRight = e, this._areaLeft = t, this._pivotType = i, this._series =
s, this._currentIndex = r.new_var(0), this._currentValue = r.new_var(
NaN), this._pivotIndex = r.new_var(-1), this._index = g.n(r), this
._isNewBar = r.symbol.isNewBar;
var n = this._currentIndex.get(1),
o = this._currentValue.get(1),
a = this._pivotIndex.get(1);
this._index > 1 && (this._currentIndex.set(n), this._currentValue.set(o),
this._pivotIndex.set(a))
}
function S(e, t, i) {
this._deviation = e;
var s = i.new_var(g.high(i)),
r = i.new_var(g.low(i));
s.get(2 * t + 1), r.get(2 * t + 1), this._pivotHigh = new v(t, t, v.HIGH, s,
i), this._pivotLow = new v(t, t, v.LOW, r, i), this._lastVal = i
.new_var(NaN), this._lastIndex = i.new_var(-1), this._lastType = i
.new_var(), this._index = g.n(i), this._isNewBar = i.symbol.isNewBar,
this._isBarClosed = i.symbol.isBarClosed;
var n = this._lastIndex.get(1),
o = this._lastVal.get(1),
a = this._lastType.get(1);
this._index > 1 && this.addPivot(n, o, a), this.processPivot(this
._pivotHigh), this.processPivot(this._pivotLow)
}
function y(e) {
this.symbol = e, this.vars = [], this.vars_index = 0, this.ctx = [], this
.ctx_index = 0, this.minimumAdditionalDepth = null
}
function w(e) {
this.mindepth = 0, this.original = NaN, this.modified = !1, this.symbol = e
}
function P(e) {
w.call(this, e)
}
function C(e, t, i, s, r, n) {
var o = h(e);
const l = "string" == typeof o.symbol ? o : o.symbol;
this.ticker = l.symbol, this.currencyCode = i || l["currency-id"], this
.unitId = s || l["unit-id"];
var c = l["currency-id"] !== this.currencyCode || l["unit-id"] !== this
.unitId;
l["currency-id"] = this.currencyCode, l["unit-id"] = this.unitId, c && (e =
u(o)), this.tickerid = e;
var d = a.parse(t);
this.resolution = d.letter(), this.interval = d.multiplier(), this.period =
d.value(), this.index = -1, this.time = NaN, this.open = NaN, this
.high = NaN, this.low = NaN, this.close = NaN, this.volume = NaN, this
.updatetime = NaN, this.isNewBar = !1, this.isBarClosed = !1, this
.session = new m.SessionInfo("Etc/UTC", "24x7"), this.script = r, this
.isAdditionalDepthAllowed = void 0 === o.type, n && this.set_symbolinfo(
n)
}
function x(e, t, i, s, r, n, o, a, l, c) {
this.body = n, this.symbols = [], this.runner = r, this.inputCallback = a,
this.out = o, this.nonseriesOut = l, this.ctx = new y(this.add_sym(e, t,
i, s, c)), this.init()
}
function T(e) {
this.symbols = [], this.barsets = [],
this.subscription = [], this.host = e, this.isRecalculated = !1, this
.isStarted = !1, this.start()
}
function I(e) {
this.runner = new T(e)
}
function M(e, t) {
this.info = e, this.bars = t || [], this.isBarClosed = !0, this
.firstLoadedTimeMs = 0 !== this.bars.length ? this.bars[0].time : 1 / 0
}
function O(e, t) {
this.period = e, this.generateEmptyBars = !!t
}
function L() {}
return g.max_series_default_size = 10001, g.n = function(e) {
return e.symbol.index + 1
}, g.nz = function(e, t) {
return t = t || 0, isFinite(e) ? e : t
}, g.na = function(e) {
return 0 === arguments.length ? NaN : isNaN(e) ? 1 : 0
}, g.isZero = function(e) {
return Math.abs(e) <= 1e-10
}, g.toBool = function(e) {
return isFinite(e) && !g.isZero(e)
}, g.eq = function(e, t) {
return g.isZero(e - t)
}, g.neq = function(e, t) {
return !g.eq(e, t)
}, g.ge = function(e, t) {
return g.isZero(e - t) || e > t
}, g.gt = function(e, t) {
return !g.isZero(e - t) && e > t
}, g.lt = function(e, t) {
return !g.isZero(e - t) && e < t
}, g.le = function(e, t) {
return g.isZero(e - t) || e < t
}, g.and = function(e, t) {
return isNaN(e) || isNaN(t) ? NaN : g.isZero(e) || g.isZero(t) ? 0 : 1
}, g.or = function(e, t) {
return isNaN(e) || isNaN(t) ? NaN : g.isZero(e) && g.isZero(t) ? 0 : 1
}, g.not = function(e) {
return isNaN(e) ? NaN : g.isZero(e) ? 1 : 0
}, g.eps = function() {
return 1e-10
}, g.greaterOrEqual = function(e, t, i) {
return t - e < (i || 1e-10)
}, g.lessOrEqual = function(e, t, i) {
return e - t < (i || 1e-10)
}, g.equal = function(e, t, i) {
return Math.abs(e - t) < (i || 1e-10)
}, g.greater = function(e, t, i) {
return e - t > (i || 1e-10)
}, g.less = function(e, t, i) {
return t - e > (i || 1e-10)
}, g.compare = function(e, t, i) {
return g.equal(e, t, i) ? 0 : g.greater(e, t, i) ? 1 : -1
}, g.max = Math.max, g.min = Math.min, g.pow = Math.pow, g.abs = Math.abs, g
.log = Math.log, g.log10 = function(e) {
return Math.log(e) / Math.LN10
}, g.sqrt = Math.sqrt, g.sign = function(e) {
return isNaN(e) ? NaN : g.isZero(e) ? 0 : e > 0 ? 1 : -1
}, g.exp = Math.exp, g.sin = Math.sin, g.cos = Math.cos, g.tan = Math.tan, g
.asin = Math.asin, g.acos = Math.acos, g.atan = Math.atan, g.floor = Math
.floor, g.ceil = Math.ceil, g.round = Math.round, g.avg = function(e, t, i,
s, r, n) {
if (2 === arguments.length) return (e + t) / 2;
for (var o = 0, a = 0; a < arguments.length; a++) o += arguments[a];
return o / arguments.length
}, g.open = function(e) {
return e.symbol.open
}, g.high = function(e) {
return e.symbol.high
}, g.low = function(e) {
return e.symbol.low
}, g.close = function(e) {
return e.symbol.close
}, g.hl2 = function(e) {
return (e.symbol.high + e.symbol.low) / 2
}, g.hlc3 = function(e) {
return (e.symbol.high + e.symbol.low + e.symbol.close) / 3
}, g.ohlc4 = function(e) {
return (e.symbol.open + e.symbol.high + e.symbol.low + e.symbol.close) /
4
}, g.volume = function(e) {
return e.symbol.volume
}, g.updatetime = function(e) {
return e.symbol.updatetime
}, g.time = function(e) {
return e.symbol.bartime()
}, g.period = function(e) {
return e.symbol.period
}, g.tickerid = function(e) {
return e.symbol.tickerid
}, g.currencyCode = function(e) {
return e.symbol.currencyCode
}, g.unitId = function(e) {
return e.symbol.unitId
}, g.ticker = function(e) {
return e.symbol.ticker
}, g.interval = function(e) {
return e.symbol.interval
}, g.isdwm = function(e) {
return e.symbol.isdwm()
}, g.isintraday = function(e) {
return !e.symbol.isdwm()
}, g.isdaily = function(e) {
return "D" === e.symbol.resolution
}, g.isweekly = function(e) {
return "W" === e.symbol.resolution
}, g.ismonthly = function(e) {
return "M" === e.symbol.resolution
},
g.year = function(e) {
return g.timepart(e.symbol, _.YEAR, arguments[1])
}, g.month = function(e) {
return g.timepart(e.symbol, _.MONTH, arguments[1])
}, g.weekofyear = function(e) {
return g.timepart(e.symbol, _.WEEK_OF_YEAR, arguments[1])
}, g.dayofmonth = function(e) {
return g.timepart(e.symbol, _.DAY_OF_MONTH, arguments[1])
}, g.dayofweek = function(e) {
return g.timepart(e.symbol, _.DAY_OF_WEEK, arguments[1])
}, g.hour = function(e) {
return g.timepart(e.symbol, _.HOUR_OF_DAY, arguments[1])
}, g.minute = function(e) {
return g.timepart(e.symbol, _.MINUTE, arguments[1])
}, g.second = function(e) {
return g.timepart(e.symbol, _.SECOND, arguments[1])
}, g.add_days_considering_dst = function(e, t, i) {
return _.add_days_considering_dst(_.get_timezone(e), t, i)
}, g.selectSessionBreaks = function(e, t) {
if (g.isdwm(e) || void 0 === e.symbol.session.timezone) return [];
var i = m.newBarBuilder(e.symbol.period, e.symbol.session),
s = [],
r = t.length;
if (i.moveTo(t[r - 1]), 1 === r && i.startOfBar(0) === t[0]) s.push(t[
0]);
else {
for (var n = r - 2; n >= 0; --n) {
var o = t[n];
if (!(o >= i.startOfBar(0))) {
i.moveTo(o);
var a = t[n + 1];
s.push(a)
}
}
s.reverse()
}
return s
}, g.iff = function(e, t, i) {
return g.not(e) ? i : t
}, g.rising = function(e, t) {
for (var i = 1; i < t + 1; ++i)
if (e.get(i) > e.get(0)) return 0;
return 1
}, g.falling = function(e, t) {
for (var i = 1; i < t + 1; ++i)
if (e.get(i) < e.get(0)) return 0;
return 1
}, g.timepart = function(e, t, i) {
var s = _.utc_to_cal(e.timezone, i || e.bartime());
return _.get_part(s, t)
}, g.rsi = function(e, t) {
return g.isZero(t) ? 100 : g.isZero(e) ? 0 : 100 - 100 / (1 + e / t)
}, g.sum = function(e, t, i) {
var s = i.new_var(),
r = g.nz(e.get()) + g.nz(s.get(1)) - g.nz(e.get(t));
return s.set(r), r
}, g.sma = function(e, t, i) {
var s = g.sum(e, t, i);
return g.na(e.get(t - 1)) ? NaN : s / t
}, g.smma = function(e, t, i) {
var s = i.new_var(e),
r = d.Std.sma(s, t, i),
n = i.new_var(),
o = (n.get(1) * (t - 1) + e) / t;
return n.set(d.Std.na(n.get(1)) ? r : o), n.get(0)
}, g.rma = function(e, t, i) {
var s = g.sum(e, t, i),
r = t - 1,
n = e.get(r),
o = i.new_var(),
a = o.get(1),
l = e.get(),
c = g.na(n) ? NaN : g.na(a) ? s / t : (l + a * r) / t;
return o.set(c), c
}, g.fixnan = function(e, t) {
var i = t.new_var();
return isNaN(e) ? i.get(1) : (i.set(e), e)
}, g.tr = function(e, t) {
1 === arguments.length && (t = e, e = void 0);
var i = void 0 !== e && !!e,
s = t.new_var(g.close(t)),
r = s.get(1);
return i && isNaN(r) && (r = g.close(t)), g.max(g.max(g.high(t) - g.low(
t), g.abs(g.high(t) - r)), g.abs(g.low(t) - r))
}, g.atr = function(e, t) {
var i = t.new_var(g.tr(t));
return g.sma(i, e, t)
}, g.ema = function(e, t, i) {
var s = g.sum(e, t, i),
r = i.new_var(),
n = e.get(0),
o = e.get(t - 1),
a = r.get(1),
l = g.na(o) ? NaN : g.na(a) ? s / t : 2 * (n - a) / (t + 1) + a;
return r.set(l), l
}, g.wma = function(e, t, i) {
for (var s = 0, r = t = Math.round(t); r >= 0; r--) {
s += (t - r) * e.get(r)
}
return 2 * s / (t * (t + 1))
}, g.vwma = function(e, t, i) {
var s = i.new_var(g.volume(i)),
r = i.new_var(e.get(0) * g.volume(i));
return g.sma(r, t, i) / g.sma(s, t, i)
}, g.swma = function(e, t) {
return (e.get(0) + 2 * e.get(1) + 2 * e.get(2) + e.get(3)) / 6
}, g.lowestbars = function(e, t, i) {
return -b(e, t, 0, (function(e, t) {
return g.lt(e, t)
}), Number.MAX_VALUE).index
}, g.lowest = function(e, t, i) {
return b(e, t, 0, (function(e, t) {
return g.lt(e, t)
}), Number.MAX_VALUE).value
}, g.highestbars = function(e, t, i) {
return -b(e, t, 0, (function(e, t) {
return g.gt(e, t)
}), Number.MIN_VALUE).index
}, g.highest = function(e, t, i) {
return b(e, t, 0, (function(e, t) {
return g.gt(e, t)
}), Number.MIN_VALUE).value
}, g.cum = function(e, t) {
var i = t.new_var(),
s = g.nz(i.get(1)) + e;
return i.set(s), s
}, g.accdist = function(e) {
var t = g.high(e),
i = g.low(e),
s = g.close(e),
r = g.volume(e);
return g.cum(s === t && s === i || t === i ? 0 : r * (2 * s - i - t) / (
t - i), e)
}, g.correlation = function(e, t, i, s) {
var r = g.sma(e, i, s),
n = g.sma(t, i, s),
o = s.new_var(e.get() * t.get());
return (g.sma(o, i, s) - r * n) / Math.sqrt(g.variance2(e, r, i) * g
.variance2(t, n, i))
}, g.stoch = function(e, t, i, s, r) {
var n = g.highest(t, s),
o = g.lowest(i, s);
return g.fixnan(100 * (e.get() - o) / (n - o), r)
}, g.tsi = function(e, t, i, s) {
var r = s.new_var(g.change(e)),
n = s.new_var(g.abs(g.change(e))),
o = s.new_var(g.ema(r, i, s)),
a = s.new_var(g.ema(n, i, s));
return g.ema(o, t, s) / g.ema(a, t, s)
}, g.cross = function(e, t, i) {
if (isNaN(e) || isNaN(t)) return !1;
var s, r = i.new_var((s = e - t) < 0 ? -1 : 0 === s ? 0 : 1);
return !isNaN(r.get(1)) && r.get(1) !== r.get()
}, g.linreg = function(e, t, i) {
for (var s = 0, r = 0, n = 0, o = 0, a = 0; a < t; ++a) {
var l = e.get(a),
c = t - 1 - a + 1;
s += c, r += l, n += c * c, o += l * c
}
var h = (t * o - s * r) / (t * n - s * s);
return r / t - h * s / t + h + h * (t - 1 - i)
}, g.sar = function(e, t, i, s) {
var r = s.new_var(),
n = s.new_var(),
o = s.new_var(),
a = g.high(s),
l = g.low(s),
c = g.close(s),
h = s.new_var(a),
u = s.new_var(l),
d = s.new_var(c),
p = s.new_var(),
_ = p.get(1),
m = n.get(1),
f = o.get(1);
n.set(m), o.set(f);
var b = !1,
v = u.get(1),
S = u.get(2),
y = h.get(1),
w = h.get(2),
P = d.get(),
C = d.get(1);
2 === g.n(s) && (g.greater(P, C) ? (r.set(1), o.set(h.get()), _ = v, f =
h.get()) : (r.set(-1), o.set(u.get()), _ = y, f = u.get()),
b = !0, n.set(e), m = e);
var x = _ + m * (f - _);
return 1 === r.get() ? g.greater(x, u.get()) && (b = !0, r.set(-1), x =
Math.max(h.get(), o.get()), o.set(u.get()), n.set(e)) : g.less(
x, h.get()) && (b = !0, r.set(1), x = Math.min(u.get(), o
.get()), o.set(h.get()), n.set(e)), b || (1 === r.get() ? g
.greater(
h.get(), o.get()) && (o.set(h.get()), n.set(Math.min(n
.get() + t, i))) : g.less(u.get(), o.get()) && (o.set(u
.get()),
n.set(Math.min(n.get() + t, i)))), 1 === r.get() ? (x = Math
.min(x, v), g.n(s) > 2 && (x = Math.min(x, S))) : (x = Math.max(
x, y), g.n(s) > 2 && (x = Math.max(x, w))), p.set(x), x
}, g.alma = function(e, t, i, s) {
for (var r = Math.floor(i * (t - 1)), n = t / s * (t / s), o = [], a =
0, l = 0; l < t; ++l) {
var c = Math.exp(-1 * Math.pow(l - r, 2) / (2 * n));
a += c, o.push(c)
}
for (l = 0; l < t; ++l) o[l] /= a;
var h = 0;
for (l = 0; l < t; ++l) h += o[l] * e.get(t - l - 1);
return h
}, g.wvap = function(e, t) {
return e.get() - e.get(1)
}, g.change = function(e) {
return e.get() - e.get(1)
}, g.roc = function(e, t) {
var i = e.get(t);
return 100 * (e.get() - i) / i
}, g.dev = function(e, t, i) {
var s = g.sma(e, t, i);
return g.dev2(e, t, s)
}, g.dev2 = function(e, t, i) {
for (var s = 0, r = 0; r < t; r++) {
var n = e.get(r);
s += g.abs(n - i)
}
return s / t
}, g.stdev = function(e, t, i) {
var s = g.variance(e, t, i);
return g.sqrt(s)
}, g.variance = function(e, t, i) {
var s = g.sma(e, t, i);
return g.variance2(e, s, t)
}, g.variance2 = function(e, t, i) {
for (var s = 0, r = 0; r < i; r++) {
var n = e.get(r),
o = g.abs(n - t);
s += o * o
}
return s / i
}, g.percentrank = function(e, t) {
if (g.na(e.get(t - 1))) return NaN;
for (var i = 0, s = e.get(), r = 1; r < t; r++) {
var n = e.get(r);
g.ge(s, n) && i++
}
return 100 * i / t
}, g.createNewSessionCheck = function(e) {
if (void 0 === e.symbol.session.timezone) return function() {
return !1
};
var t = m.newBarBuilder(e.symbol.period, e.symbol.session);
return function(e) {
return t.indexOfBar(e) === o.POST_SESSION && (t.moveTo(e), !0)
}
}, g.error = function(e) {
throw new s(e)
}, v.LOW = 0, v.HIGH = 1, v.prototype.isPivotFound = function() {
return -1 !== this._pivotIndex.get()
}, v.prototype.pivotIndex = function() {
return this._pivotIndex.get()
}, v.prototype.currentValue = function() {
return this._currentValue.get()
}, v.prototype.pivotType = function() {
return this._pivotType
}, v.prototype.reset = function() {
this._currentValue.set(NaN), this._currentIndex.set(0), this._pivotIndex
.set(-1)
}, v.prototype.isRightSideOk = function(e) {
return e - this._currentIndex.get() === this._areaRight
}, v.prototype.isViolate = function(e, t) {
if (e < 1 || isNaN(this._currentValue.get())) return !0;
var i = this._series.get(this._index - e);
return !!isNaN(i) || (i === this._currentValue.get() ? t : this
._pivotType === v.HIGH ? i > this._currentValue.get() : i < this
._currentValue.get())
}, v.prototype.processPoint = function(e) {
this.isViolate(e, !1) && (this._currentValue.set(this._series.get()),
this._currentIndex.set(e))
}, v.prototype.isRestartNeeded = function(e) {
return e - this._currentIndex.get() > this._areaRight
}, v.prototype.update = function() {
if (this._isNewBar && this.isPivotFound() && this.reset(), this
.processPoint(this._index), this.isRightSideOk(this._index)) {
if (-1 === this._pivotIndex.get()) {
for (var e = !0, t = 0; t < this._areaLeft; ++t)
if (this.isViolate(this._currentIndex.get() - 1 - t, !0)) {
e = !1;
break
} e && this._pivotIndex.set(this._currentIndex.get())
}
} else -1 !== this._pivotIndex.get() && this._pivotIndex.set(-1);
if (this.isRestartNeeded(this._index)) {
this.reset();
for (t = 0; t <= this._areaRight; ++t) this.processPoint(this
._index - this._areaRight + t)
}
}, S.prototype.addPivot = function(e, t, i) {
this._lastIndex.set(e), this._lastVal.set(t), this._lastType.set(i)
}, S.prototype.updatePivot = function(e, t) {
this._lastIndex.set(e), this._lastVal.set(t)
}, S.prototype.lastPrice = function() {
return this._lastVal.get()
}, S.prototype.lastIndex = function() {
return this._lastIndex.get()
}, S.prototype.addPoint = function(e, t, i) {
if (isNaN(this._lastVal.get())) this.addPivot(e, t, i);
else {
var s = this._lastVal.get();
if (this._lastType.get() !== i) Math.abs(s - t) / t > this
._deviation && this.addPivot(e, t, i);
else(i === v.HIGH ? t > s : t < s) && this.updatePivot(e, t)
}
}, S.prototype.processPivot = function(e) {
e.update(), this._isBarClosed && e.isPivotFound() && this.addPoint(e
.pivotIndex(), e.currentValue(), e.pivotType())
}, g.zigzag = function(e, t, i) {
return new S(e, t, i).lastPrice()
}, g.zigzagbars = function(e, t, i) {
var s = new S(e, t, i);
return -1 === s.lastIndex() ? NaN : s.lastIndex() - g.n(i)
}, y.prototype.new_sym = function(e, t, i, s) {
return this.symbol.script.add_sym(e, t, i, s)
}, y.prototype.select_sym = function(e) {
this.symbol = this.symbol.script.get_sym(e)
}, y.prototype.new_var = function(e) {
var t = this.vars;
t.length <= this.vars_index && t.push(new w(this.symbol));
var i = t[this.vars_index++];
return arguments.length > 0 && i.set(e), i
}, y.prototype.new_unlimited_var = function(e) {
var t = this.vars;
t.length <= this.vars_index && t.push(new P(this.symbol));
var i = t[this.vars_index++];
return arguments.length > 0 && i.set(e), i
}, y.prototype.new_ctx = function() {
return this.ctx.length <= this.ctx_index && this.ctx.push(new y(this
.symbol)),
this.ctx[this.ctx_index++]
}, y.prototype.prepare = function(e) {
this.ctx_index = 0, this.vars_index = 0;
for (var t = 0; t < this.vars.length; t++) this.vars[t].prepare(e);
for (var i = 0; i < this.ctx.length; i++) this.ctx[i].prepare(e)
}, y.prototype.maxAdditionalDepth = function() {
if (null !== this.minimumAdditionalDepth) return this
.minimumAdditionalDepth;
for (var e = 0, t = 0; t < this.vars.length; t++) {
var i = this.vars[t].mindepth;
!isNaN(i) && i > e && (e = i)
}
return e
}, y.prototype.stop = function() {
this.symbol = null, this.vars = null
}, y.prototype.setMinimumAdditionalDepth = function(e) {
this.minimumAdditionalDepth = e
}, w.prototype.valueOf = function() {
return this.get(0)
}, w.prototype.get = function(e) {
return isNaN(e) && (e = 0), e = e || 0, this.hist ? e >= this.hist
.length ? (console.error("not enough depth: " + this), NaN) : this
._get(e) : (this.mindepth = g.max(this.mindepth, e), NaN)
}, w.prototype._get = function(e) {
var t = this.hist_pos - e;
return t < 0 && (t += this.hist.length), this.hist[t]
}, w.prototype.set = function(e) {
this.hist && (this.hist[this.hist_pos] = e, this.modified = !0)
}, w.prototype.prepare = function(e) {
e === this.symbol && (e.isNewBar ? (this.original = this.get(0), !this
.modified && this.hist || this.add_hist()) : this.set(this
.original), this.modified = !1)
}, w.prototype.add_hist = function() {
if (!this.hist) {
var e = g.na(this.mindepth) ? g.max_series_default_size : g.max(this
.mindepth + 1, 1);
e = Math.round(e);
for (var t = new Array(e), i = 0; i < e; i++) t[i] = NaN;
this.hist = t, this.hist_pos = -1
}
this.hist_pos = Math.min(this.hist_pos + 1, this.hist.length), this
.hist_pos === this.hist.length && (this.hist_pos = this.hist
.length - 1, this.hist.shift(), this.hist.push(NaN)), this.hist[
this.hist_pos] = this.original
}, w.prototype.adopt = function(e, t, i) {
this.hist || (this.mindepth = NaN);
var s = t.get(),
r = e.indexOf(s);
if (0 !== i) {
var n = t.get(1);
if (!g.na(n)) r = r === e.indexOf(n) ? -1 : r
}
return r < 0 ? NaN : this._get(r)
}, w.prototype.indexOf = function(e) {
if (!this.hist) return this.mindepth = NaN, -1;
if (g.na(e)) return -1;
var t = this.hist.length,
i = this.symbol.index + 1,
s = Math.min(t, i),
n = r.upperbound_int(this.hist, e, 0, s);
return 0 === n ? -1 : s - n
}, n(P, w), P.prototype.add_hist = function() {
if (this.hist || (this.hist = new Float64Array(2e3), this.hist_pos = -
1), this.hist_pos = this.hist_pos + 1, this.hist_pos === this
.hist
.length) {
var e = new Float64Array(2 * this.hist.length);
e.set(this.hist), this.hist = e
}
this.hist[this.hist_pos] = this.original
}, C.prototype.set_symbolinfo = function(e) {
e || console.error("WARN: symbolinfo isn't defined for " + this
.tickerid), this.info = e, this.minTick = e.minmov / e
.pricescale, this.currencyCode = e.currency_code, this.unitId = e
.unit_id, this.timezone = _.get_timezone(e.timezone), this.session
.init(e.timezone, e.session, e.session_holidays, e.corrections)
}, C.prototype.isdwm = function() {
return "" !== this.resolution && "S" !== this.resolution && "T" !== this
.resolution
}, C.prototype.enable_dwm_aligning = function(e, t) {
this.dwm_aligner = m.newBarBuilder(this.period, e, t)
}, C.prototype.bartime = function() {
var e = this.time;
if (!this.isdwm() || isNaN(e)) return e;
var t = _.utc_to_cal(this.timezone, e);
return this.session.spec.correctTradingDay(t), _.cal_to_utc(this
.timezone, t)
}, C.prototype.lastbar = function(e) {
if (!isNaN(e.time)) {
var t = e.time;
this.dwm_aligner && (this.dwm_aligner.moveTo(t), t = this
.dwm_aligner.startOfBar(0));
var i = this.time !== t;
i && this.index >= 0 && !this.isBarClosed && (this.isNewBar = !1,
this.isBarClosed = !0, this.script.calc(this)), this.time =
t, this.open = e.open, this.high = e.high, this.low = e.low,
this.close = e.close, this.volume = e.volume, this.updatetime =
e.updatetime, this.isNewBar = i, this.isBarClosed = e
.isBarClosed, this.isLastBar = e.isLastBar, this.isNewBar && (
this.index++, this.isFirstBar = 0 === this.index), this
.script.calc(this)
}
}, x.prototype.calc = function(e) {
var t = this.ctx,
i = this.body;
t.prepare(e);
var s = i.main(t, this.inputCallback, e);
if (s && "composite" === s.type)
for (let e = 0; e < s.data.length; ++e) this._processResult(s.data[
e]);
else this._processResult(s)
}, x.prototype._processResult = function(e) {
var t = this.ctx,
i = this;
this.out && e && (!isNaN(t.symbol.time) || e.nonseries) && (e
.nonseries ? ("projection" === e.type && (e.projectionTime = t
.symbol.time), this.nonseriesOut(t.symbol, e)) : e.bars ? e
.bars.forEach((function(e) {
i.out(t.symbol, e)
})) : this.out(t.symbol, e))
}, x.prototype.init = function() {
var e = this.ctx,
t = this.body;
t.init && t.init(e, this.inputCallback), t.main(e, this.inputCallback)
}, x.prototype.add_sym = function(e, t, i, s, r) {
var n = this.runner.add_sym(e, t, i, s, this, r);
return this.symbols.push(n), n.isdwm() && this.symbols.length > 1 && n
.enable_dwm_aligning(this.symbols[0].session, n.session), n
}, x.prototype.maxAdditionalDepth = function() {
return this.symbols[0].isAdditionalDepthAllowed ? this.ctx
.maxAdditionalDepth() : 0
}, x.prototype.stop = function() {
this.symbols = null, this.ctx.stop(), this.ctx = null
}, x.prototype.get_sym = function(e) {
return this.symbols[e]
}, T.prototype.add_sym = function(e, t, i, s, r, n) {
var o = new C(e, t, i, s, r, n);
return this.symbols.push(o), o
}, T.prototype.get_sym = function(e) {
return this.symbols[e]
}, T.prototype.out = function(e, t) {
if (this.nonseriesUpdate) {
var i = Object.assign({}, this.nonseriesUpdate);
t.splice(0, 0, e.time), i.lastBar = t, this.host.nonseriesOut(e, i)
} else this.host.out(e, t)
}, T.prototype.start = function() {
this.isStarted = !0;
var e = this.host;
this._script = new x(e.tickerid, e.period, e.currencyCode, e.unitId,
this, e.body, this.out.bind(this), e.input, e.nonseriesOut, e
.symbolInfo);
var t = this,
i = [],
s = this.symbols,
r = Object.assign({}, e.dataRange, {
countBack: e.dataRange.countBack + t._script
.maxAdditionalDepth()
}),
n = s[0];
function o(t, s, r) {
i.push(T.feed.subscribe(t.tickerid, t.currencyCode, t.unitId, t
.period, r, e.onErrorCallback, e.symbolInfo, e
.sessionId, s, e.forceAlignBars))
}
function h(i, s) {
"series" === (s.nonseries ? "nonseries" : "series") ? t.update(i,
s): s.lastBar ? (t.nonseriesUpdate = s, s.lastBar
.isLastBar = !
0, t.symbols[0].lastbar(s.lastBar), t.nonseriesUpdate = null
) : e.nonseriesOut(p, s)
}
function u() {
return r
}
o(n, u, (function(e) {
!e.nonseries && Number.isFinite(e.firstLoadedTimeMs) &&
function(e) {
function i(i, s) {
var r = c(i, s)(e),
n = l(i, s);
return null !== n && (r = n
.timeToExchangeTradingDay(r)), {
to: r,
countBack: t._script
.maxAdditionalDepth()
}
}
for (var r = 1; r < s.length; r++) {
var u = s[r],
d = u.period;
a.isEqual(d, n.period) || o(u, i.bind(null,
d), h.bind(null, r))
}
}(e.firstLoadedTimeMs), h(0, e)
}));
for (var d = 1; d < s.length; d++) {
var p = s[d];
a.isEqual(p.period, n.period) && o(p, u, h.bind(null, d))
}
this.subscription = i
}, T.prototype.stop = function() {
var e = this.subscription;
if (e || this._script) {
for (var t = 0; t < e.length; t++) T.feed.unsubscribe(e[t]);
this.subscription = null, this._script.stop(), this._script = null,
this.symbols = null, this.isStarted = !1
} else console.warn("Recurring script engine stop happened.")
}, T.prototype.update = function(e, t) {
if (t) {
var i = this.symbols[e];
if (this.isRecalculated) {
var s = t.bar(t.count() - 1);
s.isBarClosed = t.isLastBarClosed(), s.isLastBar = !0, i
.lastbar(s)
} else this.barsets[e] || (this.barsets[e] = t, i.set_symbolinfo(t
.symbolinfo()), this.recalc())
} else console.error("Unexpected barset = null")
}, T.prototype.recalc = function() {
for (var e = this.symbols, t = 0; t < e.length; t++)
if (!this.barsets[t]) return;
try {
for (var i = e.length - 1; i >= 0; i--)
for (var s = e[i], r = this.barsets[i], n = r.count(), o =
0; o < n; o++) {
var a = r.bar(o);
a.isLastBar = o === n - 1, a.isBarClosed = !a.isLastBar || r
.isLastBarClosed(), s.lastbar(a)
}
this.isRecalculated = !0, this.barsets[0] && this.barsets[0]
.endOfData && this.host.setNoMoreData(), this.host.recalc(
this, {
endOfData: this.barsets[0].endOfData,
firstLoadedTimeMs: this.barsets[0].firstLoadedTimeMs
})
} catch (e) {
if (!e.studyError) throw e;
this.host.onErrorCallback(e.message)
}
}, T.feed = {
subscribe: function(e, t, i, s, r) {
console.error("must be initialized with setupFeed")
},
unsubscribe: function(e) {
console.error("must be initialized with setupFeed")
}
}, I.prototype.stop = function() {
this.runner.stop()
}, I.prototype.isStarted = function() {
return this.runner.isStarted
}, M.prototype.symbolinfo = function() {
return this.info
}, M.prototype.isLastBarClosed = function() {
return this.isBarClosed
}, M.prototype.setLastBarClosed = function(e) {
this.isBarClosed = e
}, M.prototype.bar = function(e) {
return this.bars[e]
}, M.prototype.count = function() {
return this.bars.length
}, M.prototype.add = function(e, t) {
var i = e,
s = this.bars,
r = s.length,
n = i.time,
o = 0 === r ? NaN : s[r - 1].time;
0 === r || o < n ? s.push(i) : o === n ? s[r - 1] = i : console.error(
"time order violation, prev: " + new Date(o).toUTCString() +
", cur: " + new Date(n).toUTCString()), this.isBarClosed = !!t
}, O.prototype.init = function(e) {
this.bb = m.newBarBuilder(this.period, e.symbol.session), this
.bbEmptyBars = this.generateEmptyBars ? m.newBarBuilder(this.period,
e.symbol.session) : void 0, e.setMinimumAdditionalDepth(0)
}, O.prototype.extrapolate = function(e, t) {
return isNaN(e) || isNaN(t) ? void 0 : f(this.bbEmptyBars, e, t, Number
.MAX_SAFE_INTEGER, !0).times
}, O.prototype.main = function(e) {
var t = e.symbol.time,
i = this.bb.alignTime(t),
s = e.new_var(i),
r = g.na(i),
n = s.get(1),
o = g.na(n) ? 1 : g.neq(i, n),
a = e.new_var(),
l = e.new_var(),
c = e.new_var(),
h = e.new_var(),
u = a.get(1),
d = l.get(1),
p = c.get(1),
_ = h.get(1),
m = r ? NaN : o ? g.open(e) : u,
f = r ? NaN : o ? g.high(e) : g.max(g.high(e), d),
b = r ? NaN : o ? g.low(e) : g.min(g.low(e), p),
v = r ? NaN : g.close(e),
S = r ? NaN : o ? g.volume(e) : g.volume(e) + _,
y = r ? NaN : t,
w = e.symbol.isBarClosed && this.bb.isLastBar(0, t),
P = this.generateEmptyBars && o ? this.extrapolate(n, i) : void 0,
C = e.new_var(g.close(e)).get(1),
x = P instanceof Array ? C : NaN;
return a.set(m), l.set(f), c.set(b), h.set(S), [i, m, f, b, v, S, y, w,
P, x
]
}, L.prototype.main = function(e) {
return [g.open(e), g.high(e), g.low(e), g.close(e), g.volume(e), g
.updatetime(e)
]
}, {
Std: g,
Series: w,
Symbol: C,
SymbolInfo: function(e, t) {
this.timezone = e || "America/New_York", this.session = t ||
"0000-0000"
},
StudyEngine: I,
BarSet: M,
OHLCV: L,
BarBuilder: O,
setupFeed: function(e) {
T.feed = e
},
getVolumeProfileResolutionForPeriod: function(t, i, s, r) {
return void 0 !== e ? e(t, i, s, r) : t
},
overwriteVolumeProfileResolutionForPeriodGetter: function(t) {
e = t
}
}
}();
e.exports = d
}).call(this, i("yLpj"))
},
ocrj: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "RemoveSourcesCommand", (function() {
return u
}));
var s = i("Eyy1"),
r = i("RDU5"),
n = i("CW80"),
o = i("txPx"),
a = i("pQ+n"),
l = i("3ClC"),
c = i("jpZi");
const h = Object(o.getLogger)("Chart.RemoveSourcesCommand");
class u extends r.UndoCommand {
constructor(e, t, i) {
super(i), this._excludeLineToolsUndoCommands = [], this._initialPriceScaleMode =
null, this._chartModel = e, this._sourceIds = Object(a.a)(e, t).map(e => e
.id()), this._sourceStates = [], this._paneIndexes = [], this
._priceScalePositionIds = [], this._paneStates = [], this
._restorePanes = [];
const r = t[0];
1 === t.length && Object(l.isStudy)(r) && (this._initialPriceScaleMode = Object(
s.ensureNotNull)(r.priceScale()).mode())
}
removedIds() {
return this._sourceIds
}
redo() {
this._chartModel.panes().length;
const e = this._sourceIds.map(e => Object(s.ensureNotNull)(this._chartModel
.dataSourceForId(e)));
this._sourceStates = e.map(e => Object(s.ensureNotNull)(e.state(!1)));
const t = e.map(e => Object(s.ensureNotNull)(this._chartModel.paneForSource(
e)));
this._paneIndexes = t.map(e => this._chartModel.panes().indexOf(e));
const i = this._chartModel.lineToolsGroupModel(),
r = new Map;
e.forEach(e => {
if (Object(n.isLineTool)(e)) {
const t = i.groupForLineTool(e);
if (null !== t) {
const i = r.get(t) || [];
i.push(e), r.set(t, i)
}
}
}), r.forEach((e, t) => {
const i = new c.a(this._chartModel, t, e);
i.redo(), this._excludeLineToolsUndoCommands.push(i)
}), this._priceScalePositionIds = e.map((e, i) => {
if (Object(n.isLineTool)(e)) return null;
const s = e.priceScale();
if (null === s) return null;
const r = t[i].priceScalePosition(s);
return {
id: s.id(),
position: r,
priceScaleIndex: t[i].priceScaleIndex(s, r)
}
});
const o = new Set;
e.forEach((e, t) => {
Object(n.isLineTool)(e) || o.add(this._paneIndexes[t])
}), this._paneStates = e.map((e, i) => {
const s = this._paneIndexes[i];
return o.has(s) ? t[i].state(!1, !0) : null
}), this._restorePanes = e.map(e => this._chartModel.removeSource(e))
}
undo() {
const e = [];
for (let t = this._sourceStates.length - 1; t >= 0; t--) {
const i = this._chartModel.restoreSource(this._restorePanes[t], this
._paneIndexes[t], this._paneStates[t], this._sourceStates[t], this
._priceScalePositionIds[t]);
i && e.push(i)
}
e.some((t, i) => t.id() !== this._sourceIds[e.length - i - 1]) && h.logError(
"Source was restored improperly - source ids does not match"), null !==
this._initialPriceScaleMode && Object(s.ensureNotNull)(e[0].priceScale())
.setMode(this._initialPriceScaleMode), this._excludeLineToolsUndoCommands
.forEach(e => e.undo())
}
}
},
odCa: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("fgLi").DataSource,
n = i("tc+8"),
o = i("Ocx9").DefaultProperty,
a = i("jTis").CalloutConsts,
l = i("j3hX").LineToolColorsProperty;
class c extends s {
constructor(e, t) {
super(e, t || c.createProperties()), this._barOffset = 0, this._timeScale = e
.timeScale(), i.e("lt-pane-views").then(i.t.bind(null, "B4Hi", 7)).then(({
CalloutPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 2
}
name() {
return "Callout"
}
_correctPoints(e) {
var t = this._currentMovingPoint.logical.index - this._startMovingPoint.logical
.index,
i = this._currentMovingPoint.logical.price - this._startMovingPoint.logical
.price,
s = e[1];
s.index += t, s.price += i, e[1] = s
}
addPoint(e) {
var t = s.prototype.addPoint.call(this, e);
return t && this._calculateBarOffset(), t
}
_calculateBarOffset() {
this.points().length > 1 && (this._barOffset = this.points()[1].index - this
.points()[0].index)
}
setLastPoint(e) {
super.setLastPoint(e), 2 === this.points().length && this._calculateBarOffset()
}
setPoint(e, t) {
switch (e) {
case 0:
super.setPoint(e, t), this._calculateBarOffset();
break;
case 1:
var i = this.properties();
if (!i.wordWrapWidth) return;
var s = this._points,
r = this._dragStartLeftEdgeIndex,
n = Math.round((t.index - r) / 2);
if (isFinite(r) && isFinite(n)) {
s[1] = {
index: r + n,
price: s[1].price
}, this._calculateBarOffset(), this.normalizePoints();
var o = this._timeScale.indexToCoordinate(r + 2 * n) - this._timeScale
.indexToCoordinate(r) - a.RoundRadius - a.TextMargins;
if (!isFinite(o)) return;
i.wordWrapWidth.setValue(Math.max(a.MinWidth, o));
break
}
s[1] = t, this._calculateBarOffset(), this.normalizePoints()
}
}
setPoints(e) {
super.setPoints(e);
var t = this.properties();
if (t.wordWrapWidth) {
var i = this._dragStartLeftEdgeIndex,
s = Math.round((e[1].index - i) / 2);
if (this._calculateBarOffset(), this.normalizePoints(), isFinite(i) && isFinite(
s)) {
var r = this._timeScale.indexToCoordinate(i + 2 * s) - this._timeScale
.indexToCoordinate(i) - a.RoundRadius - a.TextMargins;
if (!isFinite(r)) return;
t.wordWrapWidth.setValue(Math.max(a.MinWidth, r))
}
}
}
_onPointsetUpdated(e) {
super._onPointsetUpdated(e), 0 !== e.length && (this._dragStartLeftEdgeIndex = this
.points()[1].index)
}
move(e, t, i) {
super.move(e, t, i), this._calculateBarOffset()
}
state(e) {
var t = s.prototype.state.call(this, e);
return t.barOffset = this._barOffset, t
}
restoreData(e) {
e.barOffset ? this._barOffset = e.barOffset : this._calculateBarOffset(), this
._calculatePoint2()
}
setPriceScale(e) {
r.prototype.setPriceScale.call(this, e), e && e.priceRange() && this
._calculatePoint2()
}
template() {
var e = s.prototype.template.call(this);
return e.text = this.properties().childs().text.value(), e
}
_applyTemplateImpl(e) {
super._applyTemplateImpl(e), this.properties().childs().text.setValue(e.text)
}
_calculatePoint2() {
if (!(this._model.lineBeingEdited() === this || this._model.sourcesBeingMoved()
.includes(this) || this._points.length < 2)) {
var e = this.points()[0],
t = this.points()[1];
this._points[1] = {
price: t.price,
index: e.index + this._barOffset
}
}
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "xhf0")))
.CalloutDefinitionsViewModel
}
static createProperties(e) {
var t = new o("linetoolcallout", e);
return c._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e), e.hasChild("text") || e.addChild("text", new n(window.t(
"Text"))),
e.addExclusion("text"), e.addChild("textsColors", new l([e.childs().color]))
}
}
t.LineToolCallout = c
},
oiZD: function(e, t, i) {
"use strict";
i.r(t);
var s = i("hY0g"),
r = i.n(s);
i.d(t, "watchedTheme", (function() {
return n
})), i.d(t, "setTheme", (function() {
return o
}));
const n = new r.a;
function o(e) {
n.setValue(e)
}
n.subscribe(e => {
! function(e, t = window) {
const i = "theme-" + e,
s = t.document.documentElement.classList;
for (const e of Array.from(s)) e.startsWith("theme-") && e !== i && s.remove(e);
s.add(i)
}(e, window)
})
},
okVO: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SyncModel", (function() {
return o
}));
var s = i("IiTo"),
r = i("IDnv");
let n = 0;
class o {
constructor(e, t) {
this._extrapolatedData = [], this._cacheForFuture = !1, this._modelId = n++, this
._builderCache = null, this._resolution = t, this._symbolInfo = e, this._valid =
Boolean(e.timezone) && Boolean(e.session), this._session = new s.SessionInfo(e
.timezone, e.session, e.session_holidays, e.corrections)
}
getSymbolInfo() {
return this._symbolInfo
}
getSession() {
return this._session
}
getResolution() {
return this._resolution
}
uniqueId() {
return this._modelId
}
distance(e, t) {
if (!this.isValid()) return {
success: !1
};
if (e > t) return {
success: !1
};
if (e === t) return {
success: !0,
result: 0
};
let i = this._extrapolatedData.length,
s = 0 !== i ? this._extrapolatedData[0] : null,
n = null !== s ? this._extrapolatedData[i - 1] : null;
const o = e < t;
if (1e3 * e === s && this._cacheForFuture === o || (this._extrapolatedData = [1e3 *
e
], i = 1, s = null, n = null), null === s || null !== n && 1e3 * t > n) {
const s = Object(r.extrapolateBarsFrontToTime)(this._barBuilder(), n || 1e3 * e,
1e3 * t, 2e3, !0);
this._extrapolatedData = this._extrapolatedData.concat(s.times), i = this
._extrapolatedData.length, this._cacheForFuture = o
}
if (n = this._extrapolatedData[i - 1], n < 1e3 * t) return {
success: !1
};
const a = this._extrapolatedData.indexOf(1e3 * t);
return -1 === a ? {
success: !1
} : {
success: !0,
result: a
}
}
projectTime(e, t) {
if (!this.isValid()) return e;
let i = this._extrapolatedData.length,
s = i > 0 ? this._extrapolatedData[0] : null,
n = null !== s ? this._extrapolatedData[i - 1] : null;
const o = t >= 0;
1e3 * e === s && this._cacheForFuture === o || (this._extrapolatedData = [1e3 * e],
i = 1, s = null, n = null);
const a = Math.abs(t);
if (null === s || a >= i) {
const s = Object(r.extrapolateBarsFrontByCount)(this._barBuilder(), n || 1e3 *
e, Math.sign(t) * (a - i + 1), !0);
this._extrapolatedData = this._extrapolatedData.concat(s.times), i = this
._extrapolatedData.length, this._cacheForFuture = o
}
return i < a ? e : this._extrapolatedData[a] / 1e3
}
isValid() {
return this._valid
}
dataSize() {
return this._extrapolatedData.length
}
createNewModelWithResolution(e) {
return new o(this._symbolInfo, e)
}
_barBuilder() {
return null === this._builderCache && (this._builderCache = Object(s.newBarBuilder)(
this._resolution, this._session, this._session)), this._builderCache
}
}
},
onDC: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("aO4+"),
n = i("vwKG"),
o = i("4O8T"),
a = i.n(o),
l = i("0YCj"),
c = i.n(l),
h = i("txPx");
const u = window.t("Move All Scales To Left"),
d = window.t("Move All Scales To Right"),
p = Object(h.getLogger)("Chart.MergeAllScales");
var _ = i("MY2c"),
m = i("RDU5");
class f extends m.UndoCommand {
constructor(e, t, i, s, r, n) {
super(n), this._model = e, this._paneIndex = e.panes().indexOf(t), this
._targetPosition = s,
this._targetIndex = r, this._scaleId = i.id(), this._sourcePosition = t
.priceScalePosition(i), "overlay" !== this._sourcePosition && (this
._sourceIndex = t.priceScaleIndex(i, this._sourcePosition))
}
redo() {
const e = this._model.panes()[this._paneIndex],
t = Object(s.ensureNotNull)(e.getPriceScaleById(this._scaleId));
e.movePriceScale(t, this._targetPosition, this._targetIndex), this._model
.fullUpdate()
}
undo() {
const e = this._model.panes()[this._paneIndex],
t = Object(s.ensureNotNull)(e.getPriceScaleById(this._scaleId));
e.movePriceScale(t, this._sourcePosition, this._sourceIndex), this._model
.fullUpdate()
}
}
var g = i("CW80");
class b extends m.UndoCommand {
constructor(e, t, i, s) {
super(s), this._createdIds = [], this._model = e, this._withoutShift = i, this
._origStates = t.map(e => e.state(!0));
const r = e.lineToolsGroupModel();
this._origGroups = t.map(e => {
const t = r.groupForLineTool(e);
return t && t.id
})
}
redo() {
const e = this._model.lineToolsGroupModel(),
t = this._origStates.map((t, i) => {
const r = Object(s.ensureNotNull)(this._model.dataSourceForId(t
.id)),
n = 0 === this._createdIds.length ? void 0 : Object(s
.ensureDefined)(this._createdIds[i]),
o = Object(g.cloneLineTool)(this._model, r, !this._withoutShift,
n),
a = Object(s.ensureNotNull)(r.priceScale());
Object(s.ensureNotNull)(this._model.paneForSource(r)).addDataSource(
o, a, !1);
const l = this._origGroups[i];
if (null !== l) {
const t = e.groupForId(l);
t && t.addLineTools([o])
}
return this._model.updateSource(o), o
});
0 === this._createdIds.length && (this._createdIds = t.map(e => e.id())), this
._model.selectionMacro(e => {
e.clearSelection(), t.forEach(t => {
e.addSourceToSelection(t)
})
}), this._model.setShouldBeSavedEvenIfHidden(!0)
}
undo() {
const e = this._model.lineToolsGroupModel();
this._createdIds.forEach(t => {
const i = Object(s.ensureNotNull)(this._model.dataSourceForId(t)),
r = e.groupForLineTool(i);
null !== r && r.excludeLineTool(i), this._model.removeSource(i)
})
}
newIds() {
return this._createdIds
}
}
var v = i("ocrj"),
S = i("jpZi"),
y = i("ogJP");
class w extends m.UndoCommand {
constructor(e, t, i, s = !0) {
super(i, s), this._newStates = [], this._model = e, this._savedStates = t.map(
e => e.state(!1))
}
redo() {
this._applyState(this._newStates)
}
undo() {
0 === this._newStates.length && this.saveNewState(), this._applyState(this
._savedStates)
}
saveNewState() {
const e = this._savedStates.filter(y.notNull).map(e => Object(s.ensureNotNull)(
this._model.dataSourceForId(e.id)));
this._newStates = e.map(e => e.state(!1))
}
_applyState(e) {
for (const t of e)
if (null !== t) {
const e = this._model.dataSourceForId(t.id);
null !== e && this._model.restoreLineToolState(e, t)
}
}
}
var P = i("HGup"),
C = i("jRfx"),
x = i("s1Gx"),
T = i("0qMc");
class I extends m.UndoCommand {
constructor(e, t, i, s, r = !0) {
super("Create " + T.lineToolsLocalizedNames[i], !1), this._lineId = null, this
._lineState = null, this._model = e, this._paneIndex = e.panes().indexOf(t),
this._lineTool = i, this._ownerSourceId = s.id(), this
._needCopyToOtherCharts = r
}
startCreatingLine(e, t, i) {
const s = this._model.panes()[this._paneIndex],
r = this._model.dataSourceForId(this._ownerSourceId),
n = this._model.createLineTool(s, e, this._lineTool, t, i, r);
return this._lineId = n.id(), !this._model.lineBeingCreated()
}
continueCreatingLine(e, t, i, s) {
const r = this._model.continueCreatingLine(e, t, i, s);
return r && this._model.setShouldBeSavedEvenIfHidden(!0), r
}
line() {
return null === this._lineId ? null : this._model.dataSourceForId(this._lineId)
}
undo() {
const e = this.line();
null !== e && (this._lineState = e.state(!1), this._model.removeSource(e), this
._lineId = null)
}
redo() {
if (null === this._lineState) return;
const e = this._model.restoreSource(!1, this._paneIndex, null, Object(s
.ensureNotNull)(this._lineState), null);
null !== e && (this._lineId = e.id(), this._lineState = null)
}
needCopyToOtherCharts() {
return this._needCopyToOtherCharts
}
}
var M = i("GVQo");
class O extends m.UndoCommand {
constructor(e, t, i) {
super(i), this._sourcesByPanes = new Map, this._originalState = new Map, this
._model = e, t.forEach(t => {
const i = Object(s.ensureNotNull)(e.paneForSource(t)),
r = e.panes().indexOf(i),
n = this._sourcesByPanes.get(r) || [];
n.push(t.id()), this._sourcesByPanes.set(r, n)
}), Array.from(this._sourcesByPanes.keys()).forEach(t => {
const i = e.panes()[t],
s = new Map;
i.sourcesByGroup().allIncludingHidden().forEach(e => {
s.set(e.id(), e.zorder())
}), this._originalState.set(t, s)
})
}
undo() {
this._originalState.forEach((e, t) => {
const i = this._model.panes()[t],
r = new Map;
e.forEach((e, t) => {
const n = Object(s.ensureNotNull)(i.dataSourceForId(t));
r.set(n, e)
}), i.setZOrders(r)
})
}
redo() {
this._sourcesByPanes.forEach((e, t) => {
const i = this._model.panes()[t],
r = e.map(e => Object(s.ensureNotNull)(i.dataSourceForId(e)));
this._paneOperation(i, r)
})
}
}
class L extends O {
constructor(e, t) {
super(e, t, `Bring ${t[0].title()} to front`)
}
_paneOperation(e, t) {
e.bringToFront(t)
}
}
class A extends O {
constructor(e, t) {
super(e, t, `Send ${t[0].title()} to back`)
}
_paneOperation(e, t) {
e.sendToBack(t)
}
}
class E extends O {
constructor(e, t, i, s) {
super(e, t, s), this._targetSource = i
}
_paneOperation(e, t) {
e.insertAfter(t, this._targetSource)
}
}
class k extends E {
constructor(e, t, i) {
super(e, t, i, `Insert ${t[0].title()} after ${i.title()}`)
}
}
class D extends O {
constructor(e, t, i, s) {
super(e, t, s), this._targetSource = i
}
_paneOperation(e, t) {
e.insertBefore(t, this._targetSource)
}
}
class V extends D {
constructor(e, t, i) {
super(e, t, i, `Insert ${t[0].title()} before ${i.title()}`)
}
}
function B(e, t) {
const i = t[0],
s = e.sourcesByGroup().all().filter(e => e.zorder() < i.zorder());
if (0 === s.length) throw new Error("Cannot move backward source that alreadt on back");
let r = s[s.length - 1];
if (Object(g.isLineTool)(r)) {
const t = e.model().lineToolsGroupModel().groupForLineTool(r);
null !== t && (r = t.lineTools()[0])
}
return r
}
class R extends D {
constructor(e, t, i) {
super(e, i, B(t, i), `Send ${i[0].title()} backward`)
}
}
function N(e, t) {
const i = t[t.length - 1],
s = e.sourcesByGroup().allExceptSpecialSources().filter(e => e.zorder() > i.zorder());
if (0 === s.length) throw new Error("Cannot bring forward source that alreadt on back");
let r = s[0];
if (Object(g.isLineTool)(r)) {
const t = e.model().lineToolsGroupModel().groupForLineTool(r);
if (null !== t) {
const e = t.lineTools();
r = e[e.length - 1]
}
}
return r
}
class j extends E {
constructor(e, t, i) {
super(e, i, N(t, i), `Send ${i[0].title()} backward`)
}
}
function F(e, t) {
return Object(s.ensureNotNull)(e.paneForSource(t.lineTools()[0]))
}
class W extends D {
constructor(e, t) {
super(e, t.lineTools(), B(F(e, t), t.lineTools()),
`Send Group ${t.name()} backward`)
}
}
class H extends E {
constructor(e, t) {
super(e, t.lineTools(), N(F(e, t), t.lineTools()),
`Bring Group ${t.name()} backward`)
}
}
class U extends m.UndoCommand {
constructor(e, t, i) {
super("Rearrange panes"), this._chartModel = e, this._index = t, Object(y
.isNumber)(i) ? this._dstIndex = i : this._dstIndex = "up" === i ? t -
1 : t + 1
}
redo() {
this._checkIndices() && this._chartModel.movePane(this._index, this._dstIndex)
}
undo() {
this._checkIndices() && this._chartModel.movePane(this._dstIndex, this._index)
}
_checkIndices() {
const e = this._chartModel.panes().length;
return this._index >= 0 && this._index < e && this._dstIndex >= 0 && this
._dstIndex < e
}
}
var z = i("XcdR"),
G = i("Fixu"),
q = i("Ocx9"),
Y = i("n5al"),
K = i("PT1i"),
J = i("pPtI");
class Z extends m.UndoCommand {
constructor(e, t, i, s, r, n) {
super(s), this._prevPriceAxisProps = {}, this._property = e, this._mainSeries =
i, this._value = t, this._model = r, this._chartWidget = n
}
redo() {
const e = this._mainSeries,
t = e.properties();
t.style === this._property && e.isNeedRestart(this._value) && this._chartWidget
.screen.show(), this._prevResolution = t.interval.value(), this._prevValue =
this._property.value(), this._storePriceAxisProps(), Object(q
.saveDefaultProperties)(!0);
const i = t.interval.value(),
s = this._model.defaultResolutions(),
r = Object(J.getResolutionByChartStyle)(this._value, i, s);
K.linking.interval.setValue(r), e.setChartStyleWithIntervalIfNeeded(this._value,
r), Object(Y.setLastUsedStyle)(this._value), Object(Y
.preparePriceAxisProperties)(t), Object(q.saveDefaultProperties)(!1),
this._invalidateModel()
}
undo() {
const e = this._mainSeries;
e.properties().style === this._property && e.isNeedRestart(this._value) && this
._chartWidget.screen.show(), Object(q.saveDefaultProperties)(!0), e
.setChartStyleWithIntervalIfNeeded(this._prevValue, this._prevResolution),
this._restorePriceAxisProps(), K.linking.interval.setValue(this
._prevResolution), Object(q.saveDefaultProperties)(!1), this
._invalidateModel()
}
_storePriceAxisProps() {
const e = this._mainSeries.priceScale();
this._prevPriceAxisProps = e.mode()
}
_restorePriceAxisProps() {
this._mainSeries.priceScale().setMode(this._prevPriceAxisProps)
}
_invalidateModel() {
this._model && (this._model.recalculateAllPanes(), this._model.lightUpdate())
}
}
var X = i("ufwo"),
$ = i("LxhU");
class Q extends m.UndoCommand {
constructor(e, t) {
super("Change date range"), this._modelsData = [], this._rangeOptions = t, this
._modelsData.push({
model: e,
prevResolution: e.mainSeries().properties().interval.value(),
barSpacing: e.timeScale().barSpacing(),
rightOffset: e.timeScale().rightOffset(),
rangeOptions: e.appliedTimeFrame().value()
})
}
redo() {
const e = [];
for (const t of this._modelsData) {
const i = t.model.mainSeries(),
s = i.properties().interval;
$.Interval.isEqual(this._rangeOptions.res, s.value()) ? i.loadDataTo(this
._rangeOptions.val) : (e.push(s), i.setDefaultTimeframe(this
._rangeOptions.val), s.setValueSilently(this._rangeOptions.res))
}
for (const t of e) t.listeners().fire(t)
}
undo() {
const e = [];
for (const t of this._modelsData) {
const i = t.model.mainSeries(),
s = i.properties().interval;
t.prevResolution !== s.value() ? (e.push(s),
null !== t.rangeOptions && i.setDefaultTimeframe(t.rangeOptions
.val), s.setValueSilently(t.prevResolution)) : null !== t
.rangeOptions && i.loadDataTo(t.rangeOptions.val);
const r = t.model.timeScale();
r.setBarSpacing(t.barSpacing), r.setRightOffset(t.rightOffset)
}
for (const t of e) t.listeners().fire(t)
}
canMerge(e) {
return e instanceof Q && Object(X.rangesAreEqual)(e._rangeOptions, this
._rangeOptions)
}
merge(e) {
if (!(e instanceof Q)) throw new Error("Invalid command to merge");
this._modelsData = this._modelsData.concat(e._modelsData)
}
}
var ee = i("//lZ"),
te = i("UqOQ");
i("YFKU"), i("HbRj");
class ie extends m.UndoCommand {
constructor(e, t, i) {
super(i), this._model = e, this._groupId = t.id, this._groupName = t.name(),
this._lineToolsIds = t.lineTools().map(e => e.id())
}
redo() {
const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(
this._groupId));
this._model.lineToolsGroupModel().removeGroup(e)
}
undo() {
const e = this._lineToolsIds.map(e => this._model.dataSourceForId(e)),
t = new te.a(e, this._groupName, this._groupId);
this._model.lineToolsGroupModel().addGroup(t)
}
}
const se = window.t("Create line tools group");
class re extends m.UndoCommand {
constructor(e, t) {
super(se), this._groupId = null, this._model = e, this._sourcesIds = t.map(e =>
e.id())
}
redo() {
const e = this._sourcesIds.map(e => this._model.dataSourceForId(e)),
t = null === this._groupId ? void 0 : this._groupId;
this._groupId = this._model.lineToolsGroupModel().createGroup(e, this._title, t)
.id
}
undo() {
const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(
Object(s.ensureNotNull)(this._groupId)));
this._model.lineToolsGroupModel().removeGroup(e)
}
createdGroupId() {
return this._groupId
}
}
const ne = window.t("Add line tool(s) {lineTool} to group {group}");
class oe extends m.UndoCommand {
constructor(e, t, i) {
super(ne.format({
group: t.name()
})), this._model = e, this._groupId = t.id, this._lineToolsIds = i.map(e =>
e.id())
}
redo() {
const e = Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(
this._groupId)),
t = this._lineToolsIds.map(e => this._model.dataSourceForId(e));
e.addLineTools(t)
}
undo() {
const e = this._lineToolsIds.map(e => this._model.dataSourceForId(e));
Object(s.ensureNotNull)(this._model.lineToolsGroupModel().groupForId(this
._groupId)).excludeLineTools(e)
}
}
var ae = i("bJYc");
class le extends m.UndoCommand {
constructor(e, t, i, s) {
super(s), this._chartModel = e, this._groupId = t.id, this._oldName = t.name(),
this._newName = i
}
redo() {
Object(s.ensureNotNull)(this._chartModel.lineToolsGroupModel().groupForId(this
._groupId)).setName(this._newName)
}
undo() {
Object(s.ensureNotNull)(this._chartModel.lineToolsGroupModel().groupForId(this
._groupId)).setName(this._oldName)
}
}
var ce = i("mMWL");
const he = window.t("Create line tools group from selection"),
ue = window.t("Removing line tools group {name}"),
de = window.t("Add line tool {lineTool} to group {name}"),
pe = window.t("Make group {group} visible"),
_e = window.t("Make group {group} invisible"),
me = window.t("Lock group {group}"),
fe = window.t("Unlock group {group}"),
ge = window.t("Rename group {group} to {newName}");
class be {
constructor(e) {
this._environment = e
}
createGroupFromSelection() {
const e = this._environment.model();
Object(s.assert)(!e.selection().isEmpty(),
"Cannot create group from empty selection");
const t = Object(x.sortSources)(e.selection().lineDataSources());
Object(s.assert)(t.length === e.selection().allSources().length,
"A group could contain line tools only");
const i = t.reduce((e, t) => e.zorder() > t.zorder() ? e : t, t[0]);
let r = i;
const n = e.lineToolsGroupModel().groupForLineTool(i);
if (null !== n) {
const e = n.lineTools();
r = e[e.length - 1]
}
this._environment.beginUndoMacro(he);
const o = new Map,
a = new Set;
t.forEach(t => {
const i = this._groupForLineTool(t);
if (null === i) return;
const r = o.get(i) || [];
r.push(t), o.set(i, r);
const n = Object(s.ensureNotNull)(e.paneForSource(t));
a.add(n)
}), Object(s.assert)(a.size <= 1,
"All selected sources should be on the same pane"), o.forEach((t, i) => {
const s = new S.a(e, i, t);
this._environment.pushUndoCommand(s)
});
const l = new re(e, Object(x.sortSources)(t));
this._environment.pushUndoCommand(l);
const c = new k(e, t, r);
this._environment.pushUndoCommand(c), this._environment.endUndoMacro();
const h = Object(s.ensureNotNull)(l.createdGroupId());
return Object(s.ensureNotNull)(e.lineToolsGroupModel().groupForId(h))
}
removeGroup(e) {
const t = this._environment.model(),
i = e.lineTools();
this._environment.beginUndoMacro(ue.format({
name: e.name()
}));
const r = new ie(t, e, "");
this._environment.pushUndoCommand(r);
const n = new v.RemoveSourcesCommand(t, i, "");
this._environment.pushUndoCommand(n);
const o = t.mainSeries().symbol();
i.forEach(e => {
null !== e.linkKey().value() && Object(ce.removeLineTool)({
withUndo: !0,
model: t,
symbol: o,
sourceTitle: e.title(),
lineToolState: e.state(!1),
linkKey: Object(s.ensureNotNull)(e.linkKey().value())
})
}), this._environment.endUndoMacro()
}
groups() {
return this._environment.model().lineToolsGroupModel().groups()
}
excludeLineToolFromGroup(e, t) {
const i = this._environment.model(),
s = new S.a(i, e, [t]);
this._environment.pushUndoCommand(s)
}
addLineToolToGroup(e, t) {
const i = this._environment.model(),
s = i.lineToolsGroupModel().groupForLineTool(t);
if (s === e) return;
const r = de.format({
lineTool: t.title(),
name: e.name()
});
this._environment.beginUndoMacro(r), null !== s && this._environment
.pushUndoCommand(new S.a(i, s, [t])), this._environment.pushUndoCommand(new oe(
i, e, [t])), this._environment.endUndoMacro()
}
bringToFront(e) {
const t = this._environment.model(),
i = new L(t, e.lineTools());
this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e
.lineTools()
])
}
sendToBack(e) {
const t = this._environment.model(),
i = new A(t, e.lineTools());
this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e
.lineTools()
])
}
bringForward(e) {
const t = this._environment.model(),
i = new H(t, e);
this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e
.lineTools()
])
}
sendBackward(e) {
const t = this._environment.model(),
i = new W(t, e);
this._environment.pushUndoCommand(i), this._environment.emitEvent("changeZOrder", [e
.lineTools()
])
}
insertAfter(e, t) {
const i = this._environment.model();
let s;
if (t instanceof te.a) {
const e = t.lineTools();
s = e[e.length - 1]
} else s = t;
const r = new k(i, e.lineTools(), s);
this._environment.pushUndoCommand(r), this._environment.emitEvent("changeZOrder", [e
.lineTools()
])
}
insertBefore(e, t) {
const i = this._environment.model();
let s;
if (t instanceof te.a) {
s = t.lineTools()[0]
} else s = t;
const r = new V(i, e.lineTools(), s);
this._environment.pushUndoCommand(r), this._environment.emitEvent("changeZOrder", [e
.lineTools()
])
}
availableZOrderOperations(e) {
const t = this._environment.model(),
i = e.lineTools(),
r = i[0],
n = i[i.length - 1],
o = Object(s.ensureNotNull)(t.paneForSource(i[0])).sourcesByGroup()
.allExceptSpecialSources(),
a = o[0],
l = o[o.length - 1];
return {
bringForwardEnabled: n !== l,
bringToFrontEnabled: n !== l,
sendBackwardEnabled: r !== a,
sendToBackEnabled: r !== a
}
}
setGroupVisibility(e, t) {
const i = (t ? pe : _e).format({
group: e.name()
}),
s = this._environment.model();
this._environment.beginUndoMacro(i), e.lineTools().forEach(e => {
const i = e.properties().visible,
r = new ae.SetPropertyUndoCommand(i, t, "", s);
this._environment.pushUndoCommand(r)
}), this._environment.endUndoMacro()
}
setGroupLock(e, t) {
const i = (t ? me : fe).format({
group: e.name()
}),
s = this._environment.model();
this._environment.beginUndoMacro(i), e.lineTools().forEach(e => {
const i = e.properties().frozen,
r = new ae.SetPropertyUndoCommand(i, t, "", s);
this._environment.pushUndoCommand(r)
}), this._environment.endUndoMacro()
}
setGroupName(e, t) {
const i = this._environment.model(),
s = ge.format({
group: e.name(),
newName: t
}),
r = new le(i, e, t, s);
this._environment.pushUndoCommand(r)
}
canBeGroupped(e) {
const t = this._environment.model();
return new Set(e.map(e => t.paneForSource(e))).size <= 1
}
_groupForLineTool(e) {
return this._environment.model().lineToolsGroupModel().groups().find(t => t
.containsLineTool(e)) || null
}
}
var ve = i("3ClC"),
Se = i("pQ+n"),
ye = i("Vs8b"),
we = i("2jby");
const Pe = window.t("Apply study template {template}");
class Ce extends m.UndoCommand {
constructor(e, t, i) {
super(Pe.format({
template: i
})), this._model = e, this._templateContent = t, this._initialState = e
.studyTemplate(!0, !0, !0), this._initialGroupsState = e
.lineToolsGroupModel().state()
}
redo() {
const e = this._merge(this._templateContent).filter(g.isLineTool);
this._model.lineToolsGroupModel().removeLineTools(e), this._model.mainSeries()
.onChartStyleChanged();
const t = this._model.mainSeries().properties();
Object(Y.preparePriceAxisProperties)(t), this._model.recalcVisibleRangeStudies(!
0), this._model.setShouldBeSavedEvenIfHidden(!0)
}
undo() {
this._merge(this._initialState), this._model.mainSeries().onChartStyleChanged()
}
_merge(e) {
const t = e.version || 0,
i = this._model,
r = i.mainSeries(),
n = r.id();
if (r.priceScale().properties().childs().lockScale.setValue(!1), this
._initialState.symbol && e.symbol) {
const t = r.properties();
t.currencyId.setValue(e.currency || null), t.unitId.setValue(e.unit ||
null), t.symbol.setValue(e.symbol)
}
if (this._initialState.symbol && e.interval) {
const t = Object(Y.getChartStyleByResolution)(e.interval, r.properties()
.style.value());
r.setChartStyleWithIntervalIfNeeded(t, e.interval)
}
const o = i.panes(),
a = [];
for (let e = o.length; e--;) {
const t = o[e],
i = t.containsMainSeries(),
s = t.dataSources();
for (let e = s.length; e--;) {
const t = s[e];
(!i || Object(ve.isStudy)(t) && t.isRemovedByStudyTemplates()) && a
.push(t)
}
}
i.resetDeferredStudies();
const l = Object(Se.a)(i, a);
for (let e = 0; e < l.length; ++e) i.removeSource(l[e]);
const c = e.panes;
for (let e = 0; e < c.length; e++) {
let s = -1;
const r = Object(y.clone)(c[e]);
r.sources.sort((e, t) => e.zorder - t.zorder);
for (let e = 0; e < r.sources.length; e++) {
const t = r.sources[e];
if (Object(ye.isMainSeriesState)(t)) {
delete t.state, s = e;
break
}
}
const n = s > -1,
a = n ? o[e] : i.createPane(e);
n && t < 3 && Object(we.reorderDataSourcesStateZOrder)(r.sources), a
.restoreState(r, !1, t), null !== a.mainDataSource() || i.removePane(a)
}
return Object(s.ensureNotNull)(i.paneForSource(r)).changeSourceId(r, n), i
.syncESD(), r.priceScale().setMode({
autoScale: !0
}), i.startNotStartedStudies(), i.recalculateAllPanes(), i.fullUpdate(), l
}
}
var xe = i("e3/o"),
Te = i("/tGj");
const Ie = Object(h.getLogger)("Chart.ChartUndoModel");
class Me extends m.UndoCommand {
constructor(e, t, i, r, n) {
super("Paste Drawing"), this._needCopyToOtherCharts = !1, this._sourceState =
null, this._model = e, this._clipboardData = t, this._paneIndex = this
._model.panes().indexOf(i || Object(s.ensureNotNull)(this._model
.paneForSource(this._model.mainSeries()))), this._pasteWithData = !!r,
this._keepZIndex = !!n
}
redo() {
const e = this._model.panes()[this._paneIndex],
t = Object(s.ensureNotNull)(e.clipboardLineToolOwnerSource(this
._clipboardData.source.id));
null === this._sourceState && (this._sourceState = this._getSourceState(t));
const i = e.restoreLineTool(this._sourceState, this._pasteWithData, this
._keepZIndex);
this._clipboardData.centeredOnChart && i.centerPosition && i.centerPosition();
const r = Object(s.ensureNotNull)(t.priceScale());
i.setOwnerSource(t), i.setPriceScale(r), r.addDataSource(i), i
.restoreFixedPoints(), Object(g.prepareLineToolPropertiesByOwnerSource)(i
.properties(), t), i.calcIsActualSymbol(), i.createServerPoints();
const n = Object(Te.isSymbolSource)(t) || t.metaInfo().is_price_study;
this._needCopyToOtherCharts = Boolean(n && (Object(ce.drawOnAllCharts)()
.value() || i.linkKey().value() && i.isSynchronizable())), this._model
.setShouldBeSavedEvenIfHidden(!0)
}
undo() {
if (!this._sourceState) return void Ie.logError(
"This command was never executed - nothing to undo");
const e = this.source();
this._clipboardData.centeredOnChart && (this._clipboardData.centeredOnChart = !
1, this._sourceState.points = e.normalizedPoints()), this._model
.removeSource(e)
}
source() {
return Object(s.ensureNotNull)(this._model.dataSourceForId(Object(s
.ensureNotNull)(this._sourceState).id))
}
needCopyToOtherCharts() {
return this._needCopyToOtherCharts
}
_getSourceState(e) {
const t = Object(y.clone)(this._clipboardData.source);
delete t.state.symbol, null != t.linkKey && (t.linkKey = Object(xe.randomHash)
());
const i = Object(s.ensureNotNull)(e.priceScale()),
n = this._model;
let o = !1;
this._clipboardData.source.state.symbol === Object(s.ensureNotNull)(e
.symbolSource()).symbol() && (Object(Te.isSymbolSource)(e) ? o = !0 :
Object(ve.isStudy)(e) && (o = Boolean(e.metaInfo().is_price_study)));
const a = e => {
const t = e.x * n.timeScale().width(),
s = e.y * i.height() - 40;
return new r.Point(t, s)
},
l = Object(s.ensureNotNull)(e.firstValue());
if (this._model.id() === this._clipboardData.modelId || !o)
for (let e = 0; e < this._clipboardData.geometry.length; ++e) {
const s = a(this._clipboardData.geometry[e]),
r = n.timeScale().coordinateToIndex(s.x),
c = n.timeScale().normalizeBarIndex(r);
if (o) {
const s = i.priceToCoordinate(t.points[e].price, l) + -40;
c.price = i.coordinateToPrice(s, l)
} else c.price = i.coordinateToPrice(s.y, l);
t.points[e] = c
}
return t.id = Object(xe.guid)(), t
}
}
var Oe = i("xo8u"),
Le = i("Yt+L"),
Ae = i("/ToI");
class Ee extends m.UndoCommand {
constructor(e, t, i) {
super("Change Symbol"), this._sourceId = e.id(), this._newSymbol = t, this
._prevSymbol = e.symbol(), this._prevCurrency = e.currency(), this
._prevUnit = e.unit(), this._chartWidget = i, this._showFade = e === i
.model().mainSeries()
}
redo() {
this._showFade && this._chartWidget.screen.show(), this._symbolSource()
.setSymbolCurrencyUnit(this._newSymbol, null, null)
}
undo() {
this._showFade && this._chartWidget.screen.show(), this._symbolSource()
.setSymbolCurrencyUnit(this._prevSymbol, this._prevCurrency, this._prevUnit)
}
_symbolSource() {
return Object(s.ensureNotNull)(this._chartWidget.model().model()
.dataSourceForId(this._sourceId))
}
}
var ke = i("JWMC"),
De = i("gaBL");
const Ve = Object(h.getLogger)("Chart.ChartUndoModel");
class Be extends m.UndoCommand {
constructor(e, t, i) {
super("Paste Indicator"), this._sourceState = null, this._model = e, this
._clipboardData = t, this._paneId = i
}
redo() {
if (!this._sourceState) {
const e = Object(y.clone)(this._clipboardData.source);
e.id = Object(xe.guid)(), this._sourceState = e
}
let e, t;
e = this._paneId ? Object(s.ensureNotNull)(this._model.paneForId(this
._paneId)) : this._sourceState.metaInfo.is_price_study ? Object(s
.ensureNotNull)(this._model.paneForSource(this._model.mainSeries())) :
this._model.createPane();
const i = !e.mainDataSource();
this._sourceState.zorder = e.newStudyZOrder();
const r = e.restoreStudy(this._sourceState, !1);
this._sourceState.metaInfo.linkedToSeries && r.setOwnerSource(this._model
.mainSeries()), i || (t = this._sourceState.metaInfo.is_price_study ?
t = this._model.mainSeries().priceScale() : this._paneId ? e
.findSuitableScale(r) : e.defaultPriceScale(), t !== r.priceScale() && e
.move(r, t)), Object(ve.isStudy)(r) && r.start()
}
undo() {
if (null === this._sourceState) return void Ve.logError(
"This command was never executed - nothing to undo");
const e = Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceState
.id));
this._model.removeSource(e)
}
state() {
return this._sourceState
}
}
class Re extends m.UndoCommand {
constructor(e, t, i, s, r) {
super("", !1), this._model = e, this._paneA = t, this._paneB = i, this
._prevStretchA = s, this._currStretchA = r
}
redo() {
const e = this._paneA.stretchFactor() + this._paneB.stretchFactor();
this._paneA.setStretchFactor(this._currStretchA), this._paneB.setStretchFactor(
e - this._currStretchA), this._model.fullUpdate()
}
undo() {
const e = this._paneA.stretchFactor() + this._paneB.stretchFactor();
this._paneA.setStretchFactor(this._prevStretchA), this._paneB.setStretchFactor(
e - this._prevStretchA), this._model.fullUpdate()
}
}
var Ne = i("KnF9");
class je extends m.UndoCommand {
constructor(e, t, i, s) {
super("Move", !1), this._endEvent = null, this._model = e, this._sourceId = t
.id(), this._itemIndex = i,
this._startEvent = s
}
move(e) {
this._endEvent = e, this._move(e)
}
hasChanges() {
return null !== this._endEvent
}
undo() {
this._move(this._startEvent)
}
redo() {
this._move(Object(s.ensureNotNull)(this._endEvent))
}
_move(e) {
const t = Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceId));
Object(s.assert)(void 0 !== t.moveItem, 'The method "moveItem" is not defined'),
t.moveItem && t.moveItem(new r.Point(e.localX, e.localY), this._itemIndex,
new Ne.a(e))
}
}
class Fe extends m.UndoCommand {
constructor(e, t, i, s, r, n, o, a, l, c, h, u) {
super(u), this._studyId = null, this._paneState = null, this._chartModel = e,
this._studyMetaInfo = t, this._props = s, this._addAsOverlay = r, this
._parentId = null == n ? null : n.id(), this._inputs = i, this
._targetZOrder = h, this._preferredPriceScale = o, this
._allowChangeCurrency = a, this._allowChangeUnit = l, this._paneSize = c
}
redo() {
const e = null === this._parentId ? void 0 : this._chartModel.dataSourceForId(
this._parentId),
t = this._chartModel.insertStudyWithParams(this._studyMetaInfo, this
._inputs, this._targetZOrder, this._props, this._addAsOverlay, e, this
._preferredPriceScale, this._allowChangeCurrency, this._allowChangeUnit,
this._paneSize, null === this._studyId ? void 0 : this._studyId);
if (this._studyId = t.id(), t.childStudyByRebind().subscribe(null, () => Object(
ke.trackEvent)("SOS", "Apply SOS", "Rebind SOS")), this._chartModel
.setShouldBeSavedEvenIfHidden(!0), null !== this._paneState) {
Object(s.ensureNotNull)(this._chartModel.paneForSource(t)).restoreState(this
._paneState, !1, this._chartModel.version()), this._paneState = null
}
}
undo() {
const e = Object(s.ensureNotNull)(this._chartModel.dataSourceForId(Object(s
.ensureNotNull)(this._studyId))),
t = Object(s.ensureNotNull)(this._chartModel.paneForSource(e)).state();
this._chartModel.removeSource(e) && (this._paneState = t)
}
insertedStudy() {
return this._chartModel.dataSourceForId(Object(s.ensureNotNull)(this._studyId))
}
}
var We = i("pOzK"),
He = i("cWHH"),
Ue = i.n(He),
ze = i("SwuQ"),
Ge = i("7MWe"),
qe = i("Kxc7");
class Ye extends m.UndoCommand {
constructor(e, t, i, s, r, n) {
super("Zoom"), this._timeScaleState = null, this._priceScaleState = null, this
._model = e, this._startBar = t, this._endBar = i, this._startPrice = s,
this._endPrice = r, this._pane = n
}
redo() {
this._timeScaleState = this._model.timeScale().state(), this._priceScaleState =
this._pane.defaultPriceScale().state(), this._model.zoomToViewport(this
._startBar, this._endBar, this._startPrice, this._endPrice, this._pane)
}
undo() {
this._model.timeScale().restoreState(Object(s.ensureNotNull)(this
._timeScaleState)), this._pane.defaultPriceScale().restoreState(Object(s
.ensureNotNull)(this._priceScaleState)), this._model
.recalculateAllPanes(), this._model.lightUpdate()
}
}
const Ke = Object(h.getLogger)("Chart.ChartUndoModel");
class Je extends m.UndoCommand {
constructor(e, t, i) {
super("Zoom"), this._baseCmd = e, this._zoomStack = t, this._inOut = i
}
undo() {
if (this._inOut) {
if (this._baseCmd !== this._zoomStack.head()) return void Ke.logDebug(
"zoom stack inconsistency");
this._baseCmd.undo(), this._zoomStack.pop()
} else this._baseCmd.redo(), this._zoomStack.push(this._baseCmd)
}
redo() {
if (this._inOut) this._baseCmd.redo(), this._zoomStack.push(this._baseCmd);
else {
if (this._baseCmd !== this._zoomStack.head()) return void Ke.logDebug(
"zoom stack inconsistency");
this._baseCmd.undo(), this._zoomStack.pop()
}
}
}
class Ze extends m.UndoCommand {
constructor(e, t) {
super("Stop Syncing Drawing"), this._model = e, this._sourceId = t.id(), this
._linkKey = t.linkKey().value()
}
redo() {
Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceId)).linkKey()
.setValue(null)
}
undo() {
Object(s.ensureNotNull)(this._model.dataSourceForId(this._sourceId)).linkKey()
.setValue(this._linkKey)
}
}
class Xe extends m.UndoCommand {
constructor(e, t, i = "Restore Defaults") {
super(i), this._chartModel = e, this._defaultProperty = t, this._state = t
.state()
}
redo() {
this._chartModel.restoreFactoryDefaults(this._defaultProperty)
}
undo() {
this._defaultProperty.mergeAndFire(this._state), this._chartModel.mainSeries()
.onChartStyleChanged()
}
}
var $e = i("0C7r");
class Qe extends Xe {
redo() {
this._defaultProperty.hasChild("intervalsVisibilities") && this._defaultProperty
.childs().intervalsVisibilities.mergeAndFire($e.intervalsVisibilitiesDefaults),
super.redo()
}
}
var et = i("eCE5");
i.d(t, "ChartUndoModelBase", (function() {
return ot
}));
const tt = window.t("Send {title} backward"),
it = window.t("Bring {title} forward"),
st = window.t("Insert {title} after {target}"),
rt = window.t("Insert {title} before {target}");
function nt(e, t) {
return {
bringForwardEnabled: e.bringForwardEnabled || t.bringForwardEnabled,
bringToFrontEnabled: e.bringToFrontEnabled || t.bringToFrontEnabled,
sendBackwardEnabled: e.sendBackwardEnabled || t.sendBackwardEnabled,
sendToBackEnabled: e.sendToBackEnabled || t.sendToBackEnabled
}
}
class ot extends a.a {
constructor(e, t, i, s, r, n, o, a, l) {
super(), this._createLineCommand = null, this._initialTimeScrollState = null,
this._initialTimeScrollPos = null, this._currentSourceMoveCommand = null,
this._currentLineChangeCommand = null, this._currentCustomMoveCommand =
null, this._zoomStack = new _.a, this._chartWidget = n, this.m_model =
new Ue.a(e, t, i, s, r, this, a, l), this._undoHistory = o, this
._lineToolsGroupController = new be({
model: this._model.bind(this),
pushUndoCommand: this._pushUndoCommand.bind(this),
beginUndoMacro: this._undoHistory.beginUndoMacro.bind(this
._undoHistory),
endUndoMacro: this._undoHistory.endUndoMacro.bind(this
._undoHistory),
emitEvent: this.emitEvent.bind(this)
})
}
undoHistory() {
return this._undoHistory
}
lineToolsGroupController() {
return this._lineToolsGroupController
}
mergeAllScales(e) {
! function(e, t) {
e.beginUndoMacro("left" === t ? u : d), e.model().panes().forEach(i => {
const s = "left" === t ? i.rightPriceScales() : i
.leftPriceScales(),
r = ("left" === t ? i.leftPriceScales() : i
.rightPriceScales()).concat(s),
n = "overlay" === i.priceScalePosition(i
.defaultPriceScale()) ? r[0] : i.defaultPriceScale();
e.movePriceScale(i, n, t, 0), r.forEach(t => {
if (t === n) return;
let s = t.mainSource();
for (; null !== s;) {
e.moveToScale(s, i, n, "", !0);
const r = t.mainSource();
if (r === s) {
p.logError(
"Loop detected while trying to merge scales"
);
break
}
s = r
}
})
}), e.endUndoMacro(), e.model().fullUpdate()
}(this, e)
}
movePriceScale(e, t, i, s) {
const r = new f(this._model(), e, t, i, s, window.t("Move scale"));
this._pushUndoCommand(r)
}
createLineTool(e, t, i, r, o, a, l) {
const c = "Create " + T.lineToolsLocalizedNames[i];
if (("LineToolRegressionTrend" === i || "LineToolAnchoredVWAP" === i) && !this
.canCreateStudy()) return Object(n.showTooManyStudiesNotice)(), null;
this.beginUndoMacro(c);
const h = !l;
this._createLineCommand = new I(this._model(), e, i, a || Object(s
.ensureNotNull)(e.mainDataSource()), h);
const u = this._createLineCommand.startCreatingLine(t, r, o || null),
d = Object(s.ensureNotNull)(this._createLineCommand.line());
let p = null;
if (u && (h && this.finishLineTool(d), this._pushUndoCommand(this
._createLineCommand), this._createLineCommand = null, p = {
points: d.normalizedPoints(),
interval: this.mainSeries().interval()
}), h && void 0 === o && Object(ce.drawOnAllCharts)().value() && d
.isSynchronizable()) {
const e = Object(s.ensureNotNull)(this.model().externalTimeStamp(t.index)),
r = {
point: {
price: t.price,
timeStamp: e
},
linetool: i,
properties: d.properties(),
symbol: this.mainSeries().symbol(),
model: this.model(),
linkKey: Object(s.ensureNotNull)(d.linkKey().value()),
finalState: p
};
d.isFixed() && (r.pointPositionPercents = d.calcPositionPercents()[0]),
Object(ce.createLineTool)(r)
}
return this.endUndoMacro(), d
}
continueCreatingLine(e, t, i, r) {
const n = Object(s.ensureNotNull)(this._createLineCommand);
this.beginUndoMacro(n.text());
const o = Object(s.ensureNotNull)(this._model().lineBeingCreated()),
a = n.continueCreatingLine(e, t, i, r);
let l = null;
if (a && (this.finishLineTool(o), this._pushUndoCommand(n), this
._createLineCommand = null, l = {
points: o.normalizedPoints(),
interval: this.mainSeries().interval()
}), n.needCopyToOtherCharts() && Object(ce.drawOnAllCharts)().value() &&
o.isSynchronizable()) {
const i = Object(s.ensureNotNull)(this._model().externalTimeStamp(e.index));
Object(ce.continueLineTool)({
point: {
price: e.price,
timeStamp: i
},
envState: t,
finalState: l,
model: this._model()
})
}
return this.endUndoMacro(), a
}
continueExternalLine(e, t, i) {
const r = Object(s.ensureNotNull)(this._createLineCommand),
n = r.continueCreatingLine(e, t, i);
return n && (this._pushUndoCommand(r), this._createLineCommand = null), n
}
finishLineTool(e) {
this._model().finishLineTool(e)
}
pasteImageAsLineTool(e, t, i) {
return null
}
loadRange(e) {
this._pushUndoCommand(new Q(this._model(), e))
}
unlinkLines(e) {
const t = this.model();
this.beginUndoMacro("Stop syncing line tool(s)");
for (const i of e) null !== i.linkKey().value() && Object(ce.removeLineTool)({
withUndo: !0,
model: this.model(),
symbol: i.symbol(),
linkKey: Object(s.ensureNotNull)(i.linkKey().value()),
sourceTitle: i.title(),
lineToolState: i.state(!1)
}), this._pushUndoCommand(new Ze(t, i));
this.endUndoMacro()
}
zoomFromViewport() {
const e = new Je(Object(s.ensureDefined)(this._zoomStack.head()), this
._zoomStack, !1);
this._pushUndoCommand(e)
}
zoomToViewport(e, t, i, s, r) {
const n = new Ye(this.m_model, e, t, i, s, r),
o = new Je(n, this._zoomStack, !0);
this._pushUndoCommand(o)
}
zoomStack() {
return this._zoomStack
}
withMacro(e, t) {
const i = this.beginUndoMacro(e);
try {
t()
} finally {
this.endUndoMacro()
}
return i
}
canZoomIn() {
return this.model().canZoomIn()
}
canZoomOut() {
return this.model().canZoomOut()
}
zoomOut() {
const e = this.timeScale().width();
if (this.canZoomOut()) {
try {
this.beginUndoMacro("Zoom Out")
} catch (e) {
return
}
Object(ee.doAnimate)({
to: e / 5,
onStep: e => {
this.startScaleTime(0), this.scaleTimeTo(e), this
.endScaleTime()
},
onComplete: () => this.endUndoMacro()
})
}
}
zoomIn() {
const e = this.timeScale().width();
if (this.canZoomIn()) {
try {
this.beginUndoMacro("Zoom In")
} catch (e) {
return
}
Object(ee.doAnimate)({
to: e / 5,
onStep: e => {
this.startScaleTime(e), this.scaleTimeTo(0), this
.endScaleTime()
},
onComplete: () => this.endUndoMacro()
})
}
}
startMovingSources(e, t, i, s) {
e.filter(e => e.doesMovingAffectsUndo()).length && (this
._currentSourceMoveCommand = new w(this.model(), e, "Move Drawing(s)", !
1)), this.model().startMovingSources(e, t, i, new Map, s)
}
moveSources(e, t) {
this.model().moveSources(e, new Map, t)
}
endMovingSource(e) {
this.model().endMovingSources(e), null !== this._currentSourceMoveCommand && (
this._currentSourceMoveCommand.saveNewState(), this._pushUndoCommand(
this._currentSourceMoveCommand)), this._currentSourceMoveCommand =
null
}
startChangingLinetool(e, t, i, s, r) {
this._currentLineChangeCommand = new w(this.model(), [e], "Change " + i +
" point", !1), this.model().startChangingLinetool(e, t, i, s, r)
}
changeLinePoint(e, t) {
this.model().changeLinePoint(e, t)
}
endChangingLinetool(e) {
this.model().endChangingLinetool(e), null !== this._currentLineChangeCommand &&
(this._currentLineChangeCommand.saveNewState(), this._pushUndoCommand(this
._currentLineChangeCommand)), this._currentLineChangeCommand = null
}
setChartStyleProperty(e, t, i) {
if (e.value() !== t) {
const s = new Z(e, t, this.mainSeries(), i, this.model(), this
.chartWidget());
this._pushUndoCommand(s), this.emitEvent("setChartStyleProperty"), Object(G
.a)(e.value())
}
}
restorePropertiesForSource(e) {
Object(g.isLineTool)(e) ? this._restoreLineToolFactoryDefaults(e) : this
._restoreStudyFactoryDefaults(e)
}
restoreState(e, t, i) {
return this.m_model.restoreState(e, t, i)
}
async clipboardCopy(e, t = this.selection().dataSources()) {
if (!Object(qe.enabled)("datasource_copypaste")) return;
const i = t.filter(e => e.copiable());
if (0 === i.length) return;
for (const e of i)
if (Object(ve.isStudy)(e) && e.isChildStudy()) throw new Error(
"Can not copy child study");
const s = Object(M.a)(this._model().id(), i);
return null !== s ? e.write({
app: JSON.stringify(s),
text: s.title
}) : void 0
}
async clipboardCut(e, t = this.selection().dataSources()) {
if (!Object(qe.enabled)("datasource_copypaste")) return;
const i = t.filter(e => e.copiable());
if (0 === i.length) return;
await this.clipboardCopy(e, i);
const s = i.filter(e => e.isUserDeletable());
if (0 === s.length) return;
const r = 1 === s.length ? "Cut " + s[0].title : "Cut sources";
this.beginUndoMacro(r), this.m_model.selectionMacro(() => {
this.removeSources(s, !1, r)
}), this.endUndoMacro()
}
async clipboardPaste(e, t) {
let i = null;
if (Object(qe.enabled)("datasource_copypaste") && (i = i || await e.read(), i
.app)) {
const e = JSON.parse(i.app);
if (null !== this.pasteSourceFromClip(t, e)) return
}
await this._processSpecialLineToolsContents(e, i, t)
}
applyStudyTemplate(e, t) {
const i = new Ce(this._model(), e, t);
this._pushUndoCommand(i)
}
startCustomMoving(e, t, i) {
this._currentCustomMoveCommand = new je(this.model(), e, t, i)
}
customMoveBeingProcessed() {
return null !== this._currentCustomMoveCommand
}
processCustomMove(e) {
Object(s.ensureNotNull)(this._currentCustomMoveCommand).move(e)
}
endCustomMoving() {
null !== this._currentCustomMoveCommand && this._currentCustomMoveCommand
.hasChanges() && (this._pushUndoCommand(this._currentCustomMoveCommand),
this._currentCustomMoveCommand = null)
}
cloneLineTools(e, t) {
for (let t = 0; t < Math.min(5, e.length); ++t) Object(G.b)(e[t]);
this.beginUndoMacro(window.t("Clone line tools"));
const i = new b(this._model(), e, t, window.t("Clone line tools"));
if (this._pushUndoCommand(i), Object(ce.drawOnAllCharts)().value()) {
const e = i.newIds().map(e => Object(s.ensureNotNull)(this.model()
.dataSourceForId(e)));
this.copyToOtherCharts(e)
}
return this.endUndoMacro(), this.emitEvent("cloneLineTools"), i.newIds()
}
removeSource(e, t, i) {
if (this.lineBeingCreated() === e) return void this.cancelCreatingLine();
const s = "Remove " + e.title();
this.removeSources([e], t, s, i)
}
removeSelectedSources() {
const e = this._model().selection().dataSources();
if (!e.length) return;
const t = e.length > 1 ? "Remove drawings group" : "Remove " + e[0].title();
this.removeSources(e, !1, t)
}
removeSources(e, t, i, r) {
r || (e = e.filter(e => e.isUserDeletable()));
const n = this._model(),
o = n.lineToolsGroupModel();
this.beginUndoMacro(i), n.selectionMacro(r => {
const a = new Map;
e.forEach(e => {
if (Object(g.isLineTool)(e)) {
const t = o.groupForLineTool(e);
if (null !== t) {
const i = a.get(t) || [];
i.push(e), a.set(t, i)
}
null !== e.linkKey().value() && Object(ce
.removeLineTool)({
withUndo: !0,
model: this.model(),
linkKey: Object(s.ensureNotNull)(e
.linkKey().value()),
symbol: this.model().mainSeries()
.symbol(),
lineToolState: e.state(!1),
sourceTitle: e.title()
})
}
}), a.forEach((e, t) => {
const i = new S.a(n, t, e);
this._pushUndoCommand(i)
});
const l = new v.RemoveSourcesCommand(n, e, i),
c = l.removedIds();
this._pushUndoCommand(l), !t && c.length > 0 && (1 === c.length ?
this.emitEvent("removeSource", [c[0]]) : this.emitEvent(
"removeSources", [c]))
}), this.endUndoMacro()
}
removeUnloadedLineTool(e, t, i, s, r, n) {}
mergeSourceUp(e) {
const t = new C.c(this._model(), e, "Merge up");
this._mergeUnmergeSource(e, t)
}
mergeSourceDown(e) {
const t = new C.a(this._model(), e, "Merge down");
this._mergeUnmergeSource(e, t)
}
mergeToPane(e, t) {
const i = this._model().panes().indexOf(t),
s = new C.b(this._model(), e, i, "Merge to pane");
this._mergeUnmergeSource(e, s)
}
unmergeSourceUp(e) {
const t = new P.c(this._model(), e, "Unmerge up");
this._mergeUnmergeSource(e, t)
}
unmergeSourceDown(e) {
const t = new P.a(this._model(), e, "Unmerge down");
this._mergeUnmergeSource(e, t)
}
unmergeToNewBottomPane(e) {
const t = new P.b(this._model(), e, "Unmerge to new bottom pane");
this._mergeUnmergeSource(e, t)
}
availableZOrderOperations(e) {
const t = this._model().lineToolsGroupModel(),
i = e.filter(g.isLineTool),
r = i.map(e => t.groupForLineTool(e));
Object(s.assert)(new Set(r).size <= 1,
"Cannot move line tools from different group");
const n = 0 === r.length ? null : r[0];
let o = {
bringForwardEnabled: !1,
bringToFrontEnabled: !1,
sendBackwardEnabled: !1,
sendToBackEnabled: !1
};
const a = new Set(i);
for (const t of Object(x.sortSources)(e)) {
if (Object(g.isLineTool)(t) && null !== n) {
const e = Object(x.sortSources)(n.lineTools().filter(e => !a.has(e) ||
e === t));
o = nt(o, {
bringForwardEnabled: t !== e[e.length - 1],
bringToFrontEnabled: t !== e[e.length - 1],
sendBackwardEnabled: t !== e[0],
sendToBackEnabled: t !== e[0]
});
continue
}
const e = Object(s.ensureNotNull)(this._model().paneForSource(t))
.sourcesByGroup().allExceptSpecialSources();
if (0 === e.length) continue;
const i = t.zorder(),
r = e[0].zorder(),
l = e[e.length - 1].zorder();
o = nt(o, {
bringForwardEnabled: i !== l,
bringToFrontEnabled: i !== l,
sendBackwardEnabled: i !== r,
sendToBackEnabled: i !== r
})
}
return o
}
sendToBack(e) {
if (!this.availableZOrderOperations(e).sendToBackEnabled) throw new Error(
"Send to back operation is unavailable");
let t = null;
const i = e[0];
if (Object(g.isLineTool)(i)) {
const s = this._model().lineToolsGroupModel().groupForLineTool(i);
if (null !== s) {
const i = s.lineTools();
t = new V(this.model(), Object(x.sortSources)(e), i[0])
}
}
null === t && (t = new A(this.model(), Object(x.sortSources)(e))), this
._pushUndoCommand(t), this.emitEvent("changeZOrder", [e])
}
bringToFront(e) {
if (!this.availableZOrderOperations(e).bringToFrontEnabled) throw new Error(
"Bring to front operation is unavailable");
let t = null;
const i = e[0];
if (Object(g.isLineTool)(i)) {
const s = this._model().lineToolsGroupModel().groupForLineTool(i);
if (null !== s) {
const i = s.lineTools();
t = new k(this.model(), Object(x.sortSources)(e), i[i.length - 1])
}
}
null === t && (t = new L(this.model(), Object(x.sortSources)(e))), this
._pushUndoCommand(t), this.emitEvent("changeZOrder", [e])
}
sendBackward(e) {
if (!this.availableZOrderOperations(e).sendBackwardEnabled) throw new Error(
"Send backward operation is unavailable");
const t = tt.format({
title: e[0].title()
});
this._sendBackOrBringForward(t, Object(x.sortSources)(e), (e, t) => new R(this
.model(), e, t))
}
bringForward(e) {
if (!this.availableZOrderOperations(e).bringForwardEnabled) throw new Error(
"Bring forward operation is unavailable");
const t = it.format({
title: e[0].title()
});
this._sendBackOrBringForward(t, Object(x.sortSources)(e), (e, t) => new j(this
.model(), e, t))
}
insertAfter(e, t) {
e = Object(x.sortSources)(e);
const i = st.format({
title: e[0].title(),
target: t.title()
});
this._insertAfterOrBefore(i, e, t, () => new k(this.model(), e, t))
}
insertBefore(e, t) {
e = Object(x.sortSources)(e);
const i = rt.format({
title: e[0].title(),
target: t.title()
});
this._insertAfterOrBefore(i, e, t, () => new V(this.model(), e, t))
}
detachToRight(e, t) {
Object(ke.trackEvent)("Chart", "Move to new right scale");
const i = window.t("Move {title} To New Price Scale").format({
title: e.title()
}),
s = new Ae.b(this.model(), e, t, "right", i);
this._pushUndoCommand(s), this.emitEvent("moveSource", [e])
}
detachToLeft(e, t) {
Object(ke.trackEvent)("Chart", "Move to new left scale");
const i = window.t("Move {title} To New Left Scale").format({
title: e.title()
}),
s = new Ae.b(this.model(), e, t, "left", i);
this._pushUndoCommand(s), this.emitEvent("moveSource", [e])
}
detachNoScale(e, t) {
Object(ke.trackEvent)("Chart", "Make source no scale");
const i = window.t("Make {title} No Scale (Full Screen)").format({
title: e.title()
}),
s = new Ae.b(this.model(), e, t, "overlay", i);
this._pushUndoCommand(s), this.emitEvent("moveSource", [e])
}
moveToScale(e, t, i, s, r) {
Object(ke.trackEvent)("Chart", "Move source to target scale"), this
.beginUndoMacro(s);
const n = new Ae.a(this.model(), e, t, i, s),
o = r ? null : Object(De.sourceNewCurrencyOnPinningToPriceScale)(e, i, this
._model()),
a = r ? null : Object(ze.sourceNewUnitOnPinningToPriceScale)(e, i, this
._model());
this._pushUndoCommand(n), null !== o && this.setPriceScaleCurrency(i, o),
null !== a && this.setPriceScaleUnit(i, a), this.endUndoMacro(), this
.emitEvent("moveSource", [e])
}
startScrollTime(e) {
const t = this.timeScale();
this._initialTimeScrollState = {
rightOffset: t.rightOffset(),
barSpacing: t.barSpacing()
}, this._initialTimeScrollPos = e, this.model().startScrollTime(e)
}
scrollTimeTo(e) {
let t = !1;
return null !== this._initialTimeScrollPos && null !== this
._initialTimeScrollState && Math.abs(e - this._initialTimeScrollPos) > 20 &&
(this._pushUndoCommand(new z.a(this.model(), this._initialTimeScrollState,
"Scroll Time")), this._initialTimeScrollPos = null, this
._initialTimeScrollState = null, t = !0), this.model().scrollTimeTo(e),
t
}
endScrollTime() {
this.model().endScrollTime(), this._initialTimeScrollPos = null, this
._initialTimeScrollState = null
}
startScaleTime(e) {
const t = this.timeScale(),
i = {
rightOffset: t.rightOffset(),
barSpacing: t.barSpacing()
};
this._pushUndoCommand(new z.a(this.model(), i, "Scale Time")), this.model()
.startScaleTime(e)
}
scaleTimeTo(e) {
this.model().scaleTimeTo(e)
}
endScaleTime() {
this.model().endScaleTime()
}
resetTimeScale() {
const e = this.timeScale(),
t = {
rightOffset: e.rightOffset(),
barSpacing: e.barSpacing()
};
this._pushUndoCommand(new z.a(this.model(), t, "Reset Time Scale")), this
.model().resetTimeScale()
}
startScalePrice(e, t, i, s) {
this._pushUndoCommand(new Ge.PriceScaleChangeUndoCommand(this.model(), e, t, t
.state(), s)), this.model().startScalePrice(e, t, i)
}
scalePriceTo(e, t, i) {
this.model().scalePriceTo(e, t, i)
}
endScalePrice(e, t) {
this.model().endScalePrice(e, t)
}
resetPriceScale(e, t) {
this._pushUndoCommand(new Ge.PriceScaleChangeUndoCommand(this.m_model, e, t, t
.state())), this.model().resetPriceScale(e, t)
}
rearrangePanes(e, t) {
const i = new U(this._model(), e, t);
this._pushUndoCommand(i)
}
movePane(e, t) {
const i = new U(this._model(), e, t);
this._pushUndoCommand(i)
}
pasteSourceFromClip(e, t, i) {
const r = t;
if (!r || 0 === r.sources.length) return null;
const n = e || Object(s.ensureNotNull)(this.model().paneForSource(this
.mainSeries()));
if (!r.sources.some(e => "drawing" !== e.type || null !== n
.clipboardLineToolOwnerSource(e.source.id))) return null;
this.beginUndoMacro("Paste " + r.title);
let o = 0;
const a = [],
l = [];
for (const t of r.sources)
if ("drawing" === t.type && null !== n.clipboardLineToolOwnerSource(t.source
.id)) {
Object(et.b)(t.source.state.intervalsVisibilities, $.Interval.parse(this
.model().mainSeries().interval()));
const e = this.pasteLineTool(n, t);
o < 5 && (Object(G.d)(e), o += 1), l.push(e), a.push(e)
} else "study" === t.type && t.source && t.source.metaInfo && this
.checkIfFeatureAvailable(new c.a(t.source.metaInfo)) && a.push(this
.pasteStudy(t, i ? e : void 0));
return l.length && this.selectionMacro(e => {
e.clearSelection(), l.forEach(t => {
e.addSourceToSelection(t, null)
})
}), this.endUndoMacro(), a
}
pasteLineTool(e, t, i, s) {
const r = new Me(this.model(), t, e, i, s);
this._pushUndoCommand(r);
const n = r.source();
return r.needCopyToOtherCharts() && this.copyToOtherCharts([n]),
this.selectionMacro(e => {
e.clearSelection(), e.addSourceToSelection(n, null)
}), n
}
pasteStudy(e, t) {
const i = new Be(this.model(), e, null == t ? void 0 : t.id());
this._pushUndoCommand(i);
const r = Object(s.ensureNotNull)(i.state()).id;
return Object(s.ensureNotNull)(this._model().dataSourceForId(r))
}
setPriceScaleCurrency(e, t) {
const i = new Oe.a(e, t, this.chartWidget(), "Change currency");
this._pushUndoCommand(i)
}
setPriceScaleUnit(e, t) {
const i = new Le.a(e, t, this.chartWidget(), "Change unit");
this._pushUndoCommand(i)
}
setSymbol(e, t) {
e.symbol() !== t && this._pushUndoCommand(new Ee(e, t, this.chartWidget()))
}
copyToOtherCharts(e) {
const t = this.mainSeries(),
i = t.syncModel(),
r = this.timeScale();
if (i)
for (const n of e) {
if (!n.isSynchronizable()) continue;
const e = n.linkKey().value() || Object(xe.randomHash)();
n.linkKey().setValue(e);
const o = n.state(!1),
a = n.normalizedPoints(),
l = n.properties().interval.value(),
c = t.interval();
let h;
if ($.Interval.isEqual(l, c)) h = a.map(e => {
const t = Object(s.ensureNotNull)(r.timePointToIndex(e
.time_t)) + e.offset;
return {
price: e.price,
timeStamp: Object(s.ensureNotNull)(this.model()
.externalTimeStamp(t))
}
});
else {
const e = i.createNewModelWithResolution(l);
h = a.map(t => ({
price: t.price,
timeStamp: 0 === t.offset ? t.time_t : e
.projectTime(t.time_t, t.offset)
}))
}
const u = {
...o,
linkKey: e,
points: h,
linetool: n.getType(),
model: this.model(),
symbol: t.symbol(),
finalState: {
points: a,
interval: l
}
};
n.isFixed() && (u.pointPositionPercents = n.calcPositionPercents()),
Object(ce.copyLineTool)(u)
}
}
addPaneStretchFactorUndoCommand(e, t, i, s) {
const r = new Re(this.model(), e, t, i, s);
this._pushUndoCommand(r)
}
moveSelectedToolsLeft() {
return this._moveSelectedTools(2)
}
moveSelectedToolsUp() {
return this._moveSelectedTools(0)
}
moveSelectedToolsRight() {
return this._moveSelectedTools(3)
}
moveSelectedToolsDown() {
return this._moveSelectedTools(1)
}
insertStudyWithoutCheck(e, t) {
return this._insertStudy(e, t, {}, !1, void 0, void 0, void 0, void 0, void 0,
null, void 0)
}
saveLineToolState(e, t) {
this._pushUndoCommand(new w(this.m_model, [e], t))
}
resetScales() {
this.beginUndoMacro("Reset scales"), this.resetTimeScale();
for (const e of this.m_model.panes()) {
for (const t of e.leftPriceScales()) this.resetPriceScale(e, t);
for (const t of e.rightPriceScales()) this.resetPriceScale(e, t)
}
this.endUndoMacro(), this.m_model.recalculateAllPanes()
}
_mergeUnmergeSource(e, t) {
this.beginUndoMacro(t.text());
const i = Object(s.ensureNotNull)(this._model().paneForSource(e)),
r = new Set(i.sourcesByGroup().lineSources().filter(t => t.ownerSource() ===
e));
this._model().lineToolsGroupModel().groups().filter(e => {
const t = e.lineTools().some(e => r.has(e)),
i = e.lineTools().some(e => !r.has(e));
return t && i
}).forEach(e => {
this._pushUndoCommand(new S.a(this._model(), e, e.lineTools()))
}), this._pushUndoCommand(t), this.endUndoMacro()
}
_insertStudy(e, t, i, r, n, o, a, l, c, h, u) {
const d = "Insert " + e.description;
this.beginUndoMacro(d);
const p = new Fe(this.model(), e, t, i, r, n, o, a, l, c, h || null, d);
this._pushUndoCommand(p);
const _ = p.insertedStudy();
if (void 0 !== u) {
const e = new We.SetPriceScaleModeCommand(u, Object(s.ensureNotNull)(_
.priceScale()), "", this.model());
this._pushUndoCommand(e)
}
return this.endUndoMacro(), _
}
async _processSpecialLineToolsContents(e, t, i) {
0
}
_insertAfterOrBefore(e, t, i, r) {
const n = Object(s.ensureNotNull)(this._model().paneForSource(i));
if (t.some(e => Object(g.isLineTool)(e) && this._model().paneForSource(e) !==
n)) throw new Error(
"Cannot insert line tool after target on another pane");
this.beginUndoMacro(e), t.forEach(e => {
Object(s.ensureNotNull)(this.model().paneForSource(e)) !== n && this
.mergeToPane(e, n)
});
const o = r();
this._pushUndoCommand(o), this.emitEvent("changeZOrder", [t]), this
.endUndoMacro()
}
_sendBackOrBringForward(e, t, i) {
const r = new Map;
t.forEach(e => {
const t = Object(s.ensureNotNull)(this._model().paneForSource(e)),
i = r.get(t) || [];
i.push(e), r.set(t, i)
}), this.beginUndoMacro(e), r.forEach((e, t) => {
this._pushUndoCommand(i(t, e))
}), this.endUndoMacro(), this.emitEvent("changeZOrder", [t])
}
_moveSelectedTools(e) {
const t = this.model().selection().lineDataSources();
if (0 === t.length) return !1;
if (Object(ce.lockDrawings)().value()) return !0;
const i = this.timeScale().visibleBarsStrictRange();
if (null === i) return !1;
const s = function(e) {
const t = new Map;
for (const i of e) {
const e = i.ownerSource();
if (null === e) continue;
let s = t.get(e);
if (void 0 === s) {
const i = e.priceScale(),
r = e.priceStep(),
n = e.firstValue();
if (null === i || null === r || null === n) continue;
const o = i.priceRange();
if (null === o) continue;
s = {
sources: [],
priceScale: i,
priceStep: r,
startPrice: o.minValue(),
firstValue: n
}, t.set(e, s)
}
s.sources.push(i)
}
return t
}(t);
if (0 === s.size) return !1;
this.beginUndoMacro(window.t("Move Drawing(s)"));
const n = i.firstBar(),
o = this.timeScale().indexToCoordinate(n),
a = n + (3 === e ? 1 : 2 === e ? -1 : 0),
l = this.timeScale().indexToCoordinate(a);
return ce.isDirectionalMovementActive.setValue(!0), s.forEach(t => {
const {
startPrice: i,
priceStep: s,
priceScale: c,
firstValue: h
} = t, u = i + (0 === e ? s : 1 === e ? -s : 0), d = c
.priceToCoordinate(i, h), p = c.priceToCoordinate(u, h), _ = {
logical: {
index: n,
price: i
},
screen: new r.Point(o, d)
}, m = {
logical: {
index: a,
price: u
},
screen: new r.Point(l, p)
};
this.startMovingSources(t.sources, _, null), this.moveSources(m),
this.endMovingSource(!1)
}), ce.isDirectionalMovementActive.setValue(!1), this.endUndoMacro(), !0
}
_restoreStudyFactoryDefaults(e) {
const t = new Qe(this.m_model, e.properties());
this._pushUndoCommand(t)
}
_restoreLineToolFactoryDefaults(e) {
const t = "Load default drawing template";
this.beginUndoMacro(t), this.saveLineToolState(e, t);
const i = new Qe(this.m_model, e.properties(), t);
this._pushUndoCommand(i), this.saveLineToolState(e, t), this.endUndoMacro(),
this.model().updateSource(e)
}
}
},
opke: function(e, t) {
e.exports =
''
},
p1SQ: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolHorzLinePriceAxisView", (function() {
return r
}));
var s = i("KcY8");
class r extends s.a {
constructor(e) {
super(), this._source = e
}
_updateRendererData(e, t, i) {
e.visible = !1;
const s = this._source.points(),
r = this._source.priceScale();
if (0 === s.length || null === r || r.isEmpty()) return;
const n = s[0];
if (!isFinite(n.price)) return;
const o = this._source.ownerSource(),
a = null !== o ? o.firstValue() : null;
if (null === a) return;
const l = this._source.properties().linecolor.value();
i.background = l, i.textColor = this.generateTextColor(l), i.coordinate = r
.priceToCoordinate(n.price, a), e.text = r.formatPrice(n.price, a), e
.visible = !0
}
}
},
pJOz: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "drawCircle", (function() {
return h
})), i.d(t, "drawArrow", (function() {
return u
})), i.d(t, "TrendLineRenderer", (function() {
return d
}));
var s = i("Eyy1"),
r = i("GEp6"),
n = i("a7Ha"),
o = i("VdBB"),
a = i("jFln"),
l = i("Zp/P"),
c = i("gAom");
function h(e, t, i, s, r) {
t.save(), t.fillStyle = "#000000", t.beginPath(), t.arc(e.x * r, e.y * r, i * r, 0, 2 * Math
.PI, !1), t.fill(), s.strokeWidth && (t.lineWidth = s.strokeWidth, t.stroke()), t
.restore()
}
function u(e, t, i, s, r) {
if (t.subtract(e).length() < 1) return;
const n = Object(l.getArrowPoints)(e, t, s, !1);
for (let e = 0; e < n.length; ++e) {
const t = n[e][0],
s = n[e][1];
Object(a.drawLine)(i, t.x * r, t.y * r, s.x * r, s.y * r)
}
}
class d {
constructor() {
this._data = null, this._hittest = new o.HitTestResult(o.HitTestResult.MOVEPOINT)
}
setData(e) {
this._data = e
}
setHitTest(e) {
this._hittest = e
}
draw(e, t) {
const i = this._data;
if (null === i) return;
if ("points" in i && i.points.length < 2) return;
if ("floatPoints" in i && i.floatPoints.length < 2) return;
const s = t.pixelRatio;
e.lineCap = "butt", e.strokeStyle = i.color, e.lineWidth = Math.max(1, Math.floor(i
.linewidth * s)), Object(a.setLineStyle)(e, i.linestyle);
const r = "floatPoints" in i ? i.floatPoints : i.points,
n = r[0],
o = r[1];
let l = [];
i.overlayLineEndings ? l = [n.clone(), o.clone()] : this._drawEnds(e, [n, o], i
.linewidth, s);
const h = this._extendAndClipLineSegment(n, o, t);
null !== h && i.linewidth > 0 && (h[0].x === h[1].x ? Object(c.drawVerticalLine)(e,
Math.round(h[0].x * s), h[0].y * s, h[1].y * s) : h[0].y === h[1].y ?
Object(c.drawHorizontalLine)(e, Math.round(h[0].y * s), h[0].x * s, h[1].x *
s) : Object(a.drawLine)(e, h[0].x * s, h[0].y * s, h[1].x * s, h[1].y *
s)), i.overlayLineEndings && this._drawEnds(e, l, i.linewidth, s)
}
hitTest(e, t) {
const i = this._data;
if (null === i) return null;
if ("points" in i && i.points.length < 2) return null;
if ("floatPoints" in i && i.floatPoints.length < 2) return null;
const s = Object(l.interactionTolerance)().line,
n = "floatPoints" in i ? i.floatPoints : i.points,
o = n[0],
a = n[1],
c = this._extendAndClipLineSegment(o, a, t);
if (null !== c) {
if (Object(r.distanceToSegment)(c[0], c[1], e).distance <= s) return this
._hittest
}
return null
}
_extendAndClipLineSegment(e, t, i) {
const r = Object(s.ensureNotNull)(this._data);
return Object(l.extendAndClipLineSegment)(e, t, i.cssWidth, i.cssHeight, r
.extendleft, r.extendright)
}
_drawEnds(e, t, i, r) {
const o = t[0],
a = t[1],
l = Object(s.ensureNotNull)(this._data);
switch (l.leftend) {
case n.LineEnd.Arrow:
u(a, o, e, i, r);
break;
case n.LineEnd.Circle:
h(o, e, i, Object(s.ensureDefined)(l.endstyle), r)
}
switch (l.rightend) {
case n.LineEnd.Arrow:
u(o, a, e, i, r);
break;
case n.LineEnd.Circle:
h(a, e, i, Object(s.ensureDefined)(l.endstyle), r)
}
}
}
},
pKDv: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolABCD", (function() {
return a
}));
var s = i("Eyy1"),
r = i("Ocx9"),
n = i("Ss5c"),
o = i("j3hX");
class a extends n.LineDataSource {
constructor(e, t) {
const s = t || a.createProperties();
super(e, s), i.e("lt-pane-views").then(i.bind(null, "bFMU")).then(t => {
this._setPaneViews([new t.ABCDPaneView(this, e)])
})
}
pointsCount() {
return 4
}
name() {
return "ABCD Pattern"
}
properties() {
return super.properties()
}
static createProperties(e) {
const t = new r.DefaultProperty("linetoolabcd", e);
return a._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "aMeN")).then(
e => e.PatternWithoutBackgroundDefinitionsViewModel)
}
static _configureProperties(e) {
n.LineDataSource._configureProperties(e), e.addChild("linesColors", new o
.LineToolColorsProperty([Object(s.ensureDefined)(e.child("color"))])), e
.addChild("textsColors", new o.LineToolColorsProperty([Object(s
.ensureDefined)(e.child("textcolor"))]))
}
}
},
pOzK: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SetPriceScaleModeCommand", (function() {
return n
}));
var s = i("Ocx9"),
r = i("RDU5");
class n extends r.UndoCommand {
constructor(e, t, i, s) {
super(i), this._newMode = e, this._priceScaleId = t.id(), this._model = s, this
._oldMode = t.mode()
}
redo() {
this._applyMode(this._newMode)
}
undo() {
this._applyMode(this._oldMode)
}
_applyMode(e) {
const t = this._findPriceScaleById();
null !== t && (Object(s.saveDefaultProperties)(!0), t.setMode(e), Object(s
.saveDefaultProperties)(!1), this._model && (this._model
.recalculateAllPanes(), this._model.lightUpdate()))
}
_findPriceScaleById() {
const e = this._model.panes();
for (let t = 0; t < e.length; t++) {
const i = e[t].getPriceScaleById(this._priceScaleId);
if (null !== i) return i
}
return null
}
}
},
pPtI: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "normalizeIntervalString", (function() {
return _
})), i.d(t, "isAvailable", (function() {
return m
})), i.d(t, "setLastUsedResolution", (function() {
return f
})), i.d(t, "getRangeResolution", (function() {
return g
})), i.d(t, "getTimeBasedResolution", (function() {
return b
})), i.d(t, "getDefaultResolution", (function() {
return v
})), i.d(t, "getResolutionByChartStyle", (function() {
return S
})), i.d(t, "getServerInterval", (function() {
return y
})), i.d(t, "isResolutionMultiplierValid", (function() {
return w
})), i.d(t, "getMaxResolutionValue", (function() {
return C
})), i.d(t, "getResolutionsFromSettings", (function() {
return x
})), i.d(t, "convertResolutionsFromSettings", (function() {
return T
})), i.d(t, "mergeResolutions", (function() {
return I
})), i.d(t, "sortResolutions", (function() {
return M
})), i.d(t, "getCustomResolutions", (function() {
return A
})), i.d(t, "getTranslatedResolution", (function() {
return E
})), i.d(t, "getTranslatedResolutionModel", (function() {
return k
})), i.d(t, "isSecondsEnabled", (function() {
return V
})), i.d(t, "isTicksEnabled", (function() {
return B
}));
i("bSeV"), i("YFKU");
var s = i("LxhU"),
r = i("n5al"),
n = i("Vdly"),
o = i("PT1i"),
a = i("L6rT"),
l = i("ogJP"),
c = i("Kxc7"),
h = i.n(c);
const u = {
[s.ResolutionKind.Ticks]: 1,
[s.ResolutionKind.Seconds]: 60,
[s.ResolutionKind.Minutes]: 1440,
[s.SpecialResolutionKind.Hours]: 24,
[s.ResolutionKind.Days]: 365,
[s.ResolutionKind.Weeks]: 52,
[s.ResolutionKind.Months]: 12,
[s.ResolutionKind.Range]: 1e6,
[s.ResolutionKind.Invalid]: NaN
},
d = {
[s.ResolutionKind.Ticks]: 0,
[s.ResolutionKind.Seconds]: 1,
[s.ResolutionKind.Minutes]: 2,
[s.SpecialResolutionKind.Hours]: 3,
[s.ResolutionKind.Days]: 4,
[s.ResolutionKind.Weeks]: 5,
[s.ResolutionKind.Months]: 6,
[s.ResolutionKind.Range]: 7,
[s.ResolutionKind.Invalid]: 8
},
p = {
[s.ResolutionKind.Invalid]: "",
[s.ResolutionKind.Ticks]: window.t("T", {
context: "interval_short"
}),
[s.ResolutionKind.Seconds]: window.t("s", {
context: "interval_short"
}),
[s.ResolutionKind.Minutes]: window.t("m", {
context: "interval_short"
}),
[s.SpecialResolutionKind.Hours]: window.t("h", {
context: "interval_short"
}),
[s.ResolutionKind.Days]: window.t("D", {
context: "interval_short"
}),
[s.ResolutionKind.Weeks]: window.t("W", {
context: "interval_short"
}),
[s.ResolutionKind.Months]: window.t("M", {
context: "interval_short"
}),
[s.ResolutionKind.Range]: window.t("R", {
context: "interval_short"
})
};
function _(e) {
return s.Interval.parse(e).value()
}
function m(e) {
const t = s.Interval.parse(e);
if (!V() && t.isSeconds()) return !1;
if (!B() && t.isTicks()) return !1;
const i = t.value(),
r = o.linking.supportedResolutions.value();
return void 0 !== r ? void 0 !== r.find(e => _(e) === i) : t.isSeconds() ? Boolean(o.linking
.seconds.value()) : t.isTicks() ? Boolean(o.linking.ticks.value()) : t
.isIntraday() ? Boolean(o.linking.intraday.value()) : t.isDWM()
}
function f(e) {
s.Interval.isValid(e) && (s.Interval.isRange(e) ? n.setValue(
"chart.lastUsedRangeResolution", e) : n.setValue(
"chart.lastUsedTimeBasedResolution", e))
}
function g(e) {
const t = n.getValue("chart.lastUsedRangeResolution");
if (void 0 !== t && s.Interval.isRange(t)) return t;
let i = "100R";
for (const t of e) {
const e = s.Interval.parse(t);
if (e.isRange()) {
const t = e.value();
if ("100R" === t) return t;
i = t
}
}
return i
}
function b(e) {
const t = n.getValue("chart.lastUsedTimeBasedResolution");
if (void 0 !== t && s.Interval.isTimeBased(t)) return t;
let i = "1D";
for (const t of e) {
const e = s.Interval.parse(t);
if (e.isTimeBased()) {
const t = e.value();
if ("1D" === t) return t;
i = t
}
}
return i
}
function v(e) {
return e ? "100R" : "1D"
}
function S(e, t, i) {
const n = r.isRangeStyle(e),
o = s.Interval.isRange(t);
return !n && o ? b(i) : n && !o ? g(i) : t
}
function y(e) {
return s.Interval.isRange(e) ? "1" : e
}
function w(e) {
const t = s.Interval.parse(e),
i = P(t.kind()),
r = t.multiplier();
return t.isValid() && r <= i
}
function P(e) {
const t = u[e];
return Number.isNaN(t) ? 1 : t
}
function C(e) {
return P(s.Interval.kind(e))
}
function x(e) {
const t = T(n.getJSON(e, []));
return Object(a.uniq)(t.filter(w).map(_))
}
function T(e) {
return Array.isArray(e) ? e : Object.keys(e).map(s.Interval.normalize).filter(l.notNull)
}
function I(...e) {
let t = [].concat(...e);
return t = Object(a.uniq)(t.filter(w).map(_)), M(t)
}
function M(e) {
return e.sort(L)
}
function O(e) {
const t = s.Interval.parse(e),
i = t.multiplier() || 1;
return t.isMinuteHours() ? [s.SpecialResolutionKind.Hours, i / 60] : [t.kind(), i]
}
function L(e, t) {
const [i, s] = O(e), [r, n] = O(t);
return i !== r ? d[i] - d[r] : s - n
}
function A() {
return []
}
function E(e) {
const {
multiplier: t,
shortKind: i
} = k(e);
return `${t}${i}`
}
function k(e, t) {
const i = s.Interval.parse(e);
let r = i.multiplier(),
n = i.kind();
if (!i.isValid()) {
if (t) return null;
throw new TypeError("Can't translate invalid interval")
}
return i.isMinuteHours() && (r = Math.floor(r / 60),
n = s.SpecialResolutionKind.Hours), {
multiplier: r.toString(),
shortKind: D(n),
hint: `${r} ${D(n, r)}`,
mayOmitMultiplier: i.isDWM() && 1 === r,
mayOmitShortKind: i.isMinutes() && !i.isMinuteHours()
}
}
function D(e, t) {
if (!t) return p[e];
switch (e) {
case s.ResolutionKind.Ticks:
return window.t("tick", {
plural: "ticks",
count: t
});
case s.ResolutionKind.Days:
return window.t("day", {
plural: "days",
count: t
});
case s.ResolutionKind.Weeks:
return window.t("week", {
plural: "weeks",
count: t
});
case s.ResolutionKind.Months:
return window.t("month", {
plural: "months",
count: t
});
case s.ResolutionKind.Seconds:
return window.t("second", {
plural: "seconds",
count: t
});
case s.ResolutionKind.Minutes:
return window.t("minute", {
plural: "minutes",
count: t
});
case s.SpecialResolutionKind.Hours:
return window.t("hour", {
plural: "hours",
count: t
});
case s.ResolutionKind.Range:
return window.t("range", {
plural: "ranges",
count: t
});
default:
return e
}
}
function V() {
return h.a.enabled("seconds_resolution")
}
function B() {
return h.a.enabled("tick_resolution")
}
},
"pQ+n": function(e, t, i) {
"use strict";
function s(e, t) {
const i = new Set,
s = t => {
e.children(t, !1).forEach(e => {
i.has(e) || (i.add(e), s(e))
})
};
return t.forEach(s), t.filter(e => !i.has(e)).map(t => function e(t, i) {
let s = [];
const r = t.children(i, !1);
for (let i = 0; i < r.length; i++) s = s.concat(e(t, r[i]));
return s.push(i), s
}(e, t)).reduce((e, t) => e.concat(t), [])
}
i.d(t, "a", (function() {
return s
}))
},
pZDF: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "getStudyInputsInfo", (function() {
return r
}));
var s = i("YFKU");
function r(e) {
return void 0 === e.inputs ? [] : e.inputs.map(e => ({
...e,
id: e.id,
localizedName: void 0 !== e.name ? Object(s.t)(e.name, {
context: "input"
}) : ""
}))
}
},
pvsv: function(e, t, i) {
"use strict";
function s(e, t) {
Promise.all([i.e("react"), i.e(1), i.e(3), i.e("moment"), i.e(81), i.e(0), i.e(2), i.e(
"symbol-info-dialog-impl")]).then(i.t.bind(null, "1Z/g", 7)).then(i => {
i.showSymbolInfoDialog(e, t)
})
}
i.r(t), i.d(t, "showSymbolInfoDialog", (function() {
return s
}))
},
qE4g: function(e, t, i) {
"use strict";
i.r(t);
var s = i("hbEN"),
r = i("aO4+"),
n = i("f6yo"),
o = i("HGP3"),
a = i("Eyy1"),
l = i("YFKU"),
c = i("Kxc7"),
h = i("oV8k"),
u = i("VdBB"),
d = i("9uLv"),
p = i("Tmoa"),
_ = i("//lZ"),
m = i("gAom"),
f = i("ikwP"),
g = i("l7y7"),
b = i("zDbI"),
v = i("u+0B");
i("Oy0l");
const S = c.enabled("adaptive_logo"),
y = c.enabled("small_no_display"),
w = c.enabled("38914"),
P = "Ch{0}ar{1}t{2}by{3}{4}".format("", "", " ", " ", "TradingView"),
C = "po{0}wer{1}ed{2}by{3}{4}".format("", "", " ", " ", "TradingView"),
x = "by{3}{4}".format("", "", " ", " ", "TradingView"),
T = w ? x : C,
I = navigator.userAgent.toLowerCase().indexOf("chrome") > -1 && -1 === navigator.userAgent
.toLowerCase().indexOf("edge"),
M = window.urlParams || {};
window.initData;
M.no_referral_id && enable(M.referral_id || "", "aggressive");
Object(l.t)("By TradingView"), Object(l.t)("{symbol} financials by TradingView"), Object(l.t)(
"More features on tradingview.com"), Object(l.t)("powered by");
const O = Object(l.t)(P),
L = Object(l.t)(T);
function A(e) {
return "px EuclidCircular" === e ? .1 : 0
}
class E extends h.a {
constructor(e, t, i, r) {
super(e, t), this._canvasWidth = 0, this._paneHeight = 0, this._left = 13, this
._bottom = 16, this._layout = "site_branding", this._needToShow = !0,
this._showBranding = !1, this._customLogoSrc = "", this._customLogoLink =
"", this._cubicBezier = new d.a(.4, .01, .22, 1), this._openAnimation =
null, this._closeAnimation = null, this._powBy = null, this._custom = null,
this._mainSeries = this._model.mainSeries(), this._showAllowance = i, this
._showForPro = Boolean(r), this._checkLayout(), "widget_custom_branding" !==
this._layout && "fundamental_custom_branding" !== this._layout || (this
._left = 8, this._bottom = 5);
const n = () => {
this._needToShow ? this._showBranding = !0 : this._showBranding = !1
};
this._resizeHandlerDelayed = Object(s.default)(n, 200), n(), window
.addEventListener("resize", this._resizeHandlerDelayed), this
._monitorCanvas = Object(f.createDisconnectedBoundCanvas)(document, new f
.Size(0, 0)), this._monitorCanvas.subscribeCanvasConfigured(() => {
this._init()
}), this._model.isSnapshot() ? this._init() : (this._mainSeries.dataEvents()
.symbolResolved().subscribe(this, this._init), null !== this._mainSeries
.symbolInfo() && this._init()), this._renderer = {
draw: this.draw.bind(this),
hitTest: this.hitTest.bind(this)
}
}
destroy() {
window.removeEventListener("resize", this._resizeHandlerDelayed), this
._mainSeries.dataEvents().symbolResolved().unsubscribeAll(this), this
._powBy && this._powBy.destroy()
}
paneViews(e) {
if (window.TradingView.printing) return [];
if (!this._showAllowance()) return [];
if ("site_branding" === this._layout && !this._showForPro && window.user &&
window.user.is_pro) return [];
const t = c.enabled("move_logo_to_main_pane");
return t && e.isMainPane() || !t && e.isLast() || e.isMaximized() ? [{
renderer: this.renderer.bind(this)
}] : []
}
labelPaneViews(e) {
return []
}
priceAxisViews(e, t) {
return []
}
updateAllViews() {}
updateViewsForPane(e) {}
priceScale() {
return null
}
renderer(e, t) {
return this._paneHeight = e, this._canvasWidth = t, this._renderer
}
hasContextMenu() {
return !1
}
onClickOutside() {
this._hasAnimation() && this._startCloseAnimation()
}
hitTest(e) {
return !this._showBranding || c.enabled("logo_without_link") ? null : this
._powBy && "widget_custom_no_powered_branding" !== this._layout &&
"fundamental_custom_no_powered_branding" !== this._layout && (this._powBy
.hitTest(e) || this._custom && this._custom.hitTest(e)) ? new u
.HitTestResult(u.HitTestResult.CUSTOM, {
hideCrosshairLinesOnHover: !0,
clickHandler: () => {
this._openLink()
},
tapHandler: () => {
this._hasAnimation() ? this
._toggleOpenAnimatedOrOpenLink() : this._openLink()
},
mouseEnterHandler: () => {
this._hasAnimation() && this._startOpenAnimation()
},
mouseLeaveHandler: () => {
this._hasAnimation() && this._startCloseAnimation()
}
}) : null
}
tvUrl() {
let e = new URL("https://www.tradingview.com/");
if (this._customLogoLink) return this._customLogoLink;
if ("library_branding" === this._layout || "library_custom_branding" === this
._layout) {
let t;
switch (!0) {
case c.enabled("charting_library"):
t = "library";
break;
case c.enabled("trading_terminal"):
t = "trading-terminal"
}
return e.searchParams.append("utm_source", window.location.origin), e
.searchParams.append("utm_medium", "library"), t && e.searchParams
.append("utm_campaign", t), e.toString()
}
return e.toString()
}
draw(e, t) {
if (!this._showBranding) return;
let i = 0;
M.utm = !0, Object(f.drawScaled)(e, t.pixelRatio, () => {
this._powBy && this._powBy.show && (i = this._powBy.height,
e.save(), e.translate(this._left, this._paneHeight - this
._bottom - i), this._powBy.draw(e, t, this
._canvasWidth), e.restore()), this._custom && this
._custom
.show && (e.save(), e.translate(this._left, this._paneHeight -
this._bottom - i - this._custom.height), this._custom
.draw(e, t), e.restore())
})
}
_init() {
const e = this._mainSeries.symbolInfo();
this._powBy && this._powBy.destroy(), this._powBy = new F(this._layout, (null ==
e ? void 0 : e.name) || "", this._model, () => this._model
.fullUpdate()), this._custom = new W(this._layout, this._customLogoSrc,
() => this._model.fullUpdate()), this._openAnimation = null, this
._closeAnimation = null
}
_checkLayout() {
if (c.enabled("widget")) 0;
else if (c.enabled("charting_library") || c.enabled("trading_terminal")) {
const e = JSON.parse(M.logo) || {};
e.image ? (this._customLogoSrc = e.image, this._customLogoLink = e.link,
this._needToShow = c.enabled("widget_logo"), c.enabled(
"link_to_tradingview") ? this._layout =
"library_custom_branding" : this._layout =
"library_custom_no_powered_branding") : (this._layout =
"library_branding", this._needToShow = c.enabled("widget_logo"))
} else this._layout = "site_branding"
}
_startOpenAnimation() {
null === this._openAnimation && (null !== this._closeAnimation && (this
._closeAnimation.stop(), this._closeAnimation = null), this
._openAnimation = Object(_.doAnimate)({
from: this._currentStateForAnimation(),
to: this._openedStateForAnimation(),
duration: 200,
easing: this._cubicBezier.easingFunc,
onStep: this._animatedDrawStep.bind(this)
}))
}
_startCloseAnimation() {
null === this._closeAnimation && (null !== this._openAnimation && (this
._openAnimation.stop(), this._openAnimation = null), this
._closeAnimation = Object(_.doAnimate)({
from: this._currentStateForAnimation(),
to: this._closedStateForAnimation(),
duration: 200,
easing: this._cubicBezier.easingFunc,
onStep: this._animatedDrawStep.bind(this)
}))
}
_currentStateForAnimation() {
return Object(a.ensureNotNull)(this._powBy).width
}
_closedStateForAnimation() {
return Object(a.ensureNotNull)(this._powBy).minimizedAnimationWidth()
}
_openedStateForAnimation() {
return Object(a.ensureNotNull)(this._powBy).maximizedAnimationWidth()
}
_animatedDrawStep(e, t) {
Object(a.ensureNotNull)(this._powBy).animatedDrawStep(e, t), this._model
.lightUpdate()
}
_hasAnimation() {
return null !== this._powBy && this._powBy.hasAnimation()
}
_openLink() {
if ("site_branding" === this._layout) return !1;
c.enabled("widget");
return Object(a.ensureNotNull)(window.open(this.tvUrl(), "_blank")).opener =
null, !0
}
_toggleOpenAnimatedOrOpenLink() {
null !== this._openAnimation && this._openAnimation.completed() ? this
._openLink() || this._startCloseAnimation() : this._startOpenAnimation()
}
}
function k(e) {
return !S || e > 500
}
const D = {
customBrandingTradingViewText: o.colorsPalette["color-brand"],
customBrandingText: o.colorsPalette["color-cold-gray-850"],
background: o.colorsPalette["color-cold-gray-900"],
shadow: Object(p.generateColor)(o.colorsPalette["color-white"], 91),
text: o.colorsPalette["color-white"],
staticTextBackground: Object(p.generateColor)(o.colorsPalette["color-cold-gray-800"],
20),
logo: o.colorsPalette["color-white"]
},
V = {
customBrandingTradingViewText: o.colorsPalette["color-brand"],
customBrandingText: o.colorsPalette["color-cold-gray-850"],
background: o.colorsPalette["color-white"],
shadow: Object(p.generateColor)(o.colorsPalette["color-black"], 91),
text: o.colorsPalette["color-cold-gray-900"],
staticTextBackground: Object(p.generateColor)(o.colorsPalette["color-white"], 20),
logo: o.colorsPalette["color-cold-gray-900"]
};
const B = {};
function R(e, t) {
const i = B[e];
if (void 0 !== i) return i.image || null;
const s = {};
return B[e] = s,
function(e) {
return new Promise(t => {
const i = g.replace(/fill="#[\da-f]{6}"/i, `fill="${e}"`),
s = new Image;
s.onload = () => {
s.onload = null, t(s)
}, s.src = URL.createObjectURL(new Blob([i], {
type: "image/svg+xml"
}))
})
}(e).then(e => {
s.image = e, t()
}), null
}
function N(e) {
const {
a: t,
d: i,
e: s,
f: n
} = e;
return new r.Point(s / t, n / i)
}
class j {
constructor() {
this._originPoint = null
}
hitTest(e) {
const t = this._getHitTestBox();
if (t) return Object(n.pointInBox)(e, t)
}
_getHitTestBox() {
const e = this._originPoint;
if (e) {
const {
x: t,
y: i
} = e;
return Object(r.box)(e, new r.Point(t + this.width, i + this.height))
}
}
}
class F extends j {
constructor(e, t, i, s) {
if (super(), this.show = !0, this.borderRadius = 0, this._needDisplayImage = !1,
this._imageWidth = 22, this._imageHeight = 11, this._animatedWidth = 32, this
._font = "px " + b.CHART_FONT_FAMILY, this._txt = "TradingView", this
._textWidth = 0, this._maximizedAnimationTextWidth = 0, this._textWidthCache =
new v.TextWidthCache, this._pixelRatio = 1, this._model = i, this._layout = e,
this._symbol = t, this.showAnimatedBranding = c.enabled("show_animated_logo") ||
"widget_branding" === this._layout, this._fontSize = this.showAnimatedBranding ?
11 : 14, this.showAnimatedBranding || "widget_custom_branding" !== this
._layout && "fundamental_custom_branding" !== this._layout || (this._fontSize =
12), this.width = 32, this.height = this._fontSize + 2, this
._onReadyCallback = s, this._init(), document.fonts && document.fonts.check &&
document.fonts.load) {
document.fonts.check(this._fontSize + "px EuclidCircular") ? this._font =
"px EuclidCircular" : document.fonts.load(this._fontSize +
"px EuclidCircular", this._txt).then(() => {
this._font = "px EuclidCircular", this._recalculateMetrics()
})
}
this._recalculateMetrics()
}
destroy() {
this._model.properties().paneProperties.background.unsubscribeAll(this), this._model
.onChartThemeLoaded().unsubscribeAll(this)
}
hasAnimation() {
return this.showAnimatedBranding
}
minimizedAnimationWidth() {
return 32
}
maximizedAnimationWidth() {
return this._maximizedAnimationTextWidth + 32 - 3
}
animatedDrawStep(e, t) {
this._animatedWidth = t
}
draw(e, t, i) {
t.pixelRatio !== this._pixelRatio && (this._textWidthCache.reset(), this
._pixelRatio = t.pixelRatio);
const s = this._colors;
if (this.showAnimatedBranding) this._needDisplayImage && null !== this
._getLogoImage(s.logo) && (e.save(), e.translate(-Math.ceil((32 - this
._imageWidth) / 2), Math.floor((32 - this._imageHeight) / 2)), this
._originPoint = N(e.getTransform()), this.borderRadius = 16, this
._drawFillRectWithRoundedCorner(e, -.5, 0, this._animatedWidth, 32, this
.borderRadius), this._drawLogoImage(e, Math.round((32 - this
._imageWidth) / 2), Math.round((32 - this._imageHeight) / 2) + 0), this
._animatedWidth > 32 && (e.translate(Math.round(32), Math.round(this
._fontSize * A(this._font))),
this._drawFillTextCropWidth(e, this._animatedWidth - 32)), e.restore(),
this.width = this._animatedWidth);
else if ("widget_custom_branding" === this._layout ||
"fundamental_custom_branding" === this._layout) {
e.font = this._fontSize + this._font;
const t = e.measureText(this._txt).width + 2;
this.width = t + e.measureText("TradingView").width + 2, this._originPoint = N(e
.getTransform()), e.save(), e.globalAlpha = .7, e.fillStyle = this
._colors.customBrandingText, e.fillText(this._txt, 0, 12), e.fillStyle =
this._colors.customBrandingTradingViewText, e.fillText("TradingView", t,
12), e.restore()
} else if (function(e) {
return !y || e > 480
}(i))
if (this._needDisplayImage && null !== this._getLogoImage(s.logo)) {
e.save(), e.translate(-Math.ceil((32 - this._imageWidth) / 2), Math.floor((
32 - this._imageHeight) / 2)), this._originPoint = N(e
.getTransform()), this.borderRadius = 16, this._drawBgCircle(e), e
.drawImage(Object(a.ensureNotNull)(this._getLogoImage(s.logo)), Math
.round((32 - this._imageWidth) / 2), Math.round((32 - this
._imageHeight) / 2) + 0);
const t = k(i);
t && (e.translate(37, Math.round(this._fontSize * A(this._font))), this
._drawTextStroke(e), this._drawTextFill(e)), e.restore(), this
.width = 32, t && (this.width += this._maximizedAnimationTextWidth)
} else {
const t = k(i);
t && (e.save(), e.translate(I ? -.5 : 0, -.5), this._drawTextStroke(e), this
._drawTextFill(e), e.restore()), t && (this.width = this
._maximizedAnimationTextWidth)
}
else this.width = 0
}
_init() {
this._checkLayout(), this.show && (this.height = this._needDisplayImage ? 32 : this
._fontSize + 2, this._updateColors(), this._model.properties()
.paneProperties.background.subscribe(this, this._updateColors), this._model
.onChartThemeLoaded().subscribe(this, this._updateColors))
}
_recalculateMetrics() {
const e = Object(f.createDisconnectedBoundCanvas)(document, new f.Size(0, 0)),
t = Object(f.getPretransformedContext2D)(e, !0);
t.font = this._fontSize + this._font, this._textWidth = Math.ceil(t.measureText(this
._txt).width) + 2;
let i = this._textWidth + 8;
i % 2 == 0 && (i += 1), this._maximizedAnimationTextWidth = i, this._textWidthCache
.reset()
}
_updateColors() {
this._colors = this._model.isDark() ? D : V
}
_getLogoImage(e) {
return R(e, this._onReadyCallback)
}
_checkLayout() {
switch (this._layout) {
case "widget_branding":
case "widget_referral_branding":
case "widget_custom_branding":
case "fundamental_branding":
case "fundamental_custom_branding":
case "library_custom_branding":
case "library_branding":
case "site_branding":
this.show = !0;
break;
case "widget_custom_no_powered_branding":
case "fundamental_custom_no_powered_branding":
case "library_custom_no_powered_branding":
this.show = !1
}
switch (this._layout) {
case "library_branding":
this._needDisplayImage = !0, this._txt = O;
break;
case "library_custom_branding":
this._txt = L
}
}
_drawTextStroke(e) {
e.save(), e.textBaseline = "middle", e.textAlign = "start", e.font = this
._fontSize + this._font, e.strokeStyle = this._colors.staticTextBackground, e
.lineWidth = 4, e.lineJoin = "round", e.strokeText(this._txt, 0, 16 + this
._textWidthCache.yMidCorrection(e, this._txt)), e.restore()
}
_drawTextFill(e) {
e.save(), e.textBaseline = "middle", e.textAlign = "start", e.font = this
._fontSize + this._font, e.fillStyle = this._colors.text,
e.fillText(this._txt, 0, 16 + this._textWidthCache.yMidCorrection(e, this
._txt)), e.restore()
}
_drawFillTextCropWidth(e, t) {
e.save(), e.beginPath(), e.rect(0, 0, t, this.height), e.clip(), this._drawTextFill(
e), e.restore()
}
_drawBgCircle(e) {
const t = this.borderRadius,
i = 2 * Math.PI;
e.save(), e.beginPath(), e.fillStyle = this._colors.shadow, e.arc(t, t, t + 1, 0,
i), e.fill(), e.closePath(), e.restore(), e.save(), e.beginPath(), e
.fillStyle =
this._colors.background, e.arc(t, t, t, 0, i, !1), e.fill(), e.closePath(), e
.restore()
}
_drawFillRectWithRoundedCorner(e, t, i, s, r, n) {
e.save(), Object(m.drawRoundRect)(e, t - 1, i - 1, s + 2, r + 2, n), e.fillStyle =
this._colors.shadow, e.fill(), e.closePath(), e.restore(), e.save(), Object(m
.drawRoundRect)(e, t, i, s, r, n), e.fillStyle = this._colors.background, e
.fill(), e.closePath(), e.restore()
}
_drawLogoImage(e, t, i) {
e.drawImage(Object(a.ensureNotNull)(this._getLogoImage(this._colors.logo)), t, i)
}
}
class W extends j {
constructor(e, t, i) {
super(), this.show = !1, this.width = 0, this.height = 0, this._ready = !1, this
._layout = e, this._src = t, this._onReadyCallback = i, this._checkLayout();
const s = new Image;
this._img = s, this.show && (s.addEventListener("load", () => {
this.width = Math.round(s.width), this.height = Math.round(s
.height), this._ready = !0, this._onReadyCallback && this
._onReadyCallback()
}), s.crossOrigin = "anonymous", s.src = this._src)
}
draw(e, t) {
this._ready && (e.drawImage(this._img, -.5, -.5, this.width, this.height), this
._originPoint = N(e.getTransform()))
}
_checkLayout() {
switch (this._layout) {
case "widget_custom_branding":
case "widget_custom_no_powered_branding":
case "fundamental_custom_branding":
case "fundamental_custom_no_powered_branding":
case "library_custom_branding":
case "library_custom_no_powered_branding":
this.show = !0;
break;
case "site_branding":
case "widget_branding":
case "widget_referral_branding":
case "fundamental_branding":
case "library_branding":
this.show = !1
}
}
}
function H(e, t) {
function i(t) {
const i = e.getAll();
if (1 === i.length) return !0;
const s = i[0].hasModel() && i[0].model();
return s && s.model() === t
}
e.addCustomSource("branding", (e, s) => new E(e, s, i.bind(null, s), t))
}
i.d(t, "addBrandingSource", (function() {
return H
}))
},
qHEz: function(e, t, i) {
"use strict";
function s(e, t) {
const i = e.files && e.files.length > 0;
if (!i && t && t.eventPhase > 0) return r(t, e), Promise.resolve();
if (!i) {
let t = !1;
const i = i => {
i.stopImmediatePropagation(), r(i, e), t = !0
};
try {
document.addEventListener("copy", i, !0), document.execCommand("copy")
} finally {
document.removeEventListener("copy", i, !0)
}
if (t) return Promise.resolve()
}
return async function(e) {
if (!navigator.clipboard || !navigator.clipboard.write || !window.ClipboardItem)
throw new DOMException("ClipboardApi is not supported",
"NotSupportedError");
const t = {};
for (const i of e.files || []) t[i.type] = i;
e.text && (t["text/plain"] = e.text);
e.html && (t["text/html"] = e.html);
return navigator.clipboard.write([new window.ClipboardItem(t)])
}(e)
}
function r(e, t) {
e.preventDefault();
const i = e.clipboardData;
t.text && i.setData("text/plain", t.text), t.html && i.setData("text/html", t.html)
}
async function n(e, t) {
if ("text/plain" === t && !navigator.clipboard.write) {
const t = await e;
return navigator.clipboard.writeText(await t.text())
}
if (!navigator.clipboard || !navigator.clipboard.write || !window.ClipboardItem)
throw new DOMException("ClipboardApi is not supported", "NotSupportedError");
let i = null;
try {
i = new window.ClipboardItem({
[t]: e
})
} catch (s) {
i = new window.ClipboardItem({
[t]: await e
})
}
if (i) return navigator.clipboard.write([i]);
throw new Error("ClipboardApi is not supported")
}
i.d(t, "a", (function() {
return s
})), i.d(t, "b", (function() {
return n
}))
},
qJq3: function(e, t, i) {
"use strict";
(function(e, s, r) {
TradingView.DEFAULT_BAR_COUNT = 300, TradingView.TIME_PLOT = 0, TradingView.OPEN_PLOT =
1, TradingView.HIGH_PLOT = 2, TradingView.LOW_PLOT = 3, TradingView.CLOSE_PLOT = 4,
TradingView.ADT_PLOT = 6, TradingView.STYLE_PLOT = 7;
var n = i("Eyy1").assert,
o = i("Eyy1").ensureNotNull,
a = i("lUQk").SeriesBase,
l = i("x0JF"),
c = l.SeriesAreaPaneView,
h = l.SeriesLinePaneView,
u = l.SeriesHollowCandlesPaneView,
d = l.SeriesCandlesPaneView,
p = l.SeriesBarsPaneView,
_ = l.SeriesHeikenAshiPaneView,
m = l.SeriesBaselinePaneView,
f = i("9Jkk").SeriesHiLoPaneView,
g = i("biIa").SeriesWaterlinePaneView,
b = i("Kxc7"),
v = i("ZJKN").BarsRange,
S = i("38az").SeriesBarColorer,
y = i("XPit").SeriesData,
w = i("k9/m"),
P = w.PlotRowSearchMode,
C = w.mergeMinMax,
x = i("okVO").SyncModel,
T = i("JWMC").trackEvent,
I = i("txPx").getLogger("Chart.Series"),
M = i("dfhE"),
O = i("n5al"),
L = i("pPtI"),
A = L.getServerInterval,
E = L.getResolutionByChartStyle,
k = i("LxhU").Interval,
D = i("z+Sa").SeriesHorizontalBaseLinePaneView,
V = i("Z8aO").SeriesPriceLinePaneView,
B = i("FIi8").deepExtend,
R = i("5fI3").encodeExtendedSymbolOrGetSimpleSymbolString,
N = i("FQhm"),
j = i("YWnQ").permissionDenied,
F = !b.enabled("hide_series_legend_item"),
W = i("uDHo").TIMEFRAMETYPE,
H = i("H0vP").InvalidationMask,
U = i("n5al").isSingleValueBasedStyle;
class z extends a {
constructor(t, s, r, n) {
var o = i("OK+B");
s.removeProperty("currencyId"), super(t, s, r, n), this
._symbolIntervalChanged = new e, this._intervalChanged = new e, this
.requestingIntradayWhenNotSupported = new e, this
.requestingResolutionWhenNotSupported = new e, this
._onInReplayStateChanged = new e, this
._replayExitedDueUnsupportedInterval = new e, this
._replayExitedDueUnavailableForUserInterval = new e, this
._onTimeFrameApplied = new e, this.m_model = t, this._chartApi = t
._chartApi, this.m_data = null, this.createPaneView(), this._syncModel =
null, this._replaySubscriber = null, this
._isReplayResolutionAvailableForUser = null, this._haStyle = {
studyId: O.chartStyleStudyId(z.STYLE_HEIKEN_ASHI, !0)
}, this._renkoStyle = {
studyId: O.chartStyleStudyId(z.STYLE_RENKO, !0)
}, this._pbStyle = {
studyId: O.chartStyleStudyId(z.STYLE_PB, !0)
}, this._kagiStyle = {
studyId: O.chartStyleStudyId(z.STYLE_KAGI, !0)
}, this._pnfStyle = {
studyId: O.chartStyleStudyId(z.STYLE_PNF, !0)
}, this._rangeStyle = {
studyId: O.chartStyleStudyId(z.STYLE_RANGE, !0)
}, this._properties.addExclusion && (this._properties.addExclusion(
"visible"), this._properties.addExclusion("currencyId")), this
._predictBars = 0, this._futureBarsPaneView = null, this._properties
.showInDataWindow.listeners().subscribe(t, o.prototype.fullUpdate), this
.properties().minTick.listeners().subscribe(this, z.prototype
._recreateFormatter);
var a = this;
this.properties().minTick.listeners().subscribe(null, (function() {
a.m_model.fullUpdate()
})), this._priceLineView = null, this._baseHorizontalLineView = new D(
this), this._gotoDateResultCleared = !1, this._gotoDateView = null,
this.bindStyleChange(), this.bindJapChartsInputs(), this
._createIsDWMProperty(), this._symbolIntervalChanged.subscribe(this,
this.checkInterval), this.properties().showCountdown.listeners()
.subscribe(this, z.prototype._onChangeShowCountdown), this
._onChangeShowCountdown(this.properties().showCountdown), this
._recreatePriceFormattingDependencies(), this.properties().lineStyle
.priceSource.listeners().subscribe(this, this._updateBarFunction), this
.properties().areaStyle.priceSource.listeners().subscribe(this, this
._updateBarFunction), this.properties().baselineStyle.priceSource
.listeners().subscribe(this, this._updateBarFunction), this
._updateBarFunction()
}
isLoading() {
return this._loading
}
isSymbolInvalid() {
return this._status === z.STATUS_INVALID_SYMBOL
}
styleStudyInfos() {
return {
haStyle: this._haStyle,
renkoStyle: this._renkoStyle,
pbStyle: this._pbStyle,
kagiStyle: this._kagiStyle,
pnfStyle: this._pnfStyle,
rangeStyle: this._rangeStyle
}
}
styleStudyInfo(e) {
return this.styleStudyInfos()[e]
}
priceLineColor(e) {
return this.properties().priceLineColor.value() || e
}
serverTimeOffset() {
return this._chartApi.serverTimeOffset()
}
_onChangeShowCountdown(e) {
var t = this;
e.value() ? this._countdownUpdateTimer = this.m_model.setInterval((
function() {
t._priceAxisView.updateCountdown()
}), 500) : (this.m_model.clearInterval(this._countdownUpdateTimer),
delete this._countdownUpdateTimer)
}
lastValueData(e, t, i) {
var s = {
noData: !0
};
if (this.m_model.timeScale().isEmpty() || this.priceScale().isEmpty() ||
this.data().isEmpty()) return s;
var r, n, o = this.m_model.timeScale().visibleBarsStrictRange();
if (null === o) return s;
if (t) {
var a = this.data().bars().last();
if (null === a) return s;
r = a.value, n = a.index
} else {
var l = this.data().bars().search(o.lastBar(), P.NearestLeft);
if (null === l) return s;
r = this.data().bars().valueAt(l.index), n = l.index
}
var c = {
noData: !1
},
h = void 0 !== e ? r[e] : this._barFunction(r);
i && (c.price = h);
var u = this.firstValue();
c.text = this.priceScale().formatPrice(h, u), c.formattedPriceAbsolute =
this.priceScale().formatPriceAbsolute(h), c.formattedPricePercentage =
this.priceScale().formatPricePercentage(h, u, !0);
var d = this.barColorer().barStyle(n, !1);
return c.color = d.barColor, c.floatCoordinate = this.priceScale()
.priceToCoordinate(h, u), c.coordinate = c.floatCoordinate, c.index = n,
c
}
_createIsDWMProperty() {
this._isDWMProperty = new s(this.isDWM()), this._onRestarted.subscribe(this,
(function() {
this._isDWMProperty.setValue(this.isDWM())
}))
}
isDWMProperty() {
return this._isDWMProperty
}
model() {
return this.m_model
}
fixLastBar(e) {
0
}
clearData() {
n(null === this.m_data, "Cannot clear loaded data"), this._seriesSource
.clearData()
}
data() {
return this.m_data || this._seriesSource.data()
}
isPulse() {
return this._symbolInfo && this._symbolInfo.resolutions.length > 0
}
onSymbolIntervalChanged() {
return this._symbolIntervalChanged
}
onIntervalChanged() {
return this._intervalChanged
}
status() {
return this._status
}
createPaneView() {
this._paneView = null, this._projectionBarsPaneView = null, this
._waterlineView = null,
this._priceLineView = this.hasClosePrice() ? new V(this) : null;
var e = this._properties.style.value();
switch (e) {
case z.STYLE_BARS:
this._paneView = new p(this, this.m_model);
break;
case z.STYLE_CANDLES:
this._paneView = new d(this, this.m_model);
break;
case z.STYLE_LINE:
this._paneView = new h(this, this.m_model);
break;
case z.STYLE_AREA:
this._paneView = new c(this, this.m_model);
break;
case z.STYLE_HEIKEN_ASHI:
this._paneView = new _(this, this.m_model);
break;
case z.STYLE_HOLLOW_CANDLES:
this._paneView = new u(this, this.m_model);
break;
case z.STYLE_BASELINE:
this._paneView = new m(this, this.m_model), this._waterlineView =
new g(this);
break;
case z.STYLE_HILO:
this._paneView = new f(this, this.m_model)
}
if (null === this._paneView) throw Error("Unknown chart style assigned: " +
e)
}
_clearStylePlot(e, t) {
if (0 !== e.size()) {
var i = t || o(e.firstIndex()),
s = o(e.lastIndex()) + 1;
e.range(i, s).each((function(e, t) {
t[TradingView.STYLE_PLOT] = null
}))
}
}
invalidateBarStylesCache(e) {
I.logDebug("Invalidate style cache starting from " + e), this
._clearStylePlot(this.bars(), e), this._clearStylePlot(this.nsBars())
}
invalidateBarColorerCache() {
delete this._barColorerCache, this.invalidateBarStylesCache()
}
barColorer() {
if (this._barColorerCache) return this._barColorerCache;
for (var e = null, t = this.m_model.dataSources().length - 1; t >= 0; t--) {
var i = this.m_model.dataSources()[t];
if (i.metaInfo && TradingView.isInherited(i.constructor, TradingView
.Study) && i.hasBarColorer() && i.properties().visible
.value()) {
var s = i.barColorer();
null === e ? e = s : e.pushBackBarColorer(s)
}
}
return null === e ? e = new S(this) : e.pushBackBarColorer(new S(this)),
this._barColorerCache = e, this._barColorerCache
}
properties() {
return this._properties
}
_barsState(e) {
var t = e.state();
return t.data.forEach((function(e) {
e.value.splice(7, 1)
})), t
}
state(e) {
var t = this === this.m_model.mainSeries() ? "MainSeries" : TradingView
.className(this.constructor);
const i = this.obsoleteZOrder();
var s = {
type: t,
id: this.id(),
state: this.properties().state(),
zorder: i,
haStyle: this._haStyle,
renkoStyle: this._renkoStyle,
pbStyle: this._pbStyle,
kagiStyle: this._kagiStyle,
pnfStyle: this._pnfStyle,
rangeStyle: this._rangeStyle
};
return this._symbolInfo && this._symbolInfo.ticker && (s.state.symbol = this
._symbolInfo.ticker), e && (s.bars = this._barsState(this.bars()), s
.nsBars = this._barsState(this.nsBars()), s.symbolInfo = this
._symbolInfo, s.rtPrice = this.data().lastProjectionPrice), s
.boxSize = this.data().boxSize, s.reversalAmount = this.data()
.reversalAmount, s
}
restoreState(e, t) {
t && this._setStatus(z.STATUS_SNAPSHOT), this._properties.mergeAndFire(e
.state), this._properties.hasChild("esdBreaksStyle") && this
._properties.removeProperty("esdBreaksStyle"), this._prevChartStyle =
this.properties().style.value(), this.createPaneView(), t && this
.restoreData(e.bars, e.nsBars, e.symbolInfo, e.rtPrice, e.boxSize, e
.reversalAmount)
}
hasStateForAlert() {
return !1
}
stateForAlert() {
throw new Error("Not implemented")
}
idForAlert() {
return a.prototype.idForAlert.call(this)
}
restoreData(e, t, i, s, r, n) {
this._status = z.STATUS_SNAPSHOT, this.m_data = new y, this.m_data.m_bars
.restoreState(e), this.m_data.m_nsBars.restoreState(t), this
.updateSymbolInfo(i, !1),
this.m_data.lastProjectionPrice = s, this.m_data.boxSize = r, r || (this
.properties().style.value() === z.STYLE_PNF ? this.m_data.boxSize =
this.properties().pnfStyle.inputs.boxSize.value() : this
.properties().style.value() === z.STYLE_RENKO && (this.m_data
.boxSize = this.properties().renkoStyle.inputs.boxSize.value())
), this.m_data.reversalAmount = n, n || this.properties().style
.value() === z.STYLE_KAGI && (this.m_data.reversalAmount = this
.properties().kagiStyle.inputs.reversalAmount.value()), this
._loading = !1
}
seriesSource() {
return this._seriesSource
}
_onSymbolResolved(e) {
this._seriesErrorMessage = null, this.updateSymbolInfo(e, !1), this.m_model
.updateSource(this), this.m_model.realignLineTools(), TradingView
.onWidget() || (T("Symbol", e.listed_exchange, e.name), T("Symbol Type",
e.type, e.listed_exchange));
var t = this.symbolInfo().minmov / this.symbolInfo().pricescale,
i = this.properties();
i.style.value() === z.STYLE_RENKO && i.renkoStyle.inputs.boxSize.value() <
t ? i.renkoStyle.inputs.merge({
boxSize: t
}) : i.style.value() === z.STYLE_PNF && i.pnfStyle.inputs.boxSize
.value() < t ? i.pnfStyle.inputs.merge({
boxSize: t
}) : i.style.value() === z.STYLE_KAGI && i.kagiStyle.inputs
.reversalAmount.value() < t && i.kagiStyle.inputs.merge({
reversalAmount: t
})
}
_onSymbolError(e) {
this._setStatus(z.STATUS_INVALID_SYMBOL), this._loading = !1, this
._properties.shortName.setValue(this._properties.symbol.value()), this
.m_model.clearAllStudies(), this.updateAllViews(), this.m_model
.updateSource(this), e !== j && this.m_model.resetTimeScale(), this
.m_model.realignLineTools()
}
_onSeriesTimeFrame(e, t, i, s, r) {
var n = this.m_model.timeScale(),
o = U(this.style()) ? e + .5 : e,
a = t;
if (void 0 === r) null !== i && i.type !== W.PeriodBack || (a += n
.defaultRightOffsetProperty().value());
else if (r.applyDefaultRightMargin) a += n.defaultRightOffsetProperty()
.value();
else if (r.percentRightMargin) {
var l = t - o + 1,
c = Math.max(0, Math.min(.99, r.percentRightMargin / 100));
a += c * l / (1 - c)
}
this.m_model.setTimeViewport(o, a)
}
_onSeriesError(e) {
this._loading = !1;
var t = e.error;
if (e.ctx) {
var i = {};
Object.entries(e.ctx).forEach((function(e, t) {
i[e] = t.toString()
})), t = t.format(i)
}
b.enabled("charting_library_debug_mode") && I.logNormal("Error reason: " +
t), this._seriesErrorMessage = t;
const s = "unknown_symbol" !== t ? z.STATUS_ERROR : b.enabled(
"no_bars_status") && this._symbolInfo ? z.STATUS_NO_BARS : z
.STATUS_INVALID_SYMBOL;
this._setStatus(s), this._seriesLoaded = !0, this._enablePriceRangeReady()
}
_onSeriesCompleted(e, t) {
if (this._setSymbolIntervalDelay) {
if (this._willSymbolIntervalCurrencyChanged()) return void I.logNormal(
"command comes during symbol/interval changing");
I.logNormal(
"series_completed comes when symbol interval delay present but symbol/interval should not be changed"
)
}
this._loading = !1, this._seriesErrorMessage = null;
var i = e;
switch ("pulsed" === i && (i = "delayed"), i) {
case "streaming":
this._setStatus(z.STATUS_READY);
break;
case "endofday":
this._setStatus(z.STATUS_EOD);
break;
case "delayed":
this._setStatus(z.STATUS_DELAYED);
break;
case "pulsed":
this._setStatus(z.STATUS_PULSE);
break;
case "replay":
this._setStatus(z.STATUS_REPLAY)
}
i.match(/delayed_streaming/) && this._setStatus(z.STATUS_DELAYED_STREAMING);
var s = this.m_model.paneForSource(this);
s.recalculatePriceScale(this.priceScale());
var r = H.full();
null !== this.m_model.appliedTimeFrame().value() && r
.lockVisibleTimeRangeOnResize(), this.m_model.invalidate(r), this
.model().recalcVisibleRangeStudies(!0), this.model()
.recalcStudyBasedLineTools(), !this.m_priceScale.isLockScale() || this
.model().timeScale().isEmpty() || this._seriesLoaded || (this.model()
.timeScale()._correctOffset(), this.model().timeScale()
.correctBarSpacing(), this.model().resetPriceScale(s, this
.priceScale())), this._seriesLoaded = !0, this
._enablePriceRangeReady()
}
_onBarReceived(e) {
this.model().recalcVisibleRangeStudies(!0)
}
disconnect() {
this._seriesSource.stop(), this.m_symbol = void 0, this._predictBars = 0,
this._status = z.STATUS_OFFLINE
}
isStarted() {
return this._seriesSource.isStarted()
}
restart() {
if (this._status !== z.STATUS_SNAPSHOT) {
this._loading = !0, this._onRestarted.fire(), this._setStatus(z
.STATUS_RESOLVING), this.updateSymbolInfo(null, !0);
var e = this._properties.interval.value();
this._checkIntervalWillChanged(e) && this._notifyIntervalChanged(e);
var t = null;
this._pendingTimeRange && (t = this._pendingTimeRange, delete this
._pendingTimeRange), this._onBeforeModifySeries(this
.getSymbolString(), e), this._onTimeFrameApplied.fire(t), e = A(
e), this.m_data = null, this._seriesSource.modifySeries(this
._getResolvingSymbolObject(), e, t), this._seriesSource
.isStarted() || this._seriesSource.start(), this.m_symbol = this
._properties.symbol.value(), this._currency = this._properties
.currencyId.value(), this._unit = this._properties.unitId.value(),
this.m_interval = this._properties.interval.value()
}
}
hasDelayedSymbolIntervalChange() {
return !!this._setSymbolIntervalDelay
}
setSymbolIntervalCurrencyDelayed() {
this._willSymbolIntervalCurrencyChanged() && (this
._setSymbolIntervalDelay && (I.logNormal(
"Clear timeout to change symbol/interval #" + this
._setSymbolIntervalDelay), clearTimeout(this
._setSymbolIntervalDelay)), this._setSymbolIntervalDelay =
setTimeout(function() {
const e = this._properties;
I.logNormal("Timeout #" + this._setSymbolIntervalDelay +
' fired, new symbol will be "' + e.symbol.value() +
'"'), delete this._setSymbolIntervalDelay, this
._setSymbolInterval(e.symbol.value(), e.interval
.value(), e.currencyId.value(), e.unitId.value())
}.bind(this), 30), I.logNormal("Started timeout #" + this
._setSymbolIntervalDelay + ' to change symbol/interval from "' +
this.m_symbol + '" to "' + this._properties.symbol.value() + '"'
))
}
rerequestData() {
this._setSymbolInterval(this.m_symbol, this.m_interval, this._currency, this
._unit, !0)
}
_notifyIntervalChanged(e) {
var t = {
timeframe: this._pendingTimeRange
};
this._intervalChanged.fire(e, t), this._pendingTimeRange = t.timeframe
}
_setSymbolInterval(e, t, i, s, r) {
this.clearGotoDateResult(), k.isRange(t) && this._properties.rangeStyle
.inputs.range.setValue(k.parse(t).multiplier());
var n = this._checkSymbolWillChanged(e),
o = this._checkIntervalWillChanged(t),
a = this._checkCurrencyWillChanged(i),
l = this._checkUnitWillChanged(s);
if (!(n || o || a || l || r)) return this.m_model.realignLineTools(),
void this.m_model.updateLineTools();
if (this._syncModel = null, this.m_symbol = e, this.m_interval = t, this
._currency = i,
this._unit = s, this._status !== z.STATUS_SNAPSHOT && (!this
._seriesSource.isStarted() || n || a || l) && this.updateSymbolInfo(
null, !n && (a || l)), this.m_model.realignLineTools(), this
._status !== z.STATUS_SNAPSHOT) {
this._loading = !0, this._setStatus(z.STATUS_RESOLVING), this
._symbolIntervalChanged.fire(), o && this._notifyIntervalChanged(
this.m_interval), this._onRestarted.fire(), this
._seriesLoaded = !1, this._lineStyleLastPriceCirclePaneView
.stopAnimation();
var c = null;
this._pendingTimeRange && (c = this._pendingTimeRange, delete this
._pendingTimeRange), this._onTimeFrameApplied.fire(c), this
._onBeforeModifySeries(this.getSymbolString(), t), this.m_data =
null, this._seriesSource.modifySeries(this
._getResolvingSymbolObject(), A(t), c, r), this._seriesSource
.isStarted() || (this._predictBars = 0, this._seriesSource.start()),
(n || a || l) && this.disablePriceRangeReady()
}
}
setDefaultTimeframe(e) {
this._pendingTimeRange = e
}
symbol() {
return this.properties().symbol.value()
}
bars() {
return this.data().m_bars
}
nsBars() {
return this.data().m_nsBars
}
hl2(e) {
return (this.high(e) + this.low(e)) / 2
}
hlc3(e) {
return (this.high(e) + this.low(e) + this.close(e)) / 3
}
ohlc4(e) {
return (this.open(e) + this.high(e) + this.low(e) + this.close(e)) / 4
}
priceRange(e, t) {
if (!TradingView.isInteger(e)) return I.logDebug(
"Series.priceRange: incorrect startBar"), null;
if (!TradingView.isInteger(t)) return I.logDebug(
"Series.priceRange: incorrect endBar"), null;
if (this.data().isEmpty()) return null;
if (this.m_priceScale.isLockScale()) {
var i = this._model.mainSeriesScaleRatio();
if (null !== i) {
var s = this.priceScale().internalHeight() / (this.model()
.timeScale().barSpacing() / i),
n = this.data().search(t, P.NearestLeft),
o = (n.value[TradingView.HIGH_PLOT] + n.value[TradingView
.LOW_PLOT]) / 2;
return new r(o - .5 * s, o + .5 * s)
}
}
var a = this.priceSource();
if (null !== a) var l = this.data().bars().minMaxOnRangeCached(e, t, [{
name: a,
offset: 0
}]),
c = this.data().nsBars().minMaxOnRangeCached(e, t, [{
name: a,
offset: 0
}]);
else l = this.data().bars().minMaxOnRangeCached(e, t, [{
name: "low",
offset: 0
}, {
name: "high",
offset: 0
}]), c = this.data().nsBars().minMaxOnRange(e, t, [{
name: "low",
offset: 0
}, {
name: "high",
offset: 0
}]);
var h = null !== (l = C(l, c)) ? l.min === l.max ? new r(l.min - .5, l.max +
.5) : new r(l.min, l.max) : new r(-.5, .5);
return this.priceScale().isLog() ? new r(this.priceScale().priceToLogical(h
.minValue()), this.priceScale().priceToLogical(h.maxValue())) : h
}
nearestData(e, t) {
if (TradingView.isInteger(e)) {
var i = this.data().search(e, t);
return null !== i ? i : void 0
}
I.logDebug("Series.nearestData: incorrect logicalPoint")
}
nearestIndex(e, t) {
var i = this.nearestData(e, t);
return i ? i.index : void 0
}
paneViews() {
if (!this.properties().visible.value()) return null;
var e = [this._baseHorizontalLineView, this._paneView];
return this._futureBarsPaneView && e.push(this._futureBarsPaneView), this
._projectionBarsPaneView && e.push(this._projectionBarsPaneView),
null !== this._waterlineView && e.push(this._waterlineView), null !==
this._priceLineView && e.push(this._priceLineView), null !== this
._gotoDateView && e.push(this._gotoDateView), e.push(...this
._highLowAvgPaneViews), e
}
dataWindowView() {
return this._dataWindowView
}
legendView() {
return this._legendView
}
statusView() {
return F ? this._statusView : null
}
marketStatusModel() {
return this._marketStatusModel
}
dataUpdatedModeModel() {
return this._dataUpdatedModeModel
}
dataProblemModel() {
return this._dataProblemModel
}
purgeSymbolInfo() {
this._symbolInfo = null
}
updateSymbolInfo(e, t) {
if (this._prevSymbolInfo = t ? this._symbolInfo : null, this._symbolInfo =
e, e) {
this._properties.shortName.setValue(e.name);
var i = O.extractSymbolNameFromSymbolInfo(e, this.m_symbol);
i && this._properties.symbol.setValue(i), this._currency = O
.symbolCurrency(e), this._properties.currencyId.setValue(this
._currency), this._unit = O.symbolUnit(e), this._properties
.unitId.setValue(this._unit), this._updateSessionIdProxyProperty(!0)
}
this._base = e ? e.pricescale / e.minmov : 100, this._pointValue = e && e
.pointvalue || 1, this._recreatePriceFormattingDependencies(), this
._statusView.update(), this.priceScale().updateFormatter();
var s = this._getSymbolForApi();
this._quotesProvider.setQuotesSessionSymbol(s), this.checkInterval()
}
updateAllViews() {
this._paneView.update(), this._dataWindowView.update(), this._legendView
.update(), this._statusView.update(), this._highLowAvgPaneViews.forEach(
e => e.update()), this._labelPaneViews.forEach(e => e.update()),
this._priceAxisViews.forEach(e => e.update()), this._priceLineAxisViews
.forEach(e => e.update()), this._futureBarsPaneView && this
._futureBarsPaneView.update(), this._projectionBarsPaneView && this
._projectionBarsPaneView.update(), null !== this._waterlineView && this
._waterlineView.update(), null !== this._priceLineView && this
._priceLineView.update(), null !== this._gotoDateView && this
._gotoDateView.update(), this._baseHorizontalLineView.update();
var e = this._model.activeStrategySource().value();
null !== e && e.updateAllViews(), this._lineStyleLastPriceCirclePaneView
.update()
}
requestMoreData(e) {
if ((this._status === z.STATUS_READY || this._status === z.STATUS_PULSE ||
this._status === z.STATUS_DELAYED || this._status === z
.STATUS_DELAYED_STREAMING || this._status === z.STATUS_EOD || this
._status === z.STATUS_REPLAY) && !this.m_model.timeScale()
.isEmpty()) {
var t = this.m_model.timeScale().visibleBarsStrictRange();
if (null !== t && 0 !== this.bars().size()) {
var i = t.lastBar() - o(this.data().last()).index;
if (this._predictBars < i && (this._predictBars = i, this
._seriesSource.requestMoreTickmarks(i)), !this._endOfData) {
var s = o(this.bars().firstIndex()),
r = e || s - t.firstBar();
r <= 0 || (Number.isFinite(r) ? (this._endOfData = !0, this
._loading = !0, this._seriesSource.requestMoreData(
r), this._setStatus(z.STATUS_LOADING)) : I
.logWarn("requestMoreData: invalid bar count: " + r +
", visible bars: [" + t.firstBar() + ", " + t
.lastBar() + "], last index: " + o(this.data()
.last()).index + ", predicted bars: " + this
._predictBars + ", required bars:" + e))
}
}
}
}
bindStyleChange() {
var e = this;
Object.keys(z.STYLE_SHORT_NAMES).map((function(e) {
return z.STYLE_SHORT_NAMES[e] + "Style"
})).forEach((function(t) {
e._properties[t].listeners().subscribe(e, z.prototype
.invalidateBarStylesCache)
}))
}
bindJapChartsInputs() {
this._properties.style.listeners().subscribe(this, this
.onChartStyleChanged), this._properties.renkoStyle.inputs.boxSize
.listeners().subscribe(this, this.onInputChanged),
this._properties.renkoStyle.inputs.style.listeners().subscribe(this,
this.onInputChanged), this._properties.renkoStyle.inputs.atrLength
.listeners().subscribe(this, this.onInputChanged), this._properties
.renkoStyle.inputs.wicks.listeners().subscribe(this, this
.onInputChanged), this._properties.renkoStyle.inputs.sources
.listeners().subscribe(this, this.onInputChanged), this._properties
.pbStyle.inputs.lb.listeners().subscribe(this, this.onInputChanged),
this._properties.kagiStyle.inputs.reversalAmount.listeners().subscribe(
this, this.onInputChanged), this._properties.kagiStyle.inputs.style
.listeners().subscribe(this, this.onInputChanged), this._properties
.kagiStyle.inputs.atrLength.listeners().subscribe(this, this
.onInputChanged), this._properties.pnfStyle.inputs.boxSize
.listeners().subscribe(this, this.onInputChanged), this._properties
.pnfStyle.inputs.reversalAmount.listeners().subscribe(this, this
.onInputChanged), this._properties.pnfStyle.inputs.sources
.listeners().subscribe(this, this.onInputChanged), this._properties
.pnfStyle.inputs.style.listeners().subscribe(this, this.onInputChanged),
this._properties.pnfStyle.inputs.atrLength.listeners().subscribe(this,
this.onInputChanged), this._properties.pnfStyle.inputs
.oneStepBackBuilding.listeners().subscribe(this, this.onInputChanged),
this._properties.rangeStyle.inputs.phantomBars.listeners().subscribe(
this, this.onInputChanged)
}
createDividendsAdjustmentProperty() {
throw new Error("Not implemented")
}
dividendsAdjustmentProperty() {
return null
}
setChartStyleWithIntervalIfNeeded(e, t) {
var i = t;
void 0 === t && (i = E(e, this._properties.interval.value(), this._model
.defaultResolutions())), k.isEqual(i, this._properties.interval
.value()) || this._properties.interval.setValue(i), this._properties
.style.setValue(e)
}
isNeedRestart(e) {
return this._status !== z.STATUS_SNAPSHOT && (void 0 === e && (e = this
.properties().style.value()), !O.isRangeStyle(this
._prevChartStyle) && !O.isRangeStyle(e) && !(this
._prevChartStyle === e || !O.isRequiringRestartSeriesStyles(this
._prevChartStyle) && !O.isRequiringRestartSeriesStyles(e)))
}
applyPreferences(e) {
var t = B({}, e);
this.m_priceScale.setMode({
autoScale: t.priceAxisProperties.autoScale,
percentage: t.priceAxisProperties.percentage,
log: t.priceAxisProperties.log,
lockScale: t.priceAxisProperties.lockScale
}), this.setChartStyleWithIntervalIfNeeded(t.style), delete t.style,
delete t.interval, this._properties.mergePreferences(t), this
._properties.saveDefaults(), this.createPaneView(), this
.invalidateBarStylesCache()
}
priceSource() {
var e = null;
switch (this._properties.style.value()) {
case z.STYLE_LINE:
e = this._properties.lineStyle.priceSource.value();
break;
case z.STYLE_AREA:
e = this._properties.areaStyle.priceSource.value();
break;
case z.STYLE_BASELINE:
e = this._properties.baselineStyle.priceSource.value()
}
return e
}
isRangeBasedStyle() {
return O.isRangeBasedStyle(this.style())
}
onInputChanged() {
this.restart()
}
getSymbolString() {
return R(this._getSymbolObject())
}
_getResolvingSymbolObject() {
return this._getSymbolObject()
}
getStyleShortName() {
var e = this._properties.style.value();
if (z.STYLE_SHORT_NAMES.hasOwnProperty(e)) return z.STYLE_SHORT_NAMES[e];
throw new Error("Missed short name for style " + e)
}
getStyleProperties() {
return this._properties[this.getStyleShortName() + "Style"]
}
getInputsProperties() {
return this.getStyleProperties().inputs || new s
}
getInputsInfoProperties() {
return this.getStyleProperties().inputInfo || new s
}
getRealVisibleRange() {
var e = this.model().timeScale().visibleBarsStrictRange();
if (null === e) return null;
var t = this.data().search(e.firstBar(), P.NearestRight),
i = this.data().search(e.lastBar(), P.NearestLeft);
return null === t || null === i ? null : new v(t.index, i.index)
}
firstValue() {
var e = this.firstBar();
return null === e ? null : this._barFunction(e)
}
firstBar() {
var e = this.model().timeScale().visibleBarsStrictRange();
if (null === e) return null;
var t = e.firstBar(),
i = this.data().search(t, P.NearestRight);
return null !== i ? i.value : null
}
isSpread() {
return null !== this._symbolInfo && "spread" === this._symbolInfo.type
}
getSymbolName() {
return this._symbolInfo ? this._symbolInfo.name : ""
}
loadDataTo(e) {
var t = this._properties.interval.value();
this._onTimeFrameApplied.fire(e), this._seriesSource.modifySeries(this
._getResolvingSymbolObject(), A(t), e)
}
checkInterval() {
if (this._symbolInfo && (k.isIntraday(this.interval()) && !this._symbolInfo
.has_intraday && this.requestingIntradayWhenNotSupported.fire(),
this._symbolInfo.hasOwnProperty("supported_resolutions"))) {
var e = k.normalize(this._properties.interval.value()); - 1 === this
._symbolInfo.supported_resolutions.indexOf(e) && this
.requestingResolutionWhenNotSupported.fire(this._symbolInfo
.supported_resolutions[0])
}
}
priceScale() {
return this.m_priceScale
}
setPriceScale(e) {
this.m_priceScale !== e && (this._priceScaleAboutToBeChanged.fire(), this
.m_priceScale = e, this._properties.removeProperty(
"priceAxisProperties"), this._properties.addChild(
"priceAxisProperties", e.properties()), this._properties
.priceAxisProperties.childChanged(), N.emit("series_event",
"price_scale_changed"), this._priceScaleChanged.fire(e))
}
setGotoDateResult(e) {
this._gotoDateResultCleared = !1, i.e("series-pane-views").then(i.t.bind(
null, "+weX", 7)).then(({
GotoDateView: t
}) => {
this._gotoDateResultCleared || (this._gotoDateView = new t(this,
e), this.m_model.updateSource(this))
})
}
clearGotoDateResult(e) {
this._gotoDateView = null, this._gotoDateResultCleared = !0
}
syncModel() {
if (!this._syncModel) {
var e = this.symbolInfo(),
t = this.interval();
if (!e || !t) return null;
this._syncModel = new x(e, t)
}
return this._syncModel
}
getSourceIcon() {
return {
type: "loadSvg",
svgId: "series." + this.properties().style.value()
}
}
isStyleSupported(e) {
return !0
}
isIntervalSupported(e) {
return !0
}
isStyleSupportedForReplay(e) {
return O.isTimeBasedStyle(e)
}
isInReplay() {
return null !== this._replaySubscriber
}
onTimeFrameApplied() {
return this._onTimeFrameApplied
}
onInReplayStateChanged() {
throw new Error("Not implemented")
}
replayExitedDueUnsupportedInterval() {
throw new Error("Not implemented")
}
replayExitedDueUnavailableForUserInterval() {
throw new Error("Not implemented")
}
switchToReplay(e, t) {
throw new Error("Not implemented")
}
switchToRealtime() {
throw new Error("Not implemented")
}
_removeReplaySubscriber() {
throw new Error("Not implemented")
}
_onBeforeModifySeries(e, t) {
0
}
_getTelemetryAdditionalData(e, t) {
t = void 0 === t || t;
var i = {
symbol: this.actualSymbol()
};
return t && (i.resolution = this.interval()), void 0 !== e && (i.reason =
e), i
}
_sendTelemetryReport(e, t, i) {
void 0 === i && (i = this._getTelemetryAdditionalData());
var s = Object.assign(t, {
additional: i
});
(void 0).sendChartReport(e, s)
}
_sendTelemetryCounter(e, t) {
this._sendTelemetryReport(e, {
count: 1
}, t)
}
destroy() {
this._replayExitedDueUnsupportedInterval.destroy(), this
._replayExitedDueUnavailableForUserInterval.destroy(), this
._quotesProvider.quotesUpdate().unsubscribeAll(this), this
._quotesProvider.destroy(), this.clearGotoDateResult(), this._legendView
.destroy(), this._marketStatusModel.destroy(), null !== this
._dataUpdatedModeModel && this._dataUpdatedModeModel.destroy(), this
._dataProblemModel.destroy(), this._paneView && this._paneView
.destroy && this._paneView.destroy(), this._onTimeFrameApplied
.destroy(), this._seriesSource.destroy(), super.destroy()
}
dataEvents() {
return this._seriesSource.dataEvents()
}
moveData(e) {
return this._seriesSource.moveData(e)
}
}
Object.assign(z, M), TradingView.Series = z, t.Series = z
}).call(this, i("aIyQ"), i("tc+8"), i("Qb4w").PriceRange)
},
qXYw: function(e, t, i) {
"use strict";
i.r(t);
var s = i("n5al"),
r = i("ivNn"),
n = i("YFKU"),
o = i("qFKp"),
a = i("Tmoa"),
l = i("Ialn"),
c = i("GH0z"),
h = i("6I19"),
u = i("k9/m"),
d = i("CW80"),
p = i("mMWL"),
_ = i("7qT/"),
m = i("38az"),
f = i("xCUR");
const g = o.CheckMobile.any(),
b = g && !0,
v = new c.PercentageFormatter,
S = Object(n.t)("n/a"),
y = `${S} (${S}%)`;
i.d(t, "OverlayLegendValuesProvider", (function() {
return w
}));
class w extends class {
constructor(e, t) {
this._study = e, this._model = t, this._emptyValues = [{
title: Object(n.t)("Open"),
visible: !1,
value: "",
index: 0,
id: ""
}, {
title: Object(n.t)("High"),
visible: !1,
value: "",
index: 1,
id: ""
}, {
title: Object(n.t)("Low"),
visible: !1,
value: "",
index: 2,
id: ""
}, {
title: Object(n.t)("Close"),
visible: !1,
value: "",
index: 3,
id: ""
}, {
title: "",
visible: !1,
value: "",
index: 4,
id: ""
}, {
title: "",
visible: !1,
value: "",
index: 5,
id: ""
}, {
title: Object(n.t)("Change"),
visible: !1,
value: "",
index: 6,
id: ""
}]
}
getItems() {
return this._emptyValues
}
getValues(e) {
const t = this._emptyValues.map(e => ({
...e
}));
if (this._model.timeScale().isEmpty()) return t;
if (0 === this._study.data().size()) return t;
const i = this._showLastPriceAndChangeOnly();
if (Object(r.isNumber)(e) || (i ? e = this._study.data().lastIndex() : (e = this
._model.crossHairSource().appliedIndex(), Object(r.isNumber)(e) || (e =
this._study.data().lastIndex()))), null === e || !Object(r.isNumber)(e))
return t;
const s = this._study.data().search(e, u.PlotRowSearchMode.NearestLeft, 1),
n = Object(h.c)(this._model.paneForSource(this._study));
if (null === s || null === n) return t;
const o = s.index,
c = s.value,
d = c[1],
p = c[2],
_ = c[3],
g = c[4];
if (null == d || null == p || null == _ || null == g) return t;
t[0].value = S, t[1].value = S, t[2].value = S, t[3].value = S, t[6].value = y;
for (const e of t) e.visible = !i;
const w = t[4];
w.visible = !1;
const {
values: P
} = this._changesData(g, d, o, i), C = Object(f.a)(this._study);
if (Object(f.b)(this._study)) t[6].value = "";
else if (void 0 !== P) {
const e = this._study.formatter();
t[6].value = Object(l.forceLTRStr)(
`${e.format(P.change, !0)} (${v.format(P.percentChange, !0)})`)
}
i ? (t[5].value = C(g), t[5].visible = !0, t[6].visible = !0) : (t[0].value = C(d),
t[1].value = C(p), t[2].value = C(_), t[3].value = C(g), w.value = C(this
._study.barFunction()(c)), t[5].visible = !1);
let x = null;
if (i && !b) x = void 0 === P || P.change >= 0 ? m.SeriesBarColorer.upColor(this
._study.properties()) : m.SeriesBarColorer.downColor(this._study
.properties());
else {
const e = this._study.barColorer().barStyle(o, !1),
t = null != e.barBorderColor ? e.barBorderColor : e.barColor;
x = Object(h.b)(n, t)
}
x = Object(a.resetTransparency)(Object(h.b)(n, x));
for (const e of t) e.color = x;
return t
}
_showLastPriceAndChangeOnly() {
return g && (null === this._model.crossHairSource().pane || Object(d.isLineToolName)
(p.tool.value()) || null !== this._model.lineBeingEdited())
}
_changesData(e, t, i, s) {
var r;
if (s && !b) {
const e = this._study.quotes();
if (null !== e) return {
values: {
change: e.change,
percentChange: e.change_percent
},
priceDirection: {
basedOnCurrentBar: e.change >= 0 ? 0 : 1,
basedOnPrevClose: e.change >= 0 ? 0 : 1
}
}
} else {
const s = this._study.data().search(i - 1, u.PlotRowSearchMode.NearestLeft, 1),
n = null !== (r = null == s ? void 0 : s.value[4]) && void 0 !== r ? r :
null;
if (null !== n) return {
values: {
change: e - n,
percentChange: Object(_.a)(n, e)
},
priceDirection: {
basedOnCurrentBar: e >= t ? 0 : 1,
basedOnPrevClose: e >= n ? 0 : 1
}
}
}
return {
priceDirection: {
basedOnCurrentBar: e >= t ? 0 : 1,
basedOnPrevClose: e >= t ? 0 : 1
}
}
}
} {
constructor(e, t) {
super(e, t), this._showBarChange = t.properties().paneProperties.legendProperties
.showBarChange, this._showSeriesOHLC = t.properties().paneProperties
.legendProperties.showSeriesOHLC, this._seriesStyle = e.properties().childs()
.style
}
getValues(e) {
const t = super.getValues(e);
if (!this._showLastPriceAndChangeOnly()) {
const e = Object(s.isPriceSourceStyle)(this._seriesStyle.value()),
i = this._showSeriesOHLC.value(),
r = i && !e,
n = i && e;
t[0].visible = r, t[1].visible = r, t[2].visible = r, t[3].visible = r, t[6]
.visible = this._showBarChange.value(), t[4].visible = n
}
return t
}
}
},
qcGP: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("Ocx9").DefaultProperty,
n = i("mMWL");
class o extends s {
constructor(e, t) {
super(e, t || o.createProperties()), this._priceAxisViews.push(this
.createPriceAxisView(3)), i.e("lt-pane-views").then(i.t.bind(null, "9FRF",
7)).then(({
ParallelChannelPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
calculatePriceDiff() {
var e = this.points();
if (3 === e.length) {
var t = e[0],
i = e[1],
s = e[2],
r = this._findPriceOffset(t, i, s);
null !== r && isFinite(r) && (this._priceOffset = r)
}
}
_findPriceOffset(e, t, i) {
var s = this.priceScale();
if (null === s || e.index === t.index) return null;
if (s.isLog()) {
var r = this._model.timeScale();
if (r.isEmpty()) return null;
var n = this.ownerSource().firstValue(),
o = r.indexToCoordinate(e.index),
a = r.indexToCoordinate(t.index),
l = s.priceToCoordinate(e.price, n),
c = s.priceToCoordinate(t.price, n),
h = l + (m = (c - l) / (a - o)) * (r.indexToCoordinate(i.index) - o),
u = s.priceToCoordinate(i.price, n) - h,
d = (n = this.ownerSource().firstValue(), .5 * (l + c)),
p = s.coordinateToPrice(d, n),
_ = d + u;
return s.coordinateToPrice(_, n) - p
}
var m = (t.price - e.price) / (t.index - e.index),
f = e.price + m * (i.index - e.index);
return i.price - f
}
setLastPoint(e, t) {
t && t.shift() && 2 === this.points().length && this._snapPoint45Degree(e, this
.points()[0]), super.setLastPoint(e), this.calculatePriceDiff()
}
restorePoints(e, t, i) {
super.restorePoints(e, t, i), e && e.length >= 3 && (this._priceOffset = e[2]
.price - e[0].price)
}
setPoint(e, t, i) {
if (i && i.shift()) switch (e) {
case 0:
case 1:
this._snapPoint45Degree(t, this._points[1 - e]);
break;
case 2:
case 3:
this._snapPoint45Degree(t, {
index: this._points[3 - e].index,
price: this._points[3 - e].price + this._priceOffset
})
}
var s = !1;
switch (e) {
case 0:
case 1:
super.setPoint(e, t, i);
break;
case 2:
case 3:
this._points[e - 2].index = t.index, this._points[e - 2].price = t.price -
this._priceOffset;
break;
case 4:
this._points[2] = t, this.calculatePriceDiff(), s = !0;
break;
case 5:
var r = this._findPriceOffset(this._points[0], this._points[1], t);
null !== r && isFinite(r) && (this._points[0].price += r, this._points[1]
.price += r, this._priceOffset -= r, s = !0)
}
if (e % 2 == 0 && this._correctThirdPoint(), s && this.linkKey().value()) {
for (var o = [], a = 0; a < this._points.length; a++) o.push(this._points[a]
.price);
n.changeLineStyle({
model: this._model,
linkKey: this.linkKey().value(),
state: {
prices: o
}
})
}
}
restoreExternalState(e) {
if ((e = Object.assign({}, e)).prices)
if (this.isActualSymbol()) {
for (var t = 0; t < e.prices.length; t++) this._points[t].price = e.prices[
t];
this._priceOffset = this._points[2].price - this._points[0].price
} else this._priceOffset = void 0;
delete e.prices, super.restoreExternalState(e)
}
onData(e) {
super.onData(e), this._updateThirdPointAndPriceOffset()
}
setPoints(e) {
super.setPoints(e), this.calculatePriceDiff()
}
getPoint(e) {
if (e < 2) return s.prototype.getPoint.call(this, e);
var t = null;
switch (e) {
case 2:
case 3:
var i = this.points();
i.length === this.pointsCount() && (t = {
index: i[e - 2].index,
price: i[e - 2].price + this._priceOffset
})
}
return t
}
pointsCount() {
return 3
}
name() {
return "Parallel Channel"
}
hasEditableCoordinates() {
return !1
}
addPoint(e, t) {
var i = this.points().length;
t && t.shift() && 2 === i && this._snapPoint45Degree(e, this.points()[0]);
var r = s.prototype.addPoint.call(this, e, t);
return this._updateThirdPointAndPriceOffset(), r
}
cloneData(e) {
this._priceOffset = e._priceOffset
}
restoreData(e) {
e.priceOffset && (this._priceOffset = e.priceOffset)
}
state(e) {
var t = s.prototype.state.call(this, e);
return t.priceOffset = this._priceOffset, t
}
canHasAlert() {
return !0
}
axisPoints() {
var e = this.points();
return e.length < 2 ? [] : (e[2] = {
index: e[0].index,
price: e[0].price + this._priceOffset
}, e.push({
index: e[1].index,
price: e[1].price + this._priceOffset
}), e)
}
_getAlertPlots() {
var e = [].concat(this._points).splice(0, 2);
function t(e, t) {
return e.index <= t.index ? [e, t] : [t, e]
}
var i, s, r, n, o = t((e = e.concat([{
price: e[0].price + this._priceOffset,
time: e[0].time,
index: e[0].index
}, {
price: e[1].price + this._priceOffset,
time: e[1].time,
index: e[1].index
}]))[0], e[1]),
a = t(e[2], e[3]);
this._priceOffset < 0 ? (s = a, i = o) : (s = o, i = a);
var l = this.properties().extendLeft.value(),
c = this.properties().extendRight.value();
return e[0].index <= e[1].index ? (r = l, n = c) : (r = c, n = l), [this
._linePointsToAlertPlot(i, "Upper", r, n), this._linePointsToAlertPlot(s,
"Lower", r, n)
]
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "VkdP")))
.ParallelChannelDefinitionsViewModel
}
_updateThirdPointAndPriceOffset() {
this._points.length === this.pointsCount() && (void 0 === this._priceOffset && this
.calculatePriceDiff(), this._correctThirdPoint())
}
_correctThirdPoint() {
var e = this._points[0];
this._points[2].index = e.index, this._points[2].price = e.price + this._priceOffset
}
static createProperties(e) {
var t = new r("linetoolparallelchannel", e);
return o._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
t.LineToolParallelChannel = o
},
qckB: function(e, t) {
e.exports =
''
},
qgcf: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "calculateLabelPosition", (function() {
return p
})), i.d(t, "wordWrap", (function() {
return f
})), i.d(t, "TextRenderer", (function() {
return M
}));
var s = i("aO4+"),
r = i("Eyy1"),
n = i("f6yo"),
o = i("Ialn"),
a = i("VdBB"),
l = i("gAom"),
c = i("jFln"),
h = i("ogJP"),
u = i("ikwP"),
d = i("8Uy/");
function p(e, t, i, r, n) {
const o = .5 * (t.x + i.x);
let a = i.y;
return t.y > i.y ? (a -= e.height / 2 + r.y, a = Math.max(e.height / 2, a)) : (a += e
.height / 2 + r.y, a = Math.min(n - e.height / 2, a)), new s.Point(o, a)
}
let _;
function m() {
const e = document.createElement("canvas");
e.width = 0, e.height = 0, _ = Object(r.ensureNotNull)(e.getContext("2d"))
}
function f(e, t, i) {
_ || m(), i = Object(h.isString)(i) ? parseInt(i) : i, e += "";
const s = !Object(h.isNumber)(i) || !isFinite(i) || i <= 0 ? e.split(
/[^\S' '\r\n]*(?:\r\n|\r|\n|$)/) : e.split(/[^\S\r\n]*(?:\r\n|\r|\n|$)/);
if (s[s.length - 1] || s.pop(), !Object(h.isNumber)(i) || !isFinite(i) || i <= 0) return s;
_.font = t;
const r = [];
for (let e = 0; e < s.length; e++) {
const t = s[e],
n = _.measureText(t).width;
if (n <= i) {
r.push(t);
continue
}
const o = t.split(/([-)\]},.!?:;])|(\s+)/);
let a = 0;
for (; o.length;) {
let e = ~~(i / n * (o.length + 2) / 3);
if (e <= 0 || _.measureText(o.slice(0, 3 * e - 1).join("")).width <= i)
for (; _.measureText(o.slice(0, 3 * (e + 1) - 1).join("")).width <= i;) e++;
else
for (; e > 0 && _.measureText(o.slice(0, 3 * --e - 1).join("")).width > i;);
if (e > 0) r.push(o.slice(0, 3 * e - 1).join("")), o.splice(0, 3 * e);
else {
const e = o[0] + (o[1] || "");
if (a = 1 === a ? 1 : ~~(i / _.measureText(e).width * e.length), _.measureText(e
.substr(0, a)).width <= i)
for (; _.measureText(e.substr(0, a + 1)).width <= i;) a++;
else
for (; a > 1 && _.measureText(e.substr(0, --a)).width > i;);
a < 1 && (a = 1), r.push(e.substr(0, a)), o[0] = e.substr(a), o[1] = ""
}
if (_.measureText(o.join("")).width <= i) {
r.push(o.join(""));
break
}
}
}
return r
}
function g(e, t, i) {
if (0 === i) return e.clone();
const r = (e.x - t.x) * Math.cos(i) - (e.y - t.y) * Math.sin(i) + t.x,
n = (e.x - t.x) * Math.sin(i) + (e.y - t.y) * Math.cos(i) + t.y;
return new s.Point(r, n)
}
function b(e, t) {
return t + 2 * P(e) + 2 * y(e)
}
function v(e, t) {
return x(e) * t + C(e) * (t - 1) + 2 * w(e) + 2 * S(e)
}
function S(e) {
return void 0 !== e.boxPaddingVert ? e.boxPaddingVert * I(e) : void 0 !== e.boxPadding ? e
.boxPadding * I(e) : x(e) / 3
}
function y(e) {
return void 0 !== e.boxPaddingHorz ? e.boxPaddingHorz * I(e) : void 0 !== e.boxPadding ? e
.boxPadding * I(e) : x(e) / 3
}
function w(e) {
return (e.backgroundVertInflate || 0) * I(e)
}
function P(e) {
return (e.backgroundHorzInflate || 0) * I(e)
}
function C(e) {
return (e.padding || 0) * I(e)
}
function x(e) {
return Math.ceil(T(e) * I(e))
}
function T(e) {
return e.fontsize || e.fontSize || 30
}
function I(e) {
const t = Math.min(1, Math.max(.2, Math.min(e.scaleX || 1, e.scaleY || 1)));
if (1 === t) return t;
const i = T(e);
return Math.ceil(t * i) / i
}
class M {
constructor(e, t) {
this._data = null, this._internalData = null, this._boxSize = null, this
._linesInfo = null, this._fontInfo = null, this._hittest = t || new a
.HitTestResult(a.HitTestResult.MOVEPOINT, {
areaName: a.AreaName.Text
}), void 0 !== e && this.setData(e)
}
setData(e) {
e.horzTextAlign || (e.horzTextAlign = e.horzAlign),
function(e, t) {
if (null === e || null === t) return null === e == (null === t);
if (void 0 === e.points != (void 0 === t.points)) return !1;
if (void 0 !== e.points && void 0 !== t.points) {
if (e.points.length !== t.points.length) return !1;
for (let r = 0; r < e.points.length; ++r)
if (i = e.points[r], s = t.points[r], i.x !== s.x || i.y !== s.y)
return !1
}
var i, s;
return e.text === t.text && e.vertAlign === t.vertAlign && e.horzAlign === t
.horzAlign && e.horzTextAlign === t.horzTextAlign && e.font === t
.font && e.offsetX === t.offsetX && e.offsetY === t.offsetY && e
.bold === t.bold && e.italic === t.italic && e.fontsize === t
.fontsize && e.fontSize === t.fontSize && e.backgroundRoundRect === t
.backgroundRoundRect && e.forceTextAlign === t.forceTextAlign && e
.wordWrapWidth === t.wordWrapWidth && e.forceCalculateMaxLineWidth === t
.forceCalculateMaxLineWidth && e.padding === t.padding && e.scaleY === t
.scaleY && e.scaleX === t.scaleX && e.highlightBorder === t
.highlightBorder && e.backgroundHorzInflate === t
.backgroundHorzInflate && e.backgroundVertInflate === t
.backgroundVertInflate && e.boxPadding === t.boxPadding && e
.boxPaddingVert === t.boxPaddingVert && e.boxPaddingHorz === t
.boxPaddingHorz && e.angle === t.angle && e.maxHeight === t.maxHeight
}(this._data, e) ? this._data = e : (this._data = e, this._internalData = null,
this._boxSize = null, this._linesInfo = null, this._fontInfo = null)
}
hitTest(e) {
if (null === this._data || void 0 === this._data.points || 0 === this._data.points
.length) return null;
const t = this._data.angle || 0,
{
boxLeft: i,
boxTop: r,
boxWidth: o,
boxHeight: a
} = this._getInternalData(),
l = this._getRotationPoint(),
c = [g(new s.Point(i, r), l, t), g(new s.Point(i + o, r), l, t), g(new s.Point(
i + o, r + a), l, t), g(new s.Point(i, r + a), l, t)];
return Object(n.pointInPolygon)(e, c) ? this._hittest : null
}
doesIntersectWithBox(e) {
return null !== this._data && void 0 !== this._data.points && 0 !== this._data
.points.length && Object(n.pointInBox)(this._data.points[0], e)
}
measure() {
if (null === this._data) return {
width: 0,
height: 0
};
const e = this._getBoxSize();
return {
width: e.boxWidth,
height: e.boxHeight
}
}
rect() {
if (null === this._data) return {
x: 0,
y: 0,
width: 0,
height: 0
};
const e = this._getInternalData();
return {
x: e.boxLeft,
y: e.boxTop,
width: e.boxWidth,
height: e.boxHeight
}
}
setPoints(e, t) {
Object(r.ensureNotNull)(this._data).points = e, this._hittest = t || new a
.HitTestResult(a.HitTestResult.MOVEPOINT)
}
fontStyle(e) {
return null === this._data ? "" : this._getFontInfo().fontStyle
}
wordWrap(e, t, i) {
return f(e, i || this.fontStyle(), t)
}
draw(e, t) {
if (null === this._data || void 0 === this._data.points || 0 === this._data.points
.length) return;
const i = t.pixelRatio,
s = this._getInternalData(),
r = this._getRotationPoint().scaled(i);
e.save(), e.translate(r.x, r.y), e.rotate(this._data.angle || 0), e.translate(-r.x,
-r.y);
const n = this._getFontInfo().fontSize;
e.textBaseline = s.textBaseLine, e.textAlign = s.textAlign, e.font = this
.fontStyle();
const {
scaledLeft: o,
scaledRight: a,
scaledTop: h,
scaledBottom: p
} = function(e, t) {
const i = Math.round(e.boxLeft * t),
s = Math.round(e.boxTop * t);
return {
scaledLeft: i,
scaledRight: i + Math.round(e.boxWidth * t),
scaledTop: s,
scaledBottom: s + Math.round(e.boxHeight * t)
}
}(s, i);
if (this._data.backgroundColor || this._data.borderColor || this._data
.highlightBorder && this._data.wordWrapWidth) {
const t = this._data.borderWidth || Math.max(n / 12, 1),
s = Math.round(t * i),
r = s / 2;
if (this._data.backgroundRoundRect) this._data.backgroundColor && (Object(l
.drawRoundRect)(e, o, h, a - o, p - h, this._data
.backgroundRoundRect * i), e.fillStyle = this._data.backgroundColor,
e.fill()), this._data.borderColor && (Object(l.drawRoundRect)(e, o - r,
h - r, a - o + s, p - h + s, this._data.backgroundRoundRect * i + s
), e.strokeStyle = this._data.borderColor, e.lineWidth = s, e
.stroke());
else if (this._data.backgroundColor && (e.fillStyle = this._data
.backgroundColor, e.fillRect(o, h, a - o, p - h)), this._data
.borderColor || this._data.highlightBorder) {
let t;
this._data.borderColor ? (e.strokeStyle = this._data.borderColor, t = s) : (
e.strokeStyle = this._data.color, Object(c.setLineStyle)(e, d
.LINESTYLE_DASHED), t = Math.max(1, Math.floor(i))), e
.lineWidth = t, e.beginPath(), e.moveTo(o - t / 2, h - t / 2), e.lineTo(
o - t / 2, p + t / 2), e.lineTo(a + t / 2, p + t / 2), e.lineTo(a +
t / 2, h - t / 2), e.lineTo(o - t / 2, h - t / 2), e.stroke()
}
}
e.fillStyle = this._data.color;
const _ = (o + Math.round(s.textStart * i)) / i,
m = .05 * n;
let f = (h + Math.round((s.textTop + m) * i)) / i;
const g = C(this._data),
b = this._getLinesInfo();
for (const t of b.lines) Object(u.drawScaled)(e, i, () => e.fillText(t, _, f)), f +=
n + g;
e.restore()
}
_getLinesMaxWidth(e) {
if (_ || m(), _.textBaseline = "alphabetic", _.font = this.fontStyle(), null !==
this._data && this._data.wordWrapWidth && !this._data.forceCalculateMaxLineWidth
) return this._data.wordWrapWidth * I(this._data);
let t = 0;
for (const i of e) t = Math.max(t, _.measureText(i).width);
return t
}
_getInternalData() {
if (null !== this._internalData) return this._internalData;
const e = Object(r.ensureNotNull)(this._data),
t = this._getBoxSize(),
i = t.boxWidth,
s = t.boxHeight,
n = Object(r.ensureDefined)(e.points)[0];
let a = n.y;
switch (e.vertAlign) {
case "bottom":
a -= s + e.offsetY;
break;
case "middle":
a -= s / 2;
break;
case "top":
a += e.offsetY
}
let l = n.x;
const c = y(e),
h = S(e),
u = P(e) + c;
let d;
const p = a + (w(e) + h) + x(e) / 2;
let _;
switch (e.horzAlign) {
case "left":
l += e.offsetX;
break;
case "center":
l -= i / 2;
break;
case "right":
l -= i + e.offsetX
}
switch (Object(r.ensureDefined)(e.horzTextAlign)) {
case "left":
_ = "start", d = l + u, Object(o.isRtl)() && (e.forceTextAlign ? _ =
"left" : (d = l + i - u, _ = "right"));
break;
case "center":
_ = "center", d = l + i / 2;
break;
case "right":
_ = "end", d = l + i - u, Object(o.isRtl)() && e.forceTextAlign && (_ =
"right")
}
return this._internalData = {
boxLeft: l,
boxTop: a,
boxWidth: i,
boxHeight: s,
textStart: d - l,
textTop: p - a,
textAlign: _,
textBaseLine: "middle"
}, this._internalData
}
_getLinesInfo() {
if (null === this._linesInfo) {
const e = Object(r.ensureNotNull)(this._data);
let t = this.wordWrap(e.text, e.wordWrapWidth);
if (void 0 !== e.maxHeight) {
const i = function(e) {
const t = Object(r.ensureDefined)(e.maxHeight),
i = x(e),
s = C(e);
return Math.floor((t + s) / (i + s))
}(e);
t.length > i && (t = t.slice(0, i))
}
this._linesInfo = {
linesMaxWidth: this._getLinesMaxWidth(t),
lines: t
}
}
return this._linesInfo
}
_getFontInfo() {
if (null === this._fontInfo) {
const e = Object(r.ensureNotNull)(this._data),
t = x(e),
i = (e.bold ? "bold " : "") + (e.italic ? "italic " : "") + t + "px " + e
.font;
this._fontInfo = {
fontStyle: i,
fontSize: t
}
}
return this._fontInfo
}
_getBoxSize() {
if (null === this._boxSize) {
const e = this._getLinesInfo(),
t = Object(r.ensureNotNull)(this._data);
this._boxSize = {
boxWidth: b(t, e.linesMaxWidth),
boxHeight: v(t, e.lines.length)
}
}
return this._boxSize
}
_getRotationPoint() {
const {
boxLeft: e,
boxTop: t,
boxWidth: i,
boxHeight: n
} = this._getInternalData(), {
horzAlign: o,
vertAlign: a
} = Object(r.ensureNotNull)(this._data);
let l, c;
switch (o) {
case "center":
l = e + i / 2;
break;
case "left":
l = e;
break;
case "right":
l = e + i
}
switch (a) {
case "middle":
c = t + n / 2;
break;
case "top":
c = t;
break;
case "bottom":
c = t + n
}
return new s.Point(l, c)
}
}
},
qySK: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return u
})), i.d(t, "a", (function() {
return d
}));
var s = i("Eyy1"),
r = i("JmuD"),
n = i("KG+6"),
o = i("fFKx"),
a = i("SqfW"),
l = i("5vwb"),
c = i("7Fue"),
h = i("xWfy");
function u(e) {
if (!Object(r.isObject)(e)) throw new Error(
"Graphics commands should be wrapped in an object");
if (Object(r.hasProperty)(e, "create"), Object(r.hasProperty)(e, "erase")) {
const t = e.erase;
Object(s.assert)(Array.isArray(t), "Collection of erase commands should be array");
for (const e of t) {
if (!Object(r.isObject)(e) || !Object(r.hasProperty)(e, "action")) throw new Error(
"Command should be an object with 'action' property");
Object(s.assert)("all" === e.action || "one" === e.action,
"Erase command action should be 'all' or 'one'")
}
}
return e
}
class d {
constructor() {
this._indexes = [], this._horizlines = new Map, this._vertlines = new Map, this
._lines = new Map, this._hlines = new Map, this._textmarks = new Map, this
._shapemarks = new Map, this._backgrounds = new Map, this._polygons = new Map,
this._trendchannels = new Map, this._hhists = new Map, this._dwglabels =
new Map, this._dwgboxes = new Map, this._dwglines = new Map, this._dwgtables =
new Map, this._dwgtablecells = new Map, this._hhistsByTimePointIndex = new Map
}
horizlines() {
return this._horizlines
}
vertlines() {
return this._vertlines
}
lines() {
return this._lines
}
hlines() {
return this._hlines
}
textmarks() {
return this._textmarks
}
shapemarks() {
return this._shapemarks
}
backgrounds() {
return this._backgrounds
}
polygons() {
return this._polygons
}
trendchannels() {
return this._trendchannels
}
hhists() {
return this._hhists
}
dwglabels() {
return this._dwglabels
}
dwglines() {
return this._dwglines
}
dwgboxes() {
return this._dwgboxes
}
dwgtables() {
return this._dwgtables
}
dwgtablecells() {
return this._dwgtablecells
}
hhistsByTimePointIndex() {
return this._hhistsByTimePointIndex
}
clear() {
this._indexes = [], this._clearPrimitives()
}
extract() {
const e = e => e.extract(),
t = {
indexes: this._indexes,
horizlines: _(this._horizlines, e),
vertlines: _(this._vertlines, e),
lines: _(this._lines, e),
hlines: _(this._hlines, e),
textmarks: _(this._textmarks, e),
shapemarks: _(this._shapemarks, e),
backgrounds: _(this._backgrounds, e),
polygons: _(this._polygons, e),
trendchannels: _(this._trendchannels, e),
hhists: _(this._hhists, e),
dwglabels: _(this._dwglabels, e),
dwglines: _(this._dwglines, e),
dwgboxes: _(this._dwgboxes, e),
dwgtables: _(this._dwgtables, e),
dwgtablecells: _(this._dwgtablecells, e)
};
return this._hhistsByTimePointIndex = new Map, new h.a("data", t)
}
replaceIndexesTo(e) {
this._indexes = e;
const t = e => e.replaceIndexesTo(this._indexes);
this._horizlines.forEach(t), this._vertlines.forEach(t), this._lines.forEach(t),
this._hlines.forEach(t), this._textmarks.forEach(t), this._shapemarks.forEach(
t), this._backgrounds.forEach(t), this._polygons.forEach(t), this
._trendchannels
.forEach(t), this._hhists.forEach(t), this._dwglabels.forEach(t), this._dwgboxes
.forEach(t), this._dwglines.forEach(t), this._dwgtables.forEach(t), this
._dwgtablecells.forEach(t), this._hhistsByTimePointIndex = Object(c.b)(this
._hhists)
}
processCommands(e, t) {
void 0 !== e.erase && this._processEraseCommands(e.erase), void 0 !== e.create &&
this._processCreateCommands(e.create, t)
}
_processCreateCommands(e, t) {
for (const i in e) {
if (!e.hasOwnProperty(i)) continue;
const r = i;
switch (Object(s.assert)(r in t,
`There is a '${r}' in study response, but it doesn't present in graphics info!`
), r) {
case "hhists":
m(this._hhists, e[r], t[r], this._indexes, n.d);
break;
case "horizlines":
m(this._horizlines, e[r], t[r], this._indexes, o.b);
break;
case "vertlines":
m(this._vertlines, e[r], t[r], this._indexes, a.b);
break;
case "polygons":
m(this._polygons, e[r], t[r], this._indexes, l.b)
}
}
this._hhistsByTimePointIndex = Object(c.b)(this._hhists)
}
_processEraseCommands(e) {
for (const t of e)
if ("all" === t.action) this._clearPrimitives();
else {
const e = e => e.deleteById(t.id);
switch (t.type) {
case "horizlines":
this._horizlines.forEach(e);
break;
case "vertlines":
this._vertlines.forEach(e);
break;
case "lines":
this._lines.forEach(e);
break;
case "hlines":
this._hlines.forEach(e);
break;
case "textmarks":
this._textmarks.forEach(e);
break;
case "shapemarks":
this._shapemarks.forEach(e);
break;
case "backgrounds":
this._backgrounds.forEach(e);
break;
case "polygons":
this._polygons.forEach(e);
break;
case "trendchannels":
this._trendchannels.forEach(e);
break;
case "hhists":
this._hhists.forEach(e);
break;
case "dwglabels":
this._dwglabels.forEach(e);
break;
case "dwglines":
this._dwglines.forEach(e);
break;
case "dwgboxes":
this._dwgboxes.forEach(e);
break;
case "dwgtables":
this._dwgtables.forEach(e);
break;
case "dwgtablecells":
this._dwgtablecells.forEach(e)
}
} this._hhistsByTimePointIndex = Object(c.b)(this._hhists)
}
_clearPrimitives() {
this._horizlines.clear(), this._vertlines.clear(), this._lines.clear(), this._hlines
.clear(), this._textmarks.clear(), this._shapemarks.clear(), this._backgrounds
.clear(), this._polygons.clear(), this._trendchannels.clear(), this._hhists
.clear(), this._dwglabels.clear(), this._dwgboxes.clear(), this._dwglines
.clear(), this._dwgtables.clear(), this._dwgtablecells.clear(),
this._hhistsByTimePointIndex = new Map
}
}
class p {
constructor(e, t) {
this._primitivesDataById = new Map, this._primitiveById = new Map, this
._materializePrimitive = e, this._indexes = t
}
forEach(e, t) {
this._primitiveById.forEach(i => {
e.call(t, i, i, this)
})
}
has(e) {
let t = !1;
return this._primitiveById.forEach(i => {
t = t || i === e
}), t
}
get size() {
return this._primitiveById.size
} [Symbol.iterator]() {
throw new Error("Not implemented")
}
entries() {
throw new Error("Not implemented")
}
keys() {
throw new Error("Not implemented")
}
values() {
throw new Error("Not implemented")
}
hasId(e) {
return this._primitiveById.has(e)
}
addData(e) {
this._primitivesDataById.set(e.id, e), this._tryMaterialize(e)
}
deleteById(e) {
this._primitiveById.delete(e), this._primitivesDataById.delete(e)
}
clear() {
this._primitivesDataById.clear(), this._primitiveById.clear()
}
replaceIndexesTo(e) {
this._indexes = e, this._primitiveById.clear(), this._primitivesDataById.forEach(
this._tryMaterialize, this)
}
extract() {
const e = new Set(this._primitivesDataById.values());
return this._primitivesDataById = new Map, this._primitiveById.clear(), e
}
_tryMaterialize(e) {
const t = this._materializePrimitive(e, this._indexes);
null !== t && (Object(s.assert)(!this._primitiveById.has(e.id),
"primitive with specified id should not exist"), this._primitiveById
.set(e.id, t))
}
}
function _(e, t) {
const i = new Map;
return e.forEach((e, s) => i.set(s, t(e))), i
}
function m(e, t, i, r, n) {
if (void 0 !== t)
for (const o of t) {
const t = o.styleId;
void 0 !== i && Object(s.assert)(t in i,
"Every style used by graphics primitive should be declared in study metainfo"
);
let a = e.get(t);
void 0 === a && (a = new p(n, r), e.set(t, a)), o.data.forEach(a.addData.bind(a))
}
}
},
rCHB: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "LineToolPitchforkStyle", (function() {
return s
})),
function(e) {
e[e.Original = 0] = "Original", e[e.Schiff = 1] = "Schiff", e[e.Inside = 2] = "Inside",
e[e.Schiff2 = 3] = "Schiff2"
}(s || (s = {}))
},
rL76: function(e, t, i) {
e.exports = {
labelwidth: "19px",
labelheight: "19px",
bordersize: "2px",
bottommargin: "5px",
gearheight: "15px",
gearwidth: "15px",
"price-axis-stub": "price-axis-stub-1DJMiIgd",
wrapper: "wrapper-1DJMiIgd",
label: "label-1DJMiIgd",
symbol: "symbol-1DJMiIgd",
gear: "gear-1DJMiIgd",
"fixed-gear": "fixed-gear-1DJMiIgd",
"fixed-symbol": "fixed-symbol-1DJMiIgd"
}
},
rQHv: function(e, t, i) {
"use strict";
var s = i("IiTo"),
r = {};
e.exports = function(e, t, i) {
var n, o, a = {},
l = r[i] || "out_of_session",
c = !1,
h = i,
u = t,
d = null;
function p() {
var e = {};
e.symbolname = h, e.status = "ok", e.values = {}, e.values.current_session = l, r[
h] = l, TradingView.ChartapiMessagerInstances[u].onQuotesData([u].concat([
e]))
}
function _() {
if (n)
if (o) l = "out_of_session";
else {
var e = s.isTradingNow((new Date).getTime(), n) ? "market" :
"out_of_session";
e !== l && (l = e, p())
}
}
return e(i, null, (function(e) {
c || function(e) {
n = new s.SessionInfo(e.timezone, e.session, e.session_holidays,
e.corrections), o = e.expired, d = setInterval(_, 6e4),
_(), p()
}(e)
}), (function() {})), a.stop = function() {
c = !0, d && clearInterval(d)
}, a.marketStatus = function() {
return l
}, a
}
},
rWtV: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("Eyy1"),
r = i("Y7w9");
class n {
constructor() {
this._histPos = -1,
this._hist = new Float64Array(2e3), this._times = new Float64Array(2e3)
}
addHist(e) {
if (this._histPos >= 0) {
const t = this._times[this._histPos];
Object(s.assert)(t <= e, "History order violation"), this._histPos += t === e ?
0 : 1
} else this._histPos += 1;
if (this._histPos === this._hist.length) {
const e = new Float64Array(2 * this._hist.length);
e.set(this._hist), this._hist = e;
const t = new Float64Array(this._hist.length);
t.set(this._times), this._times = t
}
this._hist[this._histPos] = NaN, this._times[this._histPos] = e
}
removeLastIfNaN() {
Number.isNaN(this.get(0)) && (this._histPos -= 1)
}
get(e) {
Object(s.assert)(0 === e);
const t = this._histPos - e;
return this._hist[t]
}
getLeftOrEqual(e) {
const t = Object(r.upperbound)(this._times, e, (e, t) => e < t, 0, this._histPos +
1);
return 0 === t ? NaN : this._hist[t - 1]
}
set(e) {
this._hist[this._histPos] = e
}
indexOf(e) {
throw new Error("Not implemented")
}
}
},
rY0k: function(e, t, i) {
"use strict";
var s = i("xDuj").translatedIntervalString,
r = i("hOqT").getTranslatedSymbolDescription,
n = i("zDbI").CHART_FONT_FAMILY,
o = i("di4O"),
a = o.watermarkProperty,
l = o.restoreWatermarkPropertyDefaults,
c = i("ikwP").drawScaled,
h = i("wZIs").applyDefaultsOverrides,
u = i("wZIs").applyPropertiesOverrides;
t.Watermark = function(e, t) {
var i = {},
o = a();
function d(e, t) {
var s = e.font;
return i.hasOwnProperty(s) || (i[s] = {}), i[s].hasOwnProperty(t) || (i[s][t] = e
.measureText(t).width), i[s][t]
}
h(o, void 0, !1, "symbolWatermarkProperties"), o.listeners().subscribe(this, (
function() {
e.updateSource(this)
})), this.destroy = function() {
o.listeners().unsubscribeAll(this)
}, this.properties = function() {
return o
}, this.restorePropertiesDefaults = function() {
l()
}, this.applyOverrides = function(e) {
u(o, void 0, !1, e, "symbolWatermarkProperties")
};
var p = {
renderer: function(e, i) {
return {
draw: function(a, l) {
c(a, l.pixelRatio, (function() {
var l = t.symbolInfo();
a.fillStyle = o.color.value();
var c, h = l.name;
/QUANDL/.test(l.exchange) && ((c = h.split(
/\//)).length && (h = c[c
.length - 1]));
for (var u = {
description: l.description,
short_description: l
.short_description,
pro_name: l.pro_name,
short_name: l.name,
local_description: l
.local_description,
language: l.language
}, p = [{
text: h ? h + ", " + s(t
.interval()) : "",
font: "96px " + n,
lineHeight: 117,
vertOffset: 0
}, {
text: r(u) || "",
font: "48px " + n,
lineHeight: 58,
vertOffset: 5
}], _ = 0, m = 0; m < p.length; m++) {
if ((b = p[m]).text) {
a.font = b.font;
var f = d(a, b.text);
b.zoom = f > i ? i / f : 1, _ += b
.lineHeight * b.zoom
}
}
var g = Math.max((e - _) / 2, 0);
for (m = 0; m < p.length; m++) {
var b;
(b = p[m]).text && (a.save(), a
.translate(i / 2, g), a
.textBaseline = "top", a
.textAlign = "center", a.font =
b.font, a.scale(b.zoom, b.zoom),
a.fillText(b.text, 0, b
.vertOffset), a.restore(),
g += b.lineHeight * b.zoom)
}
}))
}
}
},
update: function() {}
};
this.paneViews = function() {
return t.symbolInfo() && o.visibility.value() ? [p] : []
}
}
},
ri5u: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ChartLoadThemeUndoCommand", (function() {
return d
}));
var s = i("FIi8"),
r = i("Ocx9"),
n = i("wZIs"),
o = i("RDU5");
function a(e) {
const {
visible: t,
...i
} = e;
return i
}
function l(e) {
const {
visible: t,
...i
} = e;
return i
}
function c(e) {
const {
visible: t,
style: i,
symbol: s,
interval: r,
sessionId: n,
highLowAvgPrice: o,
showCountdown: c,
bidAsk: h,
prePostMarket: u,
...d
} = e;
return {
bidAsk: a(h),
prePostMarket: l(u),
...d
}
}
function h(e) {
const {
scaleSeriesOnly: t,
showSeriesLastValue: i,
showStudyLastValue: s,
showSymbolLabels: r,
showBidAskLabels: n,
showPrePostMarketPriceLabel: o,
showStudyPlotLabels: a,
showFundamentalNameLabel: l,
showFundamentalLastValue: c,
seriesLastValueMode: h,
...u
} = e;
return u
}
function u(e) {
const {
topMargin: t,
bottomMargin: i,
...s
} = e;
return s
}
class d extends o.UndoCommand {
constructor(e, t, i) {
var r, o, a;
super("Apply Chart Theme"), this._model = e, this._newSessionProps = t
.sessions || Object(n.factoryDefaults)("sessions"), ["candleStyle",
"hollowCandleStyle", "haStyle"
].forEach(e => {
t.mainSourceProperties[e].wickUpColor = t.mainSourceProperties[e]
.wickUpColor || t.mainSourceProperties[e].wickColor, t
.mainSourceProperties[e].wickDownColor = t.mainSourceProperties[
e].wickDownColor || t.mainSourceProperties[e].wickColor
}), t.chartProperties = null !== (r = t.chartProperties) && void 0 !== r ?
r : {
paneProperties: void 0,
scalesProperties: void 0
}, t.chartProperties.paneProperties.vertGridProperties = null !== (o = t
.chartProperties.paneProperties.vertGridProperties) && void 0 !== o ?
o : t.chartProperties.paneProperties.gridProperties, t.chartProperties
.paneProperties.horzGridProperties = null !== (a = t.chartProperties
.paneProperties.horzGridProperties) && void 0 !== a ? a : t
.chartProperties.paneProperties.gridProperties, t.chartProperties
.paneProperties.legendProperties = this._model.properties().state()
.paneProperties.legendProperties;
const l = Object(n.factoryDefaults)("chartproperties"),
d = Object(s.deepExtend)({}, l, t.chartProperties);
this._newChartProps = {
paneProperties: u(d.paneProperties),
scalesProperties: h(d.scalesProperties)
}, e.timeScale().preserveBarSpacing() && delete this._newChartProps
.scalesProperties.barSpacing;
const p = Object(n.factoryDefaults)("chartproperties.mainSeriesProperties"),
_ = Object(s.deepExtend)({}, p, t.mainSourceProperties);
this._newSeriesProps = i ? _ : c(_);
const m = e.properties().state();
this._oldChartProps = {
paneProperties: u(m.paneProperties),
scalesProperties: h(m.scalesProperties)
}, this._oldSeriesProps = c(e.mainSeries().properties().state()), this
._oldSessionProps = this._model.sessions().properties().state()
}
undo() {
this._merge(this._oldChartProps, this._oldSeriesProps, this._oldSessionProps),
this._model.mainSeries().onChartStyleChanged(), this._model.updateScales(),
this._model.chartThemeLoaded()
}
redo() {
this._merge(this._newChartProps, this._newSeriesProps, this._newSessionProps),
this._model.mainSeries().onChartStyleChanged(), this._model.updateScales(),
this._model.chartThemeLoaded()
}
_merge(e, t, i) {
var s, n, o, a;
const l = this._model;
Object(r.saveDefaultProperties)(!0), e && (l.properties().paneProperties
.mergeAndFire(e.paneProperties), l.properties().scalesProperties
.mergeAndFire(e.scalesProperties)), l.mainSeries().priceScale()
.setMode({
autoScale: null === (s = t.priceAxisProperties) || void 0 === s ?
void 0 : s.autoScale,
percentage: null === (n = t.priceAxisProperties) || void 0 === n ?
void 0 : n.percentage,
log: null === (o = t.priceAxisProperties) || void 0 === o ? void 0 :
o.log,
lockScale: null === (a = t.priceAxisProperties) || void 0 === a ?
void 0 : a.lockScale
}), l.mainSeries().properties().mergeAndFire(t), l.mainSeries().properties()
.saveDefaults(),
l.mainSeries().createPaneView(), l.mainSeries().invalidateBarStylesCache(),
l.recalculateAllPanes(), l.fullUpdate(), l.properties().saveDefaults(), l
.sessions().restoreState({
properties: i
}, !1), Object(r.saveDefaultProperties)(!1)
}
}
},
s1Gx: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "specialZOrderBase", (function() {
return s
})), i.d(t, "sortSourcesPreOrdered", (function() {
return r
})), i.d(t, "sortSources", (function() {
return n
}));
const s = 1e7,
r = {
ChartEventsSource: s + 1,
Dividends: s + 2,
Splits: s + 3,
Earnings: s + 4,
LineToolOrder: s + 5,
LineToolPosition: s + 6,
LineToolExecution: s + 7,
AlertLabel: s + 8
};
function n(e) {
return [...e].sort((e, t) => e.zorder() - t.zorder())
}
},
s9sR: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SetResolutionUndoCommand", (function() {
return o
}));
var s = i("RDU5"),
r = i("LxhU"),
n = i("n5al");
class o extends s.UndoCommand {
constructor(e, t, i, s) {
super(s), this._property = e, this._value = t, this._prevValue = e.value(), this
._chartWidget = i
}
redo() {
this._chartWidget.screen.show(), this._property.setValue(this._value), this
._handleResolution(this._value)
}
undo() {
this._chartWidget.screen.show(), this._property.setValue(this._prevValue), this
._handleResolution(this._prevValue)
}
_handleResolution(e) {
const t = this._chartWidget.model().mainSeries().properties(),
i = t.style.value(),
s = Object(n.isRangeStyle)(i),
o = r.Interval.isRange(e);
!s && o ? t.style.setValue(11) : s && !o && t.style.setValue(Object(n
.getLastUsedStyle)())
}
}
},
sDZI: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "sessionsPreferencesDefault", (function() {
return r
}));
var s = i("HGP3");
const r = {
graphics: {
backgrounds: {
outOfSession: {
color: s.colorsPalette["color-tv-blue-500"],
transparency: 92,
visible: !1
},
preMarket: {
color: "#FF9800",
transparency: 92,
visible: !1
},
postMarket: {
color: s.colorsPalette["color-tv-blue-500"],
transparency: 92,
visible: !1
}
},
vertlines: {
sessBreaks: {
color: "#4985e7",
style: 2,
visible: !1,
width: 1
}
}
}
}
},
sEk5: function(e, t, i) {
"use strict";
var s = i("fTGZ").BarsMarksContainer,
r = i("mMWL"),
n = i("CCPt").UserDefinedBarsMarksTooltip;
e.exports = class extends s {
constructor(e) {
super(e), this.toolname = "UserDefinedBarsMarks";
var t = this;
r.hideMarksOnBars().subscribe(this, (function() {
t._properties.visible.setValue(!r.hideMarksOnBars().value())
}))
}
_initialize(e) {
this._properties.visible.setValue(!0)
}
userEditEnabled() {
return !1
}
_plateViewData(e) {
var t = {
text: e.text
};
return "object" == typeof e.color && (t.theme = "user_defined_theme", t
.overridedTheme = {}, t.overridedTheme.border = e.color.border, t
.overridedTheme.background = e.color.background), t
}
onClicked(e) {
var t = e.id;
this._marks[t].onClicked()
}
clearMarks() {
super.clearMarks(), this.onNeedRepaint.fire()
}
_getData(e) {
var t = this._model.mainSeries().symbolInfo();
if (t) {
var i = this.roundRange(this._rangeDifference(e)),
s = this,
r = this._model.mainSeries().properties().interval.value();
ChartApiInstance.getMarks(t, i.start, i.end, (function(t) {
t.forEach((function(e) {
s._marks[e.id] = e
}), s), s._loadedRange = s._rangeUnion(e, s
._loadedRange), s.onNeedRepaint.fire()
}), r)
}
}
_createTooltip() {
return new n
}
updatePlateData(e, t) {
return t.barWidth = this.barWidth(), t.text = e.text, t.tooltipMargin = -1 *
Math.max(e.minSize / 2, .4 * this.barWidth()), t
}
hasContextMenu() {
return !1
}
calcIsActualCurrency() {
this._isActualCurrency = !0
}
calcIsActualUnit() {
this._isActualUnit = !0
}
}
},
sJA2: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ThemesApi", (function() {
return n
}));
var s = i("EsvI"),
r = i("oiZD");
class n {
constructor(e) {
this._opts = e
}
isStdTheme() {
const e = this._opts.chartWidgetCollection.getAll().every(e => Object(s.isStdTheme)(
Object(s.extractThemeFromModel)(e.model())));
return Promise.resolve(e)
}
async setStdTheme(e, t = !0, i) {
await Object(s.loadTheme)(e, !0, !1, this._opts.chartWidgetCollection, t, i)
}
setStdThemeForLayout(e, t = !0) {
Object(r.setTheme)(e), t && Object(s.syncTheme)()
}
getCurrentThemeName() {
return Object(s.getCurrentTheme)().name
}
}
},
sQaR: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
}));
var s = i("hY0g"),
r = i.n(s);
class n {
constructor() {
this._container = document.createElement("div"), this._visibility = new r.a(!1)
}
visible() {
return this._visibility.readonly()
}
_setVisibility(e) {
this._visibility.setValue(e)
}
}
},
t2ex: function(e, t, i) {
"use strict";
var s = i("5rJj"),
r = i("Ss5c").LineDataSource,
n = i("j3hX"),
o = n.LineToolWidthsProperty,
a = n.LineToolColorsProperty;
class l extends r {
constructor(e, t) {
super(e, t || l.createProperties()), this.version = l.version, this._properties
._stateVersion = 1, i.e("lt-pane-views").then(i.t.bind(null, "R7Bt", 7)).then(({
FibRetracementPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return l.LevelsCount
}
pointsCount() {
return 2
}
name() {
return "Fib Retracement"
}
migrateVersion(e, t, i) {
1 === e && this.properties().extendLines.setValue(!0)
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "17v9")))
.FibDrawingsWith24LevelsDefinitionsViewModel
}
static createProperties(e) {
var t = new s("linetoolfibretracement", e, !1, {
range: [1, 24],
names: ["coeff", "color", "visible"]
});
return l._configureProperties(t), t
}
static _configureProperties(e) {
r._configureProperties(e);
for (var t = [e.child("trendline").child("linewidth"), e.child("levelsStyle").child(
"linewidth")], i = [e.child("trendline").child("color")], s = 1; s <= l
.LevelsCount; s++) i.push(e.child("level" + s).child("color"));
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
}
fibLevelsBasedOnLogScale() {
return this.properties().fibLevelsBasedOnLogScale.value() && this.priceScale()
.isLog()
}
}
l.version = 2, l.LevelsCount = 24, t.LineToolFibRetracement = l
},
tDUI: function(e, t, i) {
"use strict";
(function(e) {
var s = i("Eyy1").ensureNotNull,
r = i("Ss5c").LineDataSource,
n = i("gMtF").LineToolRiskRewardPriceAxisView,
o = i("mMWL"),
a = i("Ocx9").DefaultProperty,
l = i("zXvd").NumericFormatter,
c = i("wGNx").RiskRewardPointIndex,
h = i("H007"),
u = h.RiskRewordEntryPriceProperty,
d = h.RiskRewordStopPriceProperty,
p = h.RiskRewardTargetPriceProperty,
_ = i("ogJP").isNumber,
m = i("k9/m").PlotRowSearchMode;
class f extends r {
constructor(t, s) {
var r = s;
if (super(t, r), !s.stopLevel && !s.profitLevel) {
var o = t.timeScale().visibleBarsStrictRange(),
a = o.firstBar(),
h = o.lastBar(),
_ = t.mainSeries().priceRange(a, h),
m = t.mainSeries().priceScale();
if (m.isLog()) {
var g = m.logicalToPrice(_.minValue()),
b = m.logicalToPrice(_.maxValue());
_ = new e(g, b)
}
if (_ && !_.isEmpty()) {
var v = Math.round(.2 * _.length() * t.mainSeries().base());
r.merge({
stopLevel: v,
profitLevel: v
})
}
}
var S = this;
r.stopLevel.listeners().subscribe(this, this.recalculate), r.stopLevel
.listeners().subscribe(null, (function() {
S.properties().stopPrice._listeners.fire(S.properties()
.stopPrice)
})), r.profitLevel.listeners().subscribe(this, this.recalculate), r
.profitLevel.listeners().subscribe(null, (function() {
S.properties().targetPrice._listeners.fire(S.properties()
.targetPrice)
})), r.addChild("entryPrice", new u(this)), r.addChild("stopPrice",
new d(this)), r.addChild("targetPrice", new p(this)), r.addProperty(
"riskSize", 0), r.addProperty("qty", 0), r.addProperty(
"amountTarget", r.accountSize.value()), r.addProperty("amountStop",
r.accountSize.value()), this._riskInPercentsFormatter = new l(2),
this._riskInMoneyFormatter = new l, r.risk.subscribe(this, this
._recalculateRiskSize), r.accountSize.subscribe(this, this
._recalculateRiskSize), r.riskDisplayMode.subscribe(this, this
._recalculateRisk), r.riskDisplayMode.subscribe(this, this
._recalculateRiskSize), r.entryPrice.subscribe(this, this
._recalculateRiskSize), r.stopPrice.subscribe(this, this
._recalculateRiskSize), r.profitLevel.subscribe(this, this
._recalculateRiskSize), r.profitLevel.subscribe(this, this
.syncPriceLevels.bind(this)), r.stopLevel.subscribe(this, this
._recalculateRiskSize), r.stopLevel.subscribe(this, this
.syncPriceLevels.bind(this)), r.qty.subscribe(this, this
._recalculateRiskSize), this.pointAdded().subscribe(this, e => {
switch (e) {
case c.Entry:
case c.Close:
this._recalculateRiskSize()
}
}), this.pointChanged().subscribe(this, e => {
switch (e) {
case c.Entry:
case c.Close:
this._recalculateRiskSize()
}
}), "percents" === r.riskDisplayMode.value() && r.risk.value() > 100 &&
r.riskDisplayMode.setValueSilently("money"), this
._syncStateExclusions = ["points", "entryPrice", "stopPrice",
"targetPrice", "stopLevel", "profitLevel", "riskSize", "qty",
"amountTarget", "amountStop", "risk", "accountSize"
], this.version = f.version, this._entryPriceAxisView = new n(this, {
colorProperty: r.linecolor,
priceProperty: r.entryPrice
}), this._stopPriceAxisView = new n(this, {
colorProperty: r.stopBackground,
priceProperty: r.stopPrice
}), this._profitPriceAxisView = new n(this, {
colorProperty: r.profitBackground,
priceProperty: r.targetPrice
}), i.e("lt-pane-views").then(i.t.bind(null, "u+oH", 7)).then(({
RiskRewardPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
riskFormatter(e) {
return "percents" === e ? this._riskInPercentsFormatter : this
._riskInMoneyFormatter
}
getRiskStep(e) {
return "percents" === e ? .01 : 1
}
_roundValue(e) {
return parseFloat(e.toFixed(2))
}
hasEditableCoordinates() {
return !1
}
_recalculateRisk() {
var e = this.properties(),
t = e.riskDisplayMode.value(),
i = e.riskSize.value(),
s = e.accountSize.value(),
r = e.risk.value();
r = "percents" === t ? this._roundValue(i / s * 100) : this._roundValue(s /
100 * r), this._riskInChange = !0,
e.risk.setValue(this.riskFormatter(t).format(r)), this._riskInChange = !
1
}
_recalculateRiskSize() {
if (!this._riskInChange) {
var e = this.properties(),
t = e.risk.value(),
i = e.riskDisplayMode.value(),
s = e.accountSize.value();
"percents" === i ? e.riskSize.setValue(t / 100 * s) : t > s ? (e.risk
.setValue(s), e.riskSize.setValue(s)) : e.riskSize.setValue(t)
}
}
lastBarData() {
var e = this._model.mainSeries().bars().firstIndex(),
t = this._model.mainSeries().bars().lastIndex();
if (null === e || null === t || isNaN(e) || isNaN(t)) return null;
var i = this.points();
if (4 === i.length) {
var s = i[c.ActualClose];
return s.index < e ? null : {
closePrice: s.price,
index: Math.min(t, s.index)
}
}
var r = i[c.Close];
if (r.index < e) return null;
var n = Math.min(t, r.index),
o = this._model.mainSeries().bars().search(n, m.NearestLeft);
return null === o ? null : {
closePrice: o.value[TradingView.CLOSE_PLOT],
index: o.index
}
}
migrateVersion(e, t, i) {
if (1 === e && this._points.length >= 1) {
var s = [];
if (s.push(this._points[0]), n = {
price: (n = this._points[0]).price,
index: this._getClosePointIndex(n.index)
}, s.push(n), this._points[1] && s.push(this._points[1]), this
._points[2] && s.push(this._points[2]), this._points = s, this
._timePoint.length >= 1) {
var r = [],
n = this._timePoint[0];
r.push(n);
var o = {
price: n.price,
time_t: n.time_t,
offset: this._getClosePointIndex(n.offset)
};
r.push(o), this._timePoint[1] && s.push(this._points[1]), this
._timePoint[2] && s.push(this._points[2]), this._timePoint = r
}
}
}
checkAlert() {
this.recalculate()
}
priceAxisViews(e, t) {
return this.isSourceHidden() || t !== this.priceScale() || this._model
.paneForSource(this) !== e ? null : [this._entryPriceAxisView, this
._stopPriceAxisView, this._profitPriceAxisView
]
}
updateAllViews() {
this.isActualSymbol() && this._properties.visible.value() && (o
.hideAllDrawings().value() && this.userEditEnabled() || (super
.updateAllViews(), this._entryPriceAxisView.update(), this
._stopPriceAxisView.update(), this._profitPriceAxisView.update()
))
}
restoreExternalState(e) {
(e = Object.assign({}, e), this.isActualSymbol()) || _(e.entryPrice) && (
this._timePoint[0].price = e.entryPrice, delete e.entryPrice);
this.properties().merge(e)
}
_changeEntryPoint(e) {
var t = this.properties().stopPrice.value(),
i = this.properties().targetPrice.value(),
s = 1 / this._model.mainSeries().base(),
r = Math.min(t, i) + s,
n = Math.max(t, i) - s;
e.price = Math.max(r, Math.min(n, this._roundPrice(e.price))), super
.setPoint(0, e), this.properties().stopPrice.setValue(t), this
.properties().targetPrice.setValue(i)
}
setPoint(e, t, i) {
if (this.isActualSymbol()) {
switch (this._muteSyncLineStyle(), e) {
case 0:
this._changeEntryPoint(t);
break;
case 2:
this.properties().stopPrice.setValue(this.preparseStopPrice(t
.price));
break;
case 3:
this.properties().targetPrice.setValue(this.preparseProfitPrice(
t.price));
break;
case 1:
t.price = this._roundPrice(t.price), super.setPoint(1, t), this
.recalculate()
}
this._unmuteSyncLineStyleWithoutApplyingChanges(), this
.syncPriceLevels()
}
}
getPoint(e) {
switch (e) {
case 0:
return this._points[0];
case 1:
return {
index: this._points[1].index, price: this._points[0].price
};
case 2:
return {
index: this._points[0].index, price: this.stopPrice()
};
case 3:
return {
index: this._points[0].index, price: this.profitPrice()
}
}
return null
}
setPoints(e) {
this._muteSyncLineStyle(), super.setPoints(e), this.recalculate(), this
._unmuteSyncLineStyleWithoutApplyingChanges(), this.syncPriceLevels()
}
syncPriceLevels() {
if (this.linkKey().value()) {
var e = this.properties(),
t = {
entryPrice: e.entryPrice.value(),
stopLevel: e.stopLevel.value(),
profitLevel: e.profitLevel.value()
};
o.changeLineStyle({
linkKey: this.linkKey().value(),
state: t,
model: this._model
})
}
}
pointsCount() {
return 1
}
name() {
return "Risk/Reward"
}
addPoint(e) {
e.price = this._roundPrice(e.price), super.addPoint(e, null, !0);
var t = {
price: e.price,
index: this._getClosePointIndex(e.index)
};
super._addPointIntenal(t, null, !0);
var i = this.calculateActualEntry(e, t);
i && (super._addPointIntenal(i, null, !0), (t = this.findClosePoint(i,
t)) && super._addPointIntenal(t, null, !0));
return this._lastPoint = null, this.normalizePoints(), this
.createServerPoints(), !0
}
setOwnerSource(e) {
super.setOwnerSource(e), this._model.mainSeries().symbolInfo() && (this
._recalculateAmount(), this._recalculateQty())
}
_roundPrice(e) {
var t = this._model.mainSeries().base();
return Math.round(e * t) / t
}
recalculate() {
if (0 !== this.points().length) {
var e = this.properties().targetPrice.value(),
t = this.properties().stopPrice.value(),
i = [this._points[0], this._points[1]],
s = this.calculateActualEntry(this.points()[0], this.points()[1]);
if (s) {
i.push(s);
var r = this.findClosePoint(s, this.points()[1]);
r && i.push(r)
}
this._points = i, e !== this.properties().targetPrice.value() && this
.properties().targetPrice._listeners.fire(this.properties()
.targetPrice), t !== this.properties().stopPrice.value() && this
.properties().stopPrice._listeners.fire(this.properties().stopPrice)
}
}
start() {
super.start(), this.recalculate()
}
startMoving(e, t, i) {
e.logical.price = this._roundPrice(e.logical.price), super.startMoving(e, t,
i)
}
move(e, t, i) {
e.logical.price = this._roundPrice(e.logical.price), super.move(e, t, i),
this.recalculate(), this._entryPriceAxisView.update()
}
_correctPoints(e) {
return !!this.isActualSymbol() && r.prototype._correctPoints.call(this, [e[
0], e[1]])
}
entryPrice() {
return this.points()[0].price
}
findClosePoint(e, t) {
for (var i = this._model.mainSeries().bars(), r = s(i.firstIndex()), n =
Math.max(e.index, r), o = s(i.lastIndex()), a = Math.min(o, t
.index), l = n; l <= a; l++) {
var c = i.valueAt(l);
if (null !== c) {
var h = this.checkStopPrice(c);
if (null != h) return {
index: l,
price: h
}
}
}
return null
}
calculateActualEntry(e, t) {
var i = this._model.mainSeries().bars();
if (i.isEmpty()) return null;
for (var r = s(i.firstIndex()), n = Math.max(e.index, r), o = e.price, a =
s(i.lastIndex()), l = Math.min(a, t.index), c = n; c <= l; c++) {
var h = i.valueAt(c);
if (null !== h && h[TradingView.HIGH_PLOT] >= o && h[TradingView
.LOW_PLOT] <= o) return {
index: c,
price: o
}
}
return null
}
axisPoints() {
if (!this._points[c.ActualEntry]) return [];
var e = this._points[c.ActualEntry],
t = null;
if (4 === this._points.length) t = this._points[c.ActualClose];
else {
var i = this.lastBarData();
if (!i) return [];
t = {
index: i.index,
price: i.closePrice
}
}
return [e, t]
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null,
"RYNR"))).RiskRewardDefinitionsViewModel
}
template() {
var e = this.properties(),
t = r.prototype.template.call(this);
return t.stopLevel = e.stopLevel.value(), t.profitLevel = e.profitLevel
.value(), t
}
_applyTemplateImpl(e) {
delete e.targetPrice, delete e.stopPrice, delete e.entryPrice, super
._applyTemplateImpl(e);
var t = this.properties();
void 0 !== e.stopLevel && t.stopLevel.setValue(e.stopLevel), void 0 !== e
.profitLevel && t.profitLevel.setValue(e.profitLevel)
}
getOrderTemplate() {
return null
}
_propertiesStateExclusions() {
return ["entryPrice", "stopPrice", "targetPrice"]
}
static _configureProperties(e) {
r._configureProperties(e), e.addExclusion("stopLevel"), e.addExclusion(
"profitLevel"), e.addExclusion("stopPrice"), e.addExclusion(
"targetPrice"), e.addExclusion("entryPrice")
}
_getClosePointIndex(e) {
var t = this._model.timeScale(),
i = Math.round(t.width() / t.barSpacing());
return e + Math.max(3, Math.round(.15 * i))
}
}
f.version = 2;
class g extends f {
constructor(e, t) {
super(e, t || g.createProperties());
var i = this.properties();
i.entryPrice.subscribe(this, this._recalculateQty), i.stopPrice.subscribe(
this, this._recalculateQty), i.riskSize.subscribe(this, this
._recalculateQty), i.entryPrice.subscribe(this, this
._recalculateAmount), i.profitLevel.subscribe(this, this
._recalculateAmount), i.stopLevel.subscribe(this, this
._recalculateAmount), i.accountSize.subscribe(this, this
._recalculateAmount), i.riskSize.subscribe(this, this
._recalculateAmount), i.qty.subscribe(this, this._recalculateAmount)
}
_recalculateQty() {
if (0 !== this.points().length) {
var e = this.properties(),
t = e.entryPrice.value(),
i = e.stopPrice.value(),
s = e.riskSize.value(),
r = this._model.mainSeries().pointValue(),
n = s / (Math.abs(i - t) * r);
e.qty.setValue(n)
}
}
_recalculateAmount() {
if (0 !== this.points().length) {
var e = this.properties(),
t = e.accountSize.value(),
i = e.entryPrice.value(),
s = e.qty.value(),
r = e.stopPrice.value(),
n = e.targetPrice.value(),
o = this._model.mainSeries().pointValue(),
a = this._roundValue(t + (i - n) * s * o),
l = this._roundValue(t - (r - i) * s * o);
e.amountTarget.setValue(a), e.amountStop.setValue(l)
}
}
name() {
return "Risk/Reward short"
}
stopPrice() {
return this.entryPrice() + this.properties().stopLevel.value() / this._model
.mainSeries().base()
}
profitPrice() {
return this.entryPrice() - this.properties().profitLevel.value() / this
._model.mainSeries().base()
}
calculatePL(e) {
return this.entryPrice() - e
}
preparseStopPrice(e) {
e = this._roundPrice(e);
var t = this.entryPrice() + 1 / this._model.mainSeries().base();
return Math.max(e, t)
}
preparseProfitPrice(e) {
e = this._roundPrice(e);
var t = this.entryPrice() - 1 / this._model.mainSeries().base();
return Math.min(e, t)
}
checkStopPrice(e) {
var t = this.stopPrice(),
i = this.profitPrice();
return e[TradingView.HIGH_PLOT] >= t ? this.stopPrice() : e[TradingView
.LOW_PLOT] <= i ? this.profitPrice() : null
}
_orderSide() {
throw new Error("not supported")
}
static createProperties(e) {
var t = new a("linetoolriskrewardshort", e);
return g._configureProperties(t), t
}
static _configureProperties(e) {
f._configureProperties(e)
}
}
class b extends f {
constructor(e, t) {
super(e, t || b.createProperties());
var i = this.properties();
i.entryPrice.subscribe(this, this._recalculateQty), i.stopPrice.subscribe(
this, this._recalculateQty),
i.riskSize.subscribe(this, this._recalculateQty), i.entryPrice
.subscribe(this, this._recalculateAmount), i.profitLevel.subscribe(this,
this._recalculateAmount), i.stopLevel.subscribe(this, this
._recalculateAmount), i.accountSize.subscribe(this, this
._recalculateAmount), i.riskSize.subscribe(this, this
._recalculateAmount), i.qty.subscribe(this, this._recalculateAmount)
}
_recalculateQty() {
if (0 !== this.points().length) {
var e = this.properties(),
t = e.entryPrice.value(),
i = e.stopPrice.value(),
s = e.riskSize.value(),
r = this._model.mainSeries().pointValue(),
n = s / (Math.abs(t - i) * r);
e.qty.setValue(n)
}
}
_recalculateAmount() {
if (0 !== this.points().length) {
var e = this.properties(),
t = e.accountSize.value(),
i = e.entryPrice.value(),
s = e.qty.value(),
r = e.stopPrice.value(),
n = e.targetPrice.value(),
o = this._model.mainSeries().pointValue(),
a = this._roundValue(t + (n - i) * s * o),
l = this._roundValue(t - (i - r) * s * o);
e.amountTarget.setValue(a), e.amountStop.setValue(l)
}
}
stopPrice() {
return this.entryPrice() - this.properties().stopLevel.value() / this._model
.mainSeries().base()
}
profitPrice() {
return this.entryPrice() + this.properties().profitLevel.value() / this
._model.mainSeries().base()
}
calculatePL(e) {
return e - this.entryPrice()
}
preparseStopPrice(e) {
e = this._roundPrice(e);
var t = this.entryPrice() - 1 / this._model.mainSeries().base();
return Math.min(e, t)
}
preparseProfitPrice(e) {
e = this._roundPrice(e);
var t = this.entryPrice() + 1 / this._model.mainSeries().base();
return Math.max(e, t)
}
checkStopPrice(e) {
var t = this.stopPrice(),
i = this.profitPrice();
return e[TradingView.LOW_PLOT] <= t ? this.stopPrice() : e[TradingView
.HIGH_PLOT] >= i ? this.profitPrice() : null
}
name() {
return "Risk/Reward long"
}
_orderSide() {
throw new Error("not supported")
}
static createProperties(e) {
var t = new a("linetoolriskrewardlong", e);
return b._configureProperties(t), t
}
static _configureProperties(e) {
f._configureProperties(e)
}
}
t.LineToolRiskRewardLong = b, t.LineToolRiskRewardShort = g
}).call(this, i("Qb4w").PriceRange)
},
tG6Q: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("Ocx9").DefaultProperty;
class n extends s {
constructor(e, t) {
super(e, t || n.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"GS+0", 7)).then(({
LineToolCircleLinesPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 2
}
name() {
return "Cyclic Lines"
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "LX4V")))
.CyclicAndSineLinesPatternDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetoolcirclelines", e);
return n._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
t.LineToolCircleLines = n
},
tWVy: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return r
})), i.d(t, "b", (function() {
return n
}));
var s = i("aIyQ");
const r = new(i.n(s).a);
function n() {
r.fire()
}
},
"tc+8": function(e, t, i) {
"use strict";
(function(t) {
var s = i("ogJP").isFunction;
function r(e) {
if (this._listeners = new t, this._childs = [], this._muteChildChanges = !1,
void 0 !== e)
if (this.isPrimitiveType(e)) this._value = e;
else
for (var i in e) this.addProperty(i, e[i])
}
r.prototype.merge = function(e, t) {
var i = null;
if (t) var s = (i = []).length;
if (void 0 === e) return i;
if (this.isPrimitiveType(e)) return t && this._value !== e && i.push(this), this
._value = e, i;
if (Array.isArray(e))
for (var r = 0; r < e.length; r++)
if (this[r]) {
var n = this[r].merge(e[r], t);
t && (i = i.concat(n))
} else this.addProperty(r, e[r]), t && i.push(this[r]);
else
for (var o in e)
if (this[o]) {
n = this[o].merge(e[o], t);
t && void 0 !== n && (i = i.concat(n))
} else this.addProperty(o, e[o]), t && i.push(this[o]);
return t && i.length > s && i.push(this), i
}, r.prototype.mergeAndFire = function(e) {
var t = this.merge(e, !0);
this._muteChildChanges = !0, t.forEach((function(e) {
e._muteChildChanges = !0
})), t.forEach((function(e) {
e._muteChildChanges = !1, e.listeners().fire(e)
})), this._muteChildChanges = !1, t.length > 0 && this.listeners().fire(
this)
}, r.prototype.state = function(e) {
var t = s(this.value) ? this.value() : void 0;
void 0 === t && (t = {});
for (var i = 0; i < this._childs.length; i++) {
var r = this._childs[i];
if (!e || -1 === e.indexOf(r))
if (e) {
for (var n = [], o = 0; o < e.length; o++) {
var a = e[o];
a.startsWith(r + ".") && n.push(a.substr(r.length + 1))
}
t[r] = this[r].state(n)
} else t[r] = this[r].state()
}
return t
}, r.prototype.clone = function(e) {
return new r(this.state())
}, r.prototype.isPrimitiveType = function(e) {
return null === e || (!!isNumber(e) || (!!new TradingView.TypeValidator(String)
.check(e) || TradingView.isBoolean(e)))
}, r.prototype.value = function() {
return this._value
}, r.prototype.listeners = function() {
return this._listeners
}, r.prototype.childCount = function() {
return this._childs.length
}, r.prototype.childNames = function() {
return this._childs
}, r.prototype.child = function(e) {
return this[e]
}, r.prototype.setValue = function(e, t) {
(this._value !== e || t) && (this._value = e, this._listeners.fire(this))
}, r.prototype.setValueSilently = function(e) {
this._value = e
}, r.prototype.addProperty = function(e, t) {
var i = new r(t);
this[e] = i, this._childs.push(e), i.subscribe(this, this.childChanged)
}, r.prototype.removeProperty = function(e) {
this[e].unsubscribe(this, this.childChanged), delete this[e], this._childs =
this._childs.filter((function(t) {
return t !== e
}))
}, r.prototype.hasChild = function(e) {
return this._childs.indexOf(e) >= 0
}, r.prototype.addChild = function(e, t) {
this[e] && this[e].unsubscribe(this, this.childChanged), this[e] = t, -1 ===
this._childs.indexOf(e) && this._childs.push(e), t.subscribe(this, this
.childChanged)
}, r.prototype.childChanged = function(e, t) {
this._muteChildChanges || this.listeners().fire(this)
}, r.prototype.subscribe = function(e, t) {
this.listeners().subscribe(e, t, !1)
}, r.prototype.unsubscribe = function(e, t) {
this.listeners().unsubscribe(e, t)
}, r.prototype.unsubscribeAll = function(e) {
this.listeners().unsubscribeAll(e)
}, r.prototype.childs = function() {
return this
}, e.exports = r
}).call(this, i("aIyQ"))
},
teHb: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ratioStudyItem", (function() {
return n
}));
var s = i("7dm8");
class r extends s.a {
_doCalculation(e, t, i, s) {
return e * t / (i * s)
}
}
const n = {
name: "Ratio",
metainfo: {
_metainfoVersion: 15,
defaults: s.b,
plots: s.d,
styles: s.e,
description: "Ratio",
shortDescription: "Ratio",
is_price_study: !1,
inputs: s.c,
id: "Ratio@tv-basicstudies-1"
},
constructor: r
}
},
tqok: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "INVALID_TIME_POINT_INDEX", (function() {
return s
}));
const s = -2e6
},
txPx: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LOGLEVEL", (function() {
return n
})), i.d(t, "getLogLevel", (function() {
return _
})), i.d(t, "isHighRateEnabled", (function() {
return m
})), i.d(t, "setLogLevel", (function() {
return f
})), i.d(t, "getRawLogHistory", (function() {
return g
})), i.d(t, "serializeLogHistoryEntry", (function() {
return b
})), i.d(t, "getLogHistory", (function() {
return v
})), i.d(t, "getLogger", (function() {
return y
})), i.d(t, "loggingOn", (function() {
return P
})), i.d(t, "loggingOff", (function() {
return C
}));
const s = "undefined" != typeof window ? window : {};
let r = !1;
try {
localStorage.getItem(""), r = !0
} catch (e) {}
var n;
! function(e) {
e[e.ERROR = 1] = "ERROR", e[e.WARNING = 2] = "WARNING", e[e.INFO = 3] = "INFO", e[e.NORMAL =
4] = "NORMAL", e[e.DEBUG = 5] = "DEBUG"
}(n || (n = {}));
let o = 0;
const a = [];
let l = null,
c = null,
h = null,
u = NaN,
d = n.WARNING,
p = !1;
function _() {
return d
}
function m() {
return p
}
function f(e) {
e = Math.max(n.ERROR, Math.min(n.DEBUG, e)), d = e, x()
}
function g(e, t) {
let i = a.reduce((e, t) => e.concat(t), []);
return i.sort((e, t) => e.id - t.id), void 0 !== t && (i = i.filter(e => e.subSystemId ===
t)), "number" == typeof e && (i = i.slice(-e)), i
}
function b(e) {
return new Date(e.timestamp).toISOString() + ":" + e.subSystemId + ":" + e.message.replace(
/"/g, "'")
}
function v(e, t) {
return function(e, t) {
let i, s = 0,
r = 0;
for (i = e.length - 1; i >= 1 && (s += 8 * (1 + encodeURIComponent(e[i]).length), !(
i - 1 > 0 && (r = 8 * (1 + encodeURIComponent(e[i - 1]).length), s + r >
t))); i--);
return e.slice(i)
}(g(e, t).map(b), 75497472)
}
function S(e, t, i, s) {
if (t === c && s.id === h) return;
const r = new Date;
if (e <= n.NORMAL && function(e, t, i, s, r) {
const n = {
id: o,
message: String(t),
subSystemId: s,
timestamp: Number(e)
};
o += 1, i.push(n), void 0 !== r && i.length > r && i.splice(0, 1)
}(r, t, i, s.id, s.maxCount), e <= d && (!s.highRate || m()) && (!l || s.id.match(l))) {
const i = r.toISOString() + ":" + s.id + ":" + t;
switch (e) {
case n.DEBUG:
console.debug(i);
break;
case n.INFO:
case n.NORMAL:
s.color ? console.log("%c" + i, "color: " + s.color) : console.log(i);
break;
case n.WARNING:
console.warn(i);
break;
case n.ERROR:
console.error(i)
}
c = t, h = s.id, u && clearTimeout(u), u = setTimeout(() => {
c = null, h = null, u = NaN
}, 1e3)
}
}
function y(e, t = {}) {
const i = [];
a.push(i);
const s = Object.assign(t, {
id: e
});
function r(e) {
return t => S(e, t, i, s)
}
return {
logDebug: r(n.DEBUG),
logError: r(n.ERROR),
logInfo: r(n.INFO),
logNormal: r(n.NORMAL),
logWarn: r(n.WARNING)
}
}
const w = y("logger"),
P = s.lon = (e, t) => {
f(n.DEBUG), w.logNormal("Debug logging enabled"), p = Boolean(e), l = t || null, x()
},
C = s.loff = () => {
f(n.INFO), w.logInfo("Debug logging disabled")
};
function x() {
try {
r && (localStorage.setItem("tv.logger.logHighRate", String(p)), localStorage.setItem(
"tv.logger.loglevel", String(d)))
} catch (e) {
w.logWarn(
`Cannot save logger state (level: ${d}, high-rate: ${p}) to localStorage: ${e.message}`
)
}
}! function() {
p = !!r && "true" === localStorage.getItem("tv.logger.logHighRate");
let e = parseInt(r && localStorage.getItem("tv.logger.loglevel") || "");
Number.isNaN(e) && (e = n.WARNING), f(e), w.logNormal(
`Init with settings - level: ${d}, high-rate: ${p}`)
}(),
s.performance && s.performance.now ? w.logNormal("Sync logger and perf times, now is " + s
.performance.now()) : w.logWarn("Perf time is not available")
},
"u+0B": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "TextWidthCache", (function() {
return r
}));
const s = /[2-9]/g;
class r {
constructor(e = 50) {
this._actualSize = 0, this._usageTick = 1, this._oldestTick = 1, this
._tick2Labels = {}, this._cache = {}, this._maxSize = e
}
reset() {
this._actualSize = 0, this._cache = {}, this._usageTick = 1, this._oldestTick = 1,
this._tick2Labels = {}
}
measureText(e, t, i) {
return this._getMetrics(e, t, i).width
}
yMidCorrection(e, t, i) {
const s = this._getMetrics(e, t, i);
return ((s.actualBoundingBoxAscent || 0) - (s.actualBoundingBoxDescent || 0)) / 2
}
_getMetrics(e, t, i) {
const r = i || s,
n = String(t).replace(r, "0");
if (this._cache[n]) return this._cache[n].metrics;
if (this._actualSize === this._maxSize) {
const e = this._tick2Labels[this._oldestTick];
delete this._tick2Labels[this._oldestTick], delete this._cache[e], this
._oldestTick++, this._actualSize--
}
e.save(), e.textBaseline = "middle";
const o = e.measureText(n);
return e.restore(), 0 === o.width && t.length || (this._cache[n] = {
metrics: o,
tick: this._usageTick
}, this._tick2Labels[this._usageTick] = n, this._actualSize++, this
._usageTick++), o
}
}
},
u0yd: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "PaneRendererArea", (function() {
return a
}));
var s = i("Eyy1"),
r = i("gyZD"),
n = i("jFln"),
o = i("Zp/P");
class a extends r.PaneRendererLine {
constructor(e) {
e.forceLineColor = !1, super(e)
}
draw(e, t) {
var i;
e.save(), e.scale(t.pixelRatio, t.pixelRatio);
const r = this._data;
if (0 === r.items.length) return;
e.lineCap = "butt", e.strokeStyle = r.lineColor, e.lineWidth = r.lineWidth,
Object(n.setLineStyle)(e, r.lineStyle), e.lineWidth = 1;
let a = 0;
for (; a < r.items.length && !Object(o.coordinateIsValid)(r.items[a].y);) a++;
let l = r.items.length - 1;
for (; l >= 0 && !Object(o.coordinateIsValid)(r.items[l].y);) l--;
if (a > l) return;
const c = {},
h = r.items;
for (let e = a; e <= l; e++) {
const t = h[e];
let i;
if (i = t.style ? t.style.color : r.lineColor, e < l && h[e + 1].style) {
const r = Object(s.ensureDefined)(h[e + 1].style).color;
if (i !== r) {
const e = c[r] || [];
e.push(t), c[r] = e
}
}
const n = c[i] || [];
n.push(t), c[i] = n
}
for (const t of Object.keys(c)) {
const s = c[t];
e.beginPath();
let n = 0;
for (let o = 0; o < s.length; o++) s[o].style && (null === (i = s[o]
.style) || void 0 === i ? void 0 : i.color) !== t && (e.moveTo(Math
.round(s[n].x), r.bottom), this._walkLine(e, s.slice(n, o), !0,
r.bottom), n = o);
if (e.moveTo(Math.round(s[n].x), r.bottom), this._walkLine(e, s.slice(n, s
.length), !0, r.bottom), e.closePath(), r.isSeries) {
const t = e.createLinearGradient(0, 0, 0, r.bottom);
t.addColorStop(0, r.color1), t.addColorStop(1, r.color2), e.fillStyle =
t, r.simpleMode = !0
} else e.fillStyle = t;
e.fill()
}
e.lineWidth = r.lineWidth, e.restore(), super.draw(e, t)
}
}
},
uDHo: function(e, t, i) {
"use strict";
var s, r;
function n(e, t) {
return "period-back" === e.type && "period-back" === t.type ? e.value === t.value :
"time-range" === e.type && "time-range" === t.type && (e.from === t.from && e.to === t
.to)
}
i.r(t), i.d(t, "Helpers", (function() {
return s
})), i.d(t, "TIMEFRAMETYPE", (function() {
return r
})), i.d(t, "areEqualTimeFrames", (function() {
return n
})),
function(e) {
e.extractErrorReason = function(e) {
return e.params[1]
}
}(s || (s = {})),
function(e) {
e.PeriodBack = "period-back", e.TimeRange = "time-range"
}(r || (r = {}))
},
ufwo: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "rangesAreEqual", (function() {
return n
}));
var s = i("uDHo"),
r = i("LxhU");
function n(e, t) {
return !!r.Interval.isEqual(e.res, t.res) && Object(s.areEqualTimeFrames)(e.val, t.val)
}
},
ulZB: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return n
})), i.d(t, "b", (function() {
return o
}));
var s = i("aIyQ"),
r = i.n(s);
class n {
constructor(e, t, i, s, n) {
this._onChange = new r.a, this._handleChange = () => {
this._onChange.fire(this.get())
}, this._crossTabEvents = e, this._jsonKeyValueStore = t, this
.CROSSTAB_EVENT_NAME = i, this.JSON_STORE_KEY = s, this.defaultStoreValue = this
._serialize(n), this._subscribe()
}
get() {
const e = this._jsonKeyValueStore.getJSON(this.JSON_STORE_KEY, this
.defaultStoreValue);
return this._deserialize(e)
}
set(e, t) {
const i = this._serialize(e);
this._jsonKeyValueStore.setJSON(this.JSON_STORE_KEY, i, t), this._crossTabEvents
.emit(this.CROSSTAB_EVENT_NAME), this._onChange.fire(e)
}
getOnChange() {
return this._onChange
}
destroy() {
this._unsubscribe(), this._onChange.destroy(), delete this._onChange
}
_subscribe() {
this._crossTabEvents.on(this.CROSSTAB_EVENT_NAME, this._handleChange), this
._jsonKeyValueStore.onSync.subscribe(this, this._handleChange)
}
_unsubscribe() {
this._crossTabEvents.off(this.CROSSTAB_EVENT_NAME, this._handleChange), this
._jsonKeyValueStore.onSync.unsubscribe(this, this._handleChange)
}
}
class o extends n {
_serialize(e) {
return e
}
_deserialize(e) {
return e
}
}
},
v5F8: function(e, t, i) {
"use strict";
var s = i("5rJj"),
r = i("aDyP").LineToolPitchfork;
class n extends r {
constructor(e, t) {
super(e, t || n.createProperties())
}
name() {
return "Modified Schiff Pitchfork"
}
static createProperties(e) {
var t = new s("linetoolschiffpitchfork", e, !1, {
range: [0, 8]
});
return n._configureProperties(t), t
}
static _configureProperties(e) {
r._configureProperties(e)
}
}
t.LineToolSchiffPitchfork = n
},
vAx0: function(e, t, i) {
"use strict";
var s = i("aO4+").Point,
r = i("VdBB").HitTestResult,
n = i("Zy3/").CompositeRenderer,
o = (i("LxhU").Interval, i("jCNj").utc_to_cal),
a = i("jCNj").get_timezone,
l = i("3t3b").dateFormatProperty,
c = i("gQ5K").DateFormatter,
h = i("z+cS").VerticalLineRenderer,
u = i("Khfk").LollipopRenderer,
d = i("u+0B").TextWidthCache;
i("zDbI").CHART_FONT_FAMILY, window.t("Earnings"), window.t("Standardized"), window.t(
"As reported"), window.t("Estimate"), window.t("Surprise"), window.t("Split"), window.t(
"Dividends"), window.t("Net"), window.t("Gross"), window.t("Date"), window.t(
"Period Ending"), window.t("Payment Date");
t.ESDPaneView = class {
constructor(e, t, i) {
this._lastClickedId = null, this._model = e, this._study = t, this
._lollipops = {}, this._lollipopsCounter = 0, this._invalidated = !0, this
._hideLollipops = !1, this.defaultStyle = null, this.hoveredStyle = null,
this.activeStyle = null, this._hitTestHandler = i, this._renderer = new n,
this._textWidthCache = new d, this._recreateStyles(e), this
._onPaneBgChangeBound = this.onPaneBgChange.bind(this), e.backgroundColor()
.subscribe(this._onPaneBgChangeBound), e.mainSeries()
.onSymbolIntervalChanged().subscribe(this, this._onSymbolOrIntervalChanged)
}
destroy() {
this._model.backgroundColor().unsubscribe(this._onPaneBgChangeBound), this
._model.mainSeries().onSymbolIntervalChanged().unsubscribeAll(this)
}
onPaneBgChange() {
this._recreateStyles(this._model)
}
onClickOutside(e) {
if (null !== this._lastClickedId && e) {
var t = null;
if (e.touches && 1 === e.touches.length) {
var i = e.target.getBoundingClientRect(),
r = e.touches[0];
t = new s(r.clientX - i.left, r.clientY - i.top)
} else t = new s(e.offsetX, e.offsetY);
var n = this._renderer.hitTest(t);
null !== n && n.data().activeItem === this._lollipops[this._lastClickedId]
.itemIndex || this.clearLastClicked()
} else this.clearLastClicked()
}
clearLastClicked() {
void 0 !== this._lollipops[this._lastClickedId] && (this._lollipops[this
._lastClickedId].active = !1), this._lastClickedId = null
}
getLastClickedLollipopId() {
return this._lastClickedId
}
_recreateStyles(e) {
this._stylesCache = null
}
_setStackStudies() {
this._stackStudies = []
}
_getY() {
for (var e = 0, t = this._model.panes(), i = t.length; i--;) {
var s = t[i];
s.containsMainSeries() && (e += s.height())
}
return e
}
update() {
this._invalidated = !0
}
updateImpl(e, t) {
this._setStackStudies();
var i = this,
s = this._study.data(),
r = this._model.timeScale(),
n = r.visibleBarsStrictRange(),
o = this._model.mainSeries().bars(),
a = this._study.priceScale(),
l = this._model.mainSeries().firstBar();
if (a && !a.isEmpty() && !r.isEmpty() && l && s) {
for (var c in this._hideLollipops = !1, this._lollipops) this._lollipops
.hasOwnProperty(c) && (this._lollipops[c].visible = !1);
var h = this._getY(),
u = n.firstBar(),
d = n.lastBar();
s.range(u, d).each((function(e, t) {
for (var s = 0, n = 0; n < i._stackStudies.length; ++n) i
._stackStudies[n].data().contains(e) && ++s;
e > u && e < d && i.addLollipop(h, o, r, a, e, t, s)
})), this.afterUpdate(h, o, r, a), this._createRenderers(e, t)
}
}
addLollipop(e, t, i, r, n, o, a) {
var l = o[0],
c = this._model.mainSeries().symbolInfo();
if (c) {
var h = c.name,
u = null,
d = this._study.metaInfo().id + "_" + l + "_" + h,
p = void 0 !== this._lollipops[d] ? this._lollipops[d].itemIndex : this
._lollipopsCounter++,
_ = this._model.lastHittestData(),
m = d === this.getLastClickedLollipopId(),
f = this._model.hoveredSource() === this._study && null !== _ && _
.activeItem === p;
if (f || m) {
var g = t.valueAt(n);
if (null !== g) {
var b = g[TradingView.LOW_PLOT],
v = this._model.mainSeries().firstValue();
u = r.priceToCoordinate(b, v)
}
}
this._lollipops[d] = Object.assign({
id: d,
itemIndex: p,
visible: !0,
basePoint: new s(i.indexToCoordinate(n), e),
hovered: f,
active: m,
barY: u,
stack: a
}, this.extraData(o))
}
}
afterUpdate(e, t, i) {}
extraData(e) {
throw new Error("Not Implemented")
}
createTooltipContent(e, t) {
throw new Error("Not Implemented")
}
showBarLine() {
return !0
}
getStyle(e) {
var t = e.active ? "active" : e.hovered ? "hovered" : "default",
i = t;
if (e.stack && (i += "_stack:" + e.stack), "active" === i) return this
.activeStyle;
if ("hovered" === i) return this.hoveredStyle;
if ("default" === i) return this.defaultStyle;
if (this._stylesCache || (this._stylesCache = {}), !this._stylesCache[i]) {
var s = TradingView.clone("active" === t ? this.activeStyle : "hovered" ===
t ? this.hoveredStyle : this.defaultStyle);
e.stack && (s.lollipop.incHeight = 25 * e.stack), this._stylesCache[i] = s
}
return this._stylesCache[i]
}
hasTooltip(e) {
return !0
}
renderer(e, t) {
return this._invalidated && (this.updateImpl(t, e),
this._invalidated = !1), this._hideLollipops ? null : this._renderer
}
_createRenderers(e, t) {
for (var i in this._renderer.clear(), this._lollipops)
if (this._lollipops.hasOwnProperty(i)) {
var r = this._lollipops[i];
if (r.visible) {
var n = this.getStyle(r),
o = {
id: r.id,
centerPoint: new s(r.basePoint.x, r.basePoint.y - n.lollipop
.bottom - n.lollipop.height / 2 - (n.lollipop
.incHeight || 0)),
style: n.lollipop
},
a = {
activeItem: r.itemIndex,
clickHandler: this._lollipopMouseClickHandler.bind(this, o),
tapHandler: this._lollipopMouseClickHandler.bind(this, o)
};
if (this._renderer.append(this._createRendererForLollipop(o, a)), (r
.hovered || r.active) && this.hasTooltip(r) && r.barY &&
this.showBarLine()) {
var l = {
width: e,
height: t,
color: n.strokeStyle,
linestyle: n.barLine.lineStyle,
linewidth: n.lineWidth,
x: r.basePoint.x,
top: 0,
bottom: r.basePoint.y - n.lollipop.bottom - n.lollipop
.height
},
c = new h;
c.setData(l), this._renderer.insert(c)
}
}
}
}
_createRendererForLollipop(e, t) {
return new u(e, new r(r.CUSTOM, t), this._textWidthCache)
}
_lollipopMouseClickHandler(e, t) {
t.preventDefault();
var i = e.id;
if (this._lastClickedId = this._lastClickedId === i ? null : i, null !== this
._lastClickedId) {
var r = e.style.width / 2,
n = e.style.height / 2,
o = new s(t.clientX - t.localX + e.centerPoint.x, t.clientY - t.localY +
e.centerPoint.y),
a = {
target: t.target,
left: o.x - r,
top: o.y - n,
right: o.x + r,
bottom: o.x + n
};
this._hitTestHandler(a, () => {
var e = this._lollipops[i],
t = this.createTooltipContent(e);
return t ? [t] : null
})
}
}
_formatDate(e) {
let t = "Etc/UTC";
const i = this._model.mainSeries();
if (!i.isDWM() && (t = this._model.properties().timezone.value(), "exchange" ===
t)) {
const e = i.symbolInfo();
t = e && e.timezone || ""
}
var s = a(t),
r = o(s, e);
return new c(l.value()).format(r)
}
_onSymbolOrIntervalChanged() {
this._lollipops = {}, this._lollipopsCounter = 0, this._renderer.clear(), this
.clearLastClicked()
}
}
},
vIQA: function(e, t, i) {
"use strict";
var s = i("ocLq");
i("2cgs");
var r = i("hyq/").pivotPointsStandardStudyItem,
n = i("krs7").volumeProfileVisibleRangeStudyItem,
o = i("+Qfv").volumeProfileFixedRangeVbPStudyItem,
a = i("+Qfv").volumeProfileFixedRangeBSStudyItem,
l = i("QCyK").spreadStudyItem,
c = i("teHb").ratioStudyItem,
h = i("+PIq").regressionTrendStudyItem;
JSServer.studyLibrary = JSServer.studyLibrary.concat([{
name: "Compare",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !0,
defaults: {
styles: {
compare: {
linestyle: 0,
linewidth: 2,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#9C27B0"
}
},
inputs: {
source: "close",
symbol: ""
}
},
plots: [{
id: "compare",
type: "line"
}],
styles: {
compare: {
title: "Plot",
histogramBase: 0
}
},
description: "Compare",
shortDescription: "Compare",
is_price_study: !0,
inputs: [{
defval: "close",
id: "source",
name: "Source",
options: ["open", "high", "low", "close", "hl2", "hlc3",
"ohlc4"
],
type: "text"
}, {
id: "symbol",
name: "Symbol",
type: "symbol",
isHidden: !0
}],
id: "Compare@tv-basicstudies-1",
format: {
type: "inherit"
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._context.new_sym(t(1), s.Std.period(this
._context))
}, this.main = function(e, t) {
this._context = e;
var i = this._context.new_unlimited_var(this._context.symbol
.time);
this._context.select_sym(1);
var r = this._context.new_unlimited_var(this._context.symbol
.time),
n = s.Std[t(0)](this._context),
o = this._context.new_unlimited_var(n);
return this._context.select_sym(0), [o.adopt(r, i, 0)]
}
}
}, {
name: "Overlay",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !0,
defaults: {
styles: {},
inputs: {
symbol: ""
}
},
plots: [{
id: "open",
type: "line"
}, {
id: "high",
type: "line"
}, {
id: "low",
type: "line"
}, {
id: "close",
type: "line"
}],
styles: {
open: {
title: "Open"
},
high: {
title: "High"
},
low: {
title: "Low"
},
close: {
title: "Close"
}
},
description: "Overlay",
shortDescription: "Overlay",
is_price_study: !1,
inputs: [{
id: "symbol",
name: "symbol",
defval: "",
type: "symbol",
isHidden: !0
}],
id: "Overlay@tv-basicstudies-1",
format: {
type: "price",
precision: 4
}
},
constructor: function() {
this.init = function(e, t) {
this._context = e, this._context.new_sym(t(0), s.Std.period(this
._context))
}, this.main = function(e, t) {
this._context = e;
var i = this._context.new_unlimited_var(this._context.symbol
.time);
this._context.select_sym(1);
var r = this._context.new_unlimited_var(this._context.symbol
.time),
n = this._context.new_unlimited_var(s.Std.open(this
._context)),
o = this._context.new_unlimited_var(s.Std.high(this
._context)),
a = this._context.new_unlimited_var(s.Std.low(this
._context)),
l = this._context.new_unlimited_var(s.Std.close(this
._context));
return this._context.select_sym(0), [n.adopt(r, i, 1), o.adopt(
r, i, 1), a.adopt(r, i, 1), l.adopt(r, i, 1)]
}
}
}, {
name: "Volume",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
vol: {
linestyle: 0,
linewidth: 1,
plottype: 5,
trackPrice: !1,
transparency: 50,
visible: !0,
color: "#000080"
},
vol_ma: {
linestyle: 0,
linewidth: 1,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !1,
color: "#2196F3"
}
},
palettes: {
volumePalette: {
colors: {
0: {
color: "#EF5350",
width: 1,
style: 0
},
1: {
color: "#26A69A",
width: 1,
style: 0
}
}
}
},
inputs: {
showMA: !1,
length: 20,
col_prev_close: !1
}
},
plots: [{
id: "vol",
type: "line"
}, {
id: "volumePalette",
palette: "volumePalette",
target: "vol",
type: "colorer"
}, {
id: "vol_ma",
type: "line"
}],
styles: {
vol: {
title: "Volume",
histogramBase: 0
},
vol_ma: {
title: "Volume MA",
histogramBase: 0
}
},
description: "Volume",
shortDescription: "Volume",
is_price_study: !1,
palettes: {
volumePalette: {
colors: {
0: {
name: "Falling"
},
1: {
name: "Growing"
}
}
}
},
inputs: [{
id: "showMA",
name: "show MA",
defval: !1,
type: "bool",
isHidden: !0
}, {
id: "length",
name: "MA Length",
defval: 20,
type: "integer",
min: 1,
max: 2e3
}, {
defval: !1,
id: "col_prev_close",
name: "Color based on previous close",
type: "bool"
}],
id: "Volume@tv-basicstudies-1",
format: {
type: "volume"
}
},
constructor: function() {
this.f_0 = function(e, t) {
return s.Std.gt(e, t) ? 0 : 1
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = s.Std.volume(this._context),
r = s.Std.volume(this._context),
n = this._context.new_var(r),
o = s.Std.sma(n, this._input(1), this._context),
a = this._context.new_var(s.Std.close(this._context));
return [i, a.get(1) && this._input(2) ? this.f_0(a.get(1), s.Std
.close(this._context)) : this.f_0(s.Std.open(this
._context), s.Std.close(this._context)), o]
}
}
}, {
name: "ZigZag",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 2,
plottype: 0,
trackPrice: !1,
transparency: 0,
visible: !0,
color: "#2196F3"
}
},
inputs: {
in_0: 5,
in_1: 10
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
target: "plot_0",
type: "dataoffset"
}],
styles: {
plot_0: {
title: "Plot",
histogramBase: 0,
joinPoints: !1
}
},
description: "Zig Zag",
shortDescription: "ZigZag",
is_price_study: !0,
classId: "ScriptWithDataOffset",
inputs: [{
id: "in_0",
name: "deviation",
defval: 5,
type: "float",
min: .001,
max: 100
}, {
id: "in_1",
name: "depth",
defval: 10,
type: "integer",
min: 2,
max: 1e3
}],
id: "ZigZag@tv-basicstudies-1",
format: {
type: "inherit"
}
},
constructor: function() {
this.main = function(e, t) {
this._context = e, this._input = t;
var i = this._input(0),
r = this._input(1),
n = i / 100,
o = Math.ceil(r / 2);
return [s.Std.zigzag(n, o, this._context), s.Std.zigzagbars(n,
o, this._context)]
}
}
}, {
name: "Sessions",
metainfo: {
_metainfoVersion: 52,
defaults: {
graphics: {
vertlines: {
sessBreaks: {
color: "#4985e7",
style: 2,
visible: !1,
width: 1
}
}
},
linkedToSeries: !0
},
description: "Sessions",
graphics: {
vertlines: {
sessBreaks: {
name: "Session Break",
halign: "left"
}
}
},
id: "Sessions@tv-basicstudies-1",
inputs: [],
is_hidden_study: !0,
is_price_study: !0,
name: "Sessions@tv-basicstudies",
palettes: {},
plots: [],
shortDescription: "Sessions",
format: {
type: "inherit"
}
},
constructor: function() {
function e(e, t) {
return {
id: e,
index: e,
extendBottom: !0,
extendTop: !0
}
}
this.init = function() {
this._times = []
}, this._getVerticalLineData = function(t) {
return s.Std.selectSessionBreaks(t, this._times).map(e)
}, this.main = function(e, t) {
if (s.Std.isdwm(e)) return null;
var i = s.Std.time(e);
if (isNaN(i)) return null;
var r = this._times.length;
if (0 !== r && this._times[r - 1] === i || this._times.push(i),
!e.symbol.isLastBar || !e.symbol.isNewBar) return null;
var n = this._getVerticalLineData(e);
return 0 === n.length ? null : {
nonseries: !0,
type: "study_graphics",
data: {
graphicsCmds: {
create: {
vertlines: [{
styleId: "sessBreaks",
data: n
}]
},
erase: [{
action: "all"
}]
}
}
}
}
}
}, {
name: "SuperTrend",
metainfo: {
_metainfoVersion: 52,
isTVScript: !1,
isTVScriptStub: !1,
is_hidden_study: !1,
defaults: {
styles: {
plot_0: {
linestyle: 0,
linewidth: 3,
plottype: 0,
trackPrice: !1,
transparency: 35,
visible: !0,
color: "#000080"
},
plot_2: {
linestyle: 0,
linewidth: 3,
plottype: "shape_arrow_up",
trackPrice: !1,
location: "BelowBar",
transparency: 35,
visible: !0,
color: "#00FF00"
},
plot_3: {
linestyle: 0,
linewidth: 3,
plottype: "shape_arrow_down",
trackPrice: !1,
location: "AboveBar",
transparency: 35,
visible: !0,
color: "#FF0000"
}
},
palettes: {
palette_0: {
colors: {
0: {
color: "#008000",
width: 3,
style: 0
},
1: {
color: "#800000",
width: 3,
style: 0
}
}
}
},
inputs: {
in_0: 10,
in_1: 3
}
},
plots: [{
id: "plot_0",
type: "line"
}, {
id: "plot_1",
palette: "palette_0",
target: "plot_0",
type: "colorer"
}, {
id: "plot_2",
type: "shapes"
}, {
id: "plot_3",
type: "shapes"
}],
styles: {
plot_0: {
title: "SuperTrend",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
},
plot_2: {
title: "Up Arrow",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
},
plot_3: {
title: "Down Arrow",
histogramBase: 0,
joinPoints: !1,
isHidden: !1
}
},
description: "SuperTrend",
shortDescription: "SuperTrend",
is_price_study: !0,
palettes: {
palette_0: {
colors: {
0: {
name: "Color 0"
},
1: {
name: "Color 1"
}
},
valToIndex: {
0: 0,
1: 1
}
}
},
inputs: [{
id: "in_0",
name: "Length",
defval: 10,
type: "integer",
min: 1,
max: 100
}, {
id: "in_1",
name: "Factor",
defval: 3,
type: "float",
min: 1,
max: 100
}],
id: "SuperTrend@tv-basicstudies-1",
scriptIdPart: "",
name: "SuperTrend",
isCustomIndicator: !0,
format: {
type: "inherit"
}
},
constructor: function() {
this.f_0 = function() {
var e = this._input(0),
t = this._input(1),
i = s.Std.atr(e, this._context),
r = (e = s.Std.hl2(this._context) + i * t, i = s.Std.hl2(
this._context) - i * t, this._context.new_var(s.Std
.close(this._context))),
n = (t = this._context.new_var(), s.Std.max(i, t.get(1)));
return t.set(s.Std.gt(r.get(1), t.get(1)) ? n : i), i = this
._context.new_var(), n = s.Std.min(e, i.get(1)), i.set(s.Std
.lt(r.get(1), i.get(1)) ? n : e), e = this._context
.new_var(), r = s.Std.nz(e.get(1), 1), r = s.Std.lt(s.Std
.close(this._context), t.get(1)) ? -1 : r, e.set(s.Std
.gt(s.Std.close(this._context), i.get(1)) ? 1 : r), [t =
s.Std.eq(e.get(0), 1) ? t.get(0) : i.get(0), s.Std.eq(e
.get(0), 1) ? 0 : 1, 1 === e.get(0) && -1 === e.get(
1) ? 1 : NaN, -1 === e.get(0) && 1 === e.get(1) ?
1 : NaN
]
}, this.main = function(e, t) {
this._context = e, this._input = t;
var i = this.f_0();
return [i[0], i[1], i[2], i[3]]
}
}
}, r, n, o, a, l, c, h])
},
vPbs: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "CHART_WIDGET_COLLECTION_SERVICE", (function() {
return r
})), i.d(t, "chartWidgetCollectionService", (function() {
return n
})), i.d(t, "CollectionViewMode", (function() {
return o
}));
var s = i("eqEH");
const r = {
id: "ChartWidgetCollectionService"
};
function n() {
return Object(s.hasService)(r) ? Object(s.service)(r) : null
}
var o;
! function(e) {
e.Multichart = "multichart", e.ForceFullscreen = "force-fullscreen"
}(o || (o = {}))
},
vTIA: function(e, t, i) {
"use strict";
var s, r;
i.r(t), i.d(t, "PositionPLDisplay", (function() {
return s
})), i.d(t, "TradingSourcesHorizontalAlignment", (function() {
return r
})), i.d(t, "tradingPreferencesDefault", (function() {
return n
})), i.d(t, "CustomSourceLayer", (function() {
return o
})),
function(e) {
e[e.Money = 0] = "Money", e[e.Pips = 1] = "Pips", e[e.Percentage = 2] = "Percentage"
}(s || (s = {})),
function(e) {
e[e.Left = 0] = "Left", e[e.Center = 1] = "Center", e[e.Right = 2] = "Right"
}(r || (r = {}));
const n = {
showPositions: !1,
positionPL: {
visibility: !1,
display: s.Money
},
showOrders: !1,
showExecutions: !1,
extendLeft: !1,
lineLength: 0,
horizontalAlignment: r.Left,
lineWidth: 0,
lineStyle: 0
};
var o;
! function(e) {
e[e.Background = 0] = "Background", e[e.Foreground = 1] = "Foreground", e[e.Topmost = 2] =
"Topmost"
}(o || (o = {}))
},
vaqD: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LoadingScreen", (function() {
return o
}));
var s = i("Kxc7"),
r = i("4vW/"),
n = i("YWnQ");
class o {
constructor(e, t) {
this._showed = !1, this._cw = e, this._element = document.createElement("div"), this
._element.classList.add("chart-loading-screen"), this._shield = document
.createElement("div"), this._shield.classList.add(
"chart-loading-screen-shield"), this._element.appendChild(this._shield), t
.appendChild(this._element), this._cw.withModel(this, this._connectToModel)
}
show() {
this._cw.setInLoadingState(!0), this._showed || (this._showed = !0, this._show())
}
hide() {
this._cw.setInLoadingState(!1), this._showed && this._hide()
}
isShown() {
return this._showed
}
_connectToModel() {
const e = this._cw.model().mainSeries().dataEvents();
e.symbolError().subscribe(this, e => {
e !== n.permissionDenied && this.hide()
}),
e.seriesError().subscribe(this, () => {
Object(s.enabled)("hide_loading_screen_on_series_error") && this.hide()
}), e.completed().subscribe(this, this.hide)
}
_show() {
const e = this._cw.properties().childs().paneProperties.childs();
let t;
if (e.backgroundType.value() === r.ColorType.Solid) t = e.background.value();
else {
t = `linear-gradient(${e.backgroundGradientStartColor.value()},${e.backgroundGradientEndColor.value()})`
}
this._shield.style.background = t, this._element.classList.add("fade")
}
_hide() {
this._showed = !1, this._element.classList.remove("fade")
}
}
},
vq8G: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "SelectionRenderer", (function() {
return o
}));
var s = i("VdBB"),
r = i("//lt"),
n = i("f6yo");
class o {
constructor(e) {
this._data = e || null
}
setData(e) {
this._data = e
}
draw(e, t) {
if (null === this._data || !this._data.visible) return;
const i = t.pixelRatio;
e.strokeStyle = void 0 !== this._data.color ? this._data.color : "#1E53E5", e
.lineCap = "butt";
const s = Math.max(1, Math.floor(i));
e.lineWidth = s;
const r = this._data.vertOffset || 0;
for (let t = 0; t < this._data.points.length; ++t) {
const o = this._data.points[t];
(n = o, Number.isFinite(n.x) && Number.isFinite(n.y)) && (e.fillStyle = this
._data.bgColors[t], this._drawMarker(e, o, r, s, i))
}
var n
}
hitTest(e) {
if (!this._data || !this._data.visible) return null;
for (let t = 0; t < this._data.points.length; t++) {
const i = this._data.points[t];
if (i.subtract(e).length() <= 5.5) {
const e = void 0 !== this._data.pointsCursorType ? this._data
.pointsCursorType[t] : r.PaneCursorType.Default;
return new s.HitTestResult(this._data.hittestResult, {
pointIndex: i.data,
cursorType: e
})
}
}
return null
}
doesIntersectWithBox(e) {
return !!this._data && this._data.points.some(t => Object(n.pointInBox)(t, e))
}
_drawMarker(e, t, i, s, r) {
let n = Math.round(3.5 * r * 2);
n % 2 != s % 2 && (n += 1);
let o = Math.round(n + 2 * (.5 * s + .75 * r));
o % 2 != s % 2 && (o += 1);
const a = Math.round(t.x * r),
l = Math.round((t.y + i) * r),
c = s % 2 / 2;
e.beginPath(), e.arc(a + c, l + c, o / 2, 0, 2 * Math.PI, !0), e.closePath(), e
.fill(), e.beginPath(), e.arc(a + c, l + c, n / 2, 0, 2 * Math.PI, !0), e
.closePath(), e.stroke()
}
}
},
vwKG: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "showTooManyStudiesNotice", (function() {
return n
}));
var s = i("YFKU"),
r = i("fZEr");
function n(e) {
"number" != typeof e && (e = TradingView.STUDY_COUNT_LIMIT), Object(r.showWarning)({
title: Object(s.t)("Warning"),
text: Object(s.t)(
"Studies limit exceeded: {number} studies per layout.\nPlease, remove some studies."
).format({
number: e
})
})
}
},
w4Ji: function(e, t, i) {
"use strict";
function s(e) {
const t = new Map;
return e.plots.forEach((e, i) => {
t.set(e.id, e => e[i + 1])
}), t
}
function r(e, t) {
return null == e[t]
}
i.r(t), i.d(t, "studyPlotFunctionMap", (function() {
return s
})), i.d(t, "studyEmptyPlotValuePredicate", (function() {
return r
}))
},
w9cH: function(e, t, i) {
"use strict";
function s(e) {
if (e instanceof Error) return e.stack || e.message;
try {
return e.outerHTML.slice(0, 1024)
} catch (e) {}
try {
if (void 0 !== e) return JSON.stringify(e).slice(0, 1024)
} catch (e) {}
return String(e)
}
function r() {
window.__tv_js_errors || (window.__tv_js_errors = []), window.addEventListener("error",
e => {
const t = (new Date).toISOString();
window.__tv_js_errors.push(
`${t} ${e.message || "JS error"}. ${e.filename || ""}, line ${e.lineno}, col ${e.colno}.\nError: ` +
s(e.error))
}, !1), window.addEventListener("unhandledrejection", e => {
const t = (new Date).toISOString();
window.__tv_js_errors.push(t + " Unhandled rejection.\nReason: " + s(e.reason))
}, !1), document.addEventListener("securitypolicyviolation", e => {
var t, i;
const r = (new Date).toISOString(),
n = "report" === e.disposition ? "CSP report-only" : "CSP violation";
window.__tv_js_errors.push(
`${r} ${n}: ${e.violatedDirective || e.effectiveDirective}. ${e.sourceFile || ""}, line ${null !== (t = e.lineno) && void 0 !== t ? t : e.lineNumber}, col ${null !== (i = e.colno) && void 0 !== i ? i : e.columnNumber}.\nBlocked URI: ${e.blockedURL || e.blockedURI}\nSample: ${e.sample}\nTarget: ` +
s(e.target))
}, !1)
}
i.r(t), i.d(t, "install", (function() {
return r
}))
},
wGNx: function(e, t, i) {
"use strict";
var s;
i.r(t), i.d(t, "RiskRewardPointIndex", (function() {
return s
})),
function(e) {
e[e.Entry = 0] = "Entry", e[e.Close = 1] = "Close", e[e.ActualEntry = 2] =
"ActualEntry", e[e.ActualClose = 3] = "ActualClose"
}(s || (s = {}))
},
wOSo: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return a
}));
var s = i("IWXC"),
r = i("aIyQ"),
n = i.n(r),
o = i("e3/o");
class a {
constructor() {
this._quotes = null, this._quoteSessionSymbol = null, this._quoteSessionClientId =
"", this._quotesUpdate = new n.a, this._quoteSymbolChanged = new n.a
}
setQuotesSessionSymbol(e) {
this._quoteSessionSymbol !== e && (this._quoteSessionClientId || (this
._quoteSessionClientId = "series-" + Object(o.guid)()), this
._unsubscribeQuoteSession(), this._quotes = null, e && (this
._quoteSessionSymbol = e, Object(s.getQuoteSessionInstance)("full")
.subscribe(this._quoteSessionClientId, this._quoteSessionSymbol, this
._onUpdate.bind(this))), this._quoteSymbolChanged.fire())
}
quotesUpdate() {
return this._quotesUpdate
}
quoteSymbolChanged() {
return this._quoteSymbolChanged
}
quotes() {
return this._quotes
}
destroy() {
this._unsubscribeQuoteSession()
}
_onUpdate(e, t) {
this._quotes = e && e.values || null, t && t.values && this._quotesUpdate.fire(e, t)
}
_unsubscribeQuoteSession() {
this._quoteSessionSymbol && (Object(s.getQuoteSessionInstance)("full").unsubscribe(
this._quoteSessionClientId, this._quoteSessionSymbol), this
._quoteSessionSymbol = null, this._quotes = null)
}
}
},
wVAQ: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "fetch", (function() {
return r
}));
var s = i("txPx");
Object(s.getLogger)("Fetch");
function r(e, t, i = {}) {
return window.fetch(e, t)
}
},
wYrq: function(e, t, i) {
"use strict";
var s = i("Eyy1"),
r = i("aO4+"),
n = i("eJTA"),
o = i("Kxc7"),
a = i("Hr11"),
l = i("ogJP"),
c = i("Tmoa"),
h = i("dOnf");
function u(e, t) {
const i = new Map;
return function(...s) {
const r = "" + (t ? t.apply(null, s) : s[0]);
if (!i.has(r)) {
const t = e.apply(this, s);
return i.set(r, t), t
}
return i.get(r)
}
}
var d = i("VdBB"),
p = i("u0yd"),
_ = i("Zy3/"),
m = i("gyZD"),
f = i("Zp8I"),
g = i("k9/m"),
b = i("o2pV"),
v = i("vq8G"),
S = i("i6cO"),
y = i("Zp/P");
class w {
constructor(e) {
this._data = e
}
draw(e, t) {
const i = this._data,
s = t.pixelRatio,
r = Math.max(1, Math.floor(s)) % 2 ? .5 : 0,
n = i.vertOffset || 0,
o = i.lineColor || i.color,
a = i.lineWidth || i.height / 2;
let c = "",
h = !1;
for (const t of i.items) {
const i = t.x,
u = t.y + n;
if (Object(l.isNaN)(i) || Object(l.isNaN)(u)) continue;
let d, p;
null != t.style ? (d = t.style.color, p = t.style.width) : (d = o, p = a), d !==
c && (c = d, h && e.fill(), e.beginPath(), e.fillStyle = d);
const _ = Math.round(i * s) + r,
m = Math.round(u * s) + r,
f = Math.round(p * s) + r;
e.moveTo(_ + f, m), e.arc(_, m, f, 0, 2 * Math.PI, !1), h = !0
}
h && e.fill()
}
hitTest(e) {
const t = this._data,
i = t.lineWidth || t.height / 2,
s = t.vertOffset || 0,
n = Object(y.interactionTolerance)().series + i;
for (const o of t.items) {
if (!o) continue;
if (new r.Point(o.x, o.y + s).subtract(e).length() + i <= n) return new d
.HitTestResult(d.HitTestResult.REGULAR)
}
return null
}
}
class P {
constructor(e) {
this._data = null, this._precalculatedCache = [], this.setData(e)
}
setData(e) {
this._data = e, this._precalculatedCache = []
}
draw(e, t) {
if (null === this._data || 0 === this._data.items.length) return;
const i = t.pixelRatio;
this._precalculatedCache.length || this._fillPrecalculatedCache(i);
const s = Math.max(1, Math.floor(i)),
r = Math.round(this._data.histogramBase * i) - Math.floor(s / 2),
n = r + s,
o = this._data.lineColor;
for (let t = 0; t < this._data.items.length; t++) {
const a = this._data.items[t],
l = this._precalculatedCache[t],
c = Math.round(a.y * i),
h = a.style ? a.style.color : o;
let u, d;
e.fillStyle = h, c <= r ? (u = c, d = n) : (u = r, d = c - Math.floor(s / 2) +
s), e.fillRect(l.left, u, l.right - l.left + 1, d - u)
}
}
hitTest(e) {
if (null === this._data) return null;
const t = .5 * this._data.barSpacing,
i = e.x - t,
s = e.x + t;
for (const t of this._data.items) {
const r = t.x;
if (r >= i && r <= s) {
const i = t.y;
if (e.y >= Math.min(i, this._data.histogramBase) && e.y <= Math.max(i, this
._data.histogramBase)) return new d.HitTestResult(d.HitTestResult
.REGULAR)
}
}
return null
}
_fillPrecalculatedCache(e) {
if (null === this._data || 0 === this._data.items.length) return void(this
._precalculatedCache = []);
const t = Math.ceil(this._data.barSpacing * e) <= 1 ? 0 : Math.max(1, Math.floor(
e)),
i = Math.round(this._data.barSpacing * e) - t;
this._precalculatedCache = new Array(this._data.items.length);
for (let t = 0; t < this._data.items.length; t++) {
const s = this._data.items[t],
r = Math.round(s.x * e);
let n, o;
if (i % 2) {
const e = (i - 1) / 2;
n = r - e, o = r + e
} else {
const e = i / 2;
n = r - e, o = r + e - 1
}
this._precalculatedCache[t] = {
left: n,
right: o,
roundedCenter: r,
center: s.x * e,
time: s.timePointIndex
}
}
for (let e = 1; e < this._data.items.length; e++) {
const i = this._precalculatedCache[e],
s = this._precalculatedCache[e - 1];
i.time === s.time + 1 && (i.left - s.right !== t + 1 && (s.roundedCenter > s
.center ? s.right = i.left - t - 1 : i.left = s.right + t + 1))
}
let s = Math.ceil(this._data.barSpacing * e);
for (let e = 0; e < this._data.items.length; e++) {
const t = this._precalculatedCache[e];
t.right < t.left && (t.right = t.left);
const i = t.right - t.left + 1;
s = Math.min(i, s)
}
if (t > 0 && s < 4)
for (let e = 0; e < this._data.items.length; e++) {
const t = this._precalculatedCache[e];
t.right - t.left + 1 > s && (t.roundedCenter > t.center ? t.right -= 1 : t
.left += 1)
}
}
}
var C = i("GEp6");
class x {
constructor(e) {
this._data = e
}
draw(e, t) {
var i, s, r, n;
const o = t.pixelRatio;
let a = "",
c = !1;
for (const t of this._data.items) {
if (Object(l.isNaN)(t.x) || Object(l.isNaN)(t.y)) continue;
const h = null !== (s = null === (i = t.style) || void 0 === i ? void 0 : i
.color) && void 0 !== s ? s : this._data.lineColor,
u = Math.max(1, Math.floor((null !== (n = null === (r = t.style) ||
void 0 === r ? void 0 : r.width) && void 0 !== n ? n : this
._data.lineWidth) * o));
h !== a && (a = h, c && e.fill(), e.beginPath(), e.fillStyle = h);
let d = 3 * u;
d % 2 != u % 2 && (d += 1);
const p = Math.round(Math.round(t.x * o) - d / 2),
_ = Math.round(Math.round(t.y * o) - d / 2),
m = p + Math.floor(d / 2 - u / 2),
f = _ + Math.floor(d / 2 - u / 2);
e.rect(p, f, d, u), e.rect(m, _, u, d), c = !0
}
c && e.fill()
}
hitTest(e) {
const t = Object(y.interactionTolerance)().series + this._data.lineWidth / 2;
let i, s, n, o;
for (let a = 1; a < this._data.items.length; ++a) {
i = this._data.items[a - 1], s = this._data.items[a], n = i.x, o = s.x;
if (Object(C.distanceToSegment)(new r.Point(n, i.y), new r.Point(o, s.y), new r
.Point(e.x, e.y)).distance <= t) return new d.HitTestResult(d
.HitTestResult.REGULAR)
}
return null
}
}
class T {
constructor(e) {
this._data = e
}
draw(e, t) {
if (0 === this._data.items.length) return;
const i = t.pixelRatio;
e.fillStyle = this._data.lineColor;
const s = Math.max(1, Math.floor(this._data.lineWidth * i)),
r = s / 2,
n = Math.max(1, Math.floor(i)),
o = Math.round(this._data.histogramBase * i) - Math.floor(n / 2),
a = o + n;
for (const t of this._data.items) {
let l = s,
c = r;
t.style ? (e.fillStyle = t.style.color, l = Math.max(1, Math.floor(t.style
.width * i)), c = l / 2) : e.fillStyle = this._data.lineColor;
const h = l % 2 ? .5 : 0,
u = Math.round(t.x * i) + h,
d = Math.round(t.y * i);
let p, _;
d <= o ? (p = d, _ = a) : (p = o, _ = d - Math.floor(n / 2) + n), e.fillRect(
Math.floor(u - c), p, l, _ - p)
}
}
hitTest(e) {
const t = Object(y.interactionTolerance)().series + this._data.lineWidth / 2,
i = new Map;
for (const n of this._data.items) {
const o = n.x,
a = n.y;
let l = t;
n.style && (i.has(n.style.width) ? l = Object(s.ensureDefined)(i.get(n.style
.width)) : i.set(this._data.lineWidth, l));
if (Object(C.distanceToSegment)(new r.Point(o, a), new r.Point(o, this._data
.histogramBase), new r.Point(e.x, e.y)).distance <= l) return new d
.HitTestResult(d.HitTestResult.REGULAR)
}
return null
}
}
var I = i("23IT"),
M = i("UAFa");
i.d(t, "a", (function() {
return A
}));
const O = e => {
const t = Object(n.rgbToHsl)(Object(n.parseRgb)(e)),
i = t[0] + .05;
return t[0] = i - Math.floor(i), Object(n.rgbToHexString)(Object(n.hslToRgb)(t))
},
L = u(O);
class A {
constructor(e, t, i, s) {
this._histogramBase = null, this._items = [], this._selectionData = null, this
._lineColor = "", this._lineWidth = 1, this._color1 = "", this._color2 = "",
this._invalidated = !1, this._isMarkersEnabled = o.enabled(
"source_selection_markers"), this._study = e, this._series = t, this
._model = i, this._plotName = s, this._plotIndex = e.metaInfo().plots.findIndex(
e => e.id === s), this._colorProvider = Object(M
.createStudyPlotColorProvider)(e.metaInfo(), e.properties(), s), this
._selectionIndexer = new b.SelectionIndexes(i.timeScale())
}
items() {
return this._items
}
update() {
this._invalidated = !0
}
renderer() {
const e = this._study.properties().styles[this._plotName];
if (!e.visible.value()) return null;
if (!this._study.priceScale()) return null;
this._invalidated && (this._updateImpl(), this._invalidated = !1);
const t = {};
t.barSpacing = this._model.timeScale().barSpacing(), t.items = this._items,
t.histogramBase = this._histogramBase ? this._histogramBase : Object(s
.ensureNotNull)(this._study.priceScale()).height(), t.lineIndex = 0, t
.lineStyle = e.linestyle.value(), t.lineColor = this._lineColor, t.lineWidth =
this._lineWidth, t.lineWidth = Object(l.isNumber)(t.lineWidth) ? t.lineWidth :
1, t.color1 = this._color1, t.color2 = this._color2, t.bottom = t.histogramBase,
t.simpleMode = this._colorProvider.singleColor();
const i = new _.CompositeRenderer,
r = !!e.joinPoints && e.joinPoints.value();
switch (e.plottype.value()) {
case I.LineStudyPlotStyle.Line:
case I.LineStudyPlotStyle.LineWithBreaks:
i.append(new m.PaneRendererLine(t));
break;
case I.LineStudyPlotStyle.Area:
case I.LineStudyPlotStyle.AreaWithBreaks:
i.append(new p.PaneRendererArea(t));
break;
case I.LineStudyPlotStyle.Histogram:
i.append(new T(t));
break;
case I.LineStudyPlotStyle.Columns:
i.append(new P(t));
break;
case I.LineStudyPlotStyle.Cross:
if (i.append(new x(t)), r) {
const e = Object(h.deepCopy)(t);
e.lineWidth = 1, e.forceLineWidth = !0, i.append(new m.PaneRendererLine(
e))
}
break;
case I.LineStudyPlotStyle.Circles:
if (i.append(new w(t)), r) {
const e = Object(h.deepCopy)(t);
e.lineWidth = 1, e.ignorePaletteLineWidth = !0, i.append(new m
.PaneRendererLine(e))
}
break;
case I.LineStudyPlotStyle.StepLine:
case I.LineStudyPlotStyle.StepLineWithDiamonds: {
t.decoration = e.plottype.value() === I.LineStudyPlotStyle
.StepLineWithDiamonds ? f.StepLineDecoration.Diamonds : f
.StepLineDecoration.None;
const s = new f.PaneRendererStepLine;
s.setData(t), i.append(s);
break
}
default:
i.append(new m.PaneRendererLine(t))
}
return this._model.selection().isSelected(this._study) && this._isMarkersEnabled &&
this._selectionData && i.append(new v.SelectionRenderer(this._selectionData)), i
}
_getTranspValue() {
const e = this._study.properties(),
t = e.styles[this._plotName];
let i = 0;
const s = this._study.metaInfo();
return "Volume@tv-basicstudies" === s.id && s.version <= 46 && "transparency" in e ?
(i = e.transparency.value(), i = Object(l.isNumber)(i) ? i : 0, i) : (t
.transparency && (i = t.transparency.value(), i = Object(l.isNumber)(i) ?
i : 0), i)
}
_updateImpl() {
var e, t, i, n, o;
this._histogramBase = null, this._items = [];
const l = this._study.priceScale();
if (this._model.timeScale().isEmpty() || null === l || l.isEmpty()) return;
const h = this._model.timeScale().visibleBarsStrictRange();
if (null === h) return;
let u = null !== (e = this._series.nearestIndex(h.firstBar() - 1, g
.PlotRowSearchMode.NearestLeft)) && void 0 !== e ? e : this._series.bars()
.firstIndex(),
p = null !== (t = this._series.nearestIndex(h.lastBar() + 1, g.PlotRowSearchMode
.NearestRight)) && void 0 !== t ? t : this._series.bars().lastIndex();
if (null === u || null === p) return;
const _ = this._study.offset(this._plotName);
_ > 0 ? (u -= _, p += _) : (u += _, p -= _);
const m = this._study.getMinFirstBarIndexForPlot(this._plotName);
if (m > p) return;
u = Math.max(m, u);
const f = this._study.properties().styles[this._plotName],
b = f.plottype.value(),
v = [I.LineStudyPlotStyle.Line, I.LineStudyPlotStyle.Area, I.LineStudyPlotStyle
.Circles, I.LineStudyPlotStyle.Cross
].indexOf(b) >= 0,
y = this._study.data(),
w = this._study.firstValue();
if (null === w) return;
const P = y.rangeIterator(u, p),
C = this._study.priceScale();
if (null === C) return;
const x = Object(a.clamp)(this._getTranspValue(), 0, 100),
T = new Map,
M = (e, t) => {
let i = T.get(e);
void 0 === i && (i = new Map, T.set(e, i));
let s = i.get(t);
if (void 0 === s) {
const r = !this._plotName || "vol" !== this._plotName;
s = Object(c.generateColor)(e, t, r), i.set(t, s)
}
return s
};
let A = NaN,
E = NaN;
const k = Object(S.createEmptyStyle)();
for (; P.hasNext();) {
const e = P.next();
let t = e.index;
const o = e.value;
t += _, t = Math.floor(t);
let a = o[this._plotIndex + 1];
const l = null == a;
if (a = l ? NaN : a, v && l) {
E = a;
continue
}
const h = new r.Point(t, Object(s.ensure)(a));
h.timePointIndex = t, h.valIsNotSameAsPrev = a !== E;
if (this._colorProvider.isColorDefined() && (h.style = {
color: M(f.color.value(), 100),
width: f.linewidth.value(),
style: f.linestyle.value()
}, null != a)) {
const e = this._colorProvider.getPlotPointStyle(o, k),
t = e.colors[S.ColorerType.Main];
void 0 !== t && (h.style.color = Object(c.isHexColor)(t) ? M(t, x) : t), h
.style.width = null !== (i = e.lineWidth) && void 0 !== i ? i : h.style
.width, h.style.style = null !== (n = e.lineStyle) && void 0 !== n ? n :
h.style.style
}
v || isNaN(A) || A === t - 1 || this._items.push(new r.Point(t - 1, NaN)), A =
t, E = a, this._items.push(h)
}
if (C.pointsArrayToCoordinates(this._items, w), this._model.timeScale()
.timedValuesToCoordinates(this._items), f.histogramBase && (this
._histogramBase = C.priceToCoordinate(f.histogramBase.value(), w)), this
._model.selection().isSelected(this._study)) {
const e = this._selectionIndexer.indexes();
this._selectionData = {
points: [],
bgColors: [],
visible: !0,
hittestResult: d.HitTestResult.REGULAR,
barSpacing: this._model.timeScale().barSpacing()
};
const t = Object(s.ensureNotNull)(this._model.paneForSource(this._study))
.height();
for (let i = 0; i < e.length; i++) {
let s = e[i];
const n = this._study.data().valueAt(s);
if (s += _, null === n) continue;
const o = n[this._plotIndex + 1];
if (null == o) continue;
const a = this._model.timeScale().indexToCoordinate(Math.floor(s)),
l = C.priceToCoordinate(o, w);
this._selectionData.points.push(new r.Point(a, l)), this._selectionData
.bgColors.push(this._model.backgroundColorAtYPercentFromTop(l / t))
}
} else this._selectionIndexer.clear();
const D = f;
this._lineColor = Object(c.generateColor)(D.color.value(), x), this._lineWidth = D
.linewidth.value();
let V = D.color.value();
const B = this._colorProvider.getDefaultPlotPointStyle();
B && (V = B.colors[S.ColorerType.Main], this._lineWidth = null !== (o = B
.lineWidth) && void 0 !== o ? o : this._lineWidth, this._lineColor = V ?
Object(c.generateColor)(V, x) : this._lineColor), this._color2 = Object(c
.generateColor)(V, x);
const R = this._study.metaInfo().isRGB ? O(V) : L(V);
this._color1 = Object(c.generateColor)(R, x)
}
}
},
wZIs: function(e, t, i) {
"use strict";
var s = i("vTIA").PositionPLDisplay;
const {
getHexColorByName: r
} = i("HGP3"), {
generateColor: n
} = i("Tmoa");
var o = i("vTIA").TradingSourcesHorizontalAlignment,
a = i("dfhE"),
l = i("rCHB").LineToolPitchforkStyle,
c = i("Ye2/").LineToolBarsPatternMode,
h = i("23IT").LineStudyPlotStyle,
u = i("8OdW"),
d = i("oXaB").PriceAxisLastValueMode,
p = i("XXdw").StoriesTimeLineItemType,
_ = i("4o++").MagnetMode,
m = i("a7Ha").LineEnd,
f = i("4vW/").ColorType,
g = i("bKFv").StatsPosition,
b = i("sDZI").sessionsPreferencesDefault,
v = i("txPx").getLogger("Chart.Defaults"),
S = i("zDbI").CHART_FONT_FAMILY;
const y = r("color-tv-blue-500");
var w = function(e) {
var t = function(e, t) {
return {
color: e,
visible: t
}
},
i = function(e, t, i) {
return {
coeff: e,
color: t,
visible: i
}
},
r = function(e, t, i, s, r) {
return {
coeff: e,
color: t,
visible: i,
linestyle: void 0 === s ? CanvasEx.LINESTYLE_SOLID : s,
linewidth: void 0 === r ? 1 : r
}
},
v = function(e, t, i) {
return {
color: e,
width: i,
visible: t
}
},
w = function(e, t, i, s, r) {
return {
color: e,
visible: t,
width: i,
x: s,
y: r
}
},
P = function(e, t, i, s, r, n) {
return {
coeff1: e,
coeff2: t,
color: i,
visible: s,
linestyle: void 0 === r ? CanvasEx.LINESTYLE_SOLID : r,
linewidth: void 0 === n ? 1 : n
}
};
if (void 0 === TradingView.defaultProperties) {
var T;
switch (window.locale) {
case "ar_AE":
T = "Asia/Dubai";
break;
case "au":
T = "Australia/Sydney";
break;
case "br":
T = "America/Sao_Paulo";
break;
case "ca":
T = "America/Toronto";
break;
case "de_DE":
case "it":
T = "Europe/Berlin";
break;
case "es":
T = "Europe/Madrid";
break;
case "fa_IR":
T = "Asia/Tehran";
break;
case "fr":
case "sv_SE":
T = "Europe/Paris";
break;
case "he_IL":
case "tr":
T = "Europe/Athens";
break;
case "hu_HU":
case "pl":
T = "Europe/Warsaw";
break;
case "id":
case "th_TH":
case "vi_VN":
T = "Asia/Bangkok";
break;
case "in":
T = "Asia/Kolkata";
break;
case "ja":
case "kr":
T = "Asia/Tokyo";
break;
case "ms_MY":
T = "Asia/Singapore";
break;
case "ru":
T = "Europe/Moscow";
break;
case "uk":
T = "Europe/London";
break;
case "zh_CN":
case "zh_TW":
T = "Asia/Shanghai";
break;
default:
T = "Etc/UTC"
}
TradingView.defaultProperties = {
chartproperties: {
timezone: T,
priceScaleSelectionStrategyName: "auto",
dataWindowProperties: {
background: "rgba( 255, 254, 206, 0.2)",
border: "rgba( 96, 96, 144, 1)",
font: "Verdana",
fontBold: !1,
fontItalic: !1,
fontSize: 10,
transparency: 80,
visible: !0
},
paneProperties: {
backgroundType: f.Solid,
background: "#ffffff",
backgroundGradientStartColor: "#ffffff",
backgroundGradientEndColor: "#ffffff",
vertGridProperties: {
color: "rgba(42, 46, 57, 0.06)",
style: CanvasEx.LINESTYLE_SOLID
},
horzGridProperties: {
color: "rgba(42, 46, 57, 0.06)",
style: CanvasEx.LINESTYLE_SOLID
},
crossHairProperties: {
color: "#9598A1",
style: CanvasEx.LINESTYLE_DASHED,
transparency: 0,
width: 1
},
topMargin: 10,
bottomMargin: 8,
axisProperties: {
autoScale: !0,
autoScaleDisabled: !1,
lockScale: !1,
percentage: !1,
percentageDisabled: !1,
indexedTo100: !1,
log: !1,
logDisabled: !1,
alignLabels: !0,
isInverted: !1
},
legendProperties: {
showStudyArguments: !0,
showStudyTitles: !0,
showStudyValues: !0,
showSeriesTitle: !0,
showSeriesOHLC: !0,
showLegend: !0,
showBarChange: !0,
showBackground: !0,
backgroundTransparency: 50,
wrapText: !1
}
},
scalesProperties: {
backgroundColor: "#ffffff",
lineColor: "rgba(42, 46, 57, 0.14)",
textColor: "#131722",
fontSize: 12,
scaleSeriesOnly: !1,
showSeriesLastValue: !0,
seriesLastValueMode: d.LastValueAccordingToScale,
showSeriesPrevCloseValue: !1,
showStudyLastValue: !1,
showSymbolLabels: !1,
showStudyPlotLabels: !1,
showBidAskLabels: !1,
showPrePostMarketPriceLabel: !0,
showFundamentalNameLabel: !1,
showFundamentalLastValue: !1,
barSpacing: u.DEFAULT_BAR_SPACING,
showCurrency: !0,
showUnit: !0
},
mainSeriesProperties: {
style: a.STYLE_CANDLES,
esdShowDividends: !0,
esdShowSplits: !0,
esdShowEarnings: !0,
esdShowBreaks: !1,
esdFlagSize: 2,
showCountdown: !0,
bidAsk: {
visible: !1,
lineStyle: CanvasEx.LINESTYLE_DOTTED,
lineWidth: 1,
bidLineColor: y,
askLineColor: "#EF5350"
},
prePostMarket: {
visible: !0,
lineStyle: CanvasEx.LINESTYLE_DOTTED,
lineWidth: 1,
preMarketColor: "#fb8c00",
postMarketColor: y
},
highLowAvgPrice: {
highLowPriceLinesVisible: !1,
highLowPriceLabelsVisible: !1,
averageClosePriceLineVisible: !1,
averageClosePriceLabelVisible: !1
},
showInDataWindow: !0,
visible: !0,
showPriceLine: !0,
priceLineWidth: 1,
priceLineColor: "",
baseLineColor: "#B2B5BE",
showPrevClosePriceLine: !1,
prevClosePriceLineWidth: 1,
prevClosePriceLineColor: "rgba( 85, 85, 85, 1)",
minTick: "default",
dividendsAdjustment: void 0,
sessionId: "regular",
sessVis: !1,
statusViewStyle: {
fontSize: 16,
showExchange: !0,
showInterval: !0,
symbolTextSource: "description"
},
candleStyle: {
upColor: "#26a69a",
downColor: "#ef5350",
drawWick: !0,
drawBorder: !0,
borderColor: "#378658",
borderUpColor: "#26a69a",
borderDownColor: "#ef5350",
wickColor: "#737375",
wickUpColor: "#26a69a",
wickDownColor: "#ef5350",
barColorsOnPrevClose: !1,
drawBody: !0
},
hollowCandleStyle: {
upColor: "#26a69a",
downColor: "#ef5350",
drawWick: !0,
drawBorder: !0,
borderColor: "rgba( 55, 134, 88, 1)",
borderUpColor: "#26a69a",
borderDownColor: "#ef5350",
wickColor: "rgba( 115, 115, 117, 1)",
wickUpColor: "#26a69a",
wickDownColor: "#ef5350",
drawBody: !0
},
haStyle: {
upColor: "#26a69a",
downColor: "#ef5350",
drawWick: !0,
drawBorder: !0,
borderColor: "rgba( 55, 134, 88, 1)",
borderUpColor: "#26a69a",
borderDownColor: "#ef5350",
wickColor: "rgba( 115, 115, 117, 1)",
wickUpColor: "#26a69a",
wickDownColor: "#ef5350",
showRealLastPrice: !1,
barColorsOnPrevClose: !1,
inputs: {},
inputInfo: {},
drawBody: !0
},
barStyle: {
upColor: "#26a69a",
downColor: "#ef5350",
barColorsOnPrevClose: !1,
dontDrawOpen: !1,
thinBars: !0
},
hiloStyle: {
color: y,
showBorders: !0,
borderColor: y,
showLabels: !0,
labelColor: y,
fontSize: 7,
drawBody: !0
},
lineStyle: {
color: y,
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 2,
priceSource: "close",
styleType: a.STYLE_LINE_TYPE_SIMPLE
},
areaStyle: {
color1: n(y, 72),
color2: y,
linecolor: y,
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 2,
priceSource: "close",
transparency: 100
},
priceAxisProperties: {
autoScale: !0,
autoScaleDisabled: !1,
lockScale: !1,
percentage: !1,
percentageDisabled: !1,
indexedTo100: !1,
log: !1,
logDisabled: !1,
isInverted: !1,
alignLabels: !0
},
renkoStyle: {
upColor: "#26a69a",
downColor: "#ef5350",
borderUpColor: "#26a69a",
borderDownColor: "#ef5350",
upColorProjection: "rgba( 169, 220, 195, 1)",
downColorProjection: "rgba( 245, 166, 174, 1)",
borderUpColorProjection: "rgba( 169, 220, 195, 1)",
borderDownColorProjection: "rgba( 245, 166, 174, 1)",
wickUpColor: "#26a69a",
wickDownColor: "#ef5350",
inputs: {
source: "close",
sources: "Close",
boxSize: 3,
style: "ATR",
atrLength: 14,
wicks: !0
},
inputInfo: {
source: {
name: "source"
},
sources: {
name: "Source"
},
boxSize: {
name: "Box size"
},
style: {
name: "Style"
},
atrLength: {
name: "ATR length"
},
wicks: {
name: "Wicks"
}
}
},
pbStyle: {
upColor: "#26a69a",
downColor: "#ef5350",
borderUpColor: "#26a69a",
borderDownColor: "#ef5350",
upColorProjection: "rgba( 169, 220, 195, 1)",
downColorProjection: "rgba( 245, 166, 174, 1)",
borderUpColorProjection: "rgba( 169, 220, 195, 1)",
borderDownColorProjection: "rgba( 245, 166, 174, 1)",
inputs: {
source: "close",
lb: 3
},
inputInfo: {
source: {
name: "Source"
},
lb: {
name: "Number of line"
}
}
},
kagiStyle: {
upColor: "#26a69a",
downColor: "#ef5350",
upColorProjection: "rgba( 169, 220, 195, 1)",
downColorProjection: "rgba( 245, 166, 174, 1)",
inputs: {
source: "close",
style: "ATR",
atrLength: 14,
reversalAmount: 1
},
inputInfo: {
source: {
name: "Source"
},
style: {
name: "Style"
},
atrLength: {
name: "ATR length"
},
reversalAmount: {
name: "Reversal amount"
}
}
},
pnfStyle: {
upColor: "#26a69a",
downColor: "#ef5350",
upColorProjection: "rgba( 169, 220, 195, 1)",
downColorProjection: "rgba( 245, 166, 174, 1)",
inputs: {
sources: "Close",
reversalAmount: 3,
boxSize: 1,
style: "ATR",
atrLength: 14,
oneStepBackBuilding: !1
},
inputInfo: {
sources: {
name: "Source"
},
boxSize: {
name: "Box size"
},
reversalAmount: {
name: "Reversal amount"
},
style: {
name: "Style"
},
atrLength: {
name: "ATR length"
},
oneStepBackBuilding: {
name: "One step back building"
}
}
},
baselineStyle: {
baselineColor: "rgba( 117, 134, 150, 1)",
topFillColor1: "rgba( 38, 166, 154, 0.28)",
topFillColor2: "rgba( 38, 166, 154, 0.05)",
bottomFillColor1: "rgba( 239, 83, 80, 0.05)",
bottomFillColor2: "rgba( 239, 83, 80, 0.28)",
topLineColor: "rgba( 38, 166, 154, 1)",
bottomLineColor: "rgba( 239, 83, 80, 1)",
topLineWidth: 2,
bottomLineWidth: 2,
priceSource: "close",
transparency: 50,
baseLevelPercentage: 50
},
rangeStyle: {
upColor: "#26a69a",
downColor: "#ef5350",
thinBars: !0,
upColorProjection: "rgba( 169, 220, 195, 1)",
downColorProjection: "rgba( 245, 166, 174, 1)",
inputs: {
range: 10,
phantomBars: !1
},
inputInfo: {
range: {
name: "Range"
},
phantomBars: {
name: "Phantom bars"
}
}
}
},
chartEventsSourceProperties: {
visible: !0,
futureOnly: !0,
breaks: {
color: "rgba(85, 85, 85, 1)",
visible: !1,
style: CanvasEx.LINESTYLE_DASHED,
width: 1
}
},
tradingProperties: {
showPositions: !0,
positionPL: {
visibility: !0,
display: s.Money
},
showOrders: !0,
showExecutions: !0,
horizontalAlignment: o.Left,
extendLeft: !0,
lineLength: 5,
lineWidth: 1,
lineStyle: CanvasEx.LINESTYLE_SOLID
},
editorFontsList: ["Verdana", "Courier New", "Times New Roman", "Arial"],
volumePaneSize: "large"
},
sessions: b,
drawings: {
magnet: !1,
magnetMode: _.WeakMagnet,
stayInDrawingMode: !1,
drawOnAllCharts: !0
},
linetoolorder: {
extendLeft: "inherit",
lineLength: "inherit",
lineColor: "rgba( 255, 0, 0, 1)",
lineActiveBuyColor: "rgb(64,148,232)",
lineInactiveBuyColor: "rgba(64,148,232,.5)",
lineActiveSellColor: "rgb(231,86,86)",
lineInactiveSellColor: "rgba(231,86,86,.5)",
lineStyle: "inherit",
lineWidth: "inherit",
bodyBorderActiveBuyColor: "rgb(64,148,232)",
bodyBorderInactiveBuyColor: "rgba(64,148,232,.5)",
bodyBorderActiveSellColor: "rgb(231,86,86)",
bodyBorderInactiveSellColor: "rgba(231,86,86,.5)",
bodyBackgroundColor: "rgba( 255, 255, 255, 0.75)",
bodyBackgroundTransparency: 25,
bodyTextInactiveLimitColor: "rgba(38,140,2,.5)",
bodyTextActiveLimitColor: "rgb(38,140,2)",
bodyTextInactiveStopColor: "rgba(231,86,86,.5)",
bodyTextActiveStopColor: "rgb(231,86,86)",
bodyTextInactiveBuyColor: "rgba(64,148,232,.5)",
bodyTextActiveBuyColor: "rgb(64,148,232)",
bodyTextInactiveSellColor: "rgba(231,86,86,.5)",
bodyTextActiveSellColor: "rgb(231,86,86)",
bodyFontFamily: "Verdana",
bodyFontSize: 9,
bodyFontBold: !0,
bodyFontItalic: !1,
quantityBorderActiveBuyColor: "rgb(64,148,232)",
quantityBorderInactiveBuyColor: "rgba(64,148,232,.5)",
quantityBorderActiveSellColor: "rgb(231,86,86)",
quantityBorderInactiveSellColor: "rgba(231,86,86,.5)",
quantityBackgroundInactiveBuyColor: "rgba(64,148,232,.5)",
quantityBackgroundActiveBuyColor: "rgb(64,148,232)",
quantityBackgroundInactiveSellColor: "rgba(231,86,86,.5)",
quantityBackgroundActiveSellColor: "rgb(231,86,86)",
quantityTextColor: "rgba( 255, 255, 255, 1)",
quantityTextTransparency: 0,
quantityFontFamily: "Verdana",
quantityFontSize: 9,
quantityFontBold: !0,
quantityFontItalic: !1,
cancelButtonBorderActiveBuyColor: "rgb(64,148,232)",
cancelButtonBorderInactiveBuyColor: "rgba(64,148,232,.5)",
cancelButtonBorderActiveSellColor: "rgb(231,86,86)",
cancelButtonBorderInactiveSellColor: "rgba(231,86,86,.5)",
cancelButtonBackgroundColor: "rgba( 255, 255, 255, 0.75)",
cancelButtonBackgroundTransparency: 25,
cancelButtonIconActiveBuyColor: "rgb(64,148,232)",
cancelButtonIconInactiveBuyColor: "rgba(64,148,232,.5)",
cancelButtonIconActiveSellColor: "rgb(231,86,86)",
cancelButtonIconInactiveSellColor: "rgba(231,86,86,.5)",
tooltip: "",
modifyTooltip: "",
cancelTooltip: ""
},
linetoolposition: {
extendLeft: "inherit",
lineLength: "inherit",
lineBuyColor: "rgb(64,148,232)",
lineSellColor: "rgb(231,86,86)",
lineStyle: "inherit",
lineWidth: "inherit",
bodyBorderBuyColor: "rgb(64,148,232)",
bodyBorderSellColor: "rgb(231,86,86)",
bodyBackgroundColor: "rgba( 255, 255, 255, 0.75)",
bodyBackgroundTransparency: 25,
bodyTextPositiveColor: "rgb(38,140,2)",
bodyTextNeutralColor: "rgb(100,100,100)",
bodyTextNegativeColor: "rgb(231,86,86)",
bodyFontFamily: "Verdana",
bodyFontSize: 9,
bodyFontBold: !0,
bodyFontItalic: !1,
quantityBorderBuyColor: "rgb(64,148,232)",
quantityBorderSellColor: "rgb(231,86,86)",
quantityBackgroundBuyColor: "rgb(64,148,232)",
quantityBackgroundSellColor: "rgb(231,86,86)",
quantityTextColor: "rgba( 255, 255, 255, 1)",
quantityTextTransparency: 0,
quantityFontFamily: "Verdana",
quantityFontSize: 9,
quantityFontBold: !0,
quantityFontItalic: !1,
reverseButtonBorderBuyColor: "rgb(64,148,232)",
reverseButtonBorderSellColor: "rgb(231,86,86)",
reverseButtonBackgroundColor: "rgba( 255, 255, 255, 0.75)",
reverseButtonBackgroundTransparency: 25,
reverseButtonIconBuyColor: "rgb(64,148,232)",
reverseButtonIconSellColor: "rgb(231,86,86)",
closeButtonBorderBuyColor: "rgb(64,148,232)",
closeButtonBorderSellColor: "rgb(231,86,86)",
closeButtonBackgroundColor: "rgba( 255, 255, 255, 0.75)",
closeButtonBackgroundTransparency: 25,
closeButtonIconBuyColor: "rgb(64,148,232)",
closeButtonIconSellColor: "rgb(231,86,86)",
tooltip: "",
protectTooltip: "",
closeTooltip: "",
reverseTooltip: ""
},
linetoolexecution: {
direction: "buy",
arrowHeight: 8,
arrowSpacing: 1,
arrowBuyColor: "#4094e8",
arrowSellColor: "#e75656",
text: "",
textColor: "rgba( 0, 0, 0, 1)",
textTransparency: 0,
fontFamily: "Verdana",
fontSize: 10,
fontBold: !1,
fontItalic: !1,
tooltip: ""
},
linetoolicon: {
color: y,
size: 40,
icon: 61720,
angle: .5 * Math.PI,
scale: 1
},
linetoolimage: {
transparency: 0,
cssWidth: 0,
cssHeight: 0,
angle: 0
},
linetoolbezierquadro: {
linecolor: y,
linewidth: 1,
fillBackground: !1,
backgroundColor: n(y, 80),
transparency: 50,
linestyle: CanvasEx.LINESTYLE_SOLID,
extendLeft: !1,
extendRight: !1,
leftEnd: m.Normal,
rightEnd: m.Normal
},
linetoolbeziercubic: {
linecolor: "#00bcd4",
linewidth: 1,
fillBackground: !1,
backgroundColor: "rgba(0, 188, 212, 0.2)",
transparency: 50,
linestyle: CanvasEx.LINESTYLE_SOLID,
extendLeft: !1,
extendRight: !1,
leftEnd: m.Normal,
rightEnd: m.Normal
},
linetooltrendline: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
extendLeft: !1,
extendRight: !1,
leftEnd: m.Normal,
rightEnd: m.Normal,
showLabel: !1,
horzLabelsAlign: "center",
vertLabelsAlign: "bottom",
font: "Verdana",
textcolor: y,
fontsize: 14,
bold: !1,
italic: !1,
alwaysShowStats: !1,
showMiddlePoint: !1,
showPriceRange: !1,
showBarsRange: !1,
showDateTimeRange: !1,
showDistance: !1,
showAngle: !1,
statsPosition: g.Right
},
linetoolinfoline: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
extendLeft: !1,
extendRight: !1,
leftEnd: m.Normal,
rightEnd: m.Normal,
font: "Verdana",
showLabel: !1,
horzLabelsAlign: "center",
vertLabelsAlign: "bottom",
textcolor: y,
fontsize: 14,
bold: !1,
italic: !1,
alwaysShowStats: !0,
showMiddlePoint: !1,
showPriceRange: !0,
showBarsRange: !0,
showDateTimeRange: !0,
showDistance: !0,
showAngle: !0,
statsPosition: g.Center
},
linetooltimecycles: {
linecolor: "rgba(21, 153, 128, 1)",
linewidth: 1,
fillBackground: !0,
backgroundColor: "rgba(106, 168, 79, 0.5)",
transparency: 50,
linestyle: CanvasEx.LINESTYLE_SOLID
},
linetoolsineline: {
linecolor: "rgba( 21, 153, 128, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
linetooltrendangle: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
font: "Verdana",
textcolor: y,
fontsize: 12,
bold: !1,
italic: !1,
alwaysShowStats: !1,
showMiddlePoint: !1,
showPriceRange: !1,
showBarsRange: !1,
extendRight: !1,
extendLeft: !1,
statsPosition: g.Right
},
linetooldisjointangle: {
linecolor: "rgba(0, 150, 136, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
fillBackground: !0,
backgroundColor: "rgba(0, 150, 136, 0.2)",
transparency: 20,
extendLeft: !1,
extendRight: !1,
leftEnd: m.Normal,
rightEnd: m.Normal,
font: "Verdana",
textcolor: "rgba(0, 150, 136, 1)",
fontsize: 12,
bold: !1,
italic: !1,
showPrices: !1,
showPriceRange: !1,
showDateTimeRange: !1,
showBarsRange: !1
},
linetoolflatbottom: {
linecolor: "rgba(171, 71, 188, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
fillBackground: !0,
backgroundColor: "rgba(171, 71, 188, 0.2)",
transparency: 20,
extendLeft: !1,
extendRight: !1,
leftEnd: m.Normal,
rightEnd: m.Normal,
font: "Verdana",
textcolor: "rgba(171, 71, 188, 1)",
fontsize: 12,
bold: !1,
italic: !1,
showPrices: !1,
showPriceRange: !1,
showDateTimeRange: !1,
showBarsRange: !1
},
linetoolfibspiral: {
counterclockwise: !1,
linecolor: "rgba(0, 150, 136, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
linetooldaterange: {
linecolor: y,
linewidth: 1,
font: S,
textcolor: "rgba( 255, 255, 255, 1)",
fontsize: 12,
fillLabelBackground: !0,
labelBackgroundColor: n(y, 10),
fillBackground: !0,
backgroundColor: n(y, 80),
backgroundTransparency: 60,
drawBorder: !1,
borderColor: n(y, 10),
extendTop: !1,
extendBottom: !1
},
linetoolpricerange: {
linecolor: y,
linewidth: 1,
font: S,
textcolor: "rgba( 255, 255, 255, 1)",
fontsize: 12,
fillLabelBackground: !0,
labelBackgroundColor: n(y, 10),
fillBackground: !0,
backgroundColor: n(y, 80),
backgroundTransparency: 60,
drawBorder: !1,
borderColor: n(y, 10),
extendLeft: !1,
extendRight: !1
},
linetooldateandpricerange: {
linecolor: y,
linewidth: 1,
font: S,
textcolor: "rgba( 255, 255, 255, 1)",
fontsize: 12,
fillLabelBackground: !0,
labelBackgroundColor: n(y, 10),
fillBackground: !0,
backgroundColor: n(y, 80),
backgroundTransparency: 60,
borderWidth: 1,
drawBorder: !1,
borderColor: y
},
linetoolriskrewardshort: {
linecolor: "rgba(120, 123, 134, 1)",
linewidth: 1,
font: "Verdana",
textcolor: "rgba(255, 255, 255, 1)",
fontsize: 12,
fillLabelBackground: !0,
labelBackgroundColor: "rgba( 88, 88, 88, 1)",
fillBackground: !0,
stopBackground: "rgba(244, 67, 54, 0.2)",
profitBackground: "rgba(0, 150, 136, 0.2)",
stopBackgroundTransparency: 80,
profitBackgroundTransparency: 80,
drawBorder: !1,
borderColor: "rgba( 102, 123, 139, 1)",
compact: !1,
riskDisplayMode: "percents",
accountSize: 1e3,
lotSize: 1,
risk: 25,
alwaysShowStats: !1,
showPriceLabels: !0
},
linetoolriskrewardlong: {
linecolor: "rgba(120, 123, 134, 1)",
linewidth: 1,
font: "Verdana",
textcolor: "rgba(255, 255, 255, 1)",
fontsize: 12,
fillLabelBackground: !0,
labelBackgroundColor: "rgba( 88, 88, 88, 1)",
fillBackground: !0,
stopBackground: "rgba(244, 67, 54, 0.2)",
profitBackground: "rgba(0, 150, 136, 0.2)",
stopBackgroundTransparency: 80,
profitBackgroundTransparency: 80,
drawBorder: !1,
borderColor: "rgba( 102, 123, 139, 1)",
compact: !1,
riskDisplayMode: "percents",
accountSize: 1e3,
lotSize: 1,
risk: 25,
alwaysShowStats: !1,
showPriceLabels: !0
},
linetoolarrow: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
extendLeft: !1,
extendRight: !1,
leftEnd: m.Normal,
rightEnd: m.Arrow,
font: "Verdana",
showLabel: !1,
horzLabelsAlign: "center",
vertLabelsAlign: "bottom",
textcolor: y,
fontsize: 14,
bold: !1,
italic: !1,
alwaysShowStats: !1,
showMiddlePoint: !1,
showPriceRange: !1,
showBarsRange: !1,
showDateTimeRange: !1,
showDistance: !1,
showAngle: !1,
statsPosition: g.Right
},
linetoolray: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
extendLeft: !1,
extendRight: !0,
leftEnd: m.Normal,
rightEnd: m.Normal,
font: "Verdana",
showLabel: !1,
horzLabelsAlign: "center",
vertLabelsAlign: "bottom",
textcolor: y,
fontsize: 14,
bold: !1,
italic: !1,
alwaysShowStats: !1,
showMiddlePoint: !1,
showPriceRange: !1,
showBarsRange: !1,
showDateTimeRange: !1,
showDistance: !1,
showAngle: !1,
statsPosition: g.Right
},
linetoolextended: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
extendLeft: !0,
extendRight: !0,
leftEnd: m.Normal,
rightEnd: m.Normal,
font: "Verdana",
showLabel: !1,
horzLabelsAlign: "center",
vertLabelsAlign: "bottom",
textcolor: y,
fontsize: 14,
bold: !1,
italic: !1,
alwaysShowStats: !1,
showMiddlePoint: !1,
showPriceRange: !1,
showBarsRange: !1,
showDateTimeRange: !1,
showDistance: !1,
showAngle: !1,
statsPosition: g.Right
},
linetoolhorzline: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
showPrice: !0,
showLabel: !1,
font: "Verdana",
textcolor: y,
fontsize: 12,
bold: !1,
italic: !1,
horzLabelsAlign: "center",
vertLabelsAlign: "top"
},
linetoolhorzray: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
showPrice: !0,
showLabel: !1,
font: "Verdana",
textcolor: y,
fontsize: 12,
bold: !1,
italic: !1,
horzLabelsAlign: "center",
vertLabelsAlign: "top"
},
linetoolvertline: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
extendLine: !0,
showTime: !0,
showLabel: !1,
horzLabelsAlign: "right",
vertLabelsAlign: "top",
font: "Verdana",
textcolor: y,
textOrientation: "vertical",
fontsize: 14,
bold: !1,
italic: !1
},
linetoolcrossline: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
showPrice: !0,
showTime: !0
},
linetoolcirclelines: {
trendline: {
visible: !0,
color: "rgba( 128, 128, 128, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_DASHED
},
linecolor: "rgba( 128, 204, 219, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
linetoolfibtimezone: {
horzLabelsAlign: "right",
vertLabelsAlign: "bottom",
baselinecolor: "rgba( 128, 128, 128, 1)",
linecolor: "rgba( 0, 85, 219, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
showLabels: !0,
font: S,
fillBackground: !1,
transparency: 80,
trendline: {
visible: !0,
color: "rgba( 128, 128, 128, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_DASHED
},
level1: r(0, "rgba(120, 123, 134, 1)", !0),
level2: r(1, y, !0),
level3: r(2, y, !0),
level4: r(3, y, !0),
level5: r(5, y, !0),
level6: r(8, y, !0),
level7: r(13, y, !0),
level8: r(21, y, !0),
level9: r(34, y, !0),
level10: r(55, y, !0),
level11: r(89, y, !0)
},
linetooltext: {
color: y,
font: "Verdana",
fontsize: 14,
fillBackground: !1,
backgroundColor: "rgba( 91, 133, 191, 0.3)",
backgroundTransparency: 70,
drawBorder: !1,
borderColor: "rgba( 102, 123, 139, 1)",
bold: !1,
italic: !1,
fixedSize: !0,
wordWrap: !1,
wordWrapWidth: 200
},
linetooltextabsolute: {
color: y,
font: "Verdana",
fontsize: 14,
fillBackground: !1,
backgroundColor: "rgba( 155, 190, 213, 0.3)",
backgroundTransparency: 70,
drawBorder: !1,
borderColor: "rgba( 102, 123, 139, 1)",
bold: !1,
italic: !1,
fixedSize: !1,
wordWrap: !1,
wordWrapWidth: 200
},
linetoolballoon: {
color: "#ffffff",
backgroundColor: "rgba(156, 39, 176, 0.7)",
borderColor: "rgba(156, 39, 176, 0.0)",
fontsize: 14,
transparency: 30
},
linetoolbrush: {
linecolor: "#00bcd4",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
smooth: 5,
fillBackground: !1,
backgroundColor: "rgba(0, 188, 212, 0.5)",
transparency: 50,
leftEnd: m.Normal,
rightEnd: m.Normal
},
linetoolhighlighter: {
linecolor: "rgba(236, 64, 122, 0.15)",
smooth: 5,
transparency: 85
},
linetoolpolyline: {
linecolor: "#7e57c2",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
fillBackground: !0,
backgroundColor: "rgba(126, 87, 194, 0.2)",
transparency: 50,
filled: !1
},
linetoolsignpost: {
itemType: p.Emoji,
emoji: "🙂",
showImage: !1,
plateColor: y,
fontSize: 12,
bold: !1,
italic: !1
},
linetoolpath: {
lineColor: y,
lineWidth: 2,
lineStyle: CanvasEx.LINESTYLE_SOLID,
leftEnd: m.Normal,
rightEnd: m.Arrow
},
linetoolarrowmarkleft: {
color: y,
arrowColor: y,
fontsize: 14,
font: S,
bold: !1,
italic: !1,
showLabel: !0
},
linetoolarrowmarkup: {
color: "#009688",
arrowColor: "#009688",
fontsize: 14,
font: S,
bold: !1,
italic: !1,
showLabel: !0
},
linetoolarrowmarkright: {
color: y,
arrowColor: y,
fontsize: 14,
font: S,
bold: !1,
italic: !1,
showLabel: !0
},
linetoolarrowmarkdown: {
color: "#E53935",
arrowColor: "#E53935",
fontsize: 14,
font: S,
bold: !1,
italic: !1,
showLabel: !0
},
linetoolflagmark: {
flagColor: y
},
linetoolnote: {
markerColor: y,
textColor: "#ffffff",
backgroundColor: n(y, 30),
backgroundTransparency: 0,
borderColor: y,
font: "Verdana",
fontSize: 14,
bold: !1,
italic: !1,
fixedSize: !0
},
linetoolnoteabsolute: {
markerColor: y,
textColor: "#ffffff",
backgroundColor: n(y, 30),
backgroundTransparency: 0,
borderColor: y,
font: "Verdana",
fontSize: 14,
bold: !1,
italic: !1,
fixedSize: !0
},
linetoolpricelabel: {
color: "#ffffff",
backgroundColor: y,
borderColor: y,
fontWeight: "bold",
fontsize: 14,
font: S,
transparency: 0
},
linetoolpricenote: {
showLabel: !1,
horzLabelsAlign: "center",
vertLabelsAlign: "bottom",
textColor: y,
fontSize: 14,
bold: !1,
italic: !1,
lineColor: y,
priceLabelBackgroundColor: y,
priceLabelBorderColor: y,
priceLabelTextColor: "#ffffff",
priceLabelFontSize: 12,
priceLabelBold: !1,
priceLabelItalic: !1
},
linetoolarrowmarker: {
backgroundColor: "#1E53E5",
textColor: "#1E53E5",
font: S,
bold: !0,
italic: !1,
fontsize: 16,
showLabel: !0
},
linetoolrectangle: {
color: "#9c27b0",
fillBackground: !0,
backgroundColor: "rgba(156, 39, 176, 0.2)",
linewidth: 1,
transparency: 50,
showLabel: !1,
horzLabelsAlign: "left",
vertLabelsAlign: "bottom",
textColor: "#9c27b0",
fontSize: 14,
bold: !1,
italic: !1,
extendLeft: !1,
extendRight: !1
},
linetoolrotatedrectangle: {
color: "#4caf50",
fillBackground: !0,
backgroundColor: "rgba(76, 175, 80, 0.2)",
transparency: 50,
linewidth: 1
},
linetoolellipse: {
color: "#e91e63",
fillBackground: !0,
backgroundColor: "rgba(233, 30, 99, 0.2)",
transparency: 50,
linewidth: 1
},
linetoolarc: {
color: "#ab47bc",
fillBackground: !0,
backgroundColor: "rgba(171, 71, 188, 0.2)",
transparency: 50,
linewidth: 1
},
linetoolprediction: {
linecolor: y,
linewidth: 1,
sourceBackColor: y,
sourceTextColor: "rgba(255, 255, 255, 1)",
sourceStrokeColor: y,
targetStrokeColor: y,
targetBackColor: y,
targetTextColor: "rgba(255, 255, 255, 1)",
successBackground: "rgba(76, 175, 80, 1)",
successTextColor: "rgba(255, 255, 255, 1)",
failureBackground: "rgba(244, 67, 54, 1)",
failureTextColor: "rgba(255, 255, 255, 1)",
intermediateBackColor: "rgba(234, 210, 137, 1)",
intermediateTextColor: "rgba(109, 77, 34, 1)",
transparency: 10,
centersColor: "rgba( 32, 32, 32, 1)"
},
linetooltriangle: {
color: "#f57c00",
fillBackground: !0,
backgroundColor: "rgba(245, 124, 0, 0.2)",
transparency: 50,
linewidth: 1
},
linetoolcallout: {
color: "#ffffff",
backgroundColor: "rgba(0, 151, 167, 0.7)",
transparency: 50,
linewidth: 1,
fontsize: 14,
font: "Verdana",
bordercolor: "rgba(0, 151, 167, 1)",
bold: !1,
italic: !1,
wordWrap: !1,
wordWrapWidth: 200
},
linetoolparallelchannel: {
linecolor: y,
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
extendLeft: !1,
extendRight: !1,
fillBackground: !0,
backgroundColor: n(y, 80),
transparency: 20,
showMidline: !0,
midlinecolor: y,
midlinewidth: 1,
midlinestyle: CanvasEx.LINESTYLE_DASHED
},
linetoolelliottimpulse: {
degree: 7,
showWave: !0,
color: "rgba( 61, 133, 198, 1)",
linewidth: 1
},
linetoolelliotttriangle: {
degree: 7,
showWave: !0,
color: "rgba( 255, 152, 0, 1)",
linewidth: 1
},
linetoolelliotttriplecombo: {
degree: 7,
showWave: !0,
color: "rgba( 106, 168, 79, 1)",
linewidth: 1
},
linetoolelliottcorrection: {
degree: 7,
showWave: !0,
color: "rgba( 61, 133, 198, 1)",
linewidth: 1
},
linetoolelliottdoublecombo: {
degree: 7,
showWave: !0,
color: "rgba( 106, 168, 79, 1)",
linewidth: 1
},
linetoolbarspattern: {
color: y,
mode: c.Bars,
mirrored: !1,
flipped: !1
},
linetoolghostfeed: {
averageHL: 20,
variance: 50,
candleStyle: {
upColor: "rgba(178, 223, 219, 1)",
downColor: "rgba(239, 154, 154, 1)",
drawWick: !0,
drawBorder: !0,
borderColor: "#378658",
borderUpColor: "rgba(0, 150, 136, 1)",
borderDownColor: "rgba(244, 67, 54, 1)",
wickColor: "rgba(120, 123, 134, 1)"
},
transparency: 50
},
study: {
inputs: {},
styles: {},
palettes: {},
bands: {},
area: {},
graphics: {},
showInDataWindow: !0,
visible: !0,
showStudyArguments: !0,
precision: "default"
},
linetoolpitchfork: {
fillBackground: !0,
transparency: 80,
style: l.Original,
median: {
visible: !0,
color: "rgba(244, 67, 54, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
extendLines: !1,
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
level5: r(1, y, !0),
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
level8: r(2, "rgba(229, 115, 115, 1)", !1)
},
linetoolpitchfan: {
fillBackground: !0,
transparency: 80,
median: {
visible: !0,
color: "rgba(244, 67, 54, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
level5: r(1, y, !0),
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
level8: r(2, "rgba(229, 115, 115, 1)", !1)
},
linetoolgannfan: {
showLabels: !0,
font: "Verdana",
fillBackground: !0,
transparency: 80,
level1: P(1, 8, "rgba(255, 183, 77, 1)", !0),
level2: P(1, 4, "rgba(129, 199, 132, 1)", !0),
level3: P(1, 3, "rgba(76, 175, 80, 1)", !0),
level4: P(1, 2, "rgba(0, 150, 136, 1)", !0),
level5: P(1, 1, "rgba(100, 181, 246, 1)", !0),
level6: P(2, 1, y, !0),
level7: P(3, 1, "rgba(156, 39, 176, 1)", !0),
level8: P(4, 1, "rgba(233, 30, 99, 1)", !0),
level9: P(8, 1, "rgba(229, 115, 115, 1)", !0)
},
linetoolganncomplex: {
fillBackground: !1,
arcsBackground: {
fillBackground: !0,
transparency: 80
},
reverse: !1,
scaleRatio: "",
showLabels: !0,
labelsStyle: {
font: S,
fontSize: 12,
bold: !1,
italic: !1
},
levels: [v("rgba(120, 123, 134, 1)", !0, 1), v("rgba(255, 152, 0, 1)", !
0, 1), v("rgba(129, 199, 132, 1)", !0, 1), v(
"rgba(76, 175, 80, 1)", !0, 1), v("rgba(0, 150, 136, 1)", !
0, 1), v("rgba(120, 123, 134, 1)", !0, 1)],
fanlines: [w("rgba(179, 157, 219, 1)", !1, 1, 8, 1), w(
"rgba(244, 67, 54, 1)", !1, 1, 5, 1), w(
"rgba(120, 123, 134, 1)", !1, 1, 4, 1), w(
"rgba(255, 152, 0, 1)", !1, 1, 3, 1), w(
"rgba(129, 199, 132, 1)", !0, 1, 2, 1), w(
"rgba(76, 175, 80, 1)", !0, 1, 1, 1), w(
"rgba(0, 150, 136, 1)", !0, 1, 1, 2), w(
"rgba(0, 150, 136, 1)", !1, 1, 1, 3), w(y, !1, 1, 1, 4), w(
"rgba(149, 117, 205, 1)", !1, 1, 1, 5), w(
"rgba(179, 157, 219, 1)", !1, 1, 1, 8)],
arcs: [w("rgba(255, 152, 0, 1)", !0, 1, 1, 0), w("rgba(255, 152, 0, 1)",
!0, 1, 1, 1), w("rgba(255, 152, 0, 1)", !0, 1, 1.5, 0), w(
"rgba(129, 199, 132, 1)", !0, 1, 2, 0), w(
"rgba(129, 199, 132, 1)", !0, 1, 2, 1), w(
"rgba(76, 175, 80, 1)", !0, 1, 3, 0), w(
"rgba(76, 175, 80, 1)", !0, 1, 3, 1), w(
"rgba(0, 150, 136, 1)", !0, 1, 4, 0), w(
"rgba(0, 150, 136, 1)", !0, 1, 4, 1), w(y, !0, 1, 5, 0), w(
y, !0, 1, 5, 1)]
},
linetoolgannfixed: {
fillBackground: !1,
arcsBackground: {
fillBackground: !0,
transparency: 80
},
reverse: !1,
levels: [v("rgba(120, 123, 134, 1)", !0, 1), v("rgba(255, 152, 0, 1)", !
0, 1), v("rgba(129, 199, 132, 1)", !0, 1), v(
"rgba(76, 175, 80, 1)", !0, 1), v("rgba(0, 150, 136, 1)", !
0, 1), v("rgba(120, 123, 134, 1)", !0, 1)],
fanlines: [w("rgba(179, 157, 219, 1)", !1, 1, 8, 1), w(
"rgba(244, 67, 54, 1)", !1, 1, 5, 1), w(
"rgba(120, 123, 134, 1)", !1, 1, 4, 1), w(
"rgba(255, 152, 0, 1)", !1, 1, 3, 1), w(
"rgba(129, 199, 132, 1)", !0, 1, 2, 1), w(
"rgba(76, 175, 80, 1)", !0, 1, 1, 1), w(
"rgba(0, 150, 136, 1)", !0, 1, 1, 2), w(
"rgba(0, 150, 136, 1)", !1, 1, 1, 3), w(y, !1, 1, 1, 4), w(
"rgba(149, 117, 205, 1)", !1, 1, 1, 5), w(
"rgba(179, 157, 219, 1)", !1, 1, 1, 8)],
arcs: [w("rgba(255, 152, 0, 1)", !0, 1, 1, 0), w("rgba(255, 152, 0, 1)",
!0, 1, 1, 1), w("rgba(255, 152, 0, 1)", !0, 1, 1.5, 0), w(
"rgba(129, 199, 132, 1)", !0, 1, 2, 0), w(
"rgba(129, 199, 132, 1)", !0, 1, 2, 1), w(
"rgba(76, 175, 80, 1)", !0, 1, 3, 0), w(
"rgba(76, 175, 80, 1)", !0, 1, 3, 1), w(
"rgba(0, 150, 136, 1)", !0, 1, 4, 0), w(
"rgba(0, 150, 136, 1)", !0, 1, 4, 1), w(y, !0, 1, 5, 0), w(
y, !0, 1, 5, 1)]
},
linetoolgannsquare: {
color: "rgba( 21, 56, 153, 0.8)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
font: S,
showTopLabels: !0,
showBottomLabels: !0,
showLeftLabels: !0,
showRightLabels: !0,
fillHorzBackground: !0,
horzTransparency: 80,
fillVertBackground: !0,
vertTransparency: 80,
reverse: !1,
fans: t("rgba(149, 152, 161, 1)", !1),
hlevel1: i(0, "rgba(120, 123, 134, 1)", !0),
hlevel2: i(.25, "rgba(245, 124, 0, 1)", !0),
hlevel3: i(.382, "rgba(129, 199, 132, 1)", !0),
hlevel4: i(.5, "rgba(76, 175, 80, 1)", !0),
hlevel5: i(.618, "rgba(0, 150, 136, 1)", !0),
hlevel6: i(.75, y, !0),
hlevel7: i(1, "rgba(120, 123, 134, 1)", !0),
vlevel1: i(0, "rgba(120, 123, 134, 1)", !0),
vlevel2: i(.25, "rgba(245, 124, 0, 1)", !0),
vlevel3: i(.382, "rgba(129, 199, 132, 1)", !0),
vlevel4: i(.5, "rgba(76, 175, 80, 1)", !0),
vlevel5: i(.618, "rgba(0, 150, 136, 1)", !0),
vlevel6: i(.75, y, !0),
vlevel7: i(1, "rgba(120, 123, 134, 1)", !0)
},
linetoolfibspeedresistancefan: {
fillBackground: !0,
transparency: 80,
grid: {
color: "rgba( 21, 56, 153, 0.8)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
visible: !0
},
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
font: S,
showTopLabels: !0,
showBottomLabels: !0,
showLeftLabels: !0,
showRightLabels: !0,
reverse: !1,
hlevel1: i(0, "rgba(120, 123, 134, 1)", !0),
hlevel2: i(.25, "rgba(245, 124, 0, 1)", !0),
hlevel3: i(.382, "rgba(129, 199, 132, 1)", !0),
hlevel4: i(.5, "rgba(76, 175, 80, 1)", !0),
hlevel5: i(.618, "rgba(0, 150, 136, 1)", !0),
hlevel6: i(.75, y, !0),
hlevel7: i(1, "rgba(120, 123, 134, 1)", !0),
vlevel1: i(0, "rgba(120, 123, 134, 1)", !0),
vlevel2: i(.25, "rgba(245, 124, 0, 1)", !0),
vlevel3: i(.382, "rgba(129, 199, 132, 1)", !0),
vlevel4: i(.5, "rgba(76, 175, 80, 1)", !0),
vlevel5: i(.618, "rgba(0, 150, 136, 1)", !0),
vlevel6: i(.75, y, !0),
vlevel7: i(1, "rgba(120, 123, 134, 1)", !0)
},
linetoolfibretracement: {
showCoeffs: !0,
showPrices: !0,
font: S,
fillBackground: !0,
transparency: 80,
extendLines: !1,
extendLinesLeft: !1,
horzLabelsAlign: "left",
vertLabelsAlign: "bottom",
reverse: !1,
coeffsAsPercents: !1,
fibLevelsBasedOnLogScale: !1,
trendline: {
visible: !0,
color: "rgba(120, 123, 134, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_DASHED
},
levelsStyle: {
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
level1: i(0, "rgba(120, 123, 134, 1)", !0),
level2: i(.236, "rgba(244, 67, 54, 1)", !0),
level3: i(.382, "rgba(129, 199, 132, 1)", !0),
level4: i(.5, "rgba(76, 175, 80, 1)", !0),
level5: i(.618, "rgba(0, 150, 136, 1)", !0),
level6: i(.786, "rgba(100, 181, 246, 1)", !0),
level7: i(1, "rgba(120, 123, 134, 1)", !0),
level8: i(1.618, y, !0),
level9: i(2.618, "rgba(244, 67, 54, 1)", !0),
level10: i(3.618, "rgba(156, 39, 176, 1)", !0),
level11: i(4.236, "rgba(233, 30, 99, 1)", !0),
level12: i(1.272, "rgba(129, 199, 132, 1)", !1),
level13: i(1.414, "rgba(244, 67, 54, 1)", !1),
level16: i(2, "rgba(0, 150, 136, 1)", !1),
level14: i(2.272, "rgba(129, 199, 132, 1)", !1),
level15: i(2.414, "rgba(76, 175, 80, 1)", !1),
level17: i(3, "rgba(100, 181, 246, 1)", !1),
level18: i(3.272, "rgba(120, 123, 134, 1)", !1),
level19: i(3.414, y, !1),
level20: i(4, "rgba( 204, 40, 40, 1)", !1),
level21: i(4.272, "rgba(156, 39, 176, 1)", !1),
level22: i(4.414, "rgba(233, 30, 99, 1)", !1),
level23: i(4.618, "rgba(129, 199, 132, 1)", !1),
level24: i(4.764, "rgba(0, 150, 136, 1)", !1)
},
linetoolfibchannel: {
showCoeffs: !0,
showPrices: !0,
font: S,
fillBackground: !0,
transparency: 80,
extendLeft: !1,
extendRight: !1,
horzLabelsAlign: "left",
vertLabelsAlign: "middle",
coeffsAsPercents: !1,
levelsStyle: {
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
level1: i(0, "rgba(120, 123, 134, 1)", !0),
level2: i(.236, "rgba(244, 67, 54, 1)", !0),
level3: i(.382, "rgba(129, 199, 132, 1)", !0),
level4: i(.5, "rgba(76, 175, 80, 1)", !0),
level5: i(.618, "rgba(0, 150, 136, 1)", !0),
level6: i(.786, "rgba(100, 181, 246, 1)", !0),
level7: i(1, "rgba(120, 123, 134, 1)", !0),
level8: i(1.618, y, !0),
level9: i(2.618, "rgba(244, 67, 54, 1)", !0),
level10: i(3.618, "rgba(156, 39, 176, 1)", !0),
level11: i(4.236, "rgba(233, 30, 99, 1)", !0),
level12: i(1.272, "rgba(129, 199, 132, 1)", !1),
level13: i(1.414, "rgba(244, 67, 54, 1)", !1),
level16: i(2, "rgba(0, 150, 136, 1)", !1),
level14: i(2.272, "rgba(129, 199, 132, 1)", !1),
level15: i(2.414, "rgba(76, 175, 80, 1)", !1),
level17: i(3, "rgba(100, 181, 246, 1)", !1),
level18: i(3.272, "rgba(120, 123, 134, 1)", !1),
level19: i(3.414, y, !1),
level20: i(4, "rgba( 204, 40, 40, 1)", !1),
level21: i(4.272, "rgba(156, 39, 176, 1)", !1),
level22: i(4.414, "rgba(233, 30, 99, 1)", !1),
level23: i(4.618, "rgba(129, 199, 132, 1)", !1),
level24: i(4.764, "rgba(0, 150, 136, 1)", !1)
},
linetoolprojection: {
showCoeffs: !0,
font: "Verdana",
fillBackground: !0,
transparency: 80,
color1: n(y, 80),
color2: "rgba(156, 39, 176, 0.2)",
linewidth: 1,
trendline: {
visible: !0,
color: "rgba(149, 152, 161, 1)",
linestyle: CanvasEx.LINESTYLE_SOLID
},
level1: r(1, "rgba( 128, 128, 128, 1)", !0)
},
linetool5pointspattern: {
color: y,
textcolor: "rgba( 255, 255, 255, 1)",
fillBackground: !0,
backgroundColor: y,
font: "Verdana",
fontsize: 12,
bold: !1,
italic: !1,
transparency: 85,
linewidth: 1
},
linetoolcypherpattern: {
color: y,
textcolor: "#FFFFFF",
fillBackground: !0,
backgroundColor: y,
font: "Verdana",
fontsize: 12,
bold: !1,
italic: !1,
transparency: 85,
linewidth: 1
},
linetooltrianglepattern: {
color: "#673AB7",
textcolor: "#FFFFFF",
fillBackground: !0,
backgroundColor: "#673AB7",
font: "Verdana",
fontsize: 12,
bold: !1,
italic: !1,
transparency: 85,
linewidth: 1
},
linetoolabcd: {
color: "#009688",
textcolor: "rgba( 255, 255, 255, 1)",
font: "Verdana",
fontsize: 12,
bold: !1,
italic: !1,
linewidth: 1
},
linetoolthreedrivers: {
color: "#673AB7",
textcolor: "rgba( 255, 255, 255, 1)",
fillBackground: !0,
backgroundColor: "rgba( 149, 40, 204, 0.5)",
font: "Verdana",
fontsize: 12,
bold: !1,
italic: !1,
transparency: 50,
linewidth: 1
},
linetoolheadandshoulders: {
color: "#009688",
textcolor: "rgba( 255, 255, 255, 1)",
fillBackground: !0,
backgroundColor: "#009688",
font: "Verdana",
fontsize: 12,
bold: !1,
italic: !1,
transparency: 85,
linewidth: 1
},
linetoolfibwedge: {
showCoeffs: !0,
font: S,
fillBackground: !0,
transparency: 80,
trendline: {
visible: !0,
color: "rgba( 128, 128, 128, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
level1: r(.236, "rgba(244, 67, 54, 1)", !0),
level2: r(.382, "rgba(129, 199, 132, 1)", !0),
level3: r(.5, "rgba(76, 175, 80, 1)", !0),
level4: r(.618, "rgba(0, 150, 136, 1)", !0),
level5: r(.786, "rgba(100, 181, 246, 1)", !0),
level6: r(1, "rgba(120, 123, 134, 1)", !0),
level7: r(1.618, y, !1),
level8: r(2.618, "rgba(244, 67, 54, 1)", !1),
level9: r(3.618, "rgba(103, 58, 183, 1)", !1),
level10: r(4.236, "rgba(233, 30, 99, 1)", !1),
level11: r(4.618, "rgba(233, 30, 99, 1)", !1)
},
linetoolfibcircles: {
showCoeffs: !0,
font: S,
fillBackground: !0,
transparency: 80,
coeffsAsPercents: !1,
trendline: {
visible: !0,
color: "rgba(120, 123, 134, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_DASHED
},
level1: r(.236, "rgba(244, 67, 54, 1)", !0),
level2: r(.382, "rgba(129, 199, 132, 1)", !0),
level3: r(.5, "rgba(76, 175, 80, 1)", !0),
level4: r(.618, "rgba(0, 150, 136, 1)", !0),
level5: r(.786, "rgba(100, 181, 246, 1)", !0),
level6: r(1, "rgba(120, 123, 134, 1)", !0),
level7: r(1.618, y, !0),
level8: r(2.618, "rgba(244, 67, 54, 1)", !0),
level9: r(3.618, "rgba(103, 58, 183, 1)", !0),
level10: r(4.236, "rgba(233, 30, 99, 1)", !0),
level11: r(4.618, "rgba(233, 30, 99, 1)", !0)
},
linetoolfibspeedresistancearcs: {
showCoeffs: !0,
font: S,
fillBackground: !0,
transparency: 80,
fullCircles: !1,
trendline: {
visible: !0,
color: "rgba(120, 123, 134, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_DASHED
},
level1: r(.236, "rgba(244, 67, 54, 1)", !0),
level2: r(.382, "rgba(129, 199, 132, 1)", !0),
level3: r(.5, "rgba(76, 175, 80, 1)", !0),
level4: r(.618, "rgba(0, 150, 136, 1)", !0),
level5: r(.786, "rgba(100, 181, 246, 1)", !0),
level6: r(1, "rgba(120, 123, 134, 1)", !0),
level7: r(1.618, y, !0),
level8: r(2.618, "rgba(244, 67, 54, 1)", !0),
level9: r(3.618, "rgba(103, 58, 183, 1)", !0),
level10: r(4.236, "rgba(233, 30, 99, 1)", !0),
level11: r(4.618, "rgba(233, 30, 99, 1)", !0)
},
linetooltrendbasedfibextension: {
showCoeffs: !0,
showPrices: !0,
font: S,
fillBackground: !0,
transparency: 80,
extendLines: !1,
extendLinesLeft: !1,
horzLabelsAlign: "left",
vertLabelsAlign: "bottom",
reverse: !1,
coeffsAsPercents: !1,
fibLevelsBasedOnLogScale: !1,
trendline: {
visible: !0,
color: "rgba(120, 123, 134, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_DASHED
},
levelsStyle: {
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
level1: i(0, "rgba(120, 123, 134, 1)", !0),
level2: i(.236, "rgba(244, 67, 54, 1)", !0),
level3: i(.382, "rgba(129, 199, 132, 1)", !0),
level4: i(.5, "rgba(76, 175, 80, 1)", !0),
level5: i(.618, "rgba(0, 150, 136, 1)", !0),
level6: i(.786, "rgba(100, 181, 246, 1)", !0),
level7: i(1, "rgba(120, 123, 134, 1)", !0),
level8: i(1.618, y, !0),
level9: i(2.618, "rgba(244, 67, 54, 1)", !0),
level10: i(3.618, "rgba(156, 39, 176, 1)", !0),
level11: i(4.236, "rgba(233, 30, 99, 1)", !0),
level12: i(1.272, "rgba(129, 199, 132, 1)", !1),
level13: i(1.414, "rgba(244, 67, 54, 1)", !1),
level16: i(2, "rgba(0, 150, 136, 1)", !1),
level14: i(2.272, "rgba(129, 199, 132, 1)", !1),
level15: i(2.414, "rgba(76, 175, 80, 1)", !1),
level17: i(3, "rgba(100, 181, 246, 1)", !1),
level18: i(3.272, "rgba(120, 123, 134, 1)", !1),
level19: i(3.414, y, !1),
level20: i(4, "rgba( 204, 40, 40, 1)", !1),
level21: i(4.272, "rgba(156, 39, 176, 1)", !1),
level22: i(4.414, "rgba(233, 30, 99, 1)", !1),
level23: i(4.618, "rgba(129, 199, 132, 1)", !1),
level24: i(4.764, "rgba(0, 150, 136, 1)", !1)
},
linetooltrendbasedfibtime: {
showCoeffs: !0,
font: "Verdana",
fillBackground: !0,
transparency: 80,
horzLabelsAlign: "right",
vertLabelsAlign: "bottom",
trendline: {
visible: !0,
color: "rgba(120, 123, 134, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_DASHED
},
level1: r(0, "rgba(120, 123, 134, 1)", !0),
level2: r(.382, "rgba(244, 67, 54, 1)", !0),
level3: r(.5, "rgba(129, 199, 132, 1)", !1),
level4: r(.618, "rgba(76, 175, 80, 1)", !0),
level5: r(1, "rgba(0, 150, 136, 1)", !0),
level6: r(1.382, "rgba(100, 181, 246, 1)", !0),
level7: r(1.618, "rgba(120, 123, 134, 1)", !0),
level8: r(2, y, !0),
level9: r(2.382, "rgba(244, 67, 54, 1)", !0),
level10: r(2.618, "rgba(156, 39, 176, 1)", !0),
level11: r(3, "rgba(233, 30, 99, 1)", !0)
},
linetoolschiffpitchfork: {
fillBackground: !0,
transparency: 80,
style: l.Schiff,
median: {
visible: !0,
color: "rgba(244, 67, 54, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
extendLines: !1,
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
level5: r(1, y, !0),
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
level8: r(2, "rgba(229, 115, 115, 1)", !1)
},
linetoolschiffpitchfork2: {
fillBackground: !0,
transparency: 80,
style: l.Schiff2,
median: {
visible: !0,
color: "rgba(244, 67, 54, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
extendLines: !1,
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
level5: r(1, y, !0),
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
level8: r(2, "rgba(229, 115, 115, 1)", !1)
},
linetoolinsidepitchfork: {
fillBackground: !0,
transparency: 80,
style: l.Inside,
median: {
visible: !0,
color: "rgba(244, 67, 54, 1)",
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID
},
extendLines: !1,
level0: r(.25, "rgba(255, 183, 77, 1)", !1),
level1: r(.382, "rgba(129, 199, 132, 1)", !1),
level2: r(.5, "rgba(76, 175, 80, 1)", !0),
level3: r(.618, "rgba(0, 150, 136, 1)", !1),
level4: r(.75, "rgba(100, 181, 246, 1)", !1),
level5: r(1, y, !0),
level6: r(1.5, "rgba(156, 39, 176, 1)", !1),
level7: r(1.75, "rgba(233, 30, 99, 1)", !1),
level8: r(2, "rgba(229, 115, 115, 1)", !1)
},
linetoolregressiontrend: {
linewidth: 1,
linestyle: CanvasEx.LINESTYLE_SOLID,
styles: {
upLine: {
visible: !0,
color: n(y, 70),
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1
},
downLine: {
visible: !0,
color: n(y, 70),
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1
},
baseLine: {
visible: !0,
color: "rgba(244, 67, 54, 0.3)",
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1
},
extendLines: !1,
showPearsons: !0,
transparency: 70
}
}
}, C(TradingView.defaultProperties.chartproperties), x()
}
if (void 0 === TradingView.defaultProperties["study_MA@tv-basicstudies"] && (TradingView
.defaultProperties["study_MA@tv-basicstudies"] = {
description: "Moving Average",
shortDescription: "MA",
inputs: {
length: 9,
source: "close"
},
styles: {
MovAvg: {
visible: !0,
color: y,
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1,
plottype: h.Line,
histogramBase: 0,
title: "MA"
}
}
}), void 0 === TradingView.defaultProperties[
"study_PivotPointsHighLow@tv-basicstudies"] && (TradingView.defaultProperties[
"study_PivotPointsHighLow@tv-basicstudies"] = {
font: "Arial",
fontsize: 10,
borderColor: y,
backColor: "#E3EFFD",
textColor: "#131722"
}), void 0 === TradingView.defaultProperties[
"study_PivotPointsStandard@tv-basicstudies"]) {
TradingView.defaultProperties["study_PivotPointsStandard@tv-basicstudies"] = {
_hardCodedDefaultsVersion: 1,
font: "Arial",
fontsize: 11,
levelsStyle: {
showLabels: !0,
visibility: {
P: !0,
"S1/R1": !0,
"S2/R2": !0,
"S3/R3": !0,
"S4/R4": !0,
"S5/R5": !0
},
colors: {
P: "#FB8C00",
"S1/R1": "#FB8C00",
"S2/R2": "#FB8C00",
"S3/R3": "#FB8C00",
"S4/R4": "#FB8C00",
"S5/R5": "#FB8C00"
},
widths: {
P: 1,
"S1/R1": 1,
"S2/R2": 1,
"S3/R3": 1,
"S4/R4": 1,
"S5/R5": 1
}
}
}
}
if (void 0 === TradingView.defaultProperties["study_ZigZag@tv-basicstudies"] && (
TradingView.defaultProperties["study_ZigZag@tv-basicstudies"] = {
color: y,
linewidth: 2
}), void 0 === TradingView.defaultProperties[
"study_ElliottWave@tv-basicstudies"] && (TradingView.defaultProperties[
"study_ElliottWave@tv-basicstudies"] = {
inputs: {},
level0: t("rgba( 255, 0, 0, 1)", !1),
level1: t("rgba( 0, 128, 0, 1)", !1),
level2: t("rgba( 0, 0, 255, 1)", !1),
level3: t("rgba( 255, 0, 255, 1)", !1),
level4: t("rgba( 0, 128, 255, 1)", !0),
level5: t("rgba( 255, 0, 0, 1)", !0),
level6: t("rgba( 0, 128, 0, 1)", !0),
level7: t("rgba( 0, 0, 255, 1)", !0),
level8: t("rgba( 255, 0, 255, 1)", !0)
}), void 0 === TradingView.defaultProperties[
"study_LinearRegression@tv-basicstudies"] && (TradingView.defaultProperties[
"study_LinearRegression@tv-basicstudies"] = {
styles: {
upLine: {
visible: !0,
color: n(y, 70),
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1
},
downLine: {
visible: !0,
color: n(y, 70),
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1
},
baseLine: {
visible: !0,
color: "rgba(244, 67, 54, 0.3)",
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1
},
extendLines: !0,
showPearsons: !0,
backgroundColor: "rgba( 153, 21, 21, 0.3)",
transparency: 70
}
}), void 0 === TradingView.defaultProperties["study_Compare@tv-basicstudies"] && (
TradingView.defaultProperties["study_Compare@tv-basicstudies"] = {
minTick: "default"
}), void 0 === TradingView.defaultProperties["study_Overlay@tv-basicstudies"]) {
TradingView.defaultProperties["study_Overlay@tv-basicstudies"] = {
style: a.STYLE_LINE,
allowExtendTimeScale: !1,
showPriceLine: !1,
minTick: "default",
candleStyle: {
upColor: "rgba( 107, 165, 131, 1)",
downColor: "rgba( 215, 84, 66, 1)",
drawWick: !0,
drawBorder: !0,
drawBody: !0,
borderColor: "rgba( 55, 134, 88, 1)",
borderUpColor: "rgba( 34, 84, 55, 1)",
borderDownColor: "rgba( 91, 26, 19, 1)",
wickColor: "rgba( 115, 115, 117, 1)",
wickUpColor: "rgba( 115, 115, 117, 1)",
wickDownColor: "rgba( 115, 115, 117, 1)",
barColorsOnPrevClose: !1
},
hollowCandleStyle: {
upColor: "rgba( 107, 165, 131, 1)",
downColor: "rgba( 215, 84, 66, 1)",
drawWick: !0,
drawBorder: !0,
drawBody: !0,
borderColor: "rgba( 55, 134, 88, 1)",
borderUpColor: "rgba( 34, 84, 55, 1)",
borderDownColor: "rgba( 91, 26, 19, 1)",
wickColor: "rgba( 115, 115, 117, 1)",
wickUpColor: "rgba( 115, 115, 117, 1)",
wickDownColor: "rgba( 115, 115, 117, 1)",
barColorsOnPrevClose: !1
},
barStyle: {
upColor: "rgba( 107, 165, 131, 1)",
downColor: "rgba( 215, 84, 66, 1)",
barColorsOnPrevClose: !1,
dontDrawOpen: !1,
thinBars: !0
},
lineStyle: {
color: "#FF6D00",
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 2,
priceSource: "close",
styleType: a.STYLE_LINE_TYPE_SIMPLE
},
areaStyle: {
color1: y,
color2: y,
linecolor: y,
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 2,
priceSource: "close",
transparency: 95
},
baselineStyle: {
baselineColor: "rgba( 117, 134, 150, 1)",
topFillColor1: "rgba( 83, 185, 135, 0.05)",
topFillColor2: "rgba( 83, 185, 135, 0.05)",
bottomFillColor1: "rgba( 235, 77, 92, 0.05)",
bottomFillColor2: "rgba( 235, 77, 92, 0.05)",
topLineColor: "rgba( 83, 185, 135, 1)",
bottomLineColor: "rgba( 235, 77, 92, 1)",
topLineWidth: 2,
bottomLineWidth: 2,
priceSource: "close",
transparency: 50,
baseLevelPercentage: 50
},
styles: {
open: {
visible: !0,
color: "rgba( 255, 0, 0, 1)",
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1,
plottype: h.Line,
histogramBase: 0
},
high: {
visible: !0,
color: "rgba( 255, 0, 0, 1)",
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1,
plottype: h.Line,
histogramBase: 0
},
low: {
visible: !0,
color: "rgba( 255, 0, 0, 1)",
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1,
plottype: h.Line,
histogramBase: 0
},
close: {
visible: !0,
color: "rgba( 255, 0, 0, 1)",
linestyle: CanvasEx.LINESTYLE_SOLID,
linewidth: 1,
plottype: h.Line,
histogramBase: 0
}
}
}
}
for (var I = e.split("."), M = TradingView.defaultProperties, O = 0; O < I.length; O++)
M && (M = M[I[O]]);
return null != M ? TradingView.clone(M) : {}
};
function P(e, t, i, s, r) {
if (s)
for (var n in s) {
var o = n.split("."),
a = c(o[0]),
l = void 0 !== r && r === o[0];
0 !== o.length && l && (a = c((o = o.slice(1))[0])), 0 !== o.length && e
.hasOwnProperty(a) ? h(e, o, s[n]) || u(n) : l && u(n)
}
function c(e) {
return t && t[e] ? t[e] : e
}
function h(e, t, i, s) {
var r = c(t[0]);
return !!e.hasOwnProperty(r) && (t.length > 1 ? h(e[r], t.slice(1), i) : (e[r] && e[r]
.setValue ? e[r].setValue(i) : e[r] = i, !0))
}
function u(e) {
i || v.logWarn("Path `" + e + "` does not exist.")
}
}
function C(e, t, i, s) {
window.__defaultsOverrides && P(e, t, i, window.__defaultsOverrides, s)
}
function x() {
var e = /^linetool.+/;
Object.keys(TradingView.defaultProperties).forEach((function(t) {
e.test(t) && C(TradingView.defaultProperties[t], null, !1, t)
}))
}
function T(e, t) {
return t ? function(e, t) {
var i = w(e);
if (!window._UNIT_TESTS) {
var s = TradingView.clone(TVSettings.getJSON(e, null));
if (function(e) {
var t = new Set(["linetoolregressiontrend"]);
return e.startsWith("study_") || t.has(e)
}(e) && s && function(e) {
if (!e) return !1;
e = e.toString();
var t = new RegExp("\\d+").exec(e);
return null !== t && t[0] === e
}(s.version)) {
var r = s.inputs,
n = t.updateStudyInputs(s.id, s.version, "last", r, null);
s.inputs = n;
var o = t.updateStudyState(s, s);
s = o
}
TradingView.merge(i, s)
}
return i
}(e, t) : function(e) {
var t = w(e);
if (!window._UNIT_TESTS) {
var i = TradingView.clone(TVSettings.getJSON(e, null));
i && TradingView.merge(t, i)
}
return t
}(e)
}
T.create = function(e, t) {
if (t) {
var i = w(e);
TradingView.defaultProperties[e] = Object.assign(t, i)
}
}, T.remove = function(e) {
TradingView.defaultProperties[e] = void 0
}, TradingView.saveDefaults = function(e, t) {
TVSettings.setJSON(e, t)
}, TradingView.factoryDefaults = w, window.applyDefaultOverridesToLinetools = x, window
.applyDefaultsOverrides = C, window.applyPropertiesOverrides = P, window.defaults = T, t
.applyDefaultOverridesToLinetools = x, t.applyDefaultsOverrides = C, t
.applyPropertiesOverrides = P, t.defaults = T, t.factoryDefaults = w, t.saveDefaults =
TradingView.saveDefaults
},
wamh: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "ChangeToolBarsThemeUndoCommand", (function() {
return o
}));
var s = i("EsvI"),
r = i("oiZD"),
n = i("RDU5");
class o extends n.UndoCommand {
constructor(e, t, i = !0) {
super("Apply Toolbars Theme"), this._prevThemeName = e, this._themeName = t,
this._syncState = i
}
undo() {
Object(s.isStdThemeName)(this._prevThemeName) && (Object(r.setTheme)(this
._prevThemeName), this._syncState && Object(s.syncTheme)())
}
redo() {
Object(s.isStdThemeName)(this._themeName.toLowerCase()) && (Object(r.setTheme)(
this._themeName.toLowerCase()), this._syncState && Object(s
.syncTheme)())
}
}
},
wi9r: function(e, t, i) {
"use strict";
(function(e) {
var t = i("e3/o").randomHash;
function s(e) {
this._chartApi = e, this._sessionid = "qs_" + t(), this._sessionstarted = !1
}
s.prototype.destroy = function() {
this._sessionstarted && (this._chartApi.quoteDeleteSession(this._sessionid),
this._sessionid = null, this._sessionstarted = !1)
}, s.prototype.connected = function() {
return this._chartApi.connected()
}, s.prototype.connect = function(e) {
this._globalHandler = e, this._chartApi.createSession(this._sessionid, this),
this._chartApi.connect()
}, s.prototype.disconnect = function() {
this._chartApi.disconnect()
}, s.prototype.quoteAddSymbols = function(e, t) {
e = [].concat(e), t && t.forcePermission && (e = e.concat({
flags: ["force_permission"]
})), this._chartApi.quoteAddSymbols(this._sessionid, e)
}, s.prototype.quoteRemoveSymbols = function(e) {
this._chartApi.quoteRemoveSymbols(this._sessionid, e)
}, s.prototype.quoteFastSymbols = function(e) {
this._chartApi.quoteFastSymbols(this._sessionid, e)
}, s.prototype.quoteSetFields = function(e) {
this._chartApi.quoteSetFields(this._sessionid, e)
}, s.prototype.onMessage = function(e) {
switch (e.method) {
case "connected":
this._sessionstarted || (this._chartApi.quoteCreateSession(this
._sessionid), this._sessionstarted = !0);
break;
case "disconnected":
this._sessionstarted = !1
}
this._globalHandler(e)
}, s.prototype.quoteHibernateAll = function(e) {
this._chartApi.quoteHibernateAll(this._sessionid)
}, TradingView.QuoteSession = s, e && e.exports && (e.exports = s)
}).call(this, i("YuTi")(e))
},
wiuq: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolArrowMarker", (function() {
return a
}));
var s = i("Ss5c"),
r = i("Ocx9"),
n = i("tc+8"),
o = i.n(n);
class a extends s.LineDataSource {
constructor(e, t) {
super(e, t || a.createProperties()),
i.e("lt-pane-views").then(i.bind(null, "Qa6j")).then(({
ArrowMarkerPaneView: e
}) => {
this._setPaneViews([new e(this, this.model())])
})
}
pointsCount() {
return 2
}
name() {
return "Trend Line"
}
static createProperties(e) {
const t = new r.DefaultProperty("linetoolarrowmarker", e);
return a._configureProperties(t), t
}
_getPropertyDefinitionsViewModelClass() {
return Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "FxV7")).then(
e => e.ArrowMarkerDefinitionsViewModel)
}
static _configureProperties(e) {
s.LineDataSource._configureProperties(e), e.hasChild("text") || e.addChild(
"text", new o.a("")), e.addExclusion("text")
}
}
},
wjVR: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("txPx");
function n(e, t) {
const i = Object.create(Object.getPrototypeOf(e));
for (const s of t) Object.prototype.hasOwnProperty.call(e, s) && (i[s] = e[s]);
return i
}
var o = i("qFKp"),
a = i("jofe"),
l = i("FQhm"),
c = i("sQaR");
let h;
class u extends c.a {
constructor() {
super(), this._dialog = null, this._subscribe = e => {
this._setVisibility(e)
}
}
show() {
this._load().then(e => e.show())
}
hide() {
var e;
null === (e = this._dialog) || void 0 === e || e.hide()
}
static getInstance() {
return h || (h = new u), h
}
_load() {
return Promise.all([i.e("redux"), i.e("react"), i.e(1), i.e(3), i.e(4), i.e(6),
i.e(8), i.e(9), i.e(11), i.e(12), i.e(13), i.e(14), i.e(16), i.e(
22), i.e(24), i.e(41), i.e(51), i.e(63), i.e(74), i.e(0), i.e(
2), i
.e(5), i.e(7), i.e(10), i.e(15), i.e(20), i.e(38), i.e(47), i.e(56),
i.e("object-tree-dialog")
]).then(i.bind(null, "xNz2")).then(e => {
var t, i;
return null === (t = this._dialog) || void 0 === t || t.hide(),
null === (i = this._dialog) || void 0 === i || i.visible()
.unsubscribe(this._subscribe), this._dialog = new e
.ObjectTreeDialogRenderer, this._dialog.visible().subscribe(this
._subscribe), this._dialog
})
}
}
var d = i("ogJP"),
p = i("dDSx");
var _ = i("CW80"),
m = i("3ClC"),
f = i("H0vP"),
g = i("mkn5"),
b = i("eJTA"),
v = i("Hr11"),
S = i("S8xo"),
y = i("ikwP");
i("bc0y");
class w {
constructor(e, t, i) {
this._handleEl = null, this._startY = 0, this._deltaY = 0, this._totalHeight = 0,
this._totalStretch = 0, this._prevStretchA = 0, this._minPaneHeight = 0, this
._maxPaneHeight = 0, this._pixelStretchFactor = 0, this._colorCache = {
lineColor: "",
backgroundColor: "",
color: ""
}, this._chart = e, this._paneA = e.paneWidgets()[t], this._paneB = e
.paneWidgets()[i], this._row = document.createElement("tr"), this._cell =
document.createElement("td"), this._row.appendChild(this._cell), this._cell
.classList.add("pane-separator"), this._cell.setAttribute("colspan", "3"), this
._cell.style.background = this._color(), this.adjustSize(), this._cell
.addEventListener("click", () => {});
const s = document.createElement("div");
s.classList.add("handle"), this._cell.appendChild(s), this._mouseEventHandler =
new S.MouseEventHandler(s, this, {
treatVertTouchDragAsPageScroll: !1,
treatHorzTouchDragAsPageScroll: !0
}), this._handleEl = s
}
destroy() {
this._mouseEventHandler.destroy(), this._row.parentElement && this._row
.parentElement.removeChild(this._row)
}
getElement() {
return this._row
}
hide() {
this._row.classList.add("js-hidden")
}
show() {
this._row.classList.remove("js-hidden")
}
adjustSize() {
this._row.style.height = w.height() + "px"
}
mouseDownEvent(e) {
this._mouseDownOrTouchStartEvent(e)
}
touchStartEvent(e) {
this._mouseDownOrTouchStartEvent(e)
}
pressedMouseMoveEvent(e) {
this._pressedMouseOrTouchMoveEvent(e)
}
touchMoveEvent(e) {
this._pressedMouseOrTouchMoveEvent(e)
}
mouseUpEvent(e) {
this._mouseUpOrTouchEndEvent(e)
}
touchEndEvent(e) {
this._mouseUpOrTouchEndEvent(e)
}
update() {
this._cell.style.background = this._color().toString()
}
paint() {}
image() {
const e = this._paneA.leftPriceAxisesContainer().getWidth(),
t = this._paneA.width(),
i = this._paneA.rightPriceAxisesContainer().getWidth(),
s = this._color(),
r = Object(y.createDisconnectedCanvas)(document, new y.Size(e, 1)),
n = Object(y.getPrescaledContext2D)(r);
n.fillStyle = s, n.fillRect(0, 0, e, 1);
const o = Object(y.createDisconnectedCanvas)(document, new y.Size(t, 1)),
a = Object(y.getPrescaledContext2D)(o);
a.fillStyle = s, a.fillRect(0, 0, t, 1);
const l = Object(y.createDisconnectedCanvas)(document, new y.Size(i, 1)),
c = Object(y.getPrescaledContext2D)(l);
return c.fillStyle = s, c.fillRect(0, 0, i, 1), {
type: "separator",
leftAxis: {
content: r.toDataURL(),
canvas: r,
contentWidth: e,
contentHeight: 1
},
rightAxis: {
content: l.toDataURL(),
canvas: l,
contentWidth: i,
contentHeight: 1
},
content: o.toDataURL(),
canvas: o,
contentWidth: t,
contentHeight: 1
}
}
static height() {
const e = window.devicePixelRatio || 1;
return e >= 1 ? 1 : 1 / e
}
_mouseDownOrTouchStartEvent(e) {
this._startY = e.pageY, this._deltaY = 0, this._totalHeight = this._paneA.height() +
this._paneB.height(), this._totalStretch = this._paneA.state().stretchFactor() +
this._paneB.state().stretchFactor(), this._prevStretchA = this._paneA.state()
.stretchFactor(), this._minPaneHeight = 30, this._maxPaneHeight = this
._totalHeight - this._minPaneHeight, this._pixelStretchFactor = this
._totalStretch / this._totalHeight, Object(s.ensureNotNull)(this._handleEl)
.classList.add("i-active")
}
_pressedMouseOrTouchMoveEvent(e) {
this._deltaY = e.pageY - this._startY;
const t = this._paneA.height(),
i = Object(v.clamp)(t + this._deltaY, this._minPaneHeight, this
._maxPaneHeight) * this._pixelStretchFactor,
s = this._totalStretch - i;
this._paneA.state().setStretchFactor(i), this._paneB.state().setStretchFactor(s),
this._chart.adjustSize(), this._paneA.height() !== t && (this._startY = e
.pageY), this._chart.model().model().fullUpdate()
}
_mouseUpOrTouchEndEvent(e) {
this._chart.model().addPaneStretchFactorUndoCommand(this._paneA.state(), this._paneB
.state(), this._prevStretchA, this._paneA.state().stretchFactor()), this
._startY = 0, this._deltaY = 0, this._totalHeight = 0, this._totalStretch = 0,
this._minPaneHeight = 0, this._maxPaneHeight = 0, this._pixelStretchFactor = 0,
Object(s.ensureNotNull)(this._handleEl).classList.remove("i-active")
}
_color() {
const e = this._chart.properties().childs().scalesProperties.childs().lineColor
.value(),
t = this._chart.model().model().backgroundColor().value();
if (this._colorCache.lineColor !== e || this._colorCache.backgroundColor !== t) {
const i = Object(b.parseRgba)(t),
s = Object(b.parseRgba)(e),
r = 0 === i[3] && 0 === s[3] ? "rgba(0,0,0,0)" : Object(b.rgbaToString)(
Object(b.blendRgba)(i, s));
this._colorCache = {
lineColor: e,
backgroundColor: t,
color: r
}
}
return this._colorCache.color
}
}
var P = i("mMWL"),
C = i("KnF9"),
x = i("VaSN"),
T = i("aIyQ"),
I = i.n(T),
M = i("hY0g"),
O = i.n(M),
L = i("Tmoa"),
A = i("EsvI");
const E = {
moving: "wait_finishing",
wait_finishing: "stop",
stop: "moving"
};
class k {
constructor(e) {
this._chartModel = null, this._currentDistance = 0, this._deferredFinishTimeout = 0,
this._finishingTimeout = 0, this._moveType = "", this._startTime = 0, this
._state = "stop", this._movingTimeout = 0, this._chart = e, this._chart
.withModel(this, () => {
this._chartModel = this._chart.model()
})
}
destroy() {
clearTimeout(this._movingTimeout)
}
move(e) {
if (null !== this._chartModel && "stop" === this._state && this._chartModel
.beginUndoMacro(1 === e ? "Move Left" : "Move Right"), this._state = E.stop,
this._moveType = "animated", this._deferredFinishTimeout && (clearTimeout(this
._deferredFinishTimeout), this._deferredFinishTimeout = 0), this
._finishingTimeout && (clearTimeout(this._finishingTimeout), this
._finishingTimeout = 0), this._startTime = Date.now(), 0 === this
._movingTimeout) {
const t = this._startTime,
i = 10,
s = () => {
this.moveStep(t, 0, 50 * e, 1e3), this._movingTimeout = setTimeout(s, i)
};
this._movingTimeout = setTimeout(s, i)
}
}
moveStep(e, t, i, s) {
if (null !== this._chartModel && !this._chartModel.timeScale().isEmpty()) {
const r = Date.now();
r < e && (e = r);
let n = (r - e) / s;
(n > 1 || !isFinite(n)) && (n = 1);
const o = 1 - Math.pow(1 - n, 3);
return this._currentDistance = (i - t) * o + t, this._chartModel.scrollChart(
this._currentDistance), n
}
}
moveByBar(e) {
if (null !== this._chartModel) {
const t = this._chartModel.timeScale();
if (t.isEmpty()) return;
if ("stop" === this._state && this._chartModel.beginUndoMacro(1 === e ?
"Move Left" : "Move Right"), null !== t.visibleBarsStrictRange()) {
const e = t.indexToCoordinate(t.visibleBarsStrictRange().lastBar()) + t
.barSpacing() / 2;
Math.abs(t.width() - e) > t.barSpacing() / 6 && this._chartModel
.scrollChart(t.width() - e)
}
if (this._state = E.stop, this._moveType = "by_bar", this._startTime = Date
.now(), !this._movingTimeout) {
let t = 0,
i = 150;
const s = 400,
r = () => {
this._moveByBarStep(e), t++, i > 100 && (i -= t / 5 * 20), this
._movingTimeout = setTimeout(r, i)
};
this._movingTimeout = setTimeout(r, s), this._moveByBarStep(e)
}
}
}
stopMove() {
"by_bar" === this._moveType ? this.stopMoveByBar() : this._stopMove()
}
stopMoveByBar() {
"moving" === this._state && (clearTimeout(this._movingTimeout), this
._movingTimeout = 0, this._state = E.wait_finishing, this._moveType = "",
this._movingTimeout = 0, this._currentDistance = 0, null !== this
._chartModel && this._chartModel.endUndoMacro())
}
_finishMove() {
clearTimeout(this._movingTimeout), this._movingTimeout = 0, this
._deferredFinishTimeout = 0;
const e = this._currentDistance,
t = Date.now(),
i = () => {
const s = this.moveStep(t, e, 0, 700);
s && s < 1 ? this._finishingTimeout = setTimeout(i, 10) : null !== this
._chartModel && (this._state = E.wait_finishing, this._moveType = "",
this._movingTimeout = 0, this._currentDistance = 0, this._chartModel
.endUndoMacro())
};
this._finishingTimeout = setTimeout(i, 10)
}
_stopMove() {
"moving" === this._state && (this._state = E.moving, Date.now() - this._startTime <
200 ? this._deferredFinishTimeout = setTimeout(this._finishMove.bind(this),
200 - (Date.now() - this._startTime)) : this._finishMove())
}
_moveByBarStep(e) {
if (null !== this._chartModel) {
if (this._chartModel.timeScale().isEmpty()) return;
this._chartModel.scrollChartByBar(e)
}
}
}
var D = i("m/3z"),
V = i("Kxc7"),
B = i("nqXy"),
R = i("n5al"),
N = i("pPtI");
class j {
constructor() {
this._draggingSource = null, this._activeTouchPanes = new Set, this._scrollingPane =
null, this._pinchingPane = null
}
onPaneDestroyed(e) {
this._activeTouchPanes.delete(e), this._scrollingPane === e && (this
._scrollingPane = null), this._pinchingPane === e && (this._pinchingPane =
null)
}
startTouch(e) {
this._activeTouchPanes.add(e)
}
endTouch(e) {
this._activeTouchPanes.delete(e)
}
hasTouchesOnOtherPanes(e) {
return this._activeTouchPanes.size > 1 || 1 === this._activeTouchPanes.size && !this
._activeTouchPanes.has(e)
}
trySetDraggingSource(e, t) {
return !this.hasTouchesOnOtherPanes(t) && (Object(s.assert)(null === this
._draggingSource || this._draggingSource === e), this._draggingSource =
e, !0)
}
clearDraggingSource() {
null !== this._draggingSource && (this._draggingSource = null)
}
draggingSource() {
return this._draggingSource
}
setScrollingPane(e) {
Object(s.assert)(null === e || null === this._scrollingPane), this._scrollingPane =
e
}
scrollingPane() {
return this._scrollingPane
}
setPinchingPane(e) {
Object(s.assert)(null === e || null === this._pinchingPane), this._pinchingPane = e
}
pinchingPane() {
return this._pinchingPane
}
}
var F = i("JWMC");
i.d(t, "ChartWidgetBase", (function() {
return G
}));
const W = Object(V.enabled)("chart_content_overrides_by_defaults"),
H = Object(r.getLogger)("ChartWidget", {
color: "#606"
}),
U = {
addToWatchlistEnabled: !0,
showFinancialsEnabled: !1,
sourceSelectionEnabled: !0,
propertyPagesEnabled: !0,
paneContextMenuEnabled: !0,
priceScaleContextMenuEnabled: !0,
currencyConversionEnabled: !1,
unitConversionEnabled: !1,
goToDateEnabled: !1,
marketStatusWidgetEnabled: !0,
chartWarningWidgetEnabled: !0,
dataProblemWidgetEnabled: !0,
paneControlsEnabled: !0,
isSymbolAvailable: e => Promise.resolve(!0),
legendWidgetEnabled: !0,
chartEventsEnabled: !0,
esdEnabled: !1,
croppedTickMarks: !0,
countdownEnabled: !0,
lastPriceAnimationEnabled: !0,
useKineticScroll: o.CheckMobile.any(),
indicatorsDialogShortcutEnabled: !0,
handleScale: {
mouseWheel: !0,
pinch: !0,
axisPressedMouseMove: {
time: !0,
price: !0
}
},
handleScroll: {
mouseWheel: !0,
pressedMouseMove: !0,
horzTouchDrag: !0,
vertTouchDrag: !0
}
};
function z(e, t, i, s = 0) {
const r = t.mainSeries().syncModel(),
n = e.mainSeries().syncModel();
let o = i;
if (null !== r && null !== n) {
const t = e.createSyncPoint(r, n);
0 !== s && (i = r.projectTime(i, s)), o = t.sourceTimeToTargetTime(i)
}
return e.timeScale().points().roughIndex(o, n && n.distance.bind(n))
}
class G {
constructor(e, t, i) {
this.activePaneWidget = null, this._model = null, this._paneWidgets = [], this
._maximizedPaneWidget = null, this._timeAxisWidget = null, this
._paneSeparators = [], this._controlBarNavigation = null, this
._lineToolsSynchronizer = null, this._modelCreated = new I.a, this
._isDestroyed = !1, this._customLegendWidgetsFactoryMap = new Map, this
._backgroundTopTheme = new O.a("light"), this._backgroundBasedTheme = new O.a(
"light"), this._backgroundBottomTheme = new O.a("light"), this
._lhsAxesWidth = 0, this._rhsAxesWidth = 0, this._lhsPriceAxisWidthChanged =
new I.a, this._rhsPriceAxisWidthChanged = new I.a, this._mainDiv = null, this
._parent = null, this._elTooltipDiv = null, this._hotkeysListener = null, this
._mouseWheelHelper = null,
this._onWheelBound = null, this._justActivated = !1, this._inited = !1, this
._containsData = !1, this._initialLoading = !1, this._defTimeframe = void 0,
this._removeMaximizeHotkey = null, this._metaInfoRepository = null, this
._invalidationMask = null, this._drawPlanned = !1, this._drawRafId = 0, this
._inLoadingState = !1, this._timingsMeter = null, this._tagsChanged = new I.a,
this._redraw = new I.a, this._isVisible = new O.a(!0), this._dataWindowWidget =
null, this._updateThemedColorBound = this._updateThemedColor.bind(this), this
._saveChartService = null, this._objectTreeDialogController = null, this
._chartPaintedPromise = null, this._noExchangeSubscrptionWarning = null, this
._paneWidgetsSharedState = new j, this._brokerName = "", this._onZoom = new I.a,
this._id = t, this._layoutId = i, this._options = Object(d.merge)(Object(d
.clone)(U), e), this._options.customLegendWidgetFactories && (this
._customLegendWidgetsFactoryMap = this._options.customLegendWidgetFactories
), this._subscribeToDrawingState(), this.withModel(this, () => {
const e = this.model().model();
e.backgroundTopColor().subscribe(this._updateThemedColorBound), e
.backgroundColor().subscribe(this._updateThemedColorBound)
}), this._scrollHelper = new k(this), this._objectTreeDialogController = u
.getInstance()
}
destroy() {
var e, t;
null === (e = this._lineToolsSynchronizer) || void 0 === e || e.destroy(), null ===
(t = this._noExchangeSubscrptionWarning) || void 0 === t || t.destroy(), window
.loginStateChange.unsubscribe(this, this._handleLoginStateChanged), null !==
this._model && (this._model.model().backgroundTopColor().unsubscribe(this
._updateThemedColorBound), this._model.model().backgroundColor()
.unsubscribe(this._updateThemedColorBound), this._model.destroy()), this
._customLegendWidgetsFactoryMap.clear(), this._scrollHelper.destroy(), this
._isDestroyed = !0
}
model() {
return Object(s.ensureNotNull)(this._model)
}
id() {
return this._id
}
layoutId() {
return this._layoutId
}
isVisible() {
return this._isVisible.value()
}
setVisible(e) {
this._isVisible.setValue(e)
}
getPriceAxisWidthChangedByName(e) {
return "left" === e ? this._lhsPriceAxisWidthChanged : this
._rhsPriceAxisWidthChanged
}
getPriceAxisMaxWidthByName(e) {
return "left" === e ? this._lhsAxesWidth : this._rhsAxesWidth
}
timeAxisHeight() {
return null !== this._timeAxisWidget ? this._timeAxisWidget.size.h : 0
}
withModel(e, t) {
null !== this._model ? t.call(e) : this.modelCreated().subscribe(e, t, !0)
}
hasModel() {
return null !== this._model
}
onZoom() {
return this._onZoom
}
images(e) {
window.TradingView.printing = !0;
const t = this.model().selection().allSources();
this.model().selectionMacro(e => e.clearSelection());
const i = (t, i) => {
t.paint(i, this.onWidget());
const s = {
showCollapsedStudies: Boolean(null == e ? void 0 : e
.showCollapsedStudies),
status: null == e ? void 0 : e.status
};
return t.getScreenshotData(s)
},
s = [];
if (null !== this._maximizedPaneWidget) {
const e = this._paneWidgets.indexOf(this._maximizedPaneWidget);
s.push(i(this._maximizedPaneWidget, f.InvalidationMask.light()
.invalidateForPane(e)))
} else
for (let e = 0; e < this._paneWidgets.length; ++e) {
const t = this._paneWidgets[e];
s.push(i(t, f.InvalidationMask.light().invalidateForPane(e))), e < this
._paneWidgets.length - 1 && s.push(this._paneSeparators[e].image())
}
let r;
this._timeAxisWidget && (this._timeAxisWidget.paint(f.InvalidationLevel.Light), r =
this._timeAxisWidget.getScreenshotData()), window.TradingView.printing = !1,
this.model().selectionMacro(e => {
t.forEach(t => {
e.addSourceToSelection(t)
})
}), this.model().model().lightUpdate();
const n = this.mainSeriesQuotesAndMetainfo();
return {
panes: s,
timeAxis: r,
colors: {
text: this.properties().childs().scalesProperties.childs().textColor
.value(),
bg: this.properties().childs().paneProperties.childs().background.value(),
scales: this.properties().childs().scalesProperties.childs().lineColor
.value()
},
meta: n.meta,
ohlc: n.ohlc,
quotes: n.quotes
}
}
setSaveChartService(e) {
this._saveChartService = e, null !== this._lineToolsSynchronizer && this
._lineToolsSynchronizer.setSaveChartService(e)
}
getSaveChartService() {
return this._saveChartService
}
mainSeriesQuotesAndMetainfo() {
let e, t, i;
const s = this._model && this._model.mainSeries();
if (s) {
const r = e => null == e ? "" : s.formatter().format(e, void 0, void 0, !0, !
1) + "",
n = e => null == e ? "" : e + "";
e = {
resolution: s.interval(),
symbol: s.symbol()
};
const o = s.symbolInfo();
o && (e.symbol = o.full_name, e.description = o.description, e.exchange = o
.exchange);
const a = s.bars().last();
null !== a && (t = a.value.slice(1, 5).map(r));
const l = s.quotes();
l && (i = {
change: r(l.change),
changePercent: n(l.change_percent),
last: r(l.last_price)
})
}
return {
meta: e,
ohlc: t,
quotes: i
}
}
updateCrossHairPositionIfNeeded() {
if (this._model) {
const e = P.tool.value();
if (this._model.model().setCurrentTool(e), Object(x.lastEventIsTouch)()) {
const e = this._maximizedPaneWidget || this._paneWidgets[0];
if (e.hasState() && (this._isLineToolModeExceptBrush() || this
.selectPointMode().value() || Object(P.toolIsMeasure)(P.tool
.value()))) {
const t = e.state(),
i = .5 * this._model.model().timeScale().width(),
s = .5 * t.defaultPriceScale().height();
this._model.model().setAndSaveCurrentPosition(i, s, t)
}
}
this._model && Object(x.lastEventIsTouch)() && this._model.model()
.crossHairSource().updateAllViews()
}
}
trackingModePaneWidget() {
if (!Object(x.lastEventIsTouch)()) return null;
for (const e of this.paneWidgets())
if (e.trackingModeEnabled()) return e;
return null
}
startTrackingMode() {
if (Object(x.lastEventIsTouch)()) {
this.exitTrackingMode(), this.updateCrossHairPositionIfNeeded();
const e = this._maximizedPaneWidget || this._paneWidgets[0],
t = this.model().model().crossHairSource().currentPoint();
e.startTrackingMode(t, t)
}
}
exitTrackingMode() {
Object(x.lastEventIsTouch)() && this.paneWidgets().some(e => e
.trackingModeEnabled()) && (this.paneWidgets().forEach(e => e
.exitTrackingMode()), this.model().model().clearCurrentPosition())
}
onToolChanged() {
this.selectPointMode().value() && this.cancelRequestSelectPoint(), this
.exitTrackingMode()
}
setInLoadingState(e) {
this._inLoadingState = e
}
paint(e) {
const t = null != e ? e : f.InvalidationMask.full();
t.validationActions().forEach(e => e()), this._paneWidgets.forEach((e, i) => {
null !== this._maximizedPaneWidget && this._maximizedPaneWidget !== e ||
e.paint(t.invalidateForPane(i), !1)
}), this._timeAxisWidget && this._timeAxisWidget.paint(t
.invalidateForTimeScale()), this._redraw.fire()
}
GUIResetScales() {
Object(F.trackEvent)("GUI", "Reset Scales"),
null !== this._model && this._model.resetScales()
}
maximizedPaneWidget() {
return this._maximizedPaneWidget
}
isMaximizedPane() {
return null !== this._maximizedPaneWidget
}
unsetActivePaneWidget() {
this.activePaneWidget = null
}
setActivePaneWidget(e) {
this.activePaneWidget = e
}
onPaneWidgetDestroyed(e) {
this.activePaneWidget === e && (this.activePaneWidget = null)
}
backgroundTopTheme() {
return this._backgroundTopTheme.readonly()
}
backgroundBasedTheme() {
return this._backgroundBasedTheme.readonly()
}
backgroundBottomTheme() {
return this._backgroundBottomTheme.readonly()
}
lineToolsAndGroupsDTO() {
return Object(s.ensureNotNull)(this._lineToolsSynchronizer).prepareDTO()
}
resetLineToolsInvalidated(e, t) {
Object(s.ensureNotNull)(this._lineToolsSynchronizer).resetInvalidated(e, t)
}
applyLineToolUpdateNotification(e) {
Object(s.ensureNotNull)(this._lineToolsSynchronizer)
.applyLineToolUpdateNotification(e)
}
applyAlertIdByExternalSource(e, t) {
var i;
null === (i = this._lineToolsSynchronizer) || void 0 === i || i
.applyAlertIdByExternalSource(e, t)
}
deleteAlertByExternalSource(e, t) {
var i;
null === (i = this._lineToolsSynchronizer) || void 0 === i || i
.deleteAlertByExternalSource(e)
}
shouldBeSavedEvenIfHidden() {
return this.model().model().shouldBeSavedEvenIfHidden()
}
showObjectsTreeDialog() {
var e;
null === (e = this._objectTreeDialogController) || void 0 === e || e.show()
}
addCustomWidgetToLegend(e, t) {
this._customLegendWidgetsFactoryMap.set(e, t);
for (const i of this.paneWidgets()) i.addCustomWidgetToLegend(e, t)
}
applyIndicatorsToAllChartsAvailable() {
if (!this.chartWidgetCollection().applyIndicatorsToAllChartsAvailable()) return !1;
for (const e of this.model().model().panes()) {
if (e.sourcesByGroup().all().some(e => Object(m.isStudy)(e) && !Object(m
.isESDStudy)(e))) return !0
}
return !1
}
restoreState(e, t, i) {
this.adjustSize();
Object(s.ensureNotNull)(this._model).restoreState(this._content, t, i);
this._setActions()
}
addCompareAsOverlay(e, t) {
const i = this.model();
return Object(s.ensureDefined)(this._options.isSymbolAvailable)(e).then(s => {
if (!s) return null;
const r = i.createStudyInserter({
type: "java",
studyId: "Overlay@tv-basicstudies"
});
return r.setForceOverlay(!0), r.setPreferredPriceScale("as-series"), r
.setTargetPriceScaleMode({
percentage: !0
}), void 0 !== t && r.setPropertiesState({
allowExtendTimeScale: t
}), r.insert(async () => ({
symbol: e
}))
})
}
scrollHelper() {
return this._scrollHelper
}
adjustSize(e) {
var t;
let i = 0;
const s = null === this._model ? null : this._model.model().priceScaleSlotsCount(),
r = new Uint32Array(null === s ? 0 : s.left),
n = new Uint32Array(null === s ? 0 : s.right),
o = Object(y.getCanvasDevicePixelRatio)(document.body),
a = (e, t) => e + t,
c = (e, t) => {
t.forEach((t, i) => {
e[i] = Math.max(e[i], t)
})
};
for (const e of this._paneWidgets)
if (!this._maximizedPaneWidget || this._maximizedPaneWidget === e) {
const t = e.leftPriceAxisesContainer().optimalWidths(),
s = e.rightPriceAxisesContainer().optimalWidths();
c(r, t), c(n, s), i += e.stretchFactor()
} let h = r.reduce(a, 0),
u = n.reduce(a, 0);
const d = this._width(),
p = this._height();
let _ = Math.max(d - h - u, 0);
if (_ <= 102) {
h = 0, u = 0, _ = d;
for (let e = 0; e < r.length; e++) r[e] = 0;
for (let e = 0; e < n.length; e++) n[e] = 0
}
for (const e of this._paneSeparators) e.adjustSize();
const m = this._paneSeparators.length,
f = w.height(),
g = this.isMaximizedPane() ? 0 : f * m,
b = null !== this._timeAxisWidget ? this._timeAxisWidget.optimalHeight() : 0;
let v = p - b >= 61 ? b : 0;
v % 2 && (v += 1);
const S = g + v,
P = p < S ? 0 : p - S,
C = P / i;
let x = 0,
T = !1;
const I = null === (t = this._model) || void 0 === t ? void 0 : t.model();
for (let e = 0; e < this._paneWidgets.length; ++e) {
const t = this._paneWidgets[e];
void 0 !== I && t.setState(I.panes()[e]);
let i = 0;
if (this.isMaximizedPane()) i = this._maximizedPaneWidget === t ? P : 0;
else {
let s = 0;
s = e === this._paneWidgets.length - 1 ? Math.ceil((P - x) * o) / o : Math
.round(t.stretchFactor() * C * o) / o, i = Math.max(s, 2), x += i
}
t.setPriceAxisSizes("left", i, r), t.setPriceAxisSizes("right", i, n), T = T ||
i !== t.height(), t.setSize(new y.Size(_, i)), I && t.state() && I
.setPaneHeight(t.state(), i)
}
null !== this._timeAxisWidget && this._timeAxisWidget.setSizes(new y.Size(_, v), r,
n), I && I.setWidth(_, e), this._controlBarNavigation && this
._controlBarNavigation.updatePosition(), this._lhsAxesWidth !== h && (this
._lhsAxesWidth = h, this._lhsPriceAxisWidthChanged.fire(h)), this
._rhsAxesWidth !== u && (this._rhsAxesWidth = u, this._rhsPriceAxisWidthChanged
.fire(u)), T && l.emit("panes_height_changed")
}
setBroker(e) {
var t;
this._brokerName = e, null === (t = this._lineToolsSynchronizer) || void 0 === t ||
t.setBroker(e)
}
chartPainted() {
return this._drawPlanned ? (null === this._chartPaintedPromise && (this
._chartPaintedPromise = Object(a.createDeferredPromise)()), this
._chartPaintedPromise.promise) : Promise.resolve()
}
setDataWindowWidget(e) {
this._dataWindowWidget = e
}
removeDataWindowWidget() {
this._dataWindowWidget = null
}
_createLineToolsSynchronizerIfNeeded() {
0
}
_updateThemedColor() {
const e = this.model().model(),
t = e.backgroundColorAtYPercentFromTop(.5);
let i = e.backgroundTopColor().value(),
s = e.backgroundColor().value();
const r = Object(L.isColorDark)(t),
n = Object(L.isColorDark)(i),
o = Object(L.isColorDark)(s);
this.widget().classList.toggle("chart-widget--themed-dark", r), this.widget()
.classList.toggle("chart-widget--themed-light", !r), this.widget().classList
.toggle("chart-widget__top--themed-dark", n), this.widget().classList.toggle(
"chart-widget__top--themed-light", !n), this.widget().classList.toggle(
"chart-widget__bottom--themed-dark", o), this.widget().classList.toggle(
"chart-widget__bottom--themed-light", !o), this._backgroundTopTheme
.setValue(n ? "dark" : "light"), this._backgroundBasedTheme.setValue(r ?
"dark" : "light"), this._backgroundBottomTheme.setValue(o ? "dark" :
"light"), i === s && Object(A.isStdThemedDefaultValue)(
"chartProperties.paneProperties.background", i, this._backgroundBasedTheme
.value()) && (i = null, s = null);
for (const e of this._paneWidgets) e.updateThemedColors(i, s)
}
_isLineToolModeExceptBrush() {
const e = P.tool.value();
return Object(_.isLineToolName)(e) && !Object(_.isLineDrawnWithPressedButton)(e) &&
!this.selectPointMode().value()
}
_cancelCreatingLine() {
const e = Object(s.ensureNotNull)(this._model).model(),
t = e.lineBeingCreated();
if (null !== t) {
const i = Object(s.ensureNotNull)(e.paneForSource(t));
Object(s.ensureNotNull)(this.paneByState(i)).cancelCreatingLineTool()
}
const i = e.crossHairSource().measurePane();
if (null !== i) {
Object(s.ensureNotNull)(this.paneByState(i)).cancelMeasuring()
}
}
_makePaneWidgetsAndSeparators() {
const e = this.model().model().panes(),
t = e.length,
i = this._paneWidgets.length;
for (let e = t; e < i; e++) {
Object(s.ensureDefined)(this._paneWidgets.pop()).destroy();
const e = this._paneSeparators.pop();
e && e.destroy()
}
const r = this._options.containsData;
for (let s = i; s < t; s++) {
const t = {
contextMenuEnabled: this._options.paneContextMenuEnabled,
currencyConversionEnabled: this._options.currencyConversionEnabled,
unitConversionEnabled: this._options.unitConversionEnabled,
handleScale: this._options.handleScale,
handleScroll: this._options.handleScroll,
priceScaleContextMenuEnabled: this._options
.priceScaleContextMenuEnabled,
legendWidgetEnabled: this._options.legendWidgetEnabled,
sourceStatusesWidgetEnabled: !r,
sourceStatusesWidget: this._options.sourceStatusesWidget,
marketStatusWidgetEnabled: this._options.marketStatusWidgetEnabled && !
r,
marketStatusWidget: this._options.marketStatusWidget,
chartWarningWidgetEnabled: this._options.chartWarningWidgetEnabled && !
r,
chartWarningWidget: this._options.chartWarningWidget,
dataProblemWidgetEnabled: this._options.dataProblemWidgetEnabled && !r,
legendWidget: this._options.legendWidget,
propertyPagesEnabled: this._options.propertyPagesEnabled,
sourceSelectionEnabled: this._options.sourceSelectionEnabled,
controlsEnabled: this._options.paneControlsEnabled,
croppedTickMarks: this._options.croppedTickMarks,
countdownEnabled: this._options.countdownEnabled,
customLegendWidgetFactories: new Map(this
._customLegendWidgetsFactoryMap),
useKineticScroll: this._options.useKineticScroll
};
void 0 !== this._options.paneContextMenu && (t.contextMenu = this._options
.paneContextMenu), void 0 !== this._options.priceScaleContextMenu && (t
.priceScaleContextMenu = this._options.priceScaleContextMenu);
const i = new g.PaneWidget(this, e[s], t, this._paneWidgetsSharedState);
if (this._paneWidgets.push(i), s > 0) {
const e = new w(this, s - 1, s);
this._paneSeparators.push(e), this._timeAxisWidget ? this._elMainTable
.insertBefore(e.getElement(), this._timeAxisWidget.getElement()) : this
._elMainTable.appendChild(e.getElement())
}
this._timeAxisWidget ? this._elMainTable.insertBefore(i.getElement(), this
._timeAxisWidget.getElement()) : this._elMainTable.appendChild(i
.getElement())
}
for (let i = 0; i < t; i++) {
const t = e[i],
s = this._paneWidgets[i];
s.hasState() && s.state() === t ? s.updatePriceAxisWidgets() : s.setState(t)
}
for (let e = t; e--;) this._paneWidgets[e].updateControls();
this._updateThemedColor()
}
_width() {
return this._options.width.value()
}
_height() {
return this._options.height.value()
}
_onMousewheel(e) {
if (!this.model().model().zoomEnabled() || null === this._mouseWheelHelper) return;
if (!Object(o.onWidget)() && parent && parent !== window && parent.IS_DEMO_PAGE)
return;
if (null === this._model) return;
if (this.model().timeScale().isEmpty()) return;
const t = this._mouseWheelHelper.processWheel(e),
i = t.deltaX,
r = -t.deltaY;
if (0 !== i && this._options.handleScroll.mouseWheel || 0 !== r && this._options
.handleScale.mouseWheel) {
if (e.cancelable && e.preventDefault(), 0 !== r && this._options.handleScale
.mouseWheel) {
const t = Math.sign(r) * Math.min(1, Math.abs(r)),
i = Object(s.ensureNotNull)(this._mainDiv).getBoundingClientRect(),
n = e.clientX - this._lhsAxesWidth - i.left;
if (!Number.isFinite(n) || !Number.isFinite(t)) return void H.logWarn(
"Incorrect mouse wheel processing: scrollPosition: " + n +
", zoomScale: " + t);
const o = new C.a(e).control();
this.model().model().zoomTime(n, t, !!o || void 0), this._onZoom.fire(o)
}
0 !== i && this._options.handleScroll.mouseWheel && this.model().scrollChart(-
80 * i)
}
}
_setElement(e) {
if (this._mainDiv) {
this._mainDiv.remove();
const e = document.createRange();
e.selectNodeContents(Object(s.ensureNotNull)(this._parent)), e.deleteContents()
}
this._controlBarNavigation && (this._controlBarNavigation.destroy(), this
._controlBarNavigation = null), null !== this._removeMaximizeHotkey && this
._removeMaximizeHotkey(), this._removeMaximizeHotkey = this._initMaximizeHotkey(
e);
const t = e.ownerDocument,
r = t.createElement("div");
r.classList.add("chart-container-border"), e.insertBefore(r, e.firstChild), this
._parent = r;
const n = t.createElement("div");
if (n.classList.add("chart-widget"), this._mainDiv = n, this._elTooltipDiv = t
.createElement("div"), this._elTooltipDiv.className = "tooltip-wrapper", this
._mainDiv.appendChild(this._elTooltipDiv), this._elMainTable = t.createElement(
"table"), this._elMainTable.className = "chart-markup-table", this
._elMainTable.setAttribute("cellpading", "0"), this._elMainTable.setAttribute(
"cellspacing", "0"), this._mainDiv.appendChild(this._elMainTable), this
._hotkeysListener && this._hotkeysListener.destroy(), this._hotkeysListener =
new D.a(this, this._mainDiv), (this._options.controlBarEnabled || Object(V
.enabled)("control_bar")) && Promise.all([i.e("react"), i.e(72), i.e(7), i
.e("chart-widget-gui")
]).then(i.bind(null, "TGRH")).then(e => {
this._controlBarNavigation = new e.ControlBarNavigation(this, Object(s
.ensureNotNull)(this._mainDiv), this._options.controlBar), this
._model && this.adjustSize()
}), this._options.handleScale.mouseWheel || this._options.handleScroll
.mouseWheel) {
this._mouseWheelHelper = new B.a;
const e = this._onMousewheel.bind(this);
this._onWheelBound = e, this._mainDiv.addEventListener("wheel", e, {
passive: !1
})
}
this.resize(), this._justActivated = !1, this.withModel(this, () => {
r.appendChild(n), n.addEventListener("mousedown", this
._beginRequestActive.bind(this)), n.addEventListener("mouseup",
this._endRequestActive.bind(this)), n.addEventListener(
"touchstart", this._beginRequestActive.bind(this)), n
.addEventListener("touchmove", this._endRequestActive.bind(this)), n
.addEventListener("touchend", this._endRequestActive.bind(this)), n
.addEventListener("click", this._requestActive.bind(this))
}), this._inited && (null !== this._timeAxisWidget && (this._timeAxisWidget
.destroy(), this._timeAxisWidget = null), this._paneWidgets.forEach(
e => {
e.destroy()
}), this._paneWidgets.length = 0, this._paneSeparators.forEach(e => {
e.destroy()
}), this._paneSeparators.length = 0, this._update(f.InvalidationMask
.full()))
}
_makeDefaultModel() {
let e;
if (this._content && this._content.timeScale.points) {
const t = this._content.timeScale.points.items[0];
e = {
startDate: t
}
}
if (!Object(s.ensureNotNull)(this._metaInfoRepository).getInternalMetaInfoArray())
throw new Error("Cannot create chart model: studies metainfo is absent");
const t = () => {
this._drawPlanned = !1, this._drawRafId = 0, this._inLoadingState || (this
._invalidationMask && (this._update(this._invalidationMask), this
._invalidationMask = null), null !== this
._chartPaintedPromise && (this._chartPaintedPromise.resolve(), this
._chartPaintedPromise = null))
},
i = () => {
const i = {
readOnly: this.readOnly(),
isSnapshot: !!this._containsData,
...n(this._options, ["timeScale", "crossHair", "esdEnabled",
"countdownEnabled", "lastPriceAnimationEnabled",
"currencyConversionEnabled", "unitConversionEnabled",
"watermarkEnabled", "shiftVisibleRangeOnNewBar"
])
},
r = function(e, t, i, s, r, n, o, a, l) {
const c = new p.ChartUndoModel(e, t, i, s, r, n, o, a, l);
return c.model().fullUpdate(), c
}(this._chartSession, e => {
if (!(e instanceof f.InvalidationMask)) throw new Error(
"Invalid mask");
null !== this._invalidationMask ? this._invalidationMask.merge(
e) : this._invalidationMask = e, this._drawPlanned || (
this._drawPlanned = !0, this._options.visible.when(
() => {
const e = !document.hidden,
i = this.screen && this.screen.isShown();
null !== this._timingsMeter && e && !i && this
._timingsMeter.startWaitingDraw();
const r = Object(s.ensureNotNull)(Object(s
.ensureNotNull)(this._parent)
.ownerDocument.defaultView);
this._drawRafId = r.requestAnimationFrame(t)
}))
}, this.properties(), e, Object(s.ensureNotNull)(this
._metaInfoRepository), this, this._options.undoHistory, this
._options.barsMarksContainersFactory, i);
return this._createSessions(r.model()), r
};
Object(V.enabled)("lean_chart_load") ? this._model = this._model || i() : this
._model = i(), this._createVolumeIfNeeded();
if (this._content) {
let e = {};
W && this._initialLoading && (e = {
symbol: this._defSymbol,
interval: this._defInterval,
style: this._defStyle
}), this.restoreState(this._content, this._containsData, e), W && this
._defSymbol && this.model().model().recalculatePriceRangeOnce()
} else this._setActions();
return this._createLineToolsSynchronizerIfNeeded(), (() => {
const e = Object(s.ensureNotNull)(this._model);
e.onTagsChanged().subscribe(this, () => this.onModelTagsChanged()), this
._initBackgroundColor(), this._updateGui(), this._modelCreated.fire(
e), this._tagsChanged.fire();
const t = e.mainSeries();
this._defTimeframe && t.setDefaultTimeframe(this._defTimeframe), e
.lineCancelled().subscribe(this, () => this.onLineCancelled()), t
.dataEvents().symbolNotPermitted().subscribe(null, e => {
t.properties().symbol.setValue(e)
}), t.properties().style.unsubscribe(this, this
._onChartStyleChanged), t.properties().style.subscribe(this,
this._onChartStyleChanged), t.dataEvents().completed()
.subscribe(this, () => this._addPerfMark("SeriesCompleted"), !0), t
.dataEvents().barReceived().subscribe(this, () => this._addPerfMark(
"SeriesFirstDataReceived"), !0);
this._options;
t.dataEvents().chartTypeNotPermitted().subscribe(null, () => {
t.properties().interval.setValue("D")
}), t.dataEvents().intradaySpreadNotPermitted().subscribe(null,
() => {
t.properties().interval.setValue("D")
}), t.dataEvents().customIntervalNotPermitted().subscribe(null,
() => {
t.properties().interval.setValue(Object(N
.getDefaultResolution)(Object(R.isRangeStyle)(t
.properties().style.value())))
}), t.dataEvents().intradayExchangeNotPermitted().subscribe(
null, () => {
t.properties().interval.setValue("D")
}), t.requestingResolutionWhenNotSupported.subscribe(null,
e => {
t.properties().interval.setValue(e)
})
})()
}
_handleLoginStateChanged() {
0
}
_subscribeToDrawingState() {
if (this._options.readOnly) return;
Object(P.init)();
const e = (e, t) => {
if (null === this._model) return;
const i = this._model.model();
e.model !== i && t(i, this._model)
};
P.createdLineTool.subscribe(null, t => {
e(t, (e, i) => {
const r = Object(s.ensureNotNull)(e.paneForSource(e
.mainSeries()));
let n, o = null;
if (void 0 === t.pointPositionPercents) {
if (o = z(e, t.model, t.point.timeStamp), null === o)
return;
n = t.point.price
} else {
const i = t.pointPositionPercents.x * e.timeScale()
.width(),
s = e.mainSeries().priceScale(),
r = t.pointPositionPercents.y * s.height(),
a = e.mainSeries().firstValue();
if (null === a) return;
o = e.timeScale().coordinateToIndex(i), n = s
.coordinateToPrice(r, a)
}
const a = {
index: Object(s.ensureNotNull)(o),
price: n
},
l = i.createLineTool(r, a, t.linetool, t.properties, t
.linkKey, e.mainSeries(), !0);
null !== l && !Boolean(this.model().lineBeingCreated()) && t
.finalState && l.restoreExternalPoints(t.finalState, {
indexesChanged: !0,
pricesChanged: !0
})
})
}), P.continuedLineTool.subscribe(null, t => {
e(t, (e, i) => {
const s = z(e, t.model, t.point.timeStamp);
if (null === s) return;
const r = {
index: s,
price: t.point.price
},
n = e.lineBeingCreated();
if (null === n) return;
i.continueExternalLine(r, null === t.envState ? void 0 : t
.envState, !!t.finalState) && t.finalState && n
.restoreExternalPoints(t.finalState, {
indexesChanged: !0,
pricesChanged: !0
})
})
}), P.cancelledLineTool.subscribe(null, t => {
e(t, (e, t) => {
e.cancelCreatingLine()
})
}), P.beenSetLineToolLastPoint.subscribe(null, t => {
e(t, (e, i) => {
const s = e.lineBeingCreated();
if (null === s || s.linkKey().value() !== t.linkKey) return;
const r = z(e, t.model, t.point.timeStamp);
if (null === r) return;
const n = {
index: r,
price: t.point.price
};
s.setLastPoint(n), s.updateAllViews(), e.lightUpdate()
})
}), P.startedMovingLineTool.subscribe(null, t => {
e(t, (e, i) => {
const s = t.linkKeys.map(_.lineToolByLinkKey.bind(null, e))
.filter(d.notNull);
if (s.length) {
const i = z(e, t.model, t.point.timeStamp);
if (null === i) return;
const r = {
index: i,
price: t.point.price
},
n = void 0 !== t.itemIndex ? t.itemIndex : null;
e.startMovingSources(s, {
logical: r
}, n, t.pointPositionPercents, null === t
.envState ? void 0 : t.envState, !0)
}
})
}), P.movedLineTool.subscribe(null, t => {
e(t, (e, i) => {
if (!e.sourcesBeingMoved().filter(_.isLineTool).filter(e =>
(e => t.linkKeys.some(t => e.linkKey().value() ===
t))(e)).length) return;
const s = z(e, t.model, t.point.timeStamp);
if (null === s) return;
const r = {
index: s,
price: t.point.price
};
e.moveSources({
logical: r
}, t.pointPositionPercents, null === t.envState ?
void 0 : t.envState, !0)
})
}), P.finishedMovingLineTool.subscribe(null, t => {
e(t, (e, i) => {
const s = e.sourcesBeingMoved().filter(_.isLineTool);
if (0 === s.length) return;
s.forEach(i => {
const s = (e => {
for (let i = 0; i < t.linkKeys
.length; i++)
if (t.linkKeys[i] === e
.linkKey().value()) return {
state: t.finalStates[i],
changes: t.changes[i]
};
return null
})(i);
e.endMovingSources(null !== s, !0), null !==
s && (i.restoreExternalPoints(s.state, s
.changes), s.state
.pointPositionPercents && i
.restorePositionPercents(s.state
.pointPositionPercents))
})
})
}), P.startedChangingLineTool.subscribe(null, t => {
e(t, (e, i) => {
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
if (null !== s) {
const i = s.getPoint(t.pointIndex),
r = i ? i.index : z(e, t.model, t.point.timeStamp);
if (null === r) return;
if (s.isActualSymbol() && s.isActualCurrency() && s
.isActualUnit()) {
const i = {
index: r,
price: t.point.price
};
e.startChangingLinetool(s, i, t.pointIndex, null ===
t.envState ? void 0 : t.envState, !0)
}
}
})
}), P.changedLineTool.subscribe(null, t => {
e(t, (e, i) => {
const r = e.lineBeingEdited();
if (null === r || r.linkKey().value() !== t.linkKey) return;
let n = null;
if (n = t.changes.indexesChanged ? z(e, t.model, t.point
.timeStamp) : Object(s.ensureNotNull)(e
.linePointBeingChanged()).index, null !== n && r
.isActualSymbol() && r.isActualCurrency() && r
.isActualUnit()) {
const i = {
index: n,
price: t.point.price
};
e.changeLinePoint(i, void 0, !0)
}
})
}), P.finishedChangingLineTool.subscribe(null, t => {
e(t, (e, i) => {
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
null !== s && s.isActualSymbol() && s.isActualCurrency() &&
s.isActualUnit() && null !== e.lineBeingEdited() && e
.endChangingLinetool(!!t.finalState, !0), null !== s &&
t.finalState && s.restoreExternalPoints(t.finalState, t
.changes)
})
}), P.removedLineTool.subscribe(null, t => {
e(t, (e, i) => {
const s = Object(_.lineToolByLinkKey)(e, t.linkKey),
{
withUndo: r
} = t;
if (null !== s) r ? i.removeSource(s, !1) : e.removeSource(
s);
else if (this._lineToolsSynchronizer) {
const {
sourceTitle: e,
linkKey: s,
symbol: n,
lineToolState: o
} = t;
i.removeUnloadedLineTool(this._lineToolsSynchronizer, e,
s, n, o, r)
}
})
}), P.finishedLineTool.subscribe(null, t => {
e(t, (e, i) => {
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
null !== s && Object(_.isLineDrawnWithPressedButton)(s
.toolname) && s.finish()
})
}), P.changedLineStyle.subscribe(null, t => {
e(t, (e, i) => {
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
null !== s && (s.restoreExternalState(t.state), s
.propertiesChanged(!0))
})
}), P.restoredLineToolState.subscribe(null, t => {
e(t, (e, i) => {
const s = Object(_.lineToolByLinkKey)(e, t.linkKey);
if (null !== s) {
const i = {
...t.state
};
i.indexes = t.state.points.map(i => ({
index: z(e, t.model, i.time_t),
price: i.price
})), e.restoreLineToolState(s, i)
}
})
}), P.restoredLineTool.subscribe(null, t => {
e(t, (e, i) => {
e.restoreSource(t.state.restorePane, t.state.paneIndex, t
.state.paneState, t.state.sourceState, null)
})
}), P.copiedLineTool.subscribe(null, t => {
e(t, (e, i) => {
const r = Object(s.ensureNotNull)(e.paneForSource(e
.mainSeries()));
let n;
const o = Object(_.createLineToolProperties)(t.linetool, t
.state);
if (t.pointPositionPercents) {
const e = {
index: 0,
price: 0
};
if (n = i.createLineTool(r, e, t.linetool, o, t.linkKey,
void 0, !0), null === n) return;
n.restorePositionPercents(Object(s.ensureDefined)(t
.pointPositionPercents))
} else {
const a = t.points.map(i => ({
index: Object(s.ensureNotNull)(z(e, t
.model, i.timeStamp)),
price: i.price
})),
l = a[0];
if (n = i.createLineTool(r, l, t.linetool, o, t.linkKey,
void 0, !0), null === n) return;
if (e.lineBeingCreated())
for (let e = 1; e < a.length; e++) e !== a.length -
1 || !Object(_.isLineDrawnWithPressedButton)(t
.linetool) && "LineToolGhostFeed" !== t
.linetool || n.finish(), i.continueCreatingLine(
a[e], new C.a(void 0), e < a.length - 1, !0)
}
n.properties().interval.setValue(t.state.interval), n
.restoreExternalState(t.state), n.restoreData && n
.restoreData(t), n.propertiesChanged(!0), t
.finalState && (n.calcIsActualSymbol(), n
.restoreExternalPoints(t.finalState, {
pricesChanged: !0,
indexesChanged: !0
}))
})
})
}
}
},
wptU: function(e, t, i) {
"use strict";
i.r(t);
i("e3/o");
const s = [];
let r = null;
function n(e) {
for (let t = 0; t < s.length; t++)
if (s[t].name === e) return t;
return -1
}
function o(e) {
if (!r)
for (let t = s.length - 1; t >= 0 && !0 !== s[t].func(e); t--);
}
window.addEventListener("keypress", o, !1);
var a = i("h24c"),
l = i("Kxc7"),
c = i("JpbW"),
h = i("6KAu"),
u = i("FA0h"),
d = i("JWMC");
i.d(t, "activateKeyPressHandler", (function() {
return m
})), i.d(t, "showDialog", (function() {
return f
}));
let p = null;
function _(e) {
if (!Object(a.b)(e)) return !1;
e.preventDefault();
const t = String.fromCharCode(e.charCode);
return l.enabled("show_interval_dialog_on_key_press") && function(e) {
return /[\d]/.test(e)
}(t) ? Object(c.showChangeIntervalDialogAsync)({
initVal: t
}) : l.enabled("symbol_search_hot_key") && (f({
defaultValue: t,
selectSearchOnInit: !1,
source: "keyboard"
}), Object(d.trackEvent)("GUI", "SS", "hotkey")), !0
}
function m() {
Object(h.a)(),
function(e, t) {
const i = {
name: e,
func: t
},
r = n(i.name);
r > -1 && s.splice(r, 1), s.unshift(i)
}("symbolEdit", _)
}
function f(e) {
const t = p = Object(u.a)().then(i => {
t === p && i.showDefaultSearchDialog(e)
});
return t
}
},
ww0J: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return l
}));
var s = i("X0WL"),
r = i("bmVy");
const n = {
NONE: "Default"
},
o = window.t("No volume data"),
a = new Map;
class l extends s.a {
constructor(e, t) {
super(t), this._source = e
}
getSplitTitle() {
return this._source.titleInParts(!0, n, void 0, !1)
}
text() {
return this._source.isActualInterval() ? this._source.isFailed() ?
`${this._source.title(!0, n, void 0, !1)}: ${this.sourceStatusText()}` :
`${this._source.title(!0, n, void 0, !1)} ${this.sourceStatusText()}` : this
._source.title(!0, n, void 0, !1)
}
sourceStatusText() {
return Object(r.convertStudyStatusToString)(this._source.status(), !0)
}
sourceStatusSolutionId() {
const e = this._source.status();
if (e.type === r.StudyStatusType.Error) return e.errorDescription.solution_id ?
e.errorDescription.solution_id : function(e) {
for (const t of Array.from(a.keys()))
if (e.includes(t)) return a.get(t)
}(e.errorDescription.error)
}
errorStatus() {
if (!this._source.isActualInterval() || this._source.isSymbolInvalid())
return null;
return this._source.status().type === r.StudyStatusType.Error ? {
error: this.sourceStatusText(),
solutionId: this.sourceStatusSolutionId(),
title: this.sourceStatusTitle()
} : null
}
sourceStatusTitle() {
const e = this._source.status();
if (e.type === r.StudyStatusType.Error) return -1 !== e.errorDescription.error
.toLowerCase().indexOf(
"the data vendor doesn't provide volume data for this symbol.") ?
o : void 0
}
}
},
x0JF: function(e, t, i) {
"use strict";
var s = i("aO4+").Point,
r = i("vq8G").SelectionRenderer,
n = i("VdBB").HitTestResult,
o = i("29fS").PaneRendererBars,
a = i("gyZD").PaneRendererLine,
l = i("Zp8I").PaneRendererStepLine,
c = i("u0yd").PaneRendererArea,
h = i("/hKg").PaneRendererCandles,
u = i("M7/j").PaneRendererBaseline,
d = i("Zy3/").CompositeRenderer,
p = i("Tmoa"),
_ = i("k9/m").PlotRowSearchMode,
m = i("Kxc7"),
f = i("Zp/P"),
g = i("o2pV").SelectionIndexes;
function b(e, t) {
this.m_series = e, this.m_model = t, this.m_bars = [], this._invalidated = !0, this
._isMarkersEnabled = m.enabled("source_selection_markers"), this._selectionData = null,
this._selectionIndexer = new g(t.timeScale())
}
function v(e, t) {
return void 0 !== e[TradingView.OPEN_PLOT] && void 0 !== e[TradingView.HIGH_PLOT] &&
void 0 !== e[TradingView.LOW_PLOT] && void 0 !== e[TradingView.CLOSE_PLOT] && (t.open =
e[TradingView.OPEN_PLOT], t.high = e[TradingView.HIGH_PLOT], t.low = e[TradingView
.LOW_PLOT], t.close = e[TradingView.CLOSE_PLOT], !0)
}
function S(e, t) {
b.call(this, e, t)
}
function y(e, t) {
b.call(this, e, t)
}
function w(e, t) {
b.call(this, e, t)
}
function P(e, t) {
b.call(this, e, t)
}
function C(e, t) {
this.m_series = e, this.m_model = t, this.m_items = [], this._isMarkersEnabled = m.enabled(
"source_selection_markers"), this._selectionIndexer = new g(t.timeScale())
}
function x(e, t) {
C.call(this, e, t), this._invaidated = !0
}
function T(e, t) {
C.call(this, e, t), this._invaidated = !0
}
function I(e, t) {
C.call(this, e, t), this._invaidated = !0, this._renderer = new u
}
b.prototype._series = function() {
return this.m_series
}, b.prototype._model = function() {
return this.m_model
}, b.prototype._bars = function() {
return this.m_bars
}, b.prototype.update = function() {
this._invalidated = !0
}, b.prototype._updateImpl = function(e) {
var t = this;
if ((e = e || v, this.m_bars = [], !this.m_model.timeScale().isEmpty() && !this.m_series
.priceScale().isEmpty()) && (null !== (a = this.m_model.timeScale()
.visibleBarsStrictRange()) && 0 !== this.m_series.bars().size())) {
for (var i = this.m_series.nearestIndex(a.firstBar(), _.NearestRight), r = this
.m_series.nearestIndex(a.lastBar(), _.NearestLeft); i <= r; i++) {
if (null !== this.m_series.bars().valueAt(i)) break
}
if (!(i > r)) {
var o, a = this.m_series.bars().range(i, r),
l = this.m_series.priceScale(),
c = this.m_series.barColorer(),
h = {};
if (a.each((function(i, s) {
var r, n = {};
(n.time = Math.round(i), e(s, n)) && (h.value = s, r = s[
TradingView.STYLE_PLOT] ? s[TradingView.STYLE_PLOT] : c
.barStyle(i, !1, h), s[TradingView.STYLE_PLOT] = r, h
.previousValue = s, n.color = r.barColor, n.borderColor = r
.barBorderColor, n.wickColor = r.barWickColor, n.hollow = r
.isBarHollow, t.m_bars.push(n))
}), this), 0 !== this.m_bars.length && (o = this.m_series.firstValue(), l
.barPricesToCoordinates(this.m_bars, o)), this.m_model.timeScale()
.barIndexesToCoordinates(this.m_bars), this.m_model.selection().isSelected(
this.m_series)) {
var u = this._selectionIndexer.indexes();
this._selectionData = {
points: [],
bgColors: [],
visible: !0
};
var d = this.m_model.paneForSource(this.m_series).height();
this._selectionData.hittestResult = n.REGULAR;
for (var p = 0; p < u.length; p++) {
var m = u[p],
f = this.m_series.bars().valueAt(m);
if (null !== f) {
var g = .5 * (f[TradingView.OPEN_PLOT] + f[TradingView.CLOSE_PLOT]),
b = this.m_model.timeScale().indexToCoordinate(m),
S = this.m_series.priceScale().priceToCoordinate(g, o);
this._selectionData.points.push(new s(b, S)), this._selectionData
.bgColors.push(this.m_model.backgroundColorAtYPercentFromTop(S /
d))
}
}
} else this._selectionIndexer.clear()
}
}
}, b.prototype.items = function() {
return this.m_bars
}, inherit(S, b), S.prototype.renderer = function() {
this._invalidated && (this._updateImpl(), this._invalidated = !1);
var e = {};
e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing();
var t = this.m_series.properties();
e.dontDrawOpen = t.barStyle.dontDrawOpen.value(), e.thinBars = t.style.value() ===
TradingView.Series.STYLE_RANGE ? t.rangeStyle.thinBars.value() : t.barStyle.thinBars
.value();
var i = new d;
return i.append(new o(e)), this.m_model.selection().isSelected(this.m_series) && this
._isMarkersEnabled && i.append(new r(this._selectionData)), i
}, inherit(y, b), y.prototype.renderer = function() {
this._invalidated && (this._updateImpl(), this._invalidated = !1);
var e = {};
e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(), e
.wickVisible = this.m_series.properties().candleStyle.drawWick.value(), e
.bodyVisible = this.m_series.properties().candleStyle.drawBody.value(), e
.borderVisible = this.m_series.properties().candleStyle.drawBorder.value(), e
.borderColor = this.m_series.properties().candleStyle.borderColor.value(), e
.wickColor = this.m_series.properties().candleStyle.wickColor.value(), e.barWidth =
f.optimalBarWidth(e.barSpacing);
var t = new d;
return t.append(new h(e)), this.m_model.selection().isSelected(this.m_series) && this
._isMarkersEnabled && t.append(new r(this._selectionData)), t
}, inherit(w, b), w.prototype.renderer = function() {
this._invalidated && (this._updateImpl(), this._invalidated = !1);
var e = {};
e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(), e
.wickVisible = this.m_series.properties().haStyle.drawWick.value(), e.bodyVisible =
this.m_series.properties().haStyle.drawBody.value(), e.borderVisible = this.m_series
.properties().haStyle.drawBorder.value(), e.borderColor = this.m_series.properties()
.haStyle.borderColor.value(), e.wickColor = this.m_series.properties().haStyle
.wickColor.value(), e.barWidth = f.optimalBarWidth(e.barSpacing);
var t = new d;
return t.append(new h(e)), this.m_model.selection().isSelected(this.m_series) && this
._isMarkersEnabled && t.append(new r(this._selectionData)), t
}, inherit(P, b), P.prototype.renderer = function() {
this._invalidated && (this._updateImpl(), this._invalidated = !1);
var e = {};
e.bars = this.m_bars, e.barSpacing = this.m_model.timeScale().barSpacing(), e
.wickVisible = this.m_series.properties().hollowCandleStyle.drawWick.value(), e
.bodyVisible = this.m_series.properties().hollowCandleStyle.drawBody.value(), e
.borderVisible = this.m_series.properties().hollowCandleStyle.drawBorder.value(), e
.borderColor = this.m_series.properties().hollowCandleStyle.borderColor.value(), e
.wickColor = this.m_series.properties().hollowCandleStyle.wickColor.value(), e
.barWidth = f.optimalBarWidth(e.barSpacing);
var t = new d;
return t.append(new h(e)),
this.m_model.selection().isSelected(this.m_series) && this._isMarkersEnabled && t
.append(new r(this._selectionData)), t
}, C.prototype.update = function() {
if (this.m_items = [], this.m_model.timeScale().isEmpty() || !this.m_series
.priceScale() || this.m_series.priceScale().isEmpty()) return;
const e = this.m_model.timeScale().visibleBarsStrictRange();
if (null === e) return;
if (0 === this.m_series.bars().size()) return;
var t = this.m_series.nearestIndex(e.firstBar() - 1, _.NearestLeft),
i = this.m_series.nearestIndex(e.lastBar() + 1, _.NearestRight);
const r = this.m_series.bars().range(t, i);
var o = this.m_series.priceScale(),
a = {
color: this.m_series.properties().lineStyle.color.value()
},
l = this.m_series.barFunction();
let c;
if (r.each(function(t, i) {
var r = l(i);
if (null == r) return !1;
void 0 === c && e.contains(t) && (c = r);
var n = new s(t, r);
return n.style = a, this.m_items.push(n), !1
}.bind(this)), o.pointsArrayToCoordinates(this.m_items, c), this.m_model.timeScale()
.timedValuesToCoordinates(this.m_items), this.m_model.selection().isSelected(this
.m_series)) {
var h = this._selectionIndexer.indexes();
this._selectionData = {
points: [],
isDark: this.m_model.isDark(),
bgColors: [],
visible: !0
};
var u = this.m_model.paneForSource(this.m_series).height();
this._selectionData.hittestResult = n.REGULAR;
for (var d = 0; d < h.length; d++) {
var p = h[d],
m = this.m_series.data().valueAt(p);
if (null !== m) {
var f = l(m),
g = this.m_model.timeScale().indexToCoordinate(p),
b = this.m_series.priceScale().priceToCoordinate(f, c);
this._selectionData.points.push(new s(g, b)), this._selectionData.bgColors
.push(this.m_model.backgroundColorAtYPercentFromTop(b / u))
}
}
} else this._selectionIndexer.clear()
}, inherit(x, C), x.prototype.update = function() {
this._invalidated = !0
}, x.prototype.renderer = function() {
this._invalidated && (C.prototype.update.call(this), this._invalidated = !1);
var e, t, i = this.m_series.properties().lineStyle,
s = {
barSpacing: this.m_model.timeScale().barSpacing(),
items: this.m_items,
lineColor: i.color.value(),
lineStyle: i.linestyle.value(),
withMarkers: i.styleType.value() === TradingView.Series.STYLE_LINE_TYPE_MARKERS,
lineWidth: i.linewidth.value(),
simpleMode: !0
};
return i.styleType.value() === TradingView.Series.STYLE_LINE_TYPE_STEP ? (e = new l)
.setData(s) : e = new a(s), this.m_model.selection().isSelected(this.m_series) ? ((
t = new d).append(e), this._isMarkersEnabled && t.append(new r(this
._selectionData))) : t = e, t
}, inherit(T, C), T.prototype.update = function() {
this._invalidated = !0
}, T.prototype.renderer = function() {
this._invalidated && (C.prototype.update.call(this), this._invalidated = !1);
var e = {
simpleMode: !1
};
e.barSpacing = this.m_model.timeScale().barSpacing(), e.items = this.m_items, e
.lineColor = this.m_series.properties().areaStyle.linecolor.value(), e.lineStyle =
this.m_series.properties().areaStyle.linestyle.value(), e.lineWidth = this.m_series
.properties().areaStyle.linewidth.value();
var t = this.m_series.properties().areaStyle.transparency.value();
e.isSeries = !0, e.color1 = p.generateColor(this.m_series.properties().areaStyle.color1
.value(), t), e.color2 = p.generateColor(this.m_series.properties().areaStyle
.color2.value(), t), e.bottom = this.m_series.priceScale().height();
var i = new d;
return i.append(new c(e)), this.m_model.selection().isSelected(this.m_series) && this
._isMarkersEnabled && i.append(new r(this._selectionData)), i
}, inherit(I, C), I.prototype.update = function() {
this._invalidated = !0
}, I.prototype._updateImpl = function() {
C.prototype.update.call(this);
var e = this.m_series.properties().baselineStyle,
t = e.transparency.value();
this._topFillColor1 = p.generateColor(e.topFillColor1.value(), t), this._topFillColor2 =
p.generateColor(e.topFillColor2.value(), t), this._bottomFillColor1 = p
.generateColor(e.bottomFillColor1.value(), t), this._bottomFillColor2 = p
.generateColor(e.bottomFillColor2.value(), t), this._topLineColor = e.topLineColor
.value(), this._bottomLineColor = e.bottomLineColor.value(), this._topLineWidth = e
.topLineWidth.value(), this._bottomLineWidth = e.bottomLineWidth.value(), this
._barSpacing = this.m_model.timeScale().barSpacing(), this._bottom = this.m_series
.priceScale().height(), this._baseLevelCoordinate = Math.round(this._bottom * (Math
.abs(100 - e.baseLevelPercentage.value()) / 100))
}, I.prototype.renderer = function() {
this._invalidated && (this._updateImpl(), this._invalidated = !1), this._renderer
.setData({
items: this.m_items,
topFillColor1: this._topFillColor1,
topFillColor2: this._topFillColor2,
bottomFillColor1: this._bottomFillColor1,
bottomFillColor2: this._bottomFillColor2,
topLineColor: this._topLineColor,
bottomLineColor: this._bottomLineColor,
topLineWidth: this._topLineWidth,
bottomLineWidth: this._bottomLineWidth,
lineStyle: CanvasEx.LINESTYLE_SOLID,
barSpacing: this._barSpacing,
baseLevelCoordinate: this._baseLevelCoordinate,
bottom: this._bottom
});
var e = new d;
return e.append(this._renderer), this.m_model.selection().isSelected(this.m_series) && e
.append(new r(this._selectionData)), e
}, t.SeriesBarsPaneView = S, t.SeriesCandlesPaneView = y, t.SeriesHollowCandlesPaneView = P,
t.SeriesLinePaneView = x, t.SeriesAreaPaneView = T, t.SeriesHeikenAshiPaneView = w, t
.SeriesBaselinePaneView = I, t.SeriesBarCandlesPaneView = b
},
"x2L+": function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return o
})), i.d(t, "a", (function() {
return a
}));
var s = i("m/cY"),
r = i("Vdly");
function n() {
return r.getBool("Chart.ShowMarketOpenStatus", !0)
}
const o = Object(s.a)(n());
function a() {
o.setValue(!0), r.remove("Chart.ShowMarketOpenStatus")
}
r.onSync.subscribe(null, () => o.setValue(n())), o.subscribe(null, () => r.setValue(
"Chart.ShowMarketOpenStatus", o.value()))
},
x5Tw: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "setupChartEventHint", (function() {
return u
}));
var s = i("Eyy1"),
r = i("YFKU"),
n = i("Vdly"),
o = i("mMWL"),
a = i("e92V"),
l = i("qFKp"),
c = i("/3z9"),
h = i("Kxc7");
function u(e, t = !1) {
if (!h.enabled("popup_hints")) return;
const u = e.getContainer();
let d = null,
p = null;
function _(e, t, r) {
if (d) d.show(e, r ? void 0 : m.bind(null, t));
else {
const n = o.tool.value();
Promise.all([i.e("react"), i.e(89), i.e("chart-event-hint")]).then(i.bind(null,
"PN5r")).then(i => {
d = new i.ChartEventHintRenderer(Object(s.ensureNotNull)(u)), n === o
.tool.value() && d.show(e, r ? void 0 : m.bind(null, t))
})
}
}
function m(e) {
n.setValue(e, !0, {
forceFlush: !0
}), Object(s.ensureNotNull)(d).destroy(), null !== p && p(), d = null
}
o.tool.subscribe((function() {
if (Boolean(n.getBool("hint.touchPainting"))) return;
const e = o.tool.value();
Object(a.isStudyLineToolName)(e) && "LineToolRegressionTrend" !== e && !l
.CheckMobile.any() ? _(Object(r.t)("Click to set a point"),
"hint.touchPainting") : l.CheckMobile.any() && !Object(a
.isLineDrawnWithPressedButton)(e) && Object(a.isLineToolName)(e) ?
_(Object(r.t)(
"Move the point to position the anchor then tap to place"),
"hint.touchPainting") : d && d.hide()
})), o.createdLineTool.subscribe(null, (function() {
const e = o.tool.value();
"LineToolPath" !== e || Boolean(n.getBool(
"hint.finishBuildPathByDblClick")) ? "LineToolPolyline" !== e ||
Boolean(n.getBool("hint.finishBuildPolylineByDblClick")) || _(Object(r
.t)("Double-click to finish Polyline"),
"hint.finishBuildPolylineByDblClick") : _(Object(r.t)(
"Double-click to finish Path"),
"hint.finishBuildPathByDblClick")
})), o.finishedLineTool.subscribe(null, (function() {
if (d) {
const e = o.tool.value();
"LineToolPath" === e ? m("hint.finishBuildPathByDblClick") :
"LineToolPolyline" === e && m("hint.finishBuildPolylineByDblClick")
}
})), t || l.CheckMobile.any() || Boolean(n.getBool("hint.startFocusedZoom")) || (p =
function(e, t) {
let i = !1;
const s = r => {
r ? (i && t(r), e.onZoom().unsubscribe(null, s)) : i || (t(r), i = !0)
};
return e.onZoom().subscribe(null, s), () => e.onZoom().unsubscribe(null, s)
}(e, (function(e) {
if (Boolean(n.getBool("hint.startFocusedZoom"))) return;
if (e) d && (p = null, m("hint.startFocusedZoom"));
else {
const e = c.isMacKeyboard ? "⌘" : "Ctrl";
_(Object(r.t)(
"Press and hold {key} while zooming to maintain the chart position"
).format({
key: e
}), "hint.startFocusedZoom")
}
})))
}
},
x8jL: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("MY2c"),
n = i("bOGh"),
o = i("RDU5");
class a extends o.UndoCommand {
constructor(e, t, i) {
super(i), this._wv = e, this._newValue = t, this._oldValue = e.value()
}
redo() {
this._wv.setValue(this._newValue)
}
undo() {
this._wv.setValue(this._oldValue)
}
}
var l = i("txPx"),
c = i("aIyQ"),
h = i.n(c);
i.d(t, "createUndoHistory", (function() {
return d
}));
const u = Object(l.getLogger)("Common.UndoHistory");
function d() {
const e = [],
t = new r.a,
i = new r.a,
o = new h.a;
function l(s) {
if (e.length > 0) e[e.length - 1].addCommand(s);
else {
i.clear();
const e = t.head(),
r = e && e.text();
e && e.canMerge(s) ? e.merge(s) : t.push(s);
const n = s.text();
"" !== n && n !== r && u.logNormal("DO: " + n)
}
s.executeOnPush() && s.redo(), e.length || o.fire(c())
}
function c() {
const e = t.head(),
s = i.head();
return {
enableUndo: !t.isEmpty(),
undoText: void 0 === e ? void 0 : e.text(),
enableRedo: !i.isEmpty(),
redoText: void 0 === s ? void 0 : s.text()
}
}
return {
beginUndoMacro: function(t) {
const i = new n.a(t);
return e.push(i), i
},
clearStack: function() {
t.clear(), i.clear(), o.fire(c())
},
createUndoCheckpoint: function() {
return {
lastActualCommand: t.isEmpty() ? null : t.head()
}
},
endUndoMacro: function() {
const t = Object(s.ensureDefined)(e.pop());
t.isEmpty() || l(t)
},
pushUndoCommand: l,
redo: function() {
if (i.isEmpty()) return !1;
const e = i.pop();
return !!e && (e.redo(), t.push(e), u.logNormal("REDO: " + e.text()), o.fire(
c()), !0)
},
redoStack: function() {
return i
},
setWatchedValue: function(e, t, i) {
if (e.value() !== t) {
const s = new a(e, t, i);
l(s), s.redo()
}
},
undo: function() {
if (t.isEmpty()) return !1;
const e = t.pop();
return !!e && (e.undo(),
i.push(e), u.logNormal("UNDO: " + e.text()), o.fire(c()), !0)
},
undoStack: function() {
return t
},
undoToCheckpoint: function(e) {
for (; !t.isEmpty() && e.lastActualCommand !== t.head();) t.pop().undo();
i.clear(), o.fire(c())
},
state: c,
onChange: function() {
return o
}
}
}
},
xCUR: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return n
})), i.d(t, "a", (function() {
return o
}));
var s = i("n5al"),
r = i("/tGj");
function n(e) {
const t = e.priceScale();
return !(null === t || !t.isPercentage()) && (!Object(r.isSymbolSource)(e) || Object(s
.isPriceSourceStyle)(e.style()))
}
function o(e) {
const t = e.priceScale();
if (n(e) && null !== t) return i => {
var s;
return t.formatPricePercentage(i, null !== (s = e.firstValue()) && void 0 !==
s ? s : 100)
};
const i = e.formatter();
return i.format.bind(i)
}
},
xDuj: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "translatedIntervalString", (function() {
return r
}));
i("YFKU");
var s = i("pPtI");
function r(e) {
const t = Object(s.getTranslatedResolutionModel)(e, !0);
return null === t ? e : t.multiplier + (t.mayOmitShortKind ? "" : t.shortKind)
}
},
xWfy: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return c
})), i.d(t, "b", (function() {
return p
})), i.d(t, "c", (function() {
return _
})), i.d(t, "d", (function() {
return m
}));
var s = i("tqok"),
r = i("fFKx"),
n = i("SqfW"),
o = i("KG+6"),
a = i("5vwb"),
l = i("7Fue");
class c {
constructor(e, t) {
if (this._indexes = [], this._horizlines = new Map, this._vertlines = new Map, this
._lines = new Map, this._hlines = new Map, this._textmarks = new Map, this
._shapemarks = new Map, this._backgrounds = new Map, this._polygons = new Map,
this._trendchannels = new Map, this._hhists = new Map, this._dwglabels =
new Map, this._dwglines = new Map, this._dwgboxes = new Map, this._dwgtables =
new Map, this._dwgtablecells = new Map, "data" === e) {
const e = t;
this._indexes = e.indexes, this._vertlines = h(e.vertlines, this._indexes, n.b),
this._horizlines = h(e.horizlines, this._indexes, r.b), this._polygons = h(e
.polygons, this._indexes, a.b), this._hhists = h(e.hhists, this
._indexes, o.d)
} else if ("state" === e) {
const e = t;
this._indexes = e.indexes || [], this._vertlines = u(e.vertlines, this._indexes,
n.b), this._horizlines = u(e.horizlines, this._indexes, r.b), this
._polygons = u(e.polygons, this._indexes, a.b), this._hhists = u(e.hhists,
this._indexes, o.d)
}
this._hhistsByTimePointIndex = Object(l.b)(this._hhists)
}
horizlines() {
return this._horizlines
}
vertlines() {
return this._vertlines
}
lines() {
return this._lines
}
hlines() {
return this._hlines
}
textmarks() {
return this._textmarks
}
shapemarks() {
return this._shapemarks
}
backgrounds() {
return this._backgrounds
}
polygons() {
return this._polygons
}
trendchannels() {
return this._trendchannels
}
hhists() {
return this._hhists
}
dwglabels() {
return this._dwglabels
}
dwglines() {
return this._dwglines
}
dwgboxes() {
return this._dwgboxes
}
dwgtables() {
return this._dwgtables
}
dwgtablecells() {
return this._dwgtablecells
}
hhistsByTimePointIndex() {
return this._hhistsByTimePointIndex
}
}
function h(e, t, i) {
const s = new Map;
return e.forEach((e, r) => {
const n = s.get(r) || new Set;
e.forEach(e => {
const s = i(e, t);
null !== s && n.add(s)
}), s.set(r, n)
}), s
}
function u(e, t, i) {
const s = new Map;
if (void 0 === e) return s;
for (const r of e) {
const e = r.styleId,
n = s.get(e) || new Set;
r.data.forEach(e => {
const s = i(e, t);
null !== s && n.add(s)
}), s.set(e, n)
}
return s
}
function d(e, t, i, s) {
const r = [];
return e.forEach((e, n) => {
e.forEach(e => {
! function(e, t, i) {
let s = null;
for (const i of e) i.styleId === t && (s = i);
null === s && (s = {
styleId: t,
data: []
}, e.push(s)), s.data.push(i)
}(r, n, s(e, t(e), i))
})
}), r.length > 0 ? r : void 0
}
function p() {
return new c
}
function _(e) {
return new c("state", e)
}
function m(e) {
const t = function(e) {
const t = new Set;
e.horizlines().forEach((e, i) => {
e.forEach(e => {
t.add(e.startIndex), t.add(e.endIndex)
})
}), e.vertlines().forEach((e, i) => {
e.forEach(e => {
t.add(e.index)
})
}), e.lines().forEach((e, i) => {
e.forEach(e => {
t.add(e.startIndex), t.add(e.endIndex)
})
}), e.textmarks().forEach((e, i) => {
e.forEach(e => {
t.add(e.time)
})
}), e.shapemarks().forEach((e, i) => {
e.forEach(e => {
t.add(e.time)
})
}), e.backgrounds().forEach((e, i) => {
e.forEach(e => {
t.add(null !== e.start ? e.start : s
.INVALID_TIME_POINT_INDEX), t.add(e.stop)
})
}), e.polygons().forEach((e, i) => {
e.forEach(e => {
e.points.forEach(e => {
t.add(e.index)
})
})
}), e.trendchannels().forEach((e, i) => {
e.forEach(e => {
t.add(e.startIndex), t.add(e.endIndex)
})
}), e.hhists().forEach((e, i) => {
e.forEach(e => {
t.add(e.firstBarTime), t.add(e.lastBarTime)
})
}), e.dwglabels().forEach((e, i) => {
e.forEach(e => {
t.add(e.x)
})
}), e.dwglines().forEach((e, i) => {
e.forEach(e => {
var i, r;
t.add(null !== (i = e.x1) && void 0 !== i ? i : s
.INVALID_TIME_POINT_INDEX), t.add(null !== (r = e
.x2) && void 0 !== r ? r : s
.INVALID_TIME_POINT_INDEX)
})
}), e.dwgboxes().forEach((e, i) => {
e.forEach(e => {
var i, r;
t.add(null !== (i = e.left) && void 0 !== i ? i : s
.INVALID_TIME_POINT_INDEX), t.add(null !== (r = e
.right) && void 0 !== r ? r : s
.INVALID_TIME_POINT_INDEX)
})
});
const i = Array.from(t);
return i.sort((e, t) => e - t), i
}(e),
i = {
indexes: t
};
let l = 0;
const c = () => ++l;
return i.vertlines = d(e.vertlines(), c, t, n.a), i.horizlines = d(e.horizlines(), c, t, r
.a), i.polygons = d(e.polygons(), c, t, a.a), i.hhists = d(e.hhists(), c, t, o.c), i
}
},
xdS3: function(e, t, i) {},
xnA2: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX").LineToolColorsProperty;
class o extends s {
constructor(e, t) {
super(e, t || o.createProperties()), this.version = o.version, i.e("lt-pane-views")
.then(i.t.bind(null, "CR3a", 7)).then(({
FibChannelPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return o.LevelsCount
}
migrateVersion(e, t, i) {
i.properties.removeProperty("reverse")
}
pointsCount() {
return 3
}
name() {
return "Fib Channel"
}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "17v9")))
.FibDrawingsWith24LevelsDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetoolfibchannel", e, !1, {
range: [1, 24],
names: ["coeff", "color", "visible"]
});
return o._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e);
var t = [];
for (let i = 1; i <= o.LevelsCount; i++) t.push(e.child("level" + i).child(
"color"));
e.addChild("linesColors", new n(t)), e.addExclusion("linesColors")
}
}
o.LevelsCount = 24, o.version = 2, t.LineToolFibChannel = o
},
xo8u: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return o
}));
var s = i("Eyy1"),
r = i("RDU5"),
n = i("n5al");
class o extends r.UndoCommand {
constructor(e, t, i, r) {
super(r), this._newSourcesCurrencies = new Map, this._oldSourcesCurrencies =
new Map, this._showFade = !1, this._chartWidget = i;
const o = i.model().mainSeries();
for (const i of e.seriesLikeSources()) {
if (!i.isVisible()) continue;
const e = t || Object(n.symbolOriginalCurrency)(Object(s.ensureNotNull)(i
.symbolInfo()));
this._newSourcesCurrencies.set(i.id(), e), this._oldSourcesCurrencies.set(i
.id(), i.currency()), this._showFade = this._showFade || i === o &&
i.currency() !== e
}
}
redo() {
this._applyCurrencies(this._newSourcesCurrencies)
}
undo() {
this._applyCurrencies(this._oldSourcesCurrencies)
}
_applyCurrencies(e) {
this._showFade && this._chartWidget.screen.show();
const t = this._chartWidget.model().model();
e.forEach((e, i) => {
Object(s.ensureNotNull)(t.dataSourceForId(i)).setCurrency(e)
}), this._chartWidget.model().selectionMacro(e => {
e.clearSelection()
})
}
}
},
xrEm: function(e, t, i) {},
xt3Q: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "TradingViewApiBase", (function() {
return s
}));
class s {
constructor(e) {
this._studyTemplatesDrawer = null;
const {
chartApiInstance: t,
chartWidgetCollection: i,
studyMarket: s,
financialsDialog: r,
saveChartService: n,
loadChartService: o
} = e;
this._chartWidgetCollection = i, this._studyMarket = s, this._financialsDialog = r,
this._saveChartService = n, this._loadChartLayoutDialog = o, this
._intervalsService = null
}
dialogs() {
var e, t, i, s, r, n;
return {
Indicators: this._studyMarket,
Financials: this._financialsDialog,
Compare: this._chartWidgetCollection.getCompareDialogRenderer(),
ObjectsTree: null,
ChartProperties: this._chartWidgetCollection.getChartPropertiesDialogRenderer(),
ChartLayoutSaveAs: null !== (t = null === (e = this._saveChartService) ||
void 0 === e ? void 0 : e.getSaveAsController()) && void 0 !== t ? t :
null,
ChartLayoutRename: null !== (s = null === (i = this._saveChartService) ||
void 0 === i ? void 0 : i.getRenameController()) && void 0 !== s ? s :
null,
ChartLayoutCreate: null !== (n = null === (r = this._saveChartService) ||
void 0 === r ? void 0 : r.getCreateController()) && void 0 !== n ? n :
null,
ChartLayoutLoad: this._loadChartLayoutDialog
}
}
studyTemplatesDrawerApi() {
throw new Error("not implemented")
}
intervalsService() {
throw new Error("not implemented")
}
setBrokerName(e) {
this._chartWidgetCollection.setBroker(e)
}
}
},
"xz+e": function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("7KDR").Action,
n = i("Ocx9").DefaultProperty,
o = i("j3hX").LineToolColorsProperty,
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
l = [{
value: a[0],
title: window.t("Supermillennium")
}, {
value: a[1],
title: window.t("Millennium")
}, {
value: a[2],
title: window.t("Submillennium")
}, {
value: a[3],
title: window.t("Grand Supercycle")
}, {
value: a[4],
title: window.t("Supercycle")
}, {
value: a[5],
title: window.t("Cycle")
}, {
value: a[6],
title: window.t("Primary")
}, {
value: a[7],
title: window.t("Intermediate")
}, {
value: a[8],
title: window.t("Minor", {
context: "wave"
})
}, {
value: a[9],
title: window.t("Minute", {
context: "wave"
})
}, {
value: a[10],
title: window.t("Minuette")
}, {
value: a[11],
title: window.t("Subminuette")
}, {
value: a[12],
title: window.t("Micro")
}, {
value: a[13],
title: window.t("Submicro")
}, {
value: a[14],
title: window.t("Minuscule")
}];
class c extends s {
constructor(e, t) {
super(e, t || c.createProperties()), this.version = c.version, i.e("lt-pane-views")
.then(i.t.bind(null, "Ht/7", 7)).then(({
ElliottLabelsPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
static migrateState(e) {
var t = {
0: 11,
1: 10,
2: 9,
3: 8,
4: 7,
5: 6,
6: 5,
7: 4,
8: 3
},
i = {
0: 11,
1: 8
};
"LineToolElliottSubminuette" === e.type && (e.type = "LineToolElliottImpulse", e
.state.degree = t[e.state.wavesize]), "LineToolElliottMinor" === e.type && (
e.type = "LineToolElliottImpulse", e.state.degree = t[e.state.wavesize]),
"LineToolElliottCircle" === e.type && (e.type = "LineToolElliottImpulse", e
.state.degree = t[e.state.wavesize]), "LineToolElliottMinorRetr" === e
.type && (e.type = "LineToolElliottCorrection", e.state.degree = i[e.state
.wavesize]), "LineToolElliottMajorRetr" === e.type && (e.type =
"LineToolElliottCorrection", e.state.degree = i[e.state.wavesize])
}
migrateVersion(e, t, i) {
if (i.properties.hasChild("background") && i.properties.removeProperty(
"background"), i.properties.hasChild("backgroundColor") && i.properties
.removeProperty("backgroundColor"), i.properties.hasChild("showBackground") && i
.properties.removeProperty("showBackground"), 1 === e) {
var s = Object.assign({}, this._timePoint[0]);
this._timePoint.unshift(s), this._points.length > 0 && (s = Object.assign({},
this._points[0]), this._points.unshift(s))
}
}
applyTemplate(e) {
delete e.background, delete e.backgroundColor, delete e.showBackground, super
.applyTemplate(e)
}
name() {
return "Elliott Labels"
}
additionalActions(e) {
var t = this;
return [new r({
label: window.t("Degree"),
subItems: a.map((function(i) {
var s = l.filter((function(e) {
return e.value === i
}))[0];
return new r({
label: s.title,
checkable: !0,
checked: t.properties().degree
.value() === i,
onExecute: function() {
e.setProperty(t.properties()
.degree, i,
"Change Elliott Degree")
}
})
}))
})]
}
label(e) {
var t = a.length - this.properties().degree.value() - 1,
i = Math.floor(t / 3);
return {
group: i,
bold: !!(i % 2),
decoration: ["", "brackets", "circle"][t % 3],
label: this.labelsGroup()[i][e]
}
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "UHSU")))
.ElliottPatternDefinitionsViewModel
}
availableDegreesValues() {
return l
}
static createProperties(e) {
var t = new n("linetoolelliott", e);
return c._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e), e.addChild("linesColors", new o([e.color])), e
.addExclusion("linesColors")
}
}
c.version = 4;
class h extends c {
pointsCount() {
return 6
}
static _configureProperties(e) {
c._configureProperties(e)
}
}
class u extends h {
constructor(e, t) {
super(e, t || u.createProperties())
}
name() {
return "Elliott Impulse Wave (12345)"
}
labelsGroup() {
return u._labelsGroups
}
static createProperties(e) {
var t = new n("linetoolelliottimpulse", e);
return u._configureProperties(t), t
}
static _configureProperties(e) {
h._configureProperties(e)
}
}
u._labelsGroups = [
["0", "1", "2", "3", "4", "5"],
["0", "i", "ii", "iii", "iv", "v"],
["0", "1", "2", "3", "4", "5"],
["0", "I", "II", "III", "IV", "V"],
["0", "1", "2", "3", "4", "5"]
];
class d extends h {
constructor(e, t) {
super(e, t || d.createProperties())
}
name() {
return "Elliott Triangle Wave (ABCDE)"
}
labelsGroup() {
return d._labelsGroups
}
static createProperties(e) {
var t = new n("linetoolelliotttriangle", e);
return d._configureProperties(t), t
}
static _configureProperties(e) {
h._configureProperties(e)
}
}
d._labelsGroups = [
["0", "A", "B", "C", "D", "E"],
["0", "a", "b", "c", "d", "e"],
["0", "A", "B", "C", "D", "E"],
["0", "a", "b", "c", "d", "e"],
["0", "A", "B", "C", "D", "E"]
];
class p extends h {
constructor(e, t) {
super(e, t || p.createProperties())
}
name() {
return "Elliott Triple Combo Wave (WXYXZ)"
}
labelsGroup() {
return p._labelsGroups
}
static createProperties(e) {
var t = new n("linetoolelliotttriplecombo", e);
return p._configureProperties(t), t
}
static _configureProperties(e) {
h._configureProperties(e)
}
}
p._labelsGroups = [
["0", "W", "X", "Y", "X", "Z"],
["0", "w", "x", "y", "x", "z"],
["0", "W", "X", "Y", "X", "Z"],
["0", "w", "x", "y", "x", "z"],
["0", "W", "X", "Y", "X", "Z"]
];
class _ extends c {
pointsCount() {
return 4
}
static _configureProperties(e) {
c._configureProperties(e)
}
}
class m extends _ {
constructor(e, t) {
super(e, t || m.createProperties())
}
name() {
return "Elliott Correction Wave (ABC)"
}
labelsGroup() {
return m._labelsGroups
}
static createProperties(e) {
var t = new n("linetoolelliottcorrection", e);
return m._configureProperties(t), t
}
static _configureProperties(e) {
_._configureProperties(e)
}
}
m._labelsGroups = [
["0", "A", "B", "C"],
["0", "a", "b", "c"],
["0", "A", "B", "C"],
["0", "a", "b", "c"],
["0", "A", "B", "C"]
];
class f extends _ {
constructor(e, t) {
super(e, t || f.createProperties())
}
name() {
return "Elliott Double Combo Wave (WXY)"
}
labelsGroup() {
return f._labelsGroups
}
static createProperties(e) {
var t = new n("linetoolelliottdoublecombo", e);
return f._configureProperties(t), t
}
static _configureProperties(e) {
_._configureProperties(e)
}
}
f._labelsGroups = [
["0", "W", "X", "Y"],
["0", "w", "x", "y"],
["0", "W", "X", "Y"],
["0", "w", "x", "y"],
["0", "W", "X", "Y"]
], t.LineToolElliott = c, t.LineToolElliottImpulse = u, t.LineToolElliottTriangle = d, t
.LineToolElliottTripleCombo = p, t.LineToolElliottCorrection = m, t
.LineToolElliottDoubleCombo = f
},
xzdg: function(e, t, i) {
"use strict";
i.r(t);
var s = i("Eyy1"),
r = i("YFKU"),
n = i("EsvI"),
o = i("H0vP"),
a = i("ikwP"),
l = i("ogJP"),
c = i("jFln"),
h = i("u+0B"),
u = i("XlJ7"),
d = i("JWMC"),
p = i("zDbI"),
_ = i("CPmC"),
m = i("gAom"),
f = i("Hr11"),
g = i("+cnz"),
b = i("CxTi");
class v {
constructor() {
this._width = null, this._currencyInfo = null, this._unitInfo = null, this
._fontSize = 0, this._currencyAndUnitLabelsWrapper = document.createElement(
"div"), this._currencyAndUnitLabelsWrapper.className = b[
"price-axis-currency-label-wrapper"], this._controlsContainer = document
.createElement("table"), this._controlsContainer.className = b[
"price-axis-currency-label"], this._currencyAndUnitLabelsWrapper
.appendChild(this._controlsContainer), this._currencyLabelTr = document
.createElement("tr"), this._currencyLabelTr.className = b[
"price-axis-currency-label-dropdown"], this._currencyLabelTr.classList.add(
"apply-common-tooltip"), Object(_.b)(this._currencyLabelTr, "text", e =>
this._currencyTooltipContent());
const e = document.createElement("td");
this._currencyText = document.createElement("span"), this._currencyText.className =
b["price-axis-currency-label-text"],
e.appendChild(this._currencyText), this._currencyLabelTr.appendChild(e);
const t = document.createElement("td");
this._currencyArrowDown = document.createElement("span"), this._currencyArrowDown
.className = b["price-axis-currency-label-arrow-down"], this._currencyArrowDown
.innerHTML = g, t.appendChild(this._currencyArrowDown), this._currencyLabelTr
.appendChild(t), this._unitLabelTr = document.createElement("tr"), this
._unitLabelTr.className = b["price-axis-currency-label-dropdown"], this
._unitLabelTr.classList.add("apply-common-tooltip"), Object(_.b)(this
._unitLabelTr, "text", e => this._unitTooltipContent());
const i = document.createElement("td");
this._unitText = document.createElement("span"), this._unitText.className = b[
"price-axis-currency-label-text"], i.appendChild(this._unitText), this
._unitLabelTr.appendChild(i);
const s = document.createElement("td");
this._unitArrowDown = document.createElement("span"), this._unitArrowDown
.className = b["price-axis-currency-label-arrow-down"], this._unitArrowDown
.innerHTML = g, s.appendChild(this._unitArrowDown), this._unitLabelTr
.appendChild(s), this._controlsContainer.appendChild(this._currencyLabelTr),
this._controlsContainer.appendChild(this._unitLabelTr), this.hideCurrency(),
this.hideUnit()
}
element() {
return this._currencyAndUnitLabelsWrapper
}
currencyLabelElement() {
return this._currencyLabelTr
}
unitLabelElement() {
return this._unitLabelTr
}
isVisible() {
return this.currencyLabelVisible() || this.unitLabelVisible()
}
width() {
if (null !== this._width) return this._width;
let e = 0;
if (this.currencyLabelVisible()) {
const t = this._currencyLabelTr.getBoundingClientRect();
e = Math.max(e, t.right - t.left + 1 + 8)
}
if (this.unitLabelVisible()) {
const t = this._unitLabelTr.getBoundingClientRect();
e = Math.max(e, t.right - t.left + 1 + 8)
}
return this._width = e, e
}
drawLabel(e, t, i, s) {
if (!this.isVisible()) return;
const r = this.currencyLabelVisible() ? this._currencyText.textContent || "" : this
._unitText.textContent || "",
n = this._unitText.textContent || "";
e.font = Object(u.makeFont)(this._fontSize, p.CHART_FONT_FAMILY);
const o = new h.TextWidthCache,
l = 2 * Number(b.css_value_currency_label_text_horizontal_padding) + Math.max(o
.measureText(e, r), o.measureText(e, n)),
c = o.yMidCorrection(e, r),
d = o.yMidCorrection(e, n),
_ = Math.round(t / 2 * i),
g = Object(f.ceiledEven)(l * i / 2),
v = this._controlsContainer.style,
S = Math.round(this.labelTop() * i),
y = Math.round(this.labelBottom() * i),
w = y - S,
P = Math.round(Number(b.css_value_currency_label_radius) * i);
Object(m.drawRoundRect)(e, _ - g, S, 2 * g, w, P), e.fillStyle = v.backgroundColor,
e.fill();
const C = Math.max(1, Math.floor(i));
e.lineWidth = C, e.strokeStyle = s ? b.css_value_border_color_dark : b
.css_value_border_color_light, Object(m.drawRoundRect)(e, _ - g + C / 2, S + C /
2, 2 * g - C, w - C, P), e.stroke();
const x = S + (y - S - 1) / 2,
T = this._isMultiLine();
T && Object(m.drawHorizontalLine)(e, Math.floor(x + C / 2), _ - g, _ + g);
const I = this._oneLineHeight() / 2 * i,
M = T ? Math.ceil(x - I) : x,
O = Math.ceil(x + I);
e.fillStyle = v.color, e.textBaseline = "middle", e.textAlign = "center", Object(a
.drawScaled)(e, i, () => e.fillText(r, _ / i, (M + c) / i)), T && Object(a
.drawScaled)(e, i, () => e.fillText(n, _ / i, (O + d) / i))
}
showCurrency() {
this._currencyLabelTr.classList.remove("js-hidden"), this._width = null, this
._updateMultiLine(), this._updateVisibility()
}
hideCurrency() {
this._currencyLabelTr.classList.add("js-hidden"), this._width = null, this
._updateMultiLine(), this._updateVisibility()
}
showUnit() {
this._unitLabelTr.classList.remove("js-hidden"), this._width = null, this
._updateMultiLine(), this._updateVisibility()
}
hideUnit() {
this._unitLabelTr.classList.add("js-hidden"), this._width = null, this
._updateMultiLine(), this._updateVisibility()
}
currencyLabelVisible() {
return !this._currencyLabelTr.classList.contains("js-hidden")
}
unitLabelVisible() {
return !this._unitLabelTr.classList.contains("js-hidden")
}
setCurrencyInfo(e) {
if (this._currencyInfo === e) return !1;
this._currencyInfo = e;
const t = null === e.selectedCurrency ? Object(r.t)("Mixed") : Object(s
.ensureDefined)(e.displayedValues.get(e.selectedCurrency));
return this._currencyText.textContent !== t && (this._currencyText.textContent = t,
this._width = null), this._currencyArrowDown.classList.contains(
"js-hidden") !== e.readOnly && (this._currencyArrowDown.classList.toggle(
"js-hidden", e.readOnly), this._currencyLabelTr.classList.toggle(b
.readonly, e.readOnly), this._width = null), !0
}
setUnitInfo(e) {
if (null !== this._unitInfo && this._unitInfo.selectedUnit === e.selectedUnit &&
0 === this._unitInfo.availableGroups.size == (0 === e.availableGroups.size) &&
this._unitInfo.originalUnits.size === e.originalUnits.size) return this
._unitInfo = e, !1;
this._unitInfo = e;
const t = null === e.selectedUnit ? Object(r.t)("Mixed") : Object(s.ensureDefined)(e
.names.get(e.selectedUnit));
return this._unitText.textContent !== t && (this._unitText.textContent = t, this
._width = null), this._unitArrowDown.classList.contains("js-hidden") !== (
0 === e.availableGroups.size) && (this._unitArrowDown.classList.toggle(
"js-hidden", 0 === e.availableGroups.size), this._unitLabelTr.classList
.toggle(b.readonly, 0 === e.availableGroups.size), this._width = null), !0
}
updateColors(e, t) {
const i = this._controlsContainer.style;
i.background = e, i.color = t
}
currencyInfo() {
return this._currencyInfo
}
unitInfo() {
return this._unitInfo
}
setFontSize(e) {
this._fontSize !== e && (this._fontSize = e, this._currencyLabelTr.style.fontSize =
e + "px", this._unitLabelTr.style.fontSize = e + "px", this._width = null,
this._setLineHeight(this._oneLineHeight()))
}
labelTop() {
return Number(b.css_value_currency_label_top)
}
labelBottom() {
const e = this.labelTop(),
t = this._oneLineHeight();
let i = e + t;
return this._isMultiLine() && (i += t + 1), i
}
_currencyTooltipContent() {
const e = this._currencyInfo;
return null === e ? "" : null === e.selectedCurrency ? Array.from(e.currencies).map(
t => Object(s.ensureDefined)(e.displayedValues.get(t))).join(", ") : ""
}
_unitTooltipContent() {
const e = this._unitInfo;
return null === e ? "" : null === e.selectedUnit ? Array.from(e.units).map(t =>
Object(s.ensureDefined)(e.names.get(t))).join(", ") : e.descriptions.get(e
.selectedUnit) || ""
}
_setLineHeight(e) {
this._currencyLabelTr.style.lineHeight = e + "px", this._unitLabelTr.style
.lineHeight = e + "px"
}
_updateMultiLine() {
this._controlsContainer.classList.toggle(b.multiline, this._isMultiLine())
}
_updateVisibility() {
this._currencyAndUnitLabelsWrapper.classList.toggle("js-hidden", !this.isVisible())
}
_oneLineHeight() {
return 7 + this._fontSize
}
_isMultiLine() {
return this.unitLabelVisible() && this.currencyLabelVisible()
}
}
async function S(e, t, s) {
const [r, n] = await Promise.all([Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i
.e(6), i.e(8), i.e(9), i.e(13), i.e(19), i.e(29), i.e(66), i.e(83),
i.e(0), i.e(2), i.e(5), i.e(18), i.e("currency-label-menu")
]).then(i.bind(null, "9agd")), t()]);
return r.showUnitConversion(e, s, n)
}
var y = i("5VQP");
var w = i("3/8U"),
P = i("nqXy");
i.d(t, "PriceAxisWidgetBase", (function() {
return x
}));
const C = {
contextMenuEnabled: !0,
currencyConversionEnabled: !1,
unitConversionEnabled: !1,
countdownEnabled: !0,
contextMenu: {
general: !0,
source: !0
},
pressedMouseMoveScale: !0,
mouseWheelScale: !0,
croppedTickMarks: !0
};
class x {
constructor(e, t, i, s, r, n, o) {
this._priceScale = null, this._widthCache = new h.TextWidthCache(500), this._color =
null, this._fontSize = null, this._currencyFontSize = 0, this
._currencyLabelWidth = null, this._isVisible = !0, this._updateTimeout = null,
this._currencyMenu = null, this._unitMenu = null, this._prevOptimalWidth = 0,
this._size = new a.Size(-1, -1), this._currentCursorClassName = "", this
._mouseDown = !1, this._destroyed = !1, this._highlighted = !1, this
._mouseWheelHelper = null, this._dragScaleActive = !1, this._pane = e, this
._undoModel = t, this._properties = i, this._isLeft = "left" === s, this
._options = Object(l.merge)(Object(l.clone)(C), r), this
._rendererOptionsProvider = n, this._backgroundBasedTheme = o, this._cell =
document.createElement("div"), this._cell.className = "price-axis", this._cell
.style.width = "25px", this._cell.style.left = "0", this
._canvasConfiguredHandler = () => {
this._undoModel.model().lightUpdate()
}, this._canvasBinding = Object(a.createBoundCanvas)(this._cell, new a.Size(16,
16)), this._canvasBinding.subscribeCanvasConfigured(this
._canvasConfiguredHandler);
const c = this._canvasBinding.canvas;
c.style.position = "absolute", c.style.zIndex = "1", c.style.left = "0", c.style
.top = "0", this._topCanvasConfiguredHandler = () => this._undoModel.model()
.lightUpdate(), this._topCanvasBinding = Object(a.createBoundCanvas)(this._cell,
new a.Size(16, 16)), this._topCanvasBinding.subscribeCanvasConfigured(this
._topCanvasConfiguredHandler);
const u = this._topCanvasBinding.canvas;
u.style.position = "absolute", u.style.zIndex = "2", u.style.left = "0", u.style
.top = "0", this._options.currencyConversionEnabled || this._options
.unitConversionEnabled ? (this._currencyLabel = new v, this._cell.appendChild(
this._currencyLabel.element()), this._currencyLabel
.currencyLabelElement().addEventListener("click", () => this
._showCurrenciesContextMenu()), this._currencyLabel.unitLabelElement()
.addEventListener("click", () => this._showUnitsContextMenu())) : this
._currencyLabel = null, this._properties.childs().fontSize.subscribe(this, this
._onFontSizeChanged), this._options.mouseWheelScale && (this
._mouseWheelHelper = new P.a, this._cell.addEventListener("wheel", this
._onMousewheel.bind(this), {
passive: !1
}))
}
getElement() {
return this._cell
}
onOptimalWidthNeedToBeRecalculated(e) {
const t = this.optimalWidth();
(this._prevOptimalWidth < t || e) && null === this._updateTimeout && (this
._updateTimeout = setTimeout(() => {
this._undoModel.model().fullUpdate(), this._updateTimeout = null
}, 100)), this._prevOptimalWidth = t
}
optimalWidth() {
var e;
if (!this.isVisible()) return 0;
let t = 0;
const i = this.rendererOptions();
if (this._pane.hasState()) {
const i = Object(a.getContext2D)(this._canvasBinding.canvas);
Object(c.setFont)(i, this.baseFont());
const s = this.backLabels(!0);
for (let e = s.length; e--;) {
if (!s[e].isAxisLabelVisible()) continue;
const r = this._widthCache.measureText(i, s[e].text());
t = Math.max(t, r);
const n = s[e].secondLineText();
n && (t = Math.max(t, this._widthCache.measureText(i, n)));
const o = s[e].thirdLineText();
o && (t = Math.max(t, this._widthCache.measureText(i, o)))
}
const r = this.priceScale(),
n = r.marks();
n.length > 0 && (t = Math.max(t, this._widthCache.measureText(i, n[0].label),
this._widthCache.measureText(i, n[n.length - 1].label)));
const o = (null === (e = r.mainSource()) || void 0 === e ? void 0 : e
.firstValue()) || null;
if (null !== o) {
const e = r.coordinateToPrice(1, o),
s = r.coordinateToPrice(this._size.h - 2, o);
t = Math.max(t, this._widthCache.measureText(i, r.formatPrice(Math.floor(
Math.min(e, s)) + .11111111111111, o)), this._widthCache
.measureText(i, r.formatPrice(Math.ceil(Math.max(e, s)) -
.11111111111111, o)))
}
}
let r = 0;
this._isCurrencyLabelVisible() && (null === this._currencyLabelWidth && (this
._currencyLabelWidth = Object(s.ensureNotNull)(this._currencyLabel)
.width()), r = this._currencyLabelWidth);
const n = t || 34;
let o = Math.max(r, Math.ceil(i.borderSize + i.offsetSize + i.paddingInner + i
.paddingOuter + n + 4));
return o += o % 2, o
}
backLabels(e) {
const t = [],
i = this._grouppedSources(),
s = s => {
for (const r of s) {
if (!e && i.topLevelSources.has(r)) continue;
const s = r.priceAxisViews(this._pane.state(), this.priceScale());
if (s)
for (const e of s) t.push(e)
}
};
return s(i.sources), s(this._pane.state().customSources()), t
}
getImage() {
const e = this._size,
t = Object(a.createDisconnectedCanvas)(document, e);
if (Object(a.getPrescaledContext2D)(t).drawImage(this._canvasBinding.canvas, 0, 0, e
.w, e.h), null !== this._currencyLabel && this._currencyLabel.isVisible()) {
const i = this._undoModel.model().isDark();
this._currencyLabel.drawLabel(Object(a.getContext2D)(t), e.w, Object(a
.getCanvasDevicePixelRatio)(t), i)
}
return t
}
paint(e) {
if (this._isVisible && e !== o.InvalidationLevel.None) {
if (e > o.InvalidationLevel.Cursor) {
const e = Object(a.getContext2D)(this._canvasBinding.canvas);
this._alignLabels(), this._drawBackground(e, this._canvasBinding
.pixelRatio), this._drawBorder(e, this._canvasBinding.pixelRatio),
this
._pane.hasState() && (this._updateCurrencyLabel(), this._drawTickMarks(
e, this._canvasBinding.pixelRatio), this._drawBackLabels(e, this
._canvasBinding.pixelRatio))
}
if (this._pane.hasState()) {
const e = Object(a.getContext2D)(this._topCanvasBinding.canvas),
t = this._topCanvasBinding.pixelRatio;
e.clearRect(0, 0, Math.ceil(this._size.w * t) + 1, Math.ceil(this._size.h *
t) + 1), this._drawCrossHairLabel(e, t)
}
}
}
priceScale() {
return Object(s.ensureNotNull)(this._priceScale)
}
setPriceScale(e) {
this._priceScale !== e && (null !== this._priceScale && (this._priceScale
.onMarksChanged().unsubscribe(this, this
.onOptimalWidthNeedToBeRecalculated), this._priceScale.modeChanged()
.unsubscribeAll(this)), this._priceScale = e, null !== e && (e
.onMarksChanged().subscribe(this, this
.onOptimalWidthNeedToBeRecalculated), e.modeChanged().subscribe(
this, () => this.onOptimalWidthNeedToBeRecalculated(!0))))
}
isVisible() {
return this._isVisible
}
setVisible(e) {
(e = !!e) !== this._isVisible && (this._cell.style.display = e ? "table-cell" :
"none", this._isVisible = e)
}
destroy() {
null !== this._currencyMenu && (this._currencyMenu.close(), this._currencyMenu =
null), null !== this._unitMenu && (this._unitMenu.close(), this._unitMenu =
null), this._topCanvasBinding.unsubscribeCanvasConfigured(this
._topCanvasConfiguredHandler), this._topCanvasBinding.destroy(), this
._canvasBinding.unsubscribeCanvasConfigured(this._canvasConfiguredHandler), this
._canvasBinding.destroy(), null !== this._priceScale && (this._priceScale
.onMarksChanged().unsubscribe(this, this
.onOptimalWidthNeedToBeRecalculated), this._priceScale.modeChanged()
.unsubscribeAll(this)), this._priceScale = null, this._updateTimeout && (
clearTimeout(this._updateTimeout), this._updateTimeout = null), this
._properties.childs().fontSize.unsubscribe(this, this._onFontSizeChanged), this
._destroyed = !0
}
setHighlighted(e) {
this._highlighted = e
}
backgroundColor() {
return this._pane.state().model().backgroundColor().value()
}
backgroundTopColor() {
return this._pane.state().model().backgroundTopColor().value()
}
lineColor() {
return this._properties.childs().lineColor.value()
}
textColor() {
return this._properties.childs().textColor.value()
}
fontSize() {
return this._properties.childs().fontSize.value()
}
baseFont() {
return Object(u.makeFont)(this.fontSize(), p.CHART_FONT_FAMILY, "")
}
rendererOptions() {
let e = this._rendererOptionsProvider.options();
return this._color === e.color && this._fontSize === e.fontSize || (this._color = e
.color), this._fontSize !== e.fontSize && (this._widthCache.reset(), this
._fontSize = e.fontSize, this._currencyLabelWidth = null, this
._currencyFontSize = 0, this._updateCurrencyLabelFont(), this
.onOptimalWidthNeedToBeRecalculated()), e
}
mouseEnterEvent(e) {
this._mouseEnterOrTouchStartEvent(e)
}
mouseMoveEvent(e) {
this._mouseOrTouchMoveEvent(e)
}
mouseDownEvent(e) {
this._mouseDownOrTouchStartEvent(e)
}
touchStartEvent(e) {
this._mouseOrTouchMoveEvent(e), this._mouseEnterOrTouchStartEvent(e), this
._mouseDownOrTouchStartEvent(e)
}
pressedMouseMoveEvent(e) {
this._pressedMouseOrTouchMoveEvent(e)
}
touchMoveEvent(e) {
this._pressedMouseOrTouchMoveEvent(e)
}
mouseDownOutsideEvent() {
if (this._dragScaleActive) {
const e = this._pane.state(),
t = this.priceScale();
this._mouseDown && (this._mouseDown = !1, this._undoModel.endScalePrice(e, t),
this.restoreDefaultCursor()), this._dragScaleActive = !1
}
}
mouseUpEvent(e) {
this._mouseUpOrTouchEndEvent(e)
}
touchEndEvent(e) {
this._mouseLeaveOrTouchEndEvent(e), this._mouseUpOrTouchEndEvent(e)
}
mouseClickEvent(e) {
this._mouseClickOrTapEvent(e)
}
tapEvent(e) {
this._mouseClickOrTapEvent(e)
}
mouseLeaveEvent(e) {
this._mouseLeaveOrTouchEndEvent(e)
}
mouseDoubleClickEvent(e) {
this._mouseDoubleClickOrDoubleTapEvent(e)
}
doubleTapEvent(e) {
this._mouseDoubleClickOrDoubleTapEvent(e)
}
contextMenuEvent(e) {
this._contextMenuOrTouchContextMenuEvent(e)
}
touchContextMenuEvent(e) {
this._contextMenuOrTouchContextMenuEvent(e)
}
reset() {
const e = this._pane.state(),
t = this.priceScale();
this._undoModel.resetPriceScale(e, t), this.onOptimalWidthNeedToBeRecalculated(!0)
}
sizeReady() {
return this.getWidth() >= this.optimalWidth() && null === this._updateTimeout
}
_grouppedSources() {
var e;
const t = this._pane,
i = t.state().model(),
s = this._sameSideSources().slice(),
r = t.state(),
n = this.priceScale(),
o = new Set,
a = null !== (e = i.lineBeingEdited()) && void 0 !== e ? e : i
.lineBeingCreated();
a && o.add(a);
const l = i.customSourceBeingMoved();
null !== l && o.add(l), i.sourcesBeingMoved().forEach(e => o.add(e)), i.selection()
.allSources().forEach(e => o.add(e));
const c = i.hoveredSource();
null !== c && o.add(c);
if (n === r.defaultPriceScale()) {
const e = this._pane.state().dataSources();
for (const t of e) r.isOverlay(t) && s.push(t)
}
return {
sources: s,
topLevelSources: o
}
}
_isCurrencyLabelVisible() {
return null !== this._currencyLabel && this._currencyLabel.isVisible()
}
_updateCurrencyLabel() {
if (null !== this._currencyLabel) {
if (this._options.currencyConversionEnabled) {
const e = this.priceScale().currency(this._undoModel.model()
.availableCurrencies());
null !== e && this._properties.childs().showCurrency.value() ? (this
._currencyLabel.showCurrency(), this._currencyLabel.updateColors(
this.backgroundTopColor(), this.textColor()), this
._currencyLabel.setCurrencyInfo(e) && (this._currencyLabelWidth =
null, this.onOptimalWidthNeedToBeRecalculated())) : this
._currencyLabel.hideCurrency()
}
if (this._options.unitConversionEnabled) {
const e = this.priceScale().unit(this._undoModel.model().availableUnits());
null !== e && this._properties.childs().showUnit.value() ? (this
._currencyLabel.showUnit(), this._currencyLabel.updateColors(this
.backgroundTopColor(), this.textColor()), this._currencyLabel
.setUnitInfo(e) && (this._currencyLabelWidth = null, this
.onOptimalWidthNeedToBeRecalculated())) : this._currencyLabel
.hideUnit()
}
this._updateCurrencyLabelFont()
}
}
_updateCurrencyLabelFont() {
if (null === this._currencyLabel) return;
const e = this.fontSize();
e !== this._currencyFontSize && (this._currencyLabel.setFontSize(e), this
._currencyFontSize = e, this._currencyLabelWidth = null, this
.onOptimalWidthNeedToBeRecalculated())
}
_alignLabels() {
let e = this._size.h / 2;
const t = [],
i = this.priceScale(),
s = i.orderedSources().slice(),
r = this._pane.state(),
n = this.rendererOptions();
if (i === r.defaultPriceScale()) {
const e = r.priceDataSources();
for (let t = 0; t < e.length; t++) r.isOverlay(e[t]) && s.push(e[t])
}
const o = i.mainSource();
for (const n of [s, r.customSources()])
for (let s = 0; s < n.length; ++s) {
const a = n[s],
l = a.priceAxisViews(r, i);
if (l) {
const i = l.filter(e => !e.ignoreAlignment() && e.isVisible());
if (!i.length) continue;
t.push(...i), o === a && (e = i[0].floatCoordinate())
}
}
const a = t.filter(t => t.floatCoordinate() <= e),
l = t.filter(t => t.floatCoordinate() > e);
a.sort((e, t) => t.floatCoordinate() - e.floatCoordinate()), a.length > 0 && l
.length > 0 && l.push(a[0]), l.sort((e, t) => e.floatCoordinate() - t
.floatCoordinate());
for (const e of t) e.setFixedCoordinate(e.coordinate());
if (i.properties().childs().alignLabels.value()) {
for (let e = 1; e < a.length; e++) {
const t = a[e],
i = a[e - 1],
s = t.height(n),
r = t.coordinate(),
o = i.getFixedCoordinate();
r > o - s && t.setFixedCoordinate(o - s)
}
for (let e = 1; e < l.length; e++) {
const t = l[e],
i = l[e - 1],
s = i.height(n),
r = t.coordinate(),
o = i.getFixedCoordinate();
r < o + s && t.setFixedCoordinate(o + s)
}
}
}
_drawTickMarks(e, t) {
const i = this.priceScale().marks();
e.save(), Object(c.setFont)(e, this.baseFont());
const r = this.rendererOptions(),
n = this._isLeft ? Math.floor((this._size.w - r.offsetSize) * t) : 0,
o = this._isLeft ? Math.round(n - r.paddingInner * t) : Math.round(n + (r
.offsetSize + r.paddingInner) * t),
l = this.fontSize(),
h = this._isCurrencyLabelVisible() ? Object(s.ensureNotNull)(this
._currencyLabel).labelBottom() : 0,
u = i.map(t => {
if (this._options.croppedTickMarks) return {
visible: !0,
yCorrection: this._widthCache.yMidCorrection(e, t.label)
};
const i = t.coord - l / 2,
s = t.coord + l / 2,
r = !(s > this._size.h || i < h);
return {
visible: !(s > this._size.h || i < h),
yCorrection: r ? this._widthCache.yMidCorrection(e, t.label) : 0
}
});
e.fillStyle = this.textColor(), e.textAlign = this._isLeft ? "right" : "left", e
.textBaseline = "middle", Object(a.drawScaled)(e, t, () => {
for (let s = i.length; s--;) {
if (!u[s].visible) continue;
const r = i[s];
e.fillText(r.label, o / t, r.coord + u[s].yCorrection)
}
}), e.restore()
}
_hasAlertLabel() {
return !1
}
_showCurrenciesContextMenu() {
if (null !== this._currencyMenu && this._currencyMenu.isOpened()) return void this
._currencyMenu.close();
Object(d.trackEvent)("GUI", "Currency conversion");
S(Object(r.t)("Currencies"), () => async function(e, t, s) {
return (await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i
.e(6), i.e(8), i.e(9), i.e(13), i.e(19), i.e(29), i
.e(66), i.e(83), i.e(0), i.e(2), i.e(5), i.e(18), i
.e("currency-label-menu")
]).then(i.bind(null, "aWqZ"))).currencyActions(e, t, s)
}(this._undoModel, Object(s.ensureNotNull)(this._currencyLabel)
.currencyInfo(), this.priceScale()), Object(s.ensureNotNull)(this
._currencyLabel).currencyLabelElement()).then(e => {
this._destroyed ? e.close() : this._currencyMenu = e
})
}
_showUnitsContextMenu() {
if (null !== this._unitMenu && this._unitMenu.isOpened()) return void this._unitMenu
.close();
Object(d.trackEvent)("GUI", "Unit conversion");
S(Object(r.t)("Units"), () => async function(e, t, s) {
return (await Promise.all([i.e("react"), i.e(1), i.e(3), i.e(4), i
.e(6), i.e(8), i.e(9), i.e(13), i.e(19), i.e(29), i
.e(66), i.e(83), i.e(0), i.e(2), i.e(5), i.e(18), i
.e("currency-label-menu")
]).then(i.bind(null, "hpdS"))).unitActions(e, t, s)
}(this._undoModel, Object(s.ensureNotNull)(this._currencyLabel)
.unitInfo(), this.priceScale()), Object(s.ensureNotNull)(this
._currencyLabel).unitLabelElement()).then(e => {
this._destroyed ? e.close() : this._unitMenu = e
})
}
_onFontSizeChanged() {
this._currencyLabelWidth = null, this._currencyFontSize = 0, this
._updateCurrencyLabelFont(), this.onOptimalWidthNeedToBeRecalculated()
}
_mouseOrTouchMoveEvent(e) {
if (!this._priceScale) return;
this.dataSourceAtPoint(e.localX, e.localY) ? this._setCursorClassName("pointer") :
this._setResizeCursor()
}
_mouseDownOrTouchStartEvent(e) {
this._zoomAvailable() && this._options.pressedMouseMoveScale && (this._mouseDown = !
0,
this._undoModel.startScalePrice(this._pane.state(), this.priceScale(), e
.localY), this._dragScaleActive = !0)
}
_mouseEnterOrTouchStartEvent(e) {
this._setResizeCursor()
}
_pressedMouseOrTouchMoveEvent(e) {
if (this._dragScaleActive) {
const t = this.priceScale();
this._undoModel.scalePriceTo(this._pane.state(), t, e.localY)
}
}
_mouseUpOrTouchEndEvent(e) {
if (this._dragScaleActive) {
const e = this.priceScale();
this._mouseDown = !1, this._undoModel.endScalePrice(this._pane.state(), e), this
.restoreDefaultCursor(), this._dragScaleActive = !1
}
}
_mouseClickOrTapEvent(e) {
const t = this.dataSourceAtPoint(e.localX, e.localY);
t && this._undoModel.selectionMacro(e => {
e.selection().isSelected(t) || (e.clearSelection(), e
.addSourceToSelection(t))
})
}
_mouseLeaveOrTouchEndEvent(e) {
this._setCursorClassName("")
}
_mouseDoubleClickOrDoubleTapEvent(e) {
const t = this.dataSourceAtPoint(e.localX, e.localY);
t ? this._pane.processDoubleClickOnSource(t) : (this.reset(), Object(d.trackEvent)(
"GUI", "Double click price scale"))
}
_contextMenuOrTouchContextMenuEvent(e) {
if (this._options.contextMenuEnabled) {
const t = this.dataSourceAtPoint(e.localX, e.localY);
if (null !== t && this._options.contextMenu.source) {
return void this._undoModel.model().selectionMacro(i => {
i.selection().isSelected(t) || (i.clearSelection(), i
.addSourceToSelection(t)), this._pane
.showContextMenuForSelection(e)
})
}
this._options.contextMenu.general && y.ContextMenuManager.createMenu(this
.getContextMenuActions(), {
statName: "PriceScaleContextMenu"
}).then(t => t.show(e))
}
}
_setResizeCursor() {
const e = this.priceScale();
e.isPercentage() || e.isIndexedTo100() ? this._setCursorClassName("") : this
._zoomAvailable() && (this._options.pressedMouseMoveScale || this._options
.mouseWheelScale) && this._setCursorClassName("ns-resize")
}
_setCursorClassName(e) {
let t = "";
e && (t = "price-axis--cursor-" + e), this._currentCursorClassName !== t && (this
._currentCursorClassName && this._cell.classList.remove(this
._currentCursorClassName), t && this._cell.classList.add(t), this
._currentCursorClassName = t)
}
_zoomAvailable() {
return !this.priceScale().isEmpty() && this._undoModel.model().zoomEnabled()
}
_onMousewheel(e) {
if (!this._zoomAvailable() || !this._options.mouseWheelScale) return;
const t = Object(s.ensureNotNull)(this._mouseWheelHelper).processWheel(e).deltaY;
if (0 === t) return;
e.cancelable && e.preventDefault();
const i = this._undoModel,
r = this._pane.state(),
n = this.priceScale(),
o = this._cell.getBoundingClientRect(),
a = e.clientY - o.top,
l = a + 15 * t;
i.startScalePrice(r, this.priceScale(), a, !0), i.scalePriceTo(r, n, l), i
.endScalePrice(r, n), e.stopPropagation()
}
_drawCrossHairLabel(e, t) {
var i, s;
e.save();
const r = this._pane.state(),
n = r.model(),
o = this.priceScale(),
a = [],
l = this.priceScale() === r.defaultPriceScale(),
c = null !== (i = n.lineBeingEdited()) && void 0 !== i ? i : n
.lineBeingCreated();
if (c && (c.priceScale() === o || l && r.isOverlay(c))) {
const e = c.priceAxisViews(r, o);
e && e.length && a.push(e)
}
const h = n.customSourceBeingMoved();
this._addViewsOrMaxMin(null === h ? [] : [h], a), this._addViewsOrMaxMin(n
.sourcesBeingMoved(), a), this._addViewsOrMaxMin(n.selection().allSources(),
a);
const u = n.hoveredSource();
if (u) {
const e = r.customSources().includes(u) ? o : u.priceScale();
if (!n.selection().isSelected(u) && (this._isFromSameSide(e) || l && r
.isOverlay(u))) {
const e = null === (s = n.hoveredSource()) || void 0 === s ? void 0 : s
.priceAxisViews(r, o);
e && e.length && a.push(e)
}
}
const d = n.crossHairSource().priceAxisViews(r, o);
d && d.length && a.push(d);
const p = this.rendererOptions(),
_ = this._isLeft ? "right" : "left";
a.forEach(i => {
i.forEach(i => {
e.save(), i.renderer().draw(e, p, this._widthCache, this
._size.w, _, t), e.restore()
})
}), e.restore()
}
_drawBackground(e, t) {
const i = Math.ceil(this._size.w * t),
s = Math.ceil(this._size.h * t),
r = this.backgroundTopColor(),
o = this.backgroundColor();
if (r === o ? Object(a.clearRect)(e, 0, 0, i + 1, s + 1, this.backgroundColor()) :
Object(m.clearRectWithGradient)(e, 0, 0, i + 1, s + 1, r, o), this._highlighted
) {
e.globalAlpha = .5;
const t = n.themes[this._backgroundBasedTheme.value()].getThemedColor(
"color-price-axis-highlight");
Object(a.fillRect)(e, 0, 0, i + 1, s + 1, t), e.globalAlpha = 1
}
const l = this._pane.state().model(),
c = this.priceScale(),
h = l.selection().lineDataSources().filter(e => e.priceScale() === c).reduce((e,
t) => {
const i = t.priceAxisPoints();
return 0 === i.length ? e : e.concat(i)
}, []);
h.length > 0 && this._hightlightBackground(e, h, this.priceScale().mainSource(), t);
const u = l.crossHairSource();
u.startMeasurePoint() && this._hightlightBackground(e, u.measurePoints(), this
.priceScale().mainSource(), t)
}
_drawBorder(e, t) {
e.save(), e.fillStyle = this.lineColor();
const i = Math.max(1, Math.floor(this.rendererOptions().borderSize * t)),
s = this._isLeft ? Math.floor(this._size.w * t) - i : 0;
e.fillRect(s, 0, i, Math.ceil(this._size.h * t) + 1), e.restore()
}
_drawBackLabels(e, t) {
e.save();
const i = this.backLabels(),
s = this.rendererOptions(),
r = this._isLeft ? "right" : "left";
for (const n of i) n.isAxisLabelVisible() && (e.save(), n.renderer().draw(e, s, this
._widthCache, this._size.w, r, t), e.restore());
e.restore()
}
_hightlightBackground(e, t, i, s) {
if (!i) return;
const r = i.firstValue();
if (null === r) return;
let n = t[0].price,
o = t[0].price;
for (let e = 1; e < t.length; e++) n = Math.min(n, t[e].price), o = Math.max(o, t[e]
.price);
const l = this.priceScale(),
c = Math.floor(l.priceToCoordinate(n, r) * s),
h = Math.ceil(l.priceToCoordinate(o, r) * s);
Object(a.fillRect)(e, Math.floor(s), c, Math.ceil((this._size.w - 1) * s) + 1, h -
c, w.a)
}
_addViewsOrMaxMin(e, t) {
const i = this._pane.state(),
s = this.priceScale();
if (s !== i.defaultPriceScale() && (e = e.filter(e => i.isOverlay(e) || this
._isFromSameSide(e.priceScale()))), 0 !== e.length)
if (1 === e.length) {
const r = e[0].priceAxisViews(i, s);
r && r.length && t.push(r)
} else t.push(this._minMaxViews(e))
}
_minMaxViews(e) {
const t = this._pane.state(),
i = this.priceScale(),
s = [];
let r = 1 / 0,
n = -1 / 0,
o = null,
a = null;
for (const s of e) {
const e = s.priceAxisViews(t, i);
if (e && e.length)
for (let t = 0; t < e.length; t++) {
const i = e[t],
s = i.coordinate();
s >= n && (n = s, a = i), s <= r && (r = s, o = i)
}
}
return a && s.push(a), o && s.push(o), s
}
_isFromSameSide(e) {
return null !== e && (this._isLeft ? this._pane.state().leftPriceScales() : this
._pane.state().rightPriceScales()).includes(e)
}
_sameSideSources() {
const e = this._pane.state().sourcesByGroup();
return this._isLeft ? e.leftPriceScalesSources() : e.rightPriceScalesSources()
}
}
},
"y/Xm": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "StudyOverlayBase", (function() {
return I
}));
var s = i("Eyy1"),
r = i("qFKp"),
n = i("txPx"),
o = i("GVHu"),
a = i("XPit"),
l = i("n5al"),
c = i("tc+8"),
h = i.n(c),
u = i("5fI3"),
d = i("Kxc7"),
p = i("wOSo"),
_ = i("WkOR"),
m = i("BZtw"),
f = i("pPtI"),
g = i("k9/m"),
b = i("ogJP"),
v = i("Qb4w");
const S = r.CheckMobile.any() && !1,
y = d.enabled("uppercase_instrument_names"),
w = d.enabled("study_overlay_compare_legend_option"),
P = d.enabled("secondary_series_extend_time_scale"),
C = d.enabled("hide_unresolved_symbols_in_legend"),
x = Object(n.getLogger)("Chart.StudyOverlay");
function T(e, t) {
return null == e[t]
}
class I extends o.Study {
constructor(e, t, i, s) {
t.hasChild("currencyId") || t.addChild("currencyId", new h.a(null)), t.hasChild(
"unitId") || t.addChild("unitId", new h.a(null)), t.addExclusion(
"currencyId"), t.addExclusion("unitId"), super(e, t, i, s), this
._seriesSource = null, this.m_data = new g.PlotList(Object(a
.seriesPlotFunctionMap)(), T), this._quotesProvider = new p.a, S && this
._quotesProvider.quotesUpdate().subscribe(this, this._onQuotesUpdate);
const r = this.properties().childs();
r.currencyId.subscribe(this, this._onCurrencyChanged), r.unitId.subscribe(this,
this._onUnitChanged), r.allowExtendTimeScale.subscribe(this, this
._onAllowExtendTimeScaleChanged), this._onAllowExtendTimeScaleChanged(),
r.style.subscribe(this, this._updateBarFunction), r.lineStyle.childs()
.priceSource.subscribe(this, this._updateBarFunction), r.areaStyle.childs()
.priceSource.subscribe(this, this._updateBarFunction), r.baselineStyle
.childs().priceSource.subscribe(this, this._updateBarFunction), this
._updateBarFunction()
}
destroy() {
super.destroy()
}
setSymbolCurrencyUnit(e, t, i) {
this._setSymbolCurrencyUnitInternal(e, t, i)
}
symbol() {
return this.properties().childs().inputs.childs().symbol.value()
}
setSymbol(e) {
this.setSymbolCurrencyUnit(e)
}
symbolInfo() {
if (!this._resolvedSymbols) return null;
const e = this._properties.inputs.symbol.value();
if (!e) return null;
let t;
return t = this._resolvedSymbols[this._getSymbolForResolve(e)] || null, t
}
data() {
return null === this._seriesSource ? super.data() : this._seriesSource.data()
.bars()
}
symbolResolved() {
return this.symbolsResolved()
}
symbolSameAsCurrent(e) {
return Object(_.b)(e, this.symbol(), this.symbolInfo())
}
priceSource() {
switch (this._properties.style.value()) {
case 2:
return this._properties.lineStyle.priceSource.value();
case 3:
return this._properties.areaStyle.priceSource.value();
case 10:
return this._properties.baselineStyle.priceSource.value()
}
return null
}
barFunction() {
return this._barFunction
}
quotes() {
return this._quotesProvider.quotes()
}
currency() {
return this._properties.currencyId.value() || null
}
setCurrency(e) {
this.setSymbolCurrencyUnit(void 0, e)
}
isConvertedToOtherCurrency() {
return Object(l.isConvertedToOtherCurrency)(this.symbolInfo())
}
unit() {
return this._properties.unitId.value() || null
}
setUnit(e) {
this._properties.unitId.setValue(e)
}
isConvertedToOtherUnit() {
return Object(l.isConvertedToOtherUnit)(this.symbolInfo())
}
style() {
return this.properties().childs().style.value()
}
symbolSource() {
return this
}
state(e, t) {
const i = super.state(e, t);
return e && (Object(s.ensureDefined)(i.data).symbols = {
___snapshot: this.symbolInfo() || void 0
}), i
}
symbolTitle(e, t) {
return this.title(!0, {}, !1, e)
}
title(e, t, i, s) {
const r = this._titleInParts(e, t, i, s).join(", ");
return y ? r.toUpperCase() : r
}
titleInParts(e, t, i, s) {
const r = this._titleInParts(e, t, i, s).join(", ");
return [y ? r.toUpperCase() : r]
}
isStarted() {
return null === this._seriesSource ? super.isStarted() : this._seriesSource
.isStarted()
}
sourceId() {
return null === this._seriesSource ? super.sourceId() : Object(s.ensureNotNull)(
this._seriesSource.instanceId())
}
moveData(e) {
null === this._seriesSource ? super.moveData(e) : this._seriesSource.moveData(e)
}
firstValue() {
const e = this._model.timeScale().visibleBarsStrictRange();
if (null === e) return null;
const t = e.firstBar();
if (0 === this.data().size()) return this._ownFirstValue;
const i = this.data().search(t, g.PlotRowSearchMode.NearestRight, 1);
return this._ownFirstValue = null !== i ? this._barFunction(i.value) : null,
this._ownFirstValue
}
lastValueData(e, t, i) {
const s = {
noData: !0
},
r = this.priceScale();
if (this._model.timeScale().isEmpty() || null === r || r.isEmpty() || this
.data().isEmpty()) return s;
const n = this._model.timeScale().visibleBarsStrictRange();
if (null === n) return s;
const o = this.properties().childs();
if (!o.visible.value()) return s;
const a = this.nearestIndex(n.lastBar(), g.PlotRowSearchMode.NearestLeft, 1);
if (void 0 === a) return s;
const l = this.firstValue();
if (null === l) return s;
const c = this._lastNonEmptyPlotRow(4),
h = null !== c && n.contains(c.index),
u = null !== c ? c.value : null,
d = t || h ? u : this.data().valueAt(a);
if (null === d) return s;
const p = this._barFunction(d);
if (!Object(b.isNumber)(p)) return s;
const _ = r.priceToCoordinate(p, l);
let m;
switch (o.style.value()) {
case 0:
m = d[1] <= d[4] ? o.barStyle.childs().upColor.value() : o.barStyle
.childs().downColor.value();
break;
case 1:
case 9:
m = d[1] <= d[4] ? o.candleStyle.childs().upColor.value() : o
.candleStyle.childs().downColor.value();
break;
case 2:
m = o.lineStyle.childs().color.value();
break;
case 3:
m = o.areaStyle.childs().color1.value();
break;
case 10: {
const e = o.baselineStyle.childs();
m = _ < Math.round(r.height() * (Math.abs(100 - e.baseLevelPercentage
.value()) / 100)) ? e.topLineColor.value() : e.bottomLineColor
.value();
break
}
default:
throw new Error("Not supported overlay style")
}
const f = {
noData: !1,
text: r.formatPrice(p, l),
formattedPriceAbsolute: r.formatPriceAbsolute(p),
formattedPricePercentage: r.formatPricePercentage(p, l, !0),
floatCoordinate: _,
coordinate: _,
color: m
};
return i && (f.price = p), f
}
priceRange(e, t) {
if (!Object(b.isInteger)(e)) return x.logDebug(
"priceRange: incorrect startBar"), null;
if (!Object(b.isInteger)(t)) return x.logDebug("priceRange: incorrect endBar"),
null;
if (0 === this.data().size()) return null;
const i = this.priceSource();
let s;
s = null !== i ? this.data().minMaxOnRangeCached(e, t, [{
name: i,
offset: 0
}]) : this.data().minMaxOnRangeCached(e, t, [{
name: "low",
offset: 0
}, {
name: "high",
offset: 0
}]);
const r = null !== s ? new v.PriceRange(s.min, s.max) : null;
return this._postProcessPriceRange(r)
}
bars() {
return this.data()
}
open(e) {
return Object(s.ensureNotNull)(this.bars().valueAt(e))[1]
}
high(e) {
return Object(s.ensureNotNull)(this.bars().valueAt(e))[2]
}
low(e) {
return Object(s.ensureNotNull)(this.bars().valueAt(e))[3]
}
close(e) {
return Object(s.ensureNotNull)(this.bars().valueAt(e))[4]
}
hl2(e) {
return (this.high(e) + this.low(e)) / 2
}
hlc3(e) {
return (this.high(e) + this.low(e) + this.close(e)) / 3
}
ohlc4(e) {
return (this.open(e) + this.high(e) + this.low(e) + this.close(e)) / 4
}
_onCurrencyChanged() {
this.isStarted() && this._tryChangeInputs(), this._currencyChanged.fire()
}
_onUnitChanged() {
this.isStarted() && this._tryChangeInputs(), this._unitChanged.fire()
}
_getSymbolObject(e) {
const t = super._getSymbolObject(e),
i = this.currency();
null !== i && (t["currency-id"] = i);
const s = this.unit();
return null !== s && (t["unit-id"] = s), t
}
_getSymbolForApi(e) {
return Object(l.symbolForApi)(this._resolvedSymbolsByInput[e] || null, e)
}
_onSymbolResolved(e, t, i) {
super._onSymbolResolved(e, t, i), this._recreatePriceFormattingDependencies();
const s = t === this.symbol() ? Object(l.extractSymbolNameFromSymbolInfo)(i,
this.symbol()) : null,
r = Object(l.symbolCurrency)(i),
n = Object(l.symbolUnit)(i);
this._setSymbolCurrencyUnitInternal(s || void 0, r, n, i), this.model()
.realignLineTools(), S && this._setQuotesSymbol(this._getSymbolForApi(this
.symbol()))
}
_changeInputsImpl(e, t) {
super._changeInputsImpl(e, t), e.symbol !== t.symbol && this._model
.realignLineTools()
}
_setQuotesSymbol(e) {
const t = this.symbolInfo(),
i = Object(l.extractSymbolNameFromSymbolInfo)(t, e);
this._quotesProvider.setQuotesSessionSymbol(i)
}
_createStudyOnServer() {
null === this._seriesSource ? super._createStudyOnServer() : this
._modifyStudyOnServer(Object(s.ensureDefined)(this._inputs)), this._model
.realignLineTools()
}
_modifyStudyOnServer(e) {
null === this._seriesSource ? super._modifyStudyOnServer(e) : (this
._seriesSource.modifySeries(Object(u.decodeExtendedSymbol)(e.symbol),
Object(f.getServerInterval)(this._series.properties().interval
.value())), this._seriesSource.isStarted() || this._seriesSource
.start())
}
_stopStudyOnServer() {
null === this._seriesSource ? super._stopStudyOnServer() : this._seriesSource
.stop()
}
_titleInParts(e, t, i, s) {
const r = this.properties().childs().inputs.childs().symbol.value(),
n = this.symbolInfo();
let o;
if (n) {
if (o = n.name, w) {
const e = this._model.mainSeries().properties().statusViewStyle
.symbolTextSource.value();
"description" === e ? o = n.description : "ticker-and-description" ===
e && (o = `${n.name}, ${n.description}`)
}
if (!s && n.exchange && 0 !== n.exchange.length) return [o, [n.exchange]]
} else o = C ? "" : r;
return [o]
}
_onAllowExtendTimeScaleChanged() {
const e = this.isStarted();
if (e && this.stop(!0), P && this.properties().childs().allowExtendTimeScale
.value()) {
this._seriesSource = new m.a(this._model.chartApi(), "st_o_");
const e = this._seriesSource.dataEvents();
e.seriesError().subscribe(this, e => {
this._onStudyError(this._convertSeriesErrorToStudy(e))
}), e.loading().subscribe(this, this._onStudyLoading), e.completed()
.subscribe(this, (e, t) => {
this._onStudyCompleted(t)
}), e.dataUpdated().subscribe(this, () => {
this._studyModified = !1;
const e = this._model.paneForSource(this);
this._model.recalculatePane(e), this._updateSources(), this
.priceRangeReady() || this._enablePriceRangeReady()
})
} else {
if (null !== this._seriesSource) {
const e = this._seriesSource.dataEvents();
e.seriesError().unsubscribeAll(this), e.loading().unsubscribeAll(this),
e.completed().unsubscribeAll(this), e.dataUpdated().unsubscribeAll(
this), this._seriesSource.destroy()
}
this._seriesSource = null
}
e && this.start(!0)
}
_convertSeriesErrorToStudy(e) {
return {
error: e.error,
ctx: e.ctx,
solution_id: e.solution_id
}
}
_setSymbolCurrencyUnitInternal(e, t, i, s) {
const r = this.properties().childs(),
n = r.inputs.childs().symbol.value(),
o = r.currencyId.value(),
a = r.unitId.value();
if (void 0 !== e && e !== n && r.inputs.childs().symbol.setValueSilently(e),
void 0 !== t && t !== o && r.currencyId.setValueSilently(t), void 0 !== i &&
i !== a && r.unitId.setValueSilently(i), s) this._resolvedSymbolsByInput[
this.symbol()] = s, this._resolvedSymbols[this._getSymbolForResolve(this
.symbol())] = s;
else {
const e = this.symbolInfo();
null !== e && (r.currencyId.setValueSilently(Object(l.symbolCurrency)(e)), r
.unitId.setValueSilently(Object(l.symbolUnit)(e)))
}
r.inputs.childs().symbol.value() !== n && r.inputs.childs().symbol.listeners()
.fire(r.inputs.childs().symbol), r.currencyId.value() !== o && r.currencyId
.listeners().fire(r.currencyId), r.unitId.value() !== a && r.unitId
.listeners().fire(r.unitId)
}
_updateBarFunction() {
var e;
const t = null !== (e = this.priceSource()) && void 0 !== e ? e : "close";
this._barFunction = Object(a.barFunction)(t)
}
}
},
yMne: function(e, t, i) {
"use strict";
i.d(t, "b", (function() {
return r
})), i.d(t, "a", (function() {
return n
}));
var s = i("J2xC");
const r = parseInt(s["css-value-header-toolbar-height"]),
n = 3
},
yUly: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX"),
o = n.LineToolWidthsProperty,
a = n.LineToolColorsProperty;
class l extends s {
constructor(e, t) {
super(e, t || l.createProperties()), this.version = l.version, i.e("lt-pane-views")
.then(i.t.bind(null, "SvjA", 7)).then(({
TrendBasedFibTimePaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
levelsCount() {
return l.LevelsCount
}
pointsCount() {
return 3
}
name() {
return "Trend-Based Fib Time"
}
migrateVersion(e, t, i) {}
processErase(e, t) {
var i = "level" + t,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "u52p")))
.TrendBasedFibTimeDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetooltrendbasedfibtime", e, !1, {
range: [1, 11]
});
return l._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e);
for (var t = [e.child("trendline").child("linewidth")], i = [e.child("trendline")
.child("color")
], r = 1; r <= l.LevelsCount; r++) t.push(e.child("level" + r).child(
"linewidth")), i.push(e.child("level" + r).child("color"));
e.addChild("linesColors", new a(i)), e.addChild("linesWidths", new o(t))
}
}
l.LevelsCount = 11, l.version = 1, t.LineToolTrendBasedFibTime = l
},
yfAl: function(e, t, i) {
"use strict";
i.r(t);
var s = i("aO4+"),
r = i("Eyy1"),
n = i("txPx"),
o = i("aIyQ"),
a = i.n(o),
l = i("e3/o"),
c = i("GxN8"),
h = i("7ktv"),
u = i("MWAT"),
d = i("CW80"),
p = i("s1Gx");
const _ = new Map([
["trading", e => Object(d.isTrading)(e)],
["drawing", e => Object(d.isLineTool)(e) && !Object(d.isTrading)(e) && !e
.isPhantom()
],
["drawingsForAllSymbols", e => Object(d.isLineTool)(e) && !Object(d.isTrading)(e) &&
!e.isPhantom()
],
["phantom", e => Object(d.isLineTool)(e) && e.isPhantom()],
["restRowSources", e => !Object(d.isLineTool)(e) && !Object(d.isTrading)(e)],
["leftPriceScale", (e, t) => "left" === f(e, t)],
["rightPriceScale", (e, t) => "right" === f(e, t)],
["overlayPriceScale", (e, t) => "overlay" === f(e, t)]
]),
m = new Map([
["trading", "visibleSorted"],
["drawing", "visibleSorted"],
["drawingsForAllSymbols", "allSorted"],
["phantom", "visibleSorted"],
["restRowSources", "visibleSorted"],
["leftPriceScale", "visibleSorted"],
["rightPriceScale", "visibleSorted"],
["overlayPriceScale", "visibleSorted"]
]);
function f(e, t) {
const i = e.priceScale();
return null === i ? "overlay" : t.priceScalePosition(i)
}
class g {
constructor(e) {
this._groupedSources = new Map, this._sources = null, this._pane = e
}
clear() {
this._groupedSources.clear(), this._sources = null
}
destroy() {
this.clear()
}
all() {
return this._groupedSources.has("visibleSorted") || this._sortSources(), Object(r
.ensureDefined)(this._groupedSources.get("visibleSorted"))
}
allIncludingHidden() {
return this._groupedSources.has("allSorted") || this._sortSources(), Object(r
.ensureDefined)(this._groupedSources.get("allSorted"))
}
allExceptSpecialSources() {
if (!this._groupedSources.has("exceptSpecial")) {
const e = this.allIncludingHidden().filter(e => !e.isSpeciallyZOrderedSource());
this._groupedSources.set("exceptSpecial", e)
}
return Object(r.ensureDefined)(this._groupedSources.get("exceptSpecial"))
}
tradingSources() {
return this._getSourcesByGroupType("trading")
}
lineSources() {
return this._getSourcesByGroupType("drawing")
}
lineSourcesForAllSymbols() {
return this._getSourcesByGroupType("drawingsForAllSymbols")
}
phantomSources() {
return this._getSourcesByGroupType("phantom")
}
allExceptLineAndTradingSources() {
return this._getSourcesByGroupType("restRowSources")
}
hitTestSources() {
if (!this._groupedSources.has("hitTest")) {
const e = this.allExceptLineAndTradingSources().concat(this.lineSources());
this._groupedSources.set("hitTest", e)
}
return Object(r.ensureDefined)(this._groupedSources.get("hitTest"))
}
generalSources() {
if (!this._groupedSources.has("general")) {
const e = this.allExceptLineAndTradingSources().concat(this.lineSources());
this._groupedSources.set("general", Object(p.sortSources)(e))
}
return Object(r.ensureDefined)(this._groupedSources.get("general"))
}
leftPriceScalesSources() {
return this._getSourcesByGroupType("leftPriceScale")
}
rightPriceScalesSources() {
return this._getSourcesByGroupType("rightPriceScale")
}
overlayPriceScaleSources() {
return this._getSourcesByGroupType("overlayPriceScale")
}
_getSourcesByGroupType(e) {
const t = Object(r.ensureDefined)(m.get(e));
return this._groupedSources.has(t) ? this._groupedSources.has(e) || this
._groupSources(e) : (this._sortSources(), this._groupSources(e)), Object(r
.ensureDefined)(this._groupedSources.get(e))
}
_sortSources() {
null === this._sources && (this._sources = this._pane.dataSources());
const e = Object(p.sortSources)(this._sources),
t = e.filter(e => !Object(d.isLineTool)(e) || e.isActualSymbol() && e
.isActualCurrency() && e.isActualUnit());
this._groupedSources.set("allSorted", e), this._groupedSources.set("visibleSorted",
t)
}
_groupSources(e) {
const t = Object(r.ensureDefined)(m.get(e)),
i = _.get(e);
if (void 0 !== i) {
const s = Object(r.ensureDefined)(this._groupedSources.get(t)).filter(e => i(e,
this._pane));
this._groupedSources.set(e, s)
}
}
}
var b = i("1Wlv"),
v = i("FaJS"),
S = i("Qb4w"),
y = i("3ClC"),
w = i("/tGj"),
P = i("2jby");
i.d(t, "PaneBase", (function() {
return T
}));
const C = Object(n.getLogger)("Chart.Pane");
function x(e, t, i) {
e.setMargins({
top: t,
bottom: i
})
}
class T {
constructor(e, t, i, s) {
this.m_dataSources = [], this._sourceWatchedValuesSubscriptions = new Map, this
.m_mainDataSource = null, this._cachedOrderedSources = new g(this), this
._sourcesById = new Map, this._dataSourcesCollectionChanged = new a.a, this
._dataSourceSymbolResolved = new a.a, this._sourcePropertiesChanged = new a.a,
this._sourcesZOrderChanged = new a.a, this._tagsChanged = new a.a, this
._stretchFactor = 1e3, this._isInInsertManyDataSourcesState = !1, this
._lastLineDataSourceZOrder = null, this._rightPriceScales = [], this
._leftPriceScales = [], this._lockedPriceScale = null, this
._currentPriceScaleRatio = null, this._onPriceScalesChanged = new a.a, this
._isRecalculatingScales = !1, this._priceDataSources = [], this
._bulkActionsActive = 0, this
._reorderZOrderOnAddingSourceToCollectionAllowed = !0, this
._priceScaleSelectionStrategy = Object(u.createPriceScaleSelectionStrategy)(i
.properties().priceScaleSelectionStrategyName.value()), this._id = null !=
s ? s : Object(l.randomHashN)(6)
}
id() {
return this._id
}
bulkActionMacro(e) {
this._bulkActionsActive += 1, e(), this._bulkActionsActive -= 1, 0 === this
._bulkActionsActive && this._dataSourcesCollectionChanged.fire()
}
sourcesByGroup() {
return this._cachedOrderedSources
}
dataSourceForId(e) {
return this._sourcesById.get(e) || null
}
changeSourceId(e, t) {
Object(r.assert)(this.hasDataSource(e)), this._sourcesById.delete(e.id()), e.setId(
t), this._sourcesById.set(t, e)
}
movePriceScale(e, t, i) {
const s = this.priceScalePosition(e);
if (s !== t) this.removePriceScale(e), this._placePriceScale(e, t, i), e
.invalidateMargins(), this._invalidateSourcesCache();
else if (void 0 !== i && "overlay" !== s) {
const t = "left" === s ? this._leftPriceScales : this._rightPriceScales,
r = t.indexOf(e);
t.splice(r, 1), t.splice(i, 0, e)
}
}
isEmpty() {
return null === this.m_mainDataSource
}
recalculatePriceScale(e) {
if (!e) return;
const t = e.sourcesForAutoscale();
if ((e.isAutoScale() || e.priceRangeShouldBeRecalculatedOnce()) && t && t.length >
0 && !this.timeScale().isEmpty()) {
const t = this.timeScale().visibleBarsStrictRange();
e.recalculatePriceRange(t)
}
e.updateAllViews()
}
onSourceTagsChanged() {
this._tagsChanged.fire()
}
insertDataSource(e, t, i) {
e.setZorder(i), t || (t = this.findSuitableScale(e)), this._addSourceToCollections(
e);
let s = !1;
(e === this.model().mainSeries() || null === this.m_mainDataSource) && (this
.m_mainDataSource = e, s = !0), t.addDataSource(e, this
._isInInsertManyDataSourcesState), e.setPriceScale(t), t
.invalidateMargins(), e.onTagsChanged && e.onTagsChanged().subscribe(this, this
.onSourceTagsChanged),
s && this._processMainSourceChange(), this._tagsChanged.fire(), e instanceof h
.PriceDataSource && this.recalculatePriceScale(t), this
._invalidateSourcesCache()
}
addDataSource(e, t, i) {
let s = e.zorder();
i || (Object(d.isLineTool)(e) && !e.isSpeciallyZOrderedSource() ? (s = null !== this
._lastLineDataSourceZOrder ? this._lastLineDataSourceZOrder + 1 : this
.newLineToolZOrder(), this._isInInsertManyDataSourcesState && (this
._lastLineDataSourceZOrder = s)) : Object(y.isStudy)(e) && !e
.isSpeciallyZOrderedSource() && (s = this.newStudyZOrder())), this
.insertDataSource(e, t, s)
}
removeDataSource(e, t, i) {
const s = this.m_dataSources.indexOf(e);
if (-1 === s) return void C.logDebug("removeDataSource: invalid data source");
this._removeSourceFromCollections(s, !!i), e !== this.m_mainDataSource || t || (this
.m_mainDataSource = null);
const r = e.priceScale();
this.removeSourceFromPriceScale(e), e.onTagsChanged && e.onTagsChanged()
.unsubscribe(this, this.onSourceTagsChanged), e instanceof h.PriceDataSource &&
!t && this._processMainSourceChange(), this._tagsChanged.fire(), r &&
e instanceof h.PriceDataSource && this.recalculatePriceScale(r), this
._invalidateSourcesCache()
}
hasDataSource(e) {
return this._sourcesById.has(e.id())
}
dataSources() {
return this.m_dataSources
}
priceDataSources() {
return this._priceDataSources
}
replaceSource(e, t, i) {
const s = this.m_mainDataSource === e,
r = e.zorder();
this.insertDataSource(t, i, r), this.removeDataSource(e, s), this._sourcesById.set(t
.id(), t), s && (this.m_mainDataSource = t, this._processMainSourceChange())
}
isOverlay(e) {
const t = e.priceScale();
return null === t || "overlay" === this.priceScalePosition(t)
}
updateAllViews() {
for (const e of this.m_dataSources) e.updateAllViews();
for (const e of this.model().customSources()) e.updateViewsForPane(this)
}
priceScalePosition(e) {
return this._leftPriceScales.includes(e) ? "left" : this._rightPriceScales.includes(
e) ? "right" : "overlay"
}
createPriceScaleAtPosition(e, t) {
const i = this.properties().childs().axisProperties.state();
i.autoScale = !0;
const s = new b.PriceScale(this.model().properties().scalesProperties, i);
return s.setHeight(this.height()), x(s, this._defaultTopMargin(), this
._defaultBottomMargin()), this._placePriceScale(s, e, t), s
}
removePriceScale(e) {
e.modeChanged().unsubscribeAll(this), e.priceRangeChanged().unsubscribeAll(this), e
.internalHeightChanged().unsubscribeAll(this), e === this._lockedPriceScale && (
this._lockedPriceScale = null, this._currentPriceScaleRatio = null);
const t = this._leftPriceScales.indexOf(e); - 1 !== t && (this._leftPriceScales[t]
.invalidateMargins(), this._leftPriceScales.splice(t, 1));
const i = this._rightPriceScales.indexOf(e);
if (-1 !== i && (this._rightPriceScales[i].invalidateMargins(), this
._rightPriceScales.splice(i, 1)), null === e.mainSource()) {
const t = e.dataSources().length;
0 !== t && C.logError(
"Invalid priceScale state: empty mainSource but non-empty data sources=" +
t)
}
this._onPriceScalesChanged.fire()
}
move(e, t, i) {
const s = e.priceScale();
this.removeSourceFromPriceScale(e), t.addDataSource(e), e.setPriceScale(t), t
.invalidateMargins(), this._processMainSourceChange(), this
._invalidateSourcesCache(), e.isIncludedInAutoScale() && (null !== s && this
.recalculatePriceScale(s),
this.recalculatePriceScale(t)), this._onPriceScalesChanged.fire()
}
setZOrders(e) {
e.forEach((e, t) => {
t.setZorder(e)
}), this._invalidateSourcesCache(), 0 === this._bulkActionsActive && this
._dataSourcesCollectionChanged.fire(), this.model().lightUpdate()
}
isMainPane() {
const e = this.model().mainSeries();
for (const t of this.m_dataSources)
if (t === e) return !0;
return !1
}
isLast() {
const e = this.model().panes();
return e[e.length - 1] === this
}
newStudyZOrder() {
return Object(P.newStudyZOrder)(this._priceDataSources)
}
newLineToolZOrder(e) {
return Object(P.newLineToolZOrder)(this.m_dataSources, e)
}
containsMainSeries() {
return this._sourcesById.has(this.model().mainSeries().id())
}
applyPriceScaleRatio(e, t) {
var i;
null !== this._lockedPriceScale && this._lockedPriceScale !== e || this
._currentPriceScaleRatio === t || !this.isMainPane() || null === this
._lockedPriceScale && e !== (null === (i = this.mainDataSource()) || void 0 ===
i ? void 0 : i.priceScale()) || (this._setNewPriceRangeByScaleRatio(e, t,
this._mainSourceVisiblePriceRange(e), !0, !0), null !== this
._lockedPriceScale ? this._tryToApplyNewPriceScaleRatio() : e.isLog() ||
this.model().mainSeriesScaleRatioPropertyOnChanged())
}
sendToBack(e) {
const t = this.sourcesByGroup().allExceptSpecialSources();
this._batchReorder(e, t[0], P.moveBeforeSource)
}
bringToFront(e) {
const t = this.sourcesByGroup().allExceptSpecialSources();
this._batchReorder(e, t[t.length - 1], P.moveAfterSource)
}
sendBackward(e) {
const t = this.sourcesByGroup().allIncludingHidden(),
i = t.indexOf(e[0]);
if (0 === i) this.bringToFront(e);
else {
const s = t[i - 1];
this.insertBefore(e, s)
}
}
bringForward(e) {
const t = this.sourcesByGroup().allExceptSpecialSources(),
i = t.indexOf(e[e.length - 1]);
if (i === t.length - 1) this.sendToBack(e);
else {
const s = t[i + 1];
this.insertAfter(e, s)
}
}
insertAfter(e, t) {
this._batchReorder(e, t, P.moveAfterSource)
}
insertBefore(e, t) {
this._batchReorder(e, t, P.moveBeforeSource)
}
priceScaleSelectionStrategy() {
return this._priceScaleSelectionStrategy
}
findTargetPriceAxisViews(e, t, i, s) {
if (Object(c.a)(e) && this.model().paneForSource(e) !== this) return [];
const r = e.priceScale();
if (t === r) return i;
if (null === r) return [];
if ("overlay" === this.priceScalePosition(r)) return t === this
.defaultPriceScale() ? i : [];
const n = this.priceScalePosition(t);
if (n !== this.priceScalePosition(r)) return [];
const o = "left" === n ? this.leftPriceScales() : this.rightPriceScales();
return o.indexOf(t) < o.indexOf(r) ? s : []
}
onPriceScalesChanged() {
return this._onPriceScalesChanged
}
setPaneSize(e) {
let t;
switch (e) {
case "large":
t = 1;
break;
case "medium":
t = .6;
break;
case "small":
t = .3;
break;
case "tiny":
t = .15;
break;
default:
throw new Error("Unknown size enum value: " + e)
}
this._stretchFactor = 1e3 * t
}
stretchFactor() {
return this._stretchFactor
}
setStretchFactor(e) {
this._stretchFactor = e
}
customSources(e) {
return this.model().customSources(e)
}
onTagsChanged() {
return this._tagsChanged
}
dataSourcesCollectionChanged() {
return this._dataSourcesCollectionChanged
}
symbolSourceResolved() {
return this._dataSourceSymbolResolved
}
sourcePropertiesChanged() {
return this._sourcePropertiesChanged
}
sourceZOrderChanged() {
return this._sourcesZOrderChanged
}
lineToolsForArea(e) {
const t = this.height(),
i = this.width(),
s = this.logicalRectToPixels(e);
return [...this.m_dataSources, ...this.model().multiPaneSources(this)].filter(d
.isLineTool).filter(e => (e.paneViews(this) || []).some(e => {
const r = e.renderer(t, i);
return r && r.doesIntersectWithBox && r.doesIntersectWithBox(s)
}))
}
logicalRectToPixels(e) {
const t = this.defaultPriceScale(),
i = this.timeScale(),
n = Object(r.ensureNotNull)(Object(r.ensureNotNull)(t.mainSource())
.firstValue()),
o = t.priceToCoordinate(e.p1.price, n),
a = i.indexToCoordinate(e.p1.index),
l = t.priceToCoordinate(e.p2.price, n),
c = i.indexToCoordinate(e.p2.index),
h = new s.Point(Math.min(a, c), Math.min(o, l)),
u = new s.Point(Math.max(a, c), Math.max(o, l));
return Object(s.box)(h, u)
}
clipboardLineToolOwnerSource(e) {
const t = this.dataSourceForId(e);
if (null !== t) {
const e = t.ownerSource();
if (null !== e && null !== e.firstValue()) return e
}
const i = this.mainDataSource();
if (null !== i && null !== i.firstValue()) return i;
for (const e of this.dataSources())
if (e instanceof h.PriceDataSource && null !== e.firstValue()) return e;
return null
}
realignLineTools() {
let e = !1;
for (const t of this.m_dataSources) Object(d.isLineTool)(t) && (t
.calcIsActualSymbol(), t.updateAllViews(), e = !0);
return this._invalidateSourcesCache(), e
}
startScalePrice(e, t) {
e.startScale(t)
}
scalePriceTo(e, t) {
e.scaleTo(t), this.updateAllViews()
}
endScalePrice(e) {
e.endScale()
}
resetPriceScale(e) {
const t = this.timeScale().visibleBarsStrictRange();
e.isLockScale() || e.setMode({
autoScale: !0
}), e.recalculatePriceRange(t), this.updateAllViews()
}
restorePriceScaleState(e, t) {
e.restoreState(t), this.updateAllViews()
}
beginInsertManyLineDataSources() {
this._isInInsertManyDataSourcesState = !0, this._lastLineDataSourceZOrder = null
}
endInsertManyLineDataSources() {
this._isInInsertManyDataSourcesState = !1, this._lastLineDataSourceZOrder = null
}
removeSourceFromPriceScale(e) {
const t = e.priceScale();
if (null !== t) {
const i = t.dataSources();
i.indexOf(e) >= 0 && t.removeDataSource(e), 0 === i.length && this
.removePriceScale(t)
}
}
_addSourceToCollections(e, t) {
this.m_dataSources.push(e), this._sourcesById.set(e.id(), e), this
._invalidateSourcesCache(), t || 0 !== this._bulkActionsActive || this
._dataSourcesCollectionChanged.fire();
const i = () => {
this._sourcePropertiesChanged.fire(e)
};
e.properties().subscribe(this, i), e.zOrderChanged().subscribe(this, t => this
._sourcesZOrderChanged.fire(e, t)), Object(d.isLineTool)(e) && (e
.normalizedPointsChanged().subscribe(this, i), e.fixedPointsChanged()
.subscribe(this, i), e.hasAlert.subscribe(i), e.linkKey().subscribe(i), this
._sourceWatchedValuesSubscriptions.set(e.id(), i)), e instanceof h
.PriceDataSource && (e.currencyChanged().subscribe(this, () => this
._invalidateSourcesCache()), e.unitChanged().subscribe(this, () => this
._invalidateSourcesCache()), this._priceDataSources.push(e), Object(w
.isSymbolSource)(e) && e.symbolResolved().subscribe(this, () => this
._dataSourceSymbolResolved.fire(e))), e.isMultiPaneAvailable() && this
.model().addMultiPaneSource(e),
!e.isSpeciallyZOrderedSource() && this
._reorderZOrderOnAddingSourceToCollectionAllowed && (Object(d.isLineTool)(e) &&
Object(P.isReorderRequired)(null, e.zorder()) || Object(y.isStudy)(e) &&
Object(P.isReorderRequired)(e.zorder(), null)) && (this
._reorderZOrderOnAddingSourceToCollectionAllowed = Object(P
.reorderDataSourcesZOrder)(this.m_dataSources))
}
_removeSourceFromCollections(e, t) {
const i = this.m_dataSources[e];
i.properties().unsubscribeAll(this), i.zOrderChanged().unsubscribeAll(this), this
.m_dataSources.splice(e, 1), this._sourcesById.delete(i.id());
const s = i.id();
if (Object(d.isLineTool)(i) && (i.normalizedPointsChanged().unsubscribeAll(this), i
.fixedPointsChanged().unsubscribeAll(this), this
._sourceWatchedValuesSubscriptions.has(s))) {
const e = this._sourceWatchedValuesSubscriptions.get(s);
i.hasAlert.unsubscribe(e), i.linkKey().unsubscribe(e)
}
if (this._invalidateSourcesCache(), i instanceof h.PriceDataSource) {
i.currencyChanged().unsubscribeAll(this), i.unitChanged().unsubscribeAll(this);
const e = this._priceDataSources.indexOf(i);
Object(r.assert)(-1 !== e), this._priceDataSources.splice(e, 1), Object(w
.isSymbolSource)(i) && i.symbolResolved().unsubscribeAll(this)
}
t || 0 !== this._bulkActionsActive || this._dataSourcesCollectionChanged.fire(), i
.isMultiPaneAvailable() && this.model().removeMultiPaneSource(i), this
._reorderZOrderOnAddingSourceToCollectionAllowed = !0
}
_recalculatePriceScaleByScaleRatio(e) {
this.isMainPane() && e === this._lockedPriceScale && (null !== this
._currentPriceScaleRatio ? this._applyOldScaleRatioToPriceScale() : this
._tryToApplyNewPriceScaleRatio())
}
_defaultBottomMargin() {
return .01 * this.properties().childs().bottomMargin.value()
}
_defaultTopMargin() {
return .01 * this.properties().childs().topMargin.value()
}
_updateMargins() {
const e = this._defaultTopMargin(),
t = this._defaultBottomMargin();
for (const i of this._leftPriceScales) x(i, e, t);
for (const i of this._rightPriceScales) x(i, e, t);
for (const i of this.m_dataSources)
if (this.isOverlay(i)) {
const s = i.priceScale();
null !== s && (x(s, e, t), this.recalculatePriceScale(s))
} for (const e of this._leftPriceScales) this.recalculatePriceScale(e);
for (const e of this._rightPriceScales) this.recalculatePriceScale(e);
this.updateAllViews()
}
_batchReorder(e, t, i) {
i(this.sourcesByGroup().allExceptSpecialSources(), e, t), this
._invalidateSourcesCache(), this._dataSourcesCollectionChanged.fire(), this
.model().fullUpdate()
}
_placePriceScale(e, t, i) {
if ("overlay" === t) return void e.invalidateMargins();
const s = "left" === t ? this._leftPriceScales : this._rightPriceScales,
n = void 0 === i ? s.length : i;
s.splice(n, 0, e), e.modeChanged().subscribe(this, this._onPriceScaleModeChanged
.bind(this, e)), e.internalHeightChanged().subscribe(this, this
._recalculatePriceScaleByScaleRatio.bind(this, e)), e.priceRangeChanged()
.subscribe(this, this._recalculateTimeScaleByScaleRatio.bind(this, e)), e
.priceRangeChanged().subscribe(this, this._onPriceScaleSetMinMaxPriceRange.bind(
this, e)), e.isLockScale() && (Object(r.assert)(null === this
._lockedPriceScale), this._lockedPriceScale = e, this
._currentPriceScaleRatio = null), e.invalidateMargins(), this
._onPriceScalesChanged.fire()
}
_onPriceScaleModeChanged(e, t, i) {
if (i.lockScale && (this._lockedPriceScale !== e && null !== this
._lockedPriceScale && this._lockedPriceScale.setMode({
lockScale: !1
}), this._lockedPriceScale = e, this._currentPriceScaleRatio = Object(v
.scaleRatio)(this.timeScale(), e)), t.lockScale && !i.lockScale && (this
._lockedPriceScale = null, this._currentPriceScaleRatio = null), t
.percentage === i.percentage && t.indexedTo100 === i.indexedTo100) return;
const s = this.timeScale().visibleBarsStrictRange();
null !== s && (e.recalculatePriceRange(s), e.updateAllViews())
}
_applyOldScaleRatioToPriceScale() {
this._isRecalculatingScales || null === this._currentPriceScaleRatio || null ===
this._lockedPriceScale || (this._isRecalculatingScales = !0, this
._setNewPriceRangeByScaleRatio(this._lockedPriceScale, this
._currentPriceScaleRatio, this._mainSourceVisiblePriceRange(this
._lockedPriceScale)), this._isRecalculatingScales = !1)
}
_setNewPriceRangeByScaleRatio(e, t, i, s, r) {
const n = Object(v.priceRangeByScaleRatio)(e, this.timeScale().barSpacing(), t);
e.setPriceRange(null !== n ? n : i, s, r)
}
_applyOldScaleRatioToTimeScale() {
this._isRecalculatingScales || null === this._currentPriceScaleRatio || (this
._isRecalculatingScales = !0, this._setNewBarSpacingByScaleRatio(), this
._isRecalculatingScales = !1)
}
_tryToApplyNewPriceScaleRatio() {
const e = Object(r.ensureNotNull)(this._lockedPriceScale),
t = Object(v.scaleRatio)(this.timeScale(), e);
this._currentPriceScaleRatio === t || e.isLog() || (this._currentPriceScaleRatio =
t, this.model().mainSeriesScaleRatioPropertyOnChanged())
}
_recalculateTimeScaleByScaleRatio(e) {
e === this._lockedPriceScale && (null !== this._currentPriceScaleRatio ? this
._applyOldScaleRatioToTimeScale() : this._tryToApplyNewPriceScaleRatio())
}
_setNewBarSpacingByScaleRatio() {
const e = this.timeScale().getValidBarSpacing(Object(v.barSpacingByScaleRatio)(
Object(r.ensureNotNull)(this._lockedPriceScale), this
._currentPriceScaleRatio));
this.timeScale().isValidBarSpacing(e) && this.timeScale().setBarSpacing(e)
}
_mainSourceVisiblePriceRange(e) {
const t = this.timeScale().visibleBarsStrictRange();
return null !== t ? Object(r.ensureNotNull)(Object(r.ensureNotNull)(e.mainSource())
.priceRange(t.firstBar(), t.lastBar())) : new S.PriceRange(-.5, .5)
}
_setMinMaxPriceRange() {
const e = Object(r.ensureNotNull)(this._lockedPriceScale),
t = Object(v.priceRangeByScaleRatio)(e, this.timeScale().maxBarSpacing(), this
._currentPriceScaleRatio),
i = Object(v.priceRangeByScaleRatio)(e, this.timeScale().minBarSpacing(), this
._currentPriceScaleRatio);
null !== t && e.setMaxPriceRange(t), null !== i && e.setMinPriceRange(i)
}
_onPriceScaleSetMinMaxPriceRange(e) {
e === this._lockedPriceScale && this._setMinMaxPriceRange()
}
}
},
yi8X: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "LineToolInfoLine", (function() {
return n
}));
var s = i("Ocx9"),
r = i("WPQD");
class n extends r.LineToolTrendLine {
constructor(e, t) {
super(e, t || n.createProperties())
}
pointsCount() {
return 2
}
name() {
return "Info Line"
}
static createProperties(e) {
const t = new s.DefaultProperty("linetoolinfoline", e);
return n._configureProperties(t), t
}
static _configureProperties(e) {
r.LineToolTrendLine._configureProperties(e)
}
}
},
"z+Sa": function(e, t, i) {
"use strict";
i.r(t),
i.d(t, "SeriesHorizontalBaseLinePaneView", (function() {
return r
}));
var s = i("k4w6");
class r extends s.a {
constructor(e) {
super(e)
}
_updateImpl() {
this._lineRendererData.visible = !1;
const e = this._series.priceScale().mode();
if (!e.percentage && !e.indexedTo100) return;
const t = this._series.firstValue();
null !== t && (this._lineRendererData.visible = !0, this._lineRendererData.y =
this._series.priceScale().priceToCoordinate(t, t), this
._lineRendererData.color = this._series.properties().baseLineColor
.value())
}
}
},
"z+cS": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "VerticalLineRenderer", (function() {
return a
}));
var s = i("VdBB"),
r = i("jFln"),
n = i("gAom"),
o = i("Zp/P");
class a {
constructor() {
this._data = null, this._hitTest = null
}
setData(e) {
this._data = e
}
setHitTest(e) {
this._hitTest = e
}
hitTest(e) {
if (null === this._data) return null;
const t = Object(o.interactionTolerance)().line,
i = this._hitTest || new s.HitTestResult(s.HitTestResult.MOVEPOINT),
r = Math.abs(e.x - this._data.x) <= t + this._data.linewidth / 2,
n = void 0 === this._data.top || this._data.top - e.y <= t,
a = void 0 === this._data.bottom || e.y - this._data.bottom <= t;
return r && n && a ? i : null
}
draw(e, t) {
if (null === this._data) return;
if (this._data.linewidth <= 0) return;
if (this._data.x < -this._data.linewidth / 2 || this._data.x > t.cssWidth + this
._data.linewidth / 2) return;
const i = t.pixelRatio;
e.lineCap = "butt", e.strokeStyle = this._data.color, e.lineWidth = Math.max(1, Math
.floor(this._data.linewidth * i)), void 0 !== this._data.linestyle &&
Object(r.setLineStyle)(e, this._data.linestyle);
const s = void 0 !== this._data.top ? Math.max(this._data.top, 0) : 0,
o = void 0 !== this._data.bottom ? Math.min(this._data.bottom, t.cssHeight) : t
.cssHeight,
a = Math.round(this._data.x * i),
l = Math.floor(s * i),
c = Math.ceil(o * i);
Object(n.drawVerticalLine)(e, a, l, c)
}
}
},
"z61+": function(e, t, i) {
"use strict";
var s = i("Eyy1"),
r = i("0YCj"),
n = i.n(r),
o = i("23IT"),
a = i("ogJP"),
l = i("txPx");
const c = ["first_visible_bar_time", "last_visible_bar_time"];
function h(e) {
return !e.groupId && !e.isHidden && !c.includes(e.id)
}
var u = i("Ecpn");
i.d(t, "a", (function() {
return p
}));
const d = Object(l.getLogger)("Platform.GUI.PropertyDialog.Indicators.MetaInfo");
class p {
constructor(e) {
this._metaInfo = e
}
hasUserEditableInputs() {
return this._metaInfo.inputs.some(h)
}
getUserEditableInputs() {
return this._metaInfo.inputs.filter(h)
}
hasUserEditableProperties() {
return n.a.isScriptStrategy(this._metaInfo)
}
hasUserEditableStyles() {
const e = this._metaInfo;
return e.plots.length > 0 || void 0 !== e.bands || void 0 !== e.filledAreas ||
Object(u.a)(e.shortId) || n.a.isScriptStrategy(this._metaInfo) || Object.values(
e.graphics).some(e => void 0 !== e)
}
getUserEditablePlots() {
const e = new Set,
t = this._metaInfo;
return t.plots.filter(i => {
if (Object(o.isColorerPlot)(i) || Object(o.isTextColorerPlot)(i) ||
Object(o.isDataOffsetPlot)(i) || Object(o.isOhlcColorerPlot)(i) ||
Object(o.isAlertConditionPlot)(i)) return !1;
if (Object(o.isOhlcPlot)(i)) {
const r = i.target;
if (e.has(r)) return !1;
e.add(r);
const n = Object(s.ensureDefined)(t.ohlcPlots);
return !Object(s.ensureDefined)(n[r]).isHidden
} {
const e = t.styles ? t.styles[i.id] : void 0;
return void 0 === e || !e.isHidden
}
})
}
hasUserEditableOptions() {
return this.hasUserEditableInputs() || this.hasUserEditableProperties() || this
.hasUserEditableStyles()
}
getStrategyProperties() {
const e = this._metaInfo,
t = e.inputs.filter(m),
i = {
..._
};
for (const s of t) {
const t = s.internalID;
i[t] = s, _.hasOwnProperty(t) || d.logWarn(
`Unknown strategy input internal id ${t} in ${e.fullId}`)
}
return Object(a.clone)(i)
}
}
const _ = {
currency: void 0,
backtest_fill_limits_assumption: void 0,
calc_on_every_tick: void 0,
calc_on_order_fills: void 0,
commission_value: void 0,
commission_type: void 0,
initial_capital: void 0,
pyramiding: void 0,
slippage: void 0,
default_qty_type: void 0,
default_qty_value: void 0,
margin_long: void 0,
margin_short: void 0
};
function m(e) {
return "strategy_props" === e.groupId
}
},
"z8/4": function(e, t, i) {
"use strict";
i.r(t), i.d(t, "OverlayLegendView", (function() {
return n
}));
var s = i("JjUe"),
r = i("qXYw");
class n extends s.OverlayDataWindowView {
constructor(e, t) {
super(e, t), this._additional = null, this._showBarChange = t.properties()
.paneProperties.legendProperties.showBarChange, this._showSeriesOHLC = t
.properties().paneProperties.legendProperties.showSeriesOHLC, this
._studyOverlay = e, this._showBarChange.subscribe(this, this.update), this
._showSeriesOHLC.subscribe(this, this.update)
}
isValuesVisible() {
return this._showSeriesOHLC.value() || this._showBarChange.value()
}
additional() {
return this._additional
}
destroy() {
this._showBarChange.unsubscribeAll(this), this._showSeriesOHLC.unsubscribeAll(
this)
}
_updateImpl() {
super._updateImpl()
}
_createValuesProvider(e, t) {
return new r.OverlayLegendValuesProvider(e, t)
}
}
},
zDbI: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "CHART_FONT_FAMILY", (function() {
return r
}));
var s = i("mNbo");
const r = Object(s.isOnMobileAppPage)("old") ? "system-ui, -apple-system" :
"'Trebuchet MS', Roboto, Ubuntu, sans-serif"
},
zL3Q: function(e, t, i) {
"use strict";
i.d(t, "a", (function() {
return _
})), i.d(t, "b", (function() {
return m
}));
var s = i("hY0g"),
r = i.n(s),
n = i("4o++"),
o = i("mMWL"),
a = i("CW80"),
l = i("m/3z");
const c = new r.a(!1),
h = new r.a(n.MagnetMode.WeakMagnet),
u = Object(l.c)(),
d = Object(l.d)();
function p() {
const e = u.value();
if (d.value() && (o.isToolEditingNow.value() || o.isToolCreatingNow.value())) return void c
.setValue(!1);
const t = o.tool.value(),
i = e && (Object(a.isLineToolName)(t) || o.isToolEditingNow.value() || Object(o
.toolIsMeasure)(t)),
s = Object(o.properties)().childs().magnet.value();
h.setValue(!s && i ? n.MagnetMode.StrongMagnet : Object(o.properties)().childs().magnetMode
.value()), c.setValue(i ? !s : s)
}
function _() {
return c
}
function m() {
return h
}
Object(o.runOnDrawingStateReady)(() => {
Object(o.properties)().childs().magnet.subscribe(null, p), Object(o.properties)()
.childs().magnetMode.subscribe(null, p), u.subscribe(p), d.subscribe(p), o.tool
.subscribe(p), o.isToolEditingNow.subscribe(p), p()
})
},
zM7N: function(e, t, i) {
"use strict";
i.d(t, "c", (function() {
return c
})), i.d(t, "b", (function() {
return h
})), i.d(t, "e", (function() {
return u
})), i.d(t, "d", (function() {
return d
}));
var s = i("YFKU"),
r = i("eJTA"),
n = i("/McG"),
o = i("8pII"),
a = i("FZIs");
function l() {
return {
[a.a.Light]: JSON.parse(JSON.stringify(n)),
[a.a.Dark]: JSON.parse(JSON.stringify(o))
}
}
function c() {
return [a.a.Light, a.a.Dark]
}
function h(e) {
return l()[e]
}
function u(e) {
return {
[a.a.Light]: s.t("Light", {
context: "colorThemeName"
}),
[a.a.Dark]: s.t("Dark", {
context: "colorThemeName"
})
} [e] || e
}
function d(e) {
const t = l();
return c().some(i => p(t[i], e))
}
function p(e, t) {
let i = e.content === t.content;
return function(e = {}, t) {
try {
! function e(t, i, s) {
for (const r in t)
if (t.hasOwnProperty(r)) {
const n = i.concat(r);
if ("object" == typeof t[r]) e(t[r], n, s);
else if (s(n, t[r])) throw new Error("exit")
}
}(e, [], t)
} catch (e) {
return
}
}(e.content, (e, s) => {
const n = function(e, t = {}) {
let i = t;
for (let t = 0; t < e.length; t++) {
if (!i || "object" != typeof i) return;
i = i[e[t]]
}
if ("string" == typeof i || "number" == typeof i) return i;
return
}(e, t.content);
return i = function(e, t) {
if ("string" == typeof e && "string" == typeof t) try {
return Object(r.areEqualRgb)(Object(r.parseRgb)(e), Object(r
.parseRgb)(t))
} catch (i) {
return e === t
}
return e === t
}(s, n), !i
}), i
}
i.d(t, "a", (function() {
return a.a
}))
},
zRdu: function(e, t, i) {
"use strict";
var s;
i.d(t, "a", (function() {
return s
})),
function(e) {
e[e.Separator = 0] = "Separator", e[e.Action = 1] = "Action", e[e.ActionAsync = 2] =
"ActionAsync", e[e.Loader = 3] = "Loader"
}(s || (s = {}))
},
zUrt: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "backend", (function() {
return s
}));
const s = i("Ery9")
},
zXvd: function(e, t, i) {
"use strict";
i.r(t), i.d(t, "NumericFormatter", (function() {
return n
}));
var s = i("kcTO"),
r = i("nc0P");
class n {
constructor(e) {
this._precision = e
}
format(e) {
return (void 0 !== this._precision ? e.toFixed(this._precision) : n.formatNoE(e))
.replace(".", s.formatterOptions.decimalSign)
}
parse(e) {
const t = e.replace(s.formatterOptions.decimalSign, ".");
let i = parseFloat(t);
return this._precision && (i = +i.toFixed(this._precision)), i
}
static formatNoE(e) {
if (!Number.isFinite(e)) return String(e);
const t = new r.Big(e);
return t.lt(1) ? t.toFixed() : t.toString()
}
}
},
zZ5f: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("5rJj"),
n = i("j3hX").LineToolColorsProperty;
class o extends s {
constructor(e, t) {
super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"xp9B", 7)).then(({
FibSpeedResistanceFanPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
hLevelsCount() {
return o.HLevelsCount
}
vLevelsCount() {
return o.VLevelsCount
}
pointsCount() {
return 2
}
name() {
return "Fib Speed Resistance Fan"
}
processErase(e, t) {
var i = "h" === t.type ? "hlevel" + t.index : "vlevel" + t.index,
s = this.properties()[i].visible;
e.setProperty(s, !1, "Erase level line")
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "2PB4")))
.FibSpeedResistanceFanDefinitionsViewModel
}
_snapTo45DegreesAvailable() {
return !0
}
static createProperties(e) {
void 0 !== e && void 0 === e.reverse && (e.reverse = !0);
var t = new r("linetoolfibspeedresistancefan", e, !1, {
range: [1, 7],
prefixes: ["h", "v"],
names: ["coeff", "color", "visible"]
});
return o._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e);
var t = [e.child("grid").child("color")];
for (let i = 1; i <= o.HLevelsCount; i++) t.push(e.child("hlevel" + i).child(
"color"));
for (let i = 1; i <= o.VLevelsCount; i++) t.push(e.child("vlevel" + i).child(
"color"));
e.addChild("linesColors", new n(t)), e.addExclusion("linesColors")
}
}
o.HLevelsCount = 7, o.VLevelsCount = 7, t.LineToolFibSpeedResistanceFan = o
},
ziJ5: function(e, t, i) {
"use strict";
(function(e) {
var s = i("QIuV").LineToolTrading,
r = i("Ss5c").LineDataSource,
n = i("RTYN").PositionAveragePriceAxisView,
o = i("jkoZ"),
a = i("Ocx9").DefaultProperty,
l = i("kcTO").PriceFormatter,
c = i("s1Gx").sortSourcesPreOrdered.LineToolPosition;
function h(e) {
return null == e ? e = "" : e += "", e
}
class u {
constructor(e) {
this._line = e, this._data = {
bodyText: "position",
quantityText: "0"
}, this._closeEnabled = !0, this._direction = "buy", this._profitState =
"neutral"
}
setDirection(e) {
return this._direction = e, this._line.updateAllViewsAndRedraw(), this
}
setProfitState(e) {
return this._profitState = e, this._line.updateAllViewsAndRedraw(), this
}
getPrice() {
return this._line.points().length > 0 ? this._line.points()[0].price : this
._line._timePoint.length > 0 ? this._line._timePoint[0].price : void 0
}
setPrice(e) {
if (this._line.points().length > 0) {
var t = this._line.points()[0];
t.price = e, this._line._points[0] = t, this._line.normalizePoints(),
this._line.updateAllViewsAndRedraw()
}
return this._line._timePoint.length > 0 && (this._line._timePoint[0].price =
e), this
}
getText() {
return this._data.bodyText
}
setText(e) {
return this._data.bodyText = e || "", this._line.updateAllViewsAndRedraw(),
this
}
setTooltip(e) {
return this._line.properties().tooltip.setValue(h(e)), this
}
getTooltip() {
return this._line.properties().tooltip.value()
}
setProtectTooltip(e) {
return this._line.properties().protectTooltip.setValue(h(e)), this
}
getProtectTooltip() {
return this._line.properties().protectTooltip.value()
}
setCloseTooltip(e) {
return this._line.properties().closeTooltip.setValue(h(e)), this
}
getCloseTooltip() {
return this._line.properties().closeTooltip.value()
}
setReverseTooltip(e) {
return this._line.properties().reverseTooltip.setValue(h(e)), this
}
getReverseTooltip() {
return this._line.properties().reverseTooltip.value()
}
getQuantity() {
return this._data.quantityText
}
setQuantity(e) {
return this._data.quantityText = e || "", this._line
.updateAllViewsAndRedraw(), this
}
getExtendLeft() {
var e = this._line.properties().extendLeft.value();
return "inherit" === e ? this._line._model.properties().tradingProperties
.extendLeft.value() : e
}
setExtendLeft(e) {
return this._line.properties().extendLeft.setValue(e), this
}
getLineLength() {
var e = this._line.properties().lineLength.value();
return "inherit" === e ? this._line._model.properties().tradingProperties
.lineLength.value() : e
}
setLineLength(e) {
return this._line.properties().lineLength.setValue(Math.max(0, Math.min(e,
100))), this
}
getLineColor() {
var e = this._line.properties();
return ("buy" === this._direction ? e.lineBuyColor : e.lineSellColor)
.value()
}
setLineColor(e) {
return "buy" === this._direction ? this.setLineBuyColor(e) : this
.setLineSellColor(e), this
}
setLineBuyColor(e) {
return this._line.properties().lineBuyColor.setValue(e), this
}
setLineSellColor(e) {
return this._line.properties().lineSellColor.setValue(e), this
}
getLineStyle() {
var e = this._line.properties().lineStyle.value();
return "inherit" === e ? this._line._model.properties().tradingProperties
.lineStyle.value() : e
}
setLineStyle(e) {
return this._line.properties().lineStyle.setValue(e), this
}
getLineWidth() {
var e = this._line.properties().lineWidth.value();
return "inherit" === e ? this._line._model.properties().tradingProperties
.lineWidth.value() : e
}
setLineWidth(e) {
return this._line.properties().lineWidth.setValue(e), this
}
getBodyBorderColor() {
var e = this._line.properties();
return ("buy" === this._direction ? e.bodyBorderBuyColor : e
.bodyBorderSellColor).value()
}
setBodyBorderColor(e) {
return "buy" === this._direction ? this.setBodyBorderBuyColor(e) : this
.setBodyBorderSellColor(e), this
}
setBodyBorderBuyColor(e) {
return this._line.properties().bodyBorderBuyColor.setValue(e), this
}
setBodyBorderSellColor(e) {
return this._line.properties().bodyBorderSellColor.setValue(e), this
}
getBodyBackgroundColor() {
return o.getColorFromProperties(this._line.properties().bodyBackgroundColor,
this._line.properties().bodyBackgroundTransparency)
}
setBodyBackgroundColor(e) {
return o.setColorToProperties(e, this._line.properties()
.bodyBackgroundColor, this._line.properties()
.bodyBackgroundTransparency), this
}
getBodyTextColor() {
var e = this._line.properties();
return ("positive" === this._profitState ? e.bodyTextPositiveColor :
"negative" === this._profitState ? e.bodyTextNegativeColor : e
.bodyTextNeutralColor).value()
}
setBodyTextColor(e) {
return "positive" === this._profitState ? this.setBodyTextPositiveColor(e) :
"negative" === this._profitState ? this.setBodyTextNegativeColor(e) :
this.setBodyTextNeutralColor(e), this
}
setBodyTextPositiveColor(e) {
return this._line.properties().bodyTextPositiveColor.setValue(e), this
}
setBodyTextNegativeColor(e) {
return this._line.properties().bodyTextNegativeColor.setValue(e), this
}
setBodyTextNeutralColor(e) {
return this._line.properties().bodyTextNeutralColor.setValue(e), this
}
getBodyFont() {
return o.getFontFromProperties(this._line.properties().bodyFontFamily, this
._line.properties().bodyFontSize, this._line.properties()
.bodyFontBold, this._line.properties().bodyFontItalic)
}
setBodyFont(e) {
return o.setFontToProperties(e, this._line.properties().bodyFontFamily, this
._line.properties().bodyFontSize, this._line.properties()
.bodyFontBold, this._line.properties().bodyFontItalic), this
}
getQuantityBorderColor() {
var e = this._line.properties();
return ("buy" === this._direction ? e.quantityBorderBuyColor : e
.quantityBorderSellColor).value()
}
setQuantityBorderColor(e) {
return "buy" === this._direction ? this.setQuantityBorderBuyColor(e) : this
.setQuantityBorderSellColor(e), this
}
setQuantityBorderBuyColor(e) {
return this._line.properties().quantityBorderBuyColor.setValue(e), this
}
setQuantityBorderSellColor(e) {
return this._line.properties().quantityBorderSellColor.setValue(e), this
}
getQuantityBackgroundColor() {
var e = this._line.properties();
return ("buy" === this._direction ? e.quantityBackgroundBuyColor : e
.quantityBackgroundSellColor).value()
}
setQuantityBackgroundColor(e) {
return "buy" === this._direction ? this.setQuantityBackgroundBuyColor(e) :
this.setQuantityBackgroundSellColor(e), this
}
setQuantityBackgroundBuyColor(e) {
return this._line.properties().quantityBackgroundBuyColor.setValue(e), this
}
setQuantityBackgroundSellColor(e) {
return this._line.properties().quantityBackgroundSellColor.setValue(e), this
}
getQuantityTextColor() {
return o.getColorFromProperties(this._line.properties().quantityTextColor,
this._line.properties().quantityTextTransparency)
}
setQuantityTextColor(e) {
return o.setColorToProperties(e, this._line.properties().quantityTextColor,
this._line.properties().quantityTextTransparency), this
}
getQuantityFont() {
return o.getFontFromProperties(this._line.properties().quantityFontFamily,
this._line.properties().quantityFontSize, this._line.properties()
.quantityFontBold, this._line.properties().quantityFontItalic)
}
setQuantityFont(e) {
return o.setFontToProperties(e, this._line.properties().quantityFontFamily,
this._line.properties().quantityFontSize, this._line.properties()
.quantityFontBold, this._line.properties().quantityFontItalic), this
}
getReverseButtonBorderColor() {
var e = this._line.properties();
return ("buy" === this._direction ? e.reverseButtonBorderBuyColor : e
.reverseButtonBorderSellColor).value()
}
setReverseButtonBorderColor(e) {
return "buy" === this._direction ? this.setReverseButtonBorderBuyColor(e) :
this.setReverseButtonBorderSellColor(e), this
}
setReverseButtonBorderBuyColor(e) {
return this._line.properties().reverseButtonBorderBuyColor.setValue(e), this
}
setReverseButtonBorderSellColor(e) {
return this._line.properties().reverseButtonBorderSellColor.setValue(e),
this
}
getReverseButtonBackgroundColor() {
return o.getColorFromProperties(this._line.properties()
.reverseButtonBackgroundColor, this._line.properties()
.reverseButtonBackgroundTransparency)
}
setReverseButtonBackgroundColor(e) {
return o.setColorToProperties(e, this._line.properties()
.reverseButtonBackgroundColor, this._line.properties()
.reverseButtonBackgroundTransparency), this
}
getReverseButtonIconColor() {
var e = this._line.properties();
return ("buy" === this._direction ? e.reverseButtonIconBuyColor : e
.reverseButtonIconSellColor).value()
}
setReverseButtonIconColor(e) {
return "buy" === this._direction ? this.setReverseButtonIconBuyColor(e) :
this.setReverseButtonIconSellColor(e), this
}
setReverseButtonIconBuyColor(e) {
return this._line.properties().reverseButtonIconBuyColor.setValue(e), this
}
setReverseButtonIconSellColor(e) {
return this._line.properties().reverseButtonIconSellColor.setValue(e), this
}
getCloseButtonBorderColor() {
var e = this._line.properties();
return ("buy" === this._direction ? e.closeButtonBorderBuyColor : e
.closeButtonBorderSellColor).value()
}
setCloseButtonBorderColor(e) {
return "buy" === this._direction ? this.setCloseButtonBorderBuyColor(e) :
this.setCloseButtonBorderSellColor(e), this
}
setCloseButtonBorderBuyColor(e) {
return this._line.properties().closeButtonBorderBuyColor.setValue(e), this
}
setCloseButtonBorderSellColor(e) {
return this._line.properties().closeButtonBorderSellColor.setValue(e), this
}
getCloseButtonBackgroundColor() {
return o.getColorFromProperties(this._line.properties()
.closeButtonBackgroundColor, this._line.properties()
.closeButtonBackgroundTransparency)
}
setCloseButtonBackgroundColor(e) {
return o.setColorToProperties(e, this._line.properties()
.closeButtonBackgroundColor, this._line.properties()
.closeButtonBackgroundTransparency), this
}
getCloseButtonIconColor() {
var e = this._line.properties();
return ("buy" === this._direction ? e.closeButtonIconBuyColor : e
.closeButtonIconSellColor).value()
}
setCloseButtonIconColor(e) {
return "buy" === this._direction ? this.setCloseButtonIconBuyColor(e) : this
.setCloseButtonIconSellColor(e), this
}
setCloseButtonIconBuyColor(e) {
return this._line.properties().closeButtonIconBuyColor.setValue(e), this
}
setCloseButtonIconSellColor(e) {
return this._line.properties().closeButtonIconSellColor.setValue(e), this
}
block() {
this._blocked = !0, this._line.updateAllViewsAndRedraw()
}
unblock() {
this._blocked = !1, this._line.updateAllViewsAndRedraw()
}
isFunction(e) {
return "function" == typeof e
}
onReverse(e, t) {
return t ? this.isFunction(t) && (this._onReverseData = e, this
._onReverseCallback = t) : this.isFunction(e) && (this
._onReverseCallback = e), this
}
callOnReverse() {
this.isFunction(this._onReverseCallback) && this._onReverseCallback.call(
this, this._onReverseData)
}
isOnReverseCallbackPresent() {
return this.isFunction(this._onReverseCallback)
}
onClose(e, t) {
return t ? this.isFunction(t) && (this._onCloseData = e, this
._onCloseCallback = t) : this.isFunction(e) && (this
._onCloseCallback = e), this
}
setCloseEnabled(e) {
return this._closeEnabled === e || (this._closeEnabled = e, this
._onCloseCallback && this._line.updateAllViewsAndRedraw()), this
}
isCloseEnabled() {
return this._closeEnabled
}
callOnClose() {
this.isFunction(this._onCloseCallback) && this._closeEnabled && this
._onCloseCallback.call(this, this._onCloseData)
}
isOnCloseCallbackPresent() {
return this._closeEnabled && this.isFunction(this._onCloseCallback)
}
onModify(e, t) {
return t ? this.isFunction(t) && (this._onModifyData = e, this
._onModifyCallback = t) : this.isFunction(e) && (this
._onModifyCallback = e), this
}
callOnModify() {
this.isFunction(this._onModifyCallback) && this._onModifyCallback.call(this,
this._onModifyData)
}
onContextMenu(e, t) {
return t ? this.isFunction(t) && (this._onContextMenuData = e, this
._onContextMenuCallback = t) : this.isFunction(e) && (this
._onContextMenuCallback = e), this
}
shouldShowContextMenu() {
return this.isFunction(this._onContextMenuCallback)
}
callOnContextMenu() {
if (this.isFunction(this._onContextMenuCallback)) return this
._onContextMenuCallback.call(this, this._onContextMenuData)
}
remove() {
this._line._model.removeSource(this._line), delete this._line
}
}
class d extends s {
constructor(e, t) {
super(e, t || d.createProperties()), this._adapter = new u(this), i.e(
"lt-pane-views").then(i.t.bind(null, "GzSs", 7)).then(({
PositionPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
});
var s = e.mainSeries().symbolInfo(),
r = null !== s ? s.pricescale : 100,
n = null !== s && s.fractional ? s.minmov : 1,
o = null !== s && s.fractional,
a = null !== s ? s.minmove2 : void 0;
this._formatter = new l(r, n, o, a)
}
zorder() {
return c
}
isSpeciallyZOrderedSource() {
return !0
}
setPoint(e, t, i) {
this._points[e] = t, this.normalizePoints()
}
addPoint(e, t) {
return this._points.push(e), this._lastPoint = null, this.normalizePoints(),
this.createServerPoints(), !0
}
name() {
return "Position"
}
createPriceAxisView(e) {
return this._priceAxisView = new n(this, {
pointIndex: e,
backgroundPropertyGetter: () => this._adapter.getLineColor()
}), this._priceAxisView
}
paneViews() {
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
null : this._model.properties().tradingProperties.showPositions
.value() ? r.prototype.paneViews.call(this) : null
}
priceAxisViews(t, i) {
return TradingView.printing && !e.enabled("snapshot_trading_drawings") ?
null : this._model.properties().tradingProperties.showPositions
.value() ? r.prototype.priceAxisViews.call(this, t, i) : null
}
hasContextMenu() {
return this._adapter.shouldShowContextMenu()
}
contextMenuItems() {
return this._adapter.callOnContextMenu()
}
formatter() {
return this._formatter
}
static createProperties(e) {
var t = new a("linetoolposition", e, !1, !1);
return d._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e)
}
}
t.LineToolPosition = d
}).call(this, i("Kxc7"))
},
zqZp: function(e, t, i) {
"use strict";
var s = i("Ss5c").LineDataSource,
r = i("Ocx9").DefaultProperty,
n = i("j3hX").LineToolColorsProperty;
class o extends s {
constructor(e, t) {
super(e, t || o.createProperties()), i.e("lt-pane-views").then(i.t.bind(null,
"Ni7V", 7)).then(({
PriceLabelPaneView: e
}) => {
this._setPaneViews([new e(this, this._model)])
})
}
pointsCount() {
return 1
}
name() {
return "Price Label"
}
async _getPropertyDefinitionsViewModelClass() {
return (await Promise.all([i.e(27), i.e(62), i.e(
"lt-property-pages-with-definitions")]).then(i.bind(null, "hQgR")))
.PriceLabelDefinitionsViewModel
}
static createProperties(e) {
var t = new r("linetoolpricelabel", e);
return o._configureProperties(t), t
}
static _configureProperties(e) {
s._configureProperties(e), e.addChild("linesColors", new n([e.childs()
.borderColor
])), e.addChild("textsColors", new n([e.childs().color]))
}
}
t.LineToolPriceLabel = o
}
},
[
["/G2Z", "runtime", "vendors"]
]
]);