summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanglewood <85772166+deeleeramone@users.noreply.github.com>2024-07-01 11:24:44 -0700
committerDanglewood <85772166+deeleeramone@users.noreply.github.com>2024-07-01 11:24:44 -0700
commit036975d984442720be953b04530b9008196a5020 (patch)
tree0d581d898fb8870fe6f30df323ff3ef7b3655f0a
parent3b48bc5153224a8f5adee85f4ce56f2d9f94803b (diff)
finviz cassettes
-rw-r--r--openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_compare_groups_fetcher_urllib3_v1.yaml1265
-rw-r--r--openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_equity_profile_fetcher_urllib3_v1.yaml4205
-rw-r--r--openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_key_metrics_fetcher_urllib3_v1.yaml4213
-rw-r--r--openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_price_performance_fetcher_urllib3_v1.yaml766
-rw-r--r--openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_price_target_fetcher_urllib3_v1.yaml4206
5 files changed, 6679 insertions, 7976 deletions
diff --git a/openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_compare_groups_fetcher_urllib3_v1.yaml b/openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_compare_groups_fetcher_urllib3_v1.yaml
index 338774b892e..5c56137054d 100644
--- a/openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_compare_groups_fetcher_urllib3_v1.yaml
+++ b/openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_compare_groups_fetcher_urllib3_v1.yaml
@@ -14,1032 +14,251 @@ interactions:
uri: https://finviz.com/groups.ashx?g=country&o=perf1w&v=140
response:
body:
- string: "<!DOCTYPE html>\n<html lang=\"en\" class=\" dark\">\n<head>\n<title>Group
- Screener - Performance country perf1w</title>\n<meta charset=\"UTF-8\"><meta
- name=\"viewport\" content=\"width=1024\"><meta name=\"description\" content=\"Stock
- screener for investors and traders, financial visualizations.\">\n\r\n <link
- rel=\"preload\" href=\"/fonts/lato-v17-latin-ext_latin-regular.woff2\" as=\"font\"
- crossorigin>\r\n <link rel=\"preload\" href=\"/fonts/lato-v17-latin-ext_latin-700.woff2\"
- as=\"font\" crossorigin>\r\n <link rel=\"preload\" href=\"/fonts/lato-v17-latin-ext_latin-900.woff2\"
- as=\"font\" crossorigin>\r\n <link rel=\"preload\" href=\"/fonts/inter-latin.woff2\"
- as=\"font\" crossorigin>\r\n \r\n <script>\r\n window.notificationsArray
- = [];\r\n window.renderScriptNotLoaded = function () {};\r\n
- \ window.handleScriptNotLoaded = function (element) {\r\n window.notificationsArray.push(element);\r\n
- \ window.sentryDisabled = true;\r\n window.handleScriptNotLoaded
- = function () {};\r\n };\r\n </script>\r\n <link
- rel=\"stylesheet\" href=\"/assets/dist-legacy/redesign.434ddfac.css\" type=\"text/css\"
- onerror=\"window.handleScriptNotLoaded(this)\">\n<link rel=\"stylesheet\"
- href=\"/assets/dist-legacy/main.a7b34d07.css\" type=\"text/css\" onerror=\"window.handleScriptNotLoaded(this)\">\n<link
- rel=\"icon\" type=\"image/png\" href=\"/favicon_2x.png\" sizes=\"32x32\">\n<link
- rel=\"icon\" type=\"image/png\" href=\"/favicon.png\" sizes=\"16x16\">\n <script
- type=\"text/javascript\" async=true>\r\n (function() {\r\n var host =
- 'finviz.com';\r\n var element = document.createElement('script');\r\n var
- firstScript = document.getElementsByTagName('script')[0];\r\n var url =
- 'https://cmp.inmobi.com'\r\n .concat('/choice/', 'c2W8esUZ6Q8oA', '/',
- host, '/choice.js?tag_version=V3');\r\n var uspTries = 0;\r\n var uspTriesLimit
- = 3;\r\n element.async = true;\r\n element.type = 'text/javascript';\r\n
- \ element.src = url;\r\n\r\n firstScript.parentNode.insertBefore(element,
- firstScript);\r\n\r\n function makeStub() {\r\n var TCF_LOCATOR_NAME
- = '__tcfapiLocator';\r\n var queue = [];\r\n var win = window;\r\n
- \ var cmpFrame;\r\n\r\n function addFrame() {\r\n var doc
- = win.document;\r\n var otherCMP = !!(win.frames[TCF_LOCATOR_NAME]);\r\n\r\n
- \ if (!otherCMP) {\r\n if (doc.body) {\r\n var iframe
- = doc.createElement('iframe');\r\n\r\n iframe.style.cssText = 'display:none';\r\n
- \ iframe.name = TCF_LOCATOR_NAME;\r\n doc.body.appendChild(iframe);\r\n
- \ } else {\r\n setTimeout(addFrame, 5);\r\n }\r\n
- \ }\r\n return !otherCMP;\r\n }\r\n\r\n function tcfAPIHandler()
- {\r\n var gdprApplies;\r\n var args = arguments;\r\n\r\n if
- (!args.length) {\r\n return queue;\r\n } else if (args[0]
- === 'setGdprApplies') {\r\n if (\r\n args.length > 3 &&\r\n
- \ args[2] === 2 &&\r\n typeof args[3] === 'boolean'\r\n
- \ ) {\r\n gdprApplies = args[3];\r\n if (typeof
- args[2] === 'function') {\r\n args[2]('set', true);\r\n }\r\n
- \ }\r\n } else if (args[0] === 'ping') {\r\n var retr
- = {\r\n gdprApplies: gdprApplies,\r\n cmpLoaded: false,\r\n
- \ cmpStatus: 'stub'\r\n };\r\n\r\n if (typeof
- args[2] === 'function') {\r\n args[2](retr);\r\n }\r\n
- \ } else {\r\n if(args[0] === 'init' && typeof args[3] ===
- 'object') {\r\n args[3] = Object.assign(args[3], { tag_version:
- 'V3' });\r\n }\r\n queue.push(args);\r\n }\r\n }\r\n\r\n
- \ function postMessageEventHandler(event) {\r\n var msgIsString
- = typeof event.data === 'string';\r\n var json = {};\r\n\r\n try
- {\r\n if (msgIsString) {\r\n json = JSON.parse(event.data);\r\n
- \ } else {\r\n json = event.data;\r\n }\r\n }
- catch (ignore) {}\r\n\r\n var payload = json.__tcfapiCall;\r\n\r\n
- \ if (payload) {\r\n window.__tcfapi(\r\n payload.command,\r\n
- \ payload.version,\r\n function(retValue, success) {\r\n
- \ var returnMsg = {\r\n __tcfapiReturn: {\r\n returnValue:
- retValue,\r\n success: success,\r\n callId:
- payload.callId\r\n }\r\n };\r\n if
- (msgIsString) {\r\n returnMsg = JSON.stringify(returnMsg);\r\n
- \ }\r\n if (event && event.source && event.source.postMessage)
- {\r\n event.source.postMessage(returnMsg, '*');\r\n }\r\n
- \ },\r\n payload.parameter\r\n );\r\n }\r\n
- \ }\r\n\r\n while (win) {\r\n try {\r\n if (win.frames[TCF_LOCATOR_NAME])
- {\r\n cmpFrame = win;\r\n break;\r\n }\r\n
- \ } catch (ignore) {}\r\n\r\n if (win === window.top) {\r\n break;\r\n
- \ }\r\n win = win.parent;\r\n }\r\n if (!cmpFrame)
- {\r\n addFrame();\r\n win.__tcfapi = tcfAPIHandler;\r\n win.addEventListener('message',
- postMessageEventHandler, false);\r\n }\r\n };\r\n\r\n makeStub();\r\n\r\n
- \ var uspStubFunction = function() {\r\n var arg = arguments;\r\n if
- (typeof window.__uspapi !== uspStubFunction) {\r\n setTimeout(function()
- {\r\n if (typeof window.__uspapi !== 'undefined') {\r\n window.__uspapi.apply(window.__uspapi,
- arg);\r\n }\r\n }, 500);\r\n }\r\n };\r\n\r\n var
- checkIfUspIsReady = function() {\r\n uspTries++;\r\n if (window.__uspapi
- === uspStubFunction && uspTries < uspTriesLimit) {\r\n console.warn('USP
- is not accessible');\r\n } else {\r\n clearInterval(uspInterval);\r\n
- \ }\r\n };\r\n\r\n if (typeof window.__uspapi === 'undefined') {\r\n
- \ window.__uspapi = uspStubFunction;\r\n var uspInterval = setInterval(checkIfUspIsReady,
- 6000);\r\n }\r\n })();\r\n </script><script>\r\n FinvizSettings
- = {\r\n versionImages: 12,\r\n hasUserPremium:
- false,\r\n name: \"\",\r\n email: \"\",\r\n
- \ nodeChartsDomain: \"https://charts2-node.finviz.com\",\r\n
- \ hasUserStickyHeader: true,\r\n adsProvider:
- 1,\r\n hasRedesignEnabled: true,\r\n hasDarkTheme:
- true,\r\n quoteSearchExt: '',\r\n isJoinBannerVisible:
- false,\r\n };\r\n </script><script src=\"/assets/dist-legacy/script/browser_check.0d635eab.js\"></script><script
- src=\"/assets/dist-legacy/script/vendor/boxover.94c8d909.js\"></script>\n<script
- src=\"/assets/dist-legacy/runtime.c6d22a12.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script
- src=\"/assets/dist-legacy/libs_init.6c24f8e6.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script
- src=\"/assets/dist-legacy/4448.4d6ce3b6.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script
- src=\"/assets/dist-legacy/7808.bfd72543.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script
- src=\"/assets/dist-legacy/1556.75067b82.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script
- src=\"/assets/dist-legacy/3988.202a9cce.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script
- src=\"/assets/dist-legacy/7603.96a170ed.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script
- src=\"/assets/dist-legacy/1756.6bddc02b.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script
- src=\"/assets/dist-legacy/header.8fcd949e.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script></head>\n<body
- class=\"m-0 yellow-tooltip is-groups min-w-[1000px] chart-tooltip\">\r\n <script>\r\n
- \ var cookieName = 'fv_block';\r\n var selector
- = '[data-google-query-id]';\r\n var selectorFrame = selector
- + ' iframe, ' + selector + ' [id*=aax]';\r\n var cookieExpiry
- = 5 * 60 * 1000; // 5min\r\n var checkTimeout = 20 * 1000;
- // 20sec\r\n\r\n function getCookie(value) {\r\n var
- expiration = +new Date() + cookieExpiry;\r\n return cookieName
- + '=' + value + '; expires=' + (new Date(expiration)).toUTCString() + '; path=/';\r\n
- \ }\r\n\r\n var finvizBannersLoaded = false;\r\n
- \ function loadFinvizBanners(setCookie) {\r\n \r\n
- \ if (setCookie) document.cookie = getCookie('block');\r\n
- \ finvizBannersLoaded = true;\r\n var
- s = document.createElement('script');\r\n s.type = 'text/javascript';\r\n
- \ s.async = true;\r\n s.src = '/assets/dist-legacy/script/finviz_b.cff16f1f.js';\r\n
- \ document.head.appendChild(s);\r\n }\r\n\r\n
- \ function checkBannersLoaded() {\r\n var
- checkEnd = +new Date() + checkTimeout;\r\n function asyncCheckIfExists(selector,
- resolve) {\r\n var now = +new Date();\r\n var
- container = document.querySelector(selector);\r\n if
- (!container && checkEnd > now) return setTimeout(function () { asyncCheckIfExists(selector,
- resolve) }, 1000)\r\n resolve(!!container);\r\n }\r\n
- \ \r\n asyncCheckIfExists(selector, function
- (exists) {\r\n if (!exists) return loadFinvizBanners(true);\r\n\r\n
- \ asyncCheckIfExists(selectorFrame, function (hasIframe)
- {\r\n if (!hasIframe) return loadFinvizBanners(true);\r\n
- \ })\r\n })\r\n }\r\n\r\n
- \ if (document.cookie.indexOf(cookieName) >= 0) {\r\n loadFinvizBanners(false);\r\n
- \ } else {\r\n var s = document.createElement('script');\r\n
- \ s.type = 'text/javascript';\r\n s.async
- = true;\r\n s.onerror = loadFinvizBanners;\r\n s.onload
- = checkBannersLoaded;\r\n s.src = 'https://u5.investingchannel.com/static/uat.js';\r\n
- \ document.head.appendChild(s);\r\n\r\n InvestingChannelQueue
- = window.InvestingChannelQueue || [];\r\n var ic_page;\r\n\r\n
- \ function refreshAd(container, refreshes) { \r\n var
- placementTag, adslot;\r\n window.InvestingChannelQueue.push(function
- () {\r\n var pubTags = ic_page.getPubTag.call(ic_page,
- container.id);\r\n if (!pubTags) return;\r\n var
- pubTag = pubTags[0];\r\n placementTag = pubTag.mPlacements[0].mTagToRender;\r\n
- \ adslot = pubTag.mPlacements[0].mPublisherKval.adslot[0];\r\n
- \ // Update div ID\r\n var
- id = container.id.split('_');\r\n var numberOfDivs
- = document.querySelectorAll('[id*=' + id.slice(0, id.length - 1).join('_')
- + ']').length;\r\n var newDivNumber = Number(id.pop())
- + numberOfDivs * refreshes;\r\n container.setAttribute('id',
- id.join('_') + '_' + newDivNumber);\r\n // Destroy
- previous pubtag & reset container html (loading span)\r\n pubTag.destroy();\r\n
- \ container.innerHTML = '';\r\n });
- \r\n window.InvestingChannelQueue.push(function ()
- {\r\n if (!placementTag || !adslot) return\r\n
- \ // Create new pub tag\r\n var
- newTag;\r\n var layoutId = placementTag.mNativeLayout
- ? placementTag.mNativeLayout.nativelayoutid : null;\r\n if
- (layoutId) {\r\n newTag = ic_page.defineNativeTag('finviz/'
- + placementTag.mTarget.dfpkeyname, placementTag.mAdSize, container.id, layoutId);\r\n
- \ var nativeLayout, layoutData\r\n\r\n try
- {\r\n nativeLayout = newTag.mPlacements[0].mTags[0].mNativeLayout;\r\n
- \ } catch (e) {\r\n console.log(e.message)\r\n
- \ }\r\n\r\n try
- {\r\n layoutData = newTag.mTemplate.mNativeLayout[layoutId].Data\r\n
- \ if (layoutData && nativeLayout && !nativeLayout.layout)
- {\r\n newTag.mPlacements[0].mTags[0].mNativeLayout
- = layoutData\r\n }\r\n }
- catch (e) {\r\n console.log(e.message)\r\n
- \ }\r\n } else {\r\n
- \ newTag = ic_page.defineTag('finviz/' + placementTag.mTarget.dfpkeyname,
- placementTag.mAdSize, container.id);\r\n }\r\n
- \ // Set adslot param\r\n newTag.setKval({
- adslot: adslot });\r\n newTag.setKval({ kw: 'ajax'
- });\r\n newTag.render();\r\n });\r\n
- \ }\r\n\r\n var refreshCount = 1;\r\n
- \ function refreshAds(selectors) { \r\n if
- (window.ic_page) {\r\n document.querySelectorAll(selectors).forEach(function
- (element) {\r\n try {\r\n refreshAd(element,
- refreshCount);\r\n } catch (e) {\r\n console.log('Ad
- refresh error for:', element, e);\r\n }\r\n
- \ });\r\n window.ic_page.loadMore();\r\n
- \ refreshCount++;\r\n } \r\n
- \ }\r\n\r\n\r\n InvestingChannelQueue.push(function()
- {\r\n var icConfig = window['FINVIZ_IC_UAT_CONFIG']
- = {};\r\n \r\n ic_page = InvestingChannel.UAT.Run('df0d0d52-cc7f-11e8-82a5-0abbb61c4a6a',
- icConfig);\r\n });\r\n\r\n var hash
- = null;\r\n if (typeof hash === 'string') {\r\n InvestingChannelQueue.push(function()
- {\r\n if (ic_page) {\r\n ic_page.setUserId('email',
- hash, true);\r\n }\r\n });\r\n
- \ }\r\n }\r\n </script> <script>\r\n
- \ function FinvizNewsletterHide() {\r\n fetch('/api/set_cookie.ashx?cookie=notice-newsletter').catch(function(){}).then(function(){\r\n
- \ window.gtag && window.gtag('event', 'close', { event_category:
- 'notice-newsletter', non_interaction: true })\r\n })\r\n document.getElementById('js-notice-newsletter').style.display
- = 'none';\r\n }\r\n\r\n const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/\r\n\r\n
- \ function FinvizNewsletterSubmit(event) {\r\n const emailValue
- = event.target.elements[\"email\"].value\r\n if (!emailRegex.test(emailValue))
- {\r\n event.preventDefault()\r\n alert(\"Invalid
- email address\")\r\n return\r\n }\r\n window.gtag
- && window.gtag('event', 'subscription', { event_category: 'notice-newsletter',
- non_interaction: true })\r\n }\r\n window.gtag && window.gtag('event',
- 'impression', { event_category: 'notice-newsletter', non_interaction: true
- })\r\n </script>\r\n <div id=\"js-notice-newsletter\" class=\"font-sans
- relative isolate flex items-center justify-center gap-x-2 gap-y-2 overflow-hidden
- bg-gray-50 px-6 py-2.5\">\r\n <div class=\"absolute left-[max(-7rem,calc(50%-52rem))]
- top-1/2 -z-10 -translate-y-1/2 transform-gpu blur-2xl\" aria-hidden=\"true\">\r\n
- \ <div class=\"aspect-[577/310] w-[36.0625rem] bg-gradient-to-r
- from-purple-500 to-blue-500 opacity-30\" style=\"clip-path: polygon(74.8%
- 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, 58.5% 54.6%,
- 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% 74.2%, 24.9%
- 54.1%, 68.6% 100%, 74.8% 41.9%)\"></div>\r\n </div>\r\n <div
- class=\"absolute left-[max(45rem,calc(50%+8rem))] top-1/2 -z-10 -translate-y-1/2
- transform-gpu blur-2xl\" aria-hidden=\"true\">\r\n <div class=\"aspect-[577/310]
- w-[36.0625rem] bg-gradient-to-r from-blue-500 to-purple-500 opacity-30\" style=\"clip-path:
- polygon(74.8% 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%,
- 58.5% 54.6%, 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9%
- 74.2%, 24.9% 54.1%, 68.6% 100%, 74.8% 41.9%)\"></div>\r\n </div>\r\n\r\n
- \ <p class=\"text-sm leading-6 text-gray-900\">\r\n Subscribe
- to our newsletter to receive the latest product updates and special offers\r\n
- \ </p>\r\n <form action=\"/api/newsletter/widget\" method=\"post\"
- onsubmit=\"FinvizNewsletterSubmit(event)\" class=\"relative w-[280px]\">\r\n
- \ <div class=\"w-full\">\r\n <label class=\"flex
- grow flex-col\">\r\n <div class=\"group relative flex\">\r\n
- \ <input name=\"email\" value=\"\" placeholder=\"Your
- email\" type=\"email\" maxlength=\"50\" required class=\"text-gray-900 border
- bg-white disabled:bg-gray-50 disabled:text-gray-500 border-gray-300 focus:border-blue-400
- disabled:hover:border-gray-100 h-8 text-sm rounded-md !pr-24 w-full grow select-text
- appearance-none outline-none pl-2\">\r\n </div>\r\n </label>\r\n
- \ </div>\r\n <button class=\"flex items-center font-medium
- whitespace-nowrap focus:outline-none text-sm text-white hover:text-white active:bg-blue-600
- disabled:bg-blue-200 disabled:hover:bg-blue-200 bg-blue-400 hover:bg-blue-500
- h-7 px-2 rounded focus-visible:ring-2 ring-gray-200 absolute right-0.5 top-0.5
- rounded-l-none\">\r\n <div class=\"grow text-left\">Subscribe</div>\r\n
- \ </button>\r\n </form>\r\n\r\n <button type=\"button\"
- onclick=\"FinvizNewsletterHide()\" class=\"-m-3 p-3 focus-visible:outline-offset-[-4px]\">\r\n
- \ <span class=\"sr-only\">Dismiss</span>\r\n <svg class=\"h-5
- w-5 text-gray-900\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\r\n
- \ <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75
- 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75
- 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\r\n </svg>\r\n </button>\r\n
- \ </div>\r\n <script>\r\n function checkMediaQuery(matches)
- {\r\n if (matches) {\r\n FinvizSettings.hasUserStickyHeader
- = true;\r\n document.body.classList.add('is-header-sticky');\r\n
- \ } else {\r\n FinvizSettings.hasUserStickyHeader
- = false;\r\n document.body.classList.remove('is-header-sticky');\r\n
- \ }\r\n }\r\n var mediaMatch = window.matchMedia('(min-width:
- 1025px) and (min-height: 650px)');\r\n checkMediaQuery(mediaMatch.matches);\r\n
- \ mediaMatch.addListener(function (ev) { checkMediaQuery(ev.matches)
- });\r\n </script>\r\n <div id=\"notifications-container\"></div><table
- class=\"header\">\r\n <tr class=\"align-top\">\r\n <td>\r\n <table
- class=\"header-container\">\r\n <tr>\r\n <td
- class=\"w-[30%]\">\r\n <table class=\"w-full\">\r\n
- \ <tr>\r\n <td class=\"h-[50px]
- align-middle\">\r\n <a href=\"/\" class=\"logo\"><svg
- width=\"225\" height=\"32\" class=\"block\">\r\n <use href=\"/img/logo.svg#free\"
- class=\"dark:hidden\" />\r\n <use href=\"/img/logo.svg#free-dark\" class=\"hidden
- dark:block\" />\r\n</svg></a>\r\n </td>\r\n
- \ </tr>\r\n <tr>\r\n
- \ <td id=\"search\" style=\"padding-top: 7px\">\r\n
- \ <div class=\"navbar-search-placeholder\">\r\n
- \ <span class=\"icon-wrapper\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\"
- class=\"icon\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path d=\"M16.9
- 15.5l4 4c.2.2.1.5 0 .7l-.7.7a.5.5 0 01-.8 0l-4-4c0-.2-.2-.3-.3-.4l-.7-1a7
- 7 0 01-11.2-4 7 7 0 1112.2 3l1 .6.5.4zM5 10a5 5 0 1010 0 5 5 0 00-10 0z\"
- />\r\n </svg>\r\n </span>\r\n <input placeholder=\"Search ticker,
- company or profile\" class=\"search-input is-free\"/>\r\n</div>\r\n </td>\r\n
- \ </tr>\r\n </table>\r\n
- \ </td>\r\n <td class=\"align-bottom
- pb-1\">\r\n <div id=\"microbar_position\" class=\"hidden
- xl:flex items-center h-[37px] pl-2\"><div>\r\n <div
- id=\"IC_D_88x31_1\"class=\"relative overflow-hidden flex items-center justify-center
- w-full mx-auto\" style=\"width:88px;height:31px;max-height:31px\"></div>\r\n
- \ </div></div>\r\n </td>\r\n <td
- class=\"relative w-[730px] text-right\">\r\n <div id=\"banner_position\"
- class=\"overflow-hidden absolute top-0 right-0 w-full h-24\">\r\n <div
- id=\"IC_D_728x90_1\"class=\"relative overflow-hidden flex items-center justify-center
- w-full mx-auto\" style=\"width:728px;height:90px;max-height:90px\"></div>\r\n
- \ </div>\r\n </td>\r\n </tr>\r\n
- \ </table>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td
- class=\"w-[994px] leading-none\" style=\"font-size:0\">\r\n <img
- src=\"/gfx/nic2x2.gif\" class=\"w-[994px] h-px\" alt=\"\">\r\n </td>\r\n
- \ </tr>\r\n</table>\r\n <table class=\"navbar\">\r\n <tr>\r\n
- \ <td class=\"h-[30px]\">\r\n <table
- class=\"header-container\">\r\n <tr><td><a class=\"nav-link
- \ is-first\" href=\"/\">Home</a></td><td><a class=\"nav-link \" href=\"/news.ashx\">News</a></td><td><a
- class=\"nav-link \" href=\"/screener.ashx\">Screener</a></td><td><a class=\"nav-link
- \" href=\"/map.ashx\">Maps</a></td><td><a class=\"nav-link is-active\" href=\"/groups.ashx\">Groups</a></td><td><a
- class=\"nav-link \" href=\"/portfolio.ashx\">Portfolio</a></td><td><a class=\"nav-link
- \" href=\"/insidertrading.ashx\">Insider</a></td><td><a class=\"nav-link \"
- href=\"/futures.ashx\">Futures</a></td><td><a class=\"nav-link \" href=\"/forex.ashx\">Forex</a></td><td><a
- class=\"nav-link \" href=\"/crypto.ashx\">Crypto</a></td><td><a class=\"nav-link
- \" href=\"/elite.ashx?utm_source=finviz&utm_medium=banner&utm_campaign=main-navbar-backtests\">Backtests</a></td><td><a
- class=\"nav-link is-elite\" href=\"/elite.ashx\">Elite</a></td><td class=\"w-full
- relative\"><div class=\"absolute bottom-0 left-0 right-0 top-0\"><div id=\"time\"
- class=\"pr-1\"></div></div></td>\r\n <td class=\"nav relative\">\r\n
- \ <a data-testid=\"chart-layout-theme\" href=\"#\" class=\"!flex !bg-transparent
- !border-b-0 mt-1 !py-0 !px-1\" style='border-left: 1px solid #444a57' title=\"Toggle
- Light/Dark mode\" onclick=\"setChartThemeCookie('light', true)\">\r\n <div
- class='relative box-content flex rounded-full w-10 h-5 border border-gray-750
- bg-gray-800 text-white justify-end'>\r\n <div class='box-border
- w-1/2 rounded-full p-px border border-gray-800 bg-[#4c5261] flex justify-center
- items-center'>\r\n <svg width=\"16\" height=\"16\" class=\"fill-current
- text-white inline-block -ml-px\">\r\n <use href=\"/assets/dist-icons/icons.svg?rev=12#moonOutlined\"/>\r\n</svg>\r\n
- \ </div>\r\n </div>\r\n <span class='ml-1
- select-none font-medium text-xs text-white'>Theme</span>\r\n </a>\r\n
- \ </td>\r\n \r\n <td>\r\n <a href=\"/help/groups.ashx\"
- class=\"nav-link is-help\" style=\"border-left: 1px solid #444a57\"><span
- class=\"fa fa-question-circle\"></span>Help</a>\r\n </td>\r\n
- \ <td><a href=\"/login.ashx\" class=\"nav-link sign-in\">Login</a></td>\r\n
- \ <td><a href=\"/register.ashx\" class=\"nav-link sign-up\">Register</a></td>\r\n
- \ \r\n </tr>\r\n </table>\r\n
- \ </td>\r\n </tr>\r\n </table>\r\n
- \ \r\n <script>\r\n function reloadPage () { location.reload()
- }\r\n function setChartThemeCookie(chartsTheme) {\r\n fetch('/api/set_cookie.ashx?cookie=chartsTheme&value='
- + chartsTheme ).catch(function(){}).then(function(){\r\n window.gtag
- && window.gtag('event', 'click', { event_category: 'theme', event_label: 'toggle',
- value: chartsTheme, event_callback: reloadPage });\r\n setTimeout(reloadPage,1000);\r\n
- \ })\r\n }\r\n </script><div class=\"content
- \"><div class=\"fv-container is-tight\"><tr>\n<td>\n<table id=\"filter-table-top\"
- class=\"screener-groups_table-filter\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\"
- border=\"0\">\n<tr>\n<td class=\"screener-groups_filter-label text-right\"
- width=\"6%\">\n<span class=\"body-combo-title\" style=\"cursor:pointer;\"
- data-boxover=\"cssbody=[tooltip_bdy] cssheader=[tooltip_hdr] header=[Group]
- body=[<table width=300><tr><td class='tooltip_tab'>Select group - stocks organized
- by <b>sector</b>, <b>industry</b>, <b>country</b> or market <b>capitalization</b>.</td></tr></table>]
- delay=[500]\">Group</span></td>\n<td class=\"pl-1\" align=\"left\">\n<select
- id=\"groupSelect\" style=\"width:100%;\" class=\"body-combo-text fv-select\"
- onchange='window.location=document.getElementById(\"groupSelect\").value'>\n<option
- value=\"groups.ashx?g=sector&v=140&o=perf1w\">Sector</option><option value=\"groups.ashx?g=industry&v=140&o=perf1w\">Industry</option><option
- value=\"groups.ashx?g=industry&sg=basicmaterials&v=140&o=perf1w\">Industry
- (Basic Materials)</option><option value=\"groups.ashx?g=industry&sg=communicationservices&v=140&o=perf1w\">Industry
- (Communication Services)</option><option value=\"groups.ashx?g=industry&sg=consumercyclical&v=140&o=perf1w\">Industry
- (Consumer Cyclical)</option><option value=\"groups.ashx?g=industry&sg=consumerdefensive&v=140&o=perf1w\">Industry
- (Consumer Defensive)</option><option value=\"groups.ashx?g=industry&sg=energy&v=140&o=perf1w\">Industry
- (Energy)</option><option value=\"groups.ashx?g=industry&sg=financial&v=140&o=perf1w\">Industry
- (Financial)</option><option value=\"groups.ashx?g=industry&sg=healthcare&v=140&o=perf1w\">Industry
- (Healthcare)</option><option value=\"groups.ashx?g=industry&sg=industrials&v=140&o=perf1w\">Industry
- (Industrials)</option><option value=\"groups.ashx?g=industry&sg=realestate&v=140&o=perf1w\">Industry
- (Real Estate)</option><option value=\"groups.ashx?g=industry&sg=technology&v=140&o=perf1w\">Industry
- (Technology)</option><option value=\"groups.ashx?g=industry&sg=utilities&v=140&o=perf1w\">Industry
- (Utilities)</option><option selected=\"selected\" value=\"groups.ashx?g=country&v=140&o=perf1w\">Country
- (U.S. listed stocks only)</option><option value=\"groups.ashx?g=capitalization&v=140&o=perf1w\">Capitalization</option></select>\n</td>\n<td
- class=\"screener-groups_filter-label text-right\" width=\"7%\">\n<span class=\"body-combo-title\"
- style=\"cursor:pointer;\" data-boxover=\"cssbody=[tooltip_bdy] cssheader=[tooltip_hdr]
- header=[Order By] body=[<table width=300><tr><td class='tooltip_tab'>Select
- the criteria by which the output information will be sorted. Use the <b>ascending</b>
- and <b>descending</b> option to invert the current order.<br><br> TIP: In
- table views you can click on top of a column to sort the table by the underlying
- values.</td></tr></table>] delay=[500]\">Order By</span></td>\n<td class=\"pl-1\"
- align=\"left\">\n<select id=\"orderSelect\" style=\"width:100%;\" class=\"body-combo-text
- fv-select\" onchange='window.location=document.getElementById(\"orderSelect\").value'>\n<option
- value=\"groups.ashx?g=country&v=140&o=name\">Name</option><option value=\"groups.ashx?g=country&v=140&o=marketcap\">Market
- Capitalization</option><option value=\"groups.ashx?g=country&v=140&o=pe\">Price/Earnings</option><option
- value=\"groups.ashx?g=country&v=140&o=forwardpe\">Forward Price/Earnings</option><option
- value=\"groups.ashx?g=country&v=140&o=peg\">PEG (Price/Earnings/Growth)</option><option
- value=\"groups.ashx?g=country&v=140&o=ps\">Price/Sales</option><option value=\"groups.ashx?g=country&v=140&o=pb\">Price/Book</option><option
- value=\"groups.ashx?g=country&v=140&o=pc\">Price/Cash</option><option value=\"groups.ashx?g=country&v=140