322 lines
167 KiB
HTML
322 lines
167 KiB
HTML
|
|
<!doctype html><html class="preload" dir="ltr"><head><style>/* ARRFLIX critical-path styles — render first to avoid pre-bundle flash */
|
||
|
|
:root {
|
||
|
|
--primary-background-color: #000000;
|
||
|
|
--background-color: #000000;
|
||
|
|
}
|
||
|
|
html, body, .preload, .skinBody, .skinHeader, #reactRoot, .mainAnimatedPages {
|
||
|
|
background-color: #000000 !important;
|
||
|
|
color: #ffffff !important;
|
||
|
|
}
|
||
|
|
/* Login form's pre-bundle layout uses MUI default blue button — pre-paint Netflix red */
|
||
|
|
.raised, .button-submit, .emby-button[type=submit], button[type=submit] {
|
||
|
|
background-color: #E50914 !important;
|
||
|
|
color: #ffffff !important;
|
||
|
|
}
|
||
|
|
/* Hide pre-bundle Jellyfin logo + replace with .splashLogo (already swapped to ARRFLIX in this index.html) */
|
||
|
|
/* ARRFLIX dev V2 (2026-05-08) — hide drawer Settings entry from non-admins.
|
||
|
|
Drawer Settings link is .btnSettings / [data-itemid="settings"] with href="#".
|
||
|
|
Old href*="mypreferencesmenu" rules in CustomCss never matched. */
|
||
|
|
a.btnSettings,
|
||
|
|
.navMenuOption.btnSettings,
|
||
|
|
[data-itemid="settings"] {
|
||
|
|
display: none !important;
|
||
|
|
}
|
||
|
|
/* ARRFLIX english-lockdown (2026-05-08) — hide every language-switcher in the UI.
|
||
|
|
The shim pins UICulture to en-US in JS; these rules remove the controls so the
|
||
|
|
user can't even see they exist. !important survives Jellyfin upgrades that
|
||
|
|
re-skin the prefs page. Belt; the JS user-config save hook is the suspenders. */
|
||
|
|
/* User profile prefs — Display Language dropdown */
|
||
|
|
select[name="language"],
|
||
|
|
select#selectLanguage,
|
||
|
|
select[is="emby-select"][name="language"],
|
||
|
|
.languageSelector,
|
||
|
|
[data-role="language"],
|
||
|
|
.fldDisplayLanguage,
|
||
|
|
.fieldDisplayLanguage,
|
||
|
|
.displayLanguageField,
|
||
|
|
/* Login form locale picker (some Jellyfin builds expose a langSelect on /web/#/login.html) */
|
||
|
|
#divLoginLanguage,
|
||
|
|
.loginLanguage,
|
||
|
|
select[name="loginLanguage"],
|
||
|
|
/* Header / userMenu locale flag-or-text widget (Cineplex theme adds a .localeButton on some builds) */
|
||
|
|
.headerLanguageButton,
|
||
|
|
.localeButton,
|
||
|
|
.localeFlag,
|
||
|
|
button.btnLanguage,
|
||
|
|
[data-action="language"],
|
||
|
|
/* Belt: any <select> that contains a non-English option (de/fr/es/...) — hides
|
||
|
|
future Jellyfin builds that rename the field but keep the option list */
|
||
|
|
.formSection select option[value="de"],
|
||
|
|
.formSection select option[value="fr"],
|
||
|
|
.formSection select option[value="es"],
|
||
|
|
.formSection select option[value="ru"] {
|
||
|
|
display: none !important;
|
||
|
|
}
|
||
|
|
/* Hide the parent <select> + its label when its option list contains de-DE.
|
||
|
|
:has() is supported in Chromium 105+ / Firefox 121+ / Safari 15.4+ — same
|
||
|
|
support floor as the existing drawer-Settings :has() selectors. */
|
||
|
|
.fldSelectContainer:has(select option[value="de-DE"]),
|
||
|
|
.formSection:has(> label[for="selectLanguage"]),
|
||
|
|
label[for="selectLanguage"],
|
||
|
|
label[for="language"] {
|
||
|
|
display: none !important;
|
||
|
|
}
|
||
|
|
</style><script>/* ARRFLIX-SHIM-BEGIN */
|
||
|
|
(function(){
|
||
|
|
var TITLE = 'ARRFLIX';
|
||
|
|
var BARE_RE = /^Jellyfin$/i;
|
||
|
|
/* === English-lockdown (synchronous, runs before Jellyfin bundle) ===
|
||
|
|
Pins UI locale to en-US so the SPA never reads navigator.language
|
||
|
|
or the user's stored preference. Belt-and-braces against:
|
||
|
|
- localStorage keys the SPA reads on boot
|
||
|
|
- navigator.language / navigator.languages getters
|
||
|
|
- fetch / XHR Accept-Language header (best-effort; most browsers
|
||
|
|
block JS from setting it, but Jellyfin sometimes does)
|
||
|
|
- user-config save round-trip (rewrite UICulture → en-US before send) */
|
||
|
|
try {
|
||
|
|
var LS_KEYS = ['appLanguage','selectedlanguage','selectedlocale','language','locale','culture'];
|
||
|
|
for (var i=0;i<LS_KEYS.length;i++){
|
||
|
|
try { localStorage.setItem(LS_KEYS[i], 'en-US'); } catch(e){}
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
/* INC5 fmp4=false 2026-05-09 — disable "Prefer fMP4-HLS Media Container" client-side
|
||
|
|
so HLS uses TS segments. Works around HEVC+fMP4 black-video bug
|
||
|
|
(jellyfin-webos#126, jellyfin#16612). Browser hard-reload required. */
|
||
|
|
try { localStorage.setItem('enableHlsFmp4', 'false'); } catch(e){}
|
||
|
|
try {
|
||
|
|
var EN = ['en-US','en'];
|
||
|
|
Object.defineProperty(Navigator.prototype, 'language', { get:function(){return 'en-US';}, configurable:true });
|
||
|
|
Object.defineProperty(Navigator.prototype, 'languages', { get:function(){return EN.slice();}, configurable:true });
|
||
|
|
} catch(e){
|
||
|
|
/* fallback for engines that won't let us redefine on the prototype */
|
||
|
|
try { Object.defineProperty(navigator, 'language', { get:function(){return 'en-US';}, configurable:true }); } catch(e2){}
|
||
|
|
try { Object.defineProperty(navigator, 'languages', { get:function(){return ['en-US','en'];}, configurable:true }); } catch(e2){}
|
||
|
|
}
|
||
|
|
/* fetch wrapper: strip Accept-Language on outbound requests, and rewrite
|
||
|
|
any user-config save body so UICulture is pinned to en-US. */
|
||
|
|
try {
|
||
|
|
if (window.fetch) {
|
||
|
|
var _origFetch = window.fetch;
|
||
|
|
window.fetch = function(input, init){
|
||
|
|
try {
|
||
|
|
init = init || {};
|
||
|
|
/* strip Accept-Language if present on a plain object headers init */
|
||
|
|
if (init.headers) {
|
||
|
|
if (init.headers instanceof Headers) {
|
||
|
|
try { init.headers.delete('Accept-Language'); } catch(e){}
|
||
|
|
} else if (typeof init.headers === 'object') {
|
||
|
|
for (var k in init.headers){ if (k && k.toLowerCase() === 'accept-language') { try { delete init.headers[k]; } catch(e){} } }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/* rewrite user-config save: POST /Users/{id}/Configuration */
|
||
|
|
var url = (typeof input === 'string') ? input : (input && input.url) || '';
|
||
|
|
var method = (init.method || (input && input.method) || 'GET').toUpperCase();
|
||
|
|
if (url && /\/Users\/[^/]+\/Configuration(\?|$)/.test(url) && method === 'POST' && init.body) {
|
||
|
|
try {
|
||
|
|
var body = init.body;
|
||
|
|
if (typeof body === 'string') {
|
||
|
|
var obj = JSON.parse(body);
|
||
|
|
if (obj && typeof obj === 'object') {
|
||
|
|
obj.UICulture = 'en-US';
|
||
|
|
init.body = JSON.stringify(obj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
return _origFetch.call(this, input, init);
|
||
|
|
};
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
/* XHR wrapper: strip Accept-Language; rewrite user-config save body. */
|
||
|
|
try {
|
||
|
|
if (window.XMLHttpRequest) {
|
||
|
|
var _open = XMLHttpRequest.prototype.open;
|
||
|
|
var _setHeader = XMLHttpRequest.prototype.setRequestHeader;
|
||
|
|
var _send = XMLHttpRequest.prototype.send;
|
||
|
|
XMLHttpRequest.prototype.open = function(method, url){
|
||
|
|
this.__arrflix_method = (method || 'GET').toUpperCase();
|
||
|
|
this.__arrflix_url = url || '';
|
||
|
|
return _open.apply(this, arguments);
|
||
|
|
};
|
||
|
|
XMLHttpRequest.prototype.setRequestHeader = function(name, value){
|
||
|
|
if (name && String(name).toLowerCase() === 'accept-language') return;
|
||
|
|
return _setHeader.apply(this, arguments);
|
||
|
|
};
|
||
|
|
XMLHttpRequest.prototype.send = function(body){
|
||
|
|
try {
|
||
|
|
if (this.__arrflix_url && /\/Users\/[^/]+\/Configuration(\?|$)/.test(this.__arrflix_url) && this.__arrflix_method === 'POST' && typeof body === 'string') {
|
||
|
|
try {
|
||
|
|
var obj = JSON.parse(body);
|
||
|
|
if (obj && typeof obj === 'object') {
|
||
|
|
obj.UICulture = 'en-US';
|
||
|
|
body = JSON.stringify(obj);
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
return _send.call(this, body);
|
||
|
|
};
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
/* Re-pin localStorage on every visibility change (SPA may rewrite on user save) */
|
||
|
|
function pinLocale(){
|
||
|
|
try {
|
||
|
|
var L = ['appLanguage','selectedlanguage','selectedlocale','language','locale','culture'];
|
||
|
|
for (var i=0;i<L.length;i++){ try { if (localStorage.getItem(L[i]) !== 'en-US') localStorage.setItem(L[i], 'en-US'); } catch(e){} }
|
||
|
|
} catch(e){}
|
||
|
|
}
|
||
|
|
/* === end english-lockdown synchronous block === */
|
||
|
|
function getFavicon(){
|
||
|
|
var l = document.querySelector('link[rel="shortcut icon"], link[rel="icon"]');
|
||
|
|
return l && l.href ? l.href : null;
|
||
|
|
}
|
||
|
|
function lockTitle(){
|
||
|
|
try {
|
||
|
|
var t = document.title || '';
|
||
|
|
if (BARE_RE.test(t)) { document.title = TITLE; return; }
|
||
|
|
if (/Jellyfin/i.test(t)) {
|
||
|
|
var cleaned = t.replace(/\s*[-|]\s*Jellyfin\s*$/i, '').replace(/Jellyfin/gi, TITLE);
|
||
|
|
if (!cleaned) { document.title = TITLE; }
|
||
|
|
else if (!/ARRFLIX/i.test(cleaned)) { document.title = cleaned + ' - ' + TITLE; }
|
||
|
|
else { document.title = cleaned; }
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
}
|
||
|
|
function lockFavicon(){
|
||
|
|
try {
|
||
|
|
var fav = getFavicon();
|
||
|
|
if (!fav || fav.indexOf('data:image') !== 0) return;
|
||
|
|
var icons = document.querySelectorAll('link[rel*="icon"]');
|
||
|
|
for (var i=0;i<icons.length;i++){ if (icons[i].href !== fav) icons[i].href = fav; }
|
||
|
|
} catch(e){}
|
||
|
|
}
|
||
|
|
function nukeSettings(){
|
||
|
|
try {
|
||
|
|
var nodes = document.querySelectorAll('a[href*="mypreferencesmenu"], [to*="mypreferencesmenu"]');
|
||
|
|
for (var i=0;i<nodes.length;i++){
|
||
|
|
var el = nodes[i];
|
||
|
|
var p = el.closest && (el.closest('li, .MuiListItem-root, [role="menuitem"]')) || el;
|
||
|
|
if (p && p.style && p.style.display !== 'none') p.style.display = 'none';
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
}
|
||
|
|
function start(){
|
||
|
|
lockTitle(); lockFavicon(); nukeSettings(); pinLocale();
|
||
|
|
try {
|
||
|
|
var head = document.head || document.querySelector('head');
|
||
|
|
if (head && window.MutationObserver) {
|
||
|
|
new MutationObserver(function(){ lockTitle(); lockFavicon(); }).observe(head, { childList:true, subtree:true, characterData:true, attributes:true, attributeFilter:['href'] });
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
try {
|
||
|
|
if (document.body && window.MutationObserver) {
|
||
|
|
new MutationObserver(function(){ nukeSettings(); }).observe(document.body, { childList:true, subtree:true });
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
setInterval(function(){
|
||
|
|
var t = document.title || '';
|
||
|
|
if (BARE_RE.test(t) || /Jellyfin/i.test(t)) lockTitle();
|
||
|
|
var fav = getFavicon();
|
||
|
|
if (fav && fav.indexOf('data:image') !== 0) lockFavicon();
|
||
|
|
nukeSettings();
|
||
|
|
pinLocale();
|
||
|
|
}, 1000);
|
||
|
|
}
|
||
|
|
if (document.readyState === 'loading') {
|
||
|
|
document.addEventListener('DOMContentLoaded', start, { once:true });
|
||
|
|
} else { start(); }
|
||
|
|
if ('serviceWorker' in navigator) {
|
||
|
|
try {
|
||
|
|
navigator.serviceWorker.getRegistrations().then(function(regs){
|
||
|
|
regs.forEach(function(r){
|
||
|
|
try {
|
||
|
|
var url = (r.active && r.active.scriptURL) || '';
|
||
|
|
if (url.indexOf('serviceworker.js') !== -1) { r.unregister(); }
|
||
|
|
} catch(e){}
|
||
|
|
});
|
||
|
|
}).catch(function(){});
|
||
|
|
if (window.caches && caches.keys) {
|
||
|
|
caches.keys().then(function(keys){ keys.forEach(function(k){ caches.delete(k); }); }).catch(function(){});
|
||
|
|
}
|
||
|
|
} catch(e){}
|
||
|
|
}
|
||
|
|
})();
|
||
|
|
/* ARRFLIX-SHIM-END */</script><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><link rel="manifest" href="fd4301fdc170fd202474.json"><meta name="format-detection" content="telephone=no"><meta name="msapplication-tap-highlight" content="no"><meta http-equiv="X-UA-Compatibility" content="IE=Edge"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="mobile-web-app-capable" content="yes"><meta name="application-name" content="ARRFLIX"><meta name="robots" content="noindex, nofollow, noarchive"><meta name="referrer" content="no-referrer"><meta id="themeColor" name="theme-color" content="#202020"><link rel="apple-touch-icon" sizes="180x180" href="data:image/png;base64,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
|
||
|
|
body.arrflix-themed .skinHeader .headerLeft,body.arrflix-themed .skinHeader .headerRight{flex:1 1 0;display:flex;align-items:center}
|
||
|
|
body.arrflix-themed .skinHeader .headerLeft{justify-content:flex-start;gap:.4em}
|
||
|
|
body.arrflix-themed .skinHeader .headerRight{justify-content:flex-end}
|
||
|
|
body.arrflix-themed .skinHeader .headerHomeButton,body.arrflix-themed .skinHeader .pageTitleWithLogo{display:none!important}
|
||
|
|
body.arrflix-themed .skinHeader .headerLeft > h3.pageTitle:not(.pageTitleWithLogo){display:none!important}
|
||
|
|
body.arrflix-themed .skinHeader .headerCastButton,body.arrflix-themed .skinHeader .headerSyncButton{display:none!important}
|
||
|
|
body.arrflix-themed .headerTabs.sectionTabs{display:none!important}
|
||
|
|
/* Hide entire header during video playback */
|
||
|
|
body.arrflix-video-active:not(:has(#loginPage:not(.hide))) .skinHeader,body.arrflix-video-active .arrflix-headerLogo,body.arrflix-video-active .arrflix-nav{display:none!important}
|
||
|
|
.arrflix-headerLogo{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:120px;height:38px;background:center/contain no-repeat url('data:image/png;base64,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
|
||
|
|
.arrflix-headerLogo:hover{filter:brightness(1.15)}
|
||
|
|
.arrflix-nav{text-transform:uppercase;letter-spacing:.08em;font-weight:600;padding:0 .9em;color:#fff!important;text-decoration:none;display:inline-flex;align-items:center;height:100%;font-size:.85em}
|
||
|
|
.arrflix-nav:hover{color:#E50914!important}
|
||
|
|
/* ARRFLIX-MIDDLE-THEME-END */</style><script>/* ARRFLIX-MIDDLE-THEME-BEGIN */
|
||
|
|
(function(){
|
||
|
|
function isVideoPage(){
|
||
|
|
try{
|
||
|
|
var h=(location.hash||'').toLowerCase();
|
||
|
|
if (h.indexOf('/video') !== -1) return true;
|
||
|
|
var osd = document.querySelector('#videoOsdPage:not(.hide)');
|
||
|
|
if (osd) return true;
|
||
|
|
var v = document.querySelector('.htmlVideoPlayer:not(.hide), video.htmlvideoplayer:not(.hide)');
|
||
|
|
if (v && getComputedStyle(v).display !== 'none') return true;
|
||
|
|
}catch(e){}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
function isAuthed(){
|
||
|
|
try{
|
||
|
|
if (document.querySelector('.pageContainer.loginPage:not(.hide)')) return false;
|
||
|
|
if (document.querySelector('#loginPage:not(.hide)')) return false;
|
||
|
|
var h = (location.hash || '').toLowerCase();
|
||
|
|
if (h.indexOf('/login') !== -1 || h.indexOf('/wizard') !== -1 || h.indexOf('/forgotpassword') !== -1 || h.indexOf('/selectserver') !== -1) return false;
|
||
|
|
if (window.ApiClient && typeof window.ApiClient.isLoggedIn === 'function' && !window.ApiClient.isLoggedIn()) return false;
|
||
|
|
var raw = localStorage.getItem('jellyfin_credentials');
|
||
|
|
if (!raw) return false;
|
||
|
|
var creds = JSON.parse(raw);
|
||
|
|
if (!creds || !creds.Servers || !creds.Servers.length || !creds.Servers[0].AccessToken) return false;
|
||
|
|
return true;
|
||
|
|
} catch(e){ return false; }
|
||
|
|
}
|
||
|
|
function teardown(){
|
||
|
|
document.body.classList.remove('arrflix-themed');
|
||
|
|
var top = document.querySelector('.skinHeader .headerTop'); if (!top) return;
|
||
|
|
var logo = top.querySelector('.arrflix-headerLogo'); if (logo) logo.remove();
|
||
|
|
Array.prototype.forEach.call(document.querySelectorAll('.arrflix-nav'), function(n){ n.remove(); });
|
||
|
|
}
|
||
|
|
function relayoutHeader(){
|
||
|
|
document.body.classList.toggle('arrflix-video-active', isVideoPage());
|
||
|
|
if (!isAuthed()) { teardown(); return; }
|
||
|
|
var top=document.querySelector('.skinHeader .headerTop'); if(!top) return;
|
||
|
|
document.body.classList.add('arrflix-themed');
|
||
|
|
var left=top.querySelector('.headerLeft');
|
||
|
|
if(left && !left.querySelector('[data-arrflix-nav="movies"]')){
|
||
|
|
left.insertAdjacentHTML('beforeend',
|
||
|
|
'<a is="emby-linkbutton" class="emby-button arrflix-nav" data-arrflix-nav="movies" href="#/movies.html">Movies</a>'+
|
||
|
|
'<a is="emby-linkbutton" class="emby-button arrflix-nav" data-arrflix-nav="series" href="#/tv.html">Series</a>'
|
||
|
|
);
|
||
|
|
}
|
||
|
|
if(!top.querySelector('.arrflix-headerLogo')){
|
||
|
|
var a=document.createElement('a');
|
||
|
|
a.className='arrflix-headerLogo';
|
||
|
|
a.href='#/home.html';
|
||
|
|
a.setAttribute('aria-label','ARRFLIX home');
|
||
|
|
a.textContent='ARRFLIX';
|
||
|
|
var right=top.querySelector('.headerRight');
|
||
|
|
top.insertBefore(a, right || null);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function start(){
|
||
|
|
relayoutHeader();
|
||
|
|
try{ new MutationObserver(relayoutHeader).observe(document.body,{childList:true,subtree:true}); }catch(e){}
|
||
|
|
window.addEventListener('hashchange', relayoutHeader);
|
||
|
|
setInterval(relayoutHeader,1500);
|
||
|
|
}
|
||
|
|
if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',start,{once:true}); else start();
|
||
|
|
})();
|
||
|
|
/* ARRFLIX-MIDDLE-THEME-END */</script><!--ARRFLIX-FAVICON-BEGIN--><link rel="icon" type="image/png" sizes="180x180" data-arrflix-icon="A" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIoAAAC0CAYAAABL97S5AAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAGYktHRAD/AP8A/6C9p5MAAAAHdElNRQfqBQkCBScVGsf+AABUZElEQVR42tW9d7xd13Ue+K1z7n39oTcSHQQIsIMgCICkZMka2bJkO25xlMSWFHucjJ14Yk884yS/ZJLYk8QeZ+I49lixLEeOValOSWxi7yR6BwmAIAqB9/Dw6u3lnLNX/rhn7732PucBIAnggZu/R9xy7il7r73KtxrhfTROPfkkoo9+tLv20Y8/2rfj4EdYJeBEgRQjIEJAQEAA0j/mzh/0v0i/Ywaj8wFRMP0F2f6ESH/EYJD+decdM5BeO6DO8SACg6AAKAYUK7QpQO9tG15Z+Rd/+hOts0OVgZ/5+ExP6WWPwkzfwDsZlZERxF9/cMXrIyNr19Vr6EeAgDili86/AMCsycAO4nTF9Xv3W/GaM5+ReEHpIZQSjXMeIlgSBBSoQ6zp+yAkhJXKTe2XX1kOpY7M9Hy+k/G+IpTzz7+AgaVLN4+UppYtgMIcle5gvXrpTpeLAzCIO8tJhgfAIQQW/AHmuw4rIsE9Oge7xKG/5fQ3Kr0VJs3WkBIzo5goFMqlhfGpt+5K3j57JHrjDRQ3bJjpab2sEVyBc1yTMfzii/g3n/9LTL51cks8ORXUKEYXKRTACFgvVsrm4YodkBUdQAAiyr0GI8NqDOmwET0pMWpxRJbNsELnLyUQYkYAhQCMEEARQKFcCtTJk1vPfPNr+ND7hEjwfiKUYl8/XmHuLh9/8+buZhMNFSMBg4js7tULm/6PwEK5SImJhL4ihqEPtjqOI340dbDlL5oYmTs/IOpMaABGkF7f0FF6R612gubwhXtvP3ho9jNPPTvT03rZ430jeob27MHQ/v03tMvlWwusUAFjHIz5RtzYBSRvkQEtCqR+0aEY0txGK70EOAoOS9FmP2PxmSY8SqnCCroOV2HqXCsBECsGTZRuaz770s1g3jnT83q5433BUeqnTmNo505MHDt6a71cubFNAWpMOAeFOCUUIgKlD5QRLOy+6TActuLIIwwwW7FlacgQDZH7ZefaZIhQf6HPT2yZESmGGh0baO7Zs7b6nYcQHXh/6LTvC0LpnjMHT//l59AaGt4SlUpdETMiBkaQoA0F4o5SGQjD1R2UyhzX5PWYhDWrUzFiRZDlIkb6sFRgOPe+mdlYQvrYgAHVbIXx2PjWx5//IdDbM9PTe1njfUEo44cO4I+Yu9vD57dQvYGCUggB1JlRRWJFh1A6nUGccgFrRrP5D1lT2reWWbAKZvcr8Y5Ivk91JhaUmf4plSAeH7/nM4dPDKjDR2d6ei9rvC8IpfL2OZz8xjduKI+O3aoUowigmzpKY4mTDuBlRIpYLI8CXGPH8h7LICwZ6S9I/FCqPnk8hD3R415c/0OgREGNT9xcffzxle03TyB+4/hMT/Elx3VPKKMvvYSR7TsweeSN2xoTkzeooKOFBACKIJSQgKEE8iGG1EGECS0tFzPyfkguh5K/0iTl0h7nU5BzfkaoGDxZWtA+ceKuxgsvIFy/dqan+ZLjuieU4px5eOZP/hj1obNbUCp3FQ3g1fl/GQo1JAbdcPCT9AV5YiMjavQfi08kHKtFiLFutIVjTXKXO7EH/Em8tnNOVWsE8dC5rTu+/w0cngbXuZ7GdU8oYU8P/hVzd/PtoXuL9QZ6mBEKnKMFwgVYK0Xu8o61KhYzXVxywQ27jJI+FOwBwvQ1ss0CNq48EvLJEK+5C5jjk0QhHh665+P79gyu++ETMz3NlxzXPY4ysW8fJg8evLExOn4rFBCmMLnerQkThklhGYAwtVZ8XZQkV7HoB7T26ZivKTFoxZQE6I/0vWA9kG/Z+JQYEk1xOVj6eaLAYxPr6o89tQKMwzM9z5ca1z2hjLy2HWFX15rm+PiShGAQsQCEJF3CSSiUiTGPUzxDCAMpppC+JmO26o/IIK0W4WVDFOSgcFoUWRubDSuR+Apb/YaFyZ0eGygFVaosiE6evis6depwvO8wChtvm+npnnZc16Ln0O//B5z4m79B5c3jdyaTk90B+w69zr9tBqaQpC5+djzJWRWXpa4qfX1iIYWr2TgUyeUPGbDOOgezsAobtiO/ihvNIB4d2/q9Jx4BerpnerovOq5rQlny0Y/g714YLjTHJ7YlzVbqR/FYPQgBCBNQFhXJLJQH5/sv2IXxLQwrf8OQqmnmUob42CVjh0btBYkIKlGIR0fv+YdHTw7GR9+c6em+6LiuCaV5bghDD31veVQub4sTlUFWw1R2FkAog9EUIQX2KMqAZHLZDQLDriZMJq6FXSuGhTKSF8bifETWu8xWxHXQXwZFMdSFsXW1Rx5dER0/DvX6WzM95dOO65ZQStt34eyTT2L4ueeWN4ZH5lOqWxCoE82WEkoIRoEYbQATKRdwPMT+AhqblQ2BEFk+4FjS7ImtDO4vnIr+oPR+OQXZAEug6WkDxUgmpxa0T5y8q/nCy6ANq2d62qcd1y2hBN0BTn3tQbSGz98TlCv9RWZDIAEjDX1M/9K1G6MEiQkikuFs5MoI6lATITWVNYdgayb7BOGaw+wFRwHkXxKCg0jNSsg9IiBpNIL4/PC2J7//IMY/9KGZnvbp12Omb2C6EXb34JPlybA9Nr4VjTYKnMZ5kI73yI4JVmj54Yl6aJFCbgysc4AG0NhTWDNnzOo82SApNhiNPA4kQjaJoCKFZGRk0987fmJwzr//g5me9mnHdWsej726A8HOXQvbYxN3qTQYyESSCERUpQHMzECVFEpQ6EcBisSCO0CYa33oSDXiLFxvOQALPJ8NdsIa6MsjTRYqrXRCEYw5TQwEcQJ1YWRd/fvfX8mMQzM979ON65ajTO7ag8k9B26OJqaWE1thQsZQze7qiAmjUNaYFbok+UQiLeD0HFo/NfElDlTrBah0foHsKx3xJr7IBFLZ1wEzeKq8oP3mm3c2n34ayWu7Z3rqc8d1SShH/uA/4vTXvobqmTObuVTuLyiJY8CJOrHBSh1xNK5jVAR8r2mE0t1P0+mnGRhVcxE/OMWKGBIkS0SuJeV7HaUiow0yCtCuN4Po7NC2v3nsYVCxa6anP3dcl4Qy946N+OmJC2FrdHQrWu00IEk77kiw89RSIaBAhC4CmuiIIGRCmMTCSS5hLCBvyLwMcjmDJS5yPnewW8o3me3tkLl8EsWIL4zf88/2HhqM3jox09OfO65LQqmfPoOTX/jrhfHk1B2cs5+1KNLrGKRhB4V0/iesR8/dwYC1iQTHkWKMp1lfgrCShMxikbAB1rA/TJoHO1eVw6aShXEMnpxaV3/22ZXRqdPgwydnegky47ojlKnnXkJ17z7U9x+8mSenVpBiEwJAbLPxAgAhsYmRNaKJgTEkiFkQi2+7am9w55WJoJe6r1RSM2RkKI2N6cyGiOBaO6yVajaxuDZLsYO1BIqBqan58cnTd7VeeQW4ddVML0NmXHeE0tPfg7Nf/SqaZ97ezKVqf6DY6BQBASEBIRHCwHISpPtTpVZQCUANkojsIJEkZl2/LAKnCQGTJ7qog9JmgrCFau1mhaQ/y/ImVxFPSSYI0G40g9a5oW0PfffrM70EueO6I5Q4ZnyiVgpbYxNbk3aMML3J0Ph5jBBIuYsUHJ3XLQATlFhGwnrZp/H5ONYR2xhbyQGEasSSSZHF89hY0SLISZxfX1U7LiV6rFoRoqHhTf9g//HB9pMvzfQyZMZ1h6OUDx5A5fDBhcnU1J3QwBpJGe97djl1FpIDV1wgheUpiguxi1mmiQqUlOEGsthcHXFZTB8zSywJkSzgRpz5fU4gJihWSMbG11Ufe3glmK87POW64yilA/tRPnJk
|