CINXE.COM

TRADING ECONOMICS | 20 million INDICATORS FROM 196 COUNTRIES

<!doctype html> <html > <head id="ctl00_Head1"><meta charset="utf-8" /><title> TRADING ECONOMICS | 20 million INDICATORS FROM 196 COUNTRIES </title><meta id="metaDesc" name="description" content=" View more than 20 million economic indicators for 196 countries. Get free indicators, Historical Data, Charts, News and Forecasts for 196 countries." /><meta id="metaKeyword" name="keywords" content="Economic Indicators, Economic Data, Interest Rates, Exchange Rate Forecasts, Trading Economics, Currency Trading, Trading Signal, Trading Recommendations, Forex Signals, Trading Strategies, Forex Trading Strategies" /><meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1" /><meta name="theme-color" content="#333333" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.3/css/bootstrap.min.css" integrity="sha512-SbiR/eusphKoMVVXysTKG/7VseWii+Y3FdHrt0EpKgpToZeemhqHeZeLWLhJutz/2ut2Vw1uQEj2MbRF+TVBUA==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.2/font/bootstrap-icons.min.css" integrity="sha512-YFENbnqHbCRmJt5d+9lHimyEMt8LKSNTMLSaHjvsclnZGICeY/0KYEeiHwD1Ux4Tcao0h60tdcMv+0GljvWyHg==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <link href="//d3fy651gv2fhd3.cloudfront.net/stylesheet.min.css?v=20250218c" rel="stylesheet" /> <script type="text/javascript">var TEChartSettings = {}; var TESymbol = ''; var TECountry = ''; var TECategory = ''; var TEFrequency = ''; var TELanguage = ''; var TELastUpdate = '20250131000000'; var TEChartVersion = ''; var symbol = ''; var symbolType = ''; var hasCalendar = false; var isLoggedIn = false; var TEAlertsName = ''; var TEChartsDatasource = 'https://d3ii0wo49og5mi.cloudfront.net'; var IsMobile = false; var TEChartsMeta = ''; var TEForecast = []; var TEAuthorization = ''; var TESecurify = ''; var TESecurifyUrl = ''; var TEType = ''; var TEChartUrl = '/'; var TEComparable = 0; var isAlertsLoaded = false; var IsDarkMode = false; var isPakoLoaded = false; var TEChartsToken = '20240229:nazare'; var TEObfuscationkey = 'tradingeconomics-charts-core-api-key'; var isCopyright = false;</script> <script type="text/javascript">var DEBUG = false;if (window.location.host.indexOf('localhost') > -1) DEBUG = true;else if (window.location.href.indexOf('debug') > -1) DEBUG = true;if (!DEBUG) {if (!window.console) window.console = {};var methods = ["log", "debug", "info"];for (var i = 0; i < methods.length; i++) {console[methods[i]] = function () { };}}</script> <link rel="icon" href="//d3fy651gv2fhd3.cloudfront.net/favicon.ico" /><link rel="canonical" href="https://tradingeconomics.com" /></head> <body > <script>IsDarkMode=false;</script> <form method="post" action="./" id="aspnetForm"> <div class="aspNetHidden"> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="SG+SZmHsMSNH9lQx3P5sD3uIESY4npfB4zAx2UZmgK8ztKVXzUxQ9qLwKaEoyXfOp/o06Ybdok9xRUNEEL4aEiUWsEc=" /> </div> <div class="aspNetHidden"> <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="CA0B0334" /> </div> <nav id="ctl00_NavigationUC1_ctl00_menu" class="navbar navbar-dark fixed-top" role="navigation"> <div class="container"> <div class="navbar-header navbar-header-search" id="searchMobileHeader"> <div class="d-flex justify-content-between"> <a class="navbar-brand" style="width: 100%"> <input type="text" placeholder="Search" id="thisIstheTinySearchBoxIdTag" autocomplete="off" class="nav-search-input-class navbar-search-2" /> </a> <ul id="thisIstheTinySearchResultsIdTag" class="dropdown-menu navbar-search-1"> <li> <div class="container-fluid"> <div id="dpSearch-resultCnt-tiny" class="dpTaResult"> </div> </div> </li> </ul> <div class="navbar-mobile-close-search"> <a noref class="navbar-mobile-item" id="thisIsTheTinyRemoveId"><i class="bi bi-x-lg"></i></a> </div> </div> </div> <div class="navbar-header navbar-collapse float-end" id="mainHeader"> <div class="d-flex"> <button type="button" class="navbar-toggler" data-bs-toggle="offcanvas" data-bs-target="#tesidemenu" aria-controls="tesidemenuoptions"> <span class="navbar-toggler-icon"></span> </button> <div class="logo-banner d-flex justify-content-between float-right"> <a class="navbar-brand" href="/"> <svg width="129" height="35" version="1.1" viewBox="0 0 34.131 9.2604" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" aria-label = "Trading Economics logo"> <g fill="#858585" stroke="#858585" stroke-width=".1" ><path d="m1.3315 8.5517v-3.7879h2.8086v0.64079h-2.0438v0.83974h1.9017v0.6382h-1.9017v1.0309h2.1162v0.6382z"/><path d="m7.2846 7.1591 0.74156 0.23513q-0.17053 0.62012-0.56844 0.92242-0.39532 0.29972-1.0051 0.29972-0.75448 0-1.2402-0.51418-0.48576-0.51676-0.48576-1.4108 0-0.94568 0.48834-1.4676 0.48834-0.52452 1.2842-0.52452 0.69505 0 1.1291 0.41083 0.25838 0.24288 0.38757 0.69763l-0.75706 0.18087q-0.067179-0.29456-0.28164-0.46509-0.21187-0.17053-0.51676-0.17053-0.42116 0-0.68471 0.30231-0.26097 0.30231-0.26097 0.97927 0 0.7183 0.25838 1.0232 0.25838 0.30489 0.67179 0.30489 0.30489 0 0.52452-0.19379 0.21962-0.19379 0.31523-0.60978z"/><path d="m8.5275 6.681q0-0.57878 0.17312-0.97152 0.12919-0.28939 0.3514-0.51935 0.22479-0.22996 0.49093-0.34106 0.35398-0.14986 0.81649-0.14986 0.83716 0 1.3384 0.51935 0.50385 0.51935 0.50385 1.4444 0 0.91726-0.49868 1.4366-0.49868 0.51676-1.3333 0.51676-0.84491 0-1.3436-0.51418-0.49868-0.51676-0.49868-1.4211zm0.78807-0.025838q0 0.64337 0.29714 0.97669 0.29714 0.33073 0.75448 0.33073 0.45734 0 0.74931-0.32815 0.29456-0.33073 0.29456-0.9896 0-0.65112-0.2868-0.97152-0.28422-0.32039-0.75706-0.32039-0.47284 0-0.76223 0.32556-0.28939 0.32298-0.28939 0.97669z"/><path d="m12.806 8.5517v-3.7879h0.74414l1.5503 2.5296v-2.5296h0.71055v3.7879h-0.7674l-1.527-2.4701v2.4701z"/><path d="m16.465 6.681q0-0.57878 0.17312-0.97152 0.12919-0.28939 0.3514-0.51935 0.22479-0.22996 0.49093-0.34106 0.35398-0.14986 0.81649-0.14986 0.83716 0 1.3384 0.51935 0.50384 0.51935 0.50384 1.4444 0 0.91726-0.49868 1.4366-0.49868 0.51676-1.3333 0.51676-0.84491 0-1.3436-0.51418-0.49868-0.51676-0.49868-1.4211zm0.78807-0.025838q0 0.64337 0.29714 0.97669 0.29714 0.33073 0.75448 0.33073t0.74931-0.32815q0.29456-0.33073 0.29456-0.9896 0-0.65112-0.2868-0.97152-0.28422-0.32039-0.75706-0.32039t-0.76223 0.32556q-0.28939 0.32298-0.28939 0.97669z"/><path d="m20.726 8.5517v-3.7879h1.1446l0.6873 2.5838 0.67955-2.5838h1.1472v3.7879h-0.71055v-2.9817l-0.75189 2.9817h-0.73639l-0.74931-2.9817v2.9817z"/><path d="m25.121 8.5517v-3.7879h0.76481v3.7879z"/><path d="m29.038 7.1591 0.74156 0.23513q-0.17053 0.62012-0.56844 0.92242-0.39532 0.29972-1.0051 0.29972-0.75448 0-1.2402-0.51418-0.48576-0.51676-0.48576-1.4108 0-0.94568 0.48834-1.4676 0.48834-0.52452 1.2842-0.52452 0.69505 0 1.1291 0.41083 0.25838 0.24288 0.38757 0.69763l-0.75706 0.18087q-0.06718-0.29456-0.28164-0.46509-0.21187-0.17053-0.51676-0.17053-0.42116 0-0.68471 0.30231-0.26097 0.30231-0.26097 0.97927 0 0.7183 0.25838 1.0232 0.25838 0.30489 0.67179 0.30489 0.30489 0 0.52452-0.19379 0.21962-0.19379 0.31523-0.60978z"/><path d="m30.242 7.3193 0.74414-0.072347q0.06718 0.37465 0.2713 0.55035 0.2067 0.1757 0.55552 0.1757 0.36949 0 0.55552-0.15503 0.18862-0.15761 0.18862-0.3669 0-0.13436-0.0801-0.22738-0.077514-0.095602-0.27388-0.16536-0.13436-0.046509-0.61237-0.16536-0.61495-0.15245-0.863-0.37465-0.34882-0.31264-0.34882-0.76223 0-0.28939 0.16278-0.54002 0.16536-0.25321 0.47284-0.38499 0.31006-0.13178 0.74672-0.13178 0.71314 0 1.0723 0.31264 0.36174 0.31264 0.37982 0.83457l-0.76481 0.03359q-0.04909-0.29197-0.21187-0.41858-0.1602-0.12919-0.48317-0.12919-0.33331 0-0.52193 0.13694-0.12144 0.08785-0.12144 0.23513 0 0.13436 0.11369 0.22996 0.14469 0.12144 0.7028 0.25321t0.82424 0.27389q0.26872 0.13953 0.41858 0.38499 0.15244 0.24288 0.15244 0.60203 0 0.32556-0.18087 0.60978-0.18087 0.28422-0.5116 0.42375-0.33073 0.13694-0.82424 0.13694-0.7183 0-1.1033-0.33073-0.38499-0.33331-0.45992-0.96893z"/></g> <g fill="#ddd" stroke="#ddd" stroke-width=".1" ><path d="m1.4629 4.2437v-2.8324h-1.0116v-0.57671h2.7091v0.57671h-1.0092v2.8324z"/><path d="m3.607 4.2437v-3.4091h1.4487q0.54648 0 0.79297 0.093018 0.24882 0.090692 0.39765 0.32556 0.14883 0.23487 0.14883 0.53718 0 0.3837-0.22557 0.63484-0.22557 0.24882-0.67438 0.31393 0.22324 0.13022 0.36742 0.28603 0.1465 0.1558 0.393 0.55345l0.41625 0.66508h-0.82321l-0.49764-0.74182q-0.2651-0.39765-0.36277-0.49997-0.097668-0.10464-0.20696-0.14185-0.1093-0.039532-0.34649-0.039532h-0.13953v1.4232zm0.68833-1.9673h0.50927q0.49532 0 0.61857-0.041858t0.19301-0.14418q0.069763-0.10232 0.069763-0.2558 0-0.17208-0.093018-0.27673-0.090692-0.10697-0.25812-0.13488-0.083716-0.011627-0.50229-0.011627h-0.53718z"/><path d="m10.118 4.2437h-0.74879l-0.29766-0.77437h-1.3627l-0.28138 0.77437h-0.73019l1.3278-3.4091h0.72786zm-1.2674-1.3488-0.46974-1.265-0.46044 1.265z"/><path d="m10.481 0.8346h1.2581q0.42556 0 0.6488 0.065112 0.29998 0.088367 0.51392 0.31393 0.21394 0.22557 0.32556 0.55345 0.11162 0.32556 0.11162 0.8046 0 0.4209-0.10464 0.72554-0.1279 0.37207-0.36509 0.60229-0.17906 0.17441-0.48369 0.27208-0.22789 0.072089-0.60926 0.072089h-1.2953zm0.68833 0.57671v2.258h0.51392q0.28835 0 0.41625-0.032556 0.16743-0.041858 0.27673-0.14185 0.11162-0.099994 0.18138-0.32789 0.06976-0.23022 0.06976-0.62554t-0.06976-0.60694-0.19534-0.33021q-0.12557-0.1186-0.31858-0.16046-0.14418-0.032556-0.56508-0.032556z"/><path d="m13.902 4.2437v-3.4091h0.68833v3.4091z"/><path d="m15.253 4.2437v-3.4091h0.66973l1.3953 2.2766v-2.2766h0.6395v3.4091h-0.69066l-1.3743-2.2231v2.2231z"/><path d="m20.271 2.9903v-0.57438h1.4836v1.3581q-0.21627 0.20929-0.62787 0.36974-0.40928 0.15813-0.83018 0.15813-0.53485 0-0.9325-0.22324-0.39765-0.22557-0.59764-0.64182-0.19999-0.41858-0.19999-0.90925 0-0.53253 0.22324-0.94645 0.22324-0.41393 0.65345-0.63484 0.32789-0.16976 0.81623-0.16976 0.63484 0 0.99064 0.26743 0.35812 0.2651 0.46044 0.73484l-0.68368 0.1279q-0.072088-0.25115-0.27208-0.39532-0.19766-0.1465-0.49532-0.1465-0.45114 0-0.71856 0.28603-0.2651 0.28603-0.2651 0.84879 0 0.60694 0.26975 0.91157 0.26975 0.30231 0.70693 0.30231 0.21627 0 0.43253-0.083716 0.21859-0.086041 0.3744-0.20696v-0.43253z"/></g> </svg> </a> <div class="d-flex align-items-center nav-options"> <div class="d-flex align-items-center nav-entry-link-group"> <a class="nav-entry-link d-none d-md-block" href="/calendar"><span>Calendar</span></a> <a class="nav-entry-link d-none d-md-block" href="/stream"><span>News</span></a> <div class="dropdown"> <a href="#" class="dropdown d-flex nav-entry-link d-none d-md-block" data-bs-toggle="dropdown"><span>Markets</span></a> <ul class="dropdown-menu nav-dropdown-menu"> <li class='dropdown-item nav-dropdown-item'><a href="/commodities">Commodities</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/currencies">Currencies</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/stocks">Stocks</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/bonds">Bonds</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/crypto">Crypto</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/earnings">Earnings</a></li> </ul> </div> <a class="nav-entry-link d-none d-lg-block" href="/indicators"><span>Indicators</span></a> <a class="nav-entry-link d-none d-xl-block" href="/countries"><span >Countries</span></a> <div class="dropdown"> <a href="#" class="dropdown d-flex nav-entry-link d-none d-md-block" data-bs-toggle="dropdown"><span>Forecasts</span></a> <ul class="dropdown-menu nav-dropdown-menu"> <li class='dropdown-item nav-dropdown-item'><a href="/forecast/commodity">Commodities</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/forecast/currency">Currencies</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/forecast/stock-market">Stocks</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/forecast/government-bond-10y">Bonds</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/forecast/crypto">Crypto</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/forecasts">Countries</a></li> <li class='dropdown-item nav-dropdown-item'><a href="/indicators?g=forecast">Indicators</a></li> </ul> </div> </div> <div class="search-li d-none d-lg-block"> <a noref id="thisIsTheSearchPlaceholderId" class="nav-searchbox-class stickydropdown d-block" title="Search"> <div id="thisIsTheSearchBoxWrapperId" class="typeahead-searchbox-glyphicon-wrapper d-flex "> <input type="text" placeholder="Search" aria-label="Search" id="thisIstheSearchBoxIdTag" autocomplete="off" class="d-none d-md-block nav-search-input-class"> </div> </a> <ul id="thisIstheSearchResultsIdTag" class="dropdown-menu nav-dropdown-menu typeahead-wrapper"> <li> <div class="container"> <div id="dpSearch-resultCnt" class="dpTaResult"> </div> </div> </li> </ul> </div> <div> <a class="d-block d-lg-none navbar-mobile-item" id="thisIsTheTinyGlyphiconId"><i class="bi bi-search me-2"></i></a> </div> <div class="dropdown dropdown-notification-list"> <button class="btn btn-notification-list" type="button" id="dropdownNotificationList" data-bs-toggle="offcanvas" data-bs-target="#offcanvasTop"> <svg xmlns="http://www.w3.org/2000/svg" width="21px" height="21px" viewBox="0 0 24 24" id="notification-empty" style="vertical-align:middle !important" data-name="notification-empty"><rect id="view-box" width="24" height="24" fill="none"/><path id="Shape" d="M6,17v-.5H2.25A2.253,2.253,0,0,1,0,14.25v-.382a2.542,2.542,0,0,1,1.415-2.289A1.248,1.248,0,0,0,2.1,10.572l.446-4.91a6.225,6.225,0,0,1,12.4,0l.446,4.91a1.26,1.26,0,0,0,.686,1.005,2.547,2.547,0,0,1,1.418,2.29v.382a2.252,2.252,0,0,1-2.25,2.25H11.5V17A2.75,2.75,0,0,1,6,17Zm1.5,0A1.25,1.25,0,0,0,10,17v-.5H7.5ZM4.045,5.8,3.6,10.708A2.738,2.738,0,0,1,2.089,12.92a1.055,1.055,0,0,0-.589.949v.382A.751.751,0,0,0,2.25,15h13A.751.751,0,0,0,16,14.25v-.382a1.054,1.054,0,0,0-.586-.948A2.739,2.739,0,0,1,13.9,10.708L13.456,5.8a4.725,4.725,0,0,0-9.411,0Z" transform="translate(3.25 2.25)" fill="#ddd"/></svg> <svg xmlns="http://www.w3.org/2000/svg" width="21px" height="21px" viewBox="0 0 24 24" id="notification-new" style="vertical-align:middle !important; display:none" data-name="notification-new"><rect id="view-box" width="24" height="24" fill="none" /><path id="Shape" d="M6,17v-.5H2.25A2.253,2.253,0,0,1,0,14.25v-.382a2.542,2.542,0,0,1,1.415-2.289A1.247,1.247,0,0,0,2.1,10.572l.446-4.91A6.227,6.227,0,0,1,10.618.286a5.477,5.477,0,0,0-.635,1.374A4.794,4.794,0,0,0,8.75,1.5,4.7,4.7,0,0,0,4.045,5.8L3.6,10.708A2.739,2.739,0,0,1,2.089,12.92a1.055,1.055,0,0,0-.589.949v.382A.751.751,0,0,0,2.25,15h13A.751.751,0,0,0,16,14.25v-.382a1.053,1.053,0,0,0-.586-.948A2.739,2.739,0,0,1,13.9,10.708l-.2-2.18a5.473,5.473,0,0,0,1.526.221l.166,1.822a1.26,1.26,0,0,0,.686,1.005,2.547,2.547,0,0,1,1.418,2.29v.382a2.252,2.252,0,0,1-2.25,2.25H11.5V17A2.75,2.75,0,0,1,6,17Zm1.5,0A1.25,1.25,0,0,0,10,17v-.5H7.5ZM15.047,6.744A3.486,3.486,0,0,1,13.5,6.28L13.456,5.8a4.7,4.7,0,0,0-1.648-3.185,3.5,3.5,0,0,1,.61-1.417A6.221,6.221,0,0,1,14.95,5.662l.1,1.081v0Z" transform="translate(3.25 2.25)" fill="#ddd" /> <path id="Shape-2" data-name="Shape" d="M3.5,7A3.5,3.5,0,1,1,7,3.5,3.5,3.5,0,0,1,3.5,7Z" transform="translate(15 2)" fill="#4287f5" /> </svg> </button> <div class="offcanvas offcanvas-top notification-list container custom-offcanvas" tabindex="-1" id="offcanvasTop" data-bs-scroll="true" aria-labelledby="offcanvasTopLabel" style="top:50px !important; border: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);"> <div class="empty-notificationlist"> <div class="empty-notificationlist-content"> <span>You have no new notifications</span> <br> <i class="bi bi-bell-slash-fill"></i> <br> <div><a href="/stream" title="Show all news" class="empty-notificationlist-more"><div class="btn btn-outline-secondary">All News</div></a></div> </div> </div> </div> </div> <div class="userOptionsMenu"> <a title="" data-bs-toggle="offcanvas" href="#offcanvasGuest" role="button" aria-controls="offcanvasGuest"><i class="bi bi-person"></i></a> </div> </div> </div> </div> </div> <div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasGuest" aria-labelledby="offcanvasGuestLabel"> <div class="offcanvas-header"> <h5 class="offcanvas-title" id="offcanvasGuestLabel"><b>Members</b></h5> <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button> </div> <div class="offcanvas-body user-offcanvas-body"> <div class="list-group list-group-user"> <a href="/analytics/pricing.aspx?source=menu " class="user-item list-group-item"> <b class="list-group-item-heading"><i class="bi bi-save2-fill me-2"></i>&nbsp;DATA PLANS</b><br> <span class="list-group-item-text">Download historical data for 20 million indicators using your browser.</span> </a> <div class="user-item list-group-item"> <div class="navbar-user-link"> <a href="/analytics/pricing.aspx?source=menu" class="navbar-te-link mx-1">Subscription Plans</a> | <a href="/analytics/features.aspx?source=menu" class="navbar-te-link mx-1">Features</a> </div> </div> </div> <div class="list-group list-group-user"> <a href="/api/" class="user-item list-group-item"> <b class="list-group-item-heading"><i class="bi bi-phone mx-1 me-2"></i>API GATEWAY</b><br> <span class="list-group-item-text mx-1">Direct access to our data from your apps using any programing language.</span> </a> <div class="user-item list-group-item"> <div> <a href="https://docs.tradingeconomics.com/" target="_blank" class="navbar-te-link mx-1">Docs</a> | <a href="/api/?source=menu" class="navbar-te-link mx-1">Features</a> | <a href="https://developer.tradingeconomics.com/" class="navbar-te-link mx-1">Developer</a> </div> </div> </div> <div class="list-group list-group-user"> <a class="user-item list-group-item" href="https://sso.tradingeconomics.com/sso/login?returnurl=https://tradingeconomics.com/"><i class="bi bi-person-fill"></i> Already a user? <b>Login</b></a> </div> <style> .form-switch { width: 3.5em !important; height: 2em !important } .bi-sun-fill { font-size: 12px; color: #ddd !important; } .bi-moon-fill { font-size: 10px; color: #333 !important; } .darkmode-toggle-container { width: auto; padding: 0px; margin-left: 0px; margin-top: 0px; border: none; } .form-check-div-sun { width: 20px; margin-bottom: 3px; margin-left: -54px; position: relative } .form-check-div-moon { width: 20px; margin-bottom: 3px; margin-left: 3px; position: relative } .dk-switch-right-menu{ padding-left:10px; } </style> <div class="list-group list-group-user dk-switch-right-menu"> <div class="d-flex align-items-center darkmode-toggle-container"> <div class="form-check form-switch darkmode-form-switch user-item"> <input class="form-check-input p-1" type="checkbox" role="button" id="flexSwitchCheckChecked"> </div> <div class="form-check-div-sun"> <label class="form-check-label form-check-label-sun p-1 d-inline" for="flexSwitchCheckChecked"><i class="bi bi-sun-fill"></i></label> </div> <div class="form-check-div-moon"> <label class="form-check-label form-check-label-moon p-1 d-inline" for="flexSwitchCheckChecked"><i class="bi bi-moon-fill"></i></label> </div> </div> </div> <script> function SetTheme(isDark) { console.log('Changing theme', isDark); if (IsDarkMode != isDark) { IsDarkMode = isDark; document.body.classList.toggle("dark-theme"); // Set cookie const d = new Date(); d.setTime(d.getTime() + (365 * 24 * 60 * 60 * 1000)); let expires = "expires=" + d.toUTCString(); document.cookie = "IsDarkMode" + "=" + IsDarkMode + ";" + expires + ";path=/"; IsDarkMode ? ga('event', 'te_darkmode_on') : ga('event', 'te_darkmode_off'); window.location.reload(); } } document.addEventListener('DOMContentLoaded', function () { let checkbox = document.getElementById("flexSwitchCheckChecked"); let sundiv = document.getElementsByClassName("form-check-label-sun")[0]; let moondiv = document.getElementsByClassName("form-check-label-moon")[0]; if (IsDarkMode) { sundiv.classList.add("d-none"); moondiv.classList.remove("d-none"); } else { moondiv.classList.add("d-none"); sundiv.classList.remove("d-none"); } checkbox.checked = IsDarkMode; }); document.getElementById("flexSwitchCheckChecked").addEventListener("change", function () { SetTheme(!IsDarkMode) }); </script> </div> </div> <div class="offcanvas offcanvas-start" tabindex="-1" id="tesidemenu" aria-labelledby="tesidemenuoptions"> <div class="offcanvas-header"> <h5 class="offcanvas-title" id="offcanvasWithBothOptionsLabel"></h5> <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button> </div> <div class="offcanvas-body"> <div class="row navbar-nav-scroll" style="--bs-scroll-height: 95vh;"> <div class="accordion" id="accordionNavbar"> <div class="accordion-item"> <div class="accordion-header menu-main-option"><a class="nav-link accordion-button navmenu-mobile-item" href="/calendar" target="_self"><i class="bi bi-calendar3 me-2"></i>Calendar</a></div> </div> <div class="accordion-item"> <div class="accordion-header menu-main-option"><a class="nav-link accordion-button navmenu-mobile-item" href="/stream" target="_self"><i class="bi bi-layout-text-sidebar me-2"></i>News</a></div> </div> <div class="accordion-item"> <div class="accordion-header menu-main-option d-flex align-items-center"> <button class="accordion-button navmenu-mobile-item collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseMarkets" aria-expanded="false" aria-controls="collapseTwo"> <i class="bi bi-arrow-down-up me-2"></i>Markets <i class="bi bi-caret-up-fill ms-auto caret-toggle"></i> </button> </div> <div id="collapseMarkets" class="accordion-collapse collapse show" data-bs-parent="#accordionNavbar"> <div class="accordion-body mobile-accordion-body"> <ul class="nav navbar-nav navbarMobile"> <li><a class="navmobile-link nav-link" href="/currencies" target="_self">Currencies</a></li> <li><a class="navmobile-link nav-link" href="/stocks" target="_self">Stocks</a></li> <li><a class="navmobile-link nav-link" href="/commodities" target="_self">Commodities</a></li> <li><a class="navmobile-link nav-link" href="/bonds" target="_self">Bonds</a></li> <li><a class="navmobile-link nav-link" href="/crypto" target="_self">Crypto</a></li> <li><a class="navmobile-link nav-link" href="/earnings" target="_self">Earnings</a></li> <li><a class="navmobile-link nav-link" href="/holidays" target="_self">Holidays</a></li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header menu-main-option d-flex align-items-center"> <button class="accordion-button navmenu-mobile-item collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCountries" aria-expanded="false" aria-controls="collapseTwo"> <i class="bi bi-globe me-2"></i>Countries<i class="bi bi-caret-down-fill ms-auto caret-toggle"></i> </button> </div> <div id="collapseCountries" class="accordion-collapse collapse" data-bs-parent="#accordionNavbar"> <div class="accordion-body mobile-accordion-body"> <ul class="nav navbar-nav navbarMobile"> <li><a class="navmobile-link nav-link" href="/united-states/indicators" target="_self">United States</a></li> <li><a class="navmobile-link nav-link" href="/united-kingdom/indicators" target="_self">United Kingdom</a></li> <li><a class="navmobile-link nav-link" href="/euro-area/indicators" target="_self">Euro Area</a></li> <li><a class="navmobile-link nav-link" href="/australia/indicators" target="_self">Australia</a></li> <li><a class="navmobile-link nav-link" href="/canada/indicators" target="_self">Canada</a></li> <li><a class="navmobile-link nav-link" href="/japan/indicators" target="_self">Japan</a></li> <li><a class="navmobile-link nav-link" href="/china/indicators" target="_self">China</a></li> <li><a class="navmobile-link nav-link" href="/brazil/indicators" target="_self">Brazil</a></li> <li><a class="navmobile-link nav-link" href="/russia/indicators" target="_self">Russia</a></li> <li><a class="navmobile-link nav-link" href="/india/indicators" target="_self">India</a></li> <li><a class='navmobile-link nav-link' href="/countries" target="_self"><i class="bi bi-plus-square me-2"></i>More Countries</a></li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header menu-main-option d-flex align-items-center"> <button class="accordion-button navmenu-mobile-item collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseIndicators" aria-expanded="false" aria-controls="collapseTwo"> <i class="bi bi-bar-chart-fill me-2"></i>Indicators <i class="bi bi-caret-down-fill ms-auto caret-toggle"></i> </button> </div> <div id="collapseIndicators" class="accordion-collapse collapse" data-bs-parent="#accordionNavbar"> <div class="accordion-body mobile-accordion-body"> <ul class="nav navbar-nav navbarMobile"> <li><a class="navmobile-link nav-link" href="/country-list/interest-rate" target="_self">Interest Rate</a></li> <li><a class="navmobile-link nav-link" href="/country-list/inflation-rate" target="_self">Inflation Rate</a></li> <li><a class="navmobile-link nav-link" href="/country-list/unemployment-rate" target="_self">Unemployment Rate</a></li> <li><a class="navmobile-link nav-link" href="/country-list/gdp-growth-rate" target="_self">GDP Growth</a></li> <li><a class="navmobile-link nav-link" href="/country-list/gdp-per-capita" target="_self">GDP per Capita</a></li> <li><a class="navmobile-link nav-link" href="/country-list/current-account-to-gdp" target="_self">Current Account</a></li> <li><a class="navmobile-link nav-link" href="/country-list/gold-reserves" target="_self">Gold Reserves</a></li> <li><a class="navmobile-link nav-link" href="/country-list/government-debt-to-gdp" target="_self">Government Debt</a></li> <li><a class="navmobile-link nav-link" href="/country-list/crude-oil-production" target="_self">Crude Oil Production</a></li> <li><a class="navmobile-link nav-link" href="/country-list/gasoline-prices" target="_self">Gasoline Prices</a></li> <li><a class="navmobile-link nav-link" href="/country-list/rating" target="_self">Credit Rating</a></li> <li><a class='navmobile-link nav-link' href="/indicators" target="_self"><i class="bi bi-plus-square me-2"></i>More Indicators</a></li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header menu-main-option d-flex align-items-center"> <button class="accordion-button navmenu-mobile-item collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseForecasts" aria-expanded="false" aria-controls="collapseTwo"> <i class="bi bi-graph-down-arrow me-2"></i>Forecasts <i class="bi bi-caret-down-fill ms-auto caret-toggle"></i> </button> </div> <div id="collapseForecasts" class="accordion-collapse collapse" data-bs-parent="#accordionNavbar"> <div class="accordion-body mobile-accordion-body"> <ul class="nav navbar-nav navbarMobile"> <li class="d-block d-sm-none"><a class="navmobile-link nav-link" href="/indicators?g=forecast" target="_self">Markets & Indicators</a></li> <li class="d-block d-sm-none"><a class="navmobile-link nav-link" href="/forecasts" target="_self">Countries</a></li> <li class="d-none d-sm-block"><a class='navmobile-link nav-link' href="/forecasts">Countries</a></li> <li class="d-none d-sm-block"><a class='navmobile-link nav-link' href="/indicators?g=forecast">Indicators</a></li> <li class="d-none d-sm-block"><a class='navmobile-link nav-link' href="/forecast/currency">Currencies</a></li> <li class="d-none d-sm-block"><a class='navmobile-link nav-link' href="/forecast/stock-market">Stocks</a></li> <li class="d-none d-sm-block"><a class='navmobile-link nav-link' href="/forecast/commodity">Commodities</a></li> <li class="d-none d-sm-block"><a class='navmobile-link nav-link' href="/forecast/government-bond-10y">Bonds</a></li> <li class="d-none d-sm-block"><a class='navmobile-link nav-link' href="/forecast/crypto">Crypto</a></li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header menu-main-option d-flex align-items-center"> <button class="accordion-button navmenu-mobile-item collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseSolutions" aria-expanded="false" aria-controls="collapseTwo"> <i class="bi bi-code-square me-2"></i>Solutions <i class="bi bi-caret-down-fill ms-auto caret-toggle"></i> </button> </div> <div id="collapseSolutions" class="accordion-collapse collapse" data-bs-parent="#accordionNavbar"> <div class="accordion-body mobile-accordion-body"> <ul class="nav navbar-nav navbarMobile"> <li><a class="navmobile-link nav-link" href="/analytics/features.aspx" title="Register">Data Subscriptions</a></li> <li><a class="navmobile-link nav-link" href="/api/" title="Register">API Access</a></li> <li><a class="navmobile-link nav-link" href="/analytics/pricing.aspx?source=nav">Pricing</a></li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header menu-main-option d-flex align-items-center"> <button class="accordion-button navmenu-mobile-item collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseApps" aria-expanded="false" aria-controls="collapseTwo"> <i class="bi bi-phone me-2"></i>Apps <i class="bi bi-caret-down-fill ms-auto caret-toggle"></i> </button> </div> <div id="collapseApps" class="accordion-collapse collapse" data-bs-parent="#accordionNavbar"> <div class="accordion-body mobile-accordion-body"> <ul class="nav navbar-nav navbarMobile"> <li><a class="navmobile-link nav-link" href="https://itunes.apple.com/us/app/trading-economics/id1142178921?mt=8" target="_self">App Store</a></li> <li><a class="navmobile-link nav-link" href="https://play.google.com/store/apps/details?id=com.tradingeconomics.calendar" target="_self">Google Play</a></li> <li><a class="navmobile-link nav-link" href="https://www.twitter.com/teconomics" target="_self">Twitter</a></li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header menu-main-option d-flex align-items-center"> <button class="accordion-button navmenu-mobile-item collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseMore" aria-expanded="false" aria-controls="collapseTwo"> <i class="bi bi-question-circle me-2"></i>About <i class="bi bi-caret-down-fill ms-auto caret-toggle"></i> </button> </div> <div id="collapseMore" class="accordion-collapse collapse" data-bs-parent="#accordionNavbar"> <div class="accordion-body mobile-accordion-body"> <ul class="nav navbar-nav navbarMobile"> <li><a class="navmobile-link nav-link" href="/api/customers.aspx" target="_self">Customers</a></li> <li><a class="navmobile-link nav-link" href="/investors.aspx" target="_self">Investors</a></li> <li><a class="navmobile-link nav-link" href="/careers.aspx" target="_self">Careers</a></li> <li><a class="navmobile-link nav-link" href="/about-te.aspx" target="_self">About us</a></li> <li><a class="navmobile-link nav-link" href="/contact.aspx" target="_self">Contact</a></li> </ul> </div> </div> </div> <div class="accordion-item d-block d-md-none" style="border: none"> <div class="accordion-header menu-main-option accordion-last-item" style="padding: 30px 0px !important;"></div> </div> </div> </div> </div> </div> </div> </nav> <script> document.addEventListener('DOMContentLoaded', function () { let accordionHeaders = document.querySelectorAll('.menu-main-option'); accordionHeaders.forEach(function (header) { header.addEventListener('click', function () { let caretIcon = header.querySelector('.caret-toggle'); let allCaretIcons = document.querySelectorAll('.menu-main-option .caret-toggle'); allCaretIcons.forEach(function (icon) { if (icon !== caretIcon) { icon.classList.remove('bi-caret-up-fill'); icon.classList.add('bi-caret-down-fill'); } }); caretIcon.classList.toggle('bi-caret-down-fill'); caretIcon.classList.toggle('bi-caret-up-fill'); }); }); }); </script> <div class="container"> <div class="row"> <div class='col-xl-12' role="main"> <style>body{background-color:#f2f2f2;padding-top:70px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{padding-right:10px;padding-left:10px}@media only screen and (max-width:575px){body{padding-top:55px!important}.thumbnail{padding:5px}}</style> <div class="row"> <div class='col-lg-8'> <style> .headline-title{ font-size: 2em; line-height: 1.2em; font-weight: bold; color: #fff; } .headline-content { padding: 15px; padding-top: 30px; padding-bottom: 22px; } .headline-content { max-width: 500px;} </style> <div id="ctl00_ContentPlaceHolder1__ffef09c27bddabb9_panel1"> <style>.headlines{min-height: 310px; background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('https://d1koue9segiqoj.cloudfront.net/2023/ny.jpg'); background-size: cover; background-position: center; background-repeat: no-repeat;}</style> <div class="thumbnail headlines"> <div class="row"> <div class="col-lg-12"> <div class="headline-content"> <a href='/united-states/composite-pmi' style="text-decoration: none"> <span class="headline-title" href='/united-states/composite-pmi'> US Private Sector Growth Slows Sharply </span> <br /> <br /> <span class="headlines-description" style="color: #fff">The S&P Global Flash US Composite PMI fell sharply to 50.4 in February from 52.7 in January, pointing to the slowest growth in private sector activity in 17 months, as a renewed fall in services output offset faster manufacturing growth. New orders also weakened sharply and business expectations slumped amid increasing concerns and uncertainty related to federal government policies. In addition, input cost pressures intensified.</span> </a> <br /> </div> </div> </div> </div> </div> <style> .home-tile-outside { height: 226px } .home-tile-inside { padding-left: 5px; padding-top: 5px; display: flex; flex-direction: column; height: 100%; padding-bottom: 13px; } .home-tile-description { overflow: hidden; text-overflow: ellipsis; flex-grow: 1; } #hometiles { padding-left: 2px; padding-right: 2px } .more-news { width: 100%; text-align: right; text-decoration: underline; margin-top: -15px; margin-bottom: 5px } @media only screen and (max-width:428px) { .home-tile-outside { height: unset } .home-tile-inside { padding: 15px } #hometiles { margin-top: -15px } #hometiles .thumbnail { margin-bottom: 5px } .more-news { margin-top: 10px; text-align: left; margin-bottom: 20px } } .home-tile-timespan { color: #808080; text-align: left; width: 100%; font-size: 0.8em; margin-top: 9px } </style> <div class="row" id="hometiles"> <div class="col-lg-4 col-md-6 col-xs-12"> <div class="thumbnail home-tile-outside"> <a href='/united-states/stock-market' style="text-decoration: none;"> <div class="home-tile-inside"> <b>US Stocks Tumble Amid Economic Concerns</b> <div class="home-tile-description">US stocks plunged on Friday as economic data raised concerns about a slowing US economy and persistent inflation, prompting investors to seek safer assets. The S&P 500 lost 1.7%, and the Nasdaq 100 slipped 2.1%, while the Dow Jones plunged 748 points, marking its biggest loss of the year. UnitedHealth shares plunged 7.2% following reports that the Department of Justice is investigating its Medicare billing practices, making it the worst-performing Dow component. Consumer sentiment also took a hit, with the University of Michigan’s index falling to 64.7, reflecting growing concerns over inflation, which consumers now expect to rise to 4.3% in the coming year. The slide followed Walmart's (-2.5%) disappointing outlook and broader fears about the impact of President Trump's tariff policies. On the week, the S&P 500 dropped by 1.6%, while the Dow and Nasdaq slipped 2.5% and 2.4%, respectively.</div> <div class="home-tile-timespan"> 31 hours ago </div> </div> </a> </div> </div> <div class="col-lg-4 col-md-6 col-xs-12"> <div class="thumbnail home-tile-outside"> <a href='/calendar?article=29286&g=top&importance=2&startdate=2025-02-21' style="text-decoration: none;"> <div class="home-tile-inside"> <b>Week Ahead - Feb 24th</b> <div class="home-tile-description">Next week, investors will focus on speeches by several Federal Reserve officials in the United States, alongside key economic data, including personal income and spending, PCE price indices, durable goods orders, the second estimate of Q4 GDP growth, and CB consumer sentiment. In the housing sector, attention will be on the S&P/Case-Shiller Home Price YoY data, as well as new and pending home sales. Globally, inflation figures will be released for France, Italy, Germany, Spain, South Africa, and Australia. GDP growth rates are expected from Switzerland, Turkey, Brazil, India, and Canada. Meanwhile, Germany will publish its Ifo Business Climate Index, GfK consumer confidence, and retail sales figures.</div> <div class="home-tile-timespan"> 35 hours ago </div> </div> </a> </div> </div> <div class="col-lg-4 col-md-6 col-xs-12"> <div class="thumbnail home-tile-outside"> <a href='/united-states/consumer-confidence' style="text-decoration: none;"> <div class="home-tile-inside"> <b>Michigan Consumer Sentiment Revised Sharply Lower</b> <div class="home-tile-description">The University of Michigan consumer sentiment for the US was revised sharply lower to 64.7 in February 2025 from a preliminary of 67.8, reaching the lowest level since November 2023. The gauge for current economic conditions was also revised lower to 65.7 from 68.7 and the expectations subindex was revised down to 64 from 67.3. The decrease in sentiment was unanimous across groups by age, income, and wealth. The drop was led by a 19% plunge in buying conditions for durables, in large part due to fears that tariff-induced price increases are imminent. Expectations for personal finances and the short-run economic outlook both declined almost 10%, while the long-run economic outlook fell back about 6% to its lowest reading since November 2023. Meanwhile, inflation expectations for the year-ahead soared to 4.3%, the highest since November 2023. The five-year outlook increased to 3.5% from a preliminary of 3.3% and above 3.2% in January, the largest mom increase seen since May 2021.</div> <div class="home-tile-timespan"> 37 hours ago </div> </div> </a> </div> </div> <div class="col-lg-4 col-md-6 col-xs-12"> <div class="thumbnail home-tile-outside"> <a href='/united-states/existing-home-sales' style="text-decoration: none;"> <div class="home-tile-inside"> <b>US Existing Home Sales Slump More than Expected</b> <div class="home-tile-description">Existing home sales in the US sank by 4.9% to a seasonally adjusted annualized rate of 4.08 million in January of 2025, the sharpest decline in seven months, and missing market expectations of 4.12 million. "Mortgage rates have refused to budge for several months despite multiple rounds of short-term interest rate cuts by the Federal Reserve. When combined with elevated home prices, housing affordability remains a major challenge." The median price for existing home sales inched 1.9% lower from the previous month to $396,000. In the meantime, inventory of unsold housing grew to 3.9 months of supply at the current sales pace from 3.7 months of supply in December. From the previous year, existing home sales were 2% higher</div> <div class="home-tile-timespan"> 37 hours ago </div> </div> </a> </div> </div> <div class="col-lg-4 col-md-6 col-xs-12"> <div class="thumbnail home-tile-outside"> <a href='/canada/retail-sales' style="text-decoration: none;"> <div class="home-tile-inside"> <b>Canadian Retail Sales Set to Fall in January</b> <div class="home-tile-description">Retail sales in Canada are expected to ease by 0.4% from the previous month in January of 2025, the first drop in seven months, according to preliminary estimates. That follows a 2.5% surge in the final month of 2024, revised higher from the preliminary estimate of 1.6%, to mark the sharpest rise in retail turnover since May of 2022. Sales were up in all nine subsectors, led by surges in food and beverage retailers (3.5%) and sales in gasoline stations and fuel vendors (4.2%). Core sectors for consumers were also higher, with turnover increasing sharply in general merchandise retailers (3.2%) and clothing, accessories, shoes, and apparel retailers (3.1%). While remaining high, sales growth missed the average increase in motor vehicle and parts dealers (1.9%) and building material and garden equipment dealers (2.4%). From the previous year, retail turnover was 3.6%, the sharpest increase in nearly two years.</div> <div class="home-tile-timespan"> 38 hours ago </div> </div> </a> </div> </div> <div class="col-lg-4 col-md-6 col-xs-12"> <div class="thumbnail home-tile-outside"> <a href='/germany/government-bond-yield' style="text-decoration: none;"> <div class="home-tile-inside"> <b>German 10-Year Bund Yield Falls Below 2.5%</b> <div class="home-tile-description">Germany’s 10-year bond yield fell below 2.5% after recent data reinforced the view that the European Central Bank needs to cut rates more aggressively to help the economy. Eurozone business activity remained stagnant in February, with Germany seeing a slight acceleration in expansion, and France experiencing its sharpest contraction in over a year. As a result, markets now pricing in 78 bps of easing this year, up from 74 bps on Thursday. Meanwhile, investors will be closely watching Germany’s general election on Sunday. Polls suggest the conservative CDU/CSU bloc is poised to win but will likely need coalition partners to govern. Traders also weighed geopolitical risks, particularly as the US signaled plans to scale back support for Ukraine while engaging in negotiations with Russia excluding both Ukraine and Europe. Additionally, President Trump signaled plans for a 25% tariff on auto, semiconductor, and pharmaceutical imports from April 2, potentially hitting European carmakers.</div> <div class="home-tile-timespan"> 42 hours ago </div> </div> </a> </div> </div> </div> </div> <div class='col-lg-4'> <style> #market-widget .nav {flex-wrap:nowrap;}#market-widget .nav>li>a {padding-left: 3px;padding-right: 3px;outline:none;} .market-widget-thead{font-size: 12px;}.market-widget-th-left{text-align: left;}.market-widget-th-center{text-align: center;}.market-widget-row{padding: 0px;}.market-widget-first{padding-left: 10px!important; max-width: 80px; overflow: hidden;}.market-widget-last{text-align: center;max-width: 70px; overflow: hidden;}.market-widget-change{text-align: left; min-width: 70px}.market-widget-pct{text-align: center;} @media only screen and (max-width: 380px) {#market-widget .nav > li > a {padding-left: 3px;padding-right: 3px;}} .modal{ --bs-modal-header-border-color: none !important; --bs-modal-footer-border-color:none !important; } </style> <style> .market-widget-thead { display:none } </style> <div id="ctl00_ContentPlaceHolder1_ctl02_MarketsTableWidget_Panel1"> <div id="market-widget" class="card"> <ul class="nav nav-tabs " role="tablist" id="mainWidget"> <li role="presentation" class="nav-item"><a aria-current="page" href="#Commodity" class=" nav-link d-table-cell" role="tab" data-bs-toggle="tab">Commodity</a></li> <li role="presentation" class="nav-item"><a aria-current="page" href="#FX" class=" nav-link d-table-cell" role="tab" data-bs-toggle="tab">Forex</a></li> <li role="presentation" class="nav-item"><a aria-current="page" href="#Index" class=" nav-link d-table-cell" role="tab" data-bs-toggle="tab">Index</a></li> <li role="presentation" class="nav-item d-lg-none d-xl-block"><a aria-current="page" href="#Share" class=" nav-link d-table-cell" role="tab" data-bs-toggle="tab">Stocks</a></li> <li role="presentation" class="nav-item"><a aria-current="page" href="#Bond" class=" nav-link d-table-cell" role="tab" data-bs-toggle="tab">Bond</a></li> <li role="presentation" class="nav-item"><a aria-current="page" href="#Crypto" class="active nav-link d-table-cell" role="tab" data-bs-toggle="tab">Crypto</a></li> </ul> <div class="tab-content" style="margin-bottom: -15px"> <input type="hidden" name="ctl00$ContentPlaceHolder1$ctl02$MarketsTableWidget$Repeater1$ctl00$group" id="ctl00_ContentPlaceHolder1_ctl02_MarketsTableWidget_Repeater1_ctl00_group" value="Commodity" /> <div role="tabpanel" class="tab-pane fade show " id='Commodity'> <table class="table table-condensed" style="padding-bottom: -10px;"> <thead class="market-widget-thead"> <tr> <th> </th> <th style="text-align: center;">Actual</th> <th style="text-align: left;" class="d-lg-none d-xl-table-cell">Chg</th> <th style="text-align: center;">%Chg</th> </tr> </thead> <tbody> <tr class='datatable-row' data-symbol="CL1:COM" data-decimals="3"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/crude-oil">Crude Oil</a> </td> <td id="p" class="market-widget-last"> 70.400 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 2.08 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -2.87% </td> </tr> <tr class='datatable-row-alternating' data-symbol="CO1:COM" data-decimals="3"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/brent-crude-oil">Brent</a> </td> <td id="p" class="market-widget-last"> 74.430 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 2.05 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -2.68% </td> </tr> <tr class='datatable-row' data-symbol="NG1:COM" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/natural-gas">Natural gas</a> </td> <td id="p" class="market-widget-last"> 4.2340 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.08 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 1.98% </td> </tr> <tr class='datatable-row-alternating' data-symbol="XB1:COM" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/gasoline">Gasoline</a> </td> <td id="p" class="market-widget-last"> 2.0320 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.05 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -2.57% </td> </tr> <tr class='datatable-row' data-symbol="HO1:COM" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/heating-oil">Heating Oil</a> </td> <td id="p" class="market-widget-last"> 2.4316 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.07 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -2.81% </td> </tr> <tr class='datatable-row-alternating' data-symbol="XAUUSD:CUR" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/gold">Gold</a> </td> <td id="p" class="market-widget-last"> 2934.00 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 7.35 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.25% </td> </tr> <tr class='datatable-row' data-symbol="XAGUSD:CUR" data-decimals="3"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/silver">Silver</a> </td> <td id="p" class="market-widget-last"> 32.509 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.43 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.30% </td> </tr> <tr class='datatable-row-alternating' data-symbol="HG1:COM" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/copper">Copper</a> </td> <td id="p" class="market-widget-last"> 4.5355 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.07 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.57% </td> </tr> <tr class='datatable-row' data-symbol="S 1:COM" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/soybeans">Soybeans</a> </td> <td id="p" class="market-widget-last"> 1039.50 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 6.00 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.57% </td> </tr> <tr class='datatable-row-alternating' data-symbol="W 1:COM" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/wheat">Wheat</a> </td> <td id="p" class="market-widget-last"> 590.03 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 4.53 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.77% </td> </tr> <tr class='datatable-row' data-symbol="XAL1:COM" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/coal">Coal</a> </td> <td id="p" class="market-widget-last"> 103.50 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.00 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.00% </td> </tr> <tr class='datatable-row-alternating' data-symbol="JBP:COM" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/steel">Steel</a> </td> <td id="p" class="market-widget-last"> 3300.00 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 9.00 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.27% </td> </tr> <tr class='datatable-row' data-symbol="NGEU:COM" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/eu-natural-gas">TTF Gas</a> </td> <td id="p" class="market-widget-last"> 45.91 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 1.52 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -3.20% </td> </tr> <tr class='datatable-row-alternating' data-symbol="LB1:COM" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/commodity/lumber">Lumber</a> </td> <td id="p" class="market-widget-last"> 621.03 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 3.00 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.49% </td> </tr> </tbody> <tfoot> <tr> <td colspan="2" class="more-link"><a style="text-decoration: underline" aria-label = "Read more" href="/commodities">More</a></td> <td colspan="4" class="widget-link" style=" "> <div class="plus-sign-widget"> <a style="font-size:12px" aria-label="Add widgets" href="javascript:void(0);"onclick="showWidgetModal();"> <i class="bi bi-plus-square-fill"></i> Add to your site</a> </div> </td> </tr> </tfoot> </table> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$ctl02$MarketsTableWidget$Repeater1$ctl01$group" id="ctl00_ContentPlaceHolder1_ctl02_MarketsTableWidget_Repeater1_ctl01_group" value="Currency" /> <div role="tabpanel" class="tab-pane fade show " id='FX'> <table class="table table-condensed" style="padding-bottom: -10px;"> <thead class="market-widget-thead"> <tr> <th> </th> <th style="text-align: center;">Actual</th> <th style="text-align: left;" class="d-lg-none d-xl-table-cell">Chg</th> <th style="text-align: center;">%Chg</th> </tr> </thead> <tbody> <tr class='datatable-row' data-symbol="EURUSD:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/euro-area/currency">EURUSD</a> </td> <td id="p" class="market-widget-last"> 1.04595 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.0042 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.40% </td> </tr> <tr class='datatable-row-alternating' data-symbol="GBPUSD:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/united-kingdom/currency">GBPUSD</a> </td> <td id="p" class="market-widget-last"> 1.26330 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.0036 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.28% </td> </tr> <tr class='datatable-row' data-symbol="AUDUSD:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/australia/currency">AUDUSD</a> </td> <td id="p" class="market-widget-last"> 0.63575 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.0042 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.66% </td> </tr> <tr class='datatable-row-alternating' data-symbol="NZDUSD:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/new-zealand/currency">NZDUSD</a> </td> <td id="p" class="market-widget-last"> 0.57395 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.0023 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.39% </td> </tr> <tr class='datatable-row' data-symbol="USDJPY:CUR" data-decimals="3"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/japan/currency">USDJPY</a> </td> <td id="p" class="market-widget-last"> 149.337 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.3165 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.21% </td> </tr> <tr class='datatable-row-alternating' data-symbol="USDCNY:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/china/currency">USDCNY</a> </td> <td id="p" class="market-widget-last"> 7.25245 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.0166 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.23% </td> </tr> <tr class='datatable-row' data-symbol="USDCHF:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/switzerland/currency">USDCHF</a> </td> <td id="p" class="market-widget-last"> 0.89895 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.0011 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.12% </td> </tr> <tr class='datatable-row-alternating' data-symbol="USDCAD:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/canada/currency">USDCAD</a> </td> <td id="p" class="market-widget-last"> 1.42305 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.0057 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.40% </td> </tr> <tr class='datatable-row' data-symbol="USDMXN:CUR" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/mexico/currency">USDMXN</a> </td> <td id="p" class="market-widget-last"> 20.4216 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.1024 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.50% </td> </tr> <tr class='datatable-row-alternating' data-symbol="USDINR:CUR" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/india/currency">USDINR</a> </td> <td id="p" class="market-widget-last"> 86.6494 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.1799 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.21% </td> </tr> <tr class='datatable-row' data-symbol="USDBRL:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/brazil/currency">USDBRL</a> </td> <td id="p" class="market-widget-last"> 5.73360 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.0292 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.51% </td> </tr> <tr class='datatable-row-alternating' data-symbol="USDRUB:CUR" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/russia/currency">USDRUB</a> </td> <td id="p" class="market-widget-last"> 88.4955 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.1750 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.20% </td> </tr> <tr class='datatable-row' data-symbol="USDKRW:CUR" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/south-korea/currency">USDKRW</a> </td> <td id="p" class="market-widget-last"> 1436.84 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 4.1400 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.29% </td> </tr> <tr class='datatable-row-alternating' data-symbol="DXY:CUR" data-decimals="3"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/united-states/currency">DXY</a> </td> <td id="p" class="market-widget-last"> 106.646 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.2744 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.26% </td> </tr> </tbody> <tfoot> <tr> <td colspan="2" class="more-link"><a style="text-decoration: underline" aria-label = "Read more" href="/currencies">More</a></td> <td colspan="4" class="widget-link" style=" "> <div class="plus-sign-widget"> <a style="font-size:12px" aria-label="Add widgets" href="javascript:void(0);"onclick="showWidgetModal();"> <i class="bi bi-plus-square-fill"></i> Add to your site</a> </div> </td> </tr> </tfoot> </table> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$ctl02$MarketsTableWidget$Repeater1$ctl02$group" id="ctl00_ContentPlaceHolder1_ctl02_MarketsTableWidget_Repeater1_ctl02_group" value="Index" /> <div role="tabpanel" class="tab-pane fade show " id='Index'> <table class="table table-condensed" style="padding-bottom: -10px;"> <thead class="market-widget-thead"> <tr> <th> </th> <th style="text-align: center;">Actual</th> <th style="text-align: left;" class="d-lg-none d-xl-table-cell">Chg</th> <th style="text-align: center;">%Chg</th> <th class=''></th> </tr> </thead> <tbody> <tr class='datatable-row' data-symbol="SPX:IND" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/united-states/stock-market">US500</a> </td> <td id="p" class="market-widget-last"> 6013.13 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 104 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.71% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row-alternating' data-symbol="INDU:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/indu:ind">US30</a> </td> <td id="p" class="market-widget-last"> 43428 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 749 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.69% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row' data-symbol="US100:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/us100:ind">US100</a> </td> <td id="p" class="market-widget-last"> 21614 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 454 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -2.06% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row-alternating' data-symbol="NKY:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/japan/stock-market">JP225</a> </td> <td id="p" class="market-widget-last"> 38777 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 99 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.26% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row' data-symbol="UKX:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/united-kingdom/stock-market">GB100</a> </td> <td id="p" class="market-widget-last"> 8659 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 4 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.04% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row-alternating' data-symbol="DAX:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/germany/stock-market">DE40</a> </td> <td id="p" class="market-widget-last"> 22288 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 27 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.12% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row' data-symbol="CAC:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/france/stock-market">FR40</a> </td> <td id="p" class="market-widget-last"> 8155 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 32 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.39% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row-alternating' data-symbol="FTSEMIB:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/italy/stock-market">IT40</a> </td> <td id="p" class="market-widget-last"> 38421 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 172 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.45% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row' data-symbol="IBEX:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/spain/stock-market">ES35</a> </td> <td id="p" class="market-widget-last"> 12952 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 15 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.12% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row-alternating' data-symbol="AS51:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/australia/stock-market">ASX200</a> </td> <td id="p" class="market-widget-last"> 8296 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 27 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.32% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row' data-symbol="SHCOMP:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/china/stock-market">SHANGHAI</a> </td> <td id="p" class="market-widget-last"> 3379 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 28 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.85% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row-alternating' data-symbol="SENSEX:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/india/stock-market">SENSEX</a> </td> <td id="p" class="market-widget-last"> 75311 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 425 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.56% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row' data-symbol="SPTSX:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/canada/stock-market">TSX</a> </td> <td id="p" class="market-widget-last"> 25147 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 367 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.44% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> <tr class='datatable-row-alternating' data-symbol="INDEXCF:IND" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/russia/stock-market">MOEX</a> </td> <td id="p" class="market-widget-last"> 3283 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 9 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.28% </td> <td id='session' class='d-none d-md-table-cell'><span class='bi bi-clock' style='font-size:10px; color: darkred' title='closed trading session'></span></td> </tr> </tbody> <tfoot> <tr> <td colspan="2" class="more-link"><a style="text-decoration: underline" aria-label = "Read more" href="/stocks">More</a></td> <td colspan="4" class="widget-link" style=" "> <div class="plus-sign-widget"> <a style="font-size:12px" aria-label="Add widgets" href="javascript:void(0);"onclick="showWidgetModal();"> <i class="bi bi-plus-square-fill"></i> Add to your site</a> </div> </td> </tr> </tfoot> </table> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$ctl02$MarketsTableWidget$Repeater1$ctl03$group" id="ctl00_ContentPlaceHolder1_ctl02_MarketsTableWidget_Repeater1_ctl03_group" value="Stocks" /> <div role="tabpanel" class="tab-pane fade show " id='Share'> <table class="table table-condensed" style="padding-bottom: -10px;"> <thead class="market-widget-thead"> <tr> <th> </th> <th style="text-align: center;">Actual</th> <th style="text-align: left;" class="d-lg-none d-xl-table-cell">Chg</th> <th style="text-align: center;">%Chg</th> </tr> </thead> <tbody> <tr class='datatable-row' data-symbol="AAPL:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/aapl:us">Apple</a> </td> <td id="p" class="market-widget-last"> 245.78 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.15 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.06% </td> </tr> <tr class='datatable-row-alternating' data-symbol="TSLA:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/tsla:us">Tesla</a> </td> <td id="p" class="market-widget-last"> 337.98 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 16.56 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -4.67% </td> </tr> <tr class='datatable-row' data-symbol="MSFT:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/msft:us">Microsoft</a> </td> <td id="p" class="market-widget-last"> 408.33 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 7.81 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.88% </td> </tr> <tr class='datatable-row-alternating' data-symbol="AMZN:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/amzn:us">Amazon</a> </td> <td id="p" class="market-widget-last"> 216.66 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 6.31 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -2.83% </td> </tr> <tr class='datatable-row' data-symbol="FB:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/fb:us">Meta</a> </td> <td id="p" class="market-widget-last"> 683.66 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 11.21 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.61% </td> </tr> <tr class='datatable-row-alternating' data-symbol="NVDA:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/nvda:us">Nvidia</a> </td> <td id="p" class="market-widget-last"> 134.67 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 5.43 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -3.88% </td> </tr> <tr class='datatable-row' data-symbol="V:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/v:us">Visa</a> </td> <td id="p" class="market-widget-last"> 348.32 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 2.16 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.62% </td> </tr> <tr class='datatable-row-alternating' data-symbol="JPM:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/jpm:us">JPMorgan</a> </td> <td id="p" class="market-widget-last"> 263.93 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 2.86 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.07% </td> </tr> <tr class='datatable-row' data-symbol="INTC:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/intc:us">Intel</a> </td> <td id="p" class="market-widget-last"> 24.88 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 1.22 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -4.67% </td> </tr> <tr class='datatable-row-alternating' data-symbol="JNJ:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/jnj:us">J&J</a> </td> <td id="p" class="market-widget-last"> 162.32 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 2.67 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 1.67% </td> </tr> <tr class='datatable-row' data-symbol="PG:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/pg:us">P&G</a> </td> <td id="p" class="market-widget-last"> 170.18 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 2.92 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 1.75% </td> </tr> <tr class='datatable-row-alternating' data-symbol="XOM:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/xom:us">Exxon Mobil</a> </td> <td id="p" class="market-widget-last"> 110.68 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 1.43 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.28% </td> </tr> <tr class='datatable-row' data-symbol="GOOG:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/goog:us">Alphabet</a> </td> <td id="p" class="market-widget-last"> 181.56 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 5.30 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -2.84% </td> </tr> <tr class='datatable-row-alternating' data-symbol="GS:US" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/gs:us">Goldman Sachs</a> </td> <td id="p" class="market-widget-last"> 625.79 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 16.97 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -2.64% </td> </tr> </tbody> <tfoot> <tr> <td colspan="2" class="more-link"><a style="text-decoration: underline" aria-label = "Read more" href="/stocks">More</a></td> <td colspan="4" class="widget-link" style=" "> <div class="plus-sign-widget"> <a style="font-size:12px" aria-label="Add widgets" href="javascript:void(0);"onclick="showWidgetModal();"> <i class="bi bi-plus-square-fill"></i> Add to your site</a> </div> </td> </tr> </tfoot> </table> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$ctl02$MarketsTableWidget$Repeater1$ctl04$group" id="ctl00_ContentPlaceHolder1_ctl02_MarketsTableWidget_Repeater1_ctl04_group" value="Bond" /> <div role="tabpanel" class="tab-pane fade show " id='Bond'> <table class="table table-condensed" style="padding-bottom: -10px;"> <thead class="market-widget-thead"> <tr> <th> </th> <th style="text-align: center;">Actual</th> <th style="text-align: left;" class="d-lg-none d-xl-table-cell">Chg</th> <th style="text-align: center;">%Chg</th> </tr> </thead> <tbody> <tr class='datatable-row' data-symbol="USGG10YR:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/united-states/government-bond-yield">United States </a> </td> <td id="p" class="market-widget-last"> 4.4300 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.081 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.08% </td> </tr> <tr class='datatable-row-alternating' data-symbol="GUKG10:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/united-kingdom/government-bond-yield">United Kingdom </a> </td> <td id="p" class="market-widget-last"> 4.5766 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.038 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.04% </td> </tr> <tr class='datatable-row' data-symbol="GJGB10:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/japan/government-bond-yield">Japan </a> </td> <td id="p" class="market-widget-last"> 1.4275 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.023 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.02% </td> </tr> <tr class='datatable-row-alternating' data-symbol="GACGB10:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/australia/government-bond-yield">Australia </a> </td> <td id="p" class="market-widget-last"> 4.5290 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.008 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.01% </td> </tr> <tr class='datatable-row' data-symbol="GDBR10:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/germany/government-bond-yield">Germany </a> </td> <td id="p" class="market-widget-last"> 2.4625 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.071 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.07% </td> </tr> <tr class='datatable-row-alternating' data-symbol="GEBR10Y:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/brazil/government-bond-yield">Brazil </a> </td> <td id="p" class="market-widget-last"> 14.6650 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.043 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.04% </td> </tr> <tr class='datatable-row' data-symbol="RUGE10Y:GOV" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/russia/government-bond-yield">Russia </a> </td> <td id="p" class="market-widget-last"> 15.6700 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.020 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.02% </td> </tr> <tr class='datatable-row-alternating' data-symbol="GIND10YR:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/india/government-bond-yield">India </a> </td> <td id="p" class="market-widget-last"> 6.7640 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.012 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.01% </td> </tr> <tr class='datatable-row' data-symbol="GCAN10YR:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/canada/government-bond-yield">Canada </a> </td> <td id="p" class="market-widget-last"> 3.1050 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.104 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.10% </td> </tr> <tr class='datatable-row-alternating' data-symbol="GBTPGR10:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/italy/government-bond-yield">Italy </a> </td> <td id="p" class="market-widget-last"> 3.5530 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.061 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.06% </td> </tr> <tr class='datatable-row' data-symbol="GFRN10:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/france/government-bond-yield">France </a> </td> <td id="p" class="market-widget-last"> 3.2185 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.051 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.05% </td> </tr> <tr class='datatable-row-alternating' data-symbol="GSAB10YR:GOV" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/south-africa/government-bond-yield">South Africa </a> </td> <td id="p" class="market-widget-last"> 10.5900 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.015 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.02% </td> </tr> <tr class='datatable-row' data-symbol="GCNY10YR:GOV" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/china/government-bond-yield">China </a> </td> <td id="p" class="market-widget-last"> 1.7300 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.040 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.04% </td> </tr> <tr class='datatable-row-alternating' data-symbol="GSWISS10:IND" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/switzerland/government-bond-yield">Switzerland </a> </td> <td id="p" class="market-widget-last"> 0.5535 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.003 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> 0.00% </td> </tr> </tbody> <tfoot> <tr> <td colspan="2" class="more-link"><a style="text-decoration: underline" aria-label = "Read more" href="/bonds">More</a></td> <td colspan="4" class="widget-link" style=" "> <div class="plus-sign-widget"> <a style="font-size:12px" aria-label="Add widgets" href="javascript:void(0);"onclick="showWidgetModal();"> <i class="bi bi-plus-square-fill"></i> Add to your site</a> </div> </td> </tr> </tfoot> </table> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$ctl02$MarketsTableWidget$Repeater1$ctl05$group" id="ctl00_ContentPlaceHolder1_ctl02_MarketsTableWidget_Repeater1_ctl05_group" value="Crypto" /> <div role="tabpanel" class="tab-pane fade show active" id='Crypto'> <table class="table table-condensed" style="padding-bottom: -10px;"> <thead class="market-widget-thead"> <tr> <th> </th> <th style="text-align: center;">Actual</th> <th style="text-align: left;" class="d-lg-none d-xl-table-cell">Chg</th> <th style="text-align: center;">%Chg</th> </tr> </thead> <tbody> <tr class='datatable-row' data-symbol="BTCUSD:CUR" data-decimals="0"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/btcusd:cur">Bitcoin</a> </td> <td id="p" class="market-widget-last"> 96549 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 1,779 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.81% </td> </tr> <tr class='datatable-row-alternating' data-symbol="ETHUSD:CUR" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/ethusd:cur">Ether</a> </td> <td id="p" class="market-widget-last"> 2755.20 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 95.7958 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 3.60% </td> </tr> <tr class='datatable-row' data-symbol="BNBUSD:CUR" data-decimals="1"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/bnbusd:cur">Binance</a> </td> <td id="p" class="market-widget-last"> 667.2 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 11.2700 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 1.72% </td> </tr> <tr class='datatable-row-alternating' data-symbol="ADAUSD:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/adausd:cur">Cardano</a> </td> <td id="p" class="market-widget-last"> 0.76868 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.0356 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -4.43% </td> </tr> <tr class='datatable-row' data-symbol="SOLUSD:CUR" data-decimals="4"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/solusd:cur">Solana</a> </td> <td id="p" class="market-widget-last"> 170.7421 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 1.9321 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 1.14% </td> </tr> <tr class='datatable-row-alternating' data-symbol="XRPUSD:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/xrpusd:cur">Ripple</a> </td> <td id="p" class="market-widget-last"> 2.55409 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.0149 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.58% </td> </tr> <tr class='datatable-row' data-symbol="DOTUSD:CUR" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/dotusd:cur">Polkadot</a> </td> <td id="p" class="market-widget-last"> 5.07 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.0121 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.24% </td> </tr> <tr class='datatable-row-alternating' data-symbol="AVXUSD:CUR" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/avxusd:cur">Avalanche</a> </td> <td id="p" class="market-widget-last"> 25.73 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.5600 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 2.22% </td> </tr> <tr class='datatable-row' data-symbol="MTCUSD:CUR" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/mtcusd:cur">Polygon</a> </td> <td id="p" class="market-widget-last"> 0.30 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.0095 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -3.10% </td> </tr> <tr class='datatable-row-alternating' data-symbol="ATMUSD:CUR" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/atmusd:cur">Cosmos</a> </td> <td id="p" class="market-widget-last"> 4.94 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.0236 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.48% </td> </tr> <tr class='datatable-row' data-symbol="DAIUSD:CUR" data-decimals="5"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/daiusd:cur">Dai</a> </td> <td id="p" class="market-widget-last"> 0.99996 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-positive-image'></span> 0.0001 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-positive"> 0.01% </td> </tr> <tr class='datatable-row-alternating' data-symbol="LTCUSD:CUR" data-decimals="3"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/ltcusd:cur">Litecoin</a> </td> <td id="p" class="market-widget-last"> 126.480 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 1.6933 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -1.32% </td> </tr> <tr class='datatable-row' data-symbol="UNIUSD:CUR" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/uniusd:cur">Uniswap</a> </td> <td id="p" class="market-widget-last"> 9.03 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.3210 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -3.43% </td> </tr> <tr class='datatable-row-alternating' data-symbol="ALGUSD:CUR" data-decimals="2"> <td class="datatable-item-first" style="text-wrap: auto"> <a href="/algusd:cur">Algorand</a> </td> <td id="p" class="market-widget-last"> 0.26 </td> <td id="nch" class="datatable-item d-lg-none d-xl-table-cell " style="text-align: left; min-width: 70px"> <span class='market-negative-image'></span> 0.0014 </td> <td id="pch" class="market-widget-pct calendar-item calendar-item-negative"> -0.52% </td> </tr> </tbody> <tfoot> <tr> <td colspan="2" class="more-link"><a style="text-decoration: underline" aria-label = "Read more" href="/crypto">More</a></td> <td colspan="4" class="widget-link" style=" "> <div class="plus-sign-widget"> <a style="font-size:12px" aria-label="Add widgets" href="javascript:void(0);"onclick="showWidgetModal();"> <i class="bi bi-plus-square-fill"></i> Add to your site</a> </div> </td> </tr> </tfoot> </table> </div> </div> </div> </div> <script> function redirectToAPI() { window.location.href = "https://tradingeconomics.com/api/?source=market-widget"; } function showWidgetModal() { if (isLoggedIn) { return redirectToAPI() } let modalChartTitle = "" let modalChartContent = "<div>"; modalChartContent += "Take your website to the next level by embedding our customizable widgets! Exclusively for subscribers and priced accordingly to your needs."; modalChartContent += "</div>"; let modalChartFooter = "<div style='text-align:center;'><div class='btn-group'>"; if (!isLoggedIn) { let buttonContact = "<a class='btn btn-outline-secondary' href='https://tradingeconomics.com/api/contact.aspx?subject=market+widget' target='_blank'>Questions? <b>Contact us</b></a>" modalChartFooter += buttonContact; } modalChartFooter += "</div></div>"; var modal = "<div class ='modal' id='chartModal' tabindex='-1' role='dialog' aria-labelledby='myModalLabel'>"; modal += "<div class='modal-dialog modal-dialog-centered' role='document'>"; modal += "<div class='modal-content'>"; modal += "<div class='modal-header'><div class='modal-title'></div><button type='button' class ='btn-close' data-bs-dismiss='modal' aria-label='Close'></button></div>"; modal += "<div class='modal-body' style='text-align:justify;'></div>" modal += "<div class='modal-footer'></div>" modal += "</div></div></div>" var jModal = $(modal); $(jModal).find(".modal-title").html(modalChartTitle); if (modalChartContent) $(jModal).find(".modal-body").html(modalChartContent); else $(jModal).find(".modal-body").remove(); if (modalChartFooter) $(jModal).find(".modal-footer").html(modalChartFooter); else $(jModal).find(".modal-footer").remove(); $(jModal).on('show.bs.modal', function (e) { $(".navbar").css("padding-right", "17px"); $(".pagemenu").css("padding-right", "17px"); $(".pagetabs").css("padding-right", "17px"); }); $(jModal).on('hide.bs.modal', function (e) { $(".navbar").css("padding-right", ""); $(".pagemenu").css("padding-right", ""); $(".pagetabs").css("padding-right", ""); }); $(jModal).modal("show"); } </script> <style> #market-widget-mini {height: 225px;} #market-widget-mini .nav {flex-wrap:nowrap;}#market-widget-mini .nav>li>a {padding-left: 3px;padding-right: 3px;outline:none;} .market-widget-mini-thead{font-size: 12px;}.market-widget-mini-th-left{text-align: left;}.market-widget-mini-th-center{text-align: center;}.market-widget-mini-row{padding: 0px;}.market-widget-mini-first{padding-left: 10px!important; max-width: 80px; overflow: hidden;}.market-widget-mini-last{text-align: center;max-width: 70px; overflow: hidden;}.market-widget-mini-change{text-align: left; min-width: 70px}.market-widget-mini-pct{text-align: center;} #market-widget-mini {padding: 5px 0px 5px 0px}.mini-widget-symbol-tag{position:absolute; font-size:11px;padding:3px 6px; top:50px;color:#808080;left:13px} @media only screen and (max-width: 380px) {#market-widget-mini .nav > li > a {padding-left: 3px;padding-right: 3px;}} @media only screen and (max-width: 991px) { #market-widget-mini { height: 250px; }} @media only screen and (max-width: 767px){ #market-widget-mini .nav>li>a{ padding:3px 3px !important; }} </style> <div id="ctl00_ContentPlaceHolder1__ff7579daa15f168a_Panel2"> <div id="market-widget-mini" class="card"> <ul class="nav nav-tabs " role="tablist" id="miniWidget"> <li role="presentation" class="nav-item" style="margin-left: 15px;"><a aria-current="page" href="#FX-mini" class=" nav-link d-table-cell" role="tab" data-bs-toggle="tab" title="Currency"> EURUSD</a></li> <li role="presentation" class="nav-item"><a aria-current="page" href="#Index-mini" class="active nav-link d-table-cell" role="tab" data-bs-toggle="tab" title="Index"> US500</a></li> <li role="presentation" class="nav-item"> <a aria-current="page" href="#Bond-mini" class=" nav-link d-table-cell" role="tab" data-bs-toggle="tab" title="Bonds"> US10Y </a> </li> </ul> <div class="tab-content" style="margin-bottom: -15px; padding-left: 15px; padding-right:10px"> <input type="hidden" name="ctl00$ContentPlaceHolder1$_ff7579daa15f168a$Repeater2$ctl00$minigroup" id="ctl00_ContentPlaceHolder1__ff7579daa15f168a_Repeater2_ctl00_minigroup" value="Commodity-mini" /> <div role="tabpanel" class="tab-pane fade show " id='Commodity-mini'> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$_ff7579daa15f168a$Repeater2$ctl01$minigroup" id="ctl00_ContentPlaceHolder1__ff7579daa15f168a_Repeater2_ctl01_minigroup" value="Currency-mini" /> <div role="tabpanel" class="tab-pane fade show " id='FX-mini'> <span data-symbol="EURUSD:CUR" class="mini-widget-symbol-tag" style="display:none"> EURUSD </span> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$_ff7579daa15f168a$Repeater2$ctl02$minigroup" id="ctl00_ContentPlaceHolder1__ff7579daa15f168a_Repeater2_ctl02_minigroup" value="Index-mini" /> <div role="tabpanel" class="tab-pane fade show active" id='Index-mini'> <span data-symbol="SPX:IND" class="mini-widget-symbol-tag" style="display:none"> US500 </span> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$_ff7579daa15f168a$Repeater2$ctl03$minigroup" id="ctl00_ContentPlaceHolder1__ff7579daa15f168a_Repeater2_ctl03_minigroup" value="Stocks-mini" /> <div role="tabpanel" class="tab-pane fade show " id='Share-mini'> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$_ff7579daa15f168a$Repeater2$ctl04$minigroup" id="ctl00_ContentPlaceHolder1__ff7579daa15f168a_Repeater2_ctl04_minigroup" value="Bond-mini" /> <div role="tabpanel" class="tab-pane fade show " id='Bond-mini'> <span data-symbol="USGG10YR:IND" class="mini-widget-symbol-tag" style="display:none"> US 10Y </span> </div> <input type="hidden" name="ctl00$ContentPlaceHolder1$_ff7579daa15f168a$Repeater2$ctl05$minigroup" id="ctl00_ContentPlaceHolder1__ff7579daa15f168a_Repeater2_ctl05_minigroup" value="Crypto-mini" /> <div role="tabpanel" class="tab-pane fade show " id='Crypto-mini'> </div> </div> <style> .mini-widget-table tbody { border-top: 1px solid #dee2e6; } .mini-widget-table > :not(caption) > * > * { border-bottom: none; } #chart-spans-widget { display: flex; justify-content: flex-end; gap: 0px; top: -17px; position: relative; height: 0px; margin-right: 10px; margin-bottom: 3px; } #chart-spans-widget a { display: inline-block; padding: 1px 5px; text-decoration: none; color: #333; font-size: 15px; height: 31px; } #chart-spans-widget a:hover { border-bottom: 2px solid; cursor: pointer; } .chart-spans-widget-active { border-bottom: 2px solid; } .chart-widget-container{ width: 100%; height: 100%;padding-left: 15px; } @media only screen and (max-width: 1399px) and (min-width: 991px) { #chart-spans-widget a:nth-child(3) { display: none; } } @media only screen and (max-width: 1200px) and (min-width: 991px) { #chart-spans-widget a:nth-child(2) { display: none; } } body.dark-theme #chart-spans-widget a { color: #ddd; } body.dark-theme #market-widget-mini .nav-tabs > li > .nav-link.active { background-color: transparent; border-bottom-color: #ddd; } #container .loading-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; background-color: rgba(240, 240, 240, 0.9); font-family: Arial, sans-serif; font-size: 16px; font-weight: bold; color: #666; } #container .loading-spinner { width: 30px; height: 30px; border: 4px solid #ccc; border-top: 4px solid #666; border-radius: 50%; animation: spin 0.3s linear infinite; margin-right: 10px; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @media only screen and (max-width: 450px) { #chart-spans-widget a:nth-child(3) { display: none; } } </style> <script src="https://code.highcharts.com/highcharts.js"></script> <div id="chart-spans-widget"> <a class="chart-spans-widget-active" data-value="1y">1Y</a> <a data-value="5y">5Y</a> <a data-value="10y">10Y</a> <a data-value="25y">25Y</a> </div> <div id="container" class="chart-widget-container"></div> <script> const container = document.getElementById('container'); var miniWidgetSpan = '1y'; var chartSymbol = "EURUSD:CUR, SPX:IND, USGG10YR:IND".split(","); var activeChartSymbol = '' const structure_array = ['x', 'y', 'percentChange', 'change', 'open', 'high', 'low', 'close']; const baseDataUrl = 'https://d3ii0wo49og5mi.cloudfront.net/markets/'; const miniWidget = document.getElementById('miniWidget'); function createRequest() { let query = `?span=${miniWidgetSpan}&ohlc=0&key=20240229:nazare` if (miniWidgetSpan.toLowerCase() == 'all') { query = `?span=max&ohlc=0&key=20240229:nazare` miniWidgetSpan = 'max' } return `${baseDataUrl}${activeChartSymbol}${query}` } const chartSpansWidget = document.getElementById('chart-spans-widget'); chartSpansWidget.addEventListener('click', (event) => { if (event.target.tagName === 'A') { event.preventDefault(); miniWidgetSpan = event.target.getAttribute('data-value').trim() let dataUrl = createRequest(); const links = chartSpansWidget.querySelectorAll('a'); links.forEach(link => link.classList.remove('chart-spans-widget-active')); event.target.classList.add('chart-spans-widget-active'); fetchDataAndUpdateChart(dataUrl); } }); if (miniWidget) { miniWidget.addEventListener('click', function (event) { let target = event.target; if (target.tagName !== 'A') { target = target.closest('a'); } if (target && target.tagName === 'A') { const href = target.getAttribute('href').toLowerCase(); if (href.includes("fx") || href.includes("forex")) { updateChartSymbol(0); } if (href.includes("bond")) { updateChartSymbol(2); } if (href.includes("index")) { updateChartSymbol(1); } } }); } async function dataMagic(b64Data, dk) { let compressedData = atob(b64Data); let uint8Array = new Uint8Array(compressedData.length); for (let i = 0; i < compressedData.length; i++) { uint8Array[i] = compressedData.charCodeAt(i); } const keyBytes = new TextEncoder().encode(dk); for (let i = 0; i < uint8Array.length; i++) { uint8Array[i] ^= keyBytes[i % keyBytes.length]; } const decompressedData = pako.inflate(uint8Array, { to: 'string' }); return decompressedData; } async function decompressAndDeobfuscateData(b64Data, dk) { try { const result = await dataMagic(b64Data, dk) return JSON.parse(result) } catch (err) { console.log(err); return null; } } function updateChartSymbol(index) { let symbol = chartSymbol[index].trim().replace(" ", ""); activeChartSymbol = symbol; let dataUrl = createRequest(); fetchDataAndUpdateChart(dataUrl); } function formatDate(timestamp) { const date = new Date(timestamp); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`; } function processChartData(data, dataurl) { if (!Array.isArray(data.series) || data.series.length === 0) { console.error('No valid series data:', data); return; } const chartData = []; data.series.forEach(series => { if (Array.isArray(series.data)) { series.data.forEach(item => { const treatedDatapoint = {}; item.forEach((el, index) => { if (index > 0) { treatedDatapoint[structure_array[index]] = el; } else { treatedDatapoint[structure_array[index]] = el * 1000; treatedDatapoint.date = formatDate(el * 1000); } }); chartData.push(treatedDatapoint); }); } }); updateChartWithData(chartData, dataurl); } function fetchDataAndUpdateChart(dataUrl) { fetch(dataUrl) .then(response => response.json()) .then(data => { return decompressAndDeobfuscateData(data, TEObfuscationkey); }) .then(decompressedData => { if (!decompressedData) { console.error('Decompressed data is invalid'); return; } processChartData(decompressedData, dataUrl); }) .catch(error => console.error('Error in fetch or data processing:', error)); } function roundToStep(value, step) { if (value >= 0) { return Math.round(value / step) * step; } else { return value; } } function formatTick(tick) { if (Math.abs(tick) < 10) { return tick.toFixed(2); } return Math.round(tick); } function formatYTicker(tick) { const absTick = Math.abs(tick); const formatNumber = (value) => { return value % 1 === 0 ? value.toFixed(0) : value.toFixed(2); }; if (absTick < 10) { if (TELanguage == "ar") { return tick % 1 === 0 ? tick.toFixed(0) : tick.toFixed(3); } else { return formatNumber(tick) } } if (absTick >= 1e12) { return formatNumber(tick / 1e12) + 'T'; } if (absTick >= 1e9) { return formatNumber(tick / 1e9) + 'B'; } if (absTick >= 1e6) { return formatNumber(tick / 1e6) + 'M'; } if (absTick >= 1e3) { return formatNumber(tick / 1e3) + 'K'; } return Math.round(tick); } function updateYTicks(maxY, minY, numberTicks, lastdatapoint) { const range = maxY - minY; const desiredTicks = numberTicks; let step = range / desiredTicks; let marginMinY = minY if (minY >= 0) { if ((minY - (step / 2)) < 0) { marginMinY = 0 } else { marginMinY = minY - (step / 2) } } const roundedMin = roundToStep(marginMinY, step); const roundedMax = roundToStep(maxY + (step / 2), step); let tickPositions = []; for (let i = roundedMin; i <= roundedMax; i += step) { tickPositions.push(parseFloat(formatTick(i))); if (tickPositions[tickPositions.length - 1] >= maxY) { break; } } chart.yAxis[0].update({ min: roundedMin, max: maxY, tickPositions: tickPositions, }); return; } function updateXLabelsFormat(dataurl) { chart.xAxis[0].update({ labels: { formatter: function () { if (dataurl.toLowerCase().includes('span=25y') || dataurl.toLowerCase().includes('span=10y') || dataurl.toLowerCase().includes('span=5y')) { return Highcharts.dateFormat('%Y', this.value); } else { const date = new Date(this.value); const year = Highcharts.dateFormat('%Y', this.value); let monthDay = Highcharts.dateFormat('%b/%d', this.value); if (TELanguage == null || TELanguage == '') { const utcDate = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds())); monthDay = Highcharts.dateFormat('%b/%d', utcDate); } //const ticks = this.axis.tickPositions; //const index = ticks.indexOf(this.value); //const isFirstTickOfYear = index === 0 || (index > 0 && new Date(ticks[index - 1]).getFullYear() !== date.getFullYear()); /*if (isFirstTickOfYear) { return `${year} ${monthDay}`; }*/ return `${monthDay}`; } } } }); return; } function addCustomLabel(closeValue) { if (!closeValue) { closeValue = chart.series[0].data[chart.series[0].data.length - 1].y } if (closeValue == undefined) return; if (chart.customCloseLabel) { chart.customCloseLabel.destroy(); } if (chart.customCloseLabelRect) { chart.customCloseLabelRect.destroy(); } const yAxis = chart.yAxis[0]; const yAxisXPosition = yAxis.left + yAxis.width; const yAxisYPosition = yAxis.toPixels(closeValue); const labelPadding = 2; const labelFontSize = 13; let labelText = formatYTicker(closeValue); /*if (closeValue < 10) { labelText = labelText.toFixed(4) } else if (closeValue < 1000) { labelText = labelText.toFixed(2) } else if (closeValue >= 1000 && closeValue < 10000) { labelText = labelText.toFixed(1) } else { labelText= labelText.toFixed(0) }*/ const textWidth = chart.renderer .text(labelText, 0, 0) .css({ fontSize: `${labelFontSize}px` }) .getBBox().width; const rectWidth = 53; const rectHeight = labelFontSize + 8; chart.customCloseLabelRect = chart.renderer .rect( yAxisXPosition - 3, yAxisYPosition - rectHeight / 2, rectWidth, rectHeight ) .attr({ fill: '#2962ff', zIndex: 11, rx: 0, ry: 0, }) .add(); chart.customCloseLabel = chart.renderer .text(labelText, yAxisXPosition + labelPadding, yAxisYPosition - 1 + labelFontSize / 2) .attr({ zIndex: 12, align: 'left', }) .css({ fontSize: `${labelFontSize}px`, color: 'white', }) .add(); } function addCloseLine() { const closeSeries = chart.series.find(series => series.name === 'Close Line'); let lastdatapoint = chart.series[0].data[chart.series[0].data.length - 1] let closeValue = lastdatapoint.y if (closeSeries) { closeSeries.update({ data: [[chart.series[0].data[0].x, closeValue], [lastdatapoint.x, closeValue]], animation: false }); } else { chart.addSeries({ name: 'Close Line', type: 'line', data: [[chart.series[0].data[0].x, closeValue], [lastdatapoint.x, closeValue]], color: '#2962ff', dashStyle: 'ShortDash', lineWidth: 1, enableMouseTracking: false, marker: { enabled: false }, animation: false, zIndex: 10 }); } } function updateChartWithData(chartData, dataurl) { let minY = null; let maxY = null; let closeValue = null; chartData.forEach(function (datapoint) { if (minY == null) { minY = datapoint.y; maxY = datapoint.y; } else { minY = Math.min(minY, datapoint.y); maxY = Math.max(maxY, datapoint.y); } closeValue = datapoint.y; }); chart.series[0].setData(chartData, true); chart.userOptions.series[0]['symbol'] = activeChartSymbol; if (TELanguage == 'fa') { minY = minY * 0.997; } updateYTicks(maxY, minY, 3, chartData[chartData.length - 1]); updateXLabelsFormat(dataurl); //addCloseLine(); addCustomLabel(); } function showLoading() { const container = document.getElementById('container'); container.innerHTML = ` <div class="loading-overlay"> <div class="loading-spinner"></div> Loading... </div> `; } let chart; function initializeChart() { if (!isPakoLoaded) { if (!document.querySelector('.loading-overlay')) { showLoading(); } setTimeout(initializeChart, 50); return; } container.innerHTML = ""; chart = Highcharts.chart('container', { chart: { type: 'area', style: { fontFamily: '"Helvetica Neue",Helvetica,Arial,sans-serif', }, backgroundColor: IsDarkMode ? 'transparent' : '', marginLeft: 0, marginTop: 25, marginBottom: 30, marginRight: 50, paddingLeft: 0, animation: false, events: { load() { const initialSymbol = chartSymbol[1].trim().replace(" ", ""); activeChartSymbol = initialSymbol const dataUrl = createRequest(); fetchDataAndUpdateChart(dataUrl); } } }, accessibility: { enabled: false, }, title: { text: null }, subtitle: { text: null }, legend: { enabled: false }, xAxis: { type: 'datetime', labels: { y:17, format: `{value: %Y-%m-%d}`, style: { color: IsDarkMode ? '#ddd' : '', fontSize: '13px' }, }, tickPositioner: function () { const positions = []; const start = this.dataMin; const end = this.dataMax; const offset = (end - start) * 0.1; const adjustedStart = start + offset; const adjustedEnd = end - offset; const screenWidth = window.innerWidth; let numberOfTicks = 2; if (screenWidth >= 991 && screenWidth <= 1200) { numberOfTicks = 1 } const interval = (adjustedEnd - adjustedStart) / numberOfTicks; for (let pos = adjustedStart; pos <= adjustedEnd; pos += interval) { positions.push(pos); } return positions; }, //lineColor: IsDarkMode ? '#ddd' : '#333', //tickColor: IsDarkMode ? '#ddd' : '#333', lineWidth: 0, tickWidth: 0, }, yAxis: { opposite: true, title: { text: null }, labels: { style: { color: IsDarkMode ? '#ddd' : '', fontSize: '13px' }, enabled: true, padding: 0, x: 2, formatter: function () { return formatYTicker(this.value) } }, startOnTick: false, endOnTick: false, gridLineWidth: 0, maxTicks: 4, }, tooltip: { pointFormat: '{point.y} {point.change} ( {point.percentChange}%)', formatter: function () { let percentChange = this.point.percentChange; let change = this.point.change; let percentChangeFormatted = (percentChange > 0 ? '+' : '') + (percentChange != null ? percentChange.toFixed(2) : 0); let changeFormatted = (change > 0 ? '+' : '') + (change != null ? change.toFixed(2) : '0'); let percentChangeColor = percentChange > 0 ? 'green' : 'red'; let changeColor = change > 0 ? 'green' : 'red'; let date = Highcharts.dateFormat('%Y-%m-%d', this.point.x); return date + '<br>' + this.point.y.toFixed(2) + ' ' + `<span style="color:${changeColor}">${changeFormatted }</span> ` + `(<span style="color:${percentChangeColor}">${percentChangeFormatted}%</span>)`; } }, credits: { enabled: false }, plotOptions: { area: { marker: { enabled: false, symbol: 'circle', radius: 2, states: { hover: { enabled: true, } } }, lineWidth: 1, animation: { duration: 0 } } }, series: [{ name: '', data: [], color: IsDarkMode ? '#333' : '#d4dfff', lineWidth: 1, zIndex: 5, fillColor: { linearGradient: [0, 0, 0, 1], stops: !IsDarkMode ? [[0, 'rgba(41, 98, 255, 0.2)'], [1, 'rgba(41, 98, 255, 0.2)']] : [[0, 'rgba(37, 79, 145, 0.6)'], [1, 'rgba(37, 79, 145, 0.6)']] }, zones: [{ value: 0, color: '#ffd4d4', fillColor: 'rgba(255, 0, 0, 0.1)' }, { value: Number.POSITIVE_INFINITY, color: !IsDarkMode ? 'rgba(41, 98, 255, 0.3)' : 'rgba(37, 79, 145, 1)' }] }] }); } Highcharts.setOptions({ lang: { decimalPoint: '.', thousandsSep: ',', numericSymbols: ['k', 'M', 'B', 'T', 'P', 'E'] } }); initializeChart() function onResizeHandler() { addCustomLabel() } window.addEventListener("resize", onResizeHandler); </script> </div> </div> </div> </div> <div class="row"> <div class="col-lg-12"> <style> .te-sort{cursor: pointer;} #homematrix { padding: 0px 0px 0px 0px; border: none; } #homematrix a { color: #fff; text-decoration: none; } #homematrix .btn-group{ margin-top: 20px; } #homematrix a:hover { text-decoration:underline; } #matrix{ background-color: #333; } #matrix th { background-color: #333; color: #fff; font-weight: bold; border: none; } #matrix td { border-color: #000; } #matrix tr:hover { background-color: #254f73; } .matrix-country { font-weight: bold; padding-left: 10px; white-space: nowrap; } </style> <div id='homematrix' class="thumbnail"> <div > <table id="matrix" class="table table-hover sortable-theme-minimal table-heatmap" data-sortable=""> <thead class="te-sort"> <tr> <th><span class='matrix-country'>Country</span></th> <th data-heatmap="1" data-heatmap-limit="20000" data-heatmap-dnColor="#78c1ff">GDP</th> <th data-heatmap="1" data-heatmap-limit="5">GDP Growth</th> <th data-heatmap="1" data-heatmap-limit="10" data-heatmap-dnColor="#78c1ff">Interest Rate</th> <th data-heatmap="1" data-heatmap-limit="20">Inflation Rate</th> <th data-heatmap="1" data-heatmap-limit="20">Jobless Rate</th> <th data-heatmap="1" data-heatmap-limit="20">Gov. Budget</th> <th data-heatmap="1" data-heatmap-limit="200" data-heatmap-dnColor="#78c1ff">Debt/GDP</th> <th data-heatmap="1" data-heatmap-limit="10">Current Account</th> <th data-heatmap="1" data-heatmap-limit="1000" data-heatmap-dnColor="#78c1ff">Population</th> </tr> </thead> <tr> <td><a class="matrix-country" href="/united-states/indicators">United States </a></td> <td data-heatmap-value='27721'><a href="/united-states/gdp">27721</a></td> <td data-heatmap-value='2.30'><a href="/united-states/gdp-growth">2.30</a></td> <td data-heatmap-value='4.50'><a href="/united-states/interest-rate">4.50</a></td> <td data-heatmap-value='-3.00'><a href="/united-states/inflation-cpi">3.00</a></td> <td data-heatmap-value='-4.00'><a href="/united-states/unemployment-rate">4.00</a></td> <td data-heatmap-value='-6.20'><a href="/united-states/government-budget">-6.20</a></td> <td data-heatmap-value='122.30'><a href="/united-states/government-debt-to-gdp">122.30</a></td> <td data-heatmap-value='-3.00'><a href="/united-states/current-account-to-gdp">-3.00</a></td> <td data-heatmap-value='341.15'><a href="/united-states/population">341.15</a></td> </tr> <tr> <td><a class="matrix-country" href="/china/indicators">China </a></td> <td data-heatmap-value='17795'><a href="/china/gdp">17795</a></td> <td data-heatmap-value='1.60'><a href="/china/gdp-growth">1.60</a></td> <td data-heatmap-value='3.10'><a href="/china/interest-rate">3.10</a></td> <td data-heatmap-value='-0.50'><a href="/china/inflation-cpi">0.50</a></td> <td data-heatmap-value='-5.10'><a href="/china/unemployment-rate">5.10</a></td> <td data-heatmap-value='-5.80'><a href="/china/government-budget">-5.80</a></td> <td data-heatmap-value='83.40'><a href="/china/government-debt-to-gdp">83.40</a></td> <td data-heatmap-value='1.50'><a href="/china/current-account-to-gdp">1.50</a></td> <td data-heatmap-value='1408.00'><a href="/china/population">1408.00</a></td> </tr> <tr> <td><a class="matrix-country" href="/euro-area/indicators">Euro Area </a></td> <td data-heatmap-value='15781'><a href="/euro-area/gdp">15781</a></td> <td data-heatmap-value='0.00'><a href="/euro-area/gdp-growth">0.00</a></td> <td data-heatmap-value='2.90'><a href="/euro-area/interest-rate">2.90</a></td> <td data-heatmap-value='-2.50'><a href="/euro-area/inflation-cpi">2.50</a></td> <td data-heatmap-value='-6.30'><a href="/euro-area/unemployment-rate">6.30</a></td> <td data-heatmap-value='-3.60'><a href="/euro-area/government-budget">-3.60</a></td> <td data-heatmap-value='87.40'><a href="/euro-area/government-debt-to-gdp">87.40</a></td> <td data-heatmap-value='1.70'><a href="/euro-area/current-account-to-gdp">1.70</a></td> <td data-heatmap-value='350.08'><a href="/euro-area/population">350.08</a></td> </tr> <tr> <td><a class="matrix-country" href="/germany/indicators">Germany </a></td> <td data-heatmap-value='4526'><a href="/germany/gdp">4526</a></td> <td data-heatmap-value='-0.20'><a href="/germany/gdp-growth">-0.20</a></td> <td data-heatmap-value='2.90'><a href="/germany/interest-rate">2.90</a></td> <td data-heatmap-value='-2.30'><a href="/germany/inflation-cpi">2.30</a></td> <td data-heatmap-value='-6.20'><a href="/germany/unemployment-rate">6.20</a></td> <td data-heatmap-value='-2.50'><a href="/germany/government-budget">-2.50</a></td> <td data-heatmap-value='62.90'><a href="/germany/government-debt-to-gdp">62.90</a></td> <td data-heatmap-value='5.80'><a href="/germany/current-account-to-gdp">5.80</a></td> <td data-heatmap-value='84.70'><a href="/germany/population">84.70</a></td> </tr> <tr> <td><a class="matrix-country" href="/japan/indicators">Japan </a></td> <td data-heatmap-value='4204'><a href="/japan/gdp">4204</a></td> <td data-heatmap-value='0.70'><a href="/japan/gdp-growth">0.70</a></td> <td data-heatmap-value='0.50'><a href="/japan/interest-rate">0.50</a></td> <td data-heatmap-value='-4.00'><a href="/japan/inflation-cpi">4.00</a></td> <td data-heatmap-value='-2.40'><a href="/japan/unemployment-rate">2.40</a></td> <td data-heatmap-value='-5.50'><a href="/japan/government-budget">-5.50</a></td> <td data-heatmap-value='255.20'><a href="/japan/government-debt-to-gdp">255.20</a></td> <td data-heatmap-value='4.70'><a href="/japan/current-account-to-gdp">4.70</a></td> <td data-heatmap-value='123.59'><a href="/japan/population">123.59</a></td> </tr> <tr> <td><a class="matrix-country" href="/india/indicators">India </a></td> <td data-heatmap-value='3568'><a href="/india/gdp">3568</a></td> <td data-heatmap-value='1.10'><a href="/india/gdp-growth">1.10</a></td> <td data-heatmap-value='6.25'><a href="/india/interest-rate">6.25</a></td> <td data-heatmap-value='-4.31'><a href="/india/inflation-cpi">4.31</a></td> <td data-heatmap-value='-8.30'><a href="/india/unemployment-rate">8.30</a></td> <td data-heatmap-value='-5.63'><a href="/india/government-budget">-5.63</a></td> <td data-heatmap-value='81.59'><a href="/india/government-debt-to-gdp">81.59</a></td> <td data-heatmap-value='-1.20'><a href="/india/current-account-to-gdp">-1.20</a></td> <td data-heatmap-value='1386.18'><a href="/india/population">1386.18</a></td> </tr> <tr> <td><a class="matrix-country" href="/united-kingdom/indicators">United Kingdom </a></td> <td data-heatmap-value='3381'><a href="/united-kingdom/gdp">3381</a></td> <td data-heatmap-value='0.10'><a href="/united-kingdom/gdp-growth">0.10</a></td> <td data-heatmap-value='4.50'><a href="/united-kingdom/interest-rate">4.50</a></td> <td data-heatmap-value='-3.00'><a href="/united-kingdom/inflation-cpi">3.00</a></td> <td data-heatmap-value='-4.40'><a href="/united-kingdom/unemployment-rate">4.40</a></td> <td data-heatmap-value='-4.80'><a href="/united-kingdom/government-budget">-4.80</a></td> <td data-heatmap-value='95.30'><a href="/united-kingdom/government-debt-to-gdp">95.30</a></td> <td data-heatmap-value='-2.20'><a href="/united-kingdom/current-account-to-gdp">-2.20</a></td> <td data-heatmap-value='68.27'><a href="/united-kingdom/population">68.27</a></td> </tr> <tr> <td><a class="matrix-country" href="/france/indicators">France </a></td> <td data-heatmap-value='3052'><a href="/france/gdp">3052</a></td> <td data-heatmap-value='-0.10'><a href="/france/gdp-growth">-0.10</a></td> <td data-heatmap-value='2.90'><a href="/france/interest-rate">2.90</a></td> <td data-heatmap-value='-1.70'><a href="/france/inflation-cpi">1.70</a></td> <td data-heatmap-value='-7.30'><a href="/france/unemployment-rate">7.30</a></td> <td data-heatmap-value='-5.50'><a href="/france/government-budget">-5.50</a></td> <td data-heatmap-value='110.60'><a href="/france/government-debt-to-gdp">110.60</a></td> <td data-heatmap-value='-1.00'><a href="/france/current-account-to-gdp">-1.00</a></td> <td data-heatmap-value='68.44'><a href="/france/population">68.44</a></td> </tr> <tr> <td><a class="matrix-country" href="/italy/indicators">Italy </a></td> <td data-heatmap-value='2301'><a href="/italy/gdp">2301</a></td> <td data-heatmap-value='0.00'><a href="/italy/gdp-growth">0.00</a></td> <td data-heatmap-value='2.90'><a href="/italy/interest-rate">2.90</a></td> <td data-heatmap-value='-1.50'><a href="/italy/inflation-cpi">1.50</a></td> <td data-heatmap-value='-6.20'><a href="/italy/unemployment-rate">6.20</a></td> <td data-heatmap-value='-7.20'><a href="/italy/government-budget">-7.20</a></td> <td data-heatmap-value='134.60'><a href="/italy/government-debt-to-gdp">134.60</a></td> <td data-heatmap-value='1.10'><a href="/italy/current-account-to-gdp">1.10</a></td> <td data-heatmap-value='58.99'><a href="/italy/population">58.99</a></td> </tr> <tr> <td><a class="matrix-country" href="/brazil/indicators">Brazil </a></td> <td data-heatmap-value='2174'><a href="/brazil/gdp">2174</a></td> <td data-heatmap-value='0.90'><a href="/brazil/gdp-growth">0.90</a></td> <td data-heatmap-value='13.25'><a href="/brazil/interest-rate">13.25</a></td> <td data-heatmap-value='-4.56'><a href="/brazil/inflation-cpi">4.56</a></td> <td data-heatmap-value='-6.20'><a href="/brazil/unemployment-rate">6.20</a></td> <td data-heatmap-value='-8.90'><a href="/brazil/government-budget">-8.90</a></td> <td data-heatmap-value='84.68'><a href="/brazil/government-debt-to-gdp">84.68</a></td> <td data-heatmap-value='-2.55'><a href="/brazil/current-account-to-gdp">-2.55</a></td> <td data-heatmap-value='212.58'><a href="/brazil/population">212.58</a></td> </tr> <tr> <td><a class="matrix-country" href="/canada/indicators">Canada </a></td> <td data-heatmap-value='2142'><a href="/canada/gdp">2142</a></td> <td data-heatmap-value='0.30'><a href="/canada/gdp-growth">0.30</a></td> <td data-heatmap-value='3.00'><a href="/canada/interest-rate">3.00</a></td> <td data-heatmap-value='-1.90'><a href="/canada/inflation-cpi">1.90</a></td> <td data-heatmap-value='-6.60'><a href="/canada/unemployment-rate">6.60</a></td> <td data-heatmap-value='-1.40'><a href="/canada/government-budget">-1.40</a></td> <td data-heatmap-value='107.50'><a href="/canada/government-debt-to-gdp">107.50</a></td> <td data-heatmap-value='-1.00'><a href="/canada/current-account-to-gdp">-1.00</a></td> <td data-heatmap-value='41.50'><a href="/canada/population">41.50</a></td> </tr> <tr> <td><a class="matrix-country" href="/russia/indicators">Russia </a></td> <td data-heatmap-value='2021'><a href="/russia/gdp">2021</a></td> <td data-heatmap-value='-0.80'><a href="/russia/gdp-growth">-0.80</a></td> <td data-heatmap-value='21.00'><a href="/russia/interest-rate">21.00</a></td> <td data-heatmap-value='-9.90'><a href="/russia/inflation-cpi">9.90</a></td> <td data-heatmap-value='-2.30'><a href="/russia/unemployment-rate">2.30</a></td> <td data-heatmap-value='-1.70'><a href="/russia/government-budget">-1.70</a></td> <td data-heatmap-value='14.90'><a href="/russia/government-debt-to-gdp">14.90</a></td> <td data-heatmap-value='2.50'><a href="/russia/current-account-to-gdp">2.50</a></td> <td data-heatmap-value='146.20'><a href="/russia/population">146.20</a></td> </tr> <tr> <td><a class="matrix-country" href="/mexico/indicators">Mexico </a></td> <td data-heatmap-value='1789'><a href="/mexico/gdp">1789</a></td> <td data-heatmap-value='-0.60'><a href="/mexico/gdp-growth">-0.60</a></td> <td data-heatmap-value='9.50'><a href="/mexico/interest-rate">9.50</a></td> <td data-heatmap-value='-3.59'><a href="/mexico/inflation-cpi">3.59</a></td> <td data-heatmap-value='-2.40'><a href="/mexico/unemployment-rate">2.40</a></td> <td data-heatmap-value='-5.00'><a href="/mexico/government-budget">-5.00</a></td> <td data-heatmap-value='49.70'><a href="/mexico/government-debt-to-gdp">49.70</a></td> <td data-heatmap-value='-1.50'><a href="/mexico/current-account-to-gdp">-1.50</a></td> <td data-heatmap-value='128.46'><a href="/mexico/population">128.46</a></td> </tr> </table> </div> <a href="/matrix" aria-label = "Go to matrix for more countries matrix" class="btn-group btn-group-sm" style="padding-left: 5px; padding-bottom: 5px;"> <div class='btn btn-outline-secondary'><i class="bi bi-plus-lg"></i></div> </a> </div> </div> </div> </div> </div> <br /> <br /> </div> <div class="container-fluid te-footer"> <footer> <div class="container"> <div class="row"> <div id="ctl00_Footer1_PanelFooter"> <style>.footer-spacer{padding: 4px}.footer-spacer-head{padding: 30px 4px 4px 4px;}@media only screen and (max-width:768px){.footer-icons{display: flex;margin-left: 50%;}.footer-icons a{padding: 0 12px 8px 0px; }}.footer-twitter{width: 50px; height: 50px;}.footer-github{width: 40px; height: 40px;}.footer-appstore{display: inline-block; overflow: hidden; background: url(//d3fy651gv2fhd3.cloudfront.net/images/appstore-lrg.svg?v=20171228) no-repeat; width: 135px; height: 40px; background-size: contain;}</style> <br /> <br /> <div class="container"> <div class="row"> <div class="col-lg-2 col-md-2 col-6"> <div class="footerHeader">Indicators</div> <a id="ctl00_Footer1_HyperLink6" class="footerItems" href="./">Homepage</a><br /> <a id="ctl00_Footer1_HyperLink17" class="footerItems" href="countries">Countries</a><br /> <a id="ctl00_Footer1_HyperLink18" class="footerItems" href="indicators">Indicators</a><br /> <a id="ctl00_Footer1_HyperLink1" class="footerItems" href="calendar">Calendar</a><br /> <a id="ctl00_Footer1_HyperLink2" class="footerItems" href="forecasts">Forecasts</a><br /> <a id="ctl00_Footer1_HyperLink11" class="footerItems" href="country-list/rating">Ratings</a> </div> <div class="col-lg-2 col-md-2 col-6"> <div class="footerHeader">Solutions</div> <a href="/analytics/features.aspx?source=footer"><span class="footerItems">Data Subscriptions</span></a><br /> <a href="/api/?source=footer"><span class="footerItems">API Access</span></a><br /> <a href="/analytics/excel.aspx"><span class="footerItems">Excel Add-In</span></a><br /> <a href="https://developer.tradingeconomics.com/" target="_blank"><span class="footerItems">Developer Account</span></a><br /> <a href="https://docs.tradingeconomics.com/" target="_blank"><span class="footerItems">Documentation</span></a><br /> <a href="/analytics/pricing.aspx?source=footer" target="_blank"><span class="footerItems">Pricing</span></a><br /> <br /> </div> <div class="col-lg-2 col-md-2 col-6"> <div class="footerHeader">About Us</div> <a id="ctl00_Footer1_HyperLink8" class="footerItems" href="api/customers.aspx">Customers</a><br /> <a id="ctl00_Footer1_HyperLink23" class="footerItems" href="careers.aspx">Careers</a><br /> <a id="ctl00_Footer1_HyperLink21" class="footerItems" href="investors.aspx">Investors</a><br /> <a id="ctl00_Footer1_HyperLink20" class="footerItems" href="advertise.aspx">Advertisers</a><br /> <a id="ctl00_Footer1_HyperLink19" class="footerItems" href="about-te.aspx">About us</a><br /> <a id="ctl00_Footer1_HyperLink9" class="footerItems" href="privacy-policy.aspx">Privacy</a> </div> <div class="col-lg-2 col-md-2 col-6"> <div class="footer-spacer-head"></div> <a href="https://itunes.apple.com/us/app/trading-economics/id1142178921?mt=8" class="footer-appstore"></a> <div class="footer-spacer"></div> <a href="https://play.google.com/store/apps/details?id=com.tradingeconomics.calendar"> <img alt="Android app on Google Play" src="https://d3fy651gv2fhd3.cloudfront.net/images/google-play.png" /></a> </div> </div> </div> <br /> <div class="container"> <div class="row"> <div class="col-lg-1 col-md-2 col-6"> <a class="footer-languages" href="https://tradingeconomics.com" target="_self">English</a><br /> <a class="footer-languages" href="https://es.tradingeconomics.com" target="_self">Español</a><br /> <a class="footer-languages" href="https://pt.tradingeconomics.com" target="_self">Português</a><br /> <a class="footer-languages" href="https://fr.tradingeconomics.com" target="_self">Français</a><br /> <a class="footer-languages" href="https://de.tradingeconomics.com" target="_self">Deutsch</a><br /> </div> <div class="col-lg-1 col-md-2 col-6"> <a class="footer-languages" href="https://it.tradingeconomics.com" target="_self">Italiano</a><br /> <a class="footer-languages" href="https://pl.tradingeconomics.com" target="_self">Polski</a><br /> <a class="footer-languages" href="https://da.tradingeconomics.com" target="_self">Dansk</a><br /> <a class="footer-languages" href="https://sv.tradingeconomics.com" target="_self">Svenska </a><br /> <a class="footer-languages" href="https://no.tradingeconomics.com" target="_self">Norsk</a><br /> </div> <div class="col-lg-1 col-md-2 col-6"> <a class="footer-languages" href="https://ru.tradingeconomics.com" target="_self">Русский</a><br /> <a class="footer-languages" href="https://tr.tradingeconomics.com" target="_self">Türkçe</a><br /> <a class="footer-languages" href="https://hu.tradingeconomics.com" target="_self">Magyar</a><br /> <a class="footer-languages" href="https://fa.tradingeconomics.com" target="_self">Farsi</a><br /> <a class="footer-languages" href="https://id.tradingeconomics.com" target="_self">Indonesian</a><br /> </div> <div class="col-lg-1 col-md-2 col-6"> <a class="footer-languages" href="https://zh.tradingeconomics.com" target="_self">简体中文</a><br /> <a class="footer-languages" href="https://jp.tradingeconomics.com" target="_self">日本語</a><br /> <a class="footer-languages" href="https://ko.tradingeconomics.com" target="_self">한국어</a><br /> <a class="footer-languages" href="https://ar.tradingeconomics.com" target="_self">العربية</a><br /> </div> </div> </div> <br /> <div class="footer-copyright"> <br /> <span>Copyright ©2025 TRADING ECONOMICS<br /> All Rights Reserved</span><br /> </div> <br /> <br /> </div> </div> </div> </footer> </div> </form> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.1/js/bootstrap.bundle.min.js"></script>  <script> console.log('/controls/io.ascx') TEdecryptk = 'j9ONifjoKzxt7kmfYTdKK/5vve0b9Y1UCj/n50jr8d8=' TEdecryptn = 'Ipp9HNSfVBUntqFK7PrtofYaOPV312xy' var socket_url = 'https://live.tradingeconomics.com?key=rain'; console.log("IO Connecting to " + socket_url) var TE_URL = window.location.pathname; socket_url += "&url=" + TE_URL; $.ajaxSetup({ cache: !0 }); $.getScript('//d3fy651gv2fhd3.cloudfront.net/js/io.js?v=20240223', function () { OnSocketIOLoad(); }); var socket = null; var MKTChannels = [] var Subscribed = [] function base64ToUint8Array(base64) { const binaryString = atob(base64); const length = binaryString.length; const bytes = new Uint8Array(length); for (let i = 0; i < length; i++) { bytes[i] = binaryString.charCodeAt(i); } return bytes; } function decryptMessage(ciphertext) { const key = base64ToUint8Array(TEdecryptk); const nonce = base64ToUint8Array(TEdecryptn); const ciphertextUint8Array = new Uint8Array(ciphertext); let decryptedPlaintext = sodium.crypto_secretbox_open_easy(ciphertextUint8Array, nonce, key); decryptedPlaintext = pako.inflate(decryptedPlaintext, { to: 'string' }); if (decryptedPlaintext !== undefined) { return (JSON.parse(decryptedPlaintext)) } } function OnSocketIOLoad() { var MKT_TBL_SELEC = "#table-logic-handler-for-sockets"; var TEChannels = ['calendar']; if (TE_URL == '/') TEChannels = ['calendar', 'market']; else if (TE_URL == "/calendar") TEChannels = ['calendar']; else if (TE_URL.indexOf("calendar") > -1) TEChannels = ['calendar', 'market']; else if (TE_URL.indexOf("/dividends") > -1 || TE_URL.indexOf("/ipo") > -1 || TE_URL.indexOf("/stock-splits") > -1 || TE_URL.indexOf("/earnings") > -1) TEChannels = ['calendar', 'market']; else if (TE_URL.indexOf("stream") > -1) TEChannels = ['calendar', 'market', 'stream']; else if (TE_URL.indexOf("/currencies") > -1) TEChannels = ['currencies', 'calendar']; else if (TE_URL.indexOf("/stocks") > -1) TEChannels = ['indexes', 'calendar']; else if (TE_URL.indexOf("/bonds") > -1) TEChannels = ['bonds', 'calendar']; else if (TE_URL.indexOf("/commodities") > -1) TEChannels = ['commodities', 'calendar']; else if (TE_URL.indexOf("/crypto") > -1) TEChannels = ['crypto', 'calendar']; else if (TE_URL.indexOf("/forecast/government-bond-10y") > -1) TEChannels = ['bonds', 'calendar']; else if (TE_URL.indexOf("/forecast/commodity") > -1) TEChannels = ['commodities', 'calendar']; else if (TE_URL.indexOf("/currency") > -1 || TE_URL.indexOf("/stock-market") > -1 || TE_URL.indexOf("/commodity/") > -1 || TE_URL.indexOf("/government-bond-yield") > -1) TEChannels = ['market', 'calendar']; else if (TE_URL.split(':').length == 2) TEChannels = ['calendar', 'market']; console.log('IO EPOCH: 1740281836'); console.log('IO IP: 8.222.208.146'); console.log('IO URL: /');console.log('IO TOKEN: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlcG9jaCI6MTc0MDI4MTgzNiwiaXAiOiI4LjIyMi4yMDguMTQ2IiwidXJsIjoiLyJ9.U-B8nE3-hwGR0odwQuTKmxWYtc7QZla56hZfGSMW4xk'); socket = io.connect(socket_url, { withCredentials: true, // Needed for ELB Cookies Stickyness auth: { token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlcG9jaCI6MTc0MDI4MTgzNiwiaXAiOiI4LjIyMi4yMDguMTQ2IiwidXJsIjoiLyJ9.U-B8nE3-hwGR0odwQuTKmxWYtc7QZla56hZfGSMW4xk', url: TE_URL } }); socket.on('connect', function () { ioErrorCount = 0; IS_CONNECTED = !0; // Subscribe to the page symbol if (TE_URL.split(':').length == 2 && TESymbol != '') { var socketSymbol = TESymbol.toUpperCase() console.log('IO Subscribe', socketSymbol, 'No lag'); socket.emit('subscribe', { s: [socketSymbol] }) Subscribed.push(socketSymbol) } // Subscribe to channels if (TEChannels && TEChannels.length) { console.log('IO Subscribing to TEChannels', TEChannels); socket.emit('subscribe', { s: TEChannels }) } else { console.log('IO No TEChannels to Subscribe'); } // Subscribe to symbols if (TE_URL != '/' && TE_URL.indexOf("calendar") <= -1 && (TE_URL.split('/').length > 2 || TE_URL.indexOf(":ind") > -1)) { gatherMKTChannels(); if (MKTChannels && MKTChannels.length) { console.log('IO Subscribing to', MKTChannels.length, 'symbols:', MKTChannels); if (MKTChannels.length <= 36) { socket.emit('subscribe', { s: MKTChannels }) } else { console.log('IO Subscribing using Chunks'); var i, j, temparray, chunk = 36; for (i = 0, j = MKTChannels.length; i < j; i += chunk) { temparray = MKTChannels.slice(i, i + chunk); console.log('IO Subscribing to', temparray.length, 'channels:', temparray); socket.emit('subscribe', { s: temparray }) } } } else { console.log('IO No MKTChannels to Subscribe'); } } socket.on('disconnect', function () { IS_CONNECTED = !1; console.log('Got disconnect!') }); socket.on("smooth-disconnect", function () { socket.disconnect() }) }); var isSnap = !0; for (var i = 0; i < TEChannels.length; i++) { channel = TEChannels[i]; if (channel == 'calendar' || channel == 'stream') continue; console.log('IO Snap ' + channel); socket.on(channel, function (a) { a = decryptMessage(a) if (a.length > 0) { for (i = 0; i < a.length; i++) { TE_UpdateTable(a[i], isSnap) TE_UpdateMiniWidget(a[i]) } isSnap = !1 } else { console.log('IO Sent Empty Market Update') } }) } var ioErrorCount = 0; socket.on("connect_error", (err) => { ioErrorCount++; console.log('IO Connect Error', ioErrorCount); console.log(err.message); if (TE_URL.indexOf("calendar") <= -1 && ioErrorCount % 10 == 0) { console.log('Disconnecting IO'); socket.disconnect(); if (ioErrorCount < 100) { var sleepSecs = ioErrorCount * 5; console.log('Connecting again in', sleepSecs, 'seconds'); setInterval(function () { socket.connect() }, sleepSecs * 1000) } else console.log('Stay disconnected'); } }); socket.on('tick', function (t) { t = decryptMessage(t) TE_UpdateTable(t); if (TE_URL.split(':').length == 2) UpdateMarketTick(t); }); function gatherMKTChannels() { // Temporary block to avoid too many symbols return var nMarkets = $("[data-subscribe]").length; console.log("IO data-subscribe tag present in ", nMarkets, "markets") if (nMarkets == null || typeof input !== "undefined") return else if (nMarkets > 600) console.log("IO Skipping [data-subscribe] because of too many symbols") else { console.log("IO Searching [data-subscribe]") var sCount = 0; $("[data-subscribe]").each(function (i, item) { var socketSymbol = $(item).attr('data-subscribe') if (!MKTChannels.includes(socketSymbol) && !Subscribed.includes(socketSymbol)) { sCount++; console.log('IO [data-subscribe]', sCount, socketSymbol) MKTChannels.push(socketSymbol) } else console.log('Already Subscribed. Skip', socketSymbol) }) } } function TE_UpdateTable(d, isSnap) { var s = d.s; let element_price; $('tr[data-symbol="' + s + '"]').each((i, el) => { element_price = $(el).find("td#p"); }) if (element_price == undefined) { return } const p0 = parseFloat(element_price.text()) var r = $('tr[data-symbol="' + s + '"]'); var p = r.find('td#p'); var dec = 4; if (typeof r.data('decimals') !== 'undefined' && r.data('decimals') !== "") dec = r.data("decimals"); if (p0 != d.p.toFixed(dec)) { p.text(d.p.toFixed(dec)); fg = d.nch > 0 ? 'darkgreen' : d.nch < 0 ? 'darkred' : 'black'; if (IsDarkMode) fg = '#fff' triangle = d.nch > 0 ? '<span class="market-positive-image"></span>' : d.nch < 0 ? '<span class="market-negative-image"></span>' : '<span class="market-neutral-image"></span>'; var previous_triangle = r.find('td#triangle'); if (previous_triangle && previous_triangle.length) { previous_triangle.html(triangle) } var nch = r.find('td#nch'); if (nch) { nch.each(function (i, item) { if ($(item).attr("data-no-triangle")) { $(item).text(d.nch.toFixed(dec)); $(item).css("color", fg); $(item).html(Math.abs(d.nch.toFixed(dec))) } else { $(item).text(d.nch.toFixed(dec)); $(item).css("color", fg); $(item).html(triangle + ' ' + Math.abs(d.nch.toFixed(dec))) } }) } var pch = r.find('td#pch'); pch.text(d.pch.toFixed(2) + '%'); if (TEChannels != "market") { nch.attr('data-value', d.nch); pch.attr('data-value', d.pch) } r.find('td#pch') pch.css("color", fg); bg = IsDarkMode == true ? '#254f73' : '#cdebf9'; p.css("backgroundColor", bg); setTimeout(function () { p.css("backgroundColor", 'transparent') }, 1000) if (!isSnap) { var dt = new Date(); var h = dt.getHours(); if (h < 10) { h = "0" + h } var m = dt.getMinutes(); if (m < 10) { m = "0" + m } var ds = [h, m].join(':'); r.find('td#date').html(ds) } if (d.type && d.type == 'index') { var stateColor = '', stateSpan = ''; var state = d.state; if (d.dstate) state = d.dstate; if (state == 'open') stateColor = 'green'; else if (state == 'closed') stateColor = 'red'; else if (state == 'pre') stateColor = '#CFB53B'; else if (state == 'after') stateColor = '#CFB53B'; else { console.log('IO - Unknown Session State', s); return; } if (stateColor != '') { stateSpan = '<span class="bi bi-clock" style="font-size:10px; color: ' + stateColor + '" title="' + state + ' trading session"></span>'; r.find('td#session').html(stateSpan) } } } }; function TE_UpdateMiniWidget(t) { try { function isSameDay(date1, date2) { return ( date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate() ); } if (chart && TE_URL == '/') { if (chart.userOptions.series[0]['symbol'].toLowerCase() == t.s.toLowerCase()) { let seriesData = chart.series[0].data; let lastDataPoint = seriesData[seriesData.length - 1]; let lastDate = new Date(lastDataPoint.x); let currentDate = new Date(); currentDate.setHours(0, 0, 0, 0); let sameDay = isSameDay(lastDate, currentDate) if (sameDay) { const newValue = t.p; const newChang = t.nch; const newP = t.pch; lastDataPoint.update({ y: newValue, change: newChang, percentChange: newP, }); //addCloseLine(); addCustomLabel(newValue); } else { chart.series[0].addPoint( { x: currentDate.getTime(), y: t.p, change: t.nch, percentChange: t.pch, }, true, true ); //addCloseLine() addCustomLabel(t.p) } } } } catch (e) { //console.error("Issues updating mini widget") } } var TENotifications = 0; function TENotification(_title, _text, _url, _importance) { TENotifications++; console.log("IO => Notification => ", _title, _text, _url, _importance, TENotifications); if (TENotifications > 2 & _importance <= 1) return; if (TENotifications > 4 & _importance <= 2) return; var IsDesktop = !1; var _titleHTML = 'ALERT'; var _alertType = 'NEWS'; var _color = "#5bc0de"; if (_importance > 0) { _alertType = 'CALENDAR'; if (_importance > 1) { IsDesktop = !0; _color = '#5cb85c'; if (_importance > 2) _color = '#d9534f' } } if (TELanguage == '') { upsertNotification({ title: _title, text: _text, url: _url, importance: _importance }, false, true); } _titleHTML = '<div style="padding-bottom:10px; font-size: 11px;color: #fff; font-weight: bold;"><span style="background-color: #000; padding: 3px;">' + _alertType + '</span><span style="background-color: ' + _color + '; padding: 3px;">ALERT</span></div>'; var _textHTML = _text; if (_text && _text.length > 200) { console.log("Trim text"); _textHTML = _text.substring(0, 200) + '...'; _textHTML += ' <a style="text-decoration: underline;" target="_new" href="' + _url + '">More</a>' } else if (_text) { _textHTML += ' <a style="text-decoration: underline;" target="_new" href="' + _url + '">More</a>' } PNotify.desktop.permission(); (new PNotify({ title: _titleHTML, text: _textHTML, hide: !0, animation: 'fade', shadow: !0, icon: !1, mouse_reset: !1, delay: 20000, buttons: { sticker: !1, closer_hover: !1 }, addclass: 'custom', })).get().click(function (e) { if ($('.ui-pnotify-closer, .ui-pnotify-closer *').is(e.target)) { console.log("Closed Notification"); return } window.location = _url }); if (IsDesktop) { var _tag = _url + "?v=" + new Date().toISOString().slice(0, 10).replace(/-/g, ""); console.log("PNotify tag", _tag); (new PNotify({ title: _titleHTML, text: _textHTML, hide: !1, animation: 'fade', shadow: !0, icon: !1, mouse_reset: !1, hide: !0, delay: 20000, buttons: { sticker: !1, closer_hover: !1 }, addclass: 'custom', type: 'info', desktop: { desktop: IsDesktop, title: 'TRADING ECONOMICS', text: _text, tag: _tag, fallback: !1 } })).get().click(function (e) { if ($('.ui-pnotify-closer, .ui-pnotify-closer *').is(e.target)) { console.log("Closed Notification"); return } window.location = _url }) } } function TECalendarRowUpdate(c) { console.log("UPDATE CALENDAR ROW"); console.log(c); var $row = $('tr[data-id="' + c.CalendarId + '"]'); console.log($row); var $td = $row.find('span#actual'); console.log($td); $td.text(c.Actual); console.log(c.Actual); console.log($td.text); bg = '#5bc0de'; $td.css("backgroundColor", bg); color = c.Actual.toString().indexOf("-") ? 'darkgreen' : 'darkred'; $td.css("color", color); $row.find('span#previous').text(c.Previous); $row.find('img#incoming').css("display", 'none'); setInterval(function () { $td.css("backgroundColor", '#ffffff') }, 2000) } socket.on('calendar', function (c) { console.log("IO CALENDAR") c = decryptMessage(c) console.log(c); if (c.Importance >= 1) { var _title = c.Country.trim() + ' ' + c.Event.trim(); var _text = _title; if (c.Actual != null && c.Actual != '') _text += ' reported at ' + c.Actual + '. '; if (c.Forecast != null && c.Forecast != '') _text += 'Consensus was ' + c.Forecast + '. '; if (c.Previous != null && c.Previous != '') _text += 'Previously at ' + c.Previous + '.'; var _url = 'https://tradingeconomics.com' + c.URL; if (TE_URL.indexOf("calendar") > -1 || (TELanguage != null && TELanguage.length > 0 && TE_URL == '/')) TECalendarRowUpdate(c); TENotification(_title, _text, _url, c.Importance) } }); socket.on('stream', function (j) { console.log("IO STREAM") j = decryptMessage(j) console.log(j); var _title = j.title; var _description = j.description; var _url = j.url; if (_title && _description && _url) { TENotification(_title, _description, _url, 0) } }); var KILL_SOCKET_AFTER_IDLE = 1000 * 60 * 30; var IS_RELOAD_REQUIRED = !1; var IS_QUESTION_OPEN = !1; var IS_CONNECTED = !1; var LAST_VISIBLE = new Date().getTime(); if (TE_URL.indexOf("calendar") > -1 || TE_URL.indexOf("/currency") > -1 || TE_URL.indexOf("/stock-market") > -1 || TE_URL.indexOf("/commodity/") > -1 || TE_URL.indexOf("/government-bond-yield") > -1 || TE_URL.indexOf("stream") > -1 || TE_URL.indexOf("/currencies") > -1 || TE_URL.indexOf("/stocks") > -1 || TE_URL.indexOf("/bonds") > -1 || TE_URL.indexOf("/commodities") > -1) { KILL_SOCKET_AFTER_IDLE = 1000 * 60 * 60; IS_RELOAD_REQUIRED = !0 } // To be users in market pages ex aapl:us function UpdateMarketTick(t) { if (t.state && t.state == 'closed') { console.log('market is closed'); } var s = t.s; if (!s || s.toLowerCase() != symbol.toLowerCase()) { return; } $('#market_last').html(t.p); $('#market_daily_chg').html(t.nch + ' '); $('#market_daily_Pchg').html(t.pch + '%'); if (t.nch > 0) { $('#market_chg_arrow').attr('class', 'market-positive-image'); $('#market_daily_chg').css({ color: '#8ecf61' }); $('#market_daily_Pchg').css({ color: '#8ecf61' }); } else { $('#market_chg_arrow').attr('class', 'market-negative-image'); $('#market_daily_chg').css({ color: '#ed3b3b' }); $('#market_daily_Pchg').css({ color: '#ed3b3b' }); } } function saveSocketNetworkBW() { console.log("Socket check if alive"); setInterval(function () { if (typeof document == 'undefined' || !document) { console.log("ws: undefined"); return LAST_VISIBLE = new Date().getTime() } if (typeof document.hidden != 'boolean') { console.log("ws: hidden"); return LAST_VISIBLE = new Date().getTime() } if (!document.hidden) { console.log("ws: live"); if (!IS_CONNECTED) { console.log('ws: connecting'); socket.connect() } return LAST_VISIBLE = new Date().getTime() } var now = new Date().getTime(); if (now - LAST_VISIBLE > KILL_SOCKET_AFTER_IDLE) { if (IS_CONNECTED) { console.log('ws: disconnecting'); socket.disconnect(); if (IS_RELOAD_REQUIRED && IS_QUESTION_OPEN == !1) { var result = confirm("Please Press Ok to Refresh the Data in this Page"); IS_QUESTION_OPEN = !0; if (result) { IS_QUESTION_OPEN = !1; document.location = document.location.href } } } } }, 1000 * 60) } saveSocketNetworkBW() // pnotify !function (t, i) { "function" == typeof define && define.amd ? define("pnotify", ["jquery"], function (s) { return i(s, t) }) : "object" == typeof exports && "undefined" != typeof module ? module.exports = i(require("jquery"), global || t) : t.PNotify = i(t.jQuery, t) }("undefined" != typeof window ? window : this, function (t, i) { var s = function (i) { var e, o, n = { dir1: "down", dir2: "left", push: "bottom", spacing1: 36, spacing2: 36, context: t("body"), modal: !1 }, a = t(i), r = function () { o = t("body"), c.prototype.options.stack.context = o, a = t(i), a.bind("resize", function () { e && clearTimeout(e), e = setTimeout(function () { c.positionAll(!0) }, 10) }) }, h = function (i) { var s = t("<div />", { class: "ui-pnotify-modal-overlay" }); return s.prependTo(i.context), i.overlay_close && s.click(function () { c.removeStack(i) }), s }, c = function (t) { this.state = "initializing", this.timer = null, this.animTimer = null, this.styles = null, this.elem = null, this.container = null, this.title_container = null, this.text_container = null, this.animating = !1, this.timerHide = !1, this.parseOptions(t), this.init() }; return t.extend(c.prototype, { version: "3.2.0", options: { title: !1, title_escape: !1, text: !1, text_escape: !1, styling: "brighttheme", addclass: "", cornerclass: "", auto_display: !0, width: "300px", min_height: "16px", type: "notice", icon: !0, animation: "fade", animate_speed: "normal", shadow: !0, hide: !0, delay: 8e3, mouse_reset: !0, remove: !0, insert_brs: !0, destroy: !0, stack: n }, modules: {}, runModules: function (t, i) { var s; for (var e in this.modules) s = "object" == typeof i && e in i ? i[e] : i, "function" == typeof this.modules[e][t] && (this.modules[e].notice = this, this.modules[e].options = "object" == typeof this.options[e] ? this.options[e] : {}, this.modules[e][t](this, "object" == typeof this.options[e] ? this.options[e] : {}, s)) }, init: function () { var i = this; return this.modules = {}, t.extend(!0, this.modules, c.prototype.modules), "object" == typeof this.options.styling ? this.styles = this.options.styling : this.styles = c.styling[this.options.styling], this.elem = t("<div />", { class: "ui-pnotify " + this.options.addclass, css: { display: "none" }, "aria-live": "assertive", "aria-role": "alertdialog", mouseenter: function (t) { if (i.options.mouse_reset && "out" === i.animating) { if (!i.timerHide) return; i.cancelRemove() } i.options.hide && i.options.mouse_reset && i.cancelRemove() }, mouseleave: function (t) { i.options.hide && i.options.mouse_reset && "out" !== i.animating && i.queueRemove(), c.positionAll() } }), "fade" === this.options.animation && this.elem.addClass("ui-pnotify-fade-" + this.options.animate_speed), this.container = t("<div />", { class: this.styles.container + " ui-pnotify-container " + ("error" === this.options.type ? this.styles.error : "info" === this.options.type ? this.styles.info : "success" === this.options.type ? this.styles.success : this.styles.notice), role: "alert" }).appendTo(this.elem), "" !== this.options.cornerclass && this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass), this.options.shadow && this.container.addClass("ui-pnotify-shadow"), !1 !== this.options.icon && t("<div />", { class: "ui-pnotify-icon" }).append(t("<span />", { class: !0 === this.options.icon ? "error" === this.options.type ? this.styles.error_icon : "info" === this.options.type ? this.styles.info_icon : "success" === this.options.type ? this.styles.success_icon : this.styles.notice_icon : this.options.icon })).prependTo(this.container), this.title_container = t("<h4 />", { class: "ui-pnotify-title" }).appendTo(this.container), !1 === this.options.title ? this.title_container.hide() : this.options.title_escape ? this.title_container.text(this.options.title) : this.title_container.html(this.options.title), this.text_container = t("<div />", { class: "ui-pnotify-text", "aria-role": "alert" }).appendTo(this.container), !1 === this.options.text ? this.text_container.hide() : this.options.text_escape ? this.text_container.text(this.options.text) : this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text), "string" == typeof this.options.width && this.elem.css("width", this.options.width), "string" == typeof this.options.min_height && this.container.css("min-height", this.options.min_height), "top" === this.options.stack.push ? c.notices = t.merge([this], c.notices) : c.notices = t.merge(c.notices, [this]), "top" === this.options.stack.push && this.queuePosition(!1, 1), this.options.stack.animation = !1, this.runModules("init"), this.state = "closed", this.options.auto_display && this.open(), this }, update: function (i) { var s = this.options; return this.parseOptions(s, i), this.elem.removeClass("ui-pnotify-fade-slow ui-pnotify-fade-normal ui-pnotify-fade-fast"), "fade" === this.options.animation && this.elem.addClass("ui-pnotify-fade-" + this.options.animate_speed), this.options.cornerclass !== s.cornerclass && this.container.removeClass("ui-corner-all " + s.cornerclass).addClass(this.options.cornerclass), this.options.shadow !== s.shadow && (this.options.shadow ? this.container.addClass("ui-pnotify-shadow") : this.container.removeClass("ui-pnotify-shadow")), !1 === this.options.addclass ? this.elem.removeClass(s.addclass) : this.options.addclass !== s.addclass && this.elem.removeClass(s.addclass).addClass(this.options.addclass), !1 === this.options.title ? this.title_container.slideUp("fast") : this.options.title !== s.title && (this.options.title_escape ? this.title_container.text(this.options.title) : this.title_container.html(this.options.title), !1 === s.title && this.title_container.slideDown(200)), !1 === this.options.text ? this.text_container.slideUp("fast") : this.options.text !== s.text && (this.options.text_escape ? this.text_container.text(this.options.text) : this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "<br />") : this.options.text), !1 === s.text && this.text_container.slideDown(200)), this.options.type !== s.type && this.container.removeClass(this.styles.error + " " + this.styles.notice + " " + this.styles.success + " " + this.styles.info).addClass("error" === this.options.type ? this.styles.error : "info" === this.options.type ? this.styles.info : "success" === this.options.type ? this.styles.success : this.styles.notice), (this.options.icon !== s.icon || !0 === this.options.icon && this.options.type !== s.type) && (this.container.find("div.ui-pnotify-icon").remove(), !1 !== this.options.icon && t("<div />", { class: "ui-pnotify-icon" }).append(t("<span />", { class: !0 === this.options.icon ? "error" === this.options.type ? this.styles.error_icon : "info" === this.options.type ? this.styles.info_icon : "success" === this.options.type ? this.styles.success_icon : this.styles.notice_icon : this.options.icon })).prependTo(this.container)), this.options.width !== s.width && this.elem.animate({ width: this.options.width }), this.options.min_height !== s.min_height && this.container.animate({ minHeight: this.options.min_height }), this.options.hide ? s.hide || this.queueRemove() : this.cancelRemove(), this.queuePosition(!0), this.runModules("update", s), this }, open: function () { this.state = "opening", this.runModules("beforeOpen"); var t = this; return this.elem.parent().length || this.elem.appendTo(this.options.stack.context ? this.options.stack.context : o), "top" !== this.options.stack.push && this.position(!0), this.animateIn(function () { t.queuePosition(!0), t.options.hide && t.queueRemove(), t.state = "open", t.runModules("afterOpen") }), this }, remove: function (s) { this.state = "closing", this.timerHide = !!s, this.runModules("beforeClose"); var e = this; return this.timer && (i.clearTimeout(this.timer), this.timer = null), this.animateOut(function () { if (e.state = "closed", e.runModules("afterClose"), e.queuePosition(!0), e.options.remove && e.elem.detach(), e.runModules("beforeDestroy"), e.options.destroy && null !== c.notices) { var i = t.inArray(e, c.notices); -1 !== i && c.notices.splice(i, 1) } e.runModules("afterDestroy") }), this }, get: function () { return this.elem }, parseOptions: function (i, s) { this.options = t.extend(!0, {}, c.prototype.options), this.options.stack = c.prototype.options.stack; for (var e, o = [i, s], n = 0; n < o.length && void 0 !== (e = o[n]); n++)if ("object" != typeof e) this.options.text = e; else for (var a in e) this.modules[a] ? t.extend(!0, this.options[a], e[a]) : this.options[a] = e[a] }, animateIn: function (t) { this.animating = "in"; var i = this, s = function () { i.animTimer && clearTimeout(i.animTimer), "in" === i.animating && (i.elem.is(":visible") ? (t && t.call(), i.animating = !1) : i.animTimer = setTimeout(s, 40)) }; "fade" === this.options.animation ? (this.elem.one("webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend", s).addClass("ui-pnotify-in"), this.elem.css("opacity"), this.elem.addClass("ui-pnotify-fade-in"), this.animTimer = setTimeout(s, 650)) : (this.elem.addClass("ui-pnotify-in"), s()) }, animateOut: function (i) { this.animating = "out"; var s = this, e = function () { if (s.animTimer && clearTimeout(s.animTimer), "out" === s.animating) if ("0" != s.elem.css("opacity") && s.elem.is(":visible")) s.animTimer = setTimeout(e, 40); else { if (s.elem.removeClass("ui-pnotify-in"), s.options.stack.overlay) { var o = !1; t.each(c.notices, function (t, i) { i != s && i.options.stack === s.options.stack && "closed" != i.state && (o = !0) }), o || s.options.stack.overlay.hide() } i && i.call(), s.animating = !1 } }; "fade" === this.options.animation ? (this.elem.one("webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend", e).removeClass("ui-pnotify-fade-in"), this.animTimer = setTimeout(e, 650)) : (this.elem.removeClass("ui-pnotify-in"), e()) }, position: function (t) { var i = this.options.stack, s = this.elem; if (void 0 === i.context && (i.context = o), i) { "number" != typeof i.nextpos1 && (i.nextpos1 = i.firstpos1), "number" != typeof i.nextpos2 && (i.nextpos2 = i.firstpos2), "number" != typeof i.addpos2 && (i.addpos2 = 0); var e = !s.hasClass("ui-pnotify-in"); if (!e || t) { i.modal && (i.overlay ? i.overlay.show() : i.overlay = h(i)), s.addClass("ui-pnotify-move"); var n, r, c; switch (i.dir1) { case "down": c = "top"; break; case "up": c = "bottom"; break; case "left": c = "right"; break; case "right": c = "left" }n = parseInt(s.css(c).replace(/(?:\..*|[^0-9.])/g, "")), isNaN(n) && (n = 0), void 0 !== i.firstpos1 || e || (i.firstpos1 = n, i.nextpos1 = i.firstpos1); var p; switch (i.dir2) { case "down": p = "top"; break; case "up": p = "bottom"; break; case "left": p = "right"; break; case "right": p = "left" }switch (r = parseInt(s.css(p).replace(/(?:\..*|[^0-9.])/g, "")), isNaN(r) && (r = 0), void 0 !== i.firstpos2 || e || (i.firstpos2 = r, i.nextpos2 = i.firstpos2), ("down" === i.dir1 && i.nextpos1 + s.height() > (i.context.is(o) ? a.height() : i.context.prop("scrollHeight")) || "up" === i.dir1 && i.nextpos1 + s.height() > (i.context.is(o) ? a.height() : i.context.prop("scrollHeight")) || "left" === i.dir1 && i.nextpos1 + s.width() > (i.context.is(o) ? a.width() : i.context.prop("scrollWidth")) || "right" === i.dir1 && i.nextpos1 + s.width() > (i.context.is(o) ? a.width() : i.context.prop("scrollWidth"))) && (i.nextpos1 = i.firstpos1, i.nextpos2 += i.addpos2 + (void 0 === i.spacing2 ? 25 : i.spacing2), i.addpos2 = 0), "number" == typeof i.nextpos2 && (i.animation ? s.css(p, i.nextpos2 + "px") : (s.removeClass("ui-pnotify-move"), s.css(p, i.nextpos2 + "px"), s.css(p), s.addClass("ui-pnotify-move"))), i.dir2) { case "down": case "up": s.outerHeight(!0) > i.addpos2 && (i.addpos2 = s.height()); break; case "left": case "right": s.outerWidth(!0) > i.addpos2 && (i.addpos2 = s.width()) }switch ("number" == typeof i.nextpos1 && (i.animation ? s.css(c, i.nextpos1 + "px") : (s.removeClass("ui-pnotify-move"), s.css(c, i.nextpos1 + "px"), s.css(c), s.addClass("ui-pnotify-move"))), i.dir1) { case "down": case "up": i.nextpos1 += s.height() + (void 0 === i.spacing1 ? 25 : i.spacing1); break; case "left": case "right": i.nextpos1 += s.width() + (void 0 === i.spacing1 ? 25 : i.spacing1) } } return this } }, queuePosition: function (t, i) { return e && clearTimeout(e), i || (i = 10), e = setTimeout(function () { c.positionAll(t) }, i), this }, cancelRemove: function () { return this.timer && i.clearTimeout(this.timer), this.animTimer && i.clearTimeout(this.animTimer), "closing" === this.state && (this.state = "open", this.animating = !1, this.elem.addClass("ui-pnotify-in"), "fade" === this.options.animation && this.elem.addClass("ui-pnotify-fade-in")), this }, queueRemove: function () { var t = this; return this.cancelRemove(), this.timer = i.setTimeout(function () { t.remove(!0) }, isNaN(this.options.delay) ? 0 : this.options.delay), this } }), t.extend(c, { notices: [], reload: s, removeAll: function () { t.each(c.notices, function (t, i) { i.remove && i.remove(!1) }) }, removeStack: function (i) { t.each(c.notices, function (t, s) { s.remove && s.options.stack === i && s.remove(!1) }) }, positionAll: function (i) { if (e && clearTimeout(e), e = null, c.notices && c.notices.length) t.each(c.notices, function (t, s) { var e = s.options.stack; e && (e.overlay && e.overlay.hide(), e.nextpos1 = e.firstpos1, e.nextpos2 = e.firstpos2, e.addpos2 = 0, e.animation = i) }), t.each(c.notices, function (t, i) { i.position() }); else { var s = c.prototype.options.stack; s && (delete s.nextpos1, delete s.nextpos2) } }, styling: { brighttheme: { container: "brighttheme", notice: "brighttheme-notice", notice_icon: "brighttheme-icon-notice", info: "brighttheme-info", info_icon: "brighttheme-icon-info", success: "brighttheme-success", success_icon: "brighttheme-icon-success", error: "brighttheme-error", error_icon: "brighttheme-icon-error" }, bootstrap3: { container: "alert", notice: "alert-warning", notice_icon: "glyphicon glyphicon-exclamation-sign", info: "alert-info", info_icon: "glyphicon glyphicon-info-sign", success: "alert-success", success_icon: "bi bi-check-lg-sign", error: "alert-danger", error_icon: "glyphicon glyphicon-warning-sign" } } }), c.styling.fontawesome = t.extend({}, c.styling.bootstrap3), t.extend(c.styling.fontawesome, { notice_icon: "fa fa-exclamation-circle", info_icon: "fa fa-info", success_icon: "fa fa-check", error_icon: "fa fa-warning" }), i.document.body ? r() : t(r), c }; return s(i) }); !function (o, s) { "function" == typeof define && define.amd ? define("pnotify.buttons", ["jquery", "pnotify"], s) : "object" == typeof exports && "undefined" != typeof module ? module.exports = s(require("jquery"), require("./pnotify")) : s(o.jQuery, o.PNotify) }("undefined" != typeof window ? window : this, function (o, s) { return s.prototype.options.buttons = { closer: !0, closer_hover: !0, sticker: !0, sticker_hover: !0, show_on_nonblock: !1, labels: { close: "Close", stick: "Stick", unstick: "Unstick" }, classes: { closer: null, pin_up: null, pin_down: null } }, s.prototype.modules.buttons = { init: function (s, i) { var n = this; s.elem.on({ mouseenter: function (o) { !n.options.sticker || s.options.nonblock && s.options.nonblock.nonblock && !n.options.show_on_nonblock || n.sticker.trigger("pnotify:buttons:toggleStick").css("visibility", "visible"), !n.options.closer || s.options.nonblock && s.options.nonblock.nonblock && !n.options.show_on_nonblock || n.closer.css("visibility", "visible") }, mouseleave: function (o) { n.options.sticker_hover && n.sticker.css("visibility", "d-none"), n.options.closer_hover && n.closer.css("visibility", "d-none") } }), this.sticker = o("<div />", { class: "ui-pnotify-sticker", "aria-role": "button", "aria-pressed": s.options.hide ? "false" : "true", tabindex: "0", title: s.options.hide ? i.labels.stick : i.labels.unstick, css: { cursor: "pointer", visibility: i.sticker_hover ? "d-none" : "visible" }, click: function () { s.options.hide = !s.options.hide, s.options.hide ? s.queueRemove() : s.cancelRemove(), o(this).trigger("pnotify:buttons:toggleStick") } }).bind("pnotify:buttons:toggleStick", function () { var i = null === n.options.classes.pin_up ? s.styles.pin_up : n.options.classes.pin_up, e = null === n.options.classes.pin_down ? s.styles.pin_down : n.options.classes.pin_down; o(this).attr("title", s.options.hide ? n.options.labels.stick : n.options.labels.unstick).children().attr("class", "").addClass(s.options.hide ? i : e).attr("aria-pressed", s.options.hide ? "false" : "true") }).append("<span />").trigger("pnotify:buttons:toggleStick").prependTo(s.container), (!i.sticker || s.options.nonblock && s.options.nonblock.nonblock && !i.show_on_nonblock) && this.sticker.css("display", "none"), this.closer = o("<div />", { class: "ui-pnotify-closer", "aria-role": "button", tabindex: "0", title: i.labels.close, css: { cursor: "pointer", visibility: i.closer_hover ? "d-none" : "visible" }, click: function () { s.remove(!1), n.sticker.css("visibility", "d-none"), n.closer.css("visibility", "d-none") } }).append(o("<span />", { class: null === i.classes.closer ? s.styles.closer : i.classes.closer })).prependTo(s.container), (!i.closer || s.options.nonblock && s.options.nonblock.nonblock && !i.show_on_nonblock) && this.closer.css("display", "none") }, update: function (o, s) { !s.closer || o.options.nonblock && o.options.nonblock.nonblock && !s.show_on_nonblock ? this.closer.css("display", "none") : s.closer && this.closer.css("display", "block"), !s.sticker || o.options.nonblock && o.options.nonblock.nonblock && !s.show_on_nonblock ? this.sticker.css("display", "none") : s.sticker && this.sticker.css("display", "block"), this.sticker.trigger("pnotify:buttons:toggleStick"), this.closer.find("span").attr("class", "").addClass(null === s.classes.closer ? o.styles.closer : s.classes.closer), s.sticker_hover ? this.sticker.css("visibility", "d-none") : o.options.nonblock && o.options.nonblock.nonblock && !s.show_on_nonblock || this.sticker.css("visibility", "visible"), s.closer_hover ? this.closer.css("visibility", "d-none") : o.options.nonblock && o.options.nonblock.nonblock && !s.show_on_nonblock || this.closer.css("visibility", "visible") } }, o.extend(s.styling.brighttheme, { closer: "brighttheme-icon-closer", pin_up: "brighttheme-icon-sticker", pin_down: "brighttheme-icon-sticker brighttheme-icon-stuck" }), o.extend(s.styling.bootstrap3, { closer: "bi bi-x-lg", pin_up: "glyphicon glyphicon-pause", pin_down: "glyphicon glyphicon-play" }), o.extend(s.styling.fontawesome, { closer: "fa fa-times", pin_up: "fa fa-pause", pin_down: "fa fa-play" }), s }); !function (i, t) { "function" == typeof define && define.amd ? define("pnotify.desktop", ["jquery", "pnotify"], t) : "object" == typeof exports && "undefined" != typeof module ? module.exports = t(require("jquery"), require("./pnotify")) : t(i.jQuery, i.PNotify) }("undefined" != typeof window ? window : this, function (i, t) { var o, n = function (i, t) { return (n = "Notification" in window ? function (i, t) { return new Notification(i, t) } : "mozNotification" in navigator ? function (i, t) { return navigator.mozNotification.createNotification(i, t.body, t.icon).show() } : "webkitNotifications" in window ? function (i, t) { return window.webkitNotifications.createNotification(t.icon, i, t.body) } : function (i, t) { return null })(i, t) }; return t.prototype.options.desktop = { desktop: !1, fallback: !0, icon: null, tag: null, title: null, text: null }, t.prototype.modules.desktop = { genNotice: function (i, t) { null === t.icon ? this.icon = "https://sciactive.com/pnotify/includes/desktop/" + i.options.type + ".png" : !1 === t.icon ? this.icon = null : this.icon = t.icon, null !== this.tag && null === t.tag || (this.tag = null === t.tag ? "PNotify-" + Math.round(1e6 * Math.random()) : t.tag), i.desktop = n(t.title || i.options.title, { icon: this.icon, body: t.text || i.options.text, tag: this.tag }), !("close" in i.desktop) && "cancel" in i.desktop && (i.desktop.close = function () { i.desktop.cancel() }), i.desktop.onclick = function () { i.elem.trigger("click") }, i.desktop.onclose = function () { "closing" !== i.state && "closed" !== i.state && i.remove() } }, init: function (i, n) { if (n.desktop) { if (0 !== (o = t.desktop.checkPermission())) return void (n.fallback || (i.options.auto_display = !1)); this.genNotice(i, n) } }, update: function (i, t, n) { 0 !== o && t.fallback || !t.desktop || this.genNotice(i, t) }, beforeOpen: function (i, t) { 0 !== o && t.fallback || !t.desktop || i.elem.css({ left: "-10000px" }).removeClass("ui-pnotify-in") }, afterOpen: function (i, t) { 0 !== o && t.fallback || !t.desktop || (i.elem.css({ left: "-10000px" }).removeClass("ui-pnotify-in"), "show" in i.desktop && i.desktop.show()) }, beforeClose: function (i, t) { 0 !== o && t.fallback || !t.desktop || i.elem.css({ left: "-10000px" }).removeClass("ui-pnotify-in") }, afterClose: function (i, t) { 0 !== o && t.fallback || !t.desktop || (i.elem.css({ left: "-10000px" }).removeClass("ui-pnotify-in"), "close" in i.desktop && i.desktop.close()) } }, t.desktop = { permission: function () { "undefined" != typeof Notification && "requestPermission" in Notification ? Notification.requestPermission() : "webkitNotifications" in window && window.webkitNotifications.requestPermission() }, checkPermission: function () { return "undefined" != typeof Notification && "permission" in Notification ? "granted" === Notification.permission ? 0 : 1 : "webkitNotifications" in window && 0 == window.webkitNotifications.checkPermission() ? 0 : 1 } }, o = t.desktop.checkPermission(), t }); !function (i, o) { "function" == typeof define && define.amd ? define("pnotify.mobile", ["jquery", "pnotify"], o) : "object" == typeof exports && "undefined" != typeof module ? module.exports = o(require("jquery"), require("./pnotify")) : o(i.jQuery, i.PNotify) }("undefined" != typeof window ? window : this, function (i, o) { return o.prototype.options.mobile = { swipe_dismiss: !0, styling: !0 }, o.prototype.modules.mobile = { init: function (i, o) { var t = this, e = null, n = null, s = null; this.swipe_dismiss = o.swipe_dismiss, this.doMobileStyling(i, o), i.elem.on({ touchstart: function (o) { t.swipe_dismiss && (e = o.originalEvent.touches[0].screenX, s = i.elem.width(), i.container.css("left", "0")) }, touchmove: function (o) { if (e && t.swipe_dismiss) { var a = o.originalEvent.touches[0].screenX; n = a - e; var c = (1 - Math.abs(n) / s) * i.options.opacity; i.elem.css("opacity", c), i.container.css("left", n) } }, touchend: function () { if (e && t.swipe_dismiss) { if (Math.abs(n) > 40) { var o = n < 0 ? -2 * s : 2 * s; i.elem.animate({ opacity: 0 }, 100), i.container.animate({ left: o }, 100), i.remove() } else i.elem.animate({ opacity: i.options.opacity }, 100), i.container.animate({ left: 0 }, 100); e = null, n = null, s = null } }, touchcancel: function () { e && t.swipe_dismiss && (i.elem.animate({ opacity: i.options.opacity }, 100), i.container.animate({ left: 0 }, 100), e = null, n = null, s = null) } }) }, update: function (i, o) { this.swipe_dismiss = o.swipe_dismiss, this.doMobileStyling(i, o) }, doMobileStyling: function (o, t) { t.styling ? (o.elem.addClass("ui-pnotify-mobile-able"), i(window).width() <= 480 ? (o.options.stack.mobileOrigSpacing1 || (o.options.stack.mobileOrigSpacing1 = o.options.stack.spacing1, o.options.stack.mobileOrigSpacing2 = o.options.stack.spacing2), o.options.stack.spacing1 = 0, o.options.stack.spacing2 = 0) : (o.options.stack.mobileOrigSpacing1 || o.options.stack.mobileOrigSpacing2) && (o.options.stack.spacing1 = o.options.stack.mobileOrigSpacing1, delete o.options.stack.mobileOrigSpacing1, o.options.stack.spacing2 = o.options.stack.mobileOrigSpacing2, delete o.options.stack.mobileOrigSpacing2)) : (o.elem.removeClass("ui-pnotify-mobile-able"), o.options.stack.mobileOrigSpacing1 && (o.options.stack.spacing1 = o.options.stack.mobileOrigSpacing1, delete o.options.stack.mobileOrigSpacing1), o.options.stack.mobileOrigSpacing2 && (o.options.stack.spacing2 = o.options.stack.mobileOrigSpacing2, delete o.options.stack.mobileOrigSpacing2)) } }, o }); // Test //TE_UpdateTable({ "s": "NDX:IND", "p": 15274.39, "nch": -199.53, "pch": -1.29, "type": "index", "state": "open", "dstate": "open" }, false) //TEST notificationList /*setTimeout(() => { TENotification("United States Core Inflation Rate YoY", "United States Core Inflation Rate YoY reported at 3.3%. Consensus was 3.4%. Previously at 3.4%", "/", "3") }, 25000) setTimeout(() => { TENotification("United States CPI", "United States CPI reported at 314.18. Consensus was 314.63. Previously at 314.07.", "/", "3") }, 30001) setTimeout(() => { TENotification("United States Inflation Rate YoY", "United States Inflation Rate YoY reported at 3.0%. Consensus was 3.1%. Previously at 3.3%.", "/", "3") }, 35002) setTimeout(() => { TENotification("United States Inflation Rate MoM", "United States Inflation Rate MoM reported at -0.1%. Consensus was 0.1%. Previously at 0.0%.", "/", "3") }, 40003) setTimeout(() => { TENotification("United States Core Inflation Rate MoM", "United States Core Inflation Rate MoM reported at 0.1%. Consensus was 0.2%. Previously at 0.2%.", "/", "3") }, 45004)*/ }</script> <script> $(function(){ console.log("Heatmap2"); //if (!IsDarkMode && window.location.pathname.length <= 1 ) return var IsDarkModeByForce = false; if (window.location.pathname.length <= 1 || window.location.pathname.indexOf("matrix") > -1) IsDarkModeByForce = true; function shadeColor2(color, percent) { var f = parseInt(color.slice(1), 16), t = percent < 0 ? 0 : 255, p = percent < 0 ? percent * -1 : percent, R = f >> 16, G = f >> 8 & 0x00FF, B = f & 0x0000FF; return "#" + (0x1000000 + (Math.round((t - R) * p) + R) * 0x10000 + (Math.round((t - G) * p) + G) * 0x100 + (Math.round((t - B) * p) + B)).toString(16).slice(1); } function colorMyTable() { console.log("Heatmap2 - ColorMyTable") var table = $(".table-heatmap"); var tbody = table.find('tbody'); var _columns = {}; table.find('thead').find('tr').find('th').each(function (i, th) { if ($(th).attr('data-heatmap')) { _columns[i] = { 'index': i, 'limit': $(th).attr('data-heatmap-limit'), 'upColor': $(th).attr('data-heatmap-upcolor') || '#f93639', 'dnColor': $(th).attr('data-heatmap-dncolor') || '#34d65f' }; } }); $(tbody).find('tr').each(function (i, row) { var tdArr = $(row).find('td'); for (var key in _columns) { var thisColumn = _columns[key], td; if (!(td = tdArr[key])) { continue; } var value = $(td).attr('data-heatmap-value') || Number($(td).html().replace('%', '')); if (!value) { //console.log("no value ...", key); continue; } var range = Math.floor(Math.abs(value) / (thisColumn.limit / 10)); if (range > 10) range = 10; var percentToShade = (10 - range) / 10; if (TEComparable == -1 || TEComparable == 2) { thisColumn.upColor = '#34d65f'; thisColumn.dnColor = '#f93639'; } var color = shadeColor2(value < 0 ? thisColumn.upColor : thisColumn.dnColor, percentToShade); //console.log(value, percentToShade) if (IsDarkMode || IsDarkModeByForce) { if ($(td).children().length > 0) $(td).children().css({ 'color': color }); else $(td).css({ 'color': color }); } else $(td).css({ 'background-color': color}); } }); } colorMyTable(); setInterval(colorMyTable, 60 * 1000); }); </script> <script>/*! sortable.js 0.8.0 */(function () { var a, b, c, d, e, g; a = "table[data-sortable]", d = /^-?[£$¤]?[\d,.]+%?$/, g = /^\s+|\s+$/g, c = ["click"], b = function (a, b, c) { return null != a.addEventListener ? a.addEventListener(b, c, !1) : a.attachEvent("on" + b, c) }, e = { init: function (b) { var c, d, f, g, h; for (null == b && (b = {}), null == b.selector && (b.selector = a), d = document.querySelectorAll(b.selector), h = [], f = 0, g = d.length; g > f; f++)c = d[f], h.push(e.initTable(c)); return h }, initTable: function (a) { var b, c, d, f, g, h; if (1 === (null != (h = a.tHead) ? h.rows.length : void 0) && "true" !== a.getAttribute("data-sortable-initialized")) { for (a.setAttribute("data-sortable-initialized", "true"), d = a.querySelectorAll("th"), b = f = 0, g = d.length; g > f; b = ++f)c = d[b], "false" !== c.getAttribute("data-sortable") && e.setupClickableTH(a, c, b); return a } }, setupClickableTH: function (a, d, f) { var g, h, i, j, k, l; for (i = e.getColumnType(a, f), h = function (b) { var c, g, h, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D; if (b.handled === !0) return !1; for (b.handled = !0, m = "true" === this.getAttribute("data-sorted"), n = this.getAttribute("data-sorted-direction"), h = m ? "ascending" === n ? "descending" : "ascending" : i.defaultSortDirection, p = this.parentNode.querySelectorAll("th"), s = 0, w = p.length; w > s; s++)d = p[s], d.setAttribute("data-sorted", "false"), d.removeAttribute("data-sorted-direction"); if (this.setAttribute("data-sorted", "true"), this.setAttribute("data-sorted-direction", h), o = a.tBodies[0], l = [], m) { for (D = o.rows, v = 0, z = D.length; z > v; v++)g = D[v], l.push(g); for (l.reverse(), B = 0, A = l.length; A > B; B++)k = l[B], o.appendChild(k) } else { for (r = null != i.compare ? i.compare : function (a, b) { return b - a }, c = function (a, b) { return a[0] === b[0] ? a[2] - b[2] : i.reverse ? r(b[0], a[0]) : r(a[0], b[0]) }, C = o.rows, j = t = 0, x = C.length; x > t; j = ++t)k = C[j], q = e.getNodeValue(k.cells[f]), null != i.comparator && (q = i.comparator(q)), l.push([q, k, j]); for (l.sort(c), u = 0, y = l.length; y > u; u++)k = l[u], o.appendChild(k[1]) } return "function" == typeof window.CustomEvent && "function" == typeof a.dispatchEvent ? a.dispatchEvent(new CustomEvent("Sortable.sorted", { bubbles: !0 })) : void 0 }, l = [], j = 0, k = c.length; k > j; j++)g = c[j], l.push(b(d, g, h)); return l }, getColumnType: function (a, b) { var c, d, f, g, h, i, j, k, l, m, n; if (d = null != (l = a.querySelectorAll("th")[b]) ? l.getAttribute("data-sortable-type") : void 0, null != d) return e.typesObject[d]; for (m = a.tBodies[0].rows, h = 0, j = m.length; j > h; h++)for (c = m[h], f = e.getNodeValue(c.cells[b]), n = e.types, i = 0, k = n.length; k > i; i++)if (g = n[i], g.match(f)) return g; return e.typesObject.alpha }, getNodeValue: function (a) { var b; return a ? (b = a.getAttribute("data-value"), null !== b ? b : "undefined" != typeof a.innerText ? a.innerText.replace(g, "") : a.textContent.replace(g, "")) : "" }, setupTypes: function (a) { var b, c, d, f; for (e.types = a, e.typesObject = {}, f = [], c = 0, d = a.length; d > c; c++)b = a[c], f.push(e.typesObject[b.name] = b); return f } }, e.setupTypes([{ name: "numeric", defaultSortDirection: "descending", match: function (a) { return a.match(d) }, comparator: function (a) { return parseFloat(a.replace(/[^0-9.-]/g, ""), 10) || 0 } }, { name: "date", defaultSortDirection: "ascending", reverse: !0, match: function (a) { return !isNaN(Date.parse(a)) }, comparator: function (a) { return Date.parse(a) || 0 } }, { name: "alpha", defaultSortDirection: "ascending", match: function () { return !0 }, compare: function (a, b) { return a.localeCompare(b) } }]), setTimeout(e.init, 0), "function" == typeof define && define.amd ? define(function () { return e }) : "undefined" != typeof exports ? module.exports = e : window.Sortable = e }).call(this);</script> <script type="text/javascript" src="//d3fy651gv2fhd3.cloudfront.net/js/search.min.js?v=20240502" async></script> <script> TENotificationsHistorical = [] TENotificationsNews = [] //console.log('• Notifications Script Loaded - 20240701') setTimeout(() => { getNotificationsFromCookie() loadBellStatus() },1000) function loadBellStatus() { //console.log("• get bell status from cookie") var seenData = false const cookieData = document.cookie.split(';').find(item => item.trim().startsWith('TENewNotifications')); if (cookieData) { seenData = cookieData.split('TENewNotifications=')[1].split(',')[0] } if (seenData == 'true') { //console.log("new notification") $('#notification-new').show() $('#notification-empty').hide() } else { $('#notification-new').hide() $('#notification-empty').show() } } function setNotificationCookieStatus(status) { document.cookie = `TENewNotifications=${status.toString()}; expires=${createExpirationDate('eod')}; path=/`; } function changeIconStatus(isHover) { try { //console.log("change bell") if (TENotificationsHistorical.length > 0 && !isHover) { $('#notification-new').show() $('#notification-empty').hide() setNotificationCookieStatus(true) } else if (TENotificationsNews.length > 0 && !isHover) { $('#notification-new').show() $('#notification-empty').hide() setNotificationCookieStatus(true) } else { $('#notification-new').hide() $('#notification-empty').show() setNotificationCookieStatus(false) } } catch (e) { console.error(e) } } function timeAgo(datetime) { try { const now = new Date(); const diff = now - new Date(datetime); let seconds = Math.floor(diff / 1000); const minuteInSecs = 60; const hourInSecs = minuteInSecs * 60; let timeAgoString; if (seconds < minuteInSecs) { if (seconds == 0) { seconds = 1 } const plural = seconds == 1 ? '' : 's'; timeAgoString = `${seconds} second${plural} ago`; } else if (seconds < hourInSecs) { const minutes = Math.floor(seconds / minuteInSecs); timeAgoString = `${minutes} minutes ago`; } else { const hours = Math.floor(seconds / hourInSecs); const plural = hours > 1 ? 's' : ''; timeAgoString = `${hours} hour${plural} ago`; } return timeAgoString; } catch (e) { console.error(e) } } function createExpirationDate(span) { const expires = new Date(); if (span == '1d') { expires.setDate(expires.getDate() + 1) return expires.toUTCString() } else if (span == '1h') { expires.setHours(expires.getHours() + 1); return expires.toUTCString(); } else if (span == 'eod') { //end of day const expiresTime = new Date(expires.getTime()); expiresTime.setHours(23, 59, 59); return expiresTime.toUTCString(); } } function removeNotificationIndex(i) { try { if (TENotificationsHistorical.length == 0 && TENotificationsNews.length > 0) { TENotificationsNews.splice(i, 1); document.cookie = `TELastNews=${JSON.stringify(TENotificationsNews)}; path=/`; } if (TENotificationsHistorical.length > 0) { TENotificationsHistorical.splice(i, 1); } $('.notification-list').empty(); addNotificationCookie() if (TENotificationsNews.length == 0 || (TENotificationsNews.length == 0 && TENotificationsHistorical.length == 0)) { addEmptyContent() } if (TENotificationsHistorical.length > 0 || TENotificationsNews.length > 0) { upsertNotification(null, true, false) } } catch (e) { console.error(e) } } function addEmptyContent() { try { //console.log("Add Empty Content") const notificationList = $('.notification-list'); notificationList.empty(); //notificationList.append('<div style="display:flex;justify-content:space-between;align-itens:center"><span style="margin-left:18px"><b>Notifications</b></span></div>') let html = `<div class="empty-notificationlist"> <div class="empty-notificationlist-content"> <span>You have no new notifications</span> <br> <i class="bi bi-bell-slash-fill"></i> <br> <div><a href="/stream" title="Show all news" class="empty-notificationlist-more"><div class="btn btn-outline-secondary">All News</div></a></div> </div> </div>`; notificationList.append(html); } catch (e) { console.error(e) } } function addContent() { try { //console.log("AddContent") const notifiList = TENotificationsHistorical.length > 0 ? TENotificationsHistorical : TENotificationsNews; const notificationList = $('.notification-list'); notificationList.empty(); if (notifiList.length > 0) { notificationList.append('<div class="notificationList-first-title"><span style="margin-left:18px"><b>Notifications</b></span><span class="notifications-clean-all" title="Delete all notifications">Clear all</span></div>') for (let i = notifiList.length - 1; i >= 0; i--) { const notification = notifiList[i]; let html = `<div> <div class="card notificationlist-card" style="margin:0;"> <div class="card-body notificationlist-body"> <div class="notificationlist-header"> <div class="notificationlist-header-title"><a href="${notification.url}"><b>${notification.title}</b></a><span class="badge badge-notification-type" style="background-color:${notification.color}">${notification.type}</span></div> <span id="n-${i}" title="Delete" style="cursor:pointer"><i id="cleanIndividualNotif" class="bi bi-trash3"></i></span> </div> <span style="font-size:15px">${notification.text}</span> <div class="notificationlist-footer"> <p>${timeAgo(notification.datetime)}</p> </div> </div> </div> </div>`; notificationList.append(html); $(`#n-${i}`).on('click', function () { removeNotificationIndex(i) }) } notificationList.append('<div class="notificationlist-more-div"><a href="/stream" title="Show more streams" class="notificationlist-more"><div class="btn btn-outline-secondary">More News</div></a></div>') $('.notifications-clean-all').on('click', function () { //console.log("Clicked") notificationList.empty(); if (TENotificationsHistorical.length > 0) { document.cookie = "TENotifications=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/"; TENotificationsHistorical = [] } else if (TENotificationsNews.length > 0) { document.cookie = `TELastNews=[]; path=/`; TENotificationsNews = [] } upsertNotification(null, true, false) }); } } catch (e) { console.error(e) } } function fetchLastNews() { try { //console.log("• Fetch News") TENotificationsNews = [] const newsUrl = '/ws/stream.ashx?start=0&size=3' fetch(newsUrl) .then(response => { if (!response.ok) { console.error(`HTTP error! status: ${response.status}`); } return response.json(); }) .then(data => { for (let item of data) { if (item.description.length > 300) { item.description = item.description.substring(0, 300) + ' ...'; let lastPeriodIndex = Math.min(item.description.lastIndexOf('. '), 300); if (lastPeriodIndex !== -1) { item.description = item.description.substring(0, lastPeriodIndex + 1) + '..'; } else { item.description = item.description.substring(0, 300) + '...'; } } TENotificationsNews.unshift({ title: item.title, url: item.url, text: item.description, importance: item.importance, datetime: item.date, type: 'News', color: '#ddd' }) } document.cookie = `TELastNews=${JSON.stringify(TENotificationsNews)}; path=/`; // console.log("• Saved News on Cookies TELastNews") upsertNotification(null, true, false) }) .catch(error => { console.error('Error fetching last news:', error); }); } catch (e) { console.error(e) } } function getNotificationsFromCookie() { try { //console.log("• get Notifications From Cookie") const cookieData = document.cookie.split(';').find(item => item.trim().startsWith('TENotifications')); if (cookieData) { let encodedData = cookieData.split('TENotifications=')[1].split(',') //const decrompressedData = pako.inflate(encodedData, { to: 'string' }); try { TENotificationsHistorical = JSON.parse(encodedData); //console.log(TENotificationsHistorical) if (TENotificationsHistorical.length > 0) { upsertNotification(null, true, false) } } catch (error) { console.error("Error parsing existing cookie data:", error); } } } catch (e) { console.error(e) } } function estimateNotificationSize() { return JSON.stringify(TENotificationsHistorical).length; } function getCookieSize() { try { let safeLoop = 0 const cookies = document.cookie.split(';'); let total = 0 for (const cookie of cookies) { if (safeLoop == 50) { return 0; } const [key, value] = cookie.trim().split('='); if (key !== 'TENotifications') { total = total + JSON.stringify(cookie).length + 2 } safeLoop++ } return total; } catch (e) { console.error(e); } } function manageCookieSize(maxSize) { try { //console.log("• Check threshold of cookies size"); const currentCookieSize = getCookieSize(); const currentNotificationsSize = estimateNotificationSize(); let totalBytes = currentCookieSize + currentNotificationsSize; let nLoopCount = 0; //console.log("• Current Cookies Estimated Size: " + currentCookieSize); //console.log("• With Notifications Cookie Estimated Size: " + currentNotificationsSize); if (totalBytes > maxSize) { while (nLoopCount < 10 && totalBytes > maxSize) { //console.log("---------------------> nLoopCount: " + nLoopCount); TENotificationsHistorical.shift(); totalBytes = currentCookieSize + estimateNotificationSize(); //console.log(`• Notification removed to control cookie size. New size: ${totalBytes} bytes`); if (totalBytes <= maxSize) { //console.log(`• Cookie size is already within limit: ${totalBytes} bytes`); break; } nLoopCount++; } }// else { //console.log(`• Cookie size is within limit: ${totalBytes} bytes`); //} } catch (e) { console.error(e); } } function addNotificationCookie() { try { //console.log("• Add Notifications on Cookie"); const isEmptyNews = TENotificationsNews.length === 0; const isEmptyHistorical = TENotificationsHistorical.length === 0; document.cookie = `TELastNews=${isEmptyNews ? '[]' : JSON.stringify(TENotificationsNews)}; path=/`; manageCookieSize(3400); if (isEmptyHistorical) { document.cookie = `TENotifications=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`; } else { document.cookie = `TENotifications=${JSON.stringify(TENotificationsHistorical)}; expires=${createExpirationDate('1d')}; path=/`; } } catch (e) { console.error(e); } } function createDefaultNotification(n) { return { ...n, datetime: new Date(), type: n.importance > 0 ? 'Calendar' : 'News', color: n.importance > 0 ? '#ffb3ba' : '#ddd', }; } function upsertNotification(n, cookie, fromStream) { try { if (TELanguage != '') { return; } //console.log("-----------------------------------------------> Start of upsert Notification on list flow"); //console.log(`• Dealing with ${JSON.stringify(n)}`); if (!cookie) { const newNotification = createDefaultNotification(n); const existingNotification = TENotificationsHistorical.find(item => item.text === newNotification.text); if (existingNotification) { TENotificationsHistorical.splice(TENotificationsHistorical.indexOf(existingNotification), 1); } TENotificationsHistorical.push(newNotification); } const notificationListContainer = $('.offcanvas-top.notification-list.container'); const notificationList = $('.notification-list'); if (!notificationList.length) { notificationListContainer.append(`<div class="offcanvas-header"></div>`); } if (TENotificationsHistorical.length > 0 || TENotificationsNews.length > 0) { if (fromStream == true) { changeIconStatus(false); setNotificationCookieStatus(true); } if (!cookie) { addNotificationCookie(); } addContent(); } else { addEmptyContent(); } } catch (e) { console.error(e); } } $('.btn-notification-list').on('click', function (event) { //console.log('click') event.preventDefault() let cookieNewsIsPresent = false //console.log("• Check if there is LastNews Cookie") const cookieData = document.cookie.split(';').find(item => item.trim().startsWith('TELastNews')); if (cookieData) { let cookieNews = cookieData.split('TELastNews=')[1].split(',') cookieNewsIsPresent = true TENotificationsNews = JSON.parse(cookieNews) } //console.log(cookieNewsIsPresent) if (TENotificationsHistorical.length == 0 && TENotificationsNews.length == 0 && !cookieNewsIsPresent) { //console.log("IF") $('.offcanvas-top').removeClass("show") $('.offcanvas-top').removeClass("showing") fetchLastNews() } else { if (TENotificationsNews.length > 0 || TENotificationsHistorical.length > 0) { upsertNotification(null, true, false) } else { addEmptyContent() } } changeIconStatus(true) }); </script> <script async src="https://www.googletagmanager.com/gtag/js?id=G-SZ14JCTXWQ"></script> <script> window.dataLayer = window.dataLayer || []; function ga() { dataLayer.push(arguments); } ga('js', new Date()); ga('config', 'G-SZ14JCTXWQ', { 'allow_google_signals': false }); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10