1'use strict'; 2 3(function () { 4 var loginLabels = { 5 ru: 'ÐойÑи', 6 uk: 'УвÑйÑи', 7 en: 'Log in', 8 de: 'Anmelden', 9 es: 'Iniciar sesión', 10 'pt-br': 'Entrar', 11 fr: 'Connexion', 12 pl: 'Zaloguj siÄ', 13 tr: 'GiriÅ', 14 it: 'Accedi', 15 ja: 'ãã°ã¤ã³', 16 ko: 'ë¡ê·¸ì¸', 17 zh: 'ç»å½', 18 'zh-hant': 'ç»å ¥' 19 }; 20 var playerLabels = { 21 ru: ['ÐоÑпÑоизвеÑÑи', 'ÐаÑза', 'Ðазад на {seektime} Ñ', 'ÐпеÑÑд на {seektime} Ñ', 'ÐеÑемоÑка', 'ÐÑомкоÑÑÑ', 'ÐÑклÑÑиÑÑ Ð·Ð²Ñк', 'ÐклÑÑиÑÑ Ð·Ð²Ñк', 'ÐаÑÑÑойки', 'ÐаÑÑинка в каÑÑинке', 'Ðа веÑÑ ÑкÑан', 'ÐÑйÑи из полноÑкÑанного Ñежима', 'СкоÑоÑÑÑ', 'ÐбÑÑнаÑ', 'ÐовÑоÑ', 'ÐклÑÑено', 'ÐÑклÑÑено', 'ÐклÑÑиÑÑ ÑÑбÑиÑÑÑ', 'ÐÑклÑÑиÑÑ ÑÑбÑиÑÑÑ', 'СкаÑаÑÑ', 'ÐеÑнÑÑÑÑÑ Ð² пÑедÑдÑÑее менÑ'], 22 uk: ['ÐÑдÑвоÑиÑи', 'ÐаÑза', 'Ðазад на {seektime} Ñ', 'УпеÑед на {seektime} Ñ', 'ÐеÑемоÑÑваннÑ', 'ÐÑÑнÑÑÑÑ', 'ÐимкнÑÑи звÑк', 'УвÑмкнÑÑи звÑк', 'ÐалаÑÑÑваннÑ', 'ÐаÑÑинка в каÑÑинÑÑ', 'Ðа веÑÑ ÐµÐºÑан', 'ÐийÑи з повноекÑанного ÑежимÑ', 'ШвидкÑÑÑÑ', 'ÐвиÑайна', 'ÐовÑоÑ', 'УвÑмкнено', 'Ðимкнено', 'УвÑмкнÑÑи ÑÑбÑиÑÑи', 'ÐимкнÑÑи ÑÑбÑиÑÑи', 'ÐаванÑажиÑи', 'ÐовеÑнÑÑиÑÑ Ð´Ð¾ попеÑеднÑого менÑ'], 23 en: ['Play', 'Pause', 'Rewind {seektime}s', 'Forward {seektime}s', 'Seek', 'Volume', 'Mute', 'Unmute', 'Settings', 'Picture in Picture', 'Enter fullscreen', 'Exit fullscreen', 'Speed', 'Normal', 'Loop', 'Enabled', 'Disabled', 'Enable captions', 'Disable captions', 'Download', 'Go back to previous menu'], 24 de: ['Wiedergabe', 'Pause', '{seektime} s zurück', '{seektime} s vor', 'Spulen', 'Lautstärke', 'Stummschalten', 'Ton einschalten', 'Einstellungen', 'Bild-in-Bild', 'Vollbildmodus', 'Vollbildmodus beenden', 'Geschwindigkeit', 'Normal', 'Wiederholen', 'Aktiviert', 'Deaktiviert', 'Untertitel einschalten', 'Untertitel ausschalten', 'Herunterladen', 'Zum vorherigen Menü zurückkehren'], 25 es: ['Reproducir', 'Pausa', 'Retroceder {seektime} s', 'Avanzar {seektime} s', 'Buscar', 'Volumen', 'Silenciar', 'Activar sonido', 'Ajustes', 'Imagen en imagen', 'Pantalla completa', 'Salir de pantalla completa', 'Velocidad', 'Normal', 'Repetir', 'Activado', 'Desactivado', 'Activar subtÃtulos', 'Desactivar subtÃtulos', 'Descargar', 'Volver al menú anterior'], 26 'pt-br': ['Reproduzir', 'Pausar', 'Voltar {seektime} s', 'Avançar {seektime} s', 'Buscar', 'Volume', 'Silenciar', 'Ativar som', 'Configurações', 'Imagem em imagem', 'Tela cheia', 'Sair da tela cheia', 'Velocidade', 'Normal', 'Repetir', 'Ativado', 'Desativado', 'Ativar legendas', 'Desativar legendas', 'Baixar', 'Voltar ao menu anterior'], 27 fr: ['Lire', 'Pause', 'Reculer de {seektime} s', 'Avancer de {seektime} s', 'Rechercher', 'Volume', 'Couper le son', 'Réactiver le son', 'Paramètres', 'Image dans lâimage', 'Plein écran', 'Quitter le plein écran', 'Vitesse', 'Normale', 'Boucle', 'Activé', 'Désactivé', 'Activer les sous-titres', 'Désactiver les sous-titres', 'Télécharger', 'Revenir au menu précédent'], 28 pl: ['Odtwórz', 'Pauza', 'Cofnij o {seektime} s', 'PrzewiÅ do przodu o {seektime} s', 'PrzewiÅ', 'GÅoÅnoÅÄ', 'Wycisz', 'WÅÄ cz dźwiÄk', 'Ustawienia', 'Obraz w obrazie', 'PeÅny ekran', 'OpuÅÄ peÅny ekran', 'PrÄdkoÅÄ', 'Normalna', 'PÄtla', 'WÅÄ czone', 'WyÅÄ czone', 'WÅÄ cz napisy', 'WyÅÄ cz napisy', 'Pobierz', 'WrÃ³Ä do poprzedniego menu'], 29 tr: ['Oynat', 'Duraklat', '{seektime} sn geri', '{seektime} sn ileri', 'İlerleme', 'Ses düzeyi', 'Sesi kapat', 'Sesi aç', 'Ayarlar', 'Resim içinde resim', 'Tam ekran', 'Tam ekrandan çık', 'Hız', 'Normal', 'Döngü', 'Etkin', 'Devre dıÅı', 'Altyazıları aç', 'Altyazıları kapat', 'İndir', 'Ãnceki menüye dön'], 30 it: ['Riproduci', 'Pausa', 'Indietro di {seektime} s', 'Avanti di {seektime} s', 'Cerca', 'Volume', 'Disattiva audio', 'Attiva audio', 'Impostazioni', 'Immagine nellâimmagine', 'Schermo intero', 'Esci da schermo intero', 'Velocità ', 'Normale', 'Ripeti', 'Attivato', 'Disattivato', 'Attiva sottotitoli', 'Disattiva sottotitoli', 'Scarica', 'Torna al menu precedente'], 31 ja: ['åç', '䏿忢', '{seektime}ç§æ»ã', '{seektime}ç§é²ã', 'ã·ã¼ã¯', 'é³é', 'ãã¥ã¼ã', 'ãã¥ã¼ãè§£é¤', 'è¨å®', 'ãã¯ãã£ã¼ã¤ã³ãã¯ãã£ã¼', 'å ¨ç»é¢è¡¨ç¤º', 'å ¨ç»é¢è¡¨ç¤ºãçµäº', 'åçé度', 'æ¨æº', 'ã«ã¼ã', 'æå¹', 'ç¡å¹', 'åå¹ãæå¹ã«ãã', 'åå¹ãç¡å¹ã«ãã', 'ãã¦ã³ãã¼ã', 'åã®ã¡ãã¥ã¼ã«æ»ã'], 32 ko: ['ì¬ì', 'ì¼ìì ì§', '{seektime}ì´ ë¤ë¡', '{seektime}ì´ ìì¼ë¡', 'íì', '볼륨', 'ììê±°', 'ììê±° í´ì ', 'ì¤ì ', 'íë©´ ì íë©´', 'ì ì²´ íë©´', 'ì ì²´ íë©´ ì¢ ë£', 'ì¬ì ìë
32', 'ë³´íµ', 'ë°ë³µ', 'ì¬ì©', 'ì¬ì© ì í¨', 'ìë§ ì¼ê¸°', 'ìë§ ë기', 'ë¤ì´ë¡ë', 'ì´ì ë©ë´ë¡ ëìê°ê¸°'], 33 zh: ['ææ¾', 'æå', 'åé {seektime} ç§', 'åè¿ {seektime} ç§', '跳转', 'é³é', 'éé³', 'åæ¶éé³', '设置', 'ç»ä¸ç»', 'å ¨å±', 'éåºå ¨å±', 'é度', 'æ£å¸¸', '循ç¯', 'å·²å¯ç¨', 'å·²ç¦ç¨', 'å¯ç¨åå¹', 'ç¦ç¨åå¹', 'ä¸è½½', 'è¿åä¸ä¸çº§èå'], 34 'zh-hant': ['ææ¾', 'æ«å', 'å¾é {seektime} ç§', 'åé² {seektime} ç§', 'è·³è½', 'é³é', 'éé³', 'åæ¶éé³', 'è¨å®', '忝ç«é¢', 'å ¨è¢å¹', 'éåºå ¨è¢å¹', 'é度', 'æ£å¸¸', '循ç°', 'å·²åç¨', 'å·²åç¨', 'åç¨åå¹', 'åç¨åå¹', 'ä¸è¼', 'è¿åä¸ä¸å±¤é¸å®'] 35 }; 36 37 function currentLocale() { 38 var segment = (window.location.pathname || '').replace(/^\/+/, '').split('/')[0].toLowerCase(); 39 var htmlLang = (document.documentElement.lang || '').toLowerCase(); 40 41 if (segment === 'ua') return 'uk'; 42 if (segment === 'pt-br' || segment === 'zh-hant' || playerLabels[segment]) return segment; 43 if (htmlLang === 'uk') return 'uk'; 44 if (htmlLang === 'pt-br') return 'pt-br'; 45 if (htmlLang === 'zh-hant') return 'zh-hant'; 46 if (playerLabels[htmlLang]) return htmlLang; 47 48 return 'ru'; 49 } 50 51 function setText(element, value) { 52 if (element && element.textContent !== value) element.textContent = value; 53 } 54 55 function setAttribute(element, name, value) { 56 if (element && element.getAttribute(name) !== value) element.setAttribute(name, value); 57 } 58 59 function setLeadingText(element, value) { 60 if (!element) return; 61 for (var i = 0; i < element.childNodes.length; i++) { 62 if (element.childNodes[i].nodeType === 3) { 63 if (element.childNodes[i].nodeValue !== value) element.childNodes[i].nodeValue = value; 64 return; 65 } 66 } 67 element.insertBefore(document.createTextNode(value), element.firstChild); 68 } 69 70 function localizeAccountLinks(root) { 71 var value = loginLabels[currentLocale()] || loginLabels.en; 72 Array.prototype.forEach.call((root || document).querySelectorAll('.tm-account-link'), function (link) { 73 setText(link.querySelector('.tm-account-link__label'), value); 74 setAttribute(link, 'aria-label', value); 75 setAttribute(link, 'title', value); 76 }); 77 } 78 79 function initStableVideoJumps() { 80 var selectors = [ 81 '.bloody-watch-btn', 82 '.b7-watch-btn', 83 '.logitech-watch-btn', 84 '.synapse-watch-btn', 85 '.x7-watch-btn' 86 ]; 87 88 document.addEventListener('click', function (event) { 89 var link = event.target.closest ? event.target.closest(selectors.join(',')) : null; 90 if (!link) return; 91 92 var href = link.getAttribute('href') || ''; 93 if (href.charAt(0) !== '#') return; 94 95 var target = document.getElementById(href.slice(1)); 96 if (!target) return; 97 98 var cancelled = false; 99 var events = ['wheel', 'touchstart', 'pointerdown', 'keydown']; 100 var pendingImages = Array.prototype.filter.call(document.images, function (image) { 101 return !image.complete && (image.compareDocumentPosition(target) & Node.DOCUMENT_POSITION_FOLLOWING); 102 }); 103 var timers = []; 104 var cleanup = function () { 105 events.forEach(function (eventName) { 106 window.removeEventListener(eventName, cancel, false); 107 }); 108 pendingImages.forEach(function (image) { 109 image.removeEventListener('load', align, false); 110 image.removeEventListener('error', align, false); 111 }); 112 timers.forEach(function (timer) { window.clearTimeout(timer); }); 113 }; 114 var cancel = function () { 115 cancelled = true; 116 if (window.jQuery) window.jQuery('html, body').stop(true); 117 cleanup(); 118 }; 119 var align = function () { 120 if (cancelled || !target.isConnected) return; 121 window.scrollTo(0, Math.max(0, target.getBoundingClientRect().top + window.pageYOffset - 63)); 122 }; 123
124 events.forEach(function (eventName) { 125 window.addEventListener(eventName, cancel, { once: true, passive: true }); 126 }); 127 pendingImages.forEach(function (image) { 128 image.addEventListener('load', align, { once: true }); 129 image.addEventListener('error', align, { once: true }); 130 }); 131 132 timers.push(window.setTimeout(align, 900)); 133 timers.push(window.setTimeout(align, 1800)); 134 timers.push(window.setTimeout(align, 3000)); 135 timers.push(window.setTimeout(cleanup, 3600)); 136 }, true); 137 } 138 139 function localizePlayer(player, values) { 140 var play = player.querySelector('[data-plyr="play"]'); 141 var mute = player.querySelector('[data-plyr="mute"]'); 142 var fullscreen = player.querySelector('[data-plyr="fullscreen"]'); 143 var rewind = player.querySelector('[data-plyr="rewind"]'); 144 var fastForward = player.querySelector('[data-plyr="fast-forward"]'); 145 var pip = player.querySelector('[data-plyr="pip"]'); 146 var captions = player.querySelector('[data-plyr="captions"]'); 147 var download = player.querySelector('[data-plyr="download"]'); 148 var seekTimeMatch = ((rewind && rewind.textContent) || (fastForward && fastForward.textContent) || '').match(/\d+/); 149 var seekTime = seekTimeMatch ? seekTimeMatch[0] : '10'; 150 151 if (play) { 152 setText(play.querySelector('.label--pressed'), values[1]); 153 setText(play.querySelector('.label--not-pressed'), values[0]); 154 setAttribute(play, 'aria-label', play.getAttribute('aria-pressed') === 'true' ? values[1] : values[0]); 155 } 156 if (mute) { 157 setText(mute.querySelector('.label--pressed'), values[7]); 158 setText(mute.querySelector('.label--not-pressed'), values[6]); 159 setAttribute(mute, 'aria-label', mute.getAttribute('aria-pressed') === 'true' ? values[7] : values[6]); 160 } 161 if (fullscreen) { 162 setText(fullscreen.querySelector('.label--pressed'), values[11]); 163 setText(fullscreen.querySelector('.label--not-pressed'), values[10]); 164 setAttribute(fullscreen, 'aria-label', fullscreen.getAttribute('aria-pressed') === 'true' ? values[11] : values[10]); 165 } 166 if (rewind) setText(rewind.querySelector('.plyr__sr-only'), values[2].replace('{seektime}', seekTime)); 167 if (fastForward) setText(fastForward.querySelector('.plyr__sr-only'), values[3].replace('{seektime}', seekTime)); 168 if (pip) { 169 setText(pip.querySelector('.plyr__sr-only'), values[9]); 170 setAttribute(pip, 'aria-label', values[9]); 171 } 172 if (captions) { 173 setText(captions.querySelector('.label--pressed'), values[18]); 174 setText(captions.querySelector('.label--not-pressed'), values[17]); 175 setAttribute(captions, 'aria-label', captions.getAttribute('aria-pressed') === 'true' ? values[18] : values[17]); 176 } 177 if (download) { 178 setText(download.querySelector('.plyr__sr-only'), values[19]); 179 setAttribute(download, 'aria-label', values[19]); 180 } 181 182 Array.prototype.forEach.call(player.querySelectorAll('[data-plyr="seek"]'), function (control) { 183 setAttribute(control, 'aria-label', values[4]); 184 }); 185 Array.prototype.forEach.call(player.querySelectorAll('[data-plyr="volume"]'), function (control) { 186 setAttribute(control, 'aria-label', values[5]); 187 }); 188 Array.prototype.forEach.call(player.querySelectorAll('button[data-plyr="settings"]'), function (control) { 189 var wrapper = control.firstElementChild && control.firstElementChild.tagName === 'SPAN' ? control.firstElementChild : null; 190 setText(control.querySelector('.plyr__sr-only'), values[8]); 191 setAttribute(control, 'aria-label', values[8]); 192 if (wrapper) { 193 var text = (wrapper.firstChild && wrapper.firstChild.nodeValue || '').trim().toLowerCase(); 194 if (text === 'speed') setLeadingText(wrapper, values[12]); 195 if (text === 'loop') setLeadingText(wrapper, values[14]); 196 var menuValue = wrapper.querySelector('.plyr__menu__value'); 197 if (menuValue && menuValue.textContent === 'Normal') setText(menuValue, values[13]); 198 if (menuValue && menuValue.textContent === 'undefined') setText(menuValue, values[16]); 199 } 200 }); 201 Array.prototype.forEach.call(player.querySelectorAll('button[data-plyr="speed"]'), function (control) { 202 if (control.textContent.trim() === 'Normal') setText(control, values[13]); 203 }); 204 Array.prototype.forEach.call(player.querySelectorAll('.plyr__control--back'), function (control) { 205 var sectionId = control.parentElement ? control.parentElement.id : ''; 206 var sectionLabel = control.querySelector('[aria-hidden="true"]'); 207 208 if (/-speed$/.test(sectionId)) setText(sectionLabel, values[12]); 209 if (/-loop$/.test(sectionId)) setText(sectionLabel, values[14]); 210 setText(control.querySelector('.plyr__sr-only'), values[20]); 211 setAttribute(control, 'aria-label', values[20]); 212 }); 213 } 214 215 function initFallbackPlayerLocalization() { 216 if (window.tmSitePlyrLocalizationReady) return; 217 window.tmSitePlyrLocalizationReady = true; 218 window.tmPlyrLocalizationReady = true; 219 220 var values = playerLabels[currentLocale()] || playerLabels.en; 221 var pending = new Set(); 222 var observed = new WeakSet(); 223 var scheduled = false;
224 var queuePlayer = function (player) { 225 if (!player || !player.matches('.plyr')) return; 226 pending.add(player); 227 if (!observed.has(player) && window.MutationObserver) { 228 observed.add(player); 229 new MutationObserver(function () { queuePlayer(player); }).observe(player, { 230 childList: true, subtree: true, attributes: true, 231 attributeFilter: ['aria-label', 'aria-pressed'] 232 }); 233 } 234 if (scheduled) return; 235 scheduled = true; 236 window.setTimeout(function () { 237 scheduled = false; 238 var players = Array.from(pending); 239 pending.clear(); 240 players.forEach(function (item) { 241 if (item.isConnected) localizePlayer(item, values); 242 }); 243 }, 0); 244 }; 245 document.querySelectorAll('.plyr').forEach(queuePlayer); 246 ['ready', 'play', 'pause', 'volumechange', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled'].forEach(function (eventName) { 247 document.addEventListener(eventName, function (event) { 248 var target = event.target; 249 if (target && target.closest) queuePlayer(target.closest('.plyr')); 250 }, true); 251 }); 252 } 253 254 function init() { 255 localizeAccountLinks(); 256 initFallbackPlayerLocalization(); 257 initStableVideoJumps(); 258 259 window.setTimeout(localizeAccountLinks, 120); 260 window.setTimeout(localizeAccountLinks, 320); 261 if (window.MutationObserver) { 262 document.querySelectorAll('.navbar, .tm-account-topbar').forEach(function (root) { 263 var scheduled = false; 264 new MutationObserver(function () { 265 if (scheduled) return; 266 scheduled = true; 267 window.setTimeout(function () { 268 scheduled = false; 269 localizeAccountLinks(root); 270 }, 0); 271 }).observe(root, { childList: true, subtree: true }); 272 }); 273 } 274 } 275 276 if (document.readyState === 'loading') { 277 document.addEventListener('DOMContentLoaded', init); 278 } else { 279 init(); 280 } 281}());
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.