<script>!function(e,t){var r,o,s,i;t.__SV||window.posthog&&window.posthog.__loaded||(window.posthog=t,t._i=[],t.init=function(n,a,p){function c(e,t){var r=t.split(".");2==r.length&&(e=e[r[0]],t=r[1]),e[t]=function(){e.push([t].concat(Array.prototype.slice.call(arguments,0)))}}(s=e.createElement("script")).type="text/javascript",s.crossOrigin="anonymous",s.async=!0,s.src=a.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(i=e.getElementsByTagName("script")[0]).parentNode.insertBefore(s,i);var u=t;for(void 0!==p?u=t[p]=[]:p="posthog",u.people=u.people||[],u.toString=function(e){var t="posthog";return"posthog"!==p&&(t+="."+p),e||(t+=" (stub)"),t},u.people.toString=function(){return u.toString(1)+".people (stub)"},r="Mi Ri init Vi Gi Rr Wi Ji Bi capture calculateEventProperties tn register register_once register_for_session unregister unregister_for_session an getFeatureFlag getFeatureFlagPayload getFeatureFlagResult isFeatureEnabled reloadFeatureFlags updateFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey cancelPendingSurvey canRenderSurvey canRenderSurveyAsync un identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset setIdentity clearIdentity get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException addExceptionStep captureLog startExceptionAutocapture stopExceptionAutocapture loadToolbar get_property getSessionProperty nn Xi createPersonProfile setInternalOrTestUser sn Hi cn opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing Ki debug Lr rn getPageViewId captureTraceFeedback captureTraceMetric Di".split(" "),o=0;o<r.length;o++)c(u,r[o]);t._i.push([n,a,p])},t.__SV=1)}(document,window.posthog||[]),posthog.init("phc_rvQ4FaF8626yhVtkAFpKS229HaupJKSMKyzFvTLXcqm7",{api_host:"https://us.i.posthog.com",defaults:"2026-01-30",person_profiles:"always"})</script><meta charset="utf-8"><meta content="f69763f6d1dc1982c46893d13629f202" name="monetag"><meta content="width=device-width,initial-scale=1" name="viewport"><meta content="#EB458B" name="theme-color"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="EDUrocks" name="apple-mobile-web-app-title"><link href="/manifest.json" rel="manifest"><link href="/favicon.ico" rel="icon" type="image/x-icon"><link href="/icons/icon-192.png" rel="apple-touch-icon"><title>IXL - Dashboard</title><link href="style.css?v=1779698614" rel="stylesheet"><script>!function(){if("serviceWorker"in navigator){var e="/sw.js?v="+encodeURIComponent("1773070806"),n=!!navigator.serviceWorker.controller,t=!1;navigator.serviceWorker.addEventListener("controllerchange",function(){o()}),navigator.serviceWorker.addEventListener("message",function(e){var n=e&&e.data;n&&"SW_ACTIVATED"===n.type&&o()}),window.addEventListener("load",function(){navigator.serviceWorker.register(e,{scope:"/",updateViaCache:"none"}).then(function(e){return i(e),e.update().catch(function(){})}).catch(function(e){console.log("[SW] Registration failed:",e)})}),document.addEventListener("visibilitychange",function(){"visible"===document.visibilityState&&navigator.serviceWorker.getRegistration("/").then(function(e){if(e)return i(e),e.update().catch(function(){})}).catch(function(){})})}function i(e){e&&!e.__edurocksUpdateBound&&(e.__edurocksUpdateBound=!0,e.addEventListener("updatefound",function(){var n=e.installing;n&&n.addEventListener("statechange",function(){if("installed"===n.state&&e.waiting)try{e.waiting.postMessage({type:"SKIP_WAITING"})}catch(e){console.log("[SW] Could not message waiting worker:",e)}})}))}function o(){n?t||(t=!0,window.location.reload()):n=!0}}()</script><script>!function(){var e=localStorage.getItem("edurocks-dark-mode");(null===e||"true"===e)&&(document.documentElement.classList.add("dark-mode"),document.addEventListener("DOMContentLoaded",function(){document.body.classList.add("dark-mode")})),window.applyCustomTheme=function(e,t){t=t||document.documentElement;var r=parseInt(e.slice(1,3),16),a=parseInt(e.slice(3,5),16),s=parseInt(e.slice(5,7),16);function o(e,t,r){var a,s,o;if(e/=360,r/=100,0===(t/=100))a=s=o=r;else{function m(e,t,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?e+6*(t-e)*r:r<.5?t:r<2/3?e+(t-e)*(2/3-r)*6:e}var n=r<.5?r*(1+t):r+t-r*t,l=2*r-n;a=m(l,n,e+1/3),s=m(l,n,e),o=m(l,n,e-1/3)}return{r:Math.round(255*a),g:Math.round(255*s),b:Math.round(255*o)}}var m=function(e,t,r){e/=255,t/=255,r/=255;var a,s,o=Math.max(e,t,r),m=Math.min(e,t,r),n=(o+m)/2;if(o===m)a=s=0;else{var l=o-m;switch(s=n>.5?l/(2-o-m):l/(o+m),o){case e:a=((t-r)/l+(t<r?6:0))/6;break;case t:a=((r-e)/l+2)/6;break;case r:a=((e-t)/l+4)/6}}return{h:360*a,s:100*s,l:100*n}}(r,a,s);function n(e,t,r){var a=o(m.h+e,Math.max(0,Math.min(100,m.s+t)),Math.max(0,Math.min(100,m.l+r)));return"#"+((1<<24)+(a.r<<16)+(a.g<<8)+a.b).toString(16).slice(1)}var l=e,d=n(0,0,15),h=n(0,5,-10),y=n(0,10,-25),c=n(0,-40,45),i=n(0,-25,35),p=n(0,-15,25),u=n(0,-30,-45),g=n(0,-25,-35),b=n(0,-20,-25),P=n(0,-10,20),k=n(0,-5,10),M=n(0,-20,30),v=n(0,-35,42),f=n(0,5,-15),L=n(0,10,-25);t.style.setProperty("--theme-primary",l),t.style.setProperty("--theme-primary-light",d),t.style.setProperty("--theme-primary-dark",h),t.style.setProperty("--theme-primary-darker",y),t.style.setProperty("--theme-bg-light-1",c),t.style.setProperty("--theme-bg-light-2",i),t.style.setProperty("--theme-bg-light-3",p),t.style.setProperty("--theme-bg-dark-1",u),t.style.setProperty("--theme-bg-dark-2",g),t.style.setProperty("--theme-bg-dark-3",b),t.style.setProperty("--theme-accent-light",P),t.style.setProperty("--theme-accent",k),t.style.setProperty("--theme-accent-soft",M),t.style.setProperty("--theme-accent-softer",v),t.style.setProperty("--theme-dark-primary",f),t.style.setProperty("--theme-dark-primary-light",L),t.style.setProperty("--theme-rgb",r+", "+a+", "+s);var w=o(m.h,Math.max(0,m.s-10),Math.min(100,m.l+20));t.style.setProperty("--theme-rgb-light",w.r+", "+w.g+", "+w.b);var x=o(m.h,Math.max(0,m.s-20),Math.min(100,m.l+30));t.style.setProperty("--theme-rgb-soft",x.r+", "+x.g+", "+x.b),t.style.setProperty("--theme-rgb-primary",r+", "+a+", "+s);var C=o(m.h,Math.max(0,m.s-30),Math.max(0,m.l-45));t.style.setProperty("--theme-bg-dark-rgb",C.r+", "+C.g+", "+C.b)};var t=localStorage.getItem("edurocks-theme")||"pink";if("custom"===t){var r=localStorage.getItem("edurocks-custom-color")||"#9333ea";window.applyCustomTheme(r),document.addEventListener("DOMContentLoaded",function(){window.applyCustomTheme(r,document.body)})}else"pink"!==t&&(document.documentElement.classList.add("theme-"+t),document.addEventListener("DOMContentLoaded",function(){document.body.classList.add("theme-"+t)}))}()</script><script>!function(){var t="Znl 26, 2026 12:07 NZ HGP",e=null,n=window.location.href;function o(){e&&(e.style.display="none")}function i(){e||((e=document.createElement("div")).id="edurocks-context-menu",e.innerHTML='<button type="button" data-action="aboutblank">Bcra Va nobhg:oynax</button><button type="button" data-action="reload">Erybnq</button><button type="button" data-action="copy">Pbcl Yvax</button><div class="context-divider"></div><div class="context-build-date">Ynfg ohvyq: '+t+"</div>",document.body.appendChild(e),e.addEventListener("click",function(t){var e=t.target.closest("button[data-action]");if(e){var i,a=e.getAttribute("data-action");"aboutblank"===a?function(t){var e=window.open("about:blank","_blank");if(e){var n=String(t).replace(/&/g,"&amp;").replace(/"/g,"&quot;");e.document.write('<!DOCTYPE html><html><head><title>Home - Classroom</title><link rel="icon" href="https://ssl.gstatic.com/classroom/favicon.png"><style>html,body{margin:0;padding:0;width:100%;height:100%;overflow:hidden}iframe{border:0;width:100%;height:100%}</style></head><body><iframe src="'+n+'" allow="fullscreen"></iframe></body></html>'),e.document.close()}}(n):"reload"===a?window.location.reload():"copy"===a&&(i=n,navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(i):new Promise(function(t,e){var n=document.createElement("textarea");n.value=i,n.setAttribute("readonly",""),n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select();try{document.execCommand("copy"),t()}catch(t){e(t)}finally{document.body.removeChild(n)}})).catch(function(){}),o()}}))}window.edurocksLastBuildDate=t,document.addEventListener("DOMContentLoaded",function(){i(),document.addEventListener("contextmenu",function(t){var o,i,a,d,c,r,l,u;t.preventDefault(),n=function(t){var e=t&&t.closest?t.closest("a[href]"):null;if(!e)return window.location.href;var n=e.getAttribute("href");if(!n)return window.location.href;try{return new URL(n,window.location.href).href}catch(t){return window.location.href}}(t.target),e.style.display="block",o=t.clientX,i=t.clientY,a=e.offsetWidth,d=e.offsetHeight,c=o,r=i,l=window.innerWidth-a-8,u=window.innerHeight-d-8,c>l&&(c=l),r>u&&(r=u),c<8&&(c=8),r<8&&(r=8),e.style.left=c+"px",e.style.top=r+"px"}),document.addEventListener("click",o),document.addEventListener("scroll",o,!0),document.addEventListener("keydown",function(t){"Escape"===t.key&&o()}),window.addEventListener("resize",o)})}()</script><script>!function(){var e="edurocks_dev_build_badge_position";function t(t,n,i,o){var r=function(e,t,n){var i=e.getBoundingClientRect(),o=Math.max(8,window.innerWidth-i.width-8),r=Math.max(8,window.innerHeight-i.height-8);return{left:Math.max(8,Math.min(t,o)),top:Math.max(8,Math.min(n,r))}}(t,n,i);if(t.style.left=r.left+"px",t.style.top=r.top+"px",t.style.right="auto",t.style.bottom="auto",o)try{localStorage.setItem(e,JSON.stringify(r))}catch(e){}}function n(){if(!document.getElementById("edurocks-dev-build-overlay")){var n=document.createElement("div");n.id="edurocks-dev-build-overlay";var i=document.createElement("div");i.className="edurocks-dev-build-message",i.textContent="RQHebpxf Qrirybczrag Ohvyq",n.appendChild(i);var o=document.createElement("div");o.className="edurocks-dev-build-details",o.textContent="Ynfg ohvyq Znl 26, 2026 12:07 NZ HGP. Cym qbag funer jvgubhg crezvffvba.",n.appendChild(o);var r=document.createElement("div");r.className="edurocks-dev-build-actions";var a=document.createElement("button");a.type="button",a.textContent="Uvqr 15f",a.setAttribute("aria-label","Hide dev build badge for 15 seconds"),a.addEventListener("click",function(){n.hidden=!0,window.setTimeout(function(){n.hidden=!1},15e3)}),r.appendChild(a);var d=document.createElement("button");d.type="button",d.textContent="Erserfu Fvgr",d.setAttribute("aria-label","Refresh the whole site"),d.addEventListener("click",function(){!function(e){e&&(e.disabled=!0,e.textContent="Erserfuvat...");var t=window.caches&&caches.keys?caches.keys().then(function(e){return Promise.all(e.map(function(e){return caches.delete(e)}))}):Promise.resolve(),n=navigator.serviceWorker&&navigator.serviceWorker.getRegistrations?navigator.serviceWorker.getRegistrations().then(function(e){return Promise.all(e.map(function(e){return e.update().catch(function(){})}))}):Promise.resolve();Promise.all([t,n]).finally(function(){window.location.reload()})}(d)}),r.appendChild(d),n.appendChild(r),document.body.appendChild(n),function(n){try{var i=JSON.parse(localStorage.getItem(e)||"null");if(!i||!Number.isFinite(i.left)||!Number.isFinite(i.top))return;t(n,i.left,i.top,!1)}catch(e){}}(n),function(e){var n=null;function i(i){if(n){n=null;var o=e.getBoundingClientRect();if(t(e,o.left,o.top,!0),e.classList.remove("is-dragging"),e.releasePointerCapture)try{e.releasePointerCapture(i.pointerId)}catch(e){}}}e.addEventListener("pointerdown",function(t){if((void 0===t.button||0===t.button)&&!t.target.closest("button")){var i=e.getBoundingClientRect();n={offsetX:t.clientX-i.left,offsetY:t.clientY-i.top},e.classList.add("is-dragging"),e.setPointerCapture&&e.setPointerCapture(t.pointerId),t.preventDefault()}}),e.addEventListener("pointermove",function(i){n&&t(e,i.clientX-n.offsetX,i.clientY-n.offsetY,!1)}),e.addEventListener("pointerup",i),e.addEventListener("pointercancel",i),window.addEventListener("resize",function(){if(document.body.contains(e)&&e.style.left){var n=e.getBoundingClientRect();t(e,n.left,n.top,!0)}})}(n)}}function i(){var e=window.location.href.split("#")[0];fetch(e,{method:"HEAD",cache:"no-store",credentials:"same-origin"}).then(function(e){(function(e){if(!e||!e.headers)return!1;var t=(e.headers.get("x-edurocks-env")||"").toLowerCase(),n=(e.headers.get("x-edurocks-dev-build")||"").toLowerCase();return"devbuild"===t||"1"===n||"true"===n||"devbuild"===n})(e)&&n()}).catch(function(){})}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",i):i()}()</script><span id="rot13-sentinel" style="position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden">EBG13_PURPX</span><div class="navbar"><a href="index.html" class="logo">EDUrocks</a><div class="navbar-row"><a href="index.html" class="navbar-active">Ubzr</a> <a href="gxmes.html">Tnzrf</a> <a href="kino.html">Zbivrf &amp; GI</a> <a href="ai.html">NV Pung</a> <a href="request.html">Erdhrfg</a> <a href="apps.html">Nccf</a> <button id="settings-btn" aria-label="Settings"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg></button><div id="user" style="display:none" role="button" tabindex="0"><img id="avatar" onerror="login()" onload="show()"><span id="username"></span></div><a href="login.html" id="login" style="display:none">Ybtva</a> <button class="mobile-menu-btn" id="mobile-menu-btn" aria-label="Menu"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round" height="24" width="24"><line x1="3" x2="21" y1="12" y2="12"></line><line x1="3" x2="21" y1="6" y2="6"></line><line x1="3" x2="21" y1="18" y2="18"></line></svg></button></div></div><div class="mobile-drawer-overlay" id="mobile-drawer-overlay"></div><div class="mobile-drawer" id="mobile-drawer"><div class="mobile-drawer-header"><span class="mobile-drawer-title">Zrah</span> <button class="mobile-drawer-close" id="mobile-drawer-close" aria-label="Close menu"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round" height="20" width="20"><line x1="18" x2="6" y1="6" y2="18"></line><line x1="6" x2="18" y1="6" y2="18"></line></svg></button></div><nav class="mobile-drawer-nav"><a href="index.html" class="active">Ubzr</a> <a href="gxmes.html">Tnzrf</a> <a href="kino.html">Zbivrf &amp; GI</a> <a href="ai.html">NV Pung</a> <a href="request.html">Erdhrfg</a> <a href="apps.html">Nccf</a> <a href="music.html">Zhfvp</a> <a href="chat.html">Yvir Pung</a></nav></div><div id="settings-modal"><div class="settings-content"><div class="settings-header"><h2 class="settings-title">Frggvatf</h2><button class="settings-close" aria-label="Close settings">×</button></div><div class="settings-section"><span class="settings-label">Nccrnenapr</span><div class="toggle-container"><span class="toggle-text">Qnex Zbqr</span><div class="toggle-switch" id="dark-mode-toggle"></div></div></div><div class="settings-section"><span class="settings-label">Fvgr Cersreraprf</span><div class="toggle-container"><span class="toggle-text">Ghea NQf Ba</span><div class="toggle-switch" id="cue-toggle" aria-label="Turn ADs On to help support the site"></div></div></div><div class="settings-section"><span class="settings-label">Pbybe Gurzr</span><div class="theme-grid"><div class="theme-option" data-theme="pink"><div class="theme-swatch pink"></div><span class="theme-name">Cvax</span></div><div class="theme-option" data-theme="red"><div class="theme-swatch red"></div><span class="theme-name">Erq</span></div><div class="theme-option" data-theme="blue"><div class="theme-swatch blue"></div><span class="theme-name">Oyhr</span></div><div class="theme-option" data-theme="green"><div class="theme-swatch green"></div><span class="theme-name">Terra</span></div><div class="theme-option" data-theme="dirty-gray"><div class="theme-swatch dirty-gray"></div><span class="theme-name">Qvegl Tenl</span></div><div class="theme-option" data-theme="spotify"><div class="theme-swatch spotify"></div><span class="theme-name">Pbby Terra</span></div><div class="theme-option" data-theme="custom"><div class="theme-swatch custom"><input id="custom-color-picker" type="color" value="#6cccafff"></div><span class="theme-name">Phfgbz</span></div></div></div><div class="settings-section"><span class="settings-label">Nobhg:Oynax Pybnxvat</span><div class="cloak-controls"><div class="form-group"><label for="cloak-title">Gno Gvgyr</label> <input id="cloak-title" type="text" value="Google" placeholder="Enter custom tab title"></div><button class="cloak-btn" id="open-cloak-btn">Open in About:Blank</button></div></div></div></div><div id="account-modal"><div class="account-content"><div class="account-header"><h2 class="account-title">Nppbhag</h2><button class="account-close" aria-label="Close account"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><line x1="18" x2="6" y1="6" y2="18"></line><line x1="6" x2="18" y1="6" y2="18"></line></svg></button></div><div class="account-profile"><div class="account-avatar-wrapper"><img alt="Avatar" src="" id="account-avatar"> <button class="avatar-reset-btn" id="avatar-reset-btn" aria-label="Reset avatar" title="Reset Avatar" type="button"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><line x1="18" x2="6" y1="6" y2="18"></line><line x1="6" x2="18" y1="6" y2="18"></line></svg></button> <label class="avatar-upload-btn" title="Change Avatar"><input id="avatar-upload" type="file" accept="image/*" style="display:none"> <svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" x2="12" y1="3" y2="15"></line></svg></label></div><span id="account-username"></span></div><div class="account-section"><span class="account-label">Cynlgvzr</span><div class="account-stats" id="playtime-stats"><div class="stat-loading">Ybnqvat...</div></div></div><div class="account-section"><span class="account-label">Pybhq Fnirf</span><div class="account-saves account-saves--cloud" id="cloud-saves" data-save-limit="10485760"><div class="stat-loading">Ybnqvat...</div></div></div><div class="account-section"><span class="account-label">Snibevgrf</span><div class="account-favorites" id="account-favorites"><div class="stat-loading">Ybnqvat...</div></div></div><div class="account-actions"><a href="dashboard.html" class="account-dashboard-btn">Ivrj Qnfuobneq</a> <button class="logout-btn" id="logout-btn">Ybtbhg</button></div></div></div><div class="crop-modal" id="crop-modal"><div class="crop-content"><div class="crop-header"><h3 class="crop-title">Pebc Ningne</h3><button class="crop-close-btn" aria-label="Cancel"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><line x1="18" x2="6" y1="6" y2="18"></line><line x1="6" x2="18" y1="6" y2="18"></line></svg></button></div><div class="crop-controls"><label class="zoom-label">Mbbz:</label> <button class="zoom-btn" id="zoom-out-btn">-</button> <input id="zoom-slider" type="range" value="100" max="300" min="100" step="10"> <button class="zoom-btn" id="zoom-in-btn">+</button></div><div class="crop-container"><canvas id="crop-canvas"></canvas><div class="crop-overlay"><div class="crop-area" id="crop-area"></div></div></div><div class="crop-actions"><button class="crop-btn crop-btn-cancel" id="crop-cancel-btn">Pnapry</button> <button class="crop-btn crop-btn-save" id="crop-save-btn">Hcybnq</button></div></div></div><script>!function(){var e=document.querySelector(".navbar");if(e){var t=!1,n=0;window.addEventListener("scroll",r,{passive:!0}),window.addEventListener("resize",r),window.addEventListener("load",r),document.addEventListener("DOMContentLoaded",r)}function i(e){if(!e)return 1/0;if(e.nodeType===Node.TEXT_NODE){if(!e.textContent||!e.textContent.trim())return 1/0;var t=document.createRange();t.selectNodeContents(e);var n=t.getBoundingClientRect();return n.width>0||n.height>0?n.top:1/0}if(e.nodeType!==Node.ELEMENT_NODE)return 1/0;var i=e.tagName;if("SCRIPT"===i||"STYLE"===i||"LINK"===i||"META"===i)return 1/0;var o=window.getComputedStyle(e);if("none"===o.display||"hidden"===o.visibility||0===parseFloat(o.opacity))return 1/0;var r=e.getBoundingClientRect();return r.width>0&&r.height>0?r.top:1/0}function o(){var n=document.querySelector(".main");if(n){var o=e.getBoundingClientRect(),r=function(e){for(var t=1/0,n=0;n<e.childNodes.length;n++){var o=i(e.childNodes[n]);o<t&&(t=o)}return Number.isFinite(t)?t:e.getBoundingClientRect().top}(n),d=r<=o.bottom+8;d!==t&&(t=d,e.classList.toggle("navbar-compact",t))}}function r(){n||(n=requestAnimationFrame(function(){n=0,o()}))}}()</script><script>!function(){var t="edurocks_cue_on";function e(t){var e=[t+"=","path=/","SameSite=Lax","max-age=0"];"https:"===window.location.protocol&&e.push("Secure"),document.cookie=e.join("; ")}function i(){return"adf.edurocks.org"===(window.location.hostname||"").toLowerCase()}function n(){return"1"===function(t){for(var e=t+"=",i=document.cookie?document.cookie.split(";"):[],n=0;n<i.length;n+=1){var o=i[n].trim();if(0===o.indexOf(e))return decodeURIComponent(o.slice(e.length))}return""}(t)}function o(){return i()||!n()}function r(t){if(!t)return null;var e="function"==typeof t.getBoundingClientRect?t.getBoundingClientRect():null;return{width:Math.max(t.scrollWidth||0,t.offsetWidth||0,t.clientWidth||0,e?e.width:0),height:Math.max(t.scrollHeight||0,t.offsetHeight||0,t.clientHeight||0,e?e.height:0)}}function d(t,e,i,n,o){var d=function(t,e,i){try{var n=t.contentDocument,o=n&&n.body,d=n&&n.documentElement;if(!o||!d)return null;var a=n.querySelector("[id^='container-']"),l=r(a),h=r(a&&a.firstElementChild),c=Math.max(l?l.width:0,h?h.width:0),u=Math.max(l?l.height:0,h?h.height:0),s=0;return Array.prototype.forEach.call(o.children||[],function(t){var e=(t.tagName||"").toLowerCase();if(e&&"script"!==e&&"style"!==e&&"link"!==e&&"meta"!==e&&"template"!==e){var i=r(t);i&&(i.width>0||i.height>0)&&(s+=1)}}),c>0||u>0?{width:Math.max(e||0,c),height:Math.max(i||0,u)}:s?{width:Math.max(e||0,o.scrollWidth,o.offsetWidth,d.scrollWidth,d.offsetWidth),height:Math.max(i||0,o.scrollHeight,o.offsetHeight,d.scrollHeight,d.offsetHeight)}:{width:Math.max(e||0,0),height:Math.max(i||0,0)}}catch(t){return null}}(i,n,o);if(d){var a="true"===t.getAttribute("data-cue-reveal-on-content");d.width>0&&(e.style.width=d.width+"px",t.style.setProperty("--cue-slot-width",d.width+"px"),i.width=String(Math.ceil(d.width)),i.style.width=d.width+"px",i.style.minWidth=d.width+"px"),d.height>0&&(e.style.minHeight=d.height+"px",t.style.setProperty("--cue-slot-height",d.height+"px"),i.height=String(Math.ceil(d.height)),i.style.height=d.height+"px"),a&&d.height>0&&(t.hidden=!1,t.style.display=t.getAttribute("data-slot-display")||"block")}}function a(t){if(t&&"true"!==t.dataset.cueMounted){var e=t.querySelector("template"),i=t.querySelector("[data-ad-mount]");if(e&&i){var n=Number(t.getAttribute("data-ad-width")||0),o=Number(t.getAttribute("data-ad-height")||0),r="true"===t.getAttribute("data-cue-reveal-on-content"),a=document.createElement("iframe");r?(t.hidden=!0,t.style.display="none"):(t.hidden=!1,t.style.display=t.getAttribute("data-slot-display")||"block"),t.dataset.cueMounted="true",i.replaceChildren(),a.setAttribute("title","Featured content"),a.setAttribute("loading","lazy"),a.setAttribute("scrolling","no"),a.setAttribute("referrerpolicy","no-referrer"),a.setAttribute("tabindex","-1"),a.setAttribute("aria-hidden","true"),i.style.width="",i.style.minHeight="",n>0?(a.width=String(n),a.style.width=n+"px",a.style.minWidth=n+"px",i.style.width=n+"px",t.style.setProperty("--cue-slot-width",n+"px")):a.style.width="100%",o>0?(a.height=String(o),a.style.height=o+"px",i.style.minHeight=o+"px",t.style.setProperty("--cue-slot-height",o+"px")):(a.height="0",a.style.height="0",i.style.minHeight="0",t.style.setProperty("--cue-slot-height","0px")),a.style.display="block",a.style.margin="0",a.style.padding="0",a.style.border="0",a.style.background="transparent",a.style.overflow="hidden",a.srcdoc=['<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">',"<style>html,body{margin:0;padding:0;width:100%;height:100%;overflow:hidden;background:transparent}body{display:flex;align-items:flex-start;justify-content:center}iframe{border:0;display:block;max-width:100%}</style>","</head><body>",e.innerHTML,"</body></html>"].join(""),i.appendChild(a),function(t,e,i,n,o){var r=null,a=0;function l(){i.isConnected&&d(t,e,i,n,o)}function h(){if(!r&&"function"==typeof ResizeObserver)try{var t=i.contentDocument;if(!t)return;r=new ResizeObserver(l),t.documentElement&&r.observe(t.documentElement),t.body&&r.observe(t.body)}catch(t){r=null}}i.addEventListener("load",function(){l(),h()});var c=window.setInterval(function(){a+=1,l(),1!==a&&4!==a||h(),(a>=80||!i.isConnected)&&window.clearInterval(c)},250);t.__cueCleanup=function(){window.clearInterval(c),r&&r.disconnect()},window.requestAnimationFrame(l)}(t,i,a,n,o)}}}function l(){document.querySelectorAll("[data-cue-slot-root]").forEach(function(t){if(o())return t.hidden=!0,t.style.display="none",void function(t){if(t){"function"==typeof t.__cueCleanup&&t.__cueCleanup(),t.__cueCleanup=null;var e=t.querySelector("[data-ad-mount]");e&&(e.replaceChildren(),e.style.removeProperty("width"),e.style.removeProperty("min-height")),t.style.removeProperty("--cue-slot-width"),t.style.removeProperty("--cue-slot-height"),delete t.dataset.cueMounted}}(t);a(t)})}window.edurocksGetCuePref=function(){var e=o(),r=!e;return{cookieName:t,cookieOn:n(),hostLocked:i(),enabled:r,blocked:e}},window.edurocksSetCuePref=function(n){return i()||(e("edurocks_cue_off"),n?(o=31536e3,r=[t+"="+encodeURIComponent("1"),"path=/","SameSite=Lax","max-age="+String(o)],"https:"===window.location.protocol&&r.push("Secure"),document.cookie=r.join("; ")):e(t),l()),window.edurocksGetCuePref();var o,r},document.addEventListener("DOMContentLoaded",l)}()</script><div class="shared-banner-slot shared-banner-slot-top" id="shared-banner-slot-top" data-ad-height="90" data-ad-width="728" data-cue-slot-root="" data-slot-display="block" hidden style="display:none;width:min(100%,calc(100vw - 24px));margin:12px auto 0;padding:0 9px;box-sizing:border-box;overflow-x:auto;overflow-y:visible"><div data-ad-mount="" style="display:flex;justify-content:center;align-items:flex-start;width:max-content;min-width:728px;min-height:90px;margin:0 auto"></div><template><script async data-cfasync="false" src="https://keyholedingy.com/cf7682ac8357d61774a6eb942a4aeebb/invoke.js"></script><div id="container-cf7682ac8357d61774a6eb942a4aeebb"></div></template></div><p class="seo-hidden-copy">CerX-12 Rkcnaq Lbhe Pynffebbz'f Cbffvovyvgvrf Gbtrgure, jr pna frg arj obhaqnevrf sbe jung'f cbffvoyr, qrfvtavat gbzbeebj'f pynffebbz jvgu grpuabybtl gung ranoyrf lbh gb crefbanyvmr, ratntr, naq vafcver. Rkcyber gur arj rqvgvba bs Pbeerpgvir Ernqvat Ng ZpTenj Uvyy, bhe zvffvba vf gb haybpx gur shyy cbgragvny bs rnpu yrneare. Jbexvat gbtrgure, jr ner urycvat gb perngr n oevtugre shgher sbe yrnearef nebhaq gur jbeyq. Guebhtu bhe pbzzvgzrag gb rdhnyvgl, npprffvovyvgl naq vapyhfvba, jr sbfgre n phygher bs orybatvat gung erfcrpgf naq ersyrpgf gur qvirefvgl bs gur crbcyr naq pbzzhavgvrf jr freir. Jr'er pbzzvggrq gb fhccbegvat rqhpngvba ol tvivat onpx gb gur pbzzhavgvrf jr freir. © 2025 ZpTenj Uvyy. Nyy Evtugf Erfreirq. Gbc Jr erfcrpg lbhe cevinpl. Jr hfr pbbxvrf gb raunapr fvgr anivtngvba, nanylmr hfntr, naq fhccbeg bhe znexrgvat rssbegf. Nqwhfg lbhe cersreraprf nalgvzr ol pyvpxvat Cevinpl Bcgvbaf be yrnea zber va gur ZpTenj Uvyy Cevinpl Pragre<div class="index-page index-page--prominent main"><div class="quote-box"><p id="quote"></div><div class="feature-grid"><a href="gxmes.html" class="feature-card"><div class="feature-icon"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><path d="M6 11h4"></path><path d="M8 9v4"></path><line x1="15" x2="15.01" y1="12" y2="12"></line><line x1="18" x2="18.01" y1="10" y2="10"></line><path d="M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z"></path></svg></div><h3 class="feature-title">Tnzrf</h3><p class="feature-desc">Cynl nal bs bhe 1300+ haoybpxrq tnzrf, ab qbjaybnqf, ab oybpxf</p></a><a href="kino.html" class="feature-card"><div class="feature-icon"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><rect height="20" width="20" x="2" y="2" rx="2.18" ry="2.18"></rect><line x1="7" x2="7" y1="2" y2="22"></line><line x1="17" x2="17" y1="2" y2="22"></line><line x1="2" x2="22" y1="12" y2="12"></line><line x1="2" x2="7" y1="7" y2="7"></line><line x1="2" x2="7" y1="17" y2="17"></line><line x1="17" x2="22" y1="17" y2="17"></line><line x1="17" x2="22" y1="7" y2="7"></line></svg></div><h3 class="feature-title">Zbivrf &amp; GI</h3><p class="feature-desc">Jngpu nal zbivr be GI fubj lbh jbhyq yvxr</p></a><a href="music.html" class="feature-card"><div class="feature-icon"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18V5l12-2v13"></path><circle cx="6" cy="18" r="3"></circle><circle cx="18" cy="16" r="3"></circle></svg></div><h3 class="feature-title">Zhfvp</h3><p class="feature-desc">Fgernz gur yvoenel be whzc vagb yvir enqvb fgngvbaf</p></a><a href="chat.html" class="feature-card"><div class="feature-icon"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg></div><h3 class="feature-title">Yvir Pung</h3><p class="feature-desc">Pung jvgu crbcyr npebff lbhe fpubby, naq npebff gur jbeyq, nyy pungf ner rapelcgrq, naq pna'g or ernq ol hf</p></a><a href="ai.html" class="feature-card"><div class="feature-icon"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><path d="M12 8V4H8"></path><rect height="8" width="20" x="2" y="8" rx="2"></rect><path d="M6 12h.01"></path><path d="M10 12h.01"></path><path d="M14 12h.01"></path><path d="M18 12h.01"></path><path d="M12 16v4"></path><path d="M8 20h8"></path></svg></div><h3 class="feature-title">NV</h3><p class="feature-desc">Hfr bhe RQHebpxf NV ba lbhe fpubbyjbex</p></a><a href="apps.html" class="feature-card"><div class="feature-icon"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round"><rect height="18" width="18" x="3" y="3" rx="2" ry="2"></rect><rect height="6" width="6" x="9" y="9"></rect><line x1="9" x2="9" y1="1" y2="7"></line><line x1="15" x2="15" y1="1" y2="7"></line><line x1="9" x2="9" y1="17" y2="23"></line><line x1="15" x2="15" y1="17" y2="23"></line><line x1="1" x2="7" y1="9" y2="9"></line><line x1="17" x2="23" y1="9" y2="9"></line><line x1="1" x2="7" y1="15" y2="15"></line><line x1="17" x2="23" y1="15" y2="15"></line></svg></div><h3 class="feature-title">Nccf</h3><p class="feature-desc">Hfrshy gbbyf naq hgvyvgvrf yvxr pnyphyngbef, rkgrafvbaf</p></a><a href="live-tv.html" class="feature-card"><div class="feature-icon"><svg fill="none" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect height="12" width="18" x="3" y="6" rx="2"></rect><line x1="8" x2="16" y1="20" y2="20"></line><line x1="12" x2="12" y1="18" y2="20"></line><line x1="8" x2="5" y1="6" y2="3"></line><line x1="16" x2="19" y1="6" y2="3"></line><circle cx="17.5" cy="12" r="0.75"></circle><circle cx="17.5" cy="14.5" r="0.75"></circle></svg></div><h3 class="feature-title">Yvir GI</h3><p class="feature-desc">Fgernz choyvpyl ninyvoyr yvir GI punaaryf guebhtug bhe cynlre.</p></a><img alt="flockimg" src="https://flock-public-assets.s3.amazonaws.com/tree_icon.png" style="display:none"> <img alt="secimage" src="https://prod-web-assets-securly.s3.us-west-1.amazonaws.com/images/ai-transparency-dashboard.webp" style="display:none"></div></div><div class="shared-banner-slot shared-banner-slot-bottom" id="shared-banner-slot-bottom" data-ad-height="90" data-ad-width="728" data-cue-slot-root="" data-slot-display="block" hidden style="display:none;width:min(var(--shell),calc(100% - 24px));margin:24px auto 30px;padding:0 9px 6px;box-sizing:border-box;overflow-x:auto;overflow-y:visible"><div data-ad-mount="" style="display:flex;justify-content:center;align-items:flex-start;width:max-content;min-width:728px;min-height:90px;margin:0 auto"></div><template><script async data-cfasync="false" src="https://keyholedingy.com/cf7682ac8357d61774a6eb942a4aeebb/invoke.js"></script><div id="container-cf7682ac8357d61774a6eb942a4aeebb"></div></template></div><div class="footer"><div>(RQHebpxf 4.1) Arj Tnzr, Unccl Cevqr Zbagu, Nyfb jr erzbirq gur cebkl! + svkrq n srj tnzrf.</div><div>Ynfg hcqngrq Znl 26gu, 2026 ng 00:07 HGP</div><div><a href="https://square.link/u/b5SBehwa">Pyvpx Urer gb Qbangr!!!</a> <a href="contact.html">Pbagnpg</a> <a href="oss.html">Bcra Fbhepr</a> <a href="https://stats.uptimerobot.com/z62RCQTD5Q">Hcgvzr</a> <a href="https://www.instagram.com/edurocksubg/">Vafgntenz</a> <a href="https://www.tiktok.com/@officialedurocks">GvxGbx</a> <a href="https://discord.gg/BXZvwDv7as">Qvfpbeq</a> <a href="links.html">Yvaxf</a> <a href="updates.html">Hcqngrf</a> <a href="privacy.html">Cevinpl Cbyvpl</a> <a href="tos.html">GBF</a></div></div><script>function rot13(e){return e?e.replace(/([^<&]+)|(<[^>]*>)|(&[^;\s]+;)/g,(e,t,a,n)=>t?t.replace(/[A-Za-z]/g,e=>{const t=e.charCodeAt(0);return t>=65&&t<=90?String.fromCharCode((t-65+13)%26+65):t>=97&&t<=122?String.fromCharCode((t-97+13)%26+97):e}):a||n):""}!function(){var e=/\bCrOS\b/.test(navigator.userAgent);function t(){if(window.self===window.top)return!1;try{return"about:blank"===window.top.location.href}catch(e){return!1}}window.edurocksOpenAboutBlank=function(a,n){if(!e)return null;if(!(n&&n.force||t()))return null;var o=(window.top&&window.top!==window?window.top:window).open("about:blank","_blank");if(!o)return null;var s=function(e){if(!e)return"";if(/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(e))return e;try{return new URL(e,window.location.href).href}catch(t){return e}}(a);return function(e,t,a){var n=a&&a.title||"Google Classroom",o=a&&a.favicon||"https://ssl.gstatic.com/classroom/favicon.png";e.document.write('<!DOCTYPE html><html style="margin:0;padding:0;height:100%;overflow:hidden;"><head><title>'+n+'</title><link rel="icon" type="image/x-icon" href="'+o+'"></head><body style="margin:0;padding:0;height:100%;overflow:hidden;"><iframe src="'+t+'" style="border:none;width:100%;height:100%;margin:0;padding:0;display:block;" allowfullscreen></iframe></body></html>'),e.document.close()}(o,s,n),o},window.edurocksIsChromeOS=e,window.edurocksIsInsideAboutBlank=t}(),function(){if(window.self===window.top&&/\bCrOS\b/.test(navigator.userAgent)&&!sessionStorage.getItem("edurocks-cloaked")){var e=window.location.href,t=!1;if(window.edurocksOpenAboutBlank&&(t=window.edurocksOpenAboutBlank(e,{force:!0})),!t){var a=window.open("about:blank","_blank");a&&(a.document.write('<!DOCTYPE html><html style="margin:0;padding:0;height:100%;overflow:hidden;"><head><title>Home - Classroom</title><link rel="icon" type="image/x-icon" href="https://ssl.gstatic.com/classroom/favicon.png"></head><body style="margin:0;padding:0;height:100%;overflow:hidden;"><iframe src="'+e+'" style="border:none;width:100%;height:100%;margin:0;padding:0;display:block;" allowfullscreen></iframe></body></html>'),a.document.close(),t=!0)}t&&(sessionStorage.setItem("edurocks-cloaked","true"),window.location.replace("https://classroom.google.com"))}}(),function(){if(window.edurocksIsChromeOS&&window.edurocksIsInsideAboutBlank&&window.edurocksIsInsideAboutBlank()&&window.edurocksOpenAboutBlank){var e=window.open;window.open=function(t,a,n){if("_blank"===a||""===a||void 0===a){var o=window.edurocksOpenAboutBlank(t);if(o)return o}return e.call(window,t,a,n)},document.addEventListener("click",function(e){var t=e.target.closest('a[target="_blank"], a[data-open-about-blank="true"]');if(t){e.preventDefault(),e.stopPropagation();var a=t.href;window.edurocksOpenAboutBlank(a)}},!0)}}();const CLOUD_SAVE_LIMIT_BYTES=10485760;function escapeHtml(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function formatCloudSaveSize(e){const t=Math.max(0,Number(e)||0);return t>=1048576?`${(t/1048576).toFixed(1)}MB`:t>=1024?`${Math.round(t/1024)}KB`:`${Math.round(t)}B`}function getCloudSaveSummary(e){const t=Object.values(e||{});let a=0,n=0;for(const e of t){const t=Array.isArray(e&&e.saves)?e.saves:[];a+=t.length,n+=t.reduce((e,t)=>e+(Number(t&&t.size)||0),0)}return{saveCount:t.length,totalKeys:a,totalSize:n,limitBytes:10485760,usedPercent:Math.max(0,Math.min(100,n/10485760*100))}}function buildCloudSaveUsageMarkup(e,t){const a=t||{},n="function"==typeof a.encode?a.encode:function(e){return e},o=escapeHtml(formatCloudSaveSize(e.totalSize)),s=escapeHtml(formatCloudSaveSize(e.limitBytes)),i=n(1===e.saveCount?"game":"games"),r=n(1===e.totalKeys?"key":"keys"),l=e.usedPercent>0?Math.max(e.usedPercent,1.2):0;return`<div class="save-storage-card"><div class="save-storage-header"><span class="save-storage-label">${n("Storage used")}</span><span class="save-storage-usage"><span class="save-storage-number">${o}</span> / <span class="save-storage-number">${s}</span></span></div><div class="save-storage-bar" role="progressbar" aria-valuemin="0" aria-valuemax="${e.limitBytes}" aria-valuenow="${e.totalSize}" aria-label="${escapeHtml(n("Cloud save storage used"))}"><span class="save-storage-fill" style="width:${l.toFixed(2)}%"></span></div><div class="save-storage-caption"><span class="save-storage-number">${e.totalKeys}</span> ${r} ${n("across")} <span class="save-storage-number">${e.saveCount}</span> ${i}</div></div>`}let backend;window.edurocksEscapeHtml=escapeHtml,window.edurocksCloudSaveLimitBytes=10485760,window.edurocksFormatCloudSaveSize=formatCloudSaveSize,window.edurocksGetCloudSaveSummary=getCloudSaveSummary,window.edurocksBuildCloudSaveUsageMarkup=buildCloudSaveUsageMarkup;const PRODUCTION_API_BASE="/apiv2/",DEV_API_BASE="/dev/apiv2/";function isIPv4Address(e){return/^(?:\d{1,3}\.){3}\d{1,3}$/.test(e)}function isPrivateIPv4Address(e){if(!isIPv4Address(e))return!1;const t=e.split(".").map(Number);return!t.some(e=>Number.isNaN(e)||e<0||e>255)&&(10===t[0]||(127===t[0]||(192===t[0]&&168===t[1]||(172===t[0]&&t[1]>=16&&t[1]<=31||(169===t[0]&&254===t[1]||0===t[0])))))}function isLocalIPv6Address(e){if(!e.includes(":"))return!1;const t=e.replace(/^\[|\]$/g,"").toLowerCase();return"::1"===t||t.startsWith("fe80:")||t.startsWith("fc")||t.startsWith("fd")}function hasDevbuildSubdomain(e){if(!e||e.includes(":"))return!1;const t=e.toLowerCase().split(".").filter(Boolean);return t.length>=3&&t.slice(0,-2).includes("devbuild")}function shouldUseProductionApi(){const e=(window.location.hostname||"").toLowerCase();return!!e&&("localhost"===e||(!!isPrivateIPv4Address(e)||(!!isLocalIPv6Address(e)||!!hasDevbuildSubdomain(e))))}function normalizeApiBase(e){return(e||"").replace(/\/+$/,"")}function hasDevServerHeader(e){if(!e||!e.headers)return!1;const t=(e.headers.get("x-edurocks-env")||"").toLowerCase(),a=(e.headers.get("x-edurocks-dev-build")||"").toLowerCase();return"devbuild"===t||"1"===a||"true"===a||"devbuild"===a}async function shouldUseDevApi(){try{return hasDevServerHeader(await fetch(window.location.href.split("#")[0],{method:"HEAD",cache:"no-store",credentials:"same-origin"}))}catch(e){return!1}}function buildBackendUrl(e){const t=normalizeApiBase(backend||"/apiv2/");if(!e)return t;const a=String(e).replace(/^\/+/,"");return a?`${t}/${a}`:t}async function getBackend(){return await shouldUseDevApi()?backend=normalizeApiBase(DEV_API_BASE):(shouldUseProductionApi(),backend=normalizeApiBase("/apiv2/"))}const gbp=getBackend();window.edurocksApiBasePromise=gbp,window.edurocksBuildBackendUrl=buildBackendUrl;const DEFAULT_GXXE_FRAME_PAGE="g-fra.html",SAB_GXXE_FRAME_PAGE="g-fra-sab.html";function isSabTaggedGame(e){return!(!e||"object"!=typeof e)&&(!0===e.sharedArrayBuffer||!0===e.sab)}function resolveGxxeFramePage(e){return isSabTaggedGame(e)?"g-fra-sab.html":"g-fra.html"}function normalizeGxxeCatalog(e){return e?Array.isArray(e)?e.map((e,t)=>{if(!e||"object"!=typeof e)return null;const a=void 0!==e.id&&null!==e.id&&""!==String(e.id).trim();return{...e,id:String(a?e.id:t)}}).filter(Boolean):"object"==typeof e?Object.entries(e).map(([e,t])=>{if(!t||"object"!=typeof t)return null;const a=void 0!==t.id&&null!==t.id&&""!==String(t.id).trim();return{...t,id:String(a?t.id:e)}}).filter(Boolean):[]:[]}function buildGxxeFrameHref(e,t){return`${t||"g-fra.html"}?id=${encodeURIComponent(String(e))}`}let gxxeFramePageMapPromise=null;async function getGxxeFramePageMap(){return gxxeFramePageMapPromise||(gxxeFramePageMapPromise=fetch("gxxes.json",{cache:"no-store"}).then(e=>e.ok?e.json():Promise.reject(new Error("catalog_fetch_failed"))).then(e=>{const t=new Map;for(const a of normalizeGxxeCatalog(e))a&&null!=a.id&&t.set(String(a.id),resolveGxxeFramePage(a));return t}).catch(()=>new Map)),gxxeFramePageMapPromise}function getStoredUsername(){return(localStorage.getItem("edurocks_username")||"").trim()}function getStoredDisplayName(){return(localStorage.getItem("edurocks_display_name")||"").trim()}function resolveDisplayName(){return getStoredDisplayName()||getStoredUsername()||"User"}function applyDisplayNameToUi(){const e=rot13(resolveDisplayName()),t=["username","account-username","dashboard-username"];for(const a of t){const t=document.getElementById(a);t&&(t.innerText=e)}}function setDisplayName(e){const t=(e||"").trim();t?localStorage.setItem("edurocks_display_name",t):localStorage.removeItem("edurocks_display_name"),applyDisplayNameToUi();try{window.dispatchEvent(new CustomEvent("edurocks-profile-updated",{detail:{type:"display-name",value:t}}))}catch{}}async function refreshDisplayName(){await gbp;try{const e=await fetch(buildBackendUrl("nick"),{credentials:"include"});if(!e.ok)return applyDisplayNameToUi();const t=await e.json();setDisplayName("string"==typeof t.nick?t.nick:"")}catch{applyDisplayNameToUi()}}function login(){var e=document.getElementById("login");e&&(e.style.display="flex",e.classList.add("visible"))}function show(){var e=document.getElementById("user");e&&(e.style.display="flex",e.classList.add("visible"))}window.edurocksBuildGxxeFrameHref=buildGxxeFrameHref,window.edurocksGetGxxeFramePageMap=getGxxeFramePageMap,window.edurocksResolveGxxeFramePage=resolveGxxeFramePage,window.setEdurocksDisplayName=setDisplayName,window.refreshEdurocksDisplayName=refreshDisplayName,window.getEdurocksDisplayName=resolveDisplayName,window.addEventListener("storage",function(e){e&&("edurocks_display_name"!==e.key&&"edurocks_username"!==e.key||applyDisplayNameToUi())}),window.addEventListener("edurocks-profile-updated",function(){applyDisplayNameToUi()}),(async()=>{applyDisplayNameToUi(),await gbp;const e=document.getElementById("avatar");e&&(e.src=buildBackendUrl("avatar")),refreshDisplayName()})(),function(){var e=localStorage.getItem("edurocks-dark-mode");(null===e||"true"===e)&&(document.body.classList.add("dark-mode"),document.documentElement.classList.add("dark-mode"))}(),function(){var e=localStorage.getItem("edurocks-theme")||"pink";if("custom"===e){var t=localStorage.getItem("edurocks-custom-color")||"#9333ea";window.applyCustomTheme&&window.applyCustomTheme(t,document.body)}else"pink"!==e&&(document.body.classList.add("theme-"+e),document.documentElement.classList.add("theme-"+e))}(),function(){const e=document.getElementById("settings-btn"),t=document.getElementById("settings-modal"),a=document.querySelector(".settings-close"),n=document.getElementById("dark-mode-toggle"),o=document.getElementById("cue-toggle"),s=document.querySelectorAll(".theme-option");if(!e||!t)return;function i(){if(o&&window.edurocksGetCuePref){var e=window.edurocksGetCuePref();o.classList.toggle("active",!!e.enabled),o.classList.toggle("is-disabled",!!e.hostLocked),o.setAttribute("aria-checked",e.enabled?"true":"false"),o.setAttribute("aria-disabled",e.hostLocked?"true":"false"),o.title=e.hostLocked?"Locked for this site host":e.enabled?"ADs are on. Thanks for supporting the site.":"ADs are off by default. Turn them on to help support the site."}}(document.body.classList.contains("dark-mode")||document.documentElement.classList.contains("dark-mode"))&&n&&n.classList.add("active"),i();var r=localStorage.getItem("edurocks-theme")||"pink";s.forEach(function(e){e.dataset.theme===r&&e.classList.add("active")});var l=document.getElementById("custom-color-picker"),d=document.querySelector(".theme-swatch.custom");if(l){var c=localStorage.getItem("edurocks-custom-color")||"#9333ea";l.value=c,d&&m(d,c)}function u(){var e=localStorage.getItem("edurocks-theme")||"pink",t=localStorage.getItem("edurocks-custom-color")||"#9333ea",a=localStorage.getItem("edurocks-dark-mode");"true"!==a&&"false"!==a&&(a=document.documentElement.classList.contains("dark-mode")?"true":"false"),document.querySelectorAll('a[href*="pubup/"]').forEach(function(n){var o=n.getAttribute("href");if(o&&"#"!==o[0]){var s;try{s=new URL(o,window.location.href)}catch(e){return}if(-1!==s.pathname.indexOf("/pubup/")||/\/pubup\/?$/.test(s.pathname)){s.searchParams.delete("theme"),s.searchParams.delete("color"),s.searchParams.delete("dark"),s.searchParams.set("theme",e),s.searchParams.set("dark",a),"custom"===e&&/^#[0-9a-fA-F]{6}$/.test(t)&&s.searchParams.set("color",t);var i=s.origin===window.location.origin?s.pathname+s.search+s.hash:s.toString();n.setAttribute("href",i)}}})}function m(e,t){var a=parseInt(t.slice(1,3),16),n=parseInt(t.slice(3,5),16),o=parseInt(t.slice(5,7),16),s="#"+((1<<24)+(Math.max(0,a-30)<<16)+(Math.max(0,n-30)<<8)+Math.max(0,o-30)).toString(16).slice(1);e.style.background="linear-gradient(135deg, "+t+", "+s+")"}u(),l&&(l.addEventListener("input",function(e){var t=e.target.value;localStorage.setItem("edurocks-custom-color",t),d&&m(d,t),"custom"===localStorage.getItem("edurocks-theme")&&window.applyCustomTheme&&(window.applyCustomTheme(t,document.documentElement),window.applyCustomTheme(t,document.body)),u()}),l.addEventListener("change",function(e){var t=document.querySelector('.theme-option[data-theme="custom"]');t&&!t.classList.contains("active")&&t.click(),u()})),e.addEventListener("click",function(e){e.preventDefault(),t.classList.add("active")}),a&&a.addEventListener("click",function(){t.classList.remove("active")}),t.addEventListener("click",function(e){e.target===t&&t.classList.remove("active")}),document.addEventListener("keydown",function(e){"Escape"===e.key&&t.classList.contains("active")&&t.classList.remove("active")});const p=document.getElementById("open-cloak-btn"),h=document.getElementById("cloak-title");function g(e){["--theme-primary","--theme-primary-light","--theme-primary-dark","--theme-primary-darker","--theme-bg-light-1","--theme-bg-light-2","--theme-bg-light-3","--theme-bg-dark-1","--theme-bg-dark-2","--theme-bg-dark-3","--theme-accent-light","--theme-accent","--theme-accent-soft","--theme-accent-softer","--theme-dark-primary","--theme-dark-primary-light","--theme-rgb","--theme-rgb-light","--theme-rgb-soft","--theme-rgb-primary","--theme-bg-dark-rgb"].forEach(function(t){e.style.removeProperty(t)})}p&&h&&p.addEventListener("click",function(){!function(e,t){const a=window.open("about:blank","_blank");if(a){const n=window.location.href;a.document.write(`\n                    <!DOCTYPE html>\n                    <html>\n                    <head>\n                        <title>${e}</title>\n                        <link rel="icon" type="image/x-icon" href="${t}">\n                        <style>\n                            body, html {\n                                margin: 0;\n                                padding: 0;\n                                width: 100%;\n                                height: 100%;\n                                overflow: hidden;\n                            }\n                            iframe {\n                                width: 100%;\n                                height: 100%;\n                                border: none;\n                            }\n                        </style>\n                    </head>\n                    <body>\n                        <iframe src="${n}"></iframe>\n                    </body>\n                    </html>\n                `),a.document.close()}}(h.value.trim()||"Google","data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAF0lEQVRIx2NgGAWjYBSMglEwCkbBSAcACBAAAeaR9cIAAAAASUVORK5CYII=")}),n&&n.addEventListener("click",function(){document.body.classList.toggle("dark-mode"),document.documentElement.classList.toggle("dark-mode"),n.classList.toggle("active");var e=document.body.classList.contains("dark-mode");localStorage.setItem("edurocks-dark-mode",String(e)),u()}),o&&window.edurocksGetCuePref&&window.edurocksSetCuePref&&o.addEventListener("click",function(){var e=window.edurocksGetCuePref();e.hostLocked||window.edurocksSetCuePref(!e.enabled),i()}),s.forEach(function(e){e.addEventListener("click",function(e){var t=this.dataset.theme,a=localStorage.getItem("edurocks-theme")||"pink";if("custom"===t&&l&&l.click(),"custom"===a?(g(document.documentElement),g(document.body)):"pink"!==a&&(document.body.classList.remove("theme-"+a),document.documentElement.classList.remove("theme-"+a)),"custom"===t){var n=localStorage.getItem("edurocks-custom-color")||"#9333ea";window.applyCustomTheme&&(window.applyCustomTheme(n,document.documentElement),window.applyCustomTheme(n,document.body))}else"pink"!==t&&(document.body.classList.add("theme-"+t),document.documentElement.classList.add("theme-"+t));s.forEach(function(e){e.classList.remove("active")}),this.classList.add("active"),localStorage.setItem("edurocks-theme",t),u()})})}(),function(){const e=document.getElementById("user"),t=document.getElementById("account-modal"),a=document.querySelector(".account-close"),n=document.getElementById("logout-btn"),o=document.getElementById("avatar-upload"),s=document.getElementById("avatar-reset-btn"),i=document.getElementById("account-avatar"),r=document.getElementById("account-username"),l=document.getElementById("playtime-stats"),d=document.getElementById("cloud-saves"),c=document.getElementById("account-favorites");if(!e||!t)return;async function u(){await gbp,i&&(i.src=buildBackendUrl("avatar")),window.refreshEdurocksDisplayName&&await window.refreshEdurocksDisplayName(),r&&(r.innerText=rot13(window.getEdurocksDisplayName&&window.getEdurocksDisplayName()||"User"));const[e,t,a]=await Promise.all([fetch(buildBackendUrl("playtime"),{credentials:"include"}).catch(()=>null),fetch(buildBackendUrl("gxxes"),{credentials:"include"}).catch(()=>null),fetch(buildBackendUrl("favorites"),{credentials:"include"}).catch(()=>null)]);if(e&&e.ok)try{const t=await e.json();if(Array.isArray(t)&&t.length>0){const e=t.reduce((e,t)=>e+t.seconds,0),a=Math.floor(e/60),n=Math.floor(a/60),o=a%60,s=rot13(n>0?`${n}h ${o}m`:`${o}m`);let i=`<div class="total-playtime">${rot13("Total")}: <span class="total-time">${s}</span></div>`;i+='<div class="stats-list">';const r=e=>{if(!e||null==e.last_played)return 0;if("number"==typeof e.last_played)return e.last_played<1e12?1e3*e.last_played:e.last_played;const t=Date.parse(e.last_played);return Number.isNaN(t)?0:t},d=e=>{const t=new Date(e);if(Number.isNaN(t.getTime()))return rot13("Unknown");return rot13(t.toLocaleString(void 0,{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit"}))},c=t.slice().sort((e,t)=>{const a=r(t)-r(e);return 0!==a?a:(t.seconds||0)-(e.seconds||0)}),u=6,m=c.slice(0,u);for(const e of m){const t=e.seconds,a=Math.floor(t/60),n=Math.floor(a/60),o=a%60,s=t%60;let l;l=rot13(n>0?`${n}h ${o}m`:o>0?`${o}m ${s}s`:`${s}s`);const c=r(e),u=c?d(c):rot13("Unknown");i+='<div class="stat-item">',i+='<div class="stat-row">',i+=`<span class="stat-name">${rot13(e.name)}</span>`,i+=`<span class="stat-value">${l}</span>`,i+="</div>",i+=`<div class="stat-meta">${rot13("Last played")}: ${u}</div>`,i+="</div>"}i+="</div>",l.innerHTML=i}else l.innerHTML='<div class="stat-empty">'+rot13("No playtime recorded")+"</div>"}catch{l.innerHTML='<div class="stat-empty">'+rot13("Could not load playtime")+"</div>"}else l.innerHTML='<div class="stat-empty">'+rot13("Could not load playtime")+"</div>";if(t&&t.ok)try{const e=await t.json(),a=getCloudSaveSummary(e),n=a.saveCount;if(n>0){let t='<div class="save-storage-overview">';t+=`<div class="stat-summary"><span class="stat-count">${n}</span> ${1!==n?"tnzrf":"tnzr"} (${rot13(formatCloudSaveSize(a.totalSize))} ${rot13("total")})</div>`,t+=buildCloudSaveUsageMarkup(a,{encode:rot13}),t+="</div>",t+='<div class="saves-list">';for(const[a,n]of Object.entries(e)){const e=escapeHtml(formatCloudSaveSize(n.saves.reduce((e,t)=>e+t.size,0))),o=escapeHtml(rot13(n.name||""));t+=`<div class="save-gxxe-item" data-gxxe-id="${a}">`,t+='<div class="save-gxxe-header">',t+='<div class="save-gxxe-info">',t+=`<button class="save-expand-btn" type="button" aria-label="${escapeHtml(rot13("Expand"))}" title="${escapeHtml(rot13("Expand"))}">`,t+='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"></polyline></svg>',t+="</button>",t+=`<span class="stat-name">${o}</span>`,t+="</div>",t+='<div class="save-gxxe-actions">',t+=`<span class="stat-value"><span class="save-storage-number">${n.saves.length}</span> ${rot13(1!==n.saves.length?"keys":"key")} <span class="save-gxxe-size">(${e})</span></span>`,t+=`<button class="delete-saves-btn delete-all-saves" type="button" data-gxxe-id="${a}" title="${escapeHtml(rot13("Delete all saves for this game"))}" aria-label="${escapeHtml(rot13("Delete all saves for this game"))}">`,t+='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"></polyline><path d="m19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg>',t+="</button>",t+="</div>",t+="</div>",t+='<div class="save-keys-list" style="display:none;">';for(const e of n.saves){const n=escapeHtml(formatCloudSaveSize(e.size)),o=String(e.key||""),s=o.length>30?o.substring(0,27)+"...":o;t+=`<div class="save-key-item" data-size="${Number(e.size)||0}">`,t+=`<span class="save-key-name" title="${escapeHtml(o)}">${escapeHtml(s)}</span>`,t+='<div class="save-key-actions">',t+=`<span class="save-key-size" data-bytes="${Number(e.size)||0}">${n}</span>`,t+=`<button class="delete-key-btn" type="button" data-gxxe-id="${a}" data-key="${escapeHtml(o)}" title="${escapeHtml(rot13("Delete this key"))}" aria-label="${escapeHtml(rot13("Delete this key"))}">`,t+='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"></polyline><path d="m19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg>',t+="</button>",t+="</div>",t+="</div>"}t+="</div>",t+="</div>"}t+="</div>",d.innerHTML=t}else d.innerHTML='<div class="stat-empty">'+rot13("No cloud saves")+"</div>"}catch(e){console.error("Failed to load saves",e),d.innerHTML='<div class="stat-empty">'+rot13("Could not load saves")+"</div>"}else d.innerHTML='<div class="stat-empty">'+rot13("Could not load saves")+"</div>";if(a&&a.ok)try{const e=await a.json();if(Array.isArray(e)&&e.length>0){const t=await getGxxeFramePageMap();let a='<div class="favorites-grid">';const n=15;for(const o of e.slice(0,n)){const e=t.get(String(o.id))||"g-fra.html";a+=`<a href="${buildGxxeFrameHref(o.id,e)}" class="favorite-gxxe-card">`,a+=`<img src="${o.img}" loading="lazy" alt="${o.name}">`,a+=`<span class="favorite-gxxe-name">${rot13(o.name)}</span>`,a+="</a>"}if(a+="</div>",e.length>n){e.length;a+='<a href="gxmes.html?sort=favorited" class="favorites-more-btn">',a+=`<span>${rot13("View all")} ${e.length} ${rot13("favorites")}</span>`,a+='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"></polyline></svg>',a+="</a>"}c.innerHTML=a}else c.innerHTML='<div class="stat-empty">'+rot13("No favorites yet")+"</div>"}catch{c.innerHTML='<div class="stat-empty">'+rot13("Could not load favorites")+"</div>"}else c.innerHTML='<div class="stat-empty">'+rot13("Could not load favorites")+"</div>"}async function m(e){await gbp;if(!(await fetch(buildBackendUrl("avatar"),{method:"POST",credentials:"include",headers:{"Content-Type":e.type||"image/png"},body:e})).ok)throw new Error("Upload failed");const t=buildBackendUrl(`avatar?t=${Date.now()}`);i&&(i.src=t);const a=["avatar","dashboard-avatar"];for(const e of a){const a=document.getElementById(e);a&&(a.src=t)}}d.addEventListener("click",async function(e){const t=e.target.closest(".save-expand-btn");if(t){e.preventDefault();const a=t.closest(".save-gxxe-item").querySelector(".save-keys-list"),n="none"!==a.style.display;return a.style.display=n?"none":"block",void t.classList.toggle("expanded",!n)}const a=e.target.closest(".delete-all-saves");if(a){e.preventDefault(),e.stopPropagation();const t=a.dataset.gxxeId,n=a.closest(".save-gxxe-item").querySelector(".stat-name").textContent;if(!confirm(`Delete all cloud saves for ${rot13(n)}? This cannot be undone.`))return;try{await gbp,a.disabled=!0,a.style.opacity="0.5";const e=await fetch(buildBackendUrl(`gxxe/delete/${t}`),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(e.ok)u();else{const t=await e.json();alert(t.error||"Failed to delete saves"),a.disabled=!1,a.style.opacity="1"}}catch(e){console.error("Failed to delete saves",e),alert("Failed to delete saves"),a.disabled=!1,a.style.opacity="1"}return}const n=e.target.closest(".delete-key-btn");if(n){e.preventDefault(),e.stopPropagation();const t=n.dataset.gxxeId,a=n.dataset.key;if(!confirm(`Delete save key "${a}"? This cannot be undone.`))return;try{await gbp,n.disabled=!0,n.style.opacity="0.5";const e=await fetch(buildBackendUrl(`gxxe/delete/${t}`),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({keys:[a]})});if(e.ok)u();else{const t=await e.json();alert(t.error||"Failed to delete key"),n.disabled=!1,n.style.opacity="1"}}catch(e){console.error("Failed to delete key",e),alert("Failed to delete key"),n.disabled=!1,n.style.opacity="1"}}}),e.addEventListener("click",function(e){e.preventDefault(),t.classList.add("active"),u()}),e.addEventListener("keydown",function(e){"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),t.classList.add("active"),u())}),a&&a.addEventListener("click",function(){t.classList.remove("active")}),t.addEventListener("click",function(e){e.target===t&&t.classList.remove("active")}),document.addEventListener("keydown",function(e){"Escape"===e.key&&t.classList.contains("active")&&t.classList.remove("active")}),s&&s.addEventListener("click",async function(e){e.preventDefault();try{await gbp;if((await fetch(buildBackendUrl("avatar"),{method:"DELETE",credentials:"include"})).ok){const e=buildBackendUrl(`avatar?t=${Date.now()}`);i&&(i.src=e);const t=["avatar","dashboard-avatar"];for(const a of t){const t=document.getElementById(a);t&&(t.src=e)}}else{const e=await fetch("/default-avatar.png",{cache:"no-store"});if(!e.ok)throw new Error("Default avatar missing");const t=await e.blob();await m(t)}}catch{alert("Failed to reset avatar")}});let p=null,h=null,g=1,v=200,f=0,y=0,w=0,k=0,b=0,E=0;const x=document.getElementById("crop-modal"),L=document.getElementById("crop-canvas"),S=document.getElementById("crop-area"),A=document.getElementById("crop-save-btn"),I=document.getElementById("crop-cancel-btn"),B=document.querySelector(".crop-close-btn"),C=document.getElementById("zoom-slider"),M=document.getElementById("zoom-in-btn"),P=document.getElementById("zoom-out-btn");function $(){const e=window.innerWidth<=640?68:120,t=window.innerWidth<=640?360:320,a=Math.max(180,window.innerWidth-e),n=Math.max(180,window.innerHeight-t);return Math.max(180,Math.min(400,a,n))}function D(){if(!h||!L||!S)return;const e=L.getContext("2d");if(!e)return;if(!f||!y){const e=$();let t=1;(h.width>e||h.height>e)&&(t=Math.min(e/h.width,e/h.height)),f=Math.max(1,Math.round(h.width*t)),y=Math.max(1,Math.round(h.height*t))}L.width=f,L.height=y,w=Math.max(f,Math.round(f*g)),k=Math.max(y,Math.round(y*g)),b=Math.round((L.width-w)/2),E=Math.round((L.height-k)/2),e.clearRect(0,0,L.width,L.height),e.drawImage(h,b,E,w,k),v=Math.min(200,L.width,L.height),S.style.width=v+"px",S.style.height=v+"px";let t=Number.parseInt(S.style.left,10),a=Number.parseInt(S.style.top,10);Number.isFinite(t)&&Number.isFinite(a)||(t=Math.round((L.width-v)/2),a=Math.round((L.height-v)/2));const n=Math.max(0,L.width-v),o=Math.max(0,L.height-v);t=Math.max(0,Math.min(t,n)),a=Math.max(0,Math.min(a,o)),S.style.left=t+"px",S.style.top=a+"px"}function T(){x.classList.remove("active"),o.value="",p=null,h=null,F=!1,z=null,S&&S.classList.remove("is-dragging"),f=0,y=0,w=0,k=0,b=0,E=0,S&&(S.style.removeProperty("left"),S.style.removeProperty("top"),S.style.removeProperty("width"),S.style.removeProperty("height"))}o&&o.addEventListener("change",function(e){const t=e.target.files[0];if(!t)return;if(!t.type.startsWith("image/"))return alert("Please select an image file"),void(o.value="");p=t;const a=new FileReader;a.onload=function(e){const t=new Image;t.onload=function(){h=t,function(e){const t=$();let a=1;(e.width>t||e.height>t)&&(a=Math.min(t/e.width,t/e.height));f=Math.max(1,Math.round(e.width*a)),y=Math.max(1,Math.round(e.height*a)),L&&(L.style.width=f+"px",L.style.height=y+"px");g=1,C.value=100,S.style.removeProperty("left"),S.style.removeProperty("top"),D(),x.classList.add("active")}(t)},t.src=e.target.result},a.readAsDataURL(t)}),I&&I.addEventListener("click",T),B&&B.addEventListener("click",T),window.addEventListener("resize",function(){x&&x.classList.contains("active")&&h&&(f=0,y=0,D())}),C&&C.addEventListener("input",function(){g=parseInt(this.value)/100,D()}),M&&M.addEventListener("click",function(){const e=Math.min(300,parseInt(C.value)+10);C.value=e,g=e/100,D()}),P&&P.addEventListener("click",function(){const e=Math.max(100,parseInt(C.value)-10);C.value=e,g=e/100,D()}),A&&A.addEventListener("click",async function(){const e=parseInt(S.style.left),t=parseInt(S.style.top),a=document.createElement("canvas");a.width=200,a.height=200;const n=a.getContext("2d"),o=w||L.width,s=k||L.height,i=h.width/o,r=h.height/s,l=v*i,d=v*r,c=Math.max(0,Math.min((e-b)*i,h.width-l)),u=Math.max(0,Math.min((t-E)*r,h.height-d));n.drawImage(h,c,u,l,d,0,0,200,200),a.toBlob(async function(e){try{await m(e),T()}catch{alert("Failed to upload avatar")}},"image/png")});let N,U,H,_,F=!1,z=null;if(S){const e=function(e,t){let a=H+(e-N),n=_+(t-U);const o=Math.max(0,L.width-v),s=Math.max(0,L.height-v);a=Math.max(0,Math.min(a,o)),n=Math.max(0,Math.min(n,s)),S.style.left=a+"px",S.style.top=n+"px"},t=function(e){null!==z&&e&&e.pointerId!==z||(F=!1,S.classList.remove("is-dragging"),null!==z&&S.hasPointerCapture&&S.hasPointerCapture(z)&&S.releasePointerCapture(z),z=null)};S.addEventListener("pointerdown",function(e){F=!0,z=e.pointerId,N=e.clientX,U=e.clientY,H=Number.parseInt(S.style.left,10)||0,_=Number.parseInt(S.style.top,10)||0,S.classList.add("is-dragging"),S.setPointerCapture&&S.setPointerCapture(e.pointerId),e.preventDefault()}),S.addEventListener("pointermove",function(t){F&&t.pointerId===z&&e(t.clientX,t.clientY)}),S.addEventListener("pointerup",t),S.addEventListener("pointercancel",t)}n&&n.addEventListener("click",async function(){try{await gbp;(await fetch(buildBackendUrl("logout"),{method:"POST",credentials:"include"})).ok?(localStorage.removeItem("edurocks_username"),localStorage.removeItem("edurocks_display_name"),window.location.href="login.html"):alert("Failed to logout")}catch{alert("Failed to logout")}})}(),function(){const e=document.getElementById("mobile-menu-btn"),t=document.getElementById("mobile-drawer"),a=document.getElementById("mobile-drawer-overlay"),n=document.getElementById("mobile-drawer-close");function o(){t.classList.remove("active"),a.classList.remove("active"),document.body.style.overflow=""}e&&t&&a&&(e.addEventListener("click",function(){t.classList.add("active"),a.classList.add("active"),document.body.style.overflow="hidden"}),a.addEventListener("click",o),n&&n.addEventListener("click",o),document.addEventListener("keydown",function(e){"Escape"===e.key&&t.classList.contains("active")&&o()}))}(),function(){var e=document.getElementById("rot13-sentinel");if(e){var t="ROT13_CHECK"===(e.textContent||"").trim();if(e.remove(),t&&"function"==typeof rot13){for(var a=new Set(["SCRIPT","STYLE","NOSCRIPT","HEAD","TITLE","OPTION","BUTTON","CODE"]),n=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,null),o=[];n.nextNode();)o.push(n.currentNode);o.forEach(function(e){var t=e.parentElement;if(t){var n=t.tagName;if(!(n&&a.has(n)||t.getAttribute&&"display:none"===t.getAttribute("style")||t.classList&&t.classList.contains("logo"))){for(var o=t;o;){if(o.getAttribute&&"font-family:Verdana"===o.getAttribute("style"))return;o=o.parentElement}e.nodeValue=rot13(e.nodeValue)}}})}}}()</script><script>const quotes=["Made with HTML!","Giving you the tools to fight censorship since 2024.","We are produdly anti-apartheid and anti-censorship","It is during our darkest moments that we must focus to see the light.","The way to get started is to quit talking and begin doing.","This is our like fifth UI design","We are a 11 person team. If you would like to join us then shoot us an email at allhands@edurocks.org","From the river to the sea Palestine will be free!!! ","EDUrocks proudly supports LGBTQIA+ Rights!!!","EDUrocks proudly opposes ID age verification on the web!!!","EDUrocks says trans and gay rights!!!","Stand up for what you believe in regardless of what opposition you may face.","EDUrocks exists out of a need not out of a want. Censorship is a poison to society that should be fought against.","Be careful on your managed devices your Systems Admin can see everything you do. (unless you use our site)","You learn more from failure than from success. Don't let it stop you. Failure builds character.","It's not whether you get knocked down, it's whether you get up.","If you are working on something that you really care about, you don't have to be pushed. The vision pulls you.","Request features we should add","People who are crazy enough to think they can change the world, are the ones who do.","Failure will never overtake me if my determination to succeed is strong enough.","GoGuardian is by definition spyware.","Israel is an apartheid state.","We love all our users, they are what powers EDUrocks.","EDUrocks lives and is served from servers in 6 continents across the world.","EDUrocks has servers in the United States, Germany, China, Mexico, and Russia, and unlisted servers elsewhere.","Subscribe to <a href='https://youtube.com/@prodbyhidakii' target='_blank'>prodbyhidakii</a> pls.","I don't have time to read <a href='https://en.wikipedia.org/w/index.php?title=Boys%27_love&oldid=1311601076' //target='_blank'>Yaoi</a> because i work on this site.","This site is 100% supported by user donations.","When looking for "+rot13("tnzr")+" sites make sure to ask for the real EDUrocks.","We now have a TikTok. <a href='https://tiktok.com/@officialedurocks' target='_blank'>Click to follow.</a>  ","We proudly support human rights for everyone","One of the few privacy respecting unblocked "+rot13("tnzr")+"s sites.","WE HAVE HIT 30K USERS <a href='/page4.html' target='_blank'>Click to learn more.</a> !!!!","They tried to sue us and failed. <a href='/page4.html' target='_blank'>Click to learn more.</a> !!!!","Try our new (and working) EDUrocks Chat. <a href='/filestorage/Apps/chat/' target='_blank'>Click to check it out.</a> !!!!","You can get all the links to EDUrocks by emailing links@edurocks.org or links@blahaj.li, you will get an auto reply with all the //links to EDUrocks.","Spell check done by Pop","All the world will be your enemy, Prince with a Thousand Enemies, and whenever they catch you, they will kill you. But first //they must catch you, digger, listener, runner, prince with the swift warning. Be cunning and full of tricks and your people shall //never be destroyed. ― Richard Adams","Thanks to <a href='https://okayunn.site' target='_blank'>okayunn</a> for providing the EDUrocks US Server","We got a 80/100 on our Code Audit, and a 100/100 on our Security Audit!!!","To whoever asked me to add 'NU CARNIVAL' this "+rot13("tnzr")+" is so peak, i love it and i love the person who asked for it, //sadly i can't add it to EDUrocks :(","I BUILT THIS SITE ROCK BY ROCK AND NO SCHOOL ADMINS CAN MAKE ME STOP.","X3 PREDICTOR GOT NOTHING ON US!!!","Uhh yeah so we bypassed GoGuardian again, Censorship will never win or sum like that, Thanks to Tunnel Colt for the help.","Yall should follow our insta @edurocksubg","We are the first UBG site to have live tv support.","Unblocked at 9/10 Schools","It's the owner of the site","Did you know EDUrocks has been used in atleast one school in all 50 states?","If the site is blocked or you want a "+rot13("tnzr")+", you can call or text us at (404) 913-YAOI","Join our discord. <a href='https://discord.gg/BXZvwDv7as' target='_blank'>Click to Join.</a>  ","The Only UBG with a Twink Mascot, WE LOVE ROXXIE!!!","We are up to EDUrocks 4.1 now","Censorship is telling a man he can't have a steak just because a baby can't chew it. - Mark Twain","One of the few sites holding off GoGuardian & Securly","EDUrocks always encrypts your data, and keeps no logs on our users accounts. We are committed to protecting your privacy and safety","EDUrocks does not take responsibility for punishents from your Admins.","Yurachin Bitch Club is highkey PEAK!","A Society That Gives Up Freedom For Saftey Will Lose Both!","Did you know EDUrocks serves 90 TB's of content to its users every month?","Did you know one of our game ports is on Selenite, GN-Math, and Truffled?","wassap giysß","If you want the site to be faster, help us get a better server and donate to EDUrocks <a href='https://square.link/u/b5SBehwa' //target='_blank'>here</a> (we take card, cash app, google and apple pay, and afterpay. So like PLZ donate!"],seen=new Set(JSON.parse(localStorage.getItem("edurocks-seen")||"[]"));let unseen=quotes.map((e,o)=>({e:e,i:o})).filter(e=>!seen.has(e.i));0==unseen.length&&(unseen=quotes.map((e,o)=>({e:e,i:o})),seen.clear());const q=unseen[Math.floor(Math.random()*unseen.length)];seen.add(q.i),localStorage.setItem("edurocks-seen",JSON.stringify(Array.from(seen))),document.getElementById("quote").innerHTML=rot13(q.e);let googleIdentityPromise,busy=!1;function loadGoogleIdentity(){return window.google&&window.google.accounts&&window.google.accounts.id?Promise.resolve(window.google):googleIdentityPromise||(googleIdentityPromise=new Promise((e,o)=>{const t=document.createElement("script");t.src="https://accounts.google.com/gsi/client",t.async=!0,t.defer=!0,t.onload=()=>{window.google&&window.google.accounts&&window.google.accounts.id?e(window.google):o(new Error("Google Identity API unavailable"))},t.onerror=()=>o(new Error("Failed to load Google Identity script")),document.head.appendChild(t)}),googleIdentityPromise)}window.addEventListener("load",async()=>{if(!localStorage.getItem("edurocks_username"))try{await loadGoogleIdentity(),google.accounts.id.initialize({client_id:"719702384336-lhvfsihfupm03h5d76n42fuaul4pp151.apps.googleusercontent.com",auto_select:!0,itp_support:!0,callback:async e=>{if(!busy){busy=!0;try{await gbp;const o=await fetch(buildBackendUrl("login/google"),{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({token:e.credential})}),t=await o.json();if(!o.ok)throw t.error;localStorage.setItem("edurocks_username",t.username),localStorage.removeItem("edurocks_display_name"),window.location.reload()}catch(e){console.error("Google login failed:",e),busy=!1}}}}),google.accounts.id.prompt()}catch(e){console.error("Google One Tap unavailable:",e)}})</script>