(function () { 'use strict'; var VERSION = 13; if (window.__portfolioVideoDecoderVersion === VERSION) return; window.__portfolioVideoDecoderVersion = VERSION; var HLS_CDNS = [ 'https://cdn.jsdelivr.net/npm/hls.js@1.5.7/dist/hls.min.js', 'https://unpkg.com/hls.js@1.5.7/dist/hls.min.js' ]; var MOBILE_MQ = '(max-width: 991px)'; // Same width gate as the immersive carousel (canShowHoldUi): only there every tile needs a first frame. var CAROUSEL_MQ = (window.HOME_IMMERSIVE_CONFIG && window.HOME_IMMERSIVE_CONFIG.widthMq) || '(min-width: 992px)'; var PRELOAD_GATE_TIMEOUT_MS = 3000; var PRELOAD_JOB_TIMEOUT_MS = 8000; var MAX_FATAL_RETRIES = 3; var mobileMq = window.matchMedia(MOBILE_MQ); var carouselMq = window.matchMedia(CAROUSEL_MQ); function hlsOpts() { var mobile = mobileMq.matches; return { enableWorker: true, autoStartLoad: false, startFragPrefetch: true, maxBufferLength: mobile ? 12 : 20, maxMaxBufferLength: mobile ? 24 : 40, startLevel: 0, capLevelToPlayerSize: true }; } function loadHls() { if (window.Hls) return Promise.resolve(); if (window.__portfolioHlsLoadPromise) return window.__portfolioHlsLoadPromise; window.__portfolioHlsLoadPromise = new Promise(function (resolve, reject) { var i = 0; function attempt() { var s = document.createElement('script'); s.src = HLS_CDNS[i]; s.async = true; // Must match the in , otherwise the preload is wasted and hls.js downloads twice. s.crossOrigin = 'anonymous'; s.onload = function () { if (window.Hls) resolve(); else reject(new Error('hls.js loaded without global')); }; s.onerror = function () { s.remove(); i += 1; if (i < HLS_CDNS.length) attempt(); else reject(new Error('hls.js failed to load')); }; document.head.appendChild(s); } attempt(); }); return window.__portfolioHlsLoadPromise; } loadHls().catch(function () {}); function ready(fn) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn, { once: true }); } else { fn(); } } function isArchiveGridVideo(video) { return !!(video && video.closest('.custom_grid .archive_item')); } function isCmsHeroVideo(video) { return !!(video && video.closest('.cms_background .cms_item')); } function liveOverlayOpen() { return !!document.querySelector('.surf_live_overlay.is-open'); } function getCmsItem(video) { return video ? video.closest('.cms_background .cms_item') : null; } function getHeroItems() { return Array.prototype.slice.call(document.querySelectorAll('.background_cases .cms_background .cms_item')); } function getHlsUrl(video) { return video.getAttribute('data-hls-src') || video.getAttribute('data-hsl-src') || ''; } function getVideoUrl(video) { return ( video.getAttribute('data-mp4-src') || video.getAttribute('data-src') || getHlsUrl(video) || video.getAttribute('src') || '' ); } function getHeroPlaybackUrl(video) { var mp4 = video.getAttribute('data-mp4-src') || video.getAttribute('data-src') || ''; if (/\.mp4(\?|#|$)/i.test(mp4)) return { type: 'mp4', url: mp4, fallback: getHlsUrl(video) }; var hls = getHlsUrl(video); if (hls) return { type: 'hls', url: hls }; return { type: 'unknown', url: video.getAttribute('src') || '' }; } // Each CMS item carries a desktop and a mobile