{"version":3,"file":"options.8f2f4af8.js","mappings":"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","sources":["webpack://@finviz/website/./js/main/components/ChipSwitch.tsx","webpack://@finviz/website/./js/main/components/SubMenu/SubMenu.tsx","webpack://@finviz/website/./js/main/components/SubMenu/SubMenuTabs.tsx","webpack://@finviz/website/./js/main/hooks/use-sticky-shadow.ts","webpack://@finviz/website/./js/main/modules/options/components/StickyShadow.tsx","webpack://@finviz/website/./js/main/modules/options/constants/columns.tsx","webpack://@finviz/website/./js/main/modules/options/constants/common.ts","webpack://@finviz/website/./js/main/modules/quote/components/QuoteOptionsTabMenu.tsx","webpack://@finviz/website/./js/main/modules/options/components/OptionsViewSwitcher.tsx","webpack://@finviz/website/./js/main/modules/options/hooks/useOptionsQuery.ts","webpack://@finviz/website/./js/main/modules/options/components/PriceRow.tsx","webpack://@finviz/website/./js/main/modules/options/components/TableColumn.tsx","webpack://@finviz/website/./js/main/modules/options/components/ChainTable.tsx","webpack://@finviz/website/./js/main/modules/options/utils/options.ts","webpack://@finviz/website/./js/main/modules/options/components/FilterSelect.tsx","webpack://@finviz/website/./js/main/modules/options/components/DateFilter.tsx","webpack://@finviz/website/./js/main/modules/options/components/StrikeFilter.tsx","webpack://@finviz/website/./js/main/modules/options/components/ViewFooter.tsx","webpack://@finviz/website/./js/main/modules/options/hooks/useOptionsSortChange.ts","webpack://@finviz/website/./js/main/modules/options/hooks/useOptionsSortOrder.ts","webpack://@finviz/website/./js/main/modules/options/routes/ChainRoute.tsx","webpack://@finviz/website/./js/main/modules/options/components/OptionsTable.tsx","webpack://@finviz/website/./js/main/modules/options/routes/ListRoute.tsx","webpack://@finviz/website/./js/main/modules/options/routes/PlotRoute.tsx","webpack://@finviz/website/./js/main/modules/options/index.tsx","webpack://@finviz/website/./js/main/modules/options/types.tsx","webpack://@finviz/website/./js/main/modules/options/utils/query.ts","webpack://@finviz/website/./js/main/modules/quote/components/QuoteStickySubMenu.tsx","webpack://@finviz/website/../node_modules/core-js/modules/es.array.find-last-index.js"],"sourcesContent":["import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonComponentProps, ButtonProps } from './button'\r\nimport { Paragraph } from './typography'\r\n\r\ninterface Props {\r\n children: (React.ReactElement | null)[]\r\n label?: string\r\n size?: ButtonProps['size']\r\n rounding?: ButtonProps['rounding']\r\n}\r\n\r\nexport function ChipSwitch({ children, label, size, rounding }: Props) {\r\n return (\r\n
\r\n {label && (\r\n \r\n {label}\r\n \r\n )}\r\n\r\n {React.Children.map(children, (child: React.ReactElement | null) => {\r\n if (React.isValidElement(child) && child.type === Button) {\r\n return React.cloneElement(child, {\r\n size,\r\n rounding,\r\n theme: child.props.theme ?? 'chipTransparent',\r\n className: classnames(child.props.className, {\r\n // @todo - these style should be applied globally onto all chipTransparent buttons\r\n '!text-gray-600 dark:!text-gray-400': !child.props.disabled && !child.props.active,\r\n '!text-gray-800 dark:!text-white': !child.props.disabled && child.props.active,\r\n '!text-gray-400 ': child.props.disabled && !child.props.active,\r\n '!text-gray-400 !bg-gray-200 !bg-opacity-30 !border-gray-100 dark:!bg-gray-600 dark:!border-gray-500':\r\n child.props.disabled && child.props.active,\r\n }),\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
\r\n )\r\n}\r\n\r\nexport const ChipSwitchButton = Button\r\n","import classNames from 'classnames'\r\nimport { isRedesignEnabled } from 'finviz-charts/app/utils'\r\nimport * as React from 'react'\r\n\r\ninterface Props extends React.HTMLProps {\r\n leftContent?: React.ReactNode\r\n middleContent?: React.ReactNode\r\n rightContent?: React.ReactNode\r\n}\r\n\r\nexport function SubMenu({ leftContent, middleContent, rightContent, ...props }: Props) {\r\n return (\r\n
\r\n
\r\n \r\n {leftContent}\r\n
\r\n {middleContent &&
{middleContent}
}\r\n
{rightContent}
\r\n
\r\n \r\n )\r\n}\r\n","import { Link } from 'react-router-dom'\r\n\r\nimport { Button, ButtonSizeType } from '../button'\r\n\r\ninterface Props {\r\n items: Array<{ label: string; href: string; isActive: boolean; reloadDocument?: boolean }>\r\n size?: ButtonSizeType\r\n}\r\n\r\nexport function SubMenuTabs({ items, size = 'medium' }: Props) {\r\n return (\r\n
\r\n {items.map(({ label, href, isActive, reloadDocument }) => (\r\n \r\n {label}\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nexport function useStickyShadow() {\r\n const stickyRef = React.useRef(null)\r\n const [isSticky, setIsSticky] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!stickyRef.current) return\r\n\r\n const onScroll = throttle(function () {\r\n const stickyElement = stickyRef.current\r\n if (!stickyElement) return\r\n\r\n const elementStickyTopOffset = parseFloat(getComputedStyle(stickyElement).top)\r\n const elementCurrentTopOffset = stickyElement.getBoundingClientRect().top\r\n\r\n setIsSticky(elementCurrentTopOffset === elementStickyTopOffset)\r\n }, 100)\r\n\r\n onScroll()\r\n document.addEventListener('scroll', onScroll)\r\n\r\n return () => {\r\n document.removeEventListener('scroll', onScroll)\r\n }\r\n }, [])\r\n\r\n return React.useMemo(\r\n () => ({\r\n stickyRef,\r\n isSticky,\r\n }),\r\n [isSticky]\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { useStickyShadow } from '../../../hooks/use-sticky-shadow'\r\n\r\nexport function StickyShadow(props: React.HTMLProps) {\r\n const { stickyRef, isSticky } = useStickyShadow()\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n","import { formatDate } from '../../../../app/header/utils'\r\nimport { RedGreenText } from '../../../components/RedGreenText'\r\nimport { TableAlign } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, RowKind, TableColumnDefinition } from '../types'\r\nimport { DATE_FORMAT_INT, DATE_FORMAT_VIEW, DATE_FORMAT_VIEW_LONG } from './common'\r\n\r\nconst NULL_VALUE = '-'\r\nconst FORMAT_SETTINGS = { defaultValue: NULL_VALUE }\r\nconst GREEK_SETTINGS = { defaultValue: NULL_VALUE, fractions: 4 }\r\n\r\nexport const columnMap: Record = Object.freeze({\r\n [ColumnId.LastClose]: {\r\n id: ColumnId.LastClose,\r\n align: TableAlign.Right,\r\n name: 'Last Close',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return args.row.lastClose === 0 ? NULL_VALUE : formatNumber(args.row.lastClose, FORMAT_SETTINGS)\r\n },\r\n },\r\n [ColumnId.ChangeUsd]: {\r\n id: ColumnId.ChangeUsd,\r\n align: TableAlign.Right,\r\n name: 'Change $',\r\n getValueForSort: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.lastClose === 0) return null\r\n return args.row.lastChange\r\n },\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.lastClose === 0) return NULL_VALUE\r\n\r\n return (\r\n \r\n {formatNumber(args.row.lastChange, { ...FORMAT_SETTINGS, showPlusSign: true })}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.ChangePct]: {\r\n id: ColumnId.ChangePct,\r\n align: TableAlign.Right,\r\n name: 'Change %',\r\n getValueForSort: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (typeof args.row.lastClose !== 'number' || args.row.lastClose === 0) return null\r\n const prevClose = args.row.lastClose - args.row.lastChange\r\n return (args.row.lastClose / prevClose - 1) * 100\r\n },\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (typeof args.row.lastClose !== 'number' || args.row.lastClose === 0) return NULL_VALUE\r\n\r\n const prevClose = args.row.lastClose - args.row.lastChange\r\n const change = (args.row.lastClose / prevClose - 1) * 100\r\n\r\n return (\r\n \r\n {formatNumber(change, { ...FORMAT_SETTINGS, showPlusSign: true })}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.BidPrice]: {\r\n id: ColumnId.BidPrice,\r\n align: TableAlign.Right,\r\n name: 'Bid',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.bidPrice === 0) return NULL_VALUE\r\n return formatNumber(args.row.bidPrice, FORMAT_SETTINGS)\r\n },\r\n },\r\n [ColumnId.AskPrice]: {\r\n id: ColumnId.AskPrice,\r\n align: TableAlign.Right,\r\n name: 'Ask',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.askPrice === 0) return NULL_VALUE\r\n return formatNumber(args.row.askPrice, FORMAT_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Volume]: {\r\n id: ColumnId.Volume,\r\n align: TableAlign.Right,\r\n name: 'Volume',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return formatNumber(args.row.lastVolume, { ...FORMAT_SETTINGS, fractions: 0 })\r\n },\r\n },\r\n [ColumnId.OpenInterest]: {\r\n id: ColumnId.OpenInterest,\r\n align: TableAlign.Right,\r\n name: 'Open Int.',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return formatNumber(args.row.openInterest, { ...FORMAT_SETTINGS, fractions: 0 })\r\n },\r\n },\r\n [ColumnId.StrikePrice]: {\r\n id: ColumnId.StrikePrice,\r\n align: TableAlign.Right,\r\n name: 'Strike',\r\n className: 'w-28',\r\n renderColumn: (args) => formatNumber(args.row.strike, FORMAT_SETTINGS),\r\n },\r\n [ColumnId.ExpirationDate]: {\r\n id: ColumnId.ExpirationDate,\r\n align: TableAlign.Right,\r\n name: 'Expiry',\r\n className: 'w-28',\r\n renderColumn: (args) => formatDate(args.row.exDate, DATE_FORMAT_INT, DATE_FORMAT_VIEW),\r\n },\r\n [ColumnId.ContractName]: {\r\n id: ColumnId.ContractName,\r\n align: TableAlign.Left,\r\n name: 'Contract Name',\r\n className: 'w-44',\r\n getValueForSort: (args) => `${args.ticker}${args.row.exDate}${args.row.strike}`,\r\n renderColumn: (args) => {\r\n if (!args.row) return NULL_VALUE\r\n const strike = (args.row.strike * 1000).toString().padStart(8, '0')\r\n\r\n return (\r\n \r\n {args.ticker?.replace('-', '')}\r\n {args.row.exDate}\r\n {args.kind === RowKind.Call ? 'C' : 'P'}\r\n {strike}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.LastTrade]: {\r\n id: ColumnId.LastTrade,\r\n align: TableAlign.Right,\r\n name: 'Last Trade',\r\n className: 'w-44',\r\n getValueForSort: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return new Date(args.row.lastTime)\r\n },\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.lastClose === 0) return NULL_VALUE\r\n return formatDate(new Date(args.row.lastTime), DATE_FORMAT_VIEW_LONG)\r\n },\r\n },\r\n [ColumnId.IV]: {\r\n id: ColumnId.IV,\r\n align: TableAlign.Right,\r\n name: 'IV',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.iv) return NULL_VALUE\r\n return formatNumber(args.row.iv * 100, FORMAT_SETTINGS) + '%'\r\n },\r\n },\r\n [ColumnId.Delta]: {\r\n id: ColumnId.Delta,\r\n align: TableAlign.Right,\r\n name: 'Delta',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.delta) return NULL_VALUE\r\n return formatNumber(args.row.delta, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Gamma]: {\r\n id: ColumnId.Gamma,\r\n align: TableAlign.Right,\r\n name: 'Gamma',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.gamma) return NULL_VALUE\r\n return formatNumber(args.row.gamma, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Theta]: {\r\n id: ColumnId.Theta,\r\n align: TableAlign.Right,\r\n name: 'Theta',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.theta) return NULL_VALUE\r\n return formatNumber(args.row.theta, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Vega]: {\r\n id: ColumnId.Vega,\r\n align: TableAlign.Right,\r\n name: 'Vega',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.vega) return NULL_VALUE\r\n return formatNumber(args.row.vega, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Rho]: {\r\n id: ColumnId.Rho,\r\n align: TableAlign.Right,\r\n name: 'Rho',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.rho) return NULL_VALUE\r\n return formatNumber(args.row.rho, GREEK_SETTINGS)\r\n },\r\n },\r\n})\r\n","export const DATE_FORMAT_DB = 'yyyy-MM-dd'\r\nexport const DATE_FORMAT_INT = 'yyMMdd'\r\nexport const DATE_FORMAT_VIEW = 'MM/dd/yyyy'\r\nexport const DATE_FORMAT_VIEW_LONG = 'MMM dd, yyyy, hh:mm a'\r\nexport const DATE_FORMAT_SCATTER_PLOT = '%m/%d/%Y'\r\nexport const LINK_COLUMN_NAME = 'link'\r\n","import { decodeQueryString, encodeQueryString } from '../../../../app/queryString'\r\nimport { SubMenuTabs } from '../../../components/SubMenu/SubMenuTabs'\r\nimport { OptionsSubpage, OptionsView } from '../../options/types'\r\nimport { QuoteSubview } from '../types'\r\n\r\nconst OPTIONS_SECTION_LABELS = {\r\n [QuoteSubview.OptionsChain]: 'Prices',\r\n [QuoteSubview.OptionsVolatility]: 'Volatility & Greeks',\r\n}\r\n\r\nconst OPTIONS_MENU_TABS: Array = [\r\n QuoteSubview.OptionsChain,\r\n QuoteSubview.OptionsVolatility,\r\n]\r\n\r\nfunction getProperOV(ty: string, ov: string): string {\r\n if (ty === OptionsSubpage.Volatility && ov === OptionsView.Plot) {\r\n return OptionsView.ChainByDate\r\n }\r\n return ov\r\n}\r\n\r\nfunction getOptionsMenuTabs() {\r\n const searchParams = decodeQueryString()\r\n\r\n return OPTIONS_MENU_TABS.map((value) => ({\r\n label: OPTIONS_SECTION_LABELS[value],\r\n href: `/quote.ashx?${encodeQueryString({\r\n ...searchParams,\r\n ty: value,\r\n ov: getProperOV(value, searchParams.ov),\r\n })}`,\r\n isActive: searchParams.ty === value,\r\n reloadDocument: true,\r\n }))\r\n}\r\n\r\nexport function QuoteOptionsTabMenu() {\r\n return \r\n}\r\n","import * as React from 'react'\r\nimport { Link, useSearchParams } from 'react-router-dom'\r\n\r\nimport { ChipSwitch, ChipSwitchButton } from '../../../components/ChipSwitch'\r\nimport { OptionsQuery, OptionsSubpage, OptionsView } from '../types'\r\n\r\nexport function OptionsViewSwitcher({ activeView, subpage }: { activeView: OptionsView; subpage: OptionsSubpage }) {\r\n const [searchParams] = useSearchParams()\r\n\r\n const chainLink = React.useMemo(() => {\r\n const newParams = new URLSearchParams(searchParams)\r\n newParams.set(\r\n OptionsQuery.View,\r\n [OptionsView.ChainByStrike, OptionsView.ListByStrike].includes(newParams.get(OptionsQuery.View) as OptionsView)\r\n ? OptionsView.ChainByStrike\r\n : OptionsView.ChainByDate\r\n )\r\n return newParams\r\n }, [searchParams])\r\n\r\n const listLink = React.useMemo(() => {\r\n const newParams = new URLSearchParams(searchParams)\r\n newParams.set(\r\n OptionsQuery.View,\r\n [OptionsView.ChainByStrike, OptionsView.ListByStrike].includes(newParams.get(OptionsQuery.View) as OptionsView)\r\n ? OptionsView.ListByStrike\r\n : OptionsView.ListByDate\r\n )\r\n return newParams\r\n }, [searchParams])\r\n\r\n const plotLink = React.useMemo(() => {\r\n const newParams = new URLSearchParams(searchParams)\r\n newParams.set(OptionsQuery.View, OptionsView.Plot)\r\n newParams.delete(OptionsQuery.Strike)\r\n newParams.delete(OptionsQuery.Expiry)\r\n return newParams\r\n }, [searchParams])\r\n\r\n return (\r\n \r\n \r\n Chain\r\n \r\n \r\n List\r\n \r\n {subpage === OptionsSubpage.Prices ? (\r\n \r\n 3D\r\n \r\n ) : null}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { OptionsParsedQuery, parseOptionsQuery } from '../utils/query'\r\n\r\nexport function useOptionsQuery(params: URLSearchParams): OptionsParsedQuery {\r\n return React.useMemo(() => parseOptionsQuery(params), [params])\r\n}\r\n","import { getDate, getFormattedDateString } from '../../../../app/header/utils'\r\nimport { TableAlign, TableCell, TableRow } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\n\r\ninterface PriceRowProps {\r\n /**\r\n * Price to show\r\n */\r\n lastClose: number | null\r\n\r\n /**\r\n * Date when the last price was valid to.\r\n *\r\n * @default current time\r\n */\r\n lastTime: number | null\r\n\r\n /**\r\n * Column span for the left column with date\r\n */\r\n leftSpan?: number\r\n\r\n /**\r\n * Column span for the right column, which is empty\r\n */\r\n rightSpan?: number\r\n\r\n priceAlign?: TableAlign\r\n\r\n /**\r\n * Show additional empty cells around lastClose cell\r\n */\r\n showAdditionalCells?: boolean\r\n}\r\n\r\nexport function PriceRow({\r\n lastClose,\r\n lastTime,\r\n leftSpan,\r\n rightSpan,\r\n priceAlign = TableAlign.Center,\r\n showAdditionalCells = true,\r\n}: PriceRowProps) {\r\n if (lastTime === null || lastClose === null) return null\r\n\r\n const date = getDate(lastTime * 1000)\r\n const formattedDate = getFormattedDateString(date, 'dateOnly')\r\n const formattedTime = getFormattedDateString(date, 'timeOnly')\r\n\r\n return (\r\n \r\n \r\n Price {formattedDate}{' '}\r\n {formattedTime} ET\r\n \r\n {showAdditionalCells && }\r\n \r\n {formatNumber(lastClose)}\r\n \r\n {showAdditionalCells && }\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { TableCell, TableCellProps } from '../../../components/Table'\r\n\r\nexport interface OptionsTableCellProps extends TableCellProps {\r\n isHighlighted?: boolean\r\n isBorderVisible?: boolean\r\n}\r\n\r\nexport function OptionsTableCell({\r\n isFirst,\r\n isLast,\r\n isHighlighted,\r\n isBorderVisible = true,\r\n ...props\r\n}: OptionsTableCellProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\nimport { Link, useLocation, useSearchParams } from 'react-router-dom'\r\n\r\nimport {\r\n Table,\r\n TableAlign,\r\n TableBody,\r\n TableHead,\r\n TableHeaderSortable,\r\n TableRow,\r\n getDefaultSortFromUrl,\r\n useTableSort,\r\n} from '../../../components/Table'\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection, SortableValue } from '../../../types'\r\nimport { columnMap } from '../constants/columns'\r\nimport { ColumnId, Option, OptionRow, OptionsSubpage, RowKind, TableColumnDefinition } from '../types'\r\nimport { mergeOptionsBy } from '../utils/options'\r\nimport { getViewLink } from '../utils/query'\r\nimport { PriceRow } from './PriceRow'\r\nimport { OptionsTableCell, OptionsTableCellProps } from './TableColumn'\r\n\r\nexport interface ChainTableColumn extends Omit {\r\n /**\r\n * The sort hook internally compares `id` key, and because we have the same\r\n * columns on each side, we need them to be unique, so we keep the original id\r\n */\r\n id: string\r\n originalId: ColumnId\r\n /**\r\n * Used in sorting to distinguish between calls and puts columns\r\n */\r\n rowKind: RowKind\r\n}\r\n\r\nconst CALL_OPTION_COLUMNS: ChainTableColumn[] = [\r\n ColumnId.LastClose,\r\n ColumnId.ChangeUsd,\r\n ColumnId.ChangePct,\r\n ColumnId.BidPrice,\r\n ColumnId.AskPrice,\r\n ColumnId.Volume,\r\n ColumnId.OpenInterest,\r\n].map((id) => ({\r\n ...columnMap[id],\r\n originalId: id,\r\n id: `call_${columnMap[id].id}`,\r\n rowKind: RowKind.Call,\r\n className: classnames({\r\n 'w-22 xl:w-auto': id === ColumnId.LastClose,\r\n 'w-20 xl:w-auto': [ColumnId.ChangeUsd, ColumnId.OpenInterest].includes(id),\r\n 'hidden xl:table-cell': id === ColumnId.ChangePct,\r\n }),\r\n}))\r\n\r\nconst PUT_OPTION_COLUMNS: ChainTableColumn[] = CALL_OPTION_COLUMNS.map((option) => ({\r\n ...option,\r\n id: `put_${option.originalId}`,\r\n originalId: option.originalId,\r\n rowKind: RowKind.Put,\r\n}))\r\n\r\nconst CALL_OPTION_GREEK_COLUMNS: ChainTableColumn[] = [\r\n ColumnId.LastClose,\r\n ColumnId.IV,\r\n ColumnId.Delta,\r\n ColumnId.Gamma,\r\n ColumnId.Theta,\r\n ColumnId.Vega,\r\n ColumnId.Rho,\r\n].map((id) => ({\r\n ...columnMap[id],\r\n originalId: id,\r\n id: `call_${columnMap[id].id}`,\r\n rowKind: RowKind.Call,\r\n className: classnames({\r\n 'w-22 xl:w-auto': id === ColumnId.LastClose,\r\n 'w-20 xl:w-auto': [ColumnId.ChangeUsd, ColumnId.OpenInterest].includes(id),\r\n 'hidden xl:table-cell': id === ColumnId.ChangePct,\r\n }),\r\n}))\r\n\r\nconst PUT_OPTION_GREEK_COLUMNS: ChainTableColumn[] = CALL_OPTION_GREEK_COLUMNS.map((option) => ({\r\n ...option,\r\n id: `put_${option.originalId}`,\r\n originalId: option.originalId,\r\n rowKind: RowKind.Put,\r\n}))\r\n\r\nconst FULL_COLUMNS_BREAKPOINT = 1280\r\n\r\nfunction valueGetter(column: ChainTableColumn) {\r\n return (row: OptionRow) => {\r\n const customValueGetter = typeof column.getValueForSort === 'function' ? column.getValueForSort : undefined\r\n\r\n switch (column.rowKind) {\r\n case RowKind.OptionRow:\r\n if (customValueGetter) {\r\n return customValueGetter({ kind: RowKind.OptionRow, row })\r\n } else {\r\n return (row[column.originalId as keyof typeof row] as SortableValue) ?? null\r\n }\r\n case RowKind.Call:\r\n if (row.call && customValueGetter) {\r\n return customValueGetter({ kind: RowKind.Call, row: row.call })\r\n } else {\r\n return row.call?.[column.originalId as keyof Option] ?? null\r\n }\r\n case RowKind.Put:\r\n if (row.put && customValueGetter) {\r\n return customValueGetter({ kind: RowKind.Put, row: row.put })\r\n } else {\r\n return row.put?.[column.originalId as keyof Option] ?? null\r\n }\r\n default:\r\n return null\r\n }\r\n }\r\n}\r\n\r\ninterface ChainTableProps {\r\n className?: string\r\n\r\n /**\r\n * Type of table, display either prices or volatility & greeks\r\n */\r\n subpage: OptionsSubpage\r\n\r\n /**\r\n * Options rows which are displayed in the table.\r\n */\r\n data: Option[]\r\n\r\n /**\r\n * `id` of the column which is displayed as the middle column between\r\n * calls and puts.\r\n *\r\n * @default ColumnId.StrikePrice\r\n */\r\n middleColumn?: ColumnId.StrikePrice | ColumnId.ExpirationDate\r\n\r\n /**\r\n * When enabled, a row with current price will be added to the table at the\r\n * position of the price. The row will only be visible when ordering by the\r\n * middle column.\r\n *\r\n * @default middleColumn === ColumnId.StrikePrice\r\n */\r\n isPriceRowEnabled?: boolean\r\n\r\n /**\r\n * Last close for current ticker. Used to add highlight on calls/puts and as\r\n * a row in the middle of the table which displays the current price.\r\n */\r\n lastClose: number | null\r\n\r\n /**\r\n * Time when the `lastClose` was valid. Displayed in current price row.\r\n */\r\n lastTime: number | null\r\n\r\n /**\r\n * Whether headers should become sticky\r\n */\r\n isHeaderSticky?: boolean\r\n headerClass?: string\r\n\r\n /**\r\n * Sorting key (column id, with optional dash prefix for descending)\r\n */\r\n tableOrder: string\r\n\r\n onSortChange?: (\r\n column: ChainTableColumn,\r\n sort: SortByShape,\r\n changeSort: (newSort: ChainTableColumn, direction?: SortDirection) => void\r\n ) => void\r\n}\r\n\r\nexport function ChainTable({\r\n className,\r\n data,\r\n lastClose,\r\n lastTime,\r\n middleColumn = ColumnId.StrikePrice,\r\n isPriceRowEnabled = middleColumn === ColumnId.StrikePrice,\r\n isHeaderSticky,\r\n headerClass,\r\n subpage,\r\n tableOrder,\r\n onSortChange,\r\n}: ChainTableProps) {\r\n const CALL_COLUMNS = subpage === OptionsSubpage.Volatility ? CALL_OPTION_GREEK_COLUMNS : CALL_OPTION_COLUMNS\r\n const PUT_COLUMNS = subpage === OptionsSubpage.Volatility ? PUT_OPTION_GREEK_COLUMNS : PUT_OPTION_COLUMNS\r\n const [columnsLength, setColumnsLength] = React.useState(CALL_COLUMNS.length)\r\n const [searchParams] = useSearchParams()\r\n const tickerLastClose = lastClose ?? 0\r\n const location = useLocation()\r\n\r\n React.useEffect(() => {\r\n const updateColumnsLength = () => {\r\n if (window.innerWidth >= FULL_COLUMNS_BREAKPOINT && columnsLength === CALL_COLUMNS.length - 1) {\r\n setColumnsLength(CALL_COLUMNS.length)\r\n } else if (window.innerWidth < FULL_COLUMNS_BREAKPOINT && columnsLength === CALL_COLUMNS.length) {\r\n setColumnsLength(CALL_COLUMNS.length - 1)\r\n }\r\n }\r\n\r\n updateColumnsLength()\r\n window.addEventListener('resize', updateColumnsLength)\r\n\r\n return () => {\r\n window.removeEventListener('resize', updateColumnsLength)\r\n }\r\n })\r\n\r\n const middleColumnDefinition = React.useMemo(\r\n () => ({\r\n ...columnMap[middleColumn],\r\n originalId: middleColumn,\r\n rowKind: RowKind.OptionRow,\r\n }),\r\n [middleColumn]\r\n )\r\n\r\n const allColumns = React.useMemo(\r\n () => [...CALL_COLUMNS, middleColumnDefinition, ...PUT_COLUMNS],\r\n [CALL_COLUMNS, PUT_COLUMNS, middleColumnDefinition]\r\n )\r\n\r\n const mergedData = React.useMemo(() => mergeOptionsBy(data, middleColumn), [data, middleColumn])\r\n const {\r\n data: tableRows,\r\n sort,\r\n changeSort,\r\n } = useTableSort({\r\n data: mergedData,\r\n columns: allColumns,\r\n defaultSort: getDefaultSortFromUrl(allColumns, tableOrder),\r\n valueGetter,\r\n key: location.key,\r\n })\r\n\r\n /**\r\n * We display current price as a row between strike prices\r\n */\r\n const currentPriceRow = React.useMemo(() => {\r\n const isVisible = isPriceRowEnabled && sort.column.id === middleColumnDefinition.id\r\n\r\n if (!isVisible) return { isVisible, rowIndex: -1 }\r\n\r\n const rowIndex =\r\n sort.direction === SortDirection.Ascending\r\n ? tableRows.findLastIndex((option) => option.strike < tickerLastClose)\r\n : tableRows.findLastIndex((option) => option.strike > tickerLastClose)\r\n\r\n return { isVisible, index: rowIndex }\r\n }, [isPriceRowEnabled, sort.column.id, sort.direction, middleColumnDefinition.id, tableRows, tickerLastClose])\r\n\r\n const priceRowProps = React.useMemo(\r\n () => ({\r\n lastClose: tickerLastClose,\r\n lastTime,\r\n leftSpan: columnsLength,\r\n rightSpan: columnsLength,\r\n }),\r\n [tickerLastClose, lastTime, columnsLength]\r\n )\r\n\r\n return (\r\n \r\n \r\n {CALL_COLUMNS.map((column) => (\r\n {\r\n typeof onSortChange === 'function' ? onSortChange(column, sort, changeSort) : changeSort(column)\r\n }}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n\r\n
\r\n {\r\n typeof onSortChange === 'function'\r\n ? onSortChange(middleColumnDefinition, sort, changeSort)\r\n : changeSort(middleColumnDefinition)\r\n }}\r\n className=\"w-28\"\r\n >\r\n {middleColumnDefinition.name}\r\n \r\n \r\n\r\n {PUT_COLUMNS.map((column) => (\r\n {\r\n typeof onSortChange === 'function' ? onSortChange(column, sort, changeSort) : changeSort(column)\r\n }}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n\r\n {currentPriceRow.isVisible && currentPriceRow.index < 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n {tableRows.map((option, index) => {\r\n const isCurrentPriceRow = currentPriceRow.isVisible && currentPriceRow.index === index\r\n const showPriceAfter = isCurrentPriceRow && currentPriceRow.index < tableRows.length - 1\r\n const columnClass = classnames({ 'border-b': showPriceAfter })\r\n const middleLink = getViewLink(middleColumn, searchParams, option)\r\n\r\n const row = (\r\n \r\n {option.call ? (\r\n \r\n ) : (\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {middleColumnDefinition.renderColumn({ kind: RowKind.OptionRow, row: option })}\r\n \r\n \r\n \r\n\r\n {option.put ? (\r\n tickerLastClose}\r\n className={columnClass}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n )\r\n\r\n if (showPriceAfter) {\r\n return (\r\n \r\n {row}\r\n {showPriceAfter && }\r\n \r\n )\r\n }\r\n\r\n return row\r\n })}\r\n \r\n\r\n {currentPriceRow.isVisible && currentPriceRow.index === tableRows.length - 1 && (\r\n \r\n \r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\ninterface ChainOptionRowProps extends Omit {\r\n columns: ChainTableColumn[]\r\n kind: RowKind.Call | RowKind.Put\r\n option: Option\r\n isHighlighted?: boolean\r\n}\r\n\r\nfunction ChainOptionRow({ columns, kind, option, isHighlighted, className, ...props }: ChainOptionRowProps) {\r\n return (\r\n <>\r\n {columns.map((column, index) => {\r\n const isFirst = index === 0\r\n const isLast = index === columns.length - 1\r\n\r\n return (\r\n \r\n {column.renderColumn({ kind, row: option })}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import { ColumnId, Option, OptionRow, OptionType } from '../types'\r\n\r\nexport function mergeOptionsBy(options: Option[], mergeBy: ColumnId.StrikePrice | ColumnId.ExpirationDate) {\r\n const result: OptionRow[] = []\r\n const sorted = options.slice().sort((a, b) => a[mergeBy] - b[mergeBy])\r\n\r\n for (const option of sorted) {\r\n let last = result[result.length - 1]\r\n if (last?.[mergeBy] !== option[mergeBy]) {\r\n last = { strike: option.strike, exDate: option.exDate, call: null, put: null }\r\n result.push(last)\r\n }\r\n\r\n if (option.type === OptionType.Call) {\r\n last.call = option\r\n } else {\r\n last.put = option\r\n }\r\n }\r\n\r\n return result\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Select, SelectItem } from '../../../components'\r\nimport { columnMap } from '../constants/columns'\r\nimport { ColumnId } from '../types'\r\n\r\ninterface FilterSelectProps {\r\n filterColumn: ColumnId\r\n selected?: ValueType\r\n options: Array>\r\n onChange: (value: SelectItem) => void\r\n}\r\n\r\nexport function FilterSelect({\r\n filterColumn,\r\n selected,\r\n options,\r\n onChange,\r\n}: FilterSelectProps) {\r\n /**\r\n * `selected` comes from loader. We set the selection to state in order to have\r\n * immediate response to user action. We also need to set the selection in an effect\r\n * so that back/forward works correctly.\r\n */\r\n const [filterValue, setFilterValue] = React.useState(selected)\r\n React.useEffect(() => {\r\n setFilterValue(selected)\r\n }, [selected])\r\n\r\n return (\r\n {\r\n setFilterValue(item.value)\r\n onChange(item)\r\n }}\r\n />\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { formatDate } from '../../../../app/header/utils'\r\nimport { DATE_FORMAT_DB, DATE_FORMAT_VIEW } from '../constants/common'\r\nimport { ColumnId, OptionsQuery } from '../types'\r\nimport { FilterSelect } from './FilterSelect'\r\n\r\nexport function DateFilter({ currentExpiry, expiries }: { currentExpiry: string; expiries: string[] }) {\r\n const [, setSearchParams] = useSearchParams()\r\n\r\n const filterOptions = React.useMemo(\r\n () => expiries.map((option) => ({ label: formatDate(option, DATE_FORMAT_DB, DATE_FORMAT_VIEW), value: option })),\r\n [expiries]\r\n )\r\n\r\n return (\r\n {\r\n setSearchParams((prev) => {\r\n const newQuery = new URLSearchParams(prev)\r\n newQuery.set(OptionsQuery.Expiry, option.value)\r\n return newQuery\r\n })\r\n }}\r\n />\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, OptionsQuery } from '../types'\r\nimport { FilterSelect } from './FilterSelect'\r\n\r\nexport function StrikeFilter({ currentStrike, strikes }: { currentStrike: number; strikes: number[] }) {\r\n const [, setSearchParams] = useSearchParams()\r\n\r\n const filterOptions = React.useMemo(\r\n () => strikes.map((option) => ({ label: '$ ' + formatNumber(option), value: option })),\r\n [strikes]\r\n )\r\n\r\n return (\r\n {\r\n setSearchParams((prev) => {\r\n const newQuery = new URLSearchParams(prev)\r\n newQuery.set(OptionsQuery.Strike, option.value.toString())\r\n return newQuery\r\n })\r\n }}\r\n />\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { parseOptionsQuery } from '../utils/query'\r\n\r\nexport default function ViewFooter({ className }: { className?: string }) {\r\n const [searchParams] = useSearchParams()\r\n const { ticker, expiry, strike } = parseOptionsQuery(searchParams)\r\n\r\n const exportUrl = React.useMemo(\r\n () =>\r\n 'export/options?' +\r\n new URLSearchParams({\r\n t: ticker,\r\n e: expiry ?? '',\r\n s: strike ? strike.toString() : '',\r\n }),\r\n [ticker, expiry, strike]\r\n )\r\n\r\n return (\r\n
\r\n Options delayed 15 minutes\r\n {\r\n window.gtag && window.gtag('event', 'download', { event_category: 'export' })\r\n }}\r\n >\r\n export\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { LINK_COLUMN_NAME } from '../constants/common'\r\nimport { OptionsQuery, OptionsSubpage } from '../types'\r\nimport { OptionsParsedQuery, orderToString } from '../utils/query'\r\n\r\nexport function useOptionsSortChange(\r\n subpage: OptionsSubpage,\r\n query: OptionsParsedQuery\r\n) {\r\n const navigate = useNavigate()\r\n return React.useCallback(\r\n (\r\n column: SortColumnType,\r\n sort: SortByShape,\r\n changeSort: (newSort: SortColumnType, direction?: SortDirection) => void,\r\n prefix: string = '',\r\n isLinkColumn: boolean = false\r\n ) => {\r\n const newQuery = new URLSearchParams(query.params)\r\n const urlColumnId = isLinkColumn ? LINK_COLUMN_NAME : column.id\r\n const urlOrderValue =\r\n sort.column.id === column.id && sort.direction === SortDirection.Ascending\r\n ? `-${prefix}${urlColumnId}`\r\n : `${prefix}${urlColumnId}`\r\n\r\n const newOrder = { ...query.order, [subpage]: urlOrderValue }\r\n\r\n newQuery.set(OptionsQuery.Order, orderToString(newOrder))\r\n changeSort(column)\r\n navigate(`?${newQuery}`, { preventScrollReset: true })\r\n },\r\n [navigate, query.order, query.params, subpage]\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { OptionsSubpage } from '../types'\r\nimport { OptionsParsedQuery } from '../utils/query'\r\n\r\nexport function useOptionsSortOrder(subpage: OptionsSubpage, query: OptionsParsedQuery, defaultOrder: string) {\r\n return React.useMemo(() => {\r\n if (query.order[subpage]) {\r\n return query.order[subpage]\r\n }\r\n return defaultOrder\r\n }, [defaultOrder, query, subpage])\r\n}\r\n","import { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { ChainTable, ChainTableColumn } from '../components/ChainTable'\r\nimport { DateFilter } from '../components/DateFilter'\r\nimport { StickyShadow } from '../components/StickyShadow'\r\nimport { StrikeFilter } from '../components/StrikeFilter'\r\nimport ViewFooter from '../components/ViewFooter'\r\nimport { columnMap } from '../constants/columns'\r\nimport { useOptionsQuery } from '../hooks/useOptionsQuery'\r\nimport { useOptionsSortChange } from '../hooks/useOptionsSortChange'\r\nimport { useOptionsSortOrder } from '../hooks/useOptionsSortOrder'\r\nimport { ColumnId, OptionsByDateLoader, OptionsByStrikeLoader, OptionsView } from '../types'\r\nimport { evalLinkOrder } from '../utils/query'\r\n\r\nexport function ChainRoute({ options, lastClose, lastTime, ...props }: OptionsByDateLoader | OptionsByStrikeLoader) {\r\n const middleColumn = props.view === OptionsView.ChainByDate ? ColumnId.StrikePrice : ColumnId.ExpirationDate\r\n const filterColumn = props.view === OptionsView.ChainByDate ? ColumnId.ExpirationDate : ColumnId.StrikePrice\r\n const [searchParams] = useSearchParams()\r\n const query = useOptionsQuery(searchParams)\r\n const tableOrder = useOptionsSortOrder(props.subpage, query, middleColumn)\r\n const effectiveTableOrder = evalLinkOrder(tableOrder, middleColumn)\r\n const optionsSortChange = useOptionsSortChange(props.subpage, query)\r\n\r\n const handleSortChange = (\r\n column: ChainTableColumn,\r\n sort: SortByShape,\r\n changeSort: (newSort: any, direction?: SortDirection) => void\r\n ) => optionsSortChange(column, sort, changeSort, '', column.id === middleColumn)\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n
\r\n

Calls

\r\n
{columnMap[filterColumn].name}
\r\n
\r\n
\r\n {props.view === OptionsView.ChainByDate && (\r\n \r\n )}\r\n {props.view === OptionsView.ChainByStrike && (\r\n \r\n )}\r\n
\r\n
\r\n

Puts

\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n handleSortChange(column, sort, changeSort)}\r\n />\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport {\r\n Table,\r\n TableAlign,\r\n TableBody,\r\n TableHead,\r\n TableHeaderSortable,\r\n TableRow,\r\n getDefaultSortFromUrl,\r\n useTableSortWithAutoupdate,\r\n} from '../../../components/Table'\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { CallKind, ColumnId, ColumnRendererProps, Option, RowKind, TableColumnDefinition } from '../types'\r\nimport { PriceRow } from './PriceRow'\r\nimport { OptionsTableCell } from './TableColumn'\r\n\r\nfunction defaultColumnRenderer(column: TableColumnDefinition, props: ColumnRendererProps) {\r\n return column.renderColumn(props)\r\n}\r\n\r\nfunction getColumnValueGetter(kind: RowKind, ticker?: string | null, lastClose?: number | null) {\r\n return (column: TableColumnDefinition) => (row: Option) => {\r\n if (typeof column.getValueForSort === 'function') {\r\n return column.getValueForSort({ kind, lastClose, row } as CallKind)\r\n }\r\n\r\n return row[column.id as keyof typeof row] ?? null\r\n }\r\n}\r\n\r\ninterface OptionsTableProps {\r\n kind?: RowKind\r\n ticker: string | null\r\n lastClose?: number | null\r\n lastTime?: number | null\r\n options: Option[]\r\n columns: TableColumnDefinition[]\r\n isPriceRowEnabled?: boolean\r\n\r\n /**\r\n * Sorting key (column id, with optional dash prefix for descending)\r\n */\r\n tableOrder: string\r\n\r\n /**\r\n * Whether headers should become sticky\r\n */\r\n isHeaderSticky?: boolean\r\n headerClass?: string\r\n\r\n renderColumn?: (column: TableColumnDefinition, props: ColumnRendererProps) => React.ReactNode\r\n\r\n onSortChange?: (\r\n column: TableColumnDefinition,\r\n sort: SortByShape,\r\n changeSort: (newSort: TableColumnDefinition, direction?: SortDirection) => void\r\n ) => void\r\n}\r\n\r\nexport function OptionsTable({\r\n kind = RowKind.Call,\r\n ticker,\r\n lastClose,\r\n lastTime,\r\n columns,\r\n options,\r\n isPriceRowEnabled = true,\r\n tableOrder,\r\n isHeaderSticky,\r\n headerClass,\r\n renderColumn = defaultColumnRenderer,\r\n onSortChange,\r\n}: OptionsTableProps) {\r\n const { data, sort, changeSort } = useTableSortWithAutoupdate({\r\n data: options,\r\n columns,\r\n defaultSort: getDefaultSortFromUrl(columns, tableOrder),\r\n valueGetter: getColumnValueGetter(kind, ticker, lastClose),\r\n tableOrder,\r\n })\r\n /**\r\n * We display current price as a row between strike prices\r\n */\r\n const currentPriceRow = React.useMemo(() => {\r\n const isVisible = isPriceRowEnabled && sort.column.id === ColumnId.StrikePrice\r\n\r\n if (!isVisible || typeof lastClose !== 'number') return { isVisible: false, rowIndex: -1 }\r\n\r\n const rowIndex =\r\n sort.direction === SortDirection.Ascending\r\n ? data.findLastIndex((option) => option.strike < lastClose)\r\n : data.findLastIndex((option) => option.strike > lastClose)\r\n\r\n return { isVisible: true, index: rowIndex }\r\n }, [isPriceRowEnabled, sort.column.id, sort.direction, lastClose, data])\r\n\r\n const priceRowProps = React.useMemo(\r\n () => ({\r\n lastClose: lastClose ?? null,\r\n lastTime: lastTime ?? null,\r\n leftSpan: 2,\r\n rightSpan: 7,\r\n showAdditionalCells: false,\r\n priceAlign: TableAlign.Right,\r\n }),\r\n [lastClose, lastTime]\r\n )\r\n\r\n return (\r\n \r\n \r\n {columns.map((column) => (\r\n \r\n typeof onSortChange === 'function' ? onSortChange(column, sort, changeSort) : changeSort(column)\r\n }\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n\r\n \r\n {data.map((option, rowIndex) => {\r\n const key = `${option.askPrice}-${option.exDate}-${option.strike}-${rowIndex}`\r\n const isHighlighted =\r\n typeof lastClose === 'number' &&\r\n (kind === RowKind.Call ? option.strike < lastClose : option.strike > lastClose)\r\n const isCurrentPriceRow = currentPriceRow.isVisible && currentPriceRow.index === rowIndex\r\n const showPriceAfter = isCurrentPriceRow && currentPriceRow.index < data.length - 1\r\n\r\n const row = (\r\n \r\n {columns.map((column, index) => (\r\n \r\n {renderColumn(column, { kind: kind, ticker, lastClose, row: option } as ColumnRendererProps)}\r\n \r\n ))}\r\n \r\n )\r\n\r\n if (showPriceAfter) {\r\n return (\r\n \r\n {row}\r\n {showPriceAfter && }\r\n \r\n )\r\n }\r\n\r\n return row\r\n })}\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Link, useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { DateFilter } from '../components/DateFilter'\r\nimport { OptionsTable } from '../components/OptionsTable'\r\nimport { StickyShadow } from '../components/StickyShadow'\r\nimport { StrikeFilter } from '../components/StrikeFilter'\r\nimport ViewFooter from '../components/ViewFooter'\r\nimport { columnMap } from '../constants/columns'\r\nimport { useOptionsQuery } from '../hooks/useOptionsQuery'\r\nimport { useOptionsSortChange } from '../hooks/useOptionsSortChange'\r\nimport { useOptionsSortOrder } from '../hooks/useOptionsSortOrder'\r\nimport {\r\n ColumnId,\r\n ColumnRendererProps,\r\n OptionType,\r\n OptionsByDateLoader,\r\n OptionsByStrikeLoader,\r\n OptionsSubpage,\r\n OptionsView,\r\n RowKind,\r\n TableColumnDefinition,\r\n} from '../types'\r\nimport { evalLinkOrder, getViewLink } from '../utils/query'\r\n\r\nconst LEFT_COLUMNS = [ColumnId.ContractName, ColumnId.LastTrade]\r\nconst RIGHT_PRICES_COLUMNS = [\r\n ColumnId.LastClose,\r\n ColumnId.BidPrice,\r\n ColumnId.AskPrice,\r\n ColumnId.ChangeUsd,\r\n ColumnId.ChangePct,\r\n ColumnId.Volume,\r\n ColumnId.OpenInterest,\r\n]\r\n\r\nconst RIGHT_GREEK_COLUMNS = [\r\n ColumnId.LastClose,\r\n ColumnId.IV,\r\n ColumnId.Delta,\r\n ColumnId.Gamma,\r\n ColumnId.Theta,\r\n ColumnId.Vega,\r\n ColumnId.Rho,\r\n]\r\n\r\nconst BY_DATE_PRICES_COLUMNS = [...LEFT_COLUMNS, ColumnId.StrikePrice, ...RIGHT_PRICES_COLUMNS].map(\r\n (id) => columnMap[id]\r\n)\r\nconst BY_STRIKE_PRICES_COLUMNS = [...LEFT_COLUMNS, ColumnId.ExpirationDate, ...RIGHT_PRICES_COLUMNS].map(\r\n (id) => columnMap[id]\r\n)\r\n\r\nconst BY_DATE_GREEK_COLUMNS = [...LEFT_COLUMNS, ColumnId.StrikePrice, ...RIGHT_GREEK_COLUMNS].map((id) => columnMap[id])\r\nconst BY_STRIKE_GREEK_COLUMNS = [...LEFT_COLUMNS, ColumnId.ExpirationDate, ...RIGHT_GREEK_COLUMNS].map(\r\n (id) => columnMap[id]\r\n)\r\n\r\nfunction getColumnRenderer(searchParams: URLSearchParams) {\r\n return (column: TableColumnDefinition, props: ColumnRendererProps) => {\r\n switch (column.id) {\r\n case ColumnId.StrikePrice:\r\n case ColumnId.ExpirationDate:\r\n const middleLink = getViewLink(column.id, searchParams, props.row)\r\n\r\n return (\r\n \r\n {column.renderColumn(props)}\r\n \r\n )\r\n default:\r\n return column.renderColumn(props)\r\n }\r\n }\r\n}\r\n\r\nfunction getColumns(subpage: OptionsSubpage, isByDateList: boolean): TableColumnDefinition[] {\r\n if (subpage === OptionsSubpage.Volatility) {\r\n return isByDateList ? BY_DATE_GREEK_COLUMNS : BY_STRIKE_GREEK_COLUMNS\r\n } else {\r\n return isByDateList ? BY_DATE_PRICES_COLUMNS : BY_STRIKE_PRICES_COLUMNS\r\n }\r\n}\r\n\r\nfunction removePrefix(sortOrder: string) {\r\n if (!sortOrder.includes('_')) return sortOrder\r\n const [prefix, rest] = sortOrder.split('_', 2)\r\n return prefix.startsWith('-') ? `-${rest}` : rest\r\n}\r\n\r\nexport function ListRoute(props: OptionsByDateLoader | OptionsByStrikeLoader) {\r\n const [searchParams] = useSearchParams()\r\n const subpage = props.subpage\r\n const columnRenderer = React.useMemo(() => getColumnRenderer(searchParams), [searchParams])\r\n const isByDateList = props.view === OptionsView.ListByDate\r\n const columns = getColumns(subpage, isByDateList)\r\n const linkColumn = isByDateList ? ColumnId.StrikePrice : ColumnId.ExpirationDate\r\n const filterColumn = isByDateList ? ColumnId.ExpirationDate : ColumnId.StrikePrice\r\n const query = useOptionsQuery(searchParams)\r\n const prefixedTableOrder = useOptionsSortOrder(props.subpage, query, linkColumn)\r\n const tableOrder = removePrefix(prefixedTableOrder)\r\n const effectiveTableOrder = evalLinkOrder(tableOrder, linkColumn)\r\n const optionsSortChange = useOptionsSortChange(subpage, query)\r\n\r\n const handleSortChange = (\r\n column: TableColumnDefinition,\r\n sort: SortByShape,\r\n changeSort: (newSort: any, direction?: SortDirection) => void,\r\n sortPrefix: string\r\n ) => {\r\n optionsSortChange(column, sort, changeSort, column.id === linkColumn ? '' : sortPrefix, column.id === linkColumn)\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n
\r\n
{columnMap[filterColumn].name}
\r\n
\r\n {props.view === OptionsView.ListByDate && (\r\n \r\n )}\r\n {props.view === OptionsView.ListByStrike && (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n

Calls

\r\n
\r\n option.type === OptionType.Call)}\r\n renderColumn={columnRenderer}\r\n tableOrder={effectiveTableOrder}\r\n onSortChange={(column, sort, changeSort) => handleSortChange(column, sort, changeSort, 'call_')}\r\n />\r\n
\r\n
\r\n\r\n
\r\n

\r\n Puts\r\n

\r\n \r\n
\r\n option.type === OptionType.Put)}\r\n renderColumn={columnRenderer}\r\n tableOrder={effectiveTableOrder}\r\n onSortChange={(column, sort, changeSort) => handleSortChange(column, sort, changeSort, 'put_')}\r\n />\r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Loading } from '../../../components/loading'\r\nimport ViewFooter from '../components/ViewFooter'\r\nimport { OptionsLoaderData } from '../types'\r\n\r\nconst ScatterPlot = React.lazy(() => import('../components/ScatterPlot'))\r\n\r\nexport function PlotRoute({ options }: OptionsLoaderData) {\r\n return (\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","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { useRevalidator, useSearchParams } from 'react-router-dom'\r\n\r\nimport { intervalCallbackOnWindowVisible } from '../../../app/shared/documentVisibility'\r\nimport { useCachedLoaderData } from '../../hooks/useCachedLoaderData'\r\nimport { QuoteOptionsTabMenu } from '../quote/components/QuoteOptionsTabMenu'\r\nimport { QuoteStickySubMenu } from '../quote/components/QuoteStickySubMenu'\r\nimport { OptionsViewSwitcher } from './components/OptionsViewSwitcher'\r\nimport { useOptionsQuery } from './hooks/useOptionsQuery'\r\nimport { ChainRoute } from './routes/ChainRoute'\r\nimport { ListRoute } from './routes/ListRoute'\r\nimport { PlotRoute } from './routes/PlotRoute'\r\nimport { OptionsLoaderData, OptionsSubpage, OptionsView } from './types'\r\n\r\nconst OPTIONS_REFRESH_INTERVAL = 60 * 1000\r\n\r\nexport default function Options() {\r\n const { data } = useCachedLoaderData()\r\n const revalidator = useRevalidator()\r\n const [searchParams] = useSearchParams()\r\n const query = useOptionsQuery(searchParams)\r\n\r\n React.useEffect(() => {\r\n const unsubscribe = intervalCallbackOnWindowVisible({ interval: OPTIONS_REFRESH_INTERVAL }, () => {\r\n // Do a false check so that browsers which don’t support this just continue\r\n if (navigator.onLine === false) return\r\n revalidator.revalidate()\r\n })\r\n\r\n return unsubscribe\r\n // Reset the refetch interval after every expiry change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [query.expiry, query.strike])\r\n\r\n return FinvizSettings.hasOptionsGreeksEnabled ? (\r\n <>\r\n }\r\n rightContent={\r\n data?.options?.length ? (\r\n \r\n ) : undefined\r\n }\r\n />\r\n
\r\n {data?.options?.length ? (\r\n \r\n ) : (\r\n
\r\n Options are not available for this stock.\r\n
\r\n )}\r\n
\r\n \r\n ) : (\r\n
\r\n {data?.options?.length ? (\r\n <>\r\n \r\n \r\n
\r\n \r\n \r\n ) : (\r\n
\r\n Options are not available for this stock.\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction OptionsContent(props: OptionsLoaderData & { subpage: OptionsSubpage; view: OptionsView }) {\r\n switch (props.view) {\r\n case OptionsView.Plot:\r\n return \r\n case OptionsView.ListByDate:\r\n case OptionsView.ListByStrike:\r\n return \r\n case OptionsView.ChainByStrike:\r\n default:\r\n return \r\n }\r\n}\r\n","import { TableAlign } from '../../components/Table'\r\nimport { SortableColumn } from '../../hooks/use-sort-data'\r\n\r\nexport enum OptionsQuery {\r\n Ticker = 't',\r\n Expiry = 'e',\r\n Strike = 's',\r\n Order = 'o',\r\n View = 'ov',\r\n Type = 'ty',\r\n}\r\n\r\nexport enum OptionsSubpage {\r\n Prices = 'oc',\r\n Volatility = 'ocv',\r\n}\r\n\r\nexport enum OptionsView {\r\n ChainByDate = 'chain_date',\r\n ChainByStrike = 'chain_strike',\r\n ListByDate = 'list_date',\r\n ListByStrike = 'list_strike',\r\n Plot = 'plot',\r\n}\r\n\r\nexport enum OptionType {\r\n Call = 'call',\r\n Put = 'put',\r\n}\r\n\r\nexport interface Option {\r\n type: OptionType\r\n ticker: string\r\n exDate: number\r\n strike: number\r\n openInterest: number\r\n averageVolume: number\r\n bidPrice: number\r\n askPrice: number\r\n lastClose: number\r\n lastChange: number\r\n lastSize: number\r\n lastVolume: number\r\n lastTime: string\r\n iv: number | null\r\n delta: number | null\r\n gamma: number | null\r\n theta: number | null\r\n vega: number | null\r\n rho: number | null\r\n}\r\n\r\nexport interface OptionRow {\r\n strike: number\r\n exDate: number\r\n call: Option | null\r\n put: Option | null\r\n}\r\n\r\nexport interface LoaderBase {\r\n ticker: string | null\r\n options: Option[]\r\n lastClose: number | null\r\n lastTime: number | null\r\n hasData?: boolean\r\n}\r\n\r\nexport interface OptionsByDateLoader extends LoaderBase {\r\n subpage: OptionsSubpage\r\n view: OptionsView.ChainByDate | OptionsView.ListByDate\r\n expiries: string[]\r\n currentExpiry: string\r\n}\r\n\r\nexport interface OptionsByStrikeLoader extends LoaderBase {\r\n subpage: OptionsSubpage\r\n view: OptionsView.ChainByStrike | OptionsView.ListByStrike\r\n strikes: number[]\r\n currentStrike: number\r\n}\r\n\r\nexport interface PlotLoader {\r\n subpage: OptionsSubpage\r\n view: OptionsView.Plot\r\n optionable: boolean\r\n options: Option[]\r\n}\r\n\r\nexport type OptionsLoaderData = OptionsByDateLoader | OptionsByStrikeLoader | PlotLoader\r\n\r\nexport enum ColumnId {\r\n ContractName = 'contractName',\r\n LastClose = 'lastClose',\r\n ChangeUsd = 'lastChange',\r\n ChangePct = 'changePct',\r\n BidPrice = 'bidPrice',\r\n AskPrice = 'askPrice',\r\n Volume = 'lastVolume',\r\n OpenInterest = 'openInterest',\r\n StrikePrice = 'strike',\r\n ExpirationDate = 'exDate',\r\n LastTrade = 'lastTime',\r\n IV = 'iv',\r\n Delta = 'delta',\r\n Gamma = 'gamma',\r\n Theta = 'theta',\r\n Vega = 'vega',\r\n Rho = 'rho',\r\n}\r\n\r\nexport enum RowKind {\r\n OptionRow, // Base row which includes both call and put. Used to render strike price\r\n Call,\r\n Put,\r\n}\r\n\r\ninterface OptionRowKind {\r\n ticker?: string\r\n lastClose?: number | null\r\n kind: RowKind.OptionRow\r\n row: OptionRow\r\n}\r\n\r\nexport interface CallKind {\r\n ticker?: string\r\n lastClose?: number | null\r\n kind: RowKind.Call\r\n row: Option\r\n}\r\n\r\ninterface PutKind {\r\n ticker?: string\r\n lastClose?: number | null\r\n kind: RowKind.Put\r\n row: Option\r\n}\r\n\r\nexport type ColumnRendererProps = CallKind | PutKind | OptionRowKind\r\n\r\nexport interface TableColumnDefinition extends SortableColumn {\r\n name: string\r\n align?: TableAlign\r\n className?: string\r\n renderColumn: (props: ColumnRendererProps) => React.ReactNode\r\n}\r\n\r\nexport type MappedSubpageOrders = { [key in OptionsSubpage]?: string }\r\n","import { formatDate } from '../../../../app/header/utils'\r\nimport { DATE_FORMAT_DB, DATE_FORMAT_INT, LINK_COLUMN_NAME } from '../constants/common'\r\nimport { ColumnId, MappedSubpageOrders, Option, OptionRow, OptionsQuery, OptionsSubpage, OptionsView } from '../types'\r\n\r\nconst DELIMITER = '|'\r\n\r\nfunction parseOrder(input: string | null): MappedSubpageOrders {\r\n if (!input) return {}\r\n const parts = input.split(DELIMITER)\r\n let pricesOrder, volatilityOrder\r\n if (parts.length === 1) pricesOrder = volatilityOrder = parts[0]\r\n else [pricesOrder, volatilityOrder] = parts\r\n return {\r\n [OptionsSubpage.Prices]: pricesOrder,\r\n [OptionsSubpage.Volatility]: volatilityOrder,\r\n }\r\n}\r\n\r\nexport function orderToString(obj: MappedSubpageOrders): string {\r\n const arr = [obj[OptionsSubpage.Prices], obj[OptionsSubpage.Volatility]]\r\n return arr.join(DELIMITER)\r\n}\r\n\r\nexport type OptionsParsedQuery = ReturnType\r\n\r\nexport function parseOptionsQuery(query: URLSearchParams) {\r\n const strike = Number(query.get(OptionsQuery.Strike))\r\n\r\n return {\r\n params: Object.fromEntries(query.entries()) as Record, // Re-export the original query as key/val\r\n ticker: query.get(OptionsQuery.Ticker)!, // Validated on BE\r\n expiry: query.get(OptionsQuery.Expiry),\r\n order: parseOrder(query.get(OptionsQuery.Order)),\r\n strike: Number.isFinite(strike) ? strike : null,\r\n view: (query.get(OptionsQuery.View) as OptionsView) ?? OptionsView.ChainByDate,\r\n type: query.get(OptionsQuery.Type) as OptionsSubpage,\r\n }\r\n}\r\n\r\nexport function evalLinkOrder(order: string, linkAlias: string) {\r\n if (!linkAlias) return order\r\n if (order === LINK_COLUMN_NAME) return linkAlias\r\n if (order === `-${LINK_COLUMN_NAME}`) return `-${linkAlias}`\r\n return order\r\n}\r\n\r\nexport function getViewLink(columnId: ColumnId, searchParams: URLSearchParams, option: Option | OptionRow) {\r\n const middleLink = new URLSearchParams(searchParams)\r\n\r\n switch (searchParams.get(OptionsQuery.View)) {\r\n case OptionsView.ChainByStrike:\r\n middleLink.set(OptionsQuery.View, OptionsView.ChainByDate)\r\n break\r\n case OptionsView.ListByDate:\r\n middleLink.set(OptionsQuery.View, OptionsView.ListByStrike)\r\n break\r\n case OptionsView.ListByStrike:\r\n middleLink.set(OptionsQuery.View, OptionsView.ListByDate)\r\n break\r\n case OptionsView.ChainByDate:\r\n default:\r\n middleLink.set(OptionsQuery.View, OptionsView.ChainByStrike)\r\n }\r\n\r\n if (columnId === ColumnId.ExpirationDate) {\r\n middleLink.delete(OptionsQuery.Strike)\r\n middleLink.set(OptionsQuery.Expiry, formatDate(option.exDate, DATE_FORMAT_INT, DATE_FORMAT_DB))\r\n } else {\r\n middleLink.delete(OptionsQuery.Expiry)\r\n middleLink.set(OptionsQuery.Strike, option.strike.toString())\r\n }\r\n\r\n return middleLink\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SubMenu } from '../../../components/SubMenu/SubMenu'\r\n\r\ninterface Props {\r\n leftContent?: React.ReactNode\r\n rightContent?: React.ReactNode\r\n}\r\n\r\nexport function QuoteStickySubMenu({ leftContent, rightContent }: Props) {\r\n return \r\n}\r\n","'use strict';\nvar $ = require('../internals/export');\nvar $findLastIndex = require('../internals/array-iteration-from-last').findLastIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// `Array.prototype.findLastIndex` method\n// https://tc39.es/ecma262/#sec-array.prototype.findlastindex\n$({ target: 'Array', proto: true }, {\n findLastIndex: function findLastIndex(callbackfn /* , that = undefined */) {\n return $findLastIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\naddToUnscopables('findLastIndex');\n"],"names":["ChipSwitch","_ref","children","label","size","rounding","_jsxs","className","_jsx","Paragraph","React","map","child","_child$props$theme","type","Button","theme","props","classnames","disabled","active","ChipSwitchButton","SubMenu","leftContent","middleContent","rightContent","classNames","isRedesignEnabled","SubMenuTabs","items","_ref2","href","isActive","reloadDocument","as","Link","to","useStickyShadow","stickyRef","isSticky","setIsSticky","current","onScroll","throttle","stickyElement","elementStickyTopOffset","parseFloat","getComputedStyle","top","elementCurrentTopOffset","getBoundingClientRect","document","addEventListener","removeEventListener","StickyShadow","ref","NULL_VALUE","FORMAT_SETTINGS","defaultValue","GREEK_SETTINGS","fractions","columnMap","Object","freeze","ColumnId","LastClose","id","align","TableAlign","Right","name","renderColumn","args","kind","RowKind","OptionRow","row","lastClose","formatNumber","ChangeUsd","getValueForSort","lastChange","RedGreenText","value","showPlusSign","ChangePct","prevClose","change","BidPrice","bidPrice","AskPrice","askPrice","Volume","lastVolume","OpenInterest","openInterest","StrikePrice","strike","ExpirationDate","formatDate","exDate","DATE_FORMAT_INT","DATE_FORMAT_VIEW","ContractName","Left","ticker","_args$ticker","toString","padStart","replace","Call","LastTrade","Date","lastTime","DATE_FORMAT_VIEW_LONG","IV","iv","Delta","delta","Gamma","gamma","Theta","theta","Vega","vega","Rho","rho","DATE_FORMAT_DB","DATE_FORMAT_SCATTER_PLOT","LINK_COLUMN_NAME","OPTIONS_SECTION_LABELS","QuoteSubview","OptionsChain","OptionsVolatility","OPTIONS_MENU_TABS","getOptionsMenuTabs","searchParams","decodeQueryString","encodeQueryString","ty","ov","OptionsSubpage","Volatility","OptionsView","Plot","ChainByDate","QuoteOptionsTabMenu","OptionsViewSwitcher","activeView","subpage","useSearchParams","chainLink","newParams","URLSearchParams","set","OptionsQuery","View","ChainByStrike","ListByStrike","includes","get","listLink","ListByDate","plotLink","delete","Strike","Expiry","Prices","useOptionsQuery","params","parseOptionsQuery","PriceRow","leftSpan","rightSpan","priceAlign","Center","showAdditionalCells","date","getDate","formattedDate","getFormattedDateString","formattedTime","TableRow","TableCell","colSpan","OptionsTableCell","isFirst","isLast","isHighlighted","isBorderVisible","CALL_OPTION_COLUMNS","originalId","rowKind","PUT_OPTION_COLUMNS","option","Put","CALL_OPTION_GREEK_COLUMNS","PUT_OPTION_GREEK_COLUMNS","FULL_COLUMNS_BREAKPOINT","valueGetter","column","customValueGetter","undefined","call","_row$call","_row$call2","put","_row$put","_row$put2","ChainTable","data","middleColumn","isPriceRowEnabled","isHeaderSticky","headerClass","tableOrder","onSortChange","CALL_COLUMNS","PUT_COLUMNS","columnsLength","setColumnsLength","length","tickerLastClose","location","useLocation","updateColumnsLength","window","innerWidth","middleColumnDefinition","allColumns","mergedData","options","mergeBy","result","sorted","slice","sort","a","b","_last","last","push","OptionType","mergeOptionsBy","tableRows","changeSort","useTableSort","columns","defaultSort","getDefaultSortFromUrl","key","currentPriceRow","isVisible","rowIndex","index","direction","SortDirection","Ascending","findLastIndex","priceRowProps","Table","cellPadding","TableHead","TableHeaderSortable","onClick","TableBody","_tableRows","_tableRows2","showPriceAfter","columnClass","middleLink","getViewLink","ChainOptionRow","_ref3","_Fragment","_createElement","FilterSelect","filterColumn","selected","onChange","filterValue","setFilterValue","Select","placement","item","DateFilter","currentExpiry","expiries","setSearchParams","filterOptions","prev","newQuery","StrikeFilter","currentStrike","strikes","ViewFooter","expiry","exportUrl","t","e","s","gtag","event_category","useOptionsSortChange","query","navigate","useNavigate","prefix","arguments","isLinkColumn","urlColumnId","urlOrderValue","newOrder","order","Order","orderToString","preventScrollReset","useOptionsSortOrder","defaultOrder","ChainRoute","view","effectiveTableOrder","evalLinkOrder","optionsSortChange","handleSortChange","defaultColumnRenderer","getColumnValueGetter","_row","OptionsTable","useTableSortWithAutoupdate","LEFT_COLUMNS","RIGHT_PRICES_COLUMNS","RIGHT_GREEK_COLUMNS","BY_DATE_PRICES_COLUMNS","BY_STRIKE_PRICES_COLUMNS","BY_DATE_GREEK_COLUMNS","BY_STRIKE_GREEK_COLUMNS","ListRoute","columnRenderer","getColumnRenderer","isByDateList","getColumns","linkColumn","sortOrder","rest","split","startsWith","removePrefix","sortPrefix","filter","ScatterPlot","PlotRoute","fallback","Loading","OPTIONS_REFRESH_INTERVAL","Options","_data$options","_data$view","_data$options2","_data$options3","_data$view2","useCachedLoaderData","revalidator","useRevalidator","intervalCallbackOnWindowVisible","interval","navigator","onLine","revalidate","FinvizSettings","hasOptionsGreeksEnabled","QuoteStickySubMenu","OptionsContent","DELIMITER","parseOrder","input","parts","pricesOrder","volatilityOrder","obj","join","Number","fromEntries","entries","Ticker","isFinite","Type","linkAlias","columnId","$","$findLastIndex","addToUnscopables","target","proto","callbackfn","this"],"sourceRoot":""}