1<!doctype html> 2<html lang="en-GB" class="no-js"> 3 4<head> 5 <meta charset="UTF-8"> 6 <title> 7 Login - Southbank Investment Research </title> 8 9 <!-- OneTrust Cookies Consent Notice start for www.southbankresearch.com --> 10
10<script type="text/javascript" src="https://cdn.cookielaw.org/consent/85c65451-9e9c-4ed2-8d91-d671c0b4d81c/OtAutoBlock.js" ></script>
10 11
11<script src="https://cdn.cookielaw.org/consent/85c65451-9e9c-4ed2-8d91-d671c0b4d81c/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="85c65451-9e9c-4ed2-8d91-d671c0b4d81c" ></script>
11 12
12<script type="text/javascript"> 13window.dataLayer = window.dataLayer || []; 14function gtag(){dataLayer.push(arguments);} 15 16gtag('consent', 'default', { 17 'ad_storage': 'denied', 18 'ad_user_data': 'denied', 19 'ad_personalization': 'denied', 20 'analytics_storage': 'denied', 21 'functionality_storage': 'denied', 22 'personalization_storage': 'denied', 23 'security_storage': 'granted', 24 'wait_for_update': 500 25}); 26 27function OptanonWrapper() { 28 function groupActive(groups, id) { 29 return groups.indexOf(',' + id + ',') > -1; 30 } 31 32 function updateGoogleConsent() { 33 var groups = typeof OnetrustActiveGroups === 'string' ? OnetrustActiveGroups : ''; 34 var acceptAll = groupActive(groups, 'C0004'); 35 36 gtag('consent', 'update', { 37 'analytics_storage': acceptAll || groupActive(groups, 'C0001') ? 'granted' : 'denied', 38 'functionality_storage': acceptAll || groupActive(groups, 'C0002') ? 'granted' : 'denied', 39 'ad_storage': acceptAll || groupActive(groups, 'C0003') ? 'granted' : 'denied', 40 'ad_user_data': acceptAll || groupActive(groups, 'C0003') ? 'granted' : 'denied', 41 'ad_personalization': acceptAll || groupActive(groups, 'C0003') ? 'granted' : 'denied', 42 'personalization_storage': acceptAll || groupActive(groups, 'C0003') ? 'granted' : 'denied' 43 }); 44 } 45 46 updateGoogleConsent(); 47 48 if (typeof OneTrust !== 'undefined') { 49 OneTrust.OnConsentChanged(updateGoogleConsent); 50 } 51} 52</script>
52 53 <!-- OneTrust Cookies Consent Notice end for www.southbankresearch.com --> 54 55 <!-- Google Tag Manager --> 56
56<script> 57 (function (w, d, s, l, i) { 58 w[l] = w[l] || []; 59 w[l].push({ 60 'gtm.start': new Date().getTime(), 61 event: 'gtm.js' 62 }); 63 var f = d.getElementsByTagName(s)[3], 64 j = d.createElement(s), 65 dl = l != 'dataLayer' ? '&l=' + l : ''; 66 j.async = true; 67 j.src = 68 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 69 f.parentNode.insertBefore(j, f); 70 })(window, document, 'script', 'dataLayer', 'GTM-KJ5QV3Z'); 71 72 </script>
72 73 <!-- End Google Tag Manager --> 74 75 <link href="//www.google-analytics.com" rel="dns-prefetch"> 76 <link href="https://www.southbankresearch.com/wp-content/themes/southbankresearch/img/icons/favicon.ico" rel="shortcut icon"> 77 <link href="https://www.southbankresearch.com/wp-content/themes/southbankresearch/img/icons/touch.png" rel="apple-touch-icon-precomposed"> 78 79 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 80 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 81 82 <!-- Display meta dscription for MWR if not a publication page - individual meta descriptions for publications are added to the parent page --> 83 <meta name="description" content=""> 84 85
85<script type="text/javascript"> 86 var ajaxurl = 'https://www.southbankresearch.com/wp-admin/admin-ajax.php'; 87 </script>
87 88<meta name='robots' content='noindex, nofollow' /> 89 90 <!-- This site is optimized with the Yoast SEO plugin v28.1 - https://yoast.com/product/yoast-seo-wordpress/ --> 91 <meta property="og:locale" content="en_GB" /> 92 <meta property="og:type" content="article" /> 93 <meta property="og:title" content="Login - Southbank Investment Research" /> 94 <meta property="og:url" content="https://www.southbankresearch.com/login/" /> 95 <meta property="og:site_name" content="Southbank Investment Research" /> 96 <meta property="og:image" content="https://www.southbankresearch.com/wp-content/uploads/sites/9/2018/06/southbank-research-facebook-OG.jpg" /> 97 <meta property="og:image:width" content="900" /> 98 <meta property="og:image:height" content="473" /> 99 <meta property="og:image:type" content="image/jpeg" /> 100 <meta name="twitter:card" content="summary_large_image" /> 101
101<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.southbankresearch.com\/login\/","url":"https:\/\/www.southbankresearch.com\/login\/","name":"Login - Southbank Investment Research","isPartOf":{"@id":"https:\/\/www.southbankresearch.com\/#website"},"datePublished":"2026-08-17T12:30:29+00:00","breadcrumb":{"@id":"https:\/\/www.southbankresearch.com\/login\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.southbankresearch.com\/login\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.southbankresearch.com\/login\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.southbankresearch.com\/"},{"@type":"ListItem","position":2,"name":"Login"}]},{"@type":"WebSite","@id":"https:\/\/www.southbankresearch.com\/#website","url":"https:\/\/www.southbankresearch.com\/","name":"Southbank Investment Research","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.southbankresearch.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"}]}</script>
101 102 <!-- / Yoast SEO plugin. --> 103 104 105<link rel='dns-prefetch' href='//www.southbankresearch.com' /> 106<link rel='dns-prefetch' href='//cdnjs.cloudflare.com' /> 107<link rel='dns-prefetch' href='//www.google.com' /> 108<link rel='dns-prefetch' href='//fonts.googleapis.com' /> 109<link rel='dns-prefetch' href='//use.fontawesome.com' /> 110<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://www.southbankresearch.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.southbankresearch.com%2Flogin%2F" /> 111<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://www.southbankresearch.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.southbankresearch.com%2Flogin%2F&format=xml" /> 112<style id="wp-emoji-styles-inline-css"> 113 114 img.wp-smiley, img.emoji { 115 display: inline !important; 116 border: none !important; 117 box-shadow: none !important; 118 height: 1em !important; 119 width: 1em !important; 120 margin: 0 0.07em !important; 121 vertical-align: -0.1em !important; 122 background: none !important; 123 padding: 0 !important; 124 } 125/*# sourceURL=wp-emoji-styles-inline-css */ 126</style> 127<style id="wp-block-library-inline-css"> 128/** 129 * Colors 130 */ 131/** 132 * Typography 133 */ 134/** 135 * SCSS Variables. 136 * 137 * Please use variables from this sheet to ensure consistency across the UI. 138 * Don't add to this sheet unless you're pretty sure the value will be reused in many places. 139 * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. 140 */ 141/** 142 * Fonts & basic variables. 143 */ 144/** 145 * Typography 146 */ 147/** 148 * Grid System. 149 * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ 150 */ 151/** 152 * Radius scale. 153 */ 154/** 155 * Elevation scale. 156 */ 157/** 158 * Dimensions. 159 */ 160/** 161 * Mobile specific styles 162 */ 163/** 164 * Editor styles. 165 */ 166/** 167 * Block & Editor UI. 168 */ 169/** 170 * Block paddings. 171 */ 172/** 173 * React Native specific. 174 * These variables do not appear to be used anywhere else. 175 */ 176/** 177 * Breakpoints & Media Queries 178 */ 179/** 180* Converts a hex value into the rgb equivalent. 181* 182* @param {string} hex - the hexadecimal value to convert 183* @return {string} comma separated rgb values 184*/ 185/** 186 * Long content fade mixin 187 * 188 * Creates a fading overlay to signify that the content is longer 189 * than the space allows. 190 */ 191/** 192 * Breakpoint mixins 193 */ 194/** 195 * Focus styles. 196 */ 197/** 198 * Standard focus rings for the WordPress Design System. 199 * 200 * Apply `outset-ring__focus` inside the relevant pseudo-class at the call site, 201 * e.g. `&:focus { @include outset-ring__focus(); }`. 202 */ 203/** 204 * Applies editor left position to the selector passed as argument 205 */ 206/** 207 * Styles that are reused verbatim in a few places 208 */ 209/** 210 * Allows users to opt-out of animations via OS-level preferences. 211 */ 212/** 213 * Reset default styles for JavaScript UI based pages. 214 * This is a WP-admin agnostic reset 215 */ 216/** 217 * Reset the WP Admin page styles for Gutenberg-like pages. 218 */ 219/** 220 * Creates a checkerboard pattern background to indicate transparency. 221 * @param {String} $size - The size of the squares in the checkerboard pattern. Default is 12px. 222 */ 223:root { 224 --wp-block-synced-color: #7a00df; 225 --wp-block-synced-color--rgb: 122, 0, 223; 226 --wp-bound-block-color: var(--wp-block-synced-color); 227 --wp-editor-canvas-background: #ddd; 228 --wp-admin-theme-color: #007cba; 229 --wp-admin-theme-color--rgb: 0, 124, 186; 230 --wp-admin-theme-color-darker-10: rgb(0, 107, 160.5); 231 --wp-admin-theme-color-darker-10--rgb: 0, 107, 160.5; 232 --wp-admin-theme-color-darker-20: #005a87; 233 --wp-admin-theme-color-darker-20--rgb: 0, 90, 135; 234 --wp-admin-border-width-focus: 2px; 235} 236@media (min-resolution: 192dpi) { 237 :root { 238 --wp-admin-border-width-focus: 1.5px; 239 } 240} 241 242/** 243 * Element styles. 244 */ 245.wp-element-button { 246 cursor: pointer; 247} 248 249:root .has-very-light-gray-background-color { 250 background-color: #eee; 251} 252:root .has-very-dark-gray-background-color { 253 background-color: #313131; 254} 255:root .has-very-light-gray-color { 256 color: #eee; 257} 258:root .has-very-dark-gray-color { 259 color: #313131; 260} 261:root { 262 /* stylelint-disable @stylistic/function-comma-space-after -- We can not use spacing because of WP multi site kses rule. */ 263} 264:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { 265 background: linear-gradient(135deg, rgb(0, 208, 132) 0%, rgb(6, 147, 227) 100%); 266} 267:root .has-purple-crush-gradient-background { 268 background: linear-gradient(135deg, rgb(52, 226, 228) 0%, rgb(71, 33, 251) 50%, rgb(171, 29, 254) 100%); 269} 270:root .has-hazy-dawn-gradient-background { 271 background: linear-gradient(135deg, rgb(250, 172, 168) 0%, rgb(218, 208, 236) 100%); 272} 273:root .has-subdued-olive-gradient-background { 274 background: linear-gradient(135deg, rgb(250, 250, 225) 0%, rgb(103, 166, 113) 100%); 275} 276:root .has-atomic-cream-gradient-background { 277 background: linear-gradient(135deg, rgb(253, 215, 154) 0%, rgb(0, 74, 89) 100%); 278} 279:root .has-nightshade-gradient-background { 280 background: linear-gradient(135deg, rgb(51, 9, 104) 0%, rgb(49, 205, 207) 100%); 281} 282:root .has-midnight-gradient-background { 283 background: linear-gradient(135deg, rgb(2, 3, 129) 0%, rgb(40, 116, 252) 100%); 284} 285:root { 286 /* stylelint-enable @stylistic/function-comma-space-after */ 287 --wp--preset--font-size--normal: 16px; 288 --wp--preset--font-size--huge: 42px; 289} 290 291.has-regular-font-size { 292 font-size: 1em; 293} 294 295.has-larger-font-size { 296 font-size: 2.625em; 297} 298 299.has-normal-font-size { 300 font-size: var(--wp--preset--font-size--normal); 301} 302 303.has-huge-font-size { 304 font-size: var(--wp--preset--font-size--huge); 305} 306 307:root .has-text-align-center { 308 text-align: center; 309} 310 311:root .has-text-align-left { 312 /*rtl:ignore*/ 313 text-align: left; 314} 315 316:root .has-text-align-right { 317 /*rtl:ignore*/ 318 text-align: right; 319} 320 321.has-fit-text { 322 white-space: nowrap !important; 323} 324 325#end-resizable-editor-section { 326 display: none; 327} 328 329.aligncenter { 330 clear: both; 331} 332 333.items-justified-left { 334 justify-content: flex-start; 335} 336 337.items-justified-center { 338 justify-content: center; 339} 340 341.items-justified-right { 342 justify-content: flex-end; 343} 344 345.items-justified-space-between { 346 justify-content: space-between; 347} 348 349.screen-reader-text { 350 border: 0; 351 clip-path: inset(50%); 352 height: 1px; 353 margin: -1px; 354 overflow: hidden; 355 padding: 0; 356 position: absolute; 357 width: 1px; 358 word-wrap: normal !important; 359 word-break: normal !important; 360} 361 362.screen-reader-text:focus { 363 background-color: #ddd; 364 clip-path: none; 365 color: #444; 366 display: block; 367 font-size: 1em; 368 height: auto; 369 left: 5px; 370 line-height: normal; 371 padding: 15px 23px 14px; 372 text-decoration: none; 373 top: 5px; 374 width: auto; 375 z-index: 100000; 376} 377 378/** 379 * The following provide a simple means of applying a default border style when 380 * a user first makes a selection in the border block support panel. 381 * This prevents issues such as where the user could set a border width 382 * and see no border due there being no border style set. 383 * 384 * This is intended to be removed once intelligent defaults can be set while 385 * making border selections via the block support. 386 * 387 * See: https://github.com/WordPress/gutenberg/pull/33743 388 */ 389html :where(.has-border-color) { 390 border-style: solid; 391} 392 393html :where([style^=border-color], 394[style*=";border-color"], 395[style*="; border-color"]) { 396 border-style: solid; 397} 398 399html :where([style^=border-top-color], 400[style*=";border-top-color"], 401[style*="; border-top-color"]) { 402 border-top-style: solid; 403} 404 405html :where([style^=border-right-color], 406[style*=";border-right-color"], 407[style*="; border-right-color"]) { 408 /*rtl:ignore*/ 409 border-right-style: solid; 410} 411 412html :where([style^=border-bottom-color], 413[style*=";border-bottom-color"], 414[style*="; border-bottom-color"]) { 415 border-bottom-style: solid; 416} 417 418html :where([style^=border-left-color], 419[style*=";border-left-color"], 420[style*="; border-left-color"]) { 421 /*rtl:ignore*/ 422 border-left-style: solid; 423} 424 425html :where([style^=border-width], 426[style*=";border-width"], 427[style*="; border-width"]) { 428 border-style: solid; 429} 430 431html :where([style^=border-top-width], 432[style*=";border-top-width"], 433[style*="; border-top-width"]) { 434 border-top-style: solid; 435} 436 437html :where([style^=border-right-width], 438[style*=";border-right-width"], 439[style*="; border-right-width"]) { 440 /*rtl:ignore*/ 441 border-right-style: solid; 442} 443 444html :where([style^=border-bottom-width], 445[style*=";border-bottom-width"], 446[style*="; border-bottom-width"]) { 447 border-bottom-style: solid; 448} 449 450html :where([style^=border-left-width], 451[style*=";border-left-width"], 452[style*="; border-left-width"]) { 453 /*rtl:ignore*/ 454 border-left-style: solid; 455} 456 457/** 458 * Provide baseline responsiveness for images. 459 */ 460html :where(img[class*=wp-image-]) { 461 height: auto; 462 max-width: 100%; 463} 464 465/** 466 * Reset user agent styles for figure element margins. 467 */ 468:where(figure) { 469 margin: 0 0 1em 0; 470} 471 472html :where(.is-position-sticky) { 473 --wp-admin--admin-bar--position-offset: var(--wp-admin--admin-bar--height, 0px); 474} 475 476@media screen and (max-width: 600px) { 477 html :where(.is-position-sticky) { 478 --wp-admin--admin-bar--position-offset: 0px; 479 } 480} 481 482/*# sourceURL=/wp-includes/css/dist/block-library/common.css */ 483</style> 484<style id="classic-theme-styles-inline-css"> 485/** 486 * These rules are needed for backwards compatibility. 487 * They should match the button element rules in the base theme.json file. 488 */ 489.wp-block-button__link { 490 color: #ffffff; 491 background-color: #32373c; 492 border-radius: 9999px; /* 100% causes an oval, but any explicit but really high value retains the pill shape. */ 493 494 /* This needs a low specificity so it won't override the rules from the button element if defined in theme.json. */ 495 box-shadow: none; 496 text-decoration: none; 497 498 /* The extra 2px are added to size solids the same as the outline versions.*/ 499 padding: calc(0.667em + 2px) calc(1.333em + 2px); 500 501 font-size: 1.125em; 502} 503 504.wp-block-file__button { 505 background: #32373c; 506 color: #ffffff; 507 text-decoration: none; 508} 509 510/*# sourceURL=/wp-includes/css/classic-themes.css */ 511</style> 512 513<style id="global-styles-inline-css"> 514:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,
5140) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
514.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 515/*# sourceURL=global-styles-inline-css */ 516</style> 517 518<link rel='stylesheet' id='moneyweekresearch-dfp-css' href='https://www.southbankresearch.com/wp-content/plugins/MoneyWeekResearch-DFP/public/css/moneyweekresearch-dfp-public.css' media='all' /> 519<link rel='stylesheet' id='bbp-default-css' href='https://www.southbankresearch.com/wp-content/plugins/bbpress/templates/default/css/bbpress.css' media='all' /> 520<link rel='stylesheet' id='bootstrap-columns-css' href='https://www.southbankresearch.com/wp-content/plugins/bootstrap-columns/public/css/bootstrap-columns-public.css' media='all' /> 521<link rel='stylesheet' id='sbr_videos_css-css' href='https://www.southbankresearch.com/wp-content/plugins/sbr-videos/css/style.css' media='all' /> 522<link rel='stylesheet' id='ppress-frontend-css' href='https://www.southbankresearch.com/wp-content/plugins/wp-user-avatar/assets/css/frontend.css' media='all' /> 523<link rel='stylesheet' id='ppress-flatpickr-css' href='https://www.southbankresearch.com/wp-content/plugins/wp-user-avatar/assets/flatpickr/flatpickr.min.css' media='all' /> 524<link rel='stylesheet' id='ppress-select2-css' href='https://www.southbankresearch.com/wp-content/plugins/wp-user-avatar/assets/select2/select2.min.css' media='all' /> 525<link rel='stylesheet' id='middleware-authentication/plugin.phpstyles_remodal-css' href='https://www.southbankresearch.com/wp-content/plugins/middleware-authentication/css/remodal.css' media='all' /> 526<link rel='stylesheet' id='mw_auth_frontend-css' href='https://www.southbankresearch.com/wp-content/plugins/middleware-authentication/css/frontend.css' media='all' /> 527<link rel='stylesheet' id='normalize-css' href='https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/css/normalize.css' media='all' /> 528<link rel='stylesheet' id='globalHeader-css' href='https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/css/global-header.css' media='all' /> 529<link rel='stylesheet' id='bootstrap-use-css' href='https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/css/bootstrap.min.css' media='all' /> 530<link rel='stylesheet' id='moneyweekresearch-css' href='https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/css/style.css' media='all' /> 531<link rel='stylesheet' id='print-css' href='https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/css/print.css' media='print' /> 532<link rel='stylesheet' id='googlefont-css' href='https://fonts.googleapis.com/css?family=Oxygen' media='all' /> 533<link rel='stylesheet' id='fontawesome-css' href='https://use.fontawesome.com/releases/v5.5.0/css/all.css' media='all' /> 534<link rel='stylesheet' id='jasny-mobile-menu-css' href='https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/css/jasny-bootstrap.min.css' media='all' />
535<script id="jquery-core-js" src="https://www.southbankresearch.com/wp-includes/js/jquery/jquery.js"></script>
vendor: 1 bytes, line 535
535
536<script id="jquery-migrate-js" src="https://www.southbankresearch.com/wp-includes/js/jquery/jquery-migrate.js"></script>
vendor: 1 bytes, line 536
536
537<script id="moneyweekresearch-dfp-js" src="https://www.southbankresearch.com/wp-content/plugins/MoneyWeekResearch-DFP/public/js/moneyweekresearch-dfp-public.js"></script>
vendor: 1 bytes, line 537
537
538<script id="moneyweekresearch-dfpbootstrap-trigger-js-extra"> 539var bt = {"exclude_segments":["fsr_fleet_street_letter"]}; 540//# sourceURL=moneyweekresearch-dfpbootstrap-trigger-js-extra 541</script>
vendor: 1 bytes, line 541
541
542<script id="moneyweekresearch-dfpbootstrap-trigger-js" src="https://www.southbankresearch.com/wp-content/plugins/MoneyWeekResearch-DFP/public/js/bootstrap-trigger.js"></script>
vendor: 1 bytes, line 542
542
543<script id="bootstrap-columns-js" src="https://www.southbankresearch.com/wp-content/plugins/bootstrap-columns/public/js/bootstrap-columns-public.js"></script>
vendor: 1 bytes, line 543
543
544<script id="sbr_videos_js-js-extra"> 545var videopopup = {"ajaxurl":"https://www.southbankresearch.com/wp-admin/admin-ajax.php","videoid":""}; 546//# sourceURL=sbr_videos_js-js-extra 547</script>
vendor: 1 bytes, line 547
547
548<script id="sbr_videos_js-js" src="https://www.southbankresearch.com/wp-content/plugins/sbr-videos/js/videopopup.js"></script>
vendor: 1 bytes, line 548
548
549<script id="ppress-flatpickr-js" src="https://www.southbankresearch.com/wp-content/plugins/wp-user-avatar/assets/flatpickr/flatpickr.min.js"></script>
vendor: 1 bytes, line 549
549
550<script id="ppress-select2-js" src="https://www.southbankresearch.com/wp-content/plugins/wp-user-avatar/assets/select2/select2.min.js"></script>
vendor: 1 bytes, line 550
550
551<script id="middleware-authentication/plugin.php_remodal-js" src="https://www.southbankresearch.com/wp-content/plugins/middleware-authentication/js/remodal.js"></script>
vendor: 1 bytes, line 551
551
552<script id="localized_frontend_data-js-extra"> 553var localized_frontend_data = {"mw_ajax_url":"https://www.southbankresearch.com/wp-admin/admin-ajax.php","txt_log_name_validation":"Please enter your email address","txt_twilio_number_invalid":"The phone number you have entered is invalid","txt_sms_consent_error":"Consent is required, please tick the checkbox","txt_log_pwd_validation":"Please enter your password","txt_reset_email_required":"Please enter your email address","txt_reset_email_valid":"Please enter a valid email address","txt_forgot_name_required":"Please enter your email address","txt_forgot_name_valid":"Please enter a valid email address","txt_pwd_change_name_validation":"Please enter your username","txt_pwd_change_newpass_validation":"Please enter your new password","txt_pwd_change_newpass_confirm":"Please confirm your new password","txt_pwd_change_newpass_confirm_equal":"The passwords do not match"}; 554//# sourceURL=localized_frontend_data-js-extra 555</script>
vendor: 1 bytes, line 555
555
556<script id="localized_frontend_data-js" src="https://www.southbankresearch.com/wp-content/plugins/middleware-authentication/js/frontend-localized.js"></script>
vendor: 1 bytes, line 556
556
557<script id="mw_auth_validate-js" src="https://www.southbankresearch.com/wp-content/plugins/middleware-authentication/js/jquery.validate.min.js"></script>
vendor: 1 bytes, line 557
557
558<script id="mw_phone_mask-js" src="https://www.southbankresearch.com/wp-content/plugins/middleware-authentication/js/jquery.inputmask.bundle.min.js"></script>
vendor: 1 bytes, line 558
558
559<script id="mw_auth_frontend-js" src="https://www.southbankresearch.com/wp-content/plugins/middleware-authentication/js/frontend.js"></script>
vendor: 1 bytes, line 559
559
560<script id="conditionizr-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/lib/conditionizr-4.3.0.min.js"></script>
vendor: 1 bytes, line 560
560
561<script id="modernizr-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/lib/modernizr-2.7.1.min.js"></script>
vendor: 1 bytes, line 561
561
562<script id="bootstrap-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/lib/bootstrap.min.js"></script>
vendor: 1 bytes, line 562
562
563<script id="respond-js" src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
vendor: 1 bytes, line 563
563
564<script type = "text/javascript">googletag.cmd.push(function() {googletag.pubads().setTargeting("sitecode","");});</script>
564<link 565 rel="stylesheet" 566 href="https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.8/css/intlTelInput.css" 567/>
568<script src="https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.8/js/intlTelInput.min.js"></script>
568 569<style> 570 #tfs-mw-sms-phone { 571 padding: 10px 10px 10px 50px; 572 } 573 #tfs-mw-sms-phone, .btn { 574 padding-top: 6px; 575 padding-bottom: 6px; 576 border: 1px solid #ccc; 577 border-radius: 4px; 578 } 579 580 .btn { 581 color: #ffffff; 582 background-color: #428BCA; 583 border-color: #357EBD; 584 font-size: 14px; 585 outline: none; 586 cursor: pointer; 587 padding-left: 12px; 588 padding-right: 12px; 589 } 590 591 .btn:focus, .btn:hover { 592 background-color: #3276B1; 593 border-color: #285E8E; 594 } 595 596 .btn:active { 597 box-shadow: inset 0 3px 5px rgba(0,0,0,.125); 598 } 599 600 .alert { 601 padding: 15px; 602 margin-top: 10px; 603 border: 1px solid transparent; 604 border-radius: 4px; 605 } 606 607 .alert-info { 608 border-color: #bce8f1; 609 color: #31708f; 610 background-color: #d9edf7; 611 } 612 613 .alert-error { 614 color: #a94442; 615 background-color: #f2dede; 616 border-color: #ebccd1; 617 } 618 619</style> 620
620<script type="text/javascript"> 621 (function(l,e,a,p) { 622 window.UserLeap = function(){U._queue.push(arguments)} 623 var U = window.UserLeap;U.appId = a;U._queue = []; 624 a=l.createElement('script'); 625 a.async=1;a.src=e+'?id='+U.appId; 626 p=l.getElementsByTagName('script')[3]; 627 p.parentNode.insertBefore(a, p); 628 })(document, 'https://cdn.userleap.com/shim.js', '2ZtlQcSrgA'); 629 </script>
629 630 <link rel="icon" href="https://www.southbankresearch.com/wp-content/uploads/sites/9/2019/12/cropped-favicon-32x32.png" sizes="32x32" /> 631<link rel="icon" href="https://www.southbankresearch.com/wp-content/uploads/sites/9/2019/12/cropped-favicon-192x192.png" sizes="192x192" /> 632<link rel="apple-touch-icon" href="https://www.southbankresearch.com/wp-content/uploads/sites/9/2019/12/cropped-favicon-180x180.png" /> 633<meta name="msapplication-TileImage" content="https://www.southbankresearch.com/wp-content/uploads/sites/9/2019/12/cropped-favicon-270x270.png" />
634<script type = "text/javascript">googletag.cmd.push(function() {googletag.enableServices();});</script>
634 635
635<script> 636 // conditionizr.com 637 // configure environment tests 638 conditionizr.config({ 639 assets: 'https://www.southbankresearch.com/wp-content/themes/southbankresearch', 640 tests: {} 641 }); 642 643 </script>
643 644 645 646<link rel='stylesheet' id='bootstrap-toggle-css' href='https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/css/bootstrap-toggle.min.css' media='all' /> 647<style id="core-block-supports-inline-css"> 648/** 649 * Core styles: block-supports 650 */ 651 652/*# sourceURL=core-block-supports-inline-css */ 653</style> 654<link rel='stylesheet' id='lytics-css-css' href='https://www.southbankresearch.com/wp-content/plugins/lytics/css/style.min.css' media='all' /> 655 656</head> 657 658<body class="wp-singular page-template page-template-page-login page-template-page-login-php page page-id-427394 page-parent wp-theme-southbankresearch login logged-out"> 659<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 659-660
659 660<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
660GTM-KJ5QV3Z
vendor: 83 bytes, lines 660-661
660" 661height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
662<!-- End Google Tag Manager (noscript) --> 663 664 <section id="footerFix"> 665 666 <!-- header --> 667 <header class="header clear" role="banner"> 668 <nav class="navbar navbar-default navbar-fixed-top"> 669 670 <!--Global Header--> 671 672 <section class="global_header"> 673 <span></span> 674 <div id="ul_strip"></div> 675 <div class="container"> 676 <ul> 677 <li><a href="https://investorsdaily.co.uk/" target="_blank">Investor's Daily</a> 678 </ul> 679 <p><i class="fa fa-phone-square" aria-hidden="true"></i> 0203 966 4580</p> </div> 680 </section> 681 682 <!--end Global Header--> 683 684 <div class="container"> 685 686 <div class="navbar-header"> 687 688 <div id="mobileMenu"> 689 <ul id="menu-mobile-logged-out" class="menu"><li id="menu-item-434070" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-434070"><a href="https://www.southbankresearch.com/about-us/">About Us</a></li> 690<li id="menu-item-434072" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-434072"><a href="https://www.southbankresearch.com/editors/">Editors</a></li> 691<li id="menu-item-476109" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-476109"><a href="https://www.southbankresearch.com/testimonials/">Testimonials</a></li> 692<li id="menu-item-543731" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-543731"><a href="/help-guide/">Contact</a></li> 693<li class="menu-item login-button" id="login-button-mobile"><a href="/login" title="login">Login</li></a></ul> </div> 694 695 <span id="navToggle"></span> 696 697 698 <a href="/" class="siteLogo"></a> 699 700 <!-- Display h1 tag if not a publication page - individual h1 tags are added to the publication pages for SEO --> 701 <h1>Welcome to Southbank Investment Research</h1> 702 </div> 703 704 705 706 <div id="desktop-navbar" class=""> 707 708 <ul id="menu-primary" class="nav navbar-nav desktop-nav "><li id="menu-item-430363" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-430363"><a title="About us" href="https://www.southbankresearch.com/about-us/">About us</a></li> 709<li id="menu-item-427629" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-427629"><a title="Editors" href="https://www.southbankresearch.com/editors/">Editors</a></li> 710<li id="menu-item-476110" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-476110"><a title="Testimonials" href="https://www.southbankresearch.com/testimonials/">Testimonials</a></li> 711<li id="menu-item-431884" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-431884"><a title="Contact" href="https://www.southbankresearch.com/help-guide/">Contact</a></li> 712<li class="menu-item login-button" id="login-button-desktop"><a href="/login" title="login">Login</li></a></ul> 713 714 </div> 715 716 <!--/.navbar-collapse --> 717 </div> 718 719 </nav> 720 721 </header> 722 <!-- /header --> 723 724 <!-- Add a notice to the header if CF snippet is set --> 725 <div class="container"> 726 <div class="row"> 727 <div class="col-md-12"> 728 <div class="login-container tfs-mw-wrapper-block"> 729 <div id="tfs-mw-wrapper-block-title"> 730 <h2>Login</h2> 731 </div> 732
732<script> 733 window.sbrLoginExperimentConfig = {"trackView":true,"loginVariant":"secure"}; 734 window.dataLayer = window.dataLayer || []; 735 window.dataLayer.push({"event":"login_experiment_view","login_variant":"secure","login_method_shown":"secure_link"}); 736 </script>
736 737 <p>Access your subscriber account and publications below.</p> 738 <div id="secure-login-form" class="secure-login-form"> 739 <!-- 740 It is highly recommended that you *copy* this file to your theme folder. 741 Styles should be moved to your main stylesheet. 742 Leave this template in the /theme/ folder of the plugin for future reference 743 744 #Version: 2.0 745--> 746 747<div> 748 <div class=""> 749 <div class="tfs-mw-wrapper-block-messages"> 750 <p class="tfs-mw-wrapper-block-subtitle">Enter your email address below and secure link will be sent to you.</p> 751 </div> 752 </div> 753 <form name="secure_link_form" id="secure-link-form" action="?secure=link" method="post"> 754 <input type="hidden" name="mode" value="p"> 755 756 <div class="tfs-mw-wrapper-block-messages"> 757 </div> 758 <div class="user-email"> 759 <label for="user_email">Email</label> 760 761 <input type="email" 762 name="user_email" 763 id="user_email" 764 class="mw-user-email-input input " 765 value="" 766 size="20" 767 placeholder="Enter your email" 768 required="required"/> 769 </div> 770 <div class="tfs-mw-wrapper-block-magic-link"> 771 <a href="#" class="mw-secure-link-button mw-forgot-password-button tfs-mw-wrapper-block-magic-link-button"> 772 Send Secure Login Link </a> 773 </div> 774 <p style="font-size: 16px; color: #666; margin: 10px 0px 0px 0px;text-align: center;">(*check spam folder as well)</p> 775 <input type="hidden" id="mw_passwordless_nonce" name="mw_passwordless_nonce" value="efd7a7daa8" /><input type="hidden" name="_wp_http_referer" value="/login" /> </form> 776 777</div> 778 </div> 779 <div class="tfs-mw-wrapper-block-divider">or</div> 780 <p class="text-center password-login-toggle-wrap"> 781 <a href="#" class="password-login-toggle" id="secure-login-toggle" aria-expanded="false" aria-controls="password-login-form">Login with email and password</a> 782 </p> 783 <div id="password-login-form" class="password-login-form" hidden> 784 <form method="post" action="https://www.southbankresearch.com/wp-login.php" class="wp-user-form" novalidate="novalidate"> 785 <div class="username login-input-height-large"> 786 <label for="user_login">Email</label> 787 <input type="text" class="form-control" name="log" value="" size="20" id="user_login" tabindex="11" placeholder="Enter your email" required="required" aria-required="true" /> 788</div> 789<div class="password login-input-height-large"> 790 <label for="user_pass">Password</label> 791 <div class="mw-password-field-masking-container"> 792 <input type="password" class="form-control" name="pwd" value="" size="20" id="user_pass" tabindex="12" placeholder="Enter your password" required="required" aria-required="true" /> 793 <span class="mw-password-field-masking mw-password-unmask" data-masking-input-id="user_pass"></span> 794 </div> 795</div> 796<div class="lost-password"><a href="/lost-password">Forgot your password?</a></div> 797<div class="login_fields"> 798 <input type="hidden" name="redirect_to" value="/login" /> <input type="hidden" name="user-cookie" value="1" /> 799</div> <div class="tfs-mw-wrapper-block-magic-link"> 800 <input type="submit" class="tfs-mw-wrapper-block-magic-link-button user-submit" name="user-submit" value="Log In to My Account" tabindex="14"/> 801 </div> 802 </form> 803 </div> 804
804<script> 805 (function () { 806 var toggle = document.getElementById('secure-login-toggle'); 807 var passwordForm = document.getElementById('password-login-form'); 808 var secureForm = document.getElementById('secure-login-form'); 809 var defaultVariant = 'secure'; 810 var secureLinkFirst = true; 811 var focusPasswordForm = false; 812 var loginSubmitting = false; 813 814 var isLoginFormValid = function (form) { 815 if (typeof jQuery === 'undefined' || !form) { 816 return true; 817 } 818 819 var $form = jQuery(form); 820 if (!$form.length || !$form.hasClass('wp-user-form')) { 821 return true; 822 } 823 824 var validator = $form.data('validator'); 825 if (!validator) { 826 return true; 827 } 828 829 return $form.valid(); 830 }; 831 832 var lockLoginSubmission = function () { 833 if (loginSubmitting) { 834 return false; 835 } 836 837 loginSubmitting = true; 838 839 document.querySelectorAll('.password-login-form .user-submit').forEach(function (button) { 840 button.disabled = true; 841 }); 842 843 document.querySelectorAll('#secure-link-form .mw-secure-link-button, #secure-link-form .mw-forgot-password-button').forEach(function (button) { 844 button.setAttribute('aria-disabled', 'true'); 845 button.classList.add('is-submitting'); 846 button.style.pointerEvents = 'none'; 847 }); 848 849 if (toggle) { 850 toggle.setAttribute('aria-disabled', 'true'); 851 toggle.classList.add('is-submitting'); 852 toggle.style.pointerEvents = 'none'; 853 } 854 855 return true; 856 }; 857 858 var handleSecureLinkButtonClick = function (e) { 859 if (loginSubmitting) { 860 e.preventDefault(); 861 e.stopImmediatePropagation(); 862 return; 863 } 864 865 if (typeof jQuery === 'undefined' || !secureLinkForm) { 866 return; 867 } 868 869 var $form = jQuery(secureLinkForm); 870 if (!$form.length || !$form.valid()) { 871 return; 872 } 873 874 lockLoginSubmission(); 875 }; 876 877 var handleLoginFormSubmit = function (e) { 878 if (loginSubmitting) { 879 e.preventDefault(); 880 e.stopImmediatePropagation(); 881 return; 882 } 883 884 if (!isLoginFormValid(e.target)) { 885 return; 886 } 887 888 lockLoginSubmission(); 889 }; 890 891 document.querySelectorAll('.password-login-form .wp-user-form').forEach(function (form) { 892 form.addEventListener('submit', handleLoginFormSubmit, true); 893 }); 894 895 var secureLinkForm = document.getElementById('secure-link-form'); 896 if (secureLinkForm) { 897 secureLinkForm.addEventListener('submit', handleLoginFormSubmit, true); 898 899 secureLinkForm.querySelectorAll('.mw-secure-link-button, .mw-forgot-password-button').forEach(function (button) { 900 button.addEventListener('click', handleSecureLinkButtonClick, true); 901 }); 902 } 903 904 var isValidEmail = function (value) { 905 return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value); 906 }; 907 908 var getSecureLinkEmailMessages = function () { 909 var defaults = { 910 required: 'Please enter your email address', 911 email: 'Please enter a valid email address' 912 }; 913 914 if (typeof localized_frontend_data === 'undefined') { 915 return defaults; 916 } 917 918 return { 919 required: localized_frontend_data.txt_reset_email_required || defaults.required, 920 email: localized_frontend_data.txt_reset_email_valid || defaults.email 921 }; 922 }; 923 924 var showPasswordEmailValidationError = function (message) { 925 var passwordEmailField = document.getElementById('user_login'); 926 927 if (!passwordEmailField) { 928 return; 929 } 930 931 if (typeof jQuery !== 'undefined') { 932 var $passwordForm = jQuery(passwordEmailField).closest('.wp-user-form');
933 var validator = $passwordForm.data('validator'); 934 935 if (validator) { 936 validator.showErrors({ log: message }); 937 passwordEmailField.focus(); 938 return; 939 } 940 } 941 942 var usernameContainer = passwordEmailField.closest('.username'); 943 944 if (!usernameContainer) { 945 passwordEmailField.focus(); 946 return; 947 } 948 949 passwordEmailField.classList.add('error'); 950 passwordEmailField.setAttribute('aria-invalid', 'true'); 951 952 var errorId = 'log-error'; 953 var errorLabel = document.getElementById(errorId); 954 955 if (!errorLabel) { 956 errorLabel = document.createElement('label'); 957 errorLabel.id = errorId; 958 errorLabel.className = 'error'; 959 errorLabel.setAttribute('for', 'user_login'); 960 passwordEmailField.insertAdjacentElement('afterend', errorLabel); 961 } 962 963 errorLabel.textContent = message; 964 passwordEmailField.focus(); 965 }; 966 967 var submitSecureLinkWithPasswordEmail = function () { 968 if (loginSubmitting) { 969 return; 970 } 971 972 var passwordEmailField = document.getElementById('user_login'); 973 var secureEmailField = document.getElementById('user_email'); 974 var secureLinkForm = document.getElementById('secure-link-form'); 975 976 if (!passwordEmailField || !secureEmailField || !secureLinkForm) { 977 return; 978 } 979 980 var email = passwordEmailField.value.trim(); 981 var emailMessages = getSecureLinkEmailMessages(); 982 983 if (!email) { 984 showPasswordEmailValidationError(emailMessages.required); 985 return; 986 } 987 988 if (!isValidEmail(email)) { 989 showPasswordEmailValidationError(emailMessages.email); 990 return; 991 } 992 993 secureEmailField.value = email; 994 995 if (!lockLoginSubmission()) { 996 return; 997 } 998 999 secureLinkForm.submit(); 1000 }; 1001 1002 toggle.addEventListener('click', function (e) { 1003 e.preventDefault(); 1004 1005 if (loginSubmitting) { 1006 return; 1007 } 1008 1009 // Secure-first layouts (setting or A/B) reveal the password form. 1010 // Password-first A/B submits a secure link using the email already entered. 1011 if (defaultVariant === 'secure' || secureLinkFirst) { 1012 passwordForm.hidden = !passwordForm.hidden; 1013 toggle.setAttribute('aria-expanded', passwordForm.hidden ? 'false' : 'true'); 1014 if (!passwordForm.hidden) { 1015 var passwordEmailField = document.getElementById('user_login'); 1016 if (passwordEmailField) { 1017 passwordEmailField.focus(); 1018 } 1019 } 1020 } else { 1021 submitSecureLinkWithPasswordEmail(); 1022 } 1023 }); 1024 1025 var focusVisibleEmailField = function () { 1026 var emailField = !passwordForm.hidden 1027 ? document.getElementById('user_login') 1028 : document.getElementById('user_email'); 1029 1030 if (emailField) { 1031 emailField.focus(); 1032 } 1033 }; 1034 1035 if (focusPasswordForm) { 1036 passwordForm.hidden = false;
1037 passwordForm.scrollIntoView({ behavior: 'smooth', block: 'start' }); 1038 1039 var passwordEmailField = document.getElementById('user_login'); 1040 if (passwordEmailField) { 1041 passwordEmailField.focus(); 1042 } 1043 } else { 1044 focusVisibleEmailField(); 1045 } 1046 })(); 1047 </script>
1047 1048 </div> 1049 </div> 1050 </div> 1051 </div> 1052</section><!--end .footerFix--> 1053<section id="footerWrap"> 1054 <div class="container"> 1055 <span id="showFooter">Show Sitemap</span> 1056 </div> 1057 1058 <section id="footer_content"> 1059 1060 <div class="container"> 1061 1062 <div class="col-md-4"> 1063 1064 <strong>PUBLICATIONS</strong> 1065 <div class="publicationList"> 1066 <ul> 1067 <li><a href="https://www.southbankresearch.com/secure/altuchers-early-stage-crypto-investor/">Altucher's Early-Stage Crypto Investor</a></li><li><a href="https://www.southbankresearch.com/secure/altuchers-inner-circle/">Altucher's Inner Circle</a></li><li><a href="https://www.southbankresearch.com/secure/altucher-pro-uk/">Altucher's Investment Network Pro UK</a></li><li><a href="https://www.southbankresearch.com/secure/altuchers-investment-network-uk/">Altucher's Investment Network UK</a></li><li><a href="https://www.southbankresearch.com/secure/altuchers-true-alpha-uk/">Altucher's True Alpha UK</a></li><li><a href="https://www.southbankresearch.com/secure/the-situation-report-uk/">Jim Rickards Situation Report UK</a></li><li><a href="https://www.southbankresearch.com/secure/strategic-intelligence-pro-uk/">Jim Rickards Strategic Intelligence Pro UK</a></li><li><a href="https://www.southbankresearch.com/secure/strategic-intelligence-uk/">Jim Rickards Strategic Intelligence UK</a></li><li><a href="https://www.southbankresearch.com/secure/unrestricted-clearance/">Unrestricted Clearance</a></li><li><a href="https://www.southbankresearch.com/secure/microcap-millionaire-uk/">Microcap Millionaire UK</a></li><li><a href="https://www.southbankresearch.com/secure/crypto-profits-extreme/">Hyperion</a></li><li><a href="https://www.southbankresearch.com/secure/exponential-energy-fortunes-private-reserve/">Real Wealth Insider UK</a></li><li><a href="https://www.southbankresearch.com/southbank-sunday-brunch/">Southbank Sunday Brunch</a></li><li><a href="https://www.southbankresearch.com/secure/the-fleet-street-letter/">The Fleet Street Letter</a></li> </ul> 1068 </div> 1069 1070 </div> 1071 1072 <div class="col-md-2"> 1073 1074 <strong>USEFUL LINKS</strong> 1075 1076 <ul class="usefulLinks"> 1077 <li id="menu-item-433801" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-433801"><a href="https://www.southbankresearch.com/editors/">Meet the Editors</a></li> 1078<li id="menu-item-433798" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-433798"><a href="https://www.southbankresearch.com/about-us/">About Us</a></li> 1079<li id="menu-item-433799" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-433799"><a href="https://www.southbankresearch.com/contactus/">Contact</a></li> 1080 </ul> 1081 1082 1083 1084 </div> 1085 1086 <div class="col-md-6"> 1087 1088 <strong>SOUTHBANK INVESTMENT RESEARCH</strong> 1089 1090 <p>You donât need more information to be a better, more profitable investor. You need better research. Here youâll find investment ideas and strategies from some of Britainâs most experienced investors produced specifically for investors like you. Learn more about independent stock market research and advice from one of the UKâs oldest financial publishers.</p> 1091 1092 </div> 1093 1094 </div> 1095 1096 1097 1098 </section> 1099 1100 <!-- include footer --> 1101 <!-- footer --> 1102<footer class="footer" role="contentinfo"> 1103 <div class = "container"> 1104 <div class = "row"> 1105 <div class = "col-md-12"> 1106 <div class = "footer-padding"> 1107 <!-- Display the general footer --> 1108 <p>Registered in England Company No 9539630. VAT No GB629 7287 94. Registered Office: Basement, 95 Southwark Street, London SE1 0HX.</p> 1109 1110<p>Southbank Investment Research Limited is authorised and regulated by the Financial Conduct Authority. FCA No 706697 <a href="https://register.fca.org.uk/" alt="Link to Financial Conduct Authority">https://register.fca.org.uk/</a></p><p>© 2026 Southbank Investment Research Ltd.</p> 1111 </div> 1112 </div> 1113 </div> 1114 <div class="row"> 1115 <ul id="footNav"> 1116 <!-- Display the footer links --> 1117 <li><a href="/terms-and-conditions/">Terms and Conditions</a></li> 1118<li><a href="/privacy-policy/">Privacy Policy</a></li> 1119<li><a href="/cookie-policy/">Cookie Policy</a></li> 1120<li><a href="/complaints/">Complaints Procedure</a></li> </ul> 1121 </div> 1122 </div> 1123</footer> 1124<!-- /footer --> 1125
1125<script type="speculationrules"> 1126{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/sites/9/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/southbankresearch/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 1127</script>
1127 1128 <section id="SID_post_preview_ol"> 1129 1130 <section id="SID_post_preview_wrap"> 1131 1132 <div id="postFunctionsWrap"> 1133 1134 <ul id="postFunctions"> 1135 1136 <li> 1137 <a href="#" id="savePost" class="saveforlater"><span>Save</span><i class="fa fa-download" aria-hidden="true"></i></a> 1138 </li> 1139 1140 <li> 1141 <a href="#" id="printPost" onclick="PrintElem('#SID_post_preview')"> 1142 <span>Print</span> 1143 <i class="fa fa-print" aria-hidden="true"></i> 1144 </a> 1145 </li> 1146 1147 <div style="clear:both;"></div> 1148 1149
1149<script> 1150 function PrintElem(elem) 1151 { 1152 var content = $(elem).html(); 1153 content = content.replace(/loading="lazy"/g, ''); 1154 1155 Popup(content); 1156 } 1157 1158 var logo_url = ''; 1159 function Popup(data) 1160 { 1161 var post_id; 1162 // Add logo to single issue print pages 1163 if ( $('.singleIssue').attr('data-id') !== undefined) { 1164 if ( $('.singleIssue').data('id') !== '' ) { 1165 post_id = $('.singleIssue').attr('data-id'); 1166 } 1167 } 1168 1169 if ( post_id && navigator.userAgent.indexOf("Chrome") != -1 ) { 1170 $.ajax({ 1171 type: 'POST', 1172 url: ajaxurl, 1173 data: { 1174 'post_id': post_id, 1175 'content': data, 1176 'action': 'get_publication_image_ajax' 1177 }, success: function (result) { 1178 1179 if ( result.length >= 1 ) { 1180 data = result + data; 1181 } 1182 open_popup(data); 1183 }, 1184 error: function () { 1185 open_popup(data); 1186 } 1187 }); 1188 } else { 1189 open_popup(data); 1190 } 1191 } 1192 1193 function open_popup(data) { 1194 1195 var mywindow = window.open('','','left=0,top=0,width=950,height=600,toolbar=0,scrollbars=0,status=0,addressbar=0'); 1196 var cssLinkTag = '<link rel="stylesheet" id="print-css" href="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/css/print.css?ver=3.11.22" media="print">';
1197 mywindow.document.write('<html><head><title>Southbank Research</title>'); 1198 mywindow.document.write('<meta charset="utf-8" />'); 1199 mywindow.document.write(cssLinkTag); 1200 mywindow.document.write('</head><body >'); 1201 mywindow.document.write(data); 1202 mywindow.document.write('</body></html>'); 1203 mywindow.document.close(); // necessary for IE >= 10 1204 1205 var mediaQueryList = mywindow.matchMedia('print'); 1206 mediaQueryList.addEventListener('change', function(mql) { 1207 if (!mql.matches) { 1208 mywindow.close() 1209 } 1210 }); 1211 1212 mywindow.onload = function() { // wait until all resources loaded 1213 mywindow.focus(); // necessary for IE >= 10 1214 mywindow.print(); // change window to mywindow 1215 }; 1216 1217 return true; 1218 } 1219 </script>
1219 1220 1221 </ul> 1222 1223 </div> 1224 1225 <section id="SID_post_preview"> 1226 1227 <section> 1228 1229 <span id="close_post_preview"><i class="fa fa-times" aria-hidden="true"></i></span> 1230 1231 <span id="loader"><i class="fa fa-spinner fa-pulse"></i></span> 1232 1233 <article id="SID_post_content"></article> 1234 1235 </section> 1236 1237 </section> 1238 1239 </section> 1240 1241 <section id="previewFooter"> 1242 1243 <!-- footer --> 1244<footer class="footer" role="contentinfo"> 1245 <div class = "container"> 1246 <div class = "row"> 1247 <div class = "col-md-12"> 1248 <div class = "footer-padding"> 1249 <!-- Display the general footer --> 1250 <p>Registered in England Company No 9539630. VAT No GB629 7287 94. Registered Office: Basement, 95 Southwark Street, London SE1 0HX.</p> 1251 1252<p>Southbank Investment Research Limited is authorised and regulated by the Financial Conduct Authority. FCA No 706697 <a href="https://register.fca.org.uk/" alt="Link to Financial Conduct Authority">https://register.fca.org.uk/</a></p><p>© 2026 Southbank Investment Research Ltd.</p> 1253 </div> 1254 </div> 1255 </div> 1256 <div class="row"> 1257 <ul id="footNav"> 1258 <!-- Display the footer links --> 1259 <li><a href="/terms-and-conditions/">Terms and Conditions</a></li> 1260<li><a href="/privacy-policy/">Privacy Policy</a></li> 1261<li><a href="/cookie-policy/">Cookie Policy</a></li> 1262<li><a href="/complaints/">Complaints Procedure</a></li> </ul> 1263 </div> 1264 </div> 1265</footer> 1266<!-- /footer --> 1267 <div style="clear:both;"></div> 1268 1269 </section> 1270 1271 </section> 1272
1272<script id="carl-js" src="https://www.southbankresearch.com/wp-content/plugins/MoneyWeekResearch-DFP/public/js/carl.js"></script>
vendor: 1 bytes, line 1272
1272
1273<script id="carl-email-subscribe-js-extra"> 1274var ajax_object = {"ajaxurl":"https://www.southbankresearch.com/wp-admin/admin-ajax.php","listcode":"","external_subscriptions":"wp7b4dd57ed557072258bb3d10022d7205"}; 1275//# sourceURL=carl-email-subscribe-js-extra 1276</script>
vendor: 1 bytes, line 1276
1276
1277<script id="carl-email-subscribe-js" src="https://www.southbankresearch.com/wp-content/plugins/MoneyWeekResearch-DFP/public/js/emailsubscribe.js"></script>
vendor: 1 bytes, line 1277
1277
1278<script id="ppress-frontend-script-js-extra"> 1279var pp_ajax_form = {"ajaxurl":"https://www.southbankresearch.com/wp-admin/admin-ajax.php","confirm_delete":"Are you sure?","deleting_text":"Deleting...","deleting_error":"An error occurred. Please try again.","nonce":"bf346e24f5","disable_ajax_form":"false","is_checkout":"0","is_checkout_tax_enabled":"0","is_checkout_autoscroll_enabled":"true"}; 1280//# sourceURL=ppress-frontend-script-js-extra 1281</script>
vendor: 1 bytes, line 1281
1281
1282<script id="ppress-frontend-script-js" src="https://www.southbankresearch.com/wp-content/plugins/wp-user-avatar/assets/js/frontend.min.js"></script>
vendor: 1 bytes, line 1282
1282
1283<script id="rocket-browser-checker-js-after"> 1284class RocketBrowserCompatibilityChecker { 1285 1286 constructor( options ) { 1287 this.passiveSupported = false; 1288 1289 this._checkPassiveOption( this ); 1290 this.options = this.passiveSupported ? options : false; 1291 } 1292 1293 /** 1294 * Initializes browser check for addEventListener passive option. 1295 * 1296 * @link https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support 1297 * @private 1298 * 1299 * @param self Instance of this object. 1300 * @returns {boolean} 1301 */ 1302 _checkPassiveOption( self ) { 1303 try { 1304 const options = { 1305 // This function will be called when the browser attempts to access the passive property. 1306 get passive() { 1307 self.passiveSupported = true; 1308 return false; 1309 } 1310 }; 1311 1312 window.addEventListener( 'test', null, options ); 1313 window.removeEventListener( 'test', null, options ); 1314 } catch ( err ) { 1315 self.passiveSupported = false; 1316 } 1317 } 1318 1319 /** 1320 * Checks if the browser supports requestIdleCallback and cancelIdleCallback. If no, shims its behavior with a polyfills. 1321 * 1322 * @link @link https://developers.google.com/web/updates/2015/08/using-requestidlecallback 1323 */ 1324 initRequestIdleCallback() { 1325 if ( ! 'requestIdleCallback' in window ) { 1326 window.requestIdleCallback = ( cb ) => { 1327 const start = Date.now(); 1328 return setTimeout( () => { 1329 cb( { 1330 didTimeout: false, 1331 timeRemaining: function timeRemaining() { 1332 return Math.max( 0, 50 - ( Date.now() - start ) ); 1333 } 1334 } ); 1335 }, 1 ); 1336 }; 1337 } 1338 1339 if ( ! 'cancelIdleCallback' in window ) { 1340 window.cancelIdleCallback = ( id ) => clearTimeout( id ); 1341 } 1342 } 1343 1344 /** 1345 * Detects if data saver mode is on. 1346 * 1347 * @link https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/save-data/#detecting_the_save-data_setting 1348 * 1349 * @returns {boolean|boolean} 1350 */ 1351 isDataSaverModeOn() { 1352 return ( 1353 'connection' in navigator 1354 && 1355 true === navigator.connection.saveData 1356 ); 1357 } 1358 1359 /** 1360 * Checks if the browser supports link prefetch. 1361 * 1362 * @returns {boolean|boolean} 1363 */ 1364 supportsLinkPrefetch() { 1365 const elem = document.createElement( 'link' ); 1366 return ( 1367 elem.relList 1368 && 1369 elem.relList.supports 1370 && 1371 elem.relList.supports( 'prefetch' ) 1372 && 1373 window.IntersectionObserver 1374 && 1375 'isIntersecting' in IntersectionObserverEntry.prototype 1376 ); 1377 } 1378 1379 isSlowConnection() { 1380 return ( 1381 'connection' in navigator 1382 && 1383 'effectiveType' in navigator.connection 1384 && 1385 ( 1386 '2g' === navigator.connection.effectiveType 1387 || 1388 'slow-2g' === navigator.connection.effectiveType 1389 ) 1390 ) 1391 } 1392} 1393 1394//# sourceURL=rocket-browser-checker-js-after 1395</script>
vendor: 1 bytes, line 1395
1395
1396<script id="rocket-preload-links-js-extra"> 1397var RocketPreloadLinksConfig = {"excludeUris":"/secure/my-southbank/mysubscriptions/|/secure/my-southbank/messagecentre/recent/|/secure/my-southbank/messagecentre/saved/|/secure/my-southbank/help/|/secure/my-southbank/help/update-password/|/secure/my-southbank/help/update-account/|/secure/my-southbank/help/update-email/|/secure/my-southbank/help/email-trouble/|/secure/my-southbank/help/cancel-subscription/|/secure/my-southbank/help/contact-editor/|/secure/my-southbank/help/dp-complaint/|/secure/my-southbank/help/cs-order-update/|/secure/my-southbank/help/cs-refund-update/|/secure/my-southbank/help/cs-complaint/|/secure/my-southbank/help/cs-other-query/|/secure/my-southbank/previousorders/|/login/|/lost-password/|/help-guide/|/(?:.+/)?feed(?:/(?:.+/?)?)?$|/(?:.+/)?embed/|/(index.php/)?(.*)wp-json(/.*|$)|/refer/|/go/|/recommend/|/recommends/","usesTrailingSlash":"1","imageExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php","fileExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php|html|htm","siteUrl":"https://www.southbankresearch.com","onHoverDelay":"100","rateThrottle":"3"}; 1398//# sourceURL=rocket-preload-links-js-extra 1399</script>
vendor: 1 bytes, line 1399
1399
1400<script id="rocket-preload-links-js-after"> 1401class RocketPreloadLinks { 1402 1403 constructor( browser, config ) { 1404 this.browser = browser; 1405 this.config = config; 1406 this.options = this.browser.options; 1407 1408 this.prefetched = new Set; 1409 this.eventTime = null; 1410 this.threshold = 1111; 1411 this.numOnHover = 0; 1412 } 1413 1414 /** 1415 * Initializes the handler. 1416 */ 1417 init() { 1418 if ( 1419 ! this.browser.supportsLinkPrefetch() 1420 || 1421 this.browser.isDataSaverModeOn() 1422 || 1423 this.browser.isSlowConnection() 1424 ) { 1425 return; 1426 } 1427 1428 this.regex = { 1429 excludeUris: RegExp( this.config.excludeUris, 'i' ), 1430 images: RegExp( '.(' + this.config.imageExt + ')$', 'i' ), 1431 fileExt: RegExp( '.(' + this.config.fileExt + ')$', 'i' ) 1432 }; 1433 1434 this._initListeners( this ); 1435 } 1436 1437 /** 1438 * Initializes the event listeners. 1439 * 1440 * @private 1441 * 1442 * @param self instance of this object, used for binding "this" to the listeners. 1443 */ 1444 _initListeners( self ) { 1445 // Setting onHoverDelay to -1 disables the "on-hover" feature. 1446 if ( this.config.onHoverDelay > -1 ) { 1447 document.addEventListener( 'mouseover', self.listener.bind( self ), self.listenerOptions ); 1448 } 1449 1450 document.addEventListener( 'mousedown', self.listener.bind( self ), self.listenerOptions ); 1451 document.addEventListener( 'touchstart', self.listener.bind( self ), self.listenerOptions ); 1452 } 1453 1454 /** 1455 * Event listener. Processes when near or on a valid <a> hyperlink. 1456 * 1457 * @param Event event Event instance. 1458 */ 1459 listener( event ) { 1460 const linkElem = event.target.closest( 'a' ); 1461 const url = this._prepareUrl( linkElem ); 1462 if ( null === url ) { 1463 return; 1464 } 1465 1466 switch ( event.type ) { 1467 case 'mousedown': 1468 case 'touchstart': 1469 this._addPrefetchLink( url ); 1470 break; 1471 case 'mouseover': 1472 this._earlyPrefetch( linkElem, url, 'mouseout' ); 1473 } 1474 } 1475 1476 /** 1477 * 1478 * @private 1479 * 1480 * @param Element|null linkElem 1481 * @param object url 1482 * @param string resetEvent 1483 */ 1484 _earlyPrefetch( linkElem, url, resetEvent ) { 1485 const doPrefetch = () => { 1486 falseTrigger = null; 1487 1488 // Start the rate throttle: 1 sec timeout. 1489 if ( 0 === this.numOnHover ) { 1490 setTimeout( () => this.numOnHover = 0, 1000 ); 1491 } 1492 // Bail out when exceeding the rate throttle. 1493 else if ( this.numOnHover > this.config.rateThrottle ) { 1494 return; 1495 } 1496 1497 this.numOnHover++; 1498 this._addPrefetchLink( url ); 1499 }; 1500 1501 // Delay to avoid false triggers for hover/touch/tap. 1502 let falseTrigger = setTimeout( doPrefetch, this.config.onHoverDelay ); 1503 1504 // On reset event, reset the false trigger timer. 1505 const reset = () => { 1506 linkElem.removeEventListener( resetEvent, reset, { passive: true } ); 1507 if ( null === falseTrigger ) { 1508 return; 1509 } 1510 1511 clearTimeout( falseTrigger ); 1512 falseTrigger = null; 1513 }; 1514 linkElem.addEventListener( resetEvent, reset, { passive: true } ); 1515 } 1516 1517 /** 1518 * Adds a <link rel="prefetch" href="<url>"> for the given URL. 1519 * 1520 * @param string url The Given URL to prefetch. 1521 */ 1522 _addPrefetchLink( url ) { 1523 this.prefetched.add( url.href ); 1524 1525 return new Promise( ( resolve, reject ) => { 1526 const elem = document.createElement( 'link' ); 1527 elem.rel = 'prefetch'; 1528 elem.href = url.href; 1529 elem.onload = resolve; 1530 elem.onerror = reject; 1531 1532 document.head.appendChild( elem ); 1533 } ).catch(() => { 1534 // ignore and continue. 1535 }); 1536 } 1537 1538 /** 1539 * Prepares the target link's URL. 1540 * 1541 * @private 1542 * 1543 * @param Element|null linkElem Instance of the link element. 1544 * @returns {null|*} 1545 */ 1546 _prepareUrl( linkElem ) { 1547 if ( 1548 null === linkElem 1549 || 1550 typeof linkElem !== 'object' 1551 || 1552 ! 'href' in linkElem 1553 || 1554 // Link prefetching only works on http/https protocol. 1555 [ 'http:', 'https:' ].indexOf( linkElem.protocol ) === -1 1556 ) { 1557 return null; 1558 } 1559 1560 const origin = linkElem.href.substring( 0, this.config.siteUrl.length ); 1561 const pathname = this._getPathname( linkElem.href, origin ); 1562 const url = { 1563 original: linkElem.href, 1564 protocol: linkElem.protocol, 1565 origin: origin, 1566 pathname: pathname, 1567 href: origin + pathname 1568 }; 1569 1570 return this._isLinkOk( url ) ? url : null; 1571 } 1572 1573 /** 1574 * Gets the URL's pathname. Note: ensures the pathname matches the permalink structure. 1575 * 1576 * @private 1577 * 1578 * @param object url Instance of the URL. 1579 * @param string origin The target link href's origin. 1580 * @returns {string} 1581 */ 1582 _getPathname( url, origin ) { 1583 let pathname = origin 1584 ? url.substring( this.config.siteUrl.length ) 1585 : url; 1586 1587 if ( ! pathname.startsWith( '/' ) ) { 1588 pathname = '/' + pathname; 1589 } 1590 1591 if ( this._shouldAddTrailingSlash( pathname ) ) { 1592 return pathname + '/'; 1593 } 1594 1595 return pathname; 1596 } 1597 1598 _shouldAddTrailingSlash( pathname ) { 1599 return ( 1600 this.config.usesTrailingSlash 1601 && 1602 ! pathname.endsWith( '/' ) 1603 && 1604 ! this.regex.fileExt.test( pathname ) 1605 ); 1606 } 1607 1608 /** 1609 * Checks if the given link element is okay to process. 1610 * 1611 * @private 1612 * 1613 * @param object url URL parts object. 1614 * 1615 * @returns {boolean} 1616 */ 1617 _isLinkOk( url ) { 1618 if ( null === url || typeof url !== 'object' ) { 1619 return false;
1620 } 1621 1622 return ( 1623 ! this.prefetched.has( url.href ) 1624 && 1625 url.origin === this.config.siteUrl // is an internal document. 1626 && 1627 url.href.indexOf( '?' ) === -1 // not a query string. 1628 && 1629 url.href.indexOf( '#' ) === -1 // not an anchor. 1630 && 1631 ! this.regex.excludeUris.test( url.href ) // not excluded. 1632 && 1633 ! this.regex.images.test( url.href ) // not an image. 1634 ); 1635 } 1636 1637 /** 1638 * Named static constructor to encapsulate how to create the object. 1639 */ 1640 static run() { 1641 // Bail out if the configuration not passed from the server. 1642 if ( typeof RocketPreloadLinksConfig === 'undefined' ) { 1643 return; 1644 } 1645 1646 const browser = new RocketBrowserCompatibilityChecker( { 1647 capture: true, 1648 passive: true 1649 } ); 1650 const instance = new RocketPreloadLinks( browser, RocketPreloadLinksConfig ); 1651 instance.init(); 1652 } 1653} 1654 1655RocketPreloadLinks.run(); 1656 1657//# sourceURL=rocket-preload-links-js-after 1658</script>
vendor: 1 bytes, line 1658
1658
1659<script id="cookie-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/cookie.js"></script>
vendor: 1 bytes, line 1659
1659
1660<script id="jasny-mobile-menu-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/lib/jasny-bootstrap.min.js"></script>
vendor: 1 bytes, line 1660
1660
1661<script id="savevideoforlater-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/videocenter.js"></script>
vendor: 1 bytes, line 1661
1661
1662<script id="scroll-forever-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/scrollForever.min.js"></script>
vendor: 1 bytes, line 1662
1662
1663<script id="tcc-openchatlink-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/TCC/onOpenChatLink.js"></script>
vendor: 1 bytes, line 1663
1663
1664<script id="tcc-config-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/TCC/Config.js"></script>
vendor: 1 bytes, line 1664
1664
1665<script id="generic-js-extra"> 1666var generic_object = {"widgetclass":".cfsnip-widget","pubcode":"","isloggedin":"false","hasaccess":"false"}; 1667var generic_script = {"subscribedToPub":"false"}; 1668//# sourceURL=generic-js-extra 1669</script>
vendor: 1 bytes, line 1669
1669
1670<script id="generic-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/scripts.js"></script>
vendor: 1 bytes, line 1670
1670
1671<script id="custom-data-tables-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/portfolio-tracker-theme/assets/js/custom.dataTables.js"></script>
vendor: 1 bytes, line 1671
1671
1672<script id="leadgen-protection-js-js-extra"> 1673var LFVars = {"ajaxUrl":"/wp-admin/admin-ajax.php","ajax_nonce":"15e0378a4b","siteKey":"6LcW10IrAAAAABq18lRtYk_ZJZGRIUb39wIsMTvV"}; 1674//# sourceURL=leadgen-protection-js-js-extra 1675</script>
vendor: 1 bytes, line 1675
1675
1676<script id="leadgen-protection-js-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/leadgen-protection.js"></script>
vendor: 125 bytes, lines 1676-1677
1676 1677<script id="recaptcha-js" src="https://www.google.com/recaptcha/api.js?onload=initRecaptcha&render=explicit"></script>
1678<script id="sbr-login-form-validation-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/login-form-validation.js"></script>
vendor: 1 bytes, line 1678
1678
1679<script id="sbr-login-experiment-tracking-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/login-experiment-tracking.js"></script>
vendor: 1 bytes, line 1679
1679
1680<script id="bootstrap-toggle-js" src="https://www.southbankresearch.com/wp-content/themes/southbankresearch/assets/js/lib/bootstrap-toggle.min.js"></script>
vendor: 1 bytes, line 1680
1680
1681<script id="wp-emoji-settings" type="application/json"> 1682{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"wpemoji":"https://www.southbankresearch.com/wp-includes/js/wp-emoji.js","twemoji":"https://www.southbankresearch.com/wp-includes/js/twemoji.js"}} 1683</script>
vendor: 1 bytes, line 1683
1683
1684<script type="module"> 1685/** 1686 * @output wp-includes/js/wp-emoji-loader.js 1687 */ 1688 1689/* eslint-env es6 */ 1690 1691// Note: This is loaded as a script module, so there is no need for an IIFE to prevent pollution of the global scope. 1692 1693/** 1694 * Emoji Settings as exported in PHP via _print_emoji_detection_script(). 1695 * @typedef WPEmojiSettings 1696 * @type {object} 1697 * @property {?object} source 1698 * @property {?string} source.concatemoji 1699 * @property {?string} source.twemoji 1700 * @property {?string} source.wpemoji 1701 */ 1702 1703const selector = 'script#wp-emoji-settings'; 1704const script = document.querySelector( selector ); 1705if ( ! ( script instanceof HTMLScriptElement ) ) { 1706 throw new Error( `Element missing: ${ selector }`); 1707} 1708const settings = /** @type {WPEmojiSettings} */ ( JSON.parse( script.text ) ); 1709 1710// For compatibility with other scripts that read from this global, in particular wp-includes/js/wp-emoji.js (source file: js/_enqueues/wp/emoji.js). 1711window._wpemojiSettings = settings; 1712 1713/** 1714 * Support tests. 1715 * @typedef SupportTests 1716 * @type {object} 1717 * @property {?boolean} flag 1718 * @property {?boolean} emoji 1719 */ 1720 1721const sessionStorageKey = 'wpEmojiSettingsSupports'; 1722const tests = [ 'flag', 'emoji' ]; 1723 1724/** 1725 * Checks whether the browser supports offloading to a Worker. 1726 * 1727 * @since 6.3.0 1728 * 1729 * @private 1730 * 1731 * @returns {boolean} 1732 */ 1733function supportsWorkerOffloading() { 1734 return ( 1735 typeof Worker !== 'undefined' && 1736 typeof OffscreenCanvas !== 'undefined' && 1737 typeof URL !== 'undefined' && 1738 URL.createObjectURL && 1739 typeof Blob !== 'undefined' 1740 ); 1741} 1742 1743/** 1744 * @typedef SessionSupportTests 1745 * @type {object} 1746 * @property {number} timestamp 1747 * @property {SupportTests} supportTests 1748 */ 1749 1750/** 1751 * Get support tests from session. 1752 * 1753 * @since 6.3.0 1754 * 1755 * @private 1756 * 1757 * @returns {?SupportTests} Support tests, or null if not set or older than 1 week. 1758 */ 1759function getSessionSupportTests() { 1760 try { 1761 /** @type {SessionSupportTests} */ 1762 const item = JSON.parse( 1763 sessionStorage.getItem( sessionStorageKey ) 1764 ); 1765 if ( 1766 typeof item === 'object' && 1767 typeof item.timestamp === 'number' && 1768 new Date().valueOf() < item.timestamp + 604800 && // Note: Number is a week in seconds. 1769 typeof item.supportTests === 'object' 1770 ) { 1771 return item.supportTests; 1772 } 1773 } catch ( e ) {} 1774 return null; 1775} 1776 1777/** 1778 * Persist the supports in session storage. 1779 * 1780 * @since 6.3.0 1781 * 1782 * @private 1783 * 1784 * @param {SupportTests} supportTests Support tests. 1785 */ 1786function setSessionSupportTests( supportTests ) { 1787 try { 1788 /** @type {SessionSupportTests} */ 1789 const item = { 1790 supportTests: supportTests, 1791 timestamp: new Date().valueOf() 1792 }; 1793 1794 sessionStorage.setItem( 1795 sessionStorageKey, 1796 JSON.stringify( item ) 1797 ); 1798 } catch ( e ) {} 1799} 1800 1801/** 1802 * Checks if two sets of Emoji characters render the same visually. 1803 * 1804 * This is used to determine if the browser is rendering an emoji with multiple data points 1805 * correctly. set1 is the emoji in the correct form, using a zero-width joiner. set2 is the emoji 1806 * in the incorrect form, using a zero-width space. If the two sets render the same, then the browser 1807 * does not support the emoji correctly. 1808 * 1809 * This function may be serialized to run in a Worker. Therefore, it cannot refer to variables from the containing 1810 * scope. Everything must be passed by parameters. 1811 * 1812 * @since 4.9.0 1813 * 1814 * @private 1815 * 1816 * @param {CanvasRenderingContext2D} context 2D Context. 1817 * @param {string} set1 Set of Emoji to test. 1818 * @param {string} set2 Set of Emoji to test. 1819 * 1820 * @return {boolean} True if the two sets render the same. 1821 */ 1822function emojiSetsRenderIdentically( context, set1, set2 ) { 1823 // Cleanup from previous test. 1824 context.clearRect( 0, 0, context.canvas.width, context.canvas.height ); 1825 context.fillText( set1, 0, 0 ); 1826 const rendered1 = new Uint32Array( 1827 context.getImageData( 1828 0, 1829 0, 1830 context.canvas.width, 1831 context.canvas.height 1832 ).data 1833 ); 1834 1835 // Cleanup from previous test. 1836 context.clearRect( 0, 0, context.canvas.width, context.canvas.height ); 1837 context.fillText( set2, 0, 0 ); 1838 const rendered2 = new Uint32Array( 1839 context.getImageData( 1840 0, 1841 0, 1842 context.canvas.width,
1843 context.canvas.height 1844 ).data 1845 ); 1846 1847 return rendered1.every( ( rendered2Data, index ) => { 1848 return rendered2Data === rendered2[ index ]; 1849 } ); 1850} 1851 1852/** 1853 * Checks if the center point of a single emoji is empty. 1854 * 1855 * This is used to determine if the browser is rendering an emoji with a single data point 1856 * correctly. The center point of an incorrectly rendered emoji will be empty. A correctly 1857 * rendered emoji will have a non-zero value at the center point. 1858 * 1859 * This function may be serialized to run in a Worker. Therefore, it cannot refer to variables from the containing 1860 * scope. Everything must be passed by parameters. 1861 * 1862 * @since 6.8.2 1863 * 1864 * @private 1865 * 1866 * @param {CanvasRenderingContext2D} context 2D Context. 1867 * @param {string} emoji Emoji to test. 1868 * 1869 * @return {boolean} True if the center point is empty. 1870 */ 1871function emojiRendersEmptyCenterPoint( context, emoji ) { 1872 // Cleanup from previous test. 1873 context.clearRect( 0, 0, context.canvas.width, context.canvas.height ); 1874 context.fillText( emoji, 0, 0 ); 1875 1876 // Test if the center point (16, 16) is empty (0,0,0,0). 1877 const centerPoint = context.getImageData(16, 16, 1, 1); 1878 for ( let i = 0; i < centerPoint.data.length; i++ ) { 1879 if ( centerPoint.data[ i ] !== 0 ) { 1880 // Stop checking the moment it's known not to be empty. 1881 return false; 1882 } 1883 } 1884 1885 return true; 1886} 1887 1888/** 1889 * Determines if the browser properly renders Emoji that Twemoji can supplement. 1890 * 1891 * This function may be serialized to run in a Worker. Therefore, it cannot refer to variables from the containing 1892 * scope. Everything must be passed by parameters. 1893 * 1894 * @since 4.2.0 1895 * 1896 * @private 1897 * 1898 * @param {CanvasRenderingContext2D} context 2D Context. 1899 * @param {string} type Whether to test for support of "flag" or "emoji". 1900 * @param {Function} emojiSetsRenderIdentically Reference to emojiSetsRenderIdentically function, needed due to minification. 1901 * @param {Function} emojiRendersEmptyCenterPoint Reference to emojiRendersEmptyCenterPoint function, needed due to minification. 1902 * 1903 * @return {boolean} True if the browser can render emoji, false if it cannot. 1904 */ 1905function browserSupportsEmoji( context, type, emojiSetsRenderIdentically, emojiRendersEmptyCenterPoint ) { 1906 let isIdentical; 1907 1908 switch ( type ) { 1909 case 'flag': 1910 /* 1911 * Test for Transgender flag compatibility. Added in Unicode 13. 1912 * 1913 * To test for support, we try to render it, and compare the rendering to how it would look if 1914 * the browser doesn't render it correctly (white flag emoji + transgender symbol). 1915 */ 1916 isIdentical = emojiSetsRenderIdentically( 1917 context, 1918 '\uD83C\uDFF3\uFE0F\u200D\u26A7\uFE0F', // as a zero-width joiner sequence 1919 '\uD83C\uDFF3\uFE0F\u200B\u26A7\uFE0F' // separated by a zero-width space 1920 ); 1921 1922 if ( isIdentical ) { 1923 return false; 1924 } 1925 1926 /* 1927 * Test for Sark flag compatibility. This is the least supported of the letter locale flags, 1928 * so gives us an easy test for full support. 1929 * 1930 * To test for support, we try to render it, and compare the rendering to how it would look if 1931 * the browser doesn't render it correctly ([C] + [Q]). 1932 */ 1933 isIdentical = emojiSetsRenderIdentically( 1934 context, 1935 '\uD83C\uDDE8\uD83C\uDDF6', // as the sequence of two code points 1936 '\uD83C\uDDE8\u200B\uD83C\uDDF6' // as the two code points separated by a zero-width space 1937 ); 1938 1939 if ( isIdentical ) { 1940 return false; 1941 } 1942 1943 /* 1944 * Test for English flag compatibility. England is a country in the United Kingdom, it 1945 * does not have a two letter locale code but rather a five letter sub-division code. 1946 * 1947 * To test for support, we try to render it, and compare the rendering to how it would look if 1948 * the browser doesn't render it correctly (black flag emoji + [G] + [B] + [E] + [N] + [G]). 1949 */ 1950 isIdentical = emojiSetsRenderIdentically( 1951 context, 1952 // as the flag sequence 1953 '\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67\uDB40\uDC7F', 1954 // with each code point separated by a zero-width space 1955 '\uD83C\uDFF4\u200B\uDB40\uDC67\u200B\uDB40\uDC62\u200B\uDB40\uDC65\u200B\uDB40\uDC6E\u200B\uDB40\uDC67\u200B\uDB40\uDC7F' 1956 ); 1957 1958 return ! isIdentical; 1959 case 'emoji': 1960 /* 1961 * Is there a large, hairy, humanoid mythical creature living in the browser? 1962 * 1963 * To test for Emoji 17.0 support, try to render a new emoji: Hairy Creature. 1964 * 1965 * The hairy creature emoji is a single code point emoji. Testing for browser 1966 * support required testing the center point of the emoji to see if it is empty. 1967 * 1968 * 0xD83E 0x1FAC8 (\uD83E\u1FAC8) == ð« Hairy creature. 1969 * 1970 * When updating this test, please ensure that the emoji is either a single code point 1971 * or switch to using the emojiSetsRenderIdentically function and testing with a zero-width 1972 * joiner vs a zero-width space. 1973 */ 1974 const notSupported = emojiRendersEmptyCenterPoint( context, '\uD83E\u1FAC8' ); 1975 return ! notSupported; 1976 } 1977 1978 return false;
1979} 1980 1981/** 1982 * Checks emoji support tests. 1983 * 1984 * This function may be serialized to run in a Worker. Therefore, it cannot refer to variables from the containing 1985 * scope. Everything must be passed by parameters. 1986 * 1987 * @since 6.3.0 1988 * 1989 * @private 1990 * 1991 * @param {string[]} tests Tests. 1992 * @param {Function} browserSupportsEmoji Reference to browserSupportsEmoji function, needed due to minification. 1993 * @param {Function} emojiSetsRenderIdentically Reference to emojiSetsRenderIdentically function, needed due to minification. 1994 * @param {Function} emojiRendersEmptyCenterPoint Reference to emojiRendersEmptyCenterPoint function, needed due to minification. 1995 * 1996 * @return {SupportTests} Support tests. 1997 */ 1998function testEmojiSupports( tests, browserSupportsEmoji, emojiSetsRenderIdentically, emojiRendersEmptyCenterPoint ) { 1999 let canvas; 2000 if ( 2001 typeof WorkerGlobalScope !== 'undefined' && 2002 self instanceof WorkerGlobalScope 2003 ) { 2004 canvas = new OffscreenCanvas( 300, 150 ); // Dimensions are default for HTMLCanvasElement. 2005 } else { 2006 canvas = document.createElement( 'canvas' ); 2007 } 2008 2009 const context = canvas.getContext( '2d', { willReadFrequently: true } ); 2010 2011 /* 2012 * Chrome on OS X added native emoji rendering in M41. Unfortunately, 2013 * it doesn't work when the font is bolder than 500 weight. So, we 2014 * check for bold rendering support to avoid invisible emoji in Chrome. 2015 */ 2016 context.textBaseline = 'top'; 2017 context.font = '600 32px Arial'; 2018 2019 const supports = {}; 2020 tests.forEach( ( test ) => { 2021 supports[ test ] = browserSupportsEmoji( context, test, emojiSetsRenderIdentically, emojiRendersEmptyCenterPoint ); 2022 } ); 2023 return supports; 2024} 2025 2026/** 2027 * Adds a script to the head of the document. 2028 * 2029 * @ignore 2030 * 2031 * @since 4.2.0 2032 * 2033 * @param {string} src The url where the script is located. 2034 * 2035 * @return {void} 2036 */ 2037function addScript( src ) { 2038 const script = document.createElement( 'script' ); 2039 script.src = src; 2040 script.defer = true; 2041 document.head.appendChild( script ); 2042} 2043 2044settings.supports = { 2045 everything: true, 2046 everythingExceptFlag: true 2047}; 2048 2049// Obtain the emoji support from the browser, asynchronously when possible. 2050new Promise( ( resolve ) => { 2051 let supportTests = getSessionSupportTests(); 2052 if ( supportTests ) { 2053 resolve( supportTests ); 2054 return; 2055 } 2056 2057 if ( supportsWorkerOffloading() ) { 2058 try { 2059 // Note that the functions are being passed as arguments due to minification. 2060 const workerScript = 2061 'postMessage(' + 2062 testEmojiSupports.toString() + 2063 '(' + 2064 [ 2065 JSON.stringify( tests ), 2066 browserSupportsEmoji.toString(), 2067 emojiSetsRenderIdentically.toString(), 2068 emojiRendersEmptyCenterPoint.toString() 2069 ].join( ',' ) + 2070 '));'; 2071 const blob = new Blob( [ workerScript ], { 2072 type: 'text/javascript' 2073 } ); 2074 const worker = new Worker( URL.createObjectURL( blob ), { name: 'wpTestEmojiSupports' } ); 2075 worker.onmessage = ( event ) => { 2076 supportTests = event.data; 2077 setSessionSupportTests( supportTests ); 2078 worker.terminate(); 2079 resolve( supportTests ); 2080 }; 2081 return; 2082 } catch ( e ) {} 2083 } 2084 2085 supportTests = testEmojiSupports( tests, browserSupportsEmoji, emojiSetsRenderIdentically, emojiRendersEmptyCenterPoint ); 2086 setSessionSupportTests( supportTests ); 2087 resolve( supportTests ); 2088} ) 2089 // Once the browser emoji support has been obtained from the session, finalize the settings. 2090 .then( ( supportTests ) => { 2091 /* 2092 * Tests the browser support for flag emojis and other emojis, and adjusts the 2093 * support settings accordingly. 2094 */ 2095 for ( const test in supportTests ) { 2096 settings.supports[ test ] = supportTests[ test ]; 2097 2098 settings.supports.everything = 2099 settings.supports.everything && settings.supports[ test ]; 2100 2101 if ( 'flag' !== test ) { 2102 settings.supports.everythingExceptFlag = 2103 settings.supports.everythingExceptFlag && 2104 settings.supports[ test ]; 2105 } 2106 } 2107 2108 settings.supports.everythingExceptFlag = 2109 settings.supports.everythingExceptFlag && 2110 ! settings.supports.flag; 2111 2112 // When the browser can not render everything we need to load a polyfill. 2113 if ( ! settings.supports.everything ) { 2114 const src = settings.source || {}; 2115 2116 if ( src.concatemoji ) { 2117 addScript( src.concatemoji ); 2118 } else if ( src.wpemoji && src.twemoji ) { 2119 addScript( src.twemoji ); 2120 addScript( src.wpemoji ); 2121 } 2122 } 2123 } ); 2124//# sourceURL=https://www.southbankresearch.com/wp-includes/js/wp-emoji-loader.js 2125</script>
2125 2126 2127</section> 2128 2129 2130 2131 <!-- <a id="f9chat1" role="button" href="#" class="btn btn-primary" title onclick="onOpenChatLink()"></a> --> 2132 2133 </body> 2134</html> 2135 2136<!-- Performance optimized by Redis Object Cache. Learn more: https://wprediscache.com -->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.