class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,e,i){this.blockHeight=`${t}`,this.txValueCache=e,this.parcelId=i?Number(i.split(":").pop()):null,this.loadRoutine()}async loadRoutine(){const t=await fetch("/r/sat/717782964543142/at/-1").then((t=>t.json())),e=await fetch(`/content/${t.id}`).then((async t=>atob(await t.text()))),i=await fetch("/r/sat/717782965662484/at/-1").then((t=>t.json())),n=await fetch(`/content/${i.id}`).then((async t=>JSON.parse(decodeURIComponent(escape(atob(await t.text()))))));window.enableApp=window.fullScreen||window.innerWidth==screen.width||window.innerWidth>=n.enableApp&&screen.width>=n.enableApp,window.enableRecursion=window.innerWidth>=n.enableRecursion&&screen.width>=n.enableRecursion,window.tipSatAmount=n.tipSatAmount,window.parcelHighLight=n.parcelHighLight,window.enableQG="518357"===this.blockHeight&&n.enableQG;const o=!(!window.enableQG||!window.enableApp||!window.ethereum&&!window.XverseProviders),s=o&&await fetch("/r/sat/717782964480455/at/-1").then((t=>t.json())),a=o&&await fetch(`/content/${s.id}`).then((async t=>JSON.parse(decodeURIComponent(escape(atob(await t.text()))))));if(window.tipCreator=o&&n.tipCreator,window.ethContracAbi=o&&a.ethContracAbi,o){const t=await fetch("/r/sat/717782964530533/at/-1").then((t=>t.json())),i=await fetch(`/content/${t.id}`),s=document.createElement("script");s.innerHTML=decodeURIComponent(escape(atob(await i.text()))),document.body.appendChild(s);const r=o&&await fetch("/r/sat/717782965138207/at/-1").then((t=>t.json())),l=o&&await fetch(`/content/${r.id}`),h=o&&document.createElement("script");h.innerHTML=decodeURIComponent(escape(atob(await l.text()))),document.body.appendChild(h),window.assetName=`${null!==this.parcelId?this.parcelId+"."+this.blockHeight:this.blockHeight}.bitmap`,"518357"===this.blockHeight?window.titleName=`NAKAMOTO MATRIX ${window.assetName} ${null!==this.parcelId?"parcel":""}`:window.titleName=window.assetName,window.introMsg=`Welcome to ${window.titleName} on Blocks Of Bitcoin! This ${"518357"===this.blockHeight?"Nakamoto rare sat inscription":"metaverse property"} lives forever on Bitcoin!>This onchain asset is a Bitmap 3D upgrade and a key to the future of the BTC metaverse.>${window.enableQG?"It showcases that AIs and ETH smart contracts can be built as BTC Ordinals on Bitcoin!!>Will you explore this brave new digital world?":""}`,window.ethContractAddress=n.evm[e].contractAddress,window.targetChainName=a.evm[e].chainName,window.quark20Msg=n.quark20Msg,window.targetChainId=a.evm[e].id,window.targetChainRPC=a.evm[e].rpc,window.targetChainExplorer=a.evm[e].explorer,window.targetChainCurrencyName=a.evm[e].currencyName,window.targetChainCurrencySymbol=a.evm[e].currencySymbol,initGate()}const r=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),l=document.createElement("script");l.innerHTML=await r.text(),document.body.appendChild(l);const h=document.createElement("div");function d(t){const e=new Uint8Array(t.length/2);for(var i=0;i<e.length;i++)e[i]=parseInt(t.substring(2*i,2*i+2),16);return e.buffer}h.setAttribute("id","css3d"),document.body.appendChild(h),document.getElementById("css3d").style="margin: 0; overflow: hidden; position: absolute; top: 0px;";const c={};let w=null,p={},f=[],m=!1;window.selfInscriptionId,window.canCheckInventory=!1,null!==this.parcelId||(m=!0);if(w=(t=>{t=BigInt(t);const e=5000000000n,i=210000n,n=t=>e/2n**t,o=t/i;let s=0n;for(let t=0n;t<o;t++)s+=n(t)*i;return s+=t%i*n(o),String(s)})(this.blockHeight),Number(this.blockHeight)<84e4){const t=await import("/content/d36f3434809b4b4bed7da6c17d45fbb3e72b89d31f3334d9d34e168519b51bd9i0"),e=await t.getBitmapSat(Number(this.blockHeight)),i=await fetch(`/r/sat/${e}/at/-1`).then((t=>t.json()));try{const t=await fetch(`/r/metadata/${i.id}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${i.id} metadata not found`)})).then((t=>CBOR.decode(d(t.replace(/"/g,"")))));if(Number(t.blockHeight)===Number(this.blockHeight)&&(w=e,m)){window.selfInscriptionId=i.id,window.canCheckInventory=!0,window.selfSat=e;const t=await fetch(`/r/inscription/${i.id}`).then((t=>t.json()));window.ownerAddress=t.address}}catch(t){}}if((window.enableApp||window.enableRecursion)&&w){const t=await fetch(`/r/sat/${w}/at/-1`).then((t=>t.json()));let e=!0,i=0;try{if(t&&t.id)for(;e;){const n=await fetch(`/r/children/${t.id}/inscriptions/${i}`).then((t=>t.json()));e=n.more,f=f.concat(n.children),i+=1}}catch(t){}if(f.length>0){let t=!1;const e=m?0:797===this.parcelId?1:this.parcelId;for(let i=0+e;i<f.length+e;i++){const e=f[i];m?fetch(`/r/metadata/${e.id}`).then((async t=>{if(t.ok)return await t.text()})).then((t=>CBOR.decode(d(t.replace(/"/g,""))))).then((t=>{if(t&&t.parcelId){const i=Number(t.parcelId.split(":").pop());i in c||(c[i]=e.id)}})).catch((t=>{})):t||await fetch(`/r/metadata/${e.id}`).then((async t=>{if(t.ok)return await t.text()})).then((t=>CBOR.decode(d(t.replace(/"/g,""))))).then((async i=>{if(i&&i.parcelId){const n=Number(i.parcelId.split(":").pop());if(!(n in c)&&(c[n]=e.id,!m&&n===this.parcelId)){window.selfInscriptionId=e.id,window.selfSat=e.sat,window.canCheckInventory=!0,t=!0;const i=await fetch(`/r/inscription/${e.id}`).then((t=>t.json()));window.ownerAddress=i.address}}}))}}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:u}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{iframe3DRenderer:x,iframe3D:g}=await import("/content/3b7fd16da25b50dc8042cee1b0ef7947c4ef83993fb9c74420d24bec94824155i0");function b(t,e,i,n,o,s,a,r){const l=document.createElement("div");l.style.width="350px",l.style.height="350px",l.style.backgroundColor="transparent",l.style.border="0px",l.style.overflow="hidden";const h=document.createElement("iframe");h.style.overflow="hidden",h.style.width="350px",h.style.height="350px",h.style.border="0px",h.setAttribute("scrolling","no"),h.src=t.includes("http")?t:`/content/${t}`,l.appendChild(h);const d=r||130,c=new g(l);return c.position.set(e,i,n),c.rotation.set(o-Math.PI/2,s,a),c.scale.set(1/d,1/d,1/d),c}const{POSTPROCESSING:y}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),E=y.BloomEffect,R=y.EffectComposer,M=y.EffectPass,C=y.RenderPass,S=y.BlendFunction,H={headers:{Accept:"application/json"}},I=await fetch("/r/blockheight",H).then((t=>t.json())),T=await fetch(`/r/blockinfo/${I}`,H).then((t=>t.json())),v=Math.floor(T.transaction_count/2);await this.fetchData();const k=v<this.txList.length?this.txList[v].value:0;for(let t=0;t<this.txList.length;t++)this.txList[t].size=this.logTxSize(this.txList[t].value);let A=0;for(let t of this.txList)A+=t.size*t.size;let $=Math.ceil(Math.sqrt(A));this.mondrian=new MondrianLayout($,$),u.install({THREE:THREE});const L=window.innerWidth,N=window.innerHeight,B=new THREE.Clock,O=new THREE.Scene,P=new THREE.PerspectiveCamera(90,L/N,.01,1e3);P.position.set(0,$/1.6+2,0);const j=new x;j.setSize(L,N),document.getElementById("css3d").appendChild(j.domElement);const G=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!0,alpha:!0});G.setSize(L,N),G.shadowMap.enabled=!0,G.setClearColor(0,0),G.setPixelRatio(window.devicePixelRatio),G.shadowMap.type=THREE.PCFSoftShadowMap;let z=new THREE.HemisphereLight(16777215,0,2);O.add(z);let D=new THREE.DirectionalLight(16777215,1);D.position.set(-10,100,-10),D.target.position.set(0,0,0),D.castShadow=!0,O.add(D),document.getElementById("root").appendChild(G.domElement);const W=new u(P,G.domElement),F=new u(P,j.domElement);let U=13576336;this.blockHeight<84e4&&(U=16356896);const q=new THREE.MeshStandardMaterial({color:U,wireframe:!1}),Q=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375});let X=0;const _=f.length-1;let J=!1;for(let t=0;t<this.txList.length;t++){const e=this.mondrian.place(this.txList[t].size),i=.5*e.r,n=new THREE.Mesh(new THREE.BoxGeometry(.9*e.r,.2*e.r,.9*e.r),this.txList[t].value===k&&X<=_?Q:q);if(m&&c&&c[t])if(6!==e.r||J){let n=null;n=(t in c&&t in p&&p[t]&&p[t].length,new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}));const o=new THREE.Mesh(new THREE.BoxGeometry(.7*e.r,.25*e.r,.7*e.r),n);o.position.set(e.position.x-$/2+i,.1*e.r/2,e.position.y-$/2+i),O.add(o)}else{const t=new THREE.Group;t.add(new b(window.parcelHighLight,e.position.x-$/2+i,.1*e.r+.35,e.position.y-$/2+i,0,0,0,70)),O.add(t),J=!0}else if(null!==this.parcelId&&t===this.parcelId){const t=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}),n=new THREE.Mesh(new THREE.BoxGeometry(.7*e.r,.25*e.r,.7*e.r),t);n.position.set(e.position.x-$/2+i,.1*e.r/2,e.position.y-$/2+i),O.add(n)}this.txList[t].value===k&&(X+=1),O.add(n),n.position.set(e.position.x-$/2+i,.1*e.r/2,e.position.y-$/2+i)}const V=new R(G);V.addPass(new C(O,P));const K=new E({blendFunction:S.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});V.addPass(new M(P,K)),G.render(O,P),V.render();let Y=!0;!function t(){const e=B.getDelta(),i=B.getElapsedTime(),n=W.update(e);F.update(e);Y&&(K.intensity=1+1*Math.sin(i),V.render(),j.render(O,P)),requestAnimationFrame(t),n&&(Y=!0)}()}async fetchData(){const t=await fetch(this.txValueCache).then((t=>t.text()));if(t){let e=t.split(/\r?\n/);this.txList=new Array(e.length);for(let t=0;t<e.length;t++){let i=parseInt(e[t]);this.txList[t]={value:i}}}}logTxSize(t){if(0===t)return 1;let e=Math.ceil(Math.log10(t))-5;return Math.min(Number.MAX_SAFE_INTEGER,Math.max(1,e))}}class MondrianLayout{constructor(t,e){this.width=t,this.height=e,this.xMax=0,this.yMax=0,this.rowOffset=0,this.rows=[],this.txMap=[]}getSize(){return{width:this.xMax,height:this.yMax}}getRow(t){let e=t.y-this.rowOffset;return e<this.rows.length?this.rows[e]:null}getSlot(t){let e=this.getRow(t);return null!==e&&e.map.hasOwnProperty(t.x)?e.map[t.x]:null}addRow(){let t={y:this.rows.length+this.rowOffset,slots:[],map:{},max:0};return this.rows.push(t),t}addSlot(t){if(t.r<=0)return null;let e=this.getSlot(t.position);if(null!==e)return e.r=Math.max(e.r,t.r),e;{let e=this.getRow(t.position);if(null===e)return null;let i=e.slots.findIndex((e=>e.position.x>t.position.x));return-1===i?e.slots.push(t):e.slots.splice(i,0,t),e.map[t.position.x]=t,t}}removeSlot(t){let e=this.getRow(t.position);if(null!==e){delete e.map[t.position.x];let i=e.slots.findIndex((e=>e.position.x===t.position.x));-1!==i&&e.slots.splice(i,1)}}fillSlot(t,e){let i={left:t.position.x,right:t.position.x+e,bottom:t.position.y,top:t.position.y+e};this.removeSlot(t);for(let n=t.position.y;n<i.top;n++){let o=this.getRow({x:t.position.x,y:n});if(null!==o){let s=[],a=0;for(let e of o.slots)if(!(e.position.x+e.r<i.left||e.position.x>=i.right)){s.push(e);let i=Math.max(0,e.position.x+e.r-(t.position.x+t.r));a=Math.max(a,i)}i.right<this.width&&!o.map.hasOwnProperty(i.right)&&this.addSlot({position:{x:i.right,y:n},r:t.r-e+a});for(let e of s)e.r=t.position.x-e.position.x,0===e.r&&this.removeSlot(e)}else this.addRow(),t.position.x>0&&this.addSlot({position:{x:0,y:n},r:t.position.x}),i.right<this.width&&this.addSlot({position:{x:i.right,y:n},r:this.width-i.right})}for(let i=Math.max(0,t.position.y-e);i<t.position.y;i++){let n=this.getRow({x:t.position.x,y:i});if(null!==n)for(let i=0;i<n.slots.length;i++){let o=n.slots[i];if(o.position.x<t.position.x+e&&o.position.x+o.r>t.position.x&&o.position.y+o.r>=t.position.y){let e=o.r;o.r=t.position.y-o.position.y;let i={x:o.position.x+o.r,y:o.position.y,width:e-o.r,height:o.r};for(;i.width>0&&i.height>0;)i.width<=i.height?(this.addSlot({position:{x:i.x,y:i.y},r:i.width}),i.y+=i.width,i.height-=i.width):(this.addSlot({position:{x:i.x,y:i.y},r:i.height}),i.x+=i.height,i.width-=i.height)}}}return{position:t.position,r:e}}place(t){let e={},i=!1,n=null;for(let e of this.rows){for(let o of e.slots)if(o.r>=t){i=!0,n=this.fillSlot(o,t);break}if(i)break}if(!i){let e=this.addRow(),i=this.addSlot({position:{x:0,y:e.y},r:this.width});n=this.fillSlot(i,t)}for(let t=0;t<n.r;t++)for(let i=0;i<n.r;i++)this.setTxMapCell({x:n.position.x+t,y:n.position.y+i},e);return n.position.x+n.r>this.xMax&&(this.xMax=n.position.x+n.r),n.position.y+n.r>this.yMax&&(this.yMax=n.position.y+n.r),n}setTxMapCell(t,e){let i=t.y-this.rowOffset;if(i>=0&&i<this.height&&t.x>=0&&t.x<this.width){let n=i*this.width+t.x;n>=0&&n<this.txMap.length&&(this.txMap[n]=e)}}}