class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,e,i){this.blockHeight=`${t}`,console.log("blockHeight",this.blockHeight),this.txValueCache=e,this.parcelId=i?Number(i.split(":").pop()):null,this.loadRoutine()}async loadRoutine(){const t=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),e=document.createElement("script");e.innerHTML=await t.text(),document.body.appendChild(e);const i=document.createElement("div");function o(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}i.setAttribute("id","css3d"),document.body.appendChild(i),document.getElementById("css3d").style="margin: 0; overflow: hidden; position: absolute; top: 0px;";const n={};let s=null,r={},a={},l={},h=[],d=!1;if(null!==this.parcelId||(d=!0),s=(t=>{t=BigInt(t);const e=5000000000n,i=210000n,o=t=>e/2n**t,n=t/i;let s=0n;for(let t=0n;t<n;t++)s+=o(t)*i;return s+=t%i*o(n),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(o(t.replace(/"/g,"")))));Number(t.blockHeight)===Number(this.blockHeight)&&(s=i)}catch(t){console.log("no valid 3D reinscription found on Bitmap (or not a Bitmap)")}}if(s){const e=await fetch(`/r/sat/${s}/at/-1`).then((t=>t.json()));let i=!0,c=0;try{if(e&&e.id)for(;i;){const t=await fetch(`/r/children/${e.id}/inscriptions/${c}`).then((t=>t.json()));i=t.more,h=h.concat(t.children),c+=1}}catch(t){}if(h.length>0)for(let t=0;t<h.length;t++){const e=h[t];fetch(`/r/metadata/${e.id}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${e.id} metadata not found`)})).then((t=>CBOR.decode(o(t.replace(/"/g,""))))).then((async t=>{if(t&&t.parcelId){const i=Number(t.parcelId.split(":").pop());if(!(i in n)){if(n[i]=e.id,!d&&i!==this.parcelId)return;const t=await fetch(`/r/sat/${e.sat}/at/-1`).then((t=>t.json()));if(e.id!==t.id){const e=await fetch(`/content/${t.id}`),o=await e.text(),n=(new DOMParser).parseFromString(o,"text/html");r[i]=n.querySelectorAll("ord-img"),a[i]=n.querySelectorAll("ord-glb"),l[i]=n.querySelectorAll("ord-html")}}}})).catch((t=>{console.log(t)}))}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:c}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{iframe3DRenderer:p,iframe3D:f}=await import("/content/3b7fd16da25b50dc8042cee1b0ef7947c4ef83993fb9c74420d24bec94824155i0"),{POSTPROCESSING:w}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),x=w.BloomEffect,u=w.EffectComposer,m=w.EffectPass,g=w.RenderPass,b=w.BlendFunction,y={headers:{Accept:"application/json"}},E=await fetch("/r/blockheight",y).then((t=>t.json())),M=await fetch(`/r/blockinfo/${E}`,y).then((t=>t.json())),R=Math.floor(M.transaction_count/2);await this.fetchData();const S=R<this.txList.length?this.txList[R].value:0;if(this.goodParcels=[],null===this.parcelId)for(let t=0;t<this.txList.length;t++)this.txList[t].size=this.logTxSize(this.txList[t].value),this.txList[t].size>5&&this.goodParcels.push(t);let H=0;for(let t of this.txList)H+=t.size*t.size;let T=Math.ceil(Math.sqrt(H));this.mondrian=new MondrianLayout(T,T),c.install({THREE:THREE});const I=window.innerWidth,L=window.innerHeight,C=new THREE.Clock,k=new THREE.Scene,v=new THREE.PerspectiveCamera(90,I/L,.01,1e3);v.position.set(0,T/1.6+2,0);const P=new p;P.setSize(I,L),document.getElementById("css3d").appendChild(P.domElement);const $=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!0,alpha:!0});$.setSize(I,L),$.shadowMap.enabled=!0,$.setClearColor(0,0),$.setPixelRatio(window.devicePixelRatio),$.shadowMap.type=THREE.PCFSoftShadowMap;let A=new THREE.HemisphereLight(16777215,0,2);k.add(A);let B=new THREE.DirectionalLight(16777215,1);B.position.set(-10,100,-10),B.target.position.set(0,0,0),B.castShadow=!0,k.add(B),document.getElementById("root").appendChild($.domElement);const D=new c(v,$.domElement),z=new c(v,P.domElement);let O=13576336;this.blockHeight<84e4&&(O=16356896);const N=new THREE.MeshStandardMaterial({color:O,wireframe:!1}),j=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375});new THREE.MeshStandardMaterial({color:16225050,wireframe:!1});let G=0;const F=h.length-1;for(let t=0;t<this.txList.length;t++){const e=this.mondrian.place(this.txList[t].size),i=.5*e.r,o=new THREE.Mesh(new THREE.BoxGeometry(.9*e.r,.2*e.r,.9*e.r),this.txList[t].value===S&&G<=F?j:N);if(d&&n&&n[t]){let o=null;o=t in n&&t in r&&r[t].length>0?new THREE.MeshStandardMaterial({color:16777215,wireframe:!1,map:(new THREE.TextureLoader).load(`/content/${r[t][0]?.getAttribute("content")}`)}):new THREE.MeshStandardMaterial({color:16777215,wireframe:!1});const s=new THREE.Mesh(new THREE.BoxGeometry(.6*e.r,.25*e.r,.6*e.r),o);s.position.set(e.position.x-T/2+i,.1*e.r/2,e.position.y-T/2+i),k.add(s)}else if(null!==this.parcelId&&t===this.parcelId){const t=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1,map:this.parcelId&&r[this.parcelId]&&(new THREE.TextureLoader).load(`/content/${r[this.parcelId][0]?.getAttribute("content")}`)}),o=new THREE.Mesh(new THREE.BoxGeometry(.6*e.r,.25*e.r,.6*e.r),t);o.position.set(e.position.x-T/2+i,.1*e.r/2,e.position.y-T/2+i),k.add(o)}this.txList[t].value===S&&(G+=1),k.add(o),o.position.set(e.position.x-T/2+i,.1*e.r/2,e.position.y-T/2+i)}const q=new THREE.Group;q.add(new function(t,e,i,o,n,s,r,a){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=new f(l);return d.position.set(-.99,.75,-.99),d.rotation.set(0-Math.PI/2,0,0),d.scale.set(1/85,1/85,1/85),d}("b10b2e2d243f565bebf658508c3cb5fa6b76a7028bbdd220e236a5e45f65168ci213",-.99,.75,-.99,0,0,0,85)),k.add(q);const W=new u($);W.addPass(new g(k,v));const _=new x({blendFunction:b.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});W.addPass(new m(v,_)),$.render(k,v),W.render();let U=!0;!function t(){const e=C.getDelta(),i=C.getElapsedTime(),o=D.update(e);z.update(e),U&&(_.intensity=1+1*Math.sin(i),W.render(),P.render(k,v)),requestAnimationFrame(t),o&&(U=!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}}}}decompress=t=>{const e=Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),i=new DecompressionStream("gzip"),o=i.writable.getWriter();return o.write(e),o.close(),new Response(i.readable).arrayBuffer().then((function(t){return(new TextDecoder).decode(t)}))};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 o=t.position.y;o<i.top;o++){let n=this.getRow({x:t.position.x,y:o});if(null!==n){let s=[],r=0;for(let e of n.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));r=Math.max(r,i)}i.right<this.width&&!n.map.hasOwnProperty(i.right)&&this.addSlot({position:{x:i.right,y:o},r:t.r-e+r});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:o},r:t.position.x}),i.right<this.width&&this.addSlot({position:{x:i.right,y:o},r:this.width-i.right})}for(let i=Math.max(0,t.position.y-e);i<t.position.y;i++){let o=this.getRow({x:t.position.x,y:i});if(null!==o)for(let i=0;i<o.slots.length;i++){let n=o.slots[i];if(n.position.x<t.position.x+e&&n.position.x+n.r>t.position.x&&n.position.y+n.r>=t.position.y){let e=n.r;n.r=t.position.y-n.position.y;let i={x:n.position.x+n.r,y:n.position.y,width:e-n.r,height:n.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,o=null;for(let e of this.rows){for(let n of e.slots)if(n.r>=t){i=!0,o=this.fillSlot(n,t);break}if(i)break}if(!i){let e=this.addRow(),i=this.addSlot({position:{x:0,y:e.y},r:this.width});o=this.fillSlot(i,t)}for(let t=0;t<o.r;t++)for(let i=0;i<o.r;i++)this.setTxMapCell({x:o.position.x+t,y:o.position.y+i},e);return o.position.x+o.r>this.xMax&&(this.xMax=o.position.x+o.r),o.position.y+o.r>this.yMax&&(this.yMax=o.position.y+o.r),o}setTxMapCell(t,e){let i=t.y-this.rowOffset;if(i>=0&&i<this.height&&t.x>=0&&t.x<this.width){let o=i*this.width+t.x;o>=0&&o<this.txMap.length&&(this.txMap[o]=e)}}}