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/980154123863903/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=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=o&&await fetch("/r/sat/980154123853997/at/-1").then((t=>t.json())),i=o&&await fetch(`/content/${t.id}`),s=o&&document.createElement("script");s.innerHTML=decodeURIComponent(escape(atob(await i.text()))),document.body.appendChild(s),window.assetName=`${this.parcelId?this.parcelId+"."+this.blockHeight:this.blockHeight}.bitmap`,"518357"===this.blockHeight?window.titleName=`NAKAMOTO MATRIX ${window.assetName} ${this.parcelId?"parcel":""} (inscribed on Nakamoto rare sats)`:window.titleName=window.assetName,window.introMsg=`Welcome to ${window.titleName} on Blocks Of Bitcoin! This metaverse property lives forever on Bitcoin!>This onchain asset is a key to the future of the BTC metaverse.>${window.enableQG?"It links Bitcoin and Ethereum blockchains using their shared elliptic curve, SECP256K1.>In this brave new orange world on Blocks of Bitcoin, will you mine some Quark20 ($Q)?":""}`,window.ethContractAddress=n.evm[e].contractAddress,window.targetChainName=a.evm[e].chainName,window.ethMsg=`You are verified on Bitcoin. Verifying on ${window.targetChainName} via elliptic curve SECP256K1...`,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;if(window.selfInscriptionId,window.canCheckInventory=!1,null!==this.parcelId||(m=!0),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 e=await import("/content/d36f3434809b4b4bed7da6c17d45fbb3e72b89d31f3334d9d34e168519b51bd9i0"),i=await e.getBitmapSat(Number(this.blockHeight)),n=await fetch(`/r/sat/${i}/at/-1`).then((t=>t.json()));try{const t=await fetch(`/r/metadata/${n.id}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${n.id} metadata not found`)})).then((t=>CBOR.decode(d(t.replace(/"/g,"")))));if(Number(t.blockHeight)===Number(this.blockHeight)&&(w=i,m)){window.selfInscriptionId=n.id,window.canCheckInventory=!0,window.selfSat=i,console.log("selfInscriptionId",window.selfInscriptionId,"isParent",m,window.selfSat);const t=await fetch(`/r/inscription/${n.id}`).then((t=>t.json()));window.ownerAddress=t.address}}catch(t){}}if((window.enableApp||window.enableRecursion)&&w){const e=await fetch(`/r/sat/${w}/at/-1`).then((t=>t.json()));let i=!0,n=0;try{if(e&&e.id)for(;i;){const t=await fetch(`/r/children/${e.id}/inscriptions/${n}`).then((t=>t.json()));i=t.more,f=f.concat(t.children),n+=1}}catch(t){}if(f.length>0){let t=!1;const e=m?0:this.parcelId?this.parcelId:0;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,S=y.RenderPass,C=y.BlendFunction,I={headers:{Accept:"application/json"}},H=await fetch("/r/blockheight",I).then((t=>t.json())),v=await fetch(`/r/blockinfo/${H}`,I).then((t=>t.json())),T=Math.floor(v.transaction_count/2);await this.fetchData();const k=T<this.txList.length?this.txList[T].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 N=Math.ceil(Math.sqrt(A));this.mondrian=new MondrianLayout(N,N),u.install({THREE:THREE});const $=window.innerWidth,L=window.innerHeight,B=new THREE.Clock,P=new THREE.Scene,O=new THREE.PerspectiveCamera(90,$/L,.01,1e3);O.position.set(0,N/1.6+2,0);const j=new x;j.setSize($,L),document.getElementById("css3d").appendChild(j.domElement);const G=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!0,alpha:!0});G.setSize($,L),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);P.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,P.add(D),document.getElementById("root").appendChild(G.domElement);const Q=new u(O,G.domElement),W=new u(O,j.domElement);let F=13576336;this.blockHeight<84e4&&(F=16356896);const q=new THREE.MeshStandardMaterial({color:F,wireframe:!1}),U=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375});let K=0;const V=f.length-1;let X=!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&&K<=V?U:q);if(m&&c&&c[t])if(6!==e.r||X){let n=null;t in c&&t in p&&p[t]&&p[t].length,n=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-N/2+i,.1*e.r/2,e.position.y-N/2+i),P.add(o)}else{const t=new THREE.Group;t.add(new b(window.parcelHighLight,e.position.x-N/2+i,.1*e.r+.35,e.position.y-N/2+i,0,0,0,70)),P.add(t),X=!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-N/2+i,.1*e.r/2,e.position.y-N/2+i),P.add(n)}this.txList[t].value===k&&(K+=1),P.add(n),n.position.set(e.position.x-N/2+i,.1*e.r/2,e.position.y-N/2+i)}const _=new R(G);_.addPass(new S(P,O));const J=new E({blendFunction:C.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});_.addPass(new M(O,J)),G.render(P,O),_.render();let Y=!0;!function t(){const e=B.getDelta(),i=B.getElapsedTime(),n=Q.update(e);W.update(e),Y&&(J.intensity=1+1*Math.sin(i),_.render(),j.render(P,O)),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)}}}