{"version":3,"file":"home.44e2136d.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/charts-lib.ts","webpack://@finviz/website/./js/app/home/market_sentiment.tsx","webpack://@finviz/website/./js/app/shared/documentVisibility.ts","webpack://@finviz/website/./js/app/home/refresh.ts","webpack://@finviz/website/./js/app/home/indices-data.ts","webpack://@finviz/website/./js/app/home/index.tsx","webpack://@finviz/website/./js/app/maps/types.ts","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/parseJSONFromScript.ts","webpack://@finviz/website/./js/app/shared/ready.ts","webpack://@finviz/website/../node_modules/flux/index.js","webpack://@finviz/website/../node_modules/flux/lib/Dispatcher.js","webpack://@finviz/website/../node_modules/flux/lib/invariant.js","webpack://@finviz/website/../node_modules/keymirror/index.js"],"sourcesContent":["import React from 'react'\r\n\r\nexport enum SettingsTab {\r\n Chart = 'chart',\r\n Colors = 'colors',\r\n}\r\n\r\nexport type ChartLayoutProps = {\r\n config: object\r\n onRegisterChartLayoutModel?: (chartLayout: any) => void\r\n shouldResize?: boolean\r\n parentElement?: HTMLElement\r\n}\r\n\r\nexport type ChartLayoutHeaderProps = {\r\n model: any\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\ninterface ChartsLib {\r\n FREE_DATE_RANGES: string[]\r\n ChartLayout: React.FC\r\n ChartLayoutHeader: React.FC\r\n ChartLayoutWithGlobalState: React.FC\r\n\r\n ChartSettings: React.FC<{\r\n onClose: () => void\r\n onActiveSettingsTabChange?: (settingsComponent: SettingsTab) => void\r\n activeSettingsTab?: SettingsTab\r\n }>\r\n\r\n PreventClosingUnsavedChanges: React.FC<{\r\n onHide: () => void\r\n children: (props: { checkForUnsavedChangesAndClose: () => void }) => React.ReactElement\r\n }>\r\n\r\n useChartLayoutGlobalModel: () => {\r\n chartLayoutModel: any | null\r\n chartLayoutModelConfigSnapshot: Record | null\r\n lastGlobalRerender: number\r\n setChartLayoutModel: (chartLayoutModel: any) => void\r\n getChartLayoutModelConfig: (props: { fallback: Record }) => Record\r\n forceGlobalRerender: () => void\r\n generateNewLayoutModelConfigSnapshot: () => void\r\n }\r\n\r\n StockDetailTimeframeBar: React.FC<{\r\n isDateRangeAvailable: boolean\r\n isPremium: boolean\r\n isLoadingOverride?: boolean\r\n }>\r\n\r\n Quote: {\r\n create(quote: any): any\r\n select: (query: (quote: any) => boolean) => any\r\n deleteAll: () => void\r\n findByAttribute: (attribute: string, value: any) => any\r\n getAll: (tickersAndTimeframes: any) => any\r\n }\r\n\r\n Settings: {\r\n MarketSentiment: any\r\n Indicator: any\r\n Chart: any\r\n Thumb: any\r\n Element: any\r\n Colors: string[]\r\n updateColors: (type: string, name: string, theme: 'light' | 'dark', value: string) => void\r\n }\r\n\r\n Utils: {\r\n dateFromUnixTimestamp: (date: string) => Date\r\n }\r\n\r\n convertTa: {\r\n getPanes: (taConfig: any) => any\r\n }\r\n\r\n useModelState: (\r\n model: Model | null,\r\n options: { watchProperties?: Array; listenOnEvents?: string[] }\r\n ) => Model | null\r\n}\r\n\r\n// @ts-ignore\r\nconst chartsLib = (window.FLibs.Charts as ChartsLib) ?? {}\r\n\r\nexport const FREE_DATE_RANGES = chartsLib.FREE_DATE_RANGES\r\nexport const ChartLayout = chartsLib.ChartLayout\r\nexport const ChartLayoutWithGlobalState = chartsLib.ChartLayoutWithGlobalState\r\nexport const ChartLayoutHeader = chartsLib.ChartLayoutHeader\r\nexport const ChartSettings = chartsLib.ChartSettings\r\nexport const PreventClosingUnsavedChanges = chartsLib.PreventClosingUnsavedChanges\r\nexport const useChartLayoutGlobalModel = chartsLib.useChartLayoutGlobalModel\r\nexport const StockDetailTimeframeBar = chartsLib.StockDetailTimeframeBar\r\nexport const Quote = chartsLib.Quote\r\nexport const Settings = chartsLib.Settings\r\nexport const Utils = chartsLib.Utils\r\nexport const convertTa = chartsLib.convertTa\r\nexport const useModelState = chartsLib.useModelState\r\n","import { Component, MouseEvent } from 'react'\r\nimport ReactDOM from 'react-dom'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../main/services/api'\r\nimport { ChartLayout, Quote } from '../charts-lib'\r\n\r\nconst ticker = 'market_sentiment'\r\n\r\ninterface MarketSentimentProps {}\r\ninterface MarketSentimentState {\r\n loading: boolean\r\n enabled: boolean\r\n chartConfig: { layout: string } | null\r\n}\r\n\r\nconst MARKET_SENTIMENT_WIDTH_PX = 160\r\nconst MARKET_SENTIMENT_HEIGHT_PX = 40\r\nconst marketSentimentChartConfig = {\r\n layout: '1h1v',\r\n width: MARKET_SENTIMENT_WIDTH_PX,\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n charts: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n timeframe: 'i3',\r\n scale: 'linear',\r\n ticker: ticker,\r\n instrument: 'market_sentiment',\r\n refreshData: false,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n elements: [\r\n {\r\n type: 'charts/market_sentiment',\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n\r\nclass MarketSentiment extends Component {\r\n state: MarketSentimentState = {\r\n loading: true,\r\n enabled: false,\r\n chartConfig: null,\r\n }\r\n\r\n _timer: number | null = null\r\n _lastRequest: CancelablePromise | null = null\r\n\r\n componentDidMount() {\r\n this._fetchData('', () => {\r\n this.setState({ chartConfig: marketSentimentChartConfig })\r\n })\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this._timer !== null) {\r\n this._lastRequest?.cancel?.()\r\n clearTimeout(this._timer)\r\n }\r\n }\r\n\r\n render() {\r\n const { loading, enabled, chartConfig } = this.state\r\n return (\r\n \r\n \r\n \r\n Click BULL for positive market sentiment
Click BEAR for negative market sentiment] offsetx=[-200] offsety=[20] delay=[100]\">\r\n {chartConfig && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n _vote(e: MouseEvent, sentiment: string) {\r\n e.preventDefault()\r\n this.setState({ enabled: false })\r\n this._fetchData('?b=' + sentiment, undefined, false)\r\n }\r\n\r\n _fetchData = async (urlQuery = '', callback?: Function, setTimer = true) => {\r\n if (setTimer && this._timer !== null) clearTimeout(this._timer)\r\n\r\n if (document.hidden) {\r\n // console.log(`${+new Date()} Document is hidden, canceling refresh`)\r\n if (setTimer) this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), 1000)\r\n return\r\n }\r\n\r\n // console.log(`${+new Date()} Document is visible, refreshing`)\r\n\r\n this._lastRequest = apiRequest(`/api/market_sentiment.ashx${urlQuery}`)\r\n const json = await this._lastRequest\r\n if (json) {\r\n const quoteData = getData(json)\r\n const quote = Quote.findByAttribute('ticker', ticker)\r\n if (quote) {\r\n Quote.findByAttribute('ticker', ticker).updateAttributes(getData(json))\r\n } else {\r\n Quote.create(quoteData).save()\r\n }\r\n callback?.()\r\n\r\n this.setState({\r\n loading: false,\r\n enabled: json.enabled,\r\n })\r\n }\r\n\r\n if (setTimer) {\r\n this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), (json?.refresh ?? 30) * 1000)\r\n }\r\n }\r\n}\r\n\r\ninterface QuoteData {\r\n refresh: number\r\n enabled: boolean\r\n sum: number[]\r\n weight: number[]\r\n time: string\r\n visibleMinutes: number\r\n}\r\n\r\nfunction getData(data: QuoteData) {\r\n return {\r\n close: data.sum,\r\n volume: data.weight,\r\n date: Array.from('1'.repeat(data.sum.length)).map((x) => parseInt(x, 10)),\r\n ticker: ticker,\r\n timeframe: 'i3',\r\n instrument: 'market_sentiment',\r\n premarket: false,\r\n aftermarket: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: data.visibleMinutes,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nfunction mount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.render(, el)\r\n }\r\n}\r\n\r\nfunction unmount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.unmountComponentAtNode(el)\r\n }\r\n}\r\n\r\nmount()\r\n\r\nexport { mount, unmount }\r\n","function getCurrentDateInMs() {\r\n return new Date().valueOf()\r\n}\r\n\r\nfunction getIsDocumentVisible() {\r\n return document.visibilityState === 'visible' || document.hidden === false\r\n}\r\n\r\n/**\r\n * Calls callback based on interval and document visibility. Returns unsubscribe function.\r\n * How it works:\r\n * - document is hidden: interval cleared\r\n * - document visible: interval set-up with remaining time from last interval. Call immediately if interval elapsed\r\n */\r\nexport function intervalCallbackOnWindowVisible(interval: number, callback: () => unknown) {\r\n let nextRefresh = getCurrentDateInMs() + interval\r\n let refreshTimeout: NodeJS.Timeout | null = null\r\n\r\n function refresh() {\r\n nextRefresh = getCurrentDateInMs() + interval\r\n // Queue next refresh\r\n refreshTimeout = setTimeout(refresh, interval)\r\n // Call callback asynchronously\r\n setTimeout(callback, 0)\r\n }\r\n\r\n /**\r\n * Handle the visibility change event, compute callback remaining time or call immediately\r\n */\r\n function handleVisibilityChange() {\r\n if (refreshTimeout) clearTimeout(refreshTimeout)\r\n\r\n if (getIsDocumentVisible()) {\r\n const currentDateMs = getCurrentDateInMs()\r\n // Refresh if the document is stale, otherwise set a timeout to refresh later\r\n if (nextRefresh <= currentDateMs) {\r\n refresh()\r\n } else {\r\n refreshTimeout = setTimeout(refresh, nextRefresh - currentDateMs)\r\n }\r\n }\r\n }\r\n\r\n if (getIsDocumentVisible()) {\r\n refreshTimeout = setTimeout(refresh, interval)\r\n }\r\n\r\n document.addEventListener('visibilitychange', handleVisibilityChange)\r\n\r\n return () => {\r\n document.removeEventListener('visibilitychange', handleVisibilityChange)\r\n }\r\n}\r\n","import { ContentType, apiRequest } from '../../main/services/api'\r\nimport mapActionCreators from '../maps/store/action-creators'\r\nimport { PerfData } from '../maps/types'\r\nimport { intervalCallbackOnWindowVisible } from '../shared/documentVisibility'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { Indices, updateIndices } from './indices-data'\r\n\r\ninterface RefreshInfo {\r\n userId: string\r\n version: number\r\n interval: number\r\n}\r\n\r\nconst refreshInfo = parseJSONFromScript('refresh-init')\r\n\r\nfunction refreshPage(result: string) {\r\n const newDocument = new DOMParser().parseFromString(result, 'text/html')\r\n const newRefreshInfo = parseJSONFromScript('refresh-init', newDocument)\r\n\r\n if (!refreshInfo || !newRefreshInfo || refreshInfo.userId !== newRefreshInfo.userId) return\r\n\r\n if (refreshInfo.version !== newRefreshInfo.version) {\r\n window.location.reload()\r\n }\r\n\r\n // Replace left signals table\r\n const oldSignalsLeft = document.getElementById('js-signals_1')\r\n const newSignalsLeft = newDocument.getElementById('js-signals_1')\r\n if (oldSignalsLeft && newSignalsLeft) {\r\n oldSignalsLeft.innerHTML = newSignalsLeft.innerHTML\r\n }\r\n\r\n // Replace right signals table\r\n const oldSignalsRight = document.getElementById('js-signals_2')\r\n const newSignalsRight = newDocument.getElementById('js-signals_2')\r\n if (oldSignalsRight && newSignalsRight) {\r\n oldSignalsRight.innerHTML = newSignalsRight.innerHTML\r\n }\r\n\r\n // Replace right signals table\r\n const oldHomepageBottom = document.getElementById('js-homepage_bottom')\r\n const newHomepageBottom = newDocument.getElementById('js-homepage_bottom')\r\n if (oldHomepageBottom && newHomepageBottom) {\r\n oldHomepageBottom.innerHTML = newHomepageBottom.innerHTML\r\n }\r\n\r\n // Update indices\r\n try {\r\n const newIndicesData = parseJSONFromScript('js-indices', newDocument)\r\n if (newIndicesData) {\r\n updateIndices(newIndicesData)\r\n }\r\n } catch (error) {\r\n Sentry.withScope((scope: any) => {\r\n scope.setContext('Body', { size: result.length })\r\n Sentry.captureException(error)\r\n })\r\n }\r\n\r\n try {\r\n // Render maps\r\n const mapData = parseJSONFromScript<{ perfDataSec: PerfData; perfDataGeo: PerfData }>('map-data', newDocument)\r\n mapActionCreators.updatePerfData(window.FinvizIndexSecMap, mapData?.perfDataSec)\r\n mapActionCreators.updatePerfData(window.FinvizIndexGeoMap, mapData?.perfDataGeo)\r\n } catch {}\r\n\r\n /**\r\n * Re-render recent quotes. The script (recent_quotes.js) is only included for premium users\r\n * so we need to check if it's defined\r\n */\r\n if (typeof window['RenderRecentQuotes'] === 'function') {\r\n RenderRecentQuotes()\r\n }\r\n\r\n // Send refresh event to google analytics\r\n window.gtag?.('event', 'refresh', { event_category: 'page' })\r\n // Refresh any ads that might be on the page\r\n if (window.finvizBannersLoaded === true) {\r\n window.initFinvizBanners?.()\r\n } else if (typeof window.refreshAds === 'function') {\r\n window.refreshAds('#js-homepage_bottom [id*=IC_D_]')\r\n }\r\n}\r\n\r\nfunction initRefresh(interval: number) {\r\n intervalCallbackOnWindowVisible(interval, async function handleRefresh() {\r\n const data = await apiRequest(window.location.pathname, {\r\n headers: { 'Content-Type': ContentType.Html },\r\n })\r\n\r\n if (data) {\r\n refreshPage(data)\r\n }\r\n })\r\n}\r\n\r\nif (refreshInfo?.interval) {\r\n initRefresh(refreshInfo.interval * 1000)\r\n}\r\n","import { Quote } from '../charts-lib'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\ninterface Index {\r\n ticker: string\r\n timeframe: string\r\n volume: number[]\r\n date: number[]\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n lastOpen: null\r\n lastHigh: null\r\n lastLow: null\r\n lastClose: number\r\n lastVolume: null\r\n lastDate: number\r\n prevClose: number\r\n afterClose: null\r\n afterChange: null\r\n relativeVolume: number\r\n}\r\n\r\nexport type Indices = Record\r\n\r\nexport function getData(index: string, ticker: string, indices: Indices) {\r\n return {\r\n ...indices[index],\r\n ticker: ticker, // use text?\r\n timeframe: 'i10',\r\n instrument: 'stock',\r\n premarket: false,\r\n aftermarket: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: 390,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nexport function updateIndices(indices: Indices) {\r\n Quote.findByAttribute('ticker', 'DOW').updateAttributes(getData('^DJI', 'DOW', indices))\r\n Quote.findByAttribute('ticker', 'NASDAQ').updateAttributes(getData('^IXIC', 'NASDAQ', indices))\r\n Quote.findByAttribute('ticker', 'S&P 500').updateAttributes(getData('^GSPC', 'S&P 500', indices))\r\n}\r\n","import ReactDOM from 'react-dom'\r\n\r\nimport { ChartLayout, Quote } from '../charts-lib'\r\nimport { SpecificChartFunctionality, getCustomColorsFromCookies } from '../shared/chartLayoutConfig'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { ready } from '../shared/ready'\r\nimport { getData } from './indices-data'\r\nimport type { Indices } from './indices-data'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\nfunction getChartConfig(ticker: string) {\r\n return {\r\n layout: '1h1v',\r\n width: 320,\r\n height: 190,\r\n barWidth: 3,\r\n barMargin: 1,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n colors: getCustomColorsFromCookies(),\r\n specificChartFunctionality: SpecificChartFunctionality.smallIndex,\r\n charts: [\r\n {\r\n height: 190,\r\n timeframe: 'i10',\r\n scale: 'linear',\r\n ticker: ticker,\r\n // leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData: false,\r\n // stretch: true,\r\n panes: [\r\n {\r\n height: 190,\r\n elements: [\r\n {\r\n type: 'charts/candle_stick',\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nfunction renderChart({ ticker, element }: { ticker: string; element: HTMLElement | null }) {\r\n if (element) {\r\n ReactDOM.render(, element)\r\n }\r\n}\r\n\r\nready(function () {\r\n const indices = parseJSONFromScript('js-indices')!\r\n\r\n Quote.create(getData('^DJI', 'DOW', indices)).save()\r\n Quote.create(getData('^IXIC', 'NASDAQ', indices)).save()\r\n Quote.create(getData('^GSPC', 'S&P 500', indices)).save()\r\n\r\n renderChart({ ticker: 'DOW', element: document.getElementById('dow') })\r\n renderChart({ ticker: 'NASDAQ', element: document.getElementById('nasdaq') })\r\n renderChart({ ticker: 'S&P 500', element: document.getElementById('sp500') })\r\n})\r\n","import { ReactNode } from 'react'\r\n\r\nexport enum MapTypeId {\r\n Sector = 'sec',\r\n World = 'geo',\r\n SectorFull = 'sec_all',\r\n ETF = 'etf',\r\n Screener = 'screener',\r\n Portfolio = 'portfolio',\r\n}\r\n\r\nexport enum MapSubtypeId {\r\n DayPerf = 'd1',\r\n WeekPerf = 'w1',\r\n MonthPerf = 'w4',\r\n ThreeMonthPerf = 'w13',\r\n SixMonthPerf = 'w26',\r\n YearPerf = 'w52',\r\n YearToDatePerf = 'ytd',\r\n RelativeVolume = 'relvol',\r\n PriceToEarnings = 'pe',\r\n ForwardPriceToEearnings = 'fpe',\r\n PriceEarningsToGrowth = 'peg',\r\n PriceToSellsRatio = 'ps',\r\n PriceToBookRatio = 'pb',\r\n DividendYield = 'div',\r\n EPSGrowth5y = 'eps5y',\r\n FloatShort = 'short',\r\n AnalystRecommendation = 'rec',\r\n EarningsPerf = 'earnperf',\r\n EarningsDate = 'earndate',\r\n // Portfolio\r\n PortfolioGainPct = 'portfolioGainPct',\r\n PortfolioGainUsd = 'portfolioGainUsd',\r\n PortfolioChangePct = 'portfolioChangePct',\r\n PortfolioChangeUsd = 'portfolioChangeUsd',\r\n}\r\n\r\nexport enum ScaleId {\r\n DayPerf = 'default',\r\n WeekPerf = '_5',\r\n MonthPerf = '_10',\r\n ThreeMonthPerf = '_15',\r\n SixMonthPerf = '_20',\r\n YearPerf = '_25',\r\n RelativeVolume = '_relvol',\r\n PriceToEarnings = '_pe',\r\n ForwardPriceToEearnings = '_fpe',\r\n PriceEarningsToGrowth = '_peg',\r\n PriceToSellsRatio = '_ps',\r\n PriceToBookRatio = '_pb',\r\n DividendYield = '_div',\r\n EPSGrowth5y = '_eps5y',\r\n FloatShort = '_short',\r\n AnalystRecommendation = '_rec',\r\n EarningsDate = '_earndate',\r\n // Portfolio\r\n PortfolioPct = '_portfolioPct',\r\n PortfolioUsd = '_portfolioUsd',\r\n}\r\n\r\nexport const enum NodeDepth {\r\n Root,\r\n Sector,\r\n Industry,\r\n Node,\r\n}\r\n\r\nexport interface MapDataRow {\r\n name: string\r\n perf?: number\r\n x: number\r\n y: number\r\n dx: number\r\n dy: number\r\n data: any\r\n depth: NodeDepth\r\n}\r\n\r\nexport interface MapDataRoot {\r\n name: 'Root'\r\n children: MapDataSector[]\r\n duplicateTickers: number\r\n}\r\n\r\nexport interface MapDataSector extends MapDataRow {\r\n children: MapDataIndustry[]\r\n parent: MapDataRoot\r\n}\r\n\r\nexport interface MapDataIndustry extends MapDataRow {\r\n children: MapDataNode[]\r\n parent: MapDataSector\r\n}\r\n\r\nexport interface MapDataNode extends MapDataRow {\r\n parent: MapDataIndustry\r\n additional?: string\r\n description: string\r\n perfText: string\r\n value: number\r\n}\r\n\r\nexport interface MapData {\r\n sectors: MapDataSector[]\r\n industries: MapDataIndustry[]\r\n nodes: MapDataNode[]\r\n}\r\n\r\nexport type PerfData = {\r\n nodes: Record | Array\r\n additional: Record\r\n version: number\r\n}\r\n\r\nexport interface MapSubtype {\r\n id: MapSubtypeId\r\n name: string\r\n scaleId: ScaleId\r\n tooltip: string\r\n countIndustryPerf: boolean\r\n countSectorPerf: boolean\r\n}\r\n\r\nexport interface MapType {\r\n name: string\r\n pageTitle: string\r\n nameShort?: string\r\n description: string\r\n type: MapTypeId\r\n subtypes: MapSubtype[]\r\n}\r\n\r\nexport interface Scale {\r\n name: string\r\n tooltip: ReactNode\r\n id: ScaleId\r\n}\r\n","import { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps {\r\n type: string\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n overlays: string[]\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n ticker: string\r\n timeframe: string\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: '1h1v',\r\n width: 800,\r\n height: 400,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n colors: getCustomColorsFromCookies(),\r\n charts: [\r\n {\r\n height: 400,\r\n timeframe,\r\n scale: 'linear',\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData: false,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: 400,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","export function parseJSONFromScript(id: string, doc: Document = document): T | null {\r\n const el = doc.getElementById(id)\r\n const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n if (!isValidElement) return null\r\n\r\n try {\r\n return JSON.parse(el.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return null\r\n }\r\n}\r\n","export function ready(fn: (ev?: Event) => any) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n","/**\n * Copyright (c) 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = require('./lib/Dispatcher')\n","/*\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * @typechecks\n */\n\n\"use strict\";\n\nvar invariant = require('./invariant');\n\nvar _lastID = 1;\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n * 1) Callbacks are not subscribed to particular events. Every payload is\n * dispatched to every registered callback.\n * 2) Callbacks can be deferred in whole or part until other callbacks have\n * been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n * var flightDispatcher = new Dispatcher();\n *\n * // Keeps track of which country is selected\n * var CountryStore = {country: null};\n *\n * // Keeps track of which city is selected\n * var CityStore = {city: null};\n *\n * // Keeps track of the base flight price of the selected city\n * var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'city-update',\n * selectedCity: 'paris'\n * });\n *\n * This payload is digested by `CityStore`:\n *\n * flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'city-update') {\n * CityStore.city = payload.selectedCity;\n * }\n * });\n *\n * When the user selects a country, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'country-update',\n * selectedCountry: 'australia'\n * });\n *\n * This payload is digested by both stores:\n *\n * CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * CountryStore.country = payload.selectedCountry;\n * }\n * });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n * CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * // `CountryStore.country` may not be updated.\n * flightDispatcher.waitFor([CountryStore.dispatchToken]);\n * // `CountryStore.country` is now guaranteed to be updated.\n *\n * // Select the default city for the new country\n * CityStore.city = getDefaultCityForCountry(CountryStore.country);\n * }\n * });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n * FlightPriceStore.dispatchToken =\n * flightDispatcher.register(function(payload) {\n * switch (payload.actionType) {\n * case 'country-update':\n * flightDispatcher.waitFor([CityStore.dispatchToken]);\n * FlightPriceStore.price =\n * getFlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n *\n * case 'city-update':\n * FlightPriceStore.price =\n * FlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n * }\n * });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\n\n function Dispatcher() {\n this.$Dispatcher_callbacks = {};\n this.$Dispatcher_isPending = {};\n this.$Dispatcher_isHandled = {};\n this.$Dispatcher_isDispatching = false;\n this.$Dispatcher_pendingPayload = null;\n }\n\n /**\n * Registers a callback to be invoked with every dispatched payload. Returns\n * a token that can be used with `waitFor()`.\n *\n * @param {function} callback\n * @return {string}\n */\n Dispatcher.prototype.register=function(callback) {\n var id = _prefix + _lastID++;\n this.$Dispatcher_callbacks[id] = callback;\n return id;\n };\n\n /**\n * Removes a callback based on its token.\n *\n * @param {string} id\n */\n Dispatcher.prototype.unregister=function(id) {\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.unregister(...): `%s` does not map to a registered callback.',\n id\n );\n delete this.$Dispatcher_callbacks[id];\n };\n\n /**\n * Waits for the callbacks specified to be invoked before continuing execution\n * of the current callback. This method should only be used by a callback in\n * response to a dispatched payload.\n *\n * @param {array} ids\n */\n Dispatcher.prototype.waitFor=function(ids) {\n invariant(\n this.$Dispatcher_isDispatching,\n 'Dispatcher.waitFor(...): Must be invoked while dispatching.'\n );\n for (var ii = 0; ii < ids.length; ii++) {\n var id = ids[ii];\n if (this.$Dispatcher_isPending[id]) {\n invariant(\n this.$Dispatcher_isHandled[id],\n 'Dispatcher.waitFor(...): Circular dependency detected while ' +\n 'waiting for `%s`.',\n id\n );\n continue;\n }\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.',\n id\n );\n this.$Dispatcher_invokeCallback(id);\n }\n };\n\n /**\n * Dispatches a payload to all registered callbacks.\n *\n * @param {object} payload\n */\n Dispatcher.prototype.dispatch=function(payload) {\n invariant(\n !this.$Dispatcher_isDispatching,\n 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.'\n );\n this.$Dispatcher_startDispatching(payload);\n try {\n for (var id in this.$Dispatcher_callbacks) {\n if (this.$Dispatcher_isPending[id]) {\n continue;\n }\n this.$Dispatcher_invokeCallback(id);\n }\n } finally {\n this.$Dispatcher_stopDispatching();\n }\n };\n\n /**\n * Is this Dispatcher currently dispatching.\n *\n * @return {boolean}\n */\n Dispatcher.prototype.isDispatching=function() {\n return this.$Dispatcher_isDispatching;\n };\n\n /**\n * Call the callback stored with the given id. Also do some internal\n * bookkeeping.\n *\n * @param {string} id\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_invokeCallback=function(id) {\n this.$Dispatcher_isPending[id] = true;\n this.$Dispatcher_callbacks[id](this.$Dispatcher_pendingPayload);\n this.$Dispatcher_isHandled[id] = true;\n };\n\n /**\n * Set up bookkeeping needed when dispatching.\n *\n * @param {object} payload\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_startDispatching=function(payload) {\n for (var id in this.$Dispatcher_callbacks) {\n this.$Dispatcher_isPending[id] = false;\n this.$Dispatcher_isHandled[id] = false;\n }\n this.$Dispatcher_pendingPayload = payload;\n this.$Dispatcher_isDispatching = true;\n };\n\n /**\n * Clear bookkeeping used for dispatching.\n *\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_stopDispatching=function() {\n this.$Dispatcher_pendingPayload = null;\n this.$Dispatcher_isDispatching = false;\n };\n\n\nmodule.exports = Dispatcher;\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule invariant\n */\n\n\"use strict\";\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n 'Invariant Violation: ' +\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n\"use strict\";\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n * var COLORS = keyMirror({blue: null, red: null});\n * var myColor = COLORS.blue;\n * var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n * Input: {key1: val1, key2: val2}\n * Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function(obj) {\n var ret = {};\n var key;\n if (!(obj instanceof Object && !Array.isArray(obj))) {\n throw new Error('keyMirror(...): Argument must be an object.');\n }\n for (key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n ret[key] = key;\n }\n return ret;\n};\n\nmodule.exports = keyMirror;\n"],"names":["SettingsTab","chartsLib","window","FLibs","Charts","FREE_DATE_RANGES","ChartLayout","ChartLayoutWithGlobalState","ChartLayoutHeader","ChartSettings","PreventClosingUnsavedChanges","useChartLayoutGlobalModel","StockDetailTimeframeBar","Quote","Utils","Settings","convertTa","useModelState","ticker","marketSentimentChartConfig","layout","width","height","scrollable","editable","cross","charts","timeframe","scale","instrument","refreshData","stretch","panes","elements","type","overlays","MarketSentiment","Component","loading","enabled","chartConfig","async","urlQuery","callback","setTimer","_timer","clearTimeout","document","hidden","setTimeout","_fetchData","_lastRequest","apiRequest","json","quoteData","getData","updateAttributes","save","setState","refresh","componentDidMount","this","componentWillUnmount","cancel","render","state","cellPadding","cellSpacing","border","style","visibility","id","config","valign","disabled","onClick","e","_vote","src","alt","display","sentiment","preventDefault","undefined","data","close","sum","volume","weight","date","Array","from","repeat","length","map","x","parseInt","premarket","aftermarket","afterChange","afterClose","drawMinutesPerDay","visibleMinutes","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","el","getElementById","ReactDOM","mount","getCurrentDateInMs","Date","valueOf","getIsDocumentVisible","visibilityState","refreshInfo","parseJSONFromScript","refreshPage","result","newDocument","DOMParser","parseFromString","newRefreshInfo","userId","version","location","reload","oldSignalsLeft","newSignalsLeft","innerHTML","oldSignalsRight","newSignalsRight","oldHomepageBottom","newHomepageBottom","newIndicesData","indices","error","Sentry","withScope","scope","setContext","size","captureException","mapData","mapActionCreators","FinvizIndexSecMap","perfDataSec","FinvizIndexGeoMap","perfDataGeo","RenderRecentQuotes","gtag","event_category","finvizBannersLoaded","initFinvizBanners","refreshAds","index","getChartConfig","barWidth","barMargin","colors","getCustomColorsFromCookies","specificChartFunctionality","SpecificChartFunctionality","renderChart","element","interval","nextRefresh","refreshTimeout","handleVisibilityChange","currentDateMs","addEventListener","intervalCallbackOnWindowVisible","pathname","headers","ContentType","ready","MapTypeId","MapSubtypeId","ScaleId","NodeDepth","getStaticChartConfig","paneElements","default","colorsOverride","leftOffset","JSON","parse","getParsedCookies","doc","isValidElement","tagName","getAttribute","textContent","fn","readyState","module","exports","Dispatcher","invariant","_lastID","$Dispatcher_callbacks","$Dispatcher_isPending","$Dispatcher_isHandled","$Dispatcher_isDispatching","$Dispatcher_pendingPayload","prototype","register","unregister","waitFor","ids","ii","$Dispatcher_invokeCallback","dispatch","payload","$Dispatcher_startDispatching","$Dispatcher_stopDispatching","isDispatching","condition","format","a","b","c","d","f","Error","args","argIndex","replace","framesToPop","obj","key","ret","Object","isArray","hasOwnProperty"],"sourceRoot":""}