@pyscript/core 0.7.22 → 0.7.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{core-kUJkqDU8.js → core-Bj5dGi2O.js} +3 -3
- package/dist/{core-kUJkqDU8.js.map → core-Bj5dGi2O.js.map} +1 -1
- package/dist/core.js +1 -1
- package/dist/{deprecations-manager-F4EM1hFL.js → deprecations-manager-BLZxpaBk.js} +2 -2
- package/dist/{deprecations-manager-F4EM1hFL.js.map → deprecations-manager-BLZxpaBk.js.map} +1 -1
- package/dist/{donkey-C6J1Cb4E.js → donkey-DZXEwrem.js} +2 -2
- package/dist/{donkey-C6J1Cb4E.js.map → donkey-DZXEwrem.js.map} +1 -1
- package/dist/{error-NMD5NV4h.js → error-2Qk3Mfnr.js} +2 -2
- package/dist/{error-NMD5NV4h.js.map → error-2Qk3Mfnr.js.map} +1 -1
- package/dist/{mpy-NMwJkYsw.js → mpy-BXWEGUQ8.js} +2 -2
- package/dist/{mpy-NMwJkYsw.js.map → mpy-BXWEGUQ8.js.map} +1 -1
- package/dist/{py-Dxoqreyq.js → py-WW9mcsmx.js} +2 -2
- package/dist/{py-Dxoqreyq.js.map → py-WW9mcsmx.js.map} +1 -1
- package/dist/py-editor-BpXAdI0B.js +2 -0
- package/dist/py-editor-BpXAdI0B.js.map +1 -0
- package/dist/{py-game-DOwiUOay.js → py-game-BljeiN-4.js} +2 -2
- package/dist/{py-game-DOwiUOay.js.map → py-game-BljeiN-4.js.map} +1 -1
- package/dist/{py-terminal-DqB7kBfk.js → py-terminal-DQ2Uq7fJ.js} +2 -2
- package/dist/{py-terminal-DqB7kBfk.js.map → py-terminal-DQ2Uq7fJ.js.map} +1 -1
- package/package.json +1 -1
- package/src/plugins/py-editor.js +14 -5
- package/dist/py-editor-CVH_xgRH.js +0 -2
- package/dist/py-editor-CVH_xgRH.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
try{crypto.randomUUID()}catch(e){location.href.startsWith("http://0.0.0.0")&&(location.href=location.href.replace("0.0.0.0","localhost"))}var e=Promise.withResolvers.bind(Promise);const t=new WeakMap,n=e=>{const n=e||console,r={buffered:s,stderr:(n.stderr||console.error).bind(n),stdout:(n.stdout||console.log).bind(n)};return{stderr:(...e)=>r.stderr(...e),stdout:(...e)=>r.stdout(...e),async get(e){const n=await e;return t.set(n,r),n}}},r=new TextDecoder,s=(e,t=10)=>{const n=[];return s=>{if(s instanceof Uint8Array)for(const o of s)o===t?e(r.decode(new Uint8Array(n.splice(0)))):n.push(o);else e(s)}},o=Object.getOwnPropertyDescriptors(Response.prototype),a=e=>"function"==typeof e,i={get:(e,t)=>o.hasOwnProperty(t)?((e,t,{get:n,value:r})=>n||!a(r)?e.then(e=>e[t]):(...n)=>e.then(e=>e[t](...n)))(e,t,o[t]):((e,t)=>a(t)?t.bind(e):t)(e,e[t])};var c=(e,...t)=>new Proxy(fetch(e,...t).then(t=>t.ok?t:Promise.reject(new Error(`[${t.status}] Unable to fetch ${e}`))),i);const{assign:l}=Object,p="entries",f="readonly",u="readwrite",d={durability:"default",prefix:"IDBMap"},m=({target:{result:e}})=>e;let _=class extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(p,t,this.#t);return new Promise((t,r)=>l(e(n.objectStore(p)),{onsuccess:t,onerror:r}))}constructor(e,{durability:t=d.durability,prefix:n=d.prefix}=d){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise((t,n)=>{l(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(p),n.oncomplete=()=>t(e)},onsuccess(e){t(m(e))},onerror(e){n(e),this.dispatchEvent(e)}})}).then(e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e})}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?l(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r(e=>e.count(),f).then(m)}async clear(){await this.#r(e=>e.clear(),u)}async delete(e){await this.#r(t=>t.delete(e),u)}async entries(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e).then(t=>[e,t])))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r(t=>t.get(e),f).then(m)}async has(e){return void 0!==await this.#r(t=>t.getKey(e),f).then(m)}async keys(){return await this.#r(e=>e.getAllKeys(),f).then(m)}async set(e,t){return await this.#r(n=>n.put(t,e),u),this}async values(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e)))}get[Symbol.toStringTag](){return this.#n}};class y extends Map{#s;#o;constructor(...e){super(),this.#s=new _(...e),this.#o=this.#s.entries().then(e=>{for(const[t,n]of e)super.set(t,n)})}async close(){await this.#o,await this.#s.close()}async sync(){await this.#o}clear(){return this.#o=this.#o.then(()=>this.#s.clear()),super.clear()}delete(e){return this.#o=this.#o.then(()=>this.#s.delete(e)),super.delete(e)}set(e,t){return this.#o=this.#o.then(()=>this.#s.set(e,t)),super.set(e,t)}}const h={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\r\n]+/))if(t.trim().length){/^(\s+)/.test(t)&&(e=e.replace(new RegExp("^"+RegExp.$1,"gm"),""));break}return e}},{replace:g}="",w=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g,A={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'},b=e=>A[e],v=(e,...t)=>h[typeof e](e,...t),E=e=>g.call(e,w,b),{isArray:k}=Array,{assign:B,create:j,defineProperties:S,defineProperty:x,entries:R}=Object,{all:C,resolve:$}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),D=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href;function T(e){return e.startsWith(".")?D(e,this):e}let P=0;const O=(e,t)=>({id:e.id||(e.id=`${t}-w${P++}`),tag:e.tagName}),M=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},F=(e,n,r,s)=>({type:n,config:r,interpreter:s,io:t.get(s),run:(t,...n)=>e.run(s,t,...n),runAsync:(t,...n)=>e.runAsync(s,t,...n),runEvent:(...t)=>e.runEvent(s,...t)}),L=e=>e.replace(/^(?:\n|\r\n)/,""),N=(e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,L(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,L(t),...o);return r&&await s(e,r,...o),a}},I=Symbol.for("polyscript.js_modules"),U=new Map;x(globalThis,I,{value:U});const H=new Proxy(U,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]}),W=(e,t)=>!t.startsWith("_"),q=(e,t)=>new Proxy(e,{has:W,get:(e,n)=>e[t][n]}),z=(e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,q(r,e));t.registerJSModule(n,s,r)},G=(e,t)=>import(e).then(e=>{U.set(t,{...e})}),J=e=>new Promise((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(B(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))}),K=e=>/\.css$/i.test(new URL(e).pathname),Y=e=>/^(?:false|0|no)$/i.test(e.getAttribute("async")),V=!globalThis.window,X=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):Z(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},Z=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},Q=e=>{const t=e.map(e=>e.trim().replace(/(^[/]*|[/]*$)/g,"")).filter(e=>""!==e&&"."!==e).join("/");return e[0].startsWith("/")?`/${t}`:t},ee=(e,t)=>c(D(e,t)).arrayBuffer(),te=(e,t,n,r)=>C((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use 'to_file' and 'files' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn't determine the filename from the path ${r}, please supply 'to_file' parameter.`)}return e.flatMap(({from:e="",to_folder:t=".",to_file:n,files:r})=>{if(k(r))return r.map(n=>({url:Q([e,n]),path:Q([t,n])}));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:Q([t,s])}]})})(n).map(({url:n,path:s})=>ee(n,r).then(n=>e.writeFile(t,s,n)))),ne=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,re=(e,t)=>e.replace(/\{.+?\}/g,e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)}),se=(e,t,n,r)=>C((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of R(e))if(/^\{.+\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,re(o,t))}else{const e=re(s,t),a=ne(e,re(o||"./",t));if(n.has(a)&&!a.endsWith("/*"))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map(({url:n,path:s})=>ee(n,r).then(r=>e.writeFile(t,s,r,n)))),oe=e=>t=>{dispatchEvent(new CustomEvent(`${e}:progress`,{detail:t}))};let ae=0;const ie=ae++,ce=ae++,le=ae++,pe=ae++,fe=ae++,ue=ae++,de=ae++,me=ae++,_e=ae++,ye=ae++,he=ae++,ge=ae++,we=ae++,Ae=ae++,be=ae++,ve=ae++,Ee=ae++,ke=ae++,Be=ae++,je=ae++,Se=ae++,xe=ae++,Re=ae++,Ce=ae++,$e=ae++,De=ae++,Te=ae++,Pe=ae++;const Oe=globalThis.ImageData||class{},Me=new TextDecoder,Fe=new TextEncoder,Le=new Map(Reflect.ownKeys(Symbol).map(e=>[Symbol[e],`@${String(e)}`])),Ne=e=>{switch(e[0]){case"@":return Symbol[e.slice(1)];case"#":return Symbol.for(e.slice(1));case"!":return Symbol(e.slice(1));default:return Symbol()}},Ie=e=>Le.get(e)||((e,t)=>void 0===t?"?":void 0===Symbol.keyFor(e)?`!${t}`:`#${t}`)(e,e.description),Ue=Object.defineProperty,He=Object.assign,We=Array.from,qe=Array.isArray,ze=ArrayBuffer.isView,Ge=(e,t)=>[e,t],Je=e=>e,Ke={},Ye=e=>(t,n=new Map)=>{for(let r=0,s=t.length;r<s;r++)t[r]=e(t[r],n);return t},Ve=([e,t])=>0===e?t:Ne(t),Xe=e=>"string"==typeof e?Ge(0,e):Ge(16,Ie(e)),Ze=(e,t)=>{for(let n=e.push,r=0,s=t.length;r<s;r+=32767)n.apply(e,t.subarray(r,r+32767))},Qe=new ArrayBuffer(8),et=new DataView(Qe),tt=new Uint8Array(Qe),nt=(e,t,n)=>(e.set(t,n),n),rt=e=>{tt[0]=e[at++],tt[1]=e[at++],tt[2]=e[at++],tt[3]=e[at++],tt[4]=e[at++],tt[5]=e[at++],tt[6]=e[at++],tt[7]=e[at++]},st=e=>(tt[0]=e[at++],tt[1]=e[at++],tt[2]=e[at++],tt[3]=e[at++],et.getUint32(0,!0)),ot=(e,t)=>{switch(e[at++]){case fe:return rt(e),et.getFloat64(0,!0);case ue:return e[at++];case Se:{const n=nt(t,at-1,{});for(let r=0,s=st(e);r<s;r++)n[ot(e,t)]=ot(e,t);return n}case ve:{const n=nt(t,at-1,[]);for(let r=0,s=st(e);r<s;r++)n.push(ot(e,t));return n}case Ce:{const n=at-1,r=ot(e,t);return nt(t,n,new globalThis[r](ot(e,t)))}case Ee:{const n=at-1,r=st(e);return nt(t,n,e.slice(at,at+=r).buffer)}case Ae:{const n=at-1,r=st(e);return nt(t,n,Me.decode(e.slice(at,at+=r)))}case ke:return nt(t,at-1,new Date(ot(e,t)));case je:{const n=nt(t,at-1,new Map);for(let r=0,s=st(e);r<s;r++)n.set(ot(e,t),ot(e,t));return n}case Re:{const n=nt(t,at-1,new Set);for(let r=0,s=st(e);r<s;r++)n.add(ot(e,t));return n}case Be:{const n=at-1,r=ot(e,t),s=ot(e,t),o=ot(e,t),a=new(globalThis[r]||Error)(s);return nt(t,n,Ue(a,"stack",{value:o}))}case $e:{const n=at-1,r=ot(e,t),s=ot(e,t),o=ot(e,t),a=ot(e,t),i=ot(e,t);return nt(t,n,new Oe(r,s,o,{colorSpace:a,pixelFormat:i}))}case xe:{const n=at-1,r=ot(e,t),s=ot(e,t);return nt(t,n,new RegExp(r,s))}case ie:return!1;case ce:return!0;case de:return NaN;case me:return 1/0;case _e:return-1/0;case ye:return 0;case he:return-0;case pe:return null;case ge:return rt(e),et.getBigInt64(0,!0);case we:return rt(e),et.getBigUint64(0,!0);case be:return Ne(ot(e,t));case Pe:return t.get(st(e));case De:{const n=at-1,r=ot(e,t),s=ot(e,t);return nt(t,n,new Blob([e.slice(at,at+=s)],{type:r}))}case Te:{const n=at-1,r=ot(e,t),s=ot(e,t),o=ot(e,t);return nt(t,n,new File([o],r,{type:o.type,lastModified:s}))}default:return}};let at=0;class it{static push(e,t){e.sync(!1),e._(t,t.length)}constructor(e,t){const n=[];this.l=0,this.o=n,this.v=new Uint8Array(e,t),this.push=n.push.bind(n)}get length(){return this.l+this.o.length}sync(e){const t=this.o,n=t.length;n&&this._(e?t:t.splice(0),n)}_(e,t){const{buffer:n,byteOffset:r}=this.v,s=this.l;this.l+=t,t+=r+s,n.byteLength<t&&n.grow(t),this.v.set(e,s)}}const{getPrototypeOf:ct}=Object,{construct:lt}=Reflect,{toStringTag:pt}=Symbol,{toString:ft}=Ke,ut=(e,t=e[pt])=>t in globalThis?t:ut(lt(ct(e.constructor),[0])),{isNaN:dt,isFinite:mt,isInteger:_t}=Number,{ownKeys:yt}=Reflect,{is:ht}=Object,gt=(e,t,n)=>{const r=n.get(e),s=!r;return s?(et.setUint32(0,t.length,!0),n.set(e,[tt[0],tt[1],tt[2],tt[3]])):t.push(Pe,r[0],r[1],r[2],r[3]),s},wt=(e,t,n)=>{et.setUint32(0,n,!0),e.push(t,tt[0],tt[1],tt[2],tt[3])},At=(e,t,n)=>{switch(typeof e){case"number":e&&mt(e)?_t(e)&&e<256&&-1<e?t.push(ue,e):(et.setFloat64(0,e,!0),t.push(fe,tt[0],tt[1],tt[2],tt[3],tt[4],tt[5],tt[6],tt[7])):dt(e)?t.push(de):e?t.push(e<0?_e:me):t.push(ht(e,0)?ye:he);break;case"object":switch(!0){case null===e:t.push(pe);break;case!gt(e,t,n):break;case qe(e):{const r=e.length;wt(t,ve,r);for(let s=0;s<r;s++)At(e[s],t,n);break}case ze(e):if(t.push(Ce),At(ut(e),t,n),e=e.buffer,!gt(e,t,n))break;case e instanceof ArrayBuffer:{const n=new Uint8Array(e);wt(t,Ee,n.length),vt(t,n);break}case e instanceof Date:t.push(ke),At(e.getTime(),t,n);break;case e instanceof Map:wt(t,je,e.size);for(const[r,s]of e)At(r,t,n),At(s,t,n);break;case e instanceof Set:wt(t,Re,e.size);for(const r of e)At(r,t,n);break;case e instanceof Error:t.push(Be),At(e.name,t,n),At(e.message,t,n),At(e.stack,t,n);break;case e instanceof Oe:t.push($e),At(e.data,t,n),At(e.width,t,n),At(e.height,t,n),At(e.colorSpace,t,n),At(e.pixelFormat,t,n);break;case e instanceof RegExp:t.push(xe),At(e.source,t,n),At(e.flags,t,n);break;case e instanceof File:t.push(Te),At(e.name,t,n),At(e.lastModified,t,n);case e instanceof Blob:{const r=e.size;t.push(De),At(e.type,t,n),At(r,t,n);const s=t.length;vt(t,new Uint8Array(r)),bt.push(e.arrayBuffer().then(e=>[s,e]));break}default:if("toJSON"in e){const r=e.toJSON();At(r===e?null:r,t,n)}else{const r=yt(e),s=r.length;wt(t,Se,s);for(let o=0;o<s;o++){const s=r[o];At(s,t,n),At(e[s],t,n)}}}break;case"string":if(gt(e,t,n)){const n=Fe.encode(e);wt(t,Ae,n.length),vt(t,n)}break;case"boolean":t.push(e?ce:ie);break;case"symbol":t.push(be),At(Ie(e),t,n);break;case"bigint":{let n=ge;9223372036854775807n<e?(et.setBigUint64(0,e,!0),n=we):et.setBigInt64(0,e,!0),t.push(n,tt[0],tt[1],tt[2],tt[3],tt[4],tt[5],tt[6],tt[7]);break}default:t.push(le)}},bt=[];let vt=Ze;const Et=({byteOffset:e=0,Array:t=it}={})=>(n,r)=>{const s=new t(r,e);vt=t.push,At(n,s,new Map);const o=s.length;return s.sync(!0),bt.length?Promise.all(bt.splice(0)).then(t=>{const n=new Uint8Array(r,e);for(const[e,r]of t)n.set(new Uint8Array(r),e);return o}):o},kt={parse:e=>(at=0,ot(e,new Map)),stringify:e=>{const t=[];return vt=Ze,At(e,t,new Map),t}},Bt=new WeakMap,jt=async(e,t,n,r,s)=>{r.files&&(t("Loading files"),await se(e,n,r.files,s),t("Loaded files")),r.fetch&&(t("Loading fetch"),await te(e,n,r.fetch,s),t("Loaded fetch")),r.js_modules&&(t("Loading JS modules"),await(({main:e,worker:t},n)=>{const r=[];if(t&&V)for(let[e,s]of R(t))e=D(e,n),r.push(G(e,s));if(e&&!V)for(let[t,s]of R(e))t=D(t,n),K(t)?J(t):r.push(G(t,s));return C(r)})(r.js_modules,s),t("Loaded JS modules"))},St=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await Bt.get(e)(t),t.map(t=>e.pyimport(t))),n.storage=async e=>{const t=new y(e);return await t.sync(),t},n.JSON=kt),e.registerJsModule(t,n)},xt=(e,t)=>{if(e.endsWith("/*")){if(/\.(zip|whl|tgz|tar(?:\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},Rt=(e,n,...r)=>{try{return e.runPython(v(n),...r)}catch(n){t.get(e).stderr(n)}},Ct=async(e,n,...r)=>{try{return await e.runPythonAsync(v(n),...r)}catch(n){t.get(e).stderr(n)}},$t=async(e,n,r)=>{const[s,...o]=n.split(".");let a,i=e.globals.get(s);for(const e of o)[a,i]=[i,i[e]];try{await i.call(a,r)}catch(n){t.get(e).stderr(n)}};var Dt=(new TextEncoder).encode("_F='github:'\n_E='user-agent'\n_D=True\n_C=False\n_B='/'\n_A=None\nfrom uio import StringIO\nimport sys\nclass Response:\n\tdef __init__(A,f):A.raw=f;A.encoding='utf-8';A._cached=_A\n\tdef close(A):\n\t\tif A.raw:A.raw.close();A.raw=_A\n\t\tA._cached=_A\n\t@property\n\tdef content(self):\n\t\tA=self\n\t\tif A._cached is _A:\n\t\t\ttry:A._cached=A.raw.read()\n\t\t\tfinally:A.raw.close();A.raw=_A\n\t\treturn A._cached\n\t@property\n\tdef text(self):return str(self.content,self.encoding)\n\tdef json(A):import ujson;return ujson.loads(A.content)\nHEADERS_TO_IGNORE=_E,\ntry:import js\nexcept Exception as err:raise OSError('This version of urequests can only be used in the browser')\nHEADERS_TO_IGNORE=_E,\ndef request(method,url,data=_A,json=_A,headers={},stream=_A,auth=_A,timeout=_A,parse_headers=_D):\n\tE=timeout;D=method;C=data;from js import XMLHttpRequest as G;A=G.new();A.withCredentials=_C\n\tif auth is not _A:import ubinascii;H,I=auth;A.open(D,url,_C,H,I)\n\telse:A.open(D,url,_C)\n\tfor(F,J)in headers.items():\n\t\tif F.lower()not in HEADERS_TO_IGNORE:A.setRequestHeader(F,J)\n\tif E:A.timeout=int(E*1000)\n\tif json is not _A:assert C is _A;import ujson;C=ujson.dumps(json);A.setRequestHeader('Content-Type','application/json')\n\tA.send(C);B=Response(StringIO(A.responseText));B.status_code=A.status;B.reason=A.statusText;B.headers=A.getAllResponseHeaders();return B\ndef get(url,**A):return request('GET',url,**A)\n_PACKAGE_INDEX=const('https://micropython.org/pi/v2')\n_CHUNK_SIZE=128\ndef _ensure_path_exists(path):\n\timport os;A=path.split(_B)\n\tif not A[0]:A.pop(0);A[0]=_B+A[0]\n\tB=''\n\tfor C in range(len(A)-1):\n\t\tB+=A[C]\n\t\ttry:os.stat(B)\n\t\texcept:os.mkdir(B)\n\t\tB+=_B\ndef _chunk(src,dest):\n\tA=memoryview(bytearray(_CHUNK_SIZE))\n\twhile _D:\n\t\tB=src.readinto(A)\n\t\tif B==0:break\n\t\tdest(A if B==_CHUNK_SIZE else A[:B])\ndef _check_exists(path,short_hash):\n\tA=short_hash;import os\n\ttry:\n\t\timport binascii as C,hashlib as D\n\t\twith open(path,'rb')as E:B=D.sha256();_chunk(E,B.update);F=str(C.hexlify(B.digest())[:len(A)],'utf-8');return F==A\n\texcept:return _C\ndef _rewrite_url(url,branch=_A):\n\tB=branch;A=url\n\tif not B:B='HEAD'\n\tif A.startswith(_F):A=A[7:].split(_B);A='https://raw.githubusercontent.com/'+A[0]+_B+A[1]+_B+B+_B+_B.join(A[2:])\n\treturn A\ndef _download_file(url,dest):\n\tB=dest;A=get(url)\n\ttry:\n\t\tif A.status_code!=200:print('Error',A.status_code,'requesting',url);return _C\n\t\tprint('Copying:',B);_ensure_path_exists(B)\n\t\twith open(B,'wb')as C:_chunk(A.raw,C.write)\n\t\treturn _D\n\tfinally:A.close()\ndef _install_json(package_json_url,index,target,version,mpy):\n\tK='File not found: {} {}';I=version;H=index;G=package_json_url;D=target;E=get(_rewrite_url(G,I))\n\ttry:\n\t\tif E.status_code!=200:print('Package not found:',G);return _C\n\t\tF=E.json()\n\tfinally:E.close()\n\tfor(A,C)in F.get('hashes',()):\n\t\tB=D+_B+A\n\t\tif _check_exists(B,C):print('Exists:',B)\n\t\telse:\n\t\t\tL='{}/file/{}/{}'.format(H,C[:2],C)\n\t\t\tif not _download_file(L,B):print(K.format(A,C));return _C\n\tfor(A,J)in F.get('urls',()):\n\t\tB=D+_B+A\n\t\tif not _download_file(_rewrite_url(J,I),B):print(K.format(A,J));return _C\n\tfor(M,N)in F.get('deps',()):\n\t\tif not _install_package(M,H,D,N,mpy):return _C\n\treturn _D\ndef _install_package(package,index,target,version,mpy):\n\tD=index;C=target;B=version;A=package\n\tif A.startswith('http://')or A.startswith('https://')or A.startswith(_F):\n\t\tif A.endswith('.py')or A.endswith('.mpy'):print('Downloading {} to {}'.format(A,C));return _download_file(_rewrite_url(A,B),C+_B+A.rsplit(_B)[-1])\n\t\telse:\n\t\t\tif not A.endswith('.json'):\n\t\t\t\tif not A.endswith(_B):A+=_B\n\t\t\t\tA+='package.json'\n\t\t\tprint('Installing {} to {}'.format(A,C))\n\telse:\n\t\tif not B:B='latest'\n\t\tprint('Installing {} ({}) from {} to {}'.format(A,B,D,C));E=sys.implementation._mpy&255 if mpy and hasattr(sys.implementation,'_mpy')else'py';A='{}/package/{}/{}/{}.json'.format(D,'py',A,B)\n\treturn _install_json(A,D,C,B,mpy)\ndef install(package,index=_A,target=_A,version=_A,mpy=_D):\n\tB=target;A=index\n\tif not B:\n\t\tfor C in sys.path:\n\t\t\tif C.endswith('/lib'):B=C;break\n\t\telse:print('Unable to find lib dir in sys.path');return\n\tif not A:A=_PACKAGE_INDEX\n\tif _install_package(package,A.rstrip(_B),B,version,mpy):print('Done')\n\telse:print('Package may be partially installed')");const Tt=async e=>(await import("./toml-V4Savzlc.js")).parse(e);async function Pt(e,t){return new Promise((n,r)=>{e.syncfs(t,e=>{e?r(e):n()})})}function Ot(e){const t=e.FS,n=e.FS.filesystems.MEMFS,r=e.PATH,s={DIR_MODE:16895,FILE_MODE:33279,mount:function(e){if(!e.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return n.mount.apply(null,arguments)},syncfs:async(e,t,n)=>{try{const r=s.getLocalSet(e),o=await s.getRemoteSet(e),a=t?o:r,i=t?r:o;await s.reconcile(e,a,i),n(null)}catch(e){n(e)}},getLocalSet:e=>{let n=Object.create(null);function s(e){return"."!==e&&".."!==e}function o(e){return t=>r.join2(e,t)}let a=t.readdir(e.mountpoint).filter(s).map(o(e.mountpoint));for(;a.length;){let e=a.pop(),r=t.stat(e);t.isDir(r.mode)&&a.push.apply(a,t.readdir(e).filter(s).map(o(e))),n[e]={timestamp:r.mtime,mode:r.mode}}return{type:"local",entries:n}},getRemoteSet:async e=>{const t=Object.create(null),n=await Mt(e.opts.fileSystemHandle);for(const[o,a]of n)"."!==o&&(t[r.join2(e.mountpoint,o)]={timestamp:"file"===a.kind?(await a.getFile()).lastModifiedDate:new Date,mode:"file"===a.kind?s.FILE_MODE:s.DIR_MODE});return{type:"remote",entries:t,handles:n}},loadLocalEntry:e=>{const r=t.lookupPath(e).node,s=t.stat(e);if(t.isDir(s.mode))return{timestamp:s.mtime,mode:s.mode};if(t.isFile(s.mode))return r.contents=n.getFileDataAsTypedArray(r),{timestamp:s.mtime,mode:s.mode,contents:r.contents};throw new Error("node type not supported")},storeLocalEntry:(e,n)=>{if(t.isDir(n.mode))t.mkdirTree(e,n.mode);else{if(!t.isFile(n.mode))throw new Error("node type not supported");t.writeFile(e,n.contents,{canOwn:!0})}t.chmod(e,n.mode),t.utime(e,n.timestamp,n.timestamp)},removeLocalEntry:e=>{var n=t.stat(e);t.isDir(n.mode)?t.rmdir(e):t.isFile(n.mode)&&t.unlink(e)},loadRemoteEntry:async e=>{if("file"===e.kind){const t=await e.getFile();return{contents:new Uint8Array(await t.arrayBuffer()),mode:s.FILE_MODE,timestamp:t.lastModifiedDate}}if("directory"===e.kind)return{mode:s.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+e.kind)},storeRemoteEntry:async(e,n,s)=>{const o=e.get(r.dirname(n)),a=t.isFile(s.mode)?await o.getFileHandle(r.basename(n),{create:!0}):await o.getDirectoryHandle(r.basename(n),{create:!0});if("file"===a.kind){const e=await a.createWritable();await e.write(s.contents),await e.close()}e.set(n,a)},removeRemoteEntry:async(e,t)=>{const n=e.get(r.dirname(t));await n.removeEntry(r.basename(t)),e.delete(t)},reconcile:async(e,n,o)=>{let a=0;const i=[];Object.keys(n.entries).forEach(function(e){const r=n.entries[e],s=o.entries[e];(!s||t.isFile(r.mode)&&r.timestamp.getTime()>s.timestamp.getTime())&&(i.push(e),a++)}),i.sort();const c=[];if(Object.keys(o.entries).forEach(function(e){n.entries[e]||(c.push(e),a++)}),c.sort().reverse(),!a)return;const l="remote"===n.type?n.handles:o.handles;for(const t of i){const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);if("local"===o.type){const e=l.get(n),r=await s.loadRemoteEntry(e);s.storeLocalEntry(t,r)}else{const e=s.loadLocalEntry(t);await s.storeRemoteEntry(l,n,e)}}for(const t of c)if("local"===o.type)s.removeLocalEntry(t);else{const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);await s.removeRemoteEntry(l,n)}}};return e.FS.filesystems.NATIVEFS_ASYNC=s,async function(e,n){if("FileSystemDirectoryHandle"!==n.constructor.name)throw new TypeError("Expected argument 'fileSystemHandle' to be a FileSystemDirectoryHandle");return function(e){t.mkdirTree?t.mkdirTree(e):Z(t,e);const{node:n}=t.lookupPath(e,{follow_mount:!1});if(t.isMountpoint(n))throw new Error(`path '${e}' is already a file system mount point`);if(!t.isDir(n.mode))throw new Error(`path '${e}' points to a file not a directory`);for(const t in n.contents)throw new Error(`directory '${e}' is not empty`)}(e),t.mount(t.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:n},e),await Pt(t,!0),{syncfs:async()=>await Pt(t,!1)}}}const Mt=async e=>{const t=[];await async function e(n){for await(const r of n.values())t.push(r),"directory"===r.kind&&await e(r)}(e);const n=new Map;n.set(".",e);for(const r of t){const t=(await e.resolve(r)).join("/");n.set(t,r)}return n},{parse:Ft}=JSON,Lt=(e,t)=>new URL(e,t).href,Nt=(e,t,n)=>{if(t in e)throw new Error(`Duplicated path: ${t}`);e[t]=n},It=(e,t,n)=>{for(const r in t)Nt(e,Lt(r,n),t[r])},Ut=(e,t,n,r)=>{const s=t[n];s&&(e[n]??={},It(e[n],s,r))},Ht=async([e,t],n=e.packages,r=new Set)=>{const s=[];for(const o of n){if(r.has(o))continue;r.add(o);const n=o.endsWith(".toml");if(n||o.endsWith(".json")){const{href:a}=new URL(o,t),i=await c(a).text(),{name:l,files:p,js_modules:f,packages:u}=n?await Tt(i):Ft(i);if(r.has(l))throw new Error(`Unable to process ${l} @ ${o}`);r.add(l),u&&s.push(...await Ht([e,a],u,r)),f&&(e.js_modules??={},Ut(e.js_modules,f,"main",o),Ut(e.js_modules,f,"worker",o)),p&&(e.files??={},It(e.files,p,o))}else s.push(o)}return s},Wt=(e,t)=>{try{e.mkdir(t)}catch(e){}},qt=oe("mpy");var zt={type:"micropython",module:(e="1.28.0-6")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,r,o){const{stderr:a,stdout:i,get:c}=n({stderr:s(console.error),stdout:s(console.log)}),l=[];t.debug&&l.push("settrace"),t.packages?.includes("ulab")&&(t.packages.splice(t.packages.indexOf("ulab"),1),l.push("ulab")),r=r.replace(/\.m?js$/,".wasm");for(const e of l)r=r.replace(/\.wasm$/,`-${e}.wasm`);qt("Loading MicroPython");const p=await c(e({linebuffer:!1,stderr:a,stdout:i,url:r}));globalThis[I].set("-T-",this.transform.bind(this,p));const f=Gt.bind(this,p,o);return Bt.set(p,f),t.packages&&(qt("Loading remote packages"),t.packages=await Ht([t,o]),qt("Loaded remote packages")),await jt(this,qt,p,t,o),this.writeFile(p,"./mip.py",Dt),t.packages&&(qt("Loading packages"),await f(t.packages.map(T,o)),qt("Loaded packages")),qt("Loaded MicroPython"),p.mountNativeFS||(p.mountNativeFS=Ot(p._module)),p},registerJSModule:St,run:Rt,runAsync:Ct,runEvent:$t,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=xt(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-CoY8ac0B.js").then(async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)Wt(s,i);else{Wt(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()})}case"tgz":case"tar.gz":{const t="./_.tar.gz";return X(i,t,n),void e.runPython(`\n import os, gzip, tarfile\n tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\n for f in tar:\n name = f"${r}{f.name}"\n if f.type == tarfile.DIRTYPE:\n if f.name != "./":\n os.mkdir(name.strip("/"))\n else:\n dir = os.path.dirname(name)\n if not os.path.exists(dir):\n os.mkdir(dir)\n source = tar.extractfile(f)\n with open(name, "wb") as dest:\n dest.write(source.read())\n dest.close()\n tar.close()\n os.remove("${t}")\n `)}}}return X(i,t,n)}};async function Gt(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=D(s,t),r=await c(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const Jt={dict_converter:Object.fromEntries},{stringify:Kt}=JSON,{apply:Yt}=Reflect,Vt=Function.prototype,Xt=e=>function(...t){return Yt(e,this,t)};let Zt,Qt;const en=e=>{const t=new WeakMap,n=n=>{for(let r,s=0;s<n.length;s++)switch(typeof(r=n[s])){case"object":if(null===r)break;case"function":if(Zt in r&&!r[Zt].shared?.gcRegistered){e=!1;let o=t.get(r)?.deref();if(!o){o=Qt(r);const e=new WeakRef(o);t.set(r,e),t.set(o,e)}n[s]=o,e=!0}}};Object.defineProperties(Vt,{apply:{value(t,r){return e&&n(r),Yt(this,t,r)}},call:{value(t,...r){return e&&n(r),Yt(this,t,r)}}})},tn=oe("py"),nn=new WeakMap;var rn={type:"pyodide",module:(e="0.29.3")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e,version:t},r,s,o){tn("Loading Pyodide");let{packages:a,index_urls:i}=r;if(a){if(a=a.map(T,o),!i){tn("Loading Packages Graph");const{default:e}=await import("./pyodide_graph-BvONa7d5.js");if(t in e){const n=e[t];for(const e of a){if(/^(?:\.|\/|https?:\/\/)/.test(e))continue;const r=e.split(/[>=<]=/)[0];r.toLowerCase()in n||console.warn(`Pyodide ${t} might not support ${e}. See: https://packages.pyscript.net/?q=${r}`)}}tn("Loaded Packages Graph")}tn("Loading remote packages"),r.packages=a=await Ht([r,o],a),tn("Loaded remote packages")}tn("Loading Storage");const c=s.slice(0,s.lastIndexOf("/")),l=new y(`${c}@${t}`),p={indexURL:c},f="never"!==r.packages_cache&&"0.28.0"!==t;if(await l.sync(),tn("Loaded Storage"),f||l.clear(),a&&f)if("passthrough"===r.packages_cache)p.packages=a,a=null,l.clear();else{a=a.sort();const e=Kt(a);if(l.has(e)){const n=l.get(e);if(p.packages=a.map(e=>e.split(/[>=<]=/)[0]),t.startsWith("0.27")){const e=new Blob([n],{type:"application/json"});p.lockFileURL=URL.createObjectURL(e)}else p.lockFileContents=n;a=null}}const{stderr:u,stdout:d,get:m}=n();tn("Loading interpreter");const _=await m(e({stderr:u,stdout:d,...p}));tn("Loaded interpreter"),globalThis[I].set("-T-",this.transform.bind(this,_)),r.debug&&_.setDebug(!0);const h=on.bind(_);return i&&nn.set(_,i),Bt.set(_,h),await jt(this,tn,_,r,o),a&&await h(a,l,f),await l.close(),p.lockFileURL&&URL.revokeObjectURL(p.lockFileURL),tn("Loaded Pyodide"),"auto"===r.experimental_create_proxy&&(_.runPython(["import js","from pyodide.ffi import to_js","o=js.Object.fromEntries","js.experimental_create_proxy=lambda r:to_js(r,dict_converter=o)"].join(";"),{globals:_.toPy({})}),Qt=globalThis.experimental_create_proxy,delete globalThis.experimental_create_proxy,[Zt]=Reflect.ownKeys(Qt).filter(e=>"symbol"==typeof e&&"Symbol(pyproxy.attrs)"===String(e)),en(!0)),_},registerJSModule:St,run:Xt(Rt),runAsync:Xt(Ct),runEvent:Xt($t),transform:(e,t)=>Yt(sn,e,[t]),writeFile:(e,t,n,r)=>{const s=xt(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return X({FS:o,PATH:a,PATH_FS:i},t,n)}};function sn(e){const{ffi:{PyProxy:t}}=this;if(e&&"object"==typeof e){if(e instanceof t)return e.toJs(Jt);if(e instanceof Map)return new Map([...e.entries()]);if(k(e))return e.map(sn,this)}return e}async function on(e,t,n=!1){const{log:r}=console,s=(e,...t)=>{r(e,...t),console.log=r,tn(e),console.log=s};console.log=s,await this.loadPackage("micropip");const o=this.pyimport("micropip");if(nn.has(this)&&o.set_index_urls(nn.get(this)),await o.install(e,{keep_going:!0}),console.log=r,n&&t instanceof y){const n=o.freeze();t.set(Kt(e),n)}o.destroy()}const an=new Map,cn=new Map,ln=[],pn=[],fn=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=an.get(n),o=/^(?:\.?\.?\/|[a-z0-9-]+:\/\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then(r=>(cn.set(t,e),s(r,e,n,o)))}}),un=e=>{for(const t of[].concat(e.type))an.set(t,e),ln.push(`script[type="${t}"]`),pn.push(`${t}-`)};for(const e of[zt,rn])un(e);const dn=(e,t=document)=>[...t.querySelectorAll(e)],mn=(e,t=document)=>{const n=(new XPathEvaluator).createExpression(e).evaluate(t,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE),r=[];for(let e=0,{snapshotLength:t}=n;e<t;e++)r.push(n.snapshotItem(e));return r},_n=Promise.withResolvers||function(){var e,t,n=new this((n,r)=>{e=n,t=r});return{resolve:e,reject:t,promise:n}};var yn=_n.bind(Promise);const hn=new Proxy(new Map,{get:(e,t)=>(e.has(t)||e.set(t,yn()),e.get(t))}),gn=new Set(["__dict__","constructor","get","has","includes","next","set","then"]),wn=new Proxy(Object.freeze({}),{get:(e,t)=>"string"!=typeof t||gn.has(t)?void 0:hn[t].promise.then(e=>e.sync)});let An=0;const bn=An++,vn=An++,En=An++,kn=An++,Bn=An++,jn=An++,Sn=An++,xn=An++,Rn=An++,Cn=An++,$n=An++,Dn=An++,Tn=An++,Pn=An++,On=An++;An++;const Mn=An++,Fn=An++,Ln=(e,t)=>[t?e:We(new Uint8Array(e)),e.resizable?e.maxByteLength:0],Nn=/\[('|")?(.+?)\1\]/g,In=(e,t)=>e?.[t];var Un=(e,t)=>t.replace(Nn,".$2").split(".").reduce(In,e),Hn=(e,...t)=>t.map(Wn,e);function Wn(e){return"string"==typeof e?Un(this,e):this[e]}var qn=e=>{const t=new Int32Array(1);return e&&(t[0]=e),()=>t[0]++};const zn=globalThis.Node||class{},{apply:Gn,construct:Jn,defineProperty:Kn,deleteProperty:Yn,get:Vn,getOwnPropertyDescriptor:Xn,getPrototypeOf:Zn,has:Qn,isExtensible:er,ownKeys:tr,set:nr,setPrototypeOf:rr}=Reflect;var sr=({reflect:e=Je,transform:t=Je,remote:n=Je,module:r=e=>import(e),buffer:s=!1,timeout:o=-1}=Ke)=>{const a=(t,r=new Map)=>{if(!qe(t))return t;const[s,o]=t;switch(s){case 2:{if(null===o)return globalThis;let e=r.get(t);if(!e){e=o,r.set(t,o);for(const e in o)o[e]=a(o[e],r)}return e}case 4:return r.get(t)||(r.set(t,o),c(o,r));case 8:{let t=h.get(o),r=t?.deref();return r||(t&&w.unregister(t),r=function(...t){n.apply(this,t);for(let e=0,n=t.length;e<n;e++)t[e]=i(t[e]);return e(jn,o,i(this),t).then(a)},t=new WeakRef(r),h.set(o,t),w.register(r,o,t)),r}case 16:return Ne(o);default:return 1&s?d(o):o}},i=e=>{switch(typeof e){case"object":{if(null===e)break;if(e===globalThis)return g;const n=t(e);return b&&A.has(n)||n instanceof Oe?Ge(0,n):ze(n)?Ge(68,((e,t)=>{const{BYTES_PER_ELEMENT:n,byteOffset:r,buffer:s,length:o}=e;return[ut(e),Ln(s,t),r,o!==(s.byteLength-r)/n?o:0]})(n,s)):n instanceof ArrayBuffer?Ge(64,Ln(n,s)):Ge(qe(n)?5:3,u(n))}case"function":return Ge(9,u(t(e)));case"symbol":return Ge(16,Ie(e));case"bigint":return Ge(32,e.toString())}return e},c=Ye(a),l=Ye(Ve),p=Ye(Xe),{clear:f,id:u,ref:d,unref:m}=((e=0,t=new Map,n=new Map)=>{const r=qn(e);return{clear:()=>{t.clear(),n.clear()},id:e=>{let s=n.get(e);if(void 0===s){for(;t.has(s=r()););t.set(s,e),n.set(e,s)}return s},ref:e=>t.get(e),unref:e=>(n.delete(t.get(e)),t.delete(e))}})(),_=/^(?:[0-9]+|length)$/,y=-1<o,h=new Map,g=Ge(2,null),w=new FinalizationRegistry(t=>{h.delete(t),e(bn,t)});let A,b=!1;return{assign:He,gather:Hn,query:Un,direct:e=>(b||(b=!0,A=new WeakSet),A.add(e),e),evaluate:(e,...t)=>Gn(e,null,t),reflect(e,t,...n){const s=null===t,o=s?globalThis:d(t);switch(e){case Cn:{const e=Ve(n[0]),t=s&&"import"===e,a=t?r:Vn(o,e),c=i(a);if(!y)return c;let l,p=t,f=o;if(!t&&!(f instanceof zn||qe(f)&&"string"==typeof e&&_.test(e)))if(e in o){for(;!(l=Xn(f,e))&&(f=Zn(f),f););p=!!l&&"value"in l}else p=!0;return[p,c]}case jn:{const e=new Map;return i(Gn(o,a(n[0],e),c(n[1],e)))}case Mn:return nr(o,Ve(n[0]),a(n[1]));case Tn:return Qn(o,Ve(n[0]));case On:return p(tr(o),h);case Sn:return i(Jn(o,c(n[0])));case $n:{const e=Xn(o,Ve(n[0]));if(e)for(const t in e)e[t]=i(e[t]);return e}case xn:return Kn(o,Ve(n[0]),a(n[1]));case Rn:return Yn(o,Ve(n[0]));case Dn:return i(Zn(o));case Fn:return rr(o,a(n[0]));case vn:return void He(o,a(n[0]));case En:{const e=a(n[0]),t=Function(`return(${e}).apply(null,arguments)`);return i(Gn(t,null,c(n[1])))}case kn:for(let e,t=0,r=(n=l(n[0],h)).length;t<r;t++)e=n[t],n[t]=i("string"==typeof e?Un(o,e):o[e]);return n;case Bn:return i(Un(o,n[0]));case bn:return m(t);case Pn:return er(o)}},terminate(){for(const e of h.values())w.unregister(e);h.clear(),f()}}};const{addEventListener:or}=EventTarget.prototype,ar=new WeakMap;Reflect.defineProperty(EventTarget.prototype,"addEventListener",{value(e,t,n){const r=n?.invoke;if(r){let t=ar.get(this);t||ar.set(this,t=new Map),t.set(e,[].concat(r)),delete n.invoke}return or.apply(this,arguments)}});const ir="59317780",cr="="+ir,lr="-"+ir;var pr=(e=e=>e)=>{const t=new Map,n=qn();return[()=>{let r;do{r=e(n())}while(t.has(r));const s=yn();return t.set(r,s),[r,s.promise]},(e,n,r)=>{const s=t.get(e);t.delete(e),r?s?.reject(r):s?.resolve(n)}]};const fr=[],ur=new WeakSet,dr=(...e)=>(ur.add(e),e);let{SharedArrayBuffer:mr}=globalThis,_r=!0;try{new mr(4,{maxByteLength:8})}catch(e){_r=!1,mr=class extends ArrayBuffer{get growable(){return super.resizable}grow(e){super.resize(e)}}}const{assign:yr,create:hr}=Object,gr=`coincident-${_r?crypto.randomUUID():Math.random().toString(36).substring(2)}`,wr={byteOffset:2*Int32Array.BYTES_PER_ELEMENT},Ar=(e,t,n)=>{const r="then"!==t;return r&&(e[t]=n),r},br=e=>{e.stopImmediatePropagation(),e.preventDefault()},vr=(e,t=-1)=>e?.reflected_ffi_timeout??t,{defineProperty:Er}=Object,[kr,Br]=pr();let[jr,Sr]=kr(),xr=()=>Sr,{Atomics:Rr,MessageChannel:Cr,Worker:$r}=globalThis;if(_r)Br(jr);else{const e=new Map,t=(e,...t)=>{e.addEventListener(...t)};if("importScripts"in globalThis){t(globalThis,"message",e=>{br(e),Br(jr,e.data)},{once:!0});const{wait:n}=Rr,{parse:r}=JSON,s=t=>{const n=new XMLHttpRequest;try{if(n.timeout=3e3,n.open("POST",`${i}?sabayon`,!1),n.setRequestHeader("Content-Type","application/json"),n.send(`["${a}",${e.get(t)}]`),200===n.status)return n;throw n}catch{return n.abort(),s(t)}},o=(e,t)=>(e.set(r(t.responseText)),"ok");let a,i;Rr={wait:(t,...r)=>e.has(t)?o(t,s(t)):n(t,...r)},Sr=Sr.then(e=>{[a,i]=e})}else{const n=[gr,Math.random()].join("-").replace(/\W/g,"-"),r=new BroadcastChannel("dc78209b-186c-4f83-80e9-406becb7d9f3");r.onmessage=async t=>{const[s,o,a]=t.data;if(o===n)for(const[t,[n,o]]of e)if(n===a){await o.promise;let e=t.length;for(;e--&&!t[e];);r.postMessage([s,t.slice(0,e+1)]);break}};const s=t=>{const[n,r,s]=t.data;e.set(r,[n,yn()]),Er(t,"data",{value:s})};Cr=class extends Cr{constructor(){super(),t(this.port1,"message",s)}},$r=class extends $r{constructor(e,t){super(e,t),super.postMessage([n,a])}};const{notify:o}=Rr;Rr={notify(t,...n){const r=e.get(t);return r?(r[1].resolve(),0):o(t,...n)}};let a="",i=null;const c=(e,n)=>{let r,s=!0;e.getRegistration(a).then(t=>t??e.register(a,n)).then(function n(o){const{controller:i}=e;if(s=s&&!!i,r=o.installing||o.waiting||o.active,"activated"===r.state){if(s){if(i.scriptURL===a)return Br(jr);o.unregister()}location.reload()}else t(r,"statechange",()=>n(o),{once:!0})})};xr=(e,t)=>{if(!i){const n=new URL(e,location.href);a=`${n.protocol}//${n.host}${n.pathname}`,c(navigator.serviceWorker,t),i=Sr}return i}}}const Dr="InstallTrigger"in globalThis?gr:"",Tr=e=>e,Pr=e=>e===cr?"main":e===lr?"worker":e;class Or extends Event{#a;constructor(e){super("message"),this.#a=e}get data(){return this.#a}}var Mr=e=>{const t=e?.transform,n=vr(e),r=(e?.encoder||Et)(wr),s=!1!==e?.transfer;return{Worker:class extends $r{constructor(e,o){const a=_r?"":o?.serviceWorker||"",{notify:i}=a?Rr:Atomics,{port1:c,port2:l}=new(a?Cr:MessageChannel),[p,f]=pr(Tr),u=new Map,d=hr(null);a&&xr(a);let m="";super(e,yr({type:"module"},o)),this.proxy=new Proxy(d,{get:(e,n)=>{if("then"===n)return;let r=u.get(n);return r||u.set(n,r=(...e)=>{const r=((e,t)=>{let n=fr;return e&&qe(t.at(-1))&&ur.has(t.at(-1))&&(n=t.pop(),ur.delete(n)),n})(s,e),[o,a]=p();return c.postMessage([o,n,t?e.map(t):e],r),((e,t)=>{if(m){const n=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${Pr(m)}() awaiting proxy.${Pr(t)}() ?`);e=e.then(e=>(clearTimeout(n),e),e=>(clearTimeout(n),Promise.reject(e)))}return e})(a,n)}),r},set:Ar}),Dr&&(_r||a)&&super.addEventListener("message",e=>{const{data:t}=e;t?.ID===Dr&&(br(e),c.dispatchEvent(new Or(t.data)))}),super.postMessage([Dr,a,vr(o,n)],[l]),c.addEventListener("message",async({data:e})=>{const n=e[0],s=typeof n;if("number"===s)f.apply(null,e);else if(m=e[1],await(async(e,t,n)=>{try{const r=await t[e[1]].apply(null,e[2]);e[1]=n?n(r):r,e[2]=null}catch(t){e[2]=t}})(e,d,t),m="","string"===s)c.postMessage(e);else{const t=e[2]||e[1],s=void 0===t?0:r(t,n.buffer);n[1]="number"==typeof s?s:await s,n[0]=1,i(n,0)}}),c.start()}},native:_r,transfer:dr}};const{url:Fr}=import.meta,Lr=/import\((['"])([^)]+?\.js)\1\)/g,Nr=(e,t,n)=>`import(${t}${new URL(n,Fr).href}${t})`,Ir=Symbol.for("polyscript.js_modules");let Ur;const{Worker:Hr}=(e=>{const t=e?.import,n=vr(e),r=Mr({...e,encoder:e?.encoder||Et});class s extends r.Worker{#i;constructor(e,r){const{proxy:s}=super(e,r),o=sr({...r,buffer:!0,reflect:s[lr],timeout:vr(r,n),remote(e){e instanceof Event&&(e=>{const{currentTarget:t,target:n,type:r}=e,s=ar.get(t||n)?.get(r);if(s)for(const t of s)e[t]()})(e)},module:r?.import||t||(e=>import(new URL(e,location).href))});this.#i=o.terminate,this.ffi={assign:o.assign,direct:o.direct,evaluate:o.evaluate,gather:o.gather,query:o.query},s[cr]=o.reflect}terminate(){this.#i(),super.terminate()}}return{...r,Worker:s}})({transfer:!1,transform:e=>(Ur||(Ur=globalThis[Ir]?.get("-T-")))?.(e)??e});const{parse:Wr}=JSON,qr=(e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[D(e),n]},zr=(e,t,n={})=>{const[r,s]=qr(e,t);if("json"===s)n=c(r).json();else if("toml"===s){const{parser:e}=n;n=c(r).text().then(async t=>{const n=e?await import(e):{parse:Tt};return(n.parse||n.default)(t)})}else"string"===s?n=Gr(e):"object"===s&&e?n=e:"txt"===s&&"string"==typeof n&&(n=Gr(n));return[n,e=r]},Gr=e=>{try{return Wr(e)}catch(t){return Tt(e)}},Jr=(e,t,n,r={})=>(t&&([r,t]=zr(t,n,r)),$(r).then(n=>fn[e](n,t))),Kr=(e,t="")=>`${e}@${t}`.replace(/@$/,"");function Yr(e=this){return String(e).replace(/^(async\s*)?(\bfunction\b)?(.*?)\(/,(e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e)}const Vr="BeforeRun",Xr="AfterRun",Zr=[`code${Vr}`,`code${Vr}Async`,`code${Xr}`,`code${Xr}Async`],Qr=["onWorker","onReady",`on${Vr}`,`on${Vr}Async`,`on${Xr}`,`on${Xr}Async`];function es(e,t){const{run:n,runAsync:r}=an.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const ts=(e,t,n,r,s,o)=>{if(s||o){const a=es.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let ns=class{constructor(e,t={}){const{main:n,worker:r}=t;this.interpreter=e,this.onWorker=n?.onWorker;for(const e of Qr.slice(1))this[e]=r?.[e];for(const e of Zr)this[e]=r?.[e]}toJSON(){const e={};for(const t of Qr.slice(1))this[t]&&(e[t]=Yr(this[t]));for(const t of Zr)this[t]&&(e[t]=v(this[t]()));return e}};var rs=(...e)=>function(t,n){if(e.length){const[t,r]=e;(n=B({},n||{type:t,version:r})).type||(n.type=t)}const[r]=qr(n.config,n.configURL),s=((...e)=>new Hr(URL.createObjectURL(new Blob(["/*@*/"+'const{assign:e}=Object,t="entries",n="readonly",r="readwrite",s={durability:"default",prefix:"IDBMap"},o=({target:{result:e}})=>e;class a extends EventTarget{#e;#t;#n;async#r(n,r){const s=(await this.#e).transaction(t,r,this.#t);return new Promise((r,o)=>e(n(s.objectStore(t)),{onsuccess:r,onerror:o}))}constructor(n,{durability:r=s.durability,prefix:a=s.prefix}=s){super(),this.#n=a,this.#t={durability:r},this.#e=new Promise((r,s)=>{e(indexedDB.open(`${this.#n}/${n}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(t),n.oncomplete=()=>r(e)},onsuccess(e){r(o(e))},onerror(e){s(e),this.dispatchEvent(e)}})}).then(e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e})}dispatchEvent(t){const{type:n,message:r,isTrusted:s}=t;return super.dispatchEvent(s?e(new Event(n),{message:r}):t)}async close(){(await this.#e).close()}get size(){return this.#r(e=>e.count(),n).then(o)}async clear(){await this.#r(e=>e.clear(),r)}async delete(e){await this.#r(t=>t.delete(e),r)}async entries(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e).then(t=>[e,t])))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r(t=>t.get(e),n).then(o)}async has(e){return void 0!==await this.#r(t=>t.getKey(e),n).then(o)}async keys(){return await this.#r(e=>e.getAllKeys(),n).then(o)}async set(e,t){return await this.#r(n=>n.put(t,e),r),this}async values(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e)))}get[Symbol.toStringTag](){return this.#n}}class i extends Map{#s;#o;constructor(...e){super(),this.#s=new a(...e),this.#o=this.#s.entries().then(e=>{for(const[t,n]of e)super.set(t,n)})}async close(){await this.#o,await this.#s.close()}async sync(){await this.#o}clear(){return this.#o=this.#o.then(()=>this.#s.clear()),super.clear()}delete(e){return this.#o=this.#o.then(()=>this.#s.delete(e)),super.delete(e)}set(e,t){return this.#o=this.#o.then(()=>this.#s.set(e,t)),super.set(e,t)}}const c="59317780",l="="+c,u="-"+c;let p=0;const f=p++,d=p++,h=p++,y=p++,m=p++,g=p++,w=p++,_=p++,b=p++,A=p++,k=p++,E=p++,v=p++,S=p++,x=p++,$=p++,B=p++,j=p++,P=p++,M=p++,D=p++,F=p++,T=p++,R=p++,L=p++,O=p++,C=p++,I=p++;const U=globalThis.ImageData||class{},H=new TextDecoder,W=new TextEncoder,N=new Map(Reflect.ownKeys(Symbol).map(e=>[Symbol[e],`@${String(e)}`])),q=e=>{switch(e[0]){case"@":return Symbol[e.slice(1)];case"#":return Symbol.for(e.slice(1));case"!":return Symbol(e.slice(1));default:return Symbol()}},z=e=>N.get(e)||((e,t)=>void 0===t?"?":void 0===Symbol.keyFor(e)?`!${t}`:`#${t}`)(e,e.description),J=Object.defineProperty,K=Object.assign,G=Array.isArray,V=ArrayBuffer.isView,X=(e,t)=>[e,t],Y=e=>e,Z=[],Q={},ee=function(){},te=e=>(t,n=new Map)=>{for(let r=0,s=t.length;r<s;r++)t[r]=e(t[r],n);return t},ne=([e,t])=>0===e?t:q(t),re=e=>"string"==typeof e?X(0,e):X(16,z(e)),se=(e,t)=>{for(let n=e.push,r=0,s=t.length;r<s;r+=32767)n.apply(e,t.subarray(r,r+32767))},oe=new ArrayBuffer(8),ae=new DataView(oe),ie=new Uint8Array(oe),ce=(e,t,n)=>(e.set(t,n),n),le=e=>{ie[0]=e[fe++],ie[1]=e[fe++],ie[2]=e[fe++],ie[3]=e[fe++],ie[4]=e[fe++],ie[5]=e[fe++],ie[6]=e[fe++],ie[7]=e[fe++]},ue=e=>(ie[0]=e[fe++],ie[1]=e[fe++],ie[2]=e[fe++],ie[3]=e[fe++],ae.getUint32(0,!0)),pe=(e,t)=>{switch(e[fe++]){case m:return le(e),ae.getFloat64(0,!0);case g:return e[fe++];case D:{const n=ce(t,fe-1,{});for(let r=0,s=ue(e);r<s;r++)n[pe(e,t)]=pe(e,t);return n}case $:{const n=ce(t,fe-1,[]);for(let r=0,s=ue(e);r<s;r++)n.push(pe(e,t));return n}case R:{const n=fe-1,r=pe(e,t);return ce(t,n,new globalThis[r](pe(e,t)))}case B:{const n=fe-1,r=ue(e);return ce(t,n,e.slice(fe,fe+=r).buffer)}case S:{const n=fe-1,r=ue(e);return ce(t,n,H.decode(e.slice(fe,fe+=r)))}case j:return ce(t,fe-1,new Date(pe(e,t)));case M:{const n=ce(t,fe-1,new Map);for(let r=0,s=ue(e);r<s;r++)n.set(pe(e,t),pe(e,t));return n}case T:{const n=ce(t,fe-1,new Set);for(let r=0,s=ue(e);r<s;r++)n.add(pe(e,t));return n}case P:{const n=fe-1,r=pe(e,t),s=pe(e,t),o=pe(e,t),a=new(globalThis[r]||Error)(s);return ce(t,n,J(a,"stack",{value:o}))}case L:{const n=fe-1,r=pe(e,t),s=pe(e,t),o=pe(e,t),a=pe(e,t),i=pe(e,t);return ce(t,n,new U(r,s,o,{colorSpace:a,pixelFormat:i}))}case F:{const n=fe-1,r=pe(e,t),s=pe(e,t);return ce(t,n,new RegExp(r,s))}case f:return!1;case d:return!0;case w:return NaN;case _:return 1/0;case b:return-1/0;case A:return 0;case k:return-0;case y:return null;case E:return le(e),ae.getBigInt64(0,!0);case v:return le(e),ae.getBigUint64(0,!0);case x:return q(pe(e,t));case I:return t.get(ue(e));case O:{const n=fe-1,r=pe(e,t),s=pe(e,t);return ce(t,n,new Blob([e.slice(fe,fe+=s)],{type:r}))}case C:{const n=fe-1,r=pe(e,t),s=pe(e,t),o=pe(e,t);return ce(t,n,new File([o],r,{type:o.type,lastModified:s}))}default:return}};let fe=0;const de=e=>(fe=0,pe(e,new Map)),he=({byteOffset:e=0}={})=>(t,n)=>de(new Uint8Array(n,e,t));let ye=0;const me=ye++,ge=ye++,we=ye++,_e=ye++,be=ye++,Ae=ye++,ke=ye++,Ee=ye++,ve=ye++,Se=ye++,xe=ye++,$e=ye++,Be=ye++,je=ye++,Pe=ye++;ye++;const Me=ye++,De=ye++,{getPrototypeOf:Fe}=Object,{construct:Te}=Reflect,{toStringTag:Re}=Symbol,{toString:Le}=Q,Oe=(e,t=Le.call(e).slice(8,-1))=>t in globalThis?t:Oe(Fe(e)||Q),Ce=(e,t=e[Re])=>t in globalThis?t:Ce(Te(Fe(e.constructor),[0])),Ie=(e,t)=>new ArrayBuffer(e,{maxByteLength:t}),Ue=([e,t],n)=>{const r=n?e.byteLength:e.length;if(n){if(t){const n=Ie(r,t);new Uint8Array(n).set(new Uint8Array(e)),e=n}}else{const n=t?Ie(r,t):new ArrayBuffer(r);new Uint8Array(n).set(e),e=n}return e};const He=/\\[(\'|")?(.+?)\\1\\]/g,We=(e,t)=>e?.[t];var Ne=e=>{const t=new Int32Array(1);return e&&(t[0]=e),()=>t[0]++},qe=e=>{const t=[],n=e=>{const n=t.splice(e);for(;e<n.length;)n[e++].delete(n[e++])};return class r extends Map{static keys=Symbol();static proto=Symbol();drop(e,t){return e!==r.proto&&super.delete(r.keys),super.delete(e),t}set(r,s){return((r,s)=>{t.push(r,s)<3&&setTimeout(n,e,0)})(super.set(r,s),r),s}}},ze=({reflect:e=Y,transform:t=Y,released:n=Y,buffer:r=!1,timeout:s=-1}=Q)=>{const o=te(ne),a=te(re),i=e=>{if(!G(e))return e;const[t,n]=e;if(1&t)return u(t,n);switch(t){case 2:return x;case 0:return n;case 16:return q(n);case 32:return BigInt(n);case 68:return(([e,t,n,r],s)=>{const o=Ue(t,s),a=globalThis[e];return r?new a(o,n,r):new a(o,n)})(n,r);case 64:return Ue(n,r)}},c=(e,n=new Map)=>{switch(typeof e){case"object":{if(null===e)break;if(e===globalThis)return S;if(v in e)return g;let r=n.get(e);if(!r){const s=t(e);if(w||!m.has(s)){if(G(s)){const t=[];r=X(4,t),n.set(e,r);for(let e=0,r=s.length;e<r;e++)t[e]=c(s[e],n);return r}if(!(V(s)||s instanceof ArrayBuffer||"Object"!==Oe(s))){const t={};r=X(2,t),n.set(e,r);for(const e in s)t[e]=c(s[e],n);return r}}r=X(0,s),n.set(e,r)}return r}case"function":{if(v in e)return g;let r=n.get(e);if(!r){const s=t(e);r=X(8,b(s)),n.set(e,r)}return r}case"symbol":return X(16,z(e))}return e},l=te(c),u=(e,t)=>{let n=E.get(t),r=n?.deref();return r||(n&&$.unregister(n),r=9===e?new Proxy(ee,new y(e,t)):new Proxy(3===e?Q:Z,new h(e,t)),n=new WeakRef(r),E.set(t,n),$.register(r,t,n)),r},p=e=>{switch(typeof e){case"object":if(null===e)break;case"function":return v in e}return!1},f=-1<s,d=f?qe(s):Map;class h{constructor(e,t){this.t=e,this.v=t,f&&(this.$=new d)}get(t,n){if(f&&this.$.has(n))return this.$.get(n);const r=e(Se,this.v,re(n));return f?r[0]?this.$.set(n,i(r[1])):i(r[1]):i(r)}set(t,n,r){const s=e(Me,this.v,re(n),c(r));return f?this.$.drop(n,s):s}has(t,n){return n===v?(g=[this.t,this.v],!0):e(Be,this.v,re(n))}_oK(){return o(e(Pe,this.v),E)}ownKeys(e){return f?this.$.has(d.keys)?this.$.get(d.keys):this.$.set(d.keys,this._oK()):this._oK()}getOwnPropertyDescriptor(t,n){const r=i(e(xe,this.v,re(n)));if(r)for(const e in r)r[e]=i(r[e]);return r}defineProperty(t,n,r){const s=e(Ee,this.v,re(n),c(r));return f?this.$.drop(n,s):s}deleteProperty(t,n){const r=e(ve,this.v,re(n));return f?this.$.drop(n,r):r}_gPO(){return i(e($e,this.v))}getPrototypeOf(e){return f?this.$.has(d.proto)?this.$.get(d.proto):this.$.set(d.proto,this._gPO()):this._gPO()}setPrototypeOf(t,n){const r=e(De,this.v,c(n));return f?this.$.drop(d.proto,r):r}isExtensible(t){return e(je,this.v)}preventExtensions(e){return!1}}class y extends h{construct(t,n){return i(e(ke,this.v,l(n)))}apply(t,n,r){const s=new Map;return i(e(Ae,this.v,c(n,s),l(r,s)))}get(e,t){switch(t){case"apply":return(t,n)=>this.apply(e,t,n);case"call":return(t,...n)=>this.apply(e,t,n);default:return super.get(e,t)}}}let m,g,w=!0;const{apply:_}=Reflect,{id:b,ref:A,unref:k}=((e=0,t=new Map,n=new Map)=>{const r=Ne(e);return{clear:()=>{t.clear(),n.clear()},id:e=>{let s=n.get(e);if(void 0===s){for(;t.has(s=r()););t.set(s,e),n.set(e,s)}return s},ref:e=>t.get(e),unref:e=>(n.delete(t.get(e)),t.delete(e))}})(),E=new Map,v=Symbol("reflected-ffi"),S=X(2,null),x=new Proxy(Q,new h(2,null)),$=new FinalizationRegistry(t=>{E.delete(t),e(me,t)});return{global:x,isProxy:p,assign(t,...n){const r=p(t),s=K(r?{}:t,...n);return r&&e(ge,g[1],c(s)),t},direct:e=>(w&&(w=!1,m=new WeakSet),m.add(e),e),evaluate:(t,...n)=>i(e(we,null,function(e=this){return String(e).replace(/^(async\\s*)?(\\bfunction\\b)?(.*?)\\(/,(e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e)}(t),l(n))),gather(t,...n){const r=p(t),s=r?i:e=>t[e];r&&(n=e(_e,g[1],a(n,E)));for(let e=0;e<n.length;e++)n[e]=s(n[e]);return n},query:(t,n)=>p(t)?i(e(be,g[1],n)):((e,t)=>t.replace(He,".$2").split(".").reduce(We,e))(t,n),reflect:async(e,t,...r)=>{switch(e){case Ae:{const[e,n]=r;for(let e=0,t=n.length;e<t;e++)n[e]=i(n[e]);return c(await _(A(t),i(e),n))}case me:return n(A(t)),k(t)}}}};const Je=Promise.withResolvers||function(){var e,t,n=new this((n,r)=>{e=n,t=r});return{resolve:e,reject:t,promise:n}};var Ke=Je.bind(Promise),Ge=(e=e=>e)=>{const t=new Map,n=Ne();return[()=>{let r;do{r=e(n())}while(t.has(r));const s=Ke();return t.set(r,s),[r,s.promise]},(e,n,r)=>{const s=t.get(e);t.delete(e),r?s?.reject(r):s?.resolve(n)}]};const Ve=[],Xe=new WeakSet,Ye=(...e)=>(Xe.add(e),e);let{SharedArrayBuffer:Ze}=globalThis,Qe=!0;try{new Ze(4,{maxByteLength:8})}catch(e){Qe=!1,Ze=class extends ArrayBuffer{get growable(){return super.resizable}grow(e){super.resize(e)}}}const{create:et}=Object,tt=`coincident-${Qe?crypto.randomUUID():Math.random().toString(36).substring(2)}`,nt=2*Int32Array.BYTES_PER_ELEMENT,rt={byteOffset:nt},st=(e,t,n)=>{const r="then"!==t;return r&&(e[t]=n),r},ot=e=>{e.stopImmediatePropagation(),e.preventDefault()},[at,it]=Ge();let[ct,lt]=at(),ut=()=>lt,pt=()=>{},{Atomics:ft,MessagePort:dt,SharedArrayBuffer:ht,postMessage:yt}=globalThis;if(Qe)it(ct);else{ht=Ze;const e=new Map,t=(e,...t)=>{e.addEventListener(...t)};if("importScripts"in globalThis){pt=t=>{e.set(t,null)};const n=t=>{const n=t[0],r=p++;return e.set(n,r),[r,n,t]},r=yt;yt=function(e,t){if(u){const s={ID:e.ID,data:n(e.data)};r(s,t)}else lt.then(()=>this.postMessage(e,t))},dt=class extends dt{postMessage(e,t){u?super.postMessage(n(e),t):lt.then(()=>this.postMessage(e,t))}},t(globalThis,"message",e=>{ot(e),it(ct,e.data)},{once:!0});const{wait:s}=ft,{parse:o}=JSON,a=t=>{const n=new XMLHttpRequest;try{if(n.timeout=3e3,n.open("POST",`${l}?sabayon`,!1),n.setRequestHeader("Content-Type","application/json"),n.send(`["${c}",${e.get(t)}]`),200===n.status)return n;throw n}catch{return n.abort(),a(t)}},i=(e,t)=>(e.set(o(t.responseText)),"ok");ft={wait:(t,...n)=>e.has(t)?i(t,a(t)):s(t,...n)};let c,l,u=!1,p=Math.random();lt=lt.then(e=>{[c,l]=e,u=!0})}else{const n=[tt,Math.random()].join("-").replace(/\\W/g,"-"),r=new BroadcastChannel("dc78209b-186c-4f83-80e9-406becb7d9f3");r.onmessage=async t=>{const[s,o,a]=t.data;if(o===n)for(const[t,[n,o]]of e)if(n===a){await o.promise;let e=t.length;for(;e--&&!t[e];);r.postMessage([s,t.slice(0,e+1)]);break}};const{notify:s}=ft;ft={notify(t,...n){const r=e.get(t);return r?(r[1].resolve(),0):s(t,...n)}};let o="",a=null;const i=(e,n)=>{let r,s=!0;e.getRegistration(o).then(t=>t??e.register(o,n)).then(function n(a){const{controller:i}=e;if(s=s&&!!i,r=a.installing||a.waiting||a.active,"activated"===r.state){if(s){if(i.scriptURL===o)return it(ct);a.unregister()}location.reload()}else t(r,"statechange",()=>n(a),{once:!0})})};ut=(e,t)=>{if(!a){const n=new URL(e,location.href);o=`${n.protocol}//${n.host}${n.pathname}`,i(navigator.serviceWorker,t),a=lt}return a}}}const{setPrototypeOf:mt}=Reflect;let{postMessage:gt}=globalThis;const wt=Ke(),_t=dt.prototype;addEventListener("message",e=>{ot(e);const[t,n,r]=e.data,[s]=e.ports;n&&(mt(s,_t),t&&(gt=yt)),wt.resolve([t,n,r,s])},{once:!0});var bt=async e=>{const[t,n,r,s]=await ut().then(()=>wt.promise),o=!!t,a=Qe||!!n,i=e?.transform,c=(e?.decoder||he)(rt),l=!1!==e?.transfer;let u,p,f,d;if(a){const t=new(n?ht:SharedArrayBuffer)(e?.minByteLength||32767,{maxByteLength:e?.maxByteLength||16777216});u=new Int32Array(t),n?(({wait:d}=ft),pt(u)):(({load:p,pause:f,wait:d}=Atomics),f&&(d=(e,t)=>{do{f()}while(p(e,t)<1)}))}const[h,y]=Ge(String),m=new Map,g=et(null),w=new Proxy(g,{get(e,n){if("then"===n)return;let r=m.get(n);return r||m.set(n,r=(...e)=>{const r=((e,t)=>{let n=Ve;return e&&G(t.at(-1))&&Xe.has(t.at(-1))&&(n=t.pop(),Xe.delete(n)),n})(l,e),p=[u,n,i?e.map(i):e];if(a){o?gt({ID:t,data:p},r):s.postMessage(p,r),d(u,0),u[0]=0;const e=u[1]?c(u[1],u.buffer):void 0;if(e instanceof Error)throw e;return e}{const[e,t]=h();return p[0]=e,s.postMessage(p,r),t}}),r},set:st});return s.addEventListener("message",async({data:e})=>{"string"==typeof e[0]?y.apply(null,e):(await(async(e,t,n)=>{try{const r=await t[e[1]].apply(null,e[2]);e[1]=n?n(r):r,e[2]=null}catch(t){e[2]=t}})(e,g,i),s.postMessage(e))}),s.start(),{native:Qe,proxy:w,ffi_timeout:r,sync:a,transfer:Ye}};const At={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\\r\\n]+/))if(t.trim().length){/^(\\s+)/.test(t)&&(e=e.replace(new RegExp("^"+RegExp.$1,"gm"),""));break}return e}},kt=new WeakMap,Et=e=>{const t=e||console,n={buffered:St,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return kt.set(t,n),t}}},vt=new TextDecoder,St=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(vt.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},xt=(e,...t)=>At[typeof e](e,...t),{isArray:$t}=Array,{assign:Bt,create:jt,defineProperty:Pt,entries:Mt}=Object,{all:Dt,resolve:Ft}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),Tt=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href;function Rt(e){return e.startsWith(".")?Tt(e,this):e}const Lt=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},Ot=e=>Function(`\'use strict\';return (${e})`)(),Ct=e=>e.replace(/^(?:\\n|\\r\\n)/,""),It=Symbol.for("polyscript.js_modules"),Ut=new Map;Pt(globalThis,It,{value:Ut}),new Proxy(Ut,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]});const Ht=(e,t)=>!t.startsWith("_"),Wt=(e,t)=>new Proxy(e,{has:Ht,get:(e,n)=>e[t][n]}),Nt=(e,t)=>import(e).then(e=>{Ut.set(t,{...e})}),qt=e=>new Promise((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(Bt(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))}),zt=e=>/\\.css$/i.test(new URL(e).pathname),Jt=(e,t)=>e.has(t),Kt=e=>[...e.keys()];var Gt=(e,t,n,r)=>{const s=globalThis[It];if(n)for(let[e,t]of Mt(n)){let n=s.get(t);n&&!$t(n)||(s.set(t,n||(n=[])),n.push(e))}return((e,t,n,r)=>new Proxy(e,{has:Jt,ownKeys:Kt,get:(e,s)=>{let o=e.get(s);if($t(o)){let a=o;o=null;for(let e of a)e=Tt(e,r),zt(e)?n.importCSS(e):(n.importJS(e,s),o=t[It].get(s));e.set(s,o)}return o}}))(s,e,t,r)};const Vt=Object.getOwnPropertyDescriptors(Response.prototype),Xt=e=>"function"==typeof e,Yt={get:(e,t)=>Vt.hasOwnProperty(t)?((e,t,{get:n,value:r})=>n||!Xt(r)?e.then(e=>e[t]):(...n)=>e.then(e=>e[t](...n)))(e,t,Vt[t]):((e,t)=>Xt(t)?t.bind(e):t)(e,e[t])};var Zt=(e,...t)=>new Proxy(fetch(e,...t).then(t=>t.ok?t:Promise.reject(new Error(`[${t.status}] Unable to fetch ${e}`))),Yt);const Qt=!globalThis.window,en=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):tn(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},tn=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},nn=e=>{const t=e.map(e=>e.trim().replace(/(^[/]*|[/]*$)/g,"")).filter(e=>""!==e&&"."!==e).join("/");return e[0].startsWith("/")?`/${t}`:t},rn=(e,t)=>Zt(Tt(e,t)).arrayBuffer(),sn=(e,t,n,r)=>Dt((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use \'to_file\' and \'files\' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn\'t determine the filename from the path ${r}, please supply \'to_file\' parameter.`)}return e.flatMap(({from:e="",to_folder:t=".",to_file:n,files:r})=>{if($t(r))return r.map(n=>({url:nn([e,n]),path:nn([t,n])}));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:nn([t,s])}]})})(n).map(({url:n,path:s})=>rn(n,r).then(n=>e.writeFile(t,s,n)))),on=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,an=(e,t)=>e.replace(/\\{.+?\\}/g,e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)}),cn=(e,t,n,r)=>Dt((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of Mt(e))if(/^\\{.+\\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,an(o,t))}else{const e=an(s,t),a=on(e,an(o||"./",t));if(n.has(a)&&!a.endsWith("/*"))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map(({url:n,path:s})=>rn(n,r).then(r=>e.writeFile(t,s,r,n)))),ln=e=>t=>{dispatchEvent(new CustomEvent(`${e}:progress`,{detail:t}))},{isNaN:un,isFinite:pn,isInteger:fn}=Number,{ownKeys:dn}=Reflect,{is:hn}=Object,yn=(e,t,n)=>{const r=n.get(e),s=!r;return s?(ae.setUint32(0,t.length,!0),n.set(e,[ie[0],ie[1],ie[2],ie[3]])):t.push(I,r[0],r[1],r[2],r[3]),s},mn=(e,t,n)=>{ae.setUint32(0,n,!0),e.push(t,ie[0],ie[1],ie[2],ie[3])},gn=(e,t,n)=>{switch(typeof e){case"number":e&&pn(e)?fn(e)&&e<256&&-1<e?t.push(g,e):(ae.setFloat64(0,e,!0),t.push(m,ie[0],ie[1],ie[2],ie[3],ie[4],ie[5],ie[6],ie[7])):un(e)?t.push(w):e?t.push(e<0?b:_):t.push(hn(e,0)?A:k);break;case"object":switch(!0){case null===e:t.push(y);break;case!yn(e,t,n):break;case G(e):{const r=e.length;mn(t,$,r);for(let s=0;s<r;s++)gn(e[s],t,n);break}case V(e):if(t.push(R),gn(Ce(e),t,n),e=e.buffer,!yn(e,t,n))break;case e instanceof ArrayBuffer:{const n=new Uint8Array(e);mn(t,B,n.length),_n(t,n);break}case e instanceof Date:t.push(j),gn(e.getTime(),t,n);break;case e instanceof Map:mn(t,M,e.size);for(const[r,s]of e)gn(r,t,n),gn(s,t,n);break;case e instanceof Set:mn(t,T,e.size);for(const r of e)gn(r,t,n);break;case e instanceof Error:t.push(P),gn(e.name,t,n),gn(e.message,t,n),gn(e.stack,t,n);break;case e instanceof U:t.push(L),gn(e.data,t,n),gn(e.width,t,n),gn(e.height,t,n),gn(e.colorSpace,t,n),gn(e.pixelFormat,t,n);break;case e instanceof RegExp:t.push(F),gn(e.source,t,n),gn(e.flags,t,n);break;case e instanceof File:t.push(C),gn(e.name,t,n),gn(e.lastModified,t,n);case e instanceof Blob:{const r=e.size;t.push(O),gn(e.type,t,n),gn(r,t,n);const s=t.length;_n(t,new Uint8Array(r)),wn.push(e.arrayBuffer().then(e=>[s,e]));break}default:if("toJSON"in e){const r=e.toJSON();gn(r===e?null:r,t,n)}else{const r=dn(e),s=r.length;mn(t,D,s);for(let o=0;o<s;o++){const s=r[o];gn(s,t,n),gn(e[s],t,n)}}}break;case"string":if(yn(e,t,n)){const n=W.encode(e);mn(t,S,n.length),_n(t,n)}break;case"boolean":t.push(e?d:f);break;case"symbol":t.push(x),gn(z(e),t,n);break;case"bigint":{let n=E;9223372036854775807n<e?(ae.setBigUint64(0,e,!0),n=v):ae.setBigInt64(0,e,!0),t.push(n,ie[0],ie[1],ie[2],ie[3],ie[4],ie[5],ie[6],ie[7]);break}default:t.push(h)}},wn=[];let _n=se;const bn={parse:de,stringify:e=>{const t=[];return _n=se,gn(e,t,new Map),t}},An=new WeakMap,kn=async(e,t,n,r,s)=>{r.files&&(t("Loading files"),await cn(e,n,r.files,s),t("Loaded files")),r.fetch&&(t("Loading fetch"),await sn(e,n,r.fetch,s),t("Loaded fetch")),r.js_modules&&(t("Loading JS modules"),await(({main:e,worker:t},n)=>{const r=[];if(t&&Qt)for(let[e,s]of Mt(t))e=Tt(e,n),r.push(Nt(e,s));if(e&&!Qt)for(let[t,s]of Mt(e))t=Tt(t,n),zt(t)?qt(t):r.push(Nt(t,s));return Dt(r)})(r.js_modules,s),t("Loaded JS modules"))},En=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await An.get(e)(t),t.map(t=>e.pyimport(t))),n.storage=async e=>{const t=new i(e);return await t.sync(),t},n.JSON=bn),e.registerJsModule(t,n)},vn=(e,t)=>{if(e.endsWith("/*")){if(/\\.(zip|whl|tgz|tar(?:\\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},Sn=(e,t,...n)=>{try{return e.runPython(xt(t),...n)}catch(t){kt.get(e).stderr(t)}},xn=async(e,t,...n)=>{try{return await e.runPythonAsync(xt(t),...n)}catch(t){kt.get(e).stderr(t)}},$n=async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){kt.get(e).stderr(t)}};var Bn=(new TextEncoder).encode("_F=\'github:\'\\n_E=\'user-agent\'\\n_D=True\\n_C=False\\n_B=\'/\'\\n_A=None\\nfrom uio import StringIO\\nimport sys\\nclass Response:\\n\\tdef __init__(A,f):A.raw=f;A.encoding=\'utf-8\';A._cached=_A\\n\\tdef close(A):\\n\\t\\tif A.raw:A.raw.close();A.raw=_A\\n\\t\\tA._cached=_A\\n\\t@property\\n\\tdef content(self):\\n\\t\\tA=self\\n\\t\\tif A._cached is _A:\\n\\t\\t\\ttry:A._cached=A.raw.read()\\n\\t\\t\\tfinally:A.raw.close();A.raw=_A\\n\\t\\treturn A._cached\\n\\t@property\\n\\tdef text(self):return str(self.content,self.encoding)\\n\\tdef json(A):import ujson;return ujson.loads(A.content)\\nHEADERS_TO_IGNORE=_E,\\ntry:import js\\nexcept Exception as err:raise OSError(\'This version of urequests can only be used in the browser\')\\nHEADERS_TO_IGNORE=_E,\\ndef request(method,url,data=_A,json=_A,headers={},stream=_A,auth=_A,timeout=_A,parse_headers=_D):\\n\\tE=timeout;D=method;C=data;from js import XMLHttpRequest as G;A=G.new();A.withCredentials=_C\\n\\tif auth is not _A:import ubinascii;H,I=auth;A.open(D,url,_C,H,I)\\n\\telse:A.open(D,url,_C)\\n\\tfor(F,J)in headers.items():\\n\\t\\tif F.lower()not in HEADERS_TO_IGNORE:A.setRequestHeader(F,J)\\n\\tif E:A.timeout=int(E*1000)\\n\\tif json is not _A:assert C is _A;import ujson;C=ujson.dumps(json);A.setRequestHeader(\'Content-Type\',\'application/json\')\\n\\tA.send(C);B=Response(StringIO(A.responseText));B.status_code=A.status;B.reason=A.statusText;B.headers=A.getAllResponseHeaders();return B\\ndef get(url,**A):return request(\'GET\',url,**A)\\n_PACKAGE_INDEX=const(\'https://micropython.org/pi/v2\')\\n_CHUNK_SIZE=128\\ndef _ensure_path_exists(path):\\n\\timport os;A=path.split(_B)\\n\\tif not A[0]:A.pop(0);A[0]=_B+A[0]\\n\\tB=\'\'\\n\\tfor C in range(len(A)-1):\\n\\t\\tB+=A[C]\\n\\t\\ttry:os.stat(B)\\n\\t\\texcept:os.mkdir(B)\\n\\t\\tB+=_B\\ndef _chunk(src,dest):\\n\\tA=memoryview(bytearray(_CHUNK_SIZE))\\n\\twhile _D:\\n\\t\\tB=src.readinto(A)\\n\\t\\tif B==0:break\\n\\t\\tdest(A if B==_CHUNK_SIZE else A[:B])\\ndef _check_exists(path,short_hash):\\n\\tA=short_hash;import os\\n\\ttry:\\n\\t\\timport binascii as C,hashlib as D\\n\\t\\twith open(path,\'rb\')as E:B=D.sha256();_chunk(E,B.update);F=str(C.hexlify(B.digest())[:len(A)],\'utf-8\');return F==A\\n\\texcept:return _C\\ndef _rewrite_url(url,branch=_A):\\n\\tB=branch;A=url\\n\\tif not B:B=\'HEAD\'\\n\\tif A.startswith(_F):A=A[7:].split(_B);A=\'https://raw.githubusercontent.com/\'+A[0]+_B+A[1]+_B+B+_B+_B.join(A[2:])\\n\\treturn A\\ndef _download_file(url,dest):\\n\\tB=dest;A=get(url)\\n\\ttry:\\n\\t\\tif A.status_code!=200:print(\'Error\',A.status_code,\'requesting\',url);return _C\\n\\t\\tprint(\'Copying:\',B);_ensure_path_exists(B)\\n\\t\\twith open(B,\'wb\')as C:_chunk(A.raw,C.write)\\n\\t\\treturn _D\\n\\tfinally:A.close()\\ndef _install_json(package_json_url,index,target,version,mpy):\\n\\tK=\'File not found: {} {}\';I=version;H=index;G=package_json_url;D=target;E=get(_rewrite_url(G,I))\\n\\ttry:\\n\\t\\tif E.status_code!=200:print(\'Package not found:\',G);return _C\\n\\t\\tF=E.json()\\n\\tfinally:E.close()\\n\\tfor(A,C)in F.get(\'hashes\',()):\\n\\t\\tB=D+_B+A\\n\\t\\tif _check_exists(B,C):print(\'Exists:\',B)\\n\\t\\telse:\\n\\t\\t\\tL=\'{}/file/{}/{}\'.format(H,C[:2],C)\\n\\t\\t\\tif not _download_file(L,B):print(K.format(A,C));return _C\\n\\tfor(A,J)in F.get(\'urls\',()):\\n\\t\\tB=D+_B+A\\n\\t\\tif not _download_file(_rewrite_url(J,I),B):print(K.format(A,J));return _C\\n\\tfor(M,N)in F.get(\'deps\',()):\\n\\t\\tif not _install_package(M,H,D,N,mpy):return _C\\n\\treturn _D\\ndef _install_package(package,index,target,version,mpy):\\n\\tD=index;C=target;B=version;A=package\\n\\tif A.startswith(\'http://\')or A.startswith(\'https://\')or A.startswith(_F):\\n\\t\\tif A.endswith(\'.py\')or A.endswith(\'.mpy\'):print(\'Downloading {} to {}\'.format(A,C));return _download_file(_rewrite_url(A,B),C+_B+A.rsplit(_B)[-1])\\n\\t\\telse:\\n\\t\\t\\tif not A.endswith(\'.json\'):\\n\\t\\t\\t\\tif not A.endswith(_B):A+=_B\\n\\t\\t\\t\\tA+=\'package.json\'\\n\\t\\t\\tprint(\'Installing {} to {}\'.format(A,C))\\n\\telse:\\n\\t\\tif not B:B=\'latest\'\\n\\t\\tprint(\'Installing {} ({}) from {} to {}\'.format(A,B,D,C));E=sys.implementation._mpy&255 if mpy and hasattr(sys.implementation,\'_mpy\')else\'py\';A=\'{}/package/{}/{}/{}.json\'.format(D,\'py\',A,B)\\n\\treturn _install_json(A,D,C,B,mpy)\\ndef install(package,index=_A,target=_A,version=_A,mpy=_D):\\n\\tB=target;A=index\\n\\tif not B:\\n\\t\\tfor C in sys.path:\\n\\t\\t\\tif C.endswith(\'/lib\'):B=C;break\\n\\t\\telse:print(\'Unable to find lib dir in sys.path\');return\\n\\tif not A:A=_PACKAGE_INDEX\\n\\tif _install_package(package,A.rstrip(_B),B,version,mpy):print(\'Done\')\\n\\telse:print(\'Package may be partially installed\')");const jn=async e=>(await import("./toml-V4Savzlc.js")).parse(e);async function Pn(e,t){return new Promise((n,r)=>{e.syncfs(t,e=>{e?r(e):n()})})}function Mn(e){const t=e.FS,n=e.FS.filesystems.MEMFS,r=e.PATH,s={DIR_MODE:16895,FILE_MODE:33279,mount:function(e){if(!e.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return n.mount.apply(null,arguments)},syncfs:async(e,t,n)=>{try{const r=s.getLocalSet(e),o=await s.getRemoteSet(e),a=t?o:r,i=t?r:o;await s.reconcile(e,a,i),n(null)}catch(e){n(e)}},getLocalSet:e=>{let n=Object.create(null);function s(e){return"."!==e&&".."!==e}function o(e){return t=>r.join2(e,t)}let a=t.readdir(e.mountpoint).filter(s).map(o(e.mountpoint));for(;a.length;){let e=a.pop(),r=t.stat(e);t.isDir(r.mode)&&a.push.apply(a,t.readdir(e).filter(s).map(o(e))),n[e]={timestamp:r.mtime,mode:r.mode}}return{type:"local",entries:n}},getRemoteSet:async e=>{const t=Object.create(null),n=await Dn(e.opts.fileSystemHandle);for(const[o,a]of n)"."!==o&&(t[r.join2(e.mountpoint,o)]={timestamp:"file"===a.kind?(await a.getFile()).lastModifiedDate:new Date,mode:"file"===a.kind?s.FILE_MODE:s.DIR_MODE});return{type:"remote",entries:t,handles:n}},loadLocalEntry:e=>{const r=t.lookupPath(e).node,s=t.stat(e);if(t.isDir(s.mode))return{timestamp:s.mtime,mode:s.mode};if(t.isFile(s.mode))return r.contents=n.getFileDataAsTypedArray(r),{timestamp:s.mtime,mode:s.mode,contents:r.contents};throw new Error("node type not supported")},storeLocalEntry:(e,n)=>{if(t.isDir(n.mode))t.mkdirTree(e,n.mode);else{if(!t.isFile(n.mode))throw new Error("node type not supported");t.writeFile(e,n.contents,{canOwn:!0})}t.chmod(e,n.mode),t.utime(e,n.timestamp,n.timestamp)},removeLocalEntry:e=>{var n=t.stat(e);t.isDir(n.mode)?t.rmdir(e):t.isFile(n.mode)&&t.unlink(e)},loadRemoteEntry:async e=>{if("file"===e.kind){const t=await e.getFile();return{contents:new Uint8Array(await t.arrayBuffer()),mode:s.FILE_MODE,timestamp:t.lastModifiedDate}}if("directory"===e.kind)return{mode:s.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+e.kind)},storeRemoteEntry:async(e,n,s)=>{const o=e.get(r.dirname(n)),a=t.isFile(s.mode)?await o.getFileHandle(r.basename(n),{create:!0}):await o.getDirectoryHandle(r.basename(n),{create:!0});if("file"===a.kind){const e=await a.createWritable();await e.write(s.contents),await e.close()}e.set(n,a)},removeRemoteEntry:async(e,t)=>{const n=e.get(r.dirname(t));await n.removeEntry(r.basename(t)),e.delete(t)},reconcile:async(e,n,o)=>{let a=0;const i=[];Object.keys(n.entries).forEach(function(e){const r=n.entries[e],s=o.entries[e];(!s||t.isFile(r.mode)&&r.timestamp.getTime()>s.timestamp.getTime())&&(i.push(e),a++)}),i.sort();const c=[];if(Object.keys(o.entries).forEach(function(e){n.entries[e]||(c.push(e),a++)}),c.sort().reverse(),!a)return;const l="remote"===n.type?n.handles:o.handles;for(const t of i){const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);if("local"===o.type){const e=l.get(n),r=await s.loadRemoteEntry(e);s.storeLocalEntry(t,r)}else{const e=s.loadLocalEntry(t);await s.storeRemoteEntry(l,n,e)}}for(const t of c)if("local"===o.type)s.removeLocalEntry(t);else{const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);await s.removeRemoteEntry(l,n)}}};return e.FS.filesystems.NATIVEFS_ASYNC=s,async function(e,n){if("FileSystemDirectoryHandle"!==n.constructor.name)throw new TypeError("Expected argument \'fileSystemHandle\' to be a FileSystemDirectoryHandle");return function(e){t.mkdirTree?t.mkdirTree(e):tn(t,e);const{node:n}=t.lookupPath(e,{follow_mount:!1});if(t.isMountpoint(n))throw new Error(`path \'${e}\' is already a file system mount point`);if(!t.isDir(n.mode))throw new Error(`path \'${e}\' points to a file not a directory`);for(const t in n.contents)throw new Error(`directory \'${e}\' is not empty`)}(e),t.mount(t.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:n},e),await Pn(t,!0),{syncfs:async()=>await Pn(t,!1)}}}const Dn=async e=>{const t=[];await async function e(n){for await(const r of n.values())t.push(r),"directory"===r.kind&&await e(r)}(e);const n=new Map;n.set(".",e);for(const r of t){const t=(await e.resolve(r)).join("/");n.set(t,r)}return n},{parse:Fn}=JSON,Tn=(e,t)=>new URL(e,t).href,Rn=(e,t,n)=>{if(t in e)throw new Error(`Duplicated path: ${t}`);e[t]=n},Ln=(e,t,n)=>{for(const r in t)Rn(e,Tn(r,n),t[r])},On=(e,t,n,r)=>{const s=t[n];s&&(e[n]??={},Ln(e[n],s,r))},Cn=async([e,t],n=e.packages,r=new Set)=>{const s=[];for(const o of n){if(r.has(o))continue;r.add(o);const n=o.endsWith(".toml");if(n||o.endsWith(".json")){const{href:a}=new URL(o,t),i=await Zt(a).text(),{name:c,files:l,js_modules:u,packages:p}=n?await jn(i):Fn(i);if(r.has(c))throw new Error(`Unable to process ${c} @ ${o}`);r.add(c),p&&s.push(...await Cn([e,a],p,r)),u&&(e.js_modules??={},On(e.js_modules,u,"main",o),On(e.js_modules,u,"worker",o)),l&&(e.files??={},Ln(e.files,l,o))}else s.push(o)}return s},In=(e,t)=>{try{e.mkdir(t)}catch(e){}},Un=ln("mpy");var Hn={type:"micropython",module:(e="1.28.0-6")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=Et({stderr:St(console.error),stdout:St(console.log)}),i=[];t.debug&&i.push("settrace"),t.packages?.includes("ulab")&&(t.packages.splice(t.packages.indexOf("ulab"),1),i.push("ulab")),n=n.replace(/\\.m?js$/,".wasm");for(const e of i)n=n.replace(/\\.wasm$/,`-${e}.wasm`);Un("Loading MicroPython");const c=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n}));globalThis[It].set("-T-",this.transform.bind(this,c));const l=Wn.bind(this,c,r);return An.set(c,l),t.packages&&(Un("Loading remote packages"),t.packages=await Cn([t,r]),Un("Loaded remote packages")),await kn(this,Un,c,t,r),this.writeFile(c,"./mip.py",Bn),t.packages&&(Un("Loading packages"),await l(t.packages.map(Rt,r)),Un("Loaded packages")),Un("Loaded MicroPython"),c.mountNativeFS||(c.mountNativeFS=Mn(c._module)),c},registerJSModule:En,run:Sn,runAsync:xn,runEvent:$n,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=vn(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-CoY8ac0B.js").then(async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)In(s,i);else{In(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()})}case"tgz":case"tar.gz":{const t="./_.tar.gz";return en(i,t,n),void e.runPython(`\\n import os, gzip, tarfile\\n tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\\n for f in tar:\\n name = f"${r}{f.name}"\\n if f.type == tarfile.DIRTYPE:\\n if f.name != "./":\\n os.mkdir(name.strip("/"))\\n else:\\n dir = os.path.dirname(name)\\n if not os.path.exists(dir):\\n os.mkdir(dir)\\n source = tar.extractfile(f)\\n with open(name, "wb") as dest:\\n dest.write(source.read())\\n dest.close()\\n tar.close()\\n os.remove("${t}")\\n `)}}}return en(i,t,n)}};async function Wn(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=Tt(s,t),r=await Zt(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const Nn={dict_converter:Object.fromEntries},{stringify:qn}=JSON,{apply:zn}=Reflect,Jn=Function.prototype,Kn=e=>function(...t){return zn(e,this,t)};let Gn,Vn;const Xn=e=>{const t=new WeakMap,n=n=>{for(let r,s=0;s<n.length;s++)switch(typeof(r=n[s])){case"object":if(null===r)break;case"function":if(Gn in r&&!r[Gn].shared?.gcRegistered){e=!1;let o=t.get(r)?.deref();if(!o){o=Vn(r);const e=new WeakRef(o);t.set(r,e),t.set(o,e)}n[s]=o,e=!0}}};Object.defineProperties(Jn,{apply:{value(t,r){return e&&n(r),zn(this,t,r)}},call:{value(t,...r){return e&&n(r),zn(this,t,r)}}})},Yn=ln("py"),Zn=new WeakMap;var Qn={type:"pyodide",module:(e="0.29.3")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e,version:t},n,r,s){Yn("Loading Pyodide");let{packages:o,index_urls:a}=n;if(o){if(o=o.map(Rt,s),!a){Yn("Loading Packages Graph");const{default:e}=await import("./pyodide_graph-BvONa7d5.js");if(t in e){const n=e[t];for(const e of o){if(/^(?:\\.|\\/|https?:\\/\\/)/.test(e))continue;const r=e.split(/[>=<]=/)[0];r.toLowerCase()in n||console.warn(`Pyodide ${t} might not support ${e}. See: https://packages.pyscript.net/?q=${r}`)}}Yn("Loaded Packages Graph")}Yn("Loading remote packages"),n.packages=o=await Cn([n,s],o),Yn("Loaded remote packages")}Yn("Loading Storage");const c=r.slice(0,r.lastIndexOf("/")),l=new i(`${c}@${t}`),u={indexURL:c},p="never"!==n.packages_cache&&"0.28.0"!==t;if(await l.sync(),Yn("Loaded Storage"),p||l.clear(),o&&p)if("passthrough"===n.packages_cache)u.packages=o,o=null,l.clear();else{o=o.sort();const e=qn(o);if(l.has(e)){const n=l.get(e);if(u.packages=o.map(e=>e.split(/[>=<]=/)[0]),t.startsWith("0.27")){const e=new Blob([n],{type:"application/json"});u.lockFileURL=URL.createObjectURL(e)}else u.lockFileContents=n;o=null}}const{stderr:f,stdout:d,get:h}=Et();Yn("Loading interpreter");const y=await h(e({stderr:f,stdout:d,...u}));Yn("Loaded interpreter"),globalThis[It].set("-T-",this.transform.bind(this,y)),n.debug&&y.setDebug(!0);const m=tr.bind(y);return a&&Zn.set(y,a),An.set(y,m),await kn(this,Yn,y,n,s),o&&await m(o,l,p),await l.close(),u.lockFileURL&&URL.revokeObjectURL(u.lockFileURL),Yn("Loaded Pyodide"),"auto"===n.experimental_create_proxy&&(y.runPython(["import js","from pyodide.ffi import to_js","o=js.Object.fromEntries","js.experimental_create_proxy=lambda r:to_js(r,dict_converter=o)"].join(";"),{globals:y.toPy({})}),Vn=globalThis.experimental_create_proxy,delete globalThis.experimental_create_proxy,[Gn]=Reflect.ownKeys(Vn).filter(e=>"symbol"==typeof e&&"Symbol(pyproxy.attrs)"===String(e)),Xn(!0)),y},registerJSModule:En,run:Kn(Sn),runAsync:Kn(xn),runEvent:Kn($n),transform:(e,t)=>zn(er,e,[t]),writeFile:(e,t,n,r)=>{const s=vn(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return en({FS:o,PATH:a,PATH_FS:i},t,n)}};function er(e){const{ffi:{PyProxy:t}}=this;if(e&&"object"==typeof e){if(e instanceof t)return e.toJs(Nn);if(e instanceof Map)return new Map([...e.entries()]);if($t(e))return e.map(er,this)}return e}async function tr(e,t,n=!1){const{log:r}=console,s=(e,...t)=>{r(e,...t),console.log=r,Yn(e),console.log=s};console.log=s,await this.loadPackage("micropip");const o=this.pyimport("micropip");if(Zn.has(this)&&o.set_index_urls(Zn.get(this)),await o.install(e,{keep_going:!0}),console.log=r,n&&t instanceof i){const n=o.freeze();t.set(qn(e),n)}o.destroy()}const nr=new Map,rr=new Map,sr=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=nr.get(n),o=/^(?:\\.?\\.?\\/|[a-z0-9-]+:\\/\\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then(r=>(rr.set(t,e),s(r,e,n,o)))}}),or=e=>{for(const t of[].concat(e.type))nr.set(t,e)};for(const e of[Hn,Qn])or(e);const{parse:ar}=JSON,ir=(e,t,n={})=>{const[r,s]=((e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[Tt(e),n]})(e,t);if("json"===s)n=Zt(r).json();else if("toml"===s){const{parser:e}=n;n=Zt(r).text().then(async t=>{const n=e?await import(e):{parse:jn};return(n.parse||n.default)(t)})}else"string"===s?n=cr(e):"object"===s&&e?n=e:"txt"===s&&"string"==typeof n&&(n=cr(n));return[n,e=r]},cr=e=>{try{return ar(e)}catch(t){return jn(e)}},lr="BeforeRun",ur="AfterRun",pr=[`code${lr}`,`code${lr}Async`,`code${ur}`,`code${ur}Async`],fr=["onWorker","onReady",`on${lr}`,`on${lr}Async`,`on${ur}`,`on${ur}Async`];function dr(e,t){const{run:n,runAsync:r}=nr.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const hr=(e,t,n,r,s,o)=>{if(s||o){const a=dr.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let yr,mr,gr;const wr=(e,t)=>{addEventListener(e,t||(async t=>{try{await yr,mr(`xworker.on${e}`,t)}catch(e){postMessage(e)}}),!!t&&{once:!0})},{proxy:_r,sync:br,native:Ar,window:kr,isWindowProxy:Er,ffi:vr}=await(async e=>{const t=await bt({...e,decoder:e?.decoder||he}),n=ze({...e,buffer:!0,reflect:t.proxy[l],timeout:t.ffi_timeout});return t.proxy[u]=n.reflect,{...t,window:n.global,isWindowProxy:n.isProxy,ffi:{assign:n.assign,direct:n.direct,evaluate:n.evaluate,gather:n.gather,query:n.query}}})({transfer:!1,transform:e=>gr?gr(e):e}),Sr={polyfill:br,sync:_r,window:Ar||br?kr:null,isWindowProxy:Er,onmessage:console.info,onerror:console.error,onmessageerror:console.warn,postMessage:postMessage.bind(self)};wr("message",({data:{options:e,config:t,configURL:n,code:r,hooks:s}})=>{yr=(async()=>{try{const{id:o,tag:c,type:l,custom:u,version:p,config:f,async:d}=e,h=((e,t="")=>`${e}@${t}`.replace(/@$/,""))(l,p),y=await((e,t,n,r={})=>(t&&([r,t]=ir(t,n,r)),Ft(r).then(n=>sr[e](n,t))))(h,t,n,f),{js_modules:m}=rr.get(h),g=m?.main,w=jt(nr.get(l)),_=((e,t,n,r)=>({type:t,config:n,interpreter:r,io:kt.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}))(w,u||l,f||{},y);let b="run";if(d&&(b+="Async"),s){let e,t,n="",r="";for(const e of pr){const t=s[e];if(t){const s=e.endsWith("Async");(s&&d||!s&&!d)&&(e.startsWith("codeBefore")?n=t:r=t)}}(n||r)&&((e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,Ct(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,Ct(t),...o);return r&&await s(e,r,...o),a}})(w,b,n,r);for(const n of fr.slice(2)){const r=s[n];if(r){const s=n.endsWith("Async");if(s&&d||!s&&!d){const s=Ot(r);n.startsWith("onBefore")?e=s:t=s}}}hr(w,_,Sr,d,e,t)}let A,k,E,v=null,S="";(Ar||br)&&(({CustomEvent:A,document:k}=kr),v=o&&k.getElementById(o)||null,E=e=>Lt(v,u||l,e,!0,A));const x=Gt(kr,_r,g,t);if(((e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,Wt(r,e));t.registerJSModule(n,s,r)})(l,w,y,x),w.registerJSModule(y,"polyscript",{IDBMap:a,IDBMapSync:i,xworker:Sr,currentScript:v,config:_.config,js_modules:x,ffi:vr,get target(){return!S&&v&&("SCRIPT"===c?v.after(Bt(kr.document.createElement(`script-${u||l}`),{id:S=`${o}-target`})):(S=o,v.replaceChildren(),v.style.display="block")),S}}),mr=w.runEvent.bind(w,y),gr=w.transform.bind(w,y),v&&E("ready"),s?.onReady&&Ot(s?.onReady).call(w,dr.call(w,_,y),Sr),await w[b](y,r),["micropython","pyodide"].includes(w.type)){const e="polyscript",t=`__${e}_workers__`,n="__export__";y.runPython([`import js as ${t}`,`${t}.${t} = "${n}" in locals() and ${n} or []`,`del ${t}`].join("\\n"));const r=[...globalThis[t]];delete globalThis[t],r.length&&y.runPython([`from ${e} import xworker as ${t}`,...r.map(e=>`${t}.sync.${e} = ${e}`),`del ${t}`].join("\\n"))}return v&&E("done"),postMessage("polyscript:done"),y}catch(e){postMessage(e)}})(),wr("error"),wr("message"),wr("messageerror"),(Ar||br)&&addEventListener("py:progress",({type:e,detail:t})=>{kr.dispatchEvent(new kr.CustomEvent(e,{detail:t}))})});\n'.replace(Lr,Nr)],{type:"text/javascript"})),...e))({serviceWorker:n?.serviceWorker||n?.service_worker,reflected_ffi_timeout:globalThis.reflected_ffi_timeout??-1}),{postMessage:o}=s,a=this instanceof ns;let i=!1;const l=B(s.proxy,{importJS:G,importCSS:J,isStuck:()=>i,notStuck(){i=!1}}),p=yn();let f=c(t).text().then(e=>{const t=a?this.toJSON():void 0;o.call(s,{options:n,config:r,code:e,hooks:t})}).then(()=>{f={then:e=>e()}});return S(s,{unstuck:{value(){i=!0}},sync:{value:l},ready:{value:p.promise},postMessage:{value:(e,...t)=>f.then(()=>o.call(s,e,...t))},onerror:{writable:!0,configurable:!0,value:console.error}}),s.addEventListener("message",e=>{const{data:t}=e,n=t instanceof Error;(n||"polyscript:done"===t)&&(e.stopImmediatePropagation(),n?(p.reject(t),s.onerror(j(e,{type:{value:"error"},error:{value:t}}))):p.resolve(s))}),a&&this.onWorker?.(this.interpreter,s),s};const ss="Invalid content";var os=e=>{const{src:t,worker:n}=e.attributes;if(n){let{value:r}=n;if(r)throw new SyntaxError("Invalid worker attribute");if(r=t?.value,!r){if(t)throw new SyntaxError("Invalid worker attribute");if(e.childElementCount){const{innerHTML:t,localName:n,type:s}=e,o=s||n.replace(/-script$/,"");r=E(t),console.warn(`Deprecated: use <script type="${o}"> for an always safe content parsing:\n`,r)}else r=e.textContent;return URL.createObjectURL(new Blob([v(r)],{type:"text/plain"}))}return r}if(t&&e.textContent.replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s*(?:\/\/|#).*/gm,"").trim())throw new SyntaxError(ss)};const as=(e,t)=>{const n=(e=>{let t=e;for(;t.parentNode;)t=t.parentNode;return t})(e);return n.getElementById(t)||((e,t=document)=>t.querySelector(e))(t,n)},is=new WeakMap,cs={get(){let e=is.get(this);return e||(e=document.createElement(`${this.type}-script`),is.set(this,e),ds(this)),e},set(e){"string"==typeof e?is.set(this,as(this,e)):(is.set(this,e),ds(this))}},ls=new WeakMap,ps=new Map,fs=(e,t)=>{const n=e?.value;return n?t+n:""},us=(e,t,n,r,s,o,a=e)=>{if(!ps.has(t)){const i={interpreter:Jr(n,s,o),queue:$(),XWorker:rs(e,r)};ps.set(t,i),ps.has(e)||ps.set(e,i),ps.has(a)||ps.set(a,i)}return ps.get(t)},ds=async e=>{if(ls.has(e)){const{target:t}=e;t&&(e.closest("head")?document.body.append(t):e.after(t))}else{const{attributes:{config:t,env:n,name:r,target:s,version:o,"service-worker":a},src:i,type:l}=e,p=!Y(e),f=o?.value,u=Kr(l,f);let d=fs(t,"|");const m=fs(n,"")||`${u}${d}`;d=d.slice(1);const h=os(e);if(h){const t=new(rs(l,f))(h,{...O(e,l),version:f,async:p,config:d,serviceWorker:a?.value});ls.set(x(e,"xworker",{value:t}),{xworker:t});const n=r?.value;return void(n&&hn[n].resolve(t.ready))}const g=fs(s,""),w=us(l,m,u,f,d);ls.set(x(e,"target",cs),w),g&&is.set(e,as(e,g));const A=i?c(i).text():e.textContent;w.queue=w.queue.then(()=>(async(e,t,n,r)=>{const{type:s}=e,o=an.get(s);o.experimental&&console.warn(`The ${s} interpreter is experimental`);const[a,i]=await C([ls.get(e).interpreter,t]);try{z(s,o,a,H),o.registerJSModule(a,"polyscript",{IDBMap:_,IDBMapSync:y,XWorker:n,currentScript:e,js_modules:H,workers:wn}),M(e,s,"ready"),x(document,"currentScript",{configurable:!0,get:()=>e});const t=M.bind(null,e,s,"done");let c=o[r?"runAsync":"run"](a,i);return r&&(c=await c),t(),c}finally{delete document.currentScript}})(e,A,w.XWorker,p))}},ms=new Proxy(j(null),{get:(e,t)=>new Promise(queueMicrotask).then(()=>_s(t))}),_s=async e=>{if(ps.has(e)){const{interpreter:t,queue:n}=ps.get(e);return(await C([t,n]))[0]}const t=ps.size?`Available interpreters are: ${[...ps.keys()].map(e=>`"${e}"`).join(", ")}.`:"There are no interpreters in this page.";throw new Error(`The interpreter "${e}" was not found. ${t}`)},ys=async e=>{const{type:t,currentTarget:n}=e;if(pn.length)for(let{name:r,value:s,ownerElement:o}of mn(`./@*[${pn.map(e=>`name()="${e}${t}"`).join(" or ")}]`,n)){r=r.slice(0,-(t.length+1));const n=await _s(o.getAttribute(`${r}-env`)||r);an.get(r).runEvent(n,s,e)}},hs=e=>{if(pn.length)for(let{name:t,ownerElement:n}of mn(`.//@*[${pn.map(e=>`starts-with(name(),"${e}")`).join(" or ")}]`,e)){const e=t.lastIndexOf("-"),r=t.slice(e+1);"env"!==r&&(n.addEventListener(r,ys),"disabled"in n&&!n.disabled&&(n.disabled=!0,ms[t.slice(0,e)].then(()=>{n.disabled=!1})))}},gs=rs(),ws=[],As=new Map,bs=new Map,vs=new Map,Es=async e=>{for(const t of ws)if(e.matches(t)){const n=bs.get(t),r=ks.get(n),{resolve:s}=vs.get(n),{options:o,known:a}=r;if(a.has(e))return;a.add(e);for(const[t,n]of As)e.matches(t)&&await n(e);const{interpreter:i,configURL:c,config:l,version:p,env:f,onerror:u,hooks:d,parser:m}=o;let h;try{const t=os(e);if(t){let r=p,o=c,a=e.getAttribute("config")||l||{};if(!r||!a){const[e,t]=zr(a,c,{parser:m});a=await e,o=t,r=a.version||a.interpreter,r&&/\.m?js$/.test(r)&&(r=new URL(r,o).href)}Number.isSafeInteger(a?.experimental_ffi_timeout)&&(globalThis.reflected_ffi_timeout=a.experimental_ffi_timeout);const f=gs.call(new ns(null,d),t,{...O(e,n),parser:m,configURL:o,version:r,type:i,custom:n,config:a,async:!Y(e),serviceWorker:e.getAttribute("service-worker")});x(e,"xworker",{value:f}),s({type:n,xworker:f});const u=e.getAttribute("name");return void(u&&hn[u].resolve(f.ready))}}catch(e){h=e}const g=Kr(i,p),w=f||`${g}${l?`|${l}`:""}`,{interpreter:A,XWorker:b}=us(n,w,g,p,l,c,i),E=await A,k=j(an.get(i)),B=new ns(E,d),S=function(...e){return b.apply(B,e)},R={...F(k,n,structuredClone(cn.get(g)),E),XWorker:S};z(i,k,E,H),k.registerJSModule(E,"polyscript",{IDBMap:_,IDBMapSync:y,XWorker:S,config:R.config,currentScript:n.startsWith("_")?null:e,js_modules:H,workers:wn});for(const t of["Run","RunAsync"]){let n,r,s="",o="";for(const e of Zr){const n=d?.main?.[e];n&&e.endsWith(t)&&(e.startsWith("codeBefore")?s=v(n()):o=v(n()))}(s||o)&&N(k,`r${t.slice(1)}`,s,o);for(let e=2;e<Qr.length;e++){const s=Qr[e],o=d?.main?.[s];o&&s.endsWith(t)&&(s.startsWith("onBefore")?n=o:r=o)}ts(k,R,e,t.endsWith("Async"),n,r)}r.queue=r.queue.then(()=>(s(R),h&&u?.(h,e),d?.main?.onReady?.(R,e)))}},ks=new Map;let Bs=0;const js=e=>(vs.has(e)||vs.set(e,yn()),vs.get(e).promise),[{customObserver:Ss,define:xs,whenDefined:Rs,env:Cs,Hook:$s,XWorker:Ds},Ts]=((e,t,n=globalThis)=>{const r=Symbol.for(e),s=r in n;return[s?n[r]:Object.defineProperty(n,r,{value:t})[r],s]})("polyscript",{customObserver:As,define:(e,t)=>{let n=null==e;if(n)e="_ps"+Bs++;else if(an.has(e)||ks.has(e))throw new Error(`<script type="${e}"> already registered`);if(!an.has(t?.interpreter))throw new Error("Unspecified interpreter");an.set(e,an.get(t.interpreter));const r=[`script[type="${e}"]`];if(js(e),n){const{hooks:n}=t,r=n?.main?.onReady;t={...t,hooks:{...n,main:{...n?.main,onReady(t,n){ws.splice(ws.indexOf(e),1),an.delete(e),ks.delete(e),vs.delete(e),n.remove(),r?.(t)}}}},document.head.append(B(document.createElement("script"),{type:e}))}else r.push(`${e}-script`),pn.push(`${e}-`);for(const t of r)bs.set(t,e);ws.push(...r),ks.set(e,{options:B({env:e},t),known:new WeakSet,queue:Promise.resolve()}),n||hs(document),dn(r.join(",")).forEach(Es)},whenDefined:js,env:ms,Hook:ns,XWorker:gs});if(!Ts){const e=new MutationObserver(e=>{const n=ln.join(",");for(const{type:r,target:s,attributeName:o,addedNodes:a}of e){if("attributes"===r){const e=o.lastIndexOf("-")+1;if(e){const t=o.slice(0,e);for(const n of pn)if(t===n){const t=o.slice(e);if("env"!==t){const e=s.hasAttribute(o)?"add":"remove";s[`${e}EventListener`](t,ys)}break}}continue}for(const e of a)1===e.nodeType&&(hs(e),n&&e.matches(n)?ds(e):t(n,e,!0))}}),t=(e,t,n)=>{e&&dn(e,t).forEach(ds),(e=ws.join(","))&&(n&&Es(t),dn(e,t).forEach(Es))},n=t=>(e.observe(t,{childList:!0,subtree:!0,attributes:!0}),t),{attachShadow:r}=Element.prototype;B(Element.prototype,{attachShadow(e){return n(r.call(this,e))}}),queueMicrotask(()=>{hs(n(document)),t(ln.join(","),document,!1)})}var Ps=new Map([["py","pyodide"],["mpy","micropython"]]);const Os=[];for(const[t]of Ps){const n=[`script[type="${t}"]`,`${t}-script`];for(const r of document.querySelectorAll(n.join(","))){const{promise:n,resolve:s}=e();Os.push(n),r.addEventListener(`${t}:done`,s,{once:!0})}}Promise.all(Os).then(()=>{dispatchEvent(new Event("py:all-done"))});const Ms=(e,t=document)=>[...t.querySelectorAll(e)];var Fs={codemirror:()=>Promise.resolve().then(function(){return Fo}),"deprecations-manager":()=>import("./deprecations-manager-F4EM1hFL.js"),donkey:()=>import("./donkey-C6J1Cb4E.js"),error:()=>import("./error-NMD5NV4h.js"),"py-editor":()=>import("./py-editor-CVH_xgRH.js"),"py-game":()=>import("./py-game-DOwiUOay.js"),"py-terminal":()=>import("./py-terminal-DqB7kBfk.js")};const Ls={CONFLICTING_CODE:"PY0409",BAD_CONFIG:"PY1000",FETCH_ERROR:"PY0001",FETCH_UNAUTHORIZED_ERROR:"PY0401",FETCH_FORBIDDEN_ERROR:"PY0403",FETCH_NOT_FOUND_ERROR:"PY0404",FETCH_SERVER_ERROR:"PY0500",FETCH_UNAVAILABLE_ERROR:"PY0503"};class Ns extends Error{constructor(e,t="",n="text"){super(`(${e}): ${t}`),this.errorCode=e,this.messageType=n,this.name="UserError"}}class Is extends Ns{constructor(e,t){super(e,t),this.name="FetchError"}}const Us=e=>e.text();async function Hs(e,t){let n;try{n=await fetch(e,t)}catch(t){const n=t;let r;throw r=e.startsWith("http")?`Fetching from URL ${e} failed with error '${n.message}'. Are your filename and path correct?`:'Polyscript: Access to local files\n (using [[fetch]] configurations in <py-config>)\n is not available when directly opening a HTML file;\n you must use a webserver to serve the additional files.\n See <a style="text-decoration: underline;" href="https://github.com/pyscript/pyscript/issues/257#issuecomment-1119595062">this reference</a>\n on starting a simple webserver with Python.\n ',new Is(Ls.FETCH_ERROR,r)}if(!n.ok){const t=`Fetching from URL ${e} failed with error ${n.status} (${n.statusText}). Are your filename and path correct?`;switch(n.status){case 404:throw new Is(Ls.FETCH_NOT_FOUND_ERROR,t);case 401:throw new Is(Ls.FETCH_UNAUTHORIZED_ERROR,t);case 403:throw new Is(Ls.FETCH_FORBIDDEN_ERROR,t);case 500:throw new Is(Ls.FETCH_SERVER_ERROR,t);case 503:throw new Is(Ls.FETCH_UNAVAILABLE_ERROR,t);default:throw new Is(Ls.FETCH_ERROR,t)}}return n}const{BAD_CONFIG:Ws,CONFLICTING_CODE:qs}=Ls,zs=async(e,t)=>{let n=e?.trim(),r="",s=!1,o=/^{/.test(n)&&/}$/.test(n);if(!o&&/\.(\w+)(?:\?\S*)?$/.test(n)){const e=RegExp.$1;"json"===e&&"toml"!==t?o=!0:"toml"===e&&"json"!==t?s=!0:((e,t="")=>{let n=`(${Ws}): Invalid URL: ${e}`;throw t&&(n+=`\nexpected ${t} content`),new Error(n)})(n,t),r=n,n=(await Hs(r).then(Us)).trim()}return{json:o,toml:s||!o&&!!n,text:n,url:r}},Gs=e=>{const t=e.getAttribute("config-parser");return t?new URL(t,location.href).href:void 0},Js=e=>new Error(`(${qs}): ${e}`),Ks=(e,t=location.href)=>new URL(e,t).href,Ys=(e,t,{message:n})=>{let r=`(${Ws}): Invalid ${e}`;return t&&(r+=` @ ${t}`),new SyntaxError(`${r}\n${n}`)},Vs=new Map;for(const[e]of Ps){let t,n,r,s,o,a,i,c,l=Ms(`${e}-config`),p=Ms([`script[type="${e}"][config]:not([worker])`,`${e}-script[config]:not([worker])`].join(","));if(l.length>1?r=Js(`Too many ${e}-config`):l.length&&p.length?r=Js(`Ambiguous ${e}-config VS config attribute`):l.length?([c]=l,o=c.getAttribute("src")||c.textContent,a=c.getAttribute("type"),i=Gs(c)):p.length&&([c,...p]=p,o=c.getAttribute("config"),i=Gs(c),p.some(e=>e.getAttribute("config")!==o)&&(r=Js("Unable to use different configs on main"))),!r&&o)try{const{json:e,toml:t,text:c,url:l}=await zs(o,a);if(l&&(s=Ks(l)),o=c,e||"json"===a)try{n=JSON.parse(c)}catch(e){r=Ys("JSON",l,e)}else if(t||"toml"===a)try{const e=i?await import(i):await Tt(c).then(e=>({parse:()=>e}));n=(e.parse||e.default)(c)}catch(e){r=Ys("TOML",l,e)}}catch(e){r=e}t=async()=>{const e=[];for(const[t,s]of Object.entries(Fs))r?"error"===t&&s().then(({notify:e})=>e(r.message)):n?.plugins?.includes(`!${t}`)?"error"===t&&e.push(s().then(({notOnDOM:e})=>e())):e.push(s().then(({default:e})=>e));return await Promise.all(e)},Number.isSafeInteger(n?.experimental_ffi_timeout)&&(globalThis.reflected_ffi_timeout=n?.experimental_ffi_timeout),Vs.set(e,{config:n,configURL:s,parser:i,plugins:t,error:r})}const{assign:Xs}=Object,Zs="entries",Qs="readonly",eo="readwrite",to={durability:"default",prefix:"IDBMap"},no=({target:{result:e}})=>e;class ro extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(Zs,t,this.#t);return new Promise((t,r)=>Xs(e(n.objectStore(Zs)),{onsuccess:t,onerror:r}))}constructor(e,{durability:t=to.durability,prefix:n=to.prefix}=to){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise((t,n)=>{Xs(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(Zs),n.oncomplete=()=>t(e)},onsuccess(e){t(no(e))},onerror(e){n(e),this.dispatchEvent(e)}})}).then(e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e})}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?Xs(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r(e=>e.count(),Qs).then(no)}async clear(){await this.#r(e=>e.clear(),eo)}async delete(e){await this.#r(t=>t.delete(e),eo)}async entries(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e).then(t=>[e,t])))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r(t=>t.get(e),Qs).then(no)}async has(e){return void 0!==await this.#r(t=>t.getKey(e),Qs).then(no)}async keys(){return await this.#r(e=>e.getAllKeys(),Qs).then(no)}async set(e,t){return await this.#r(n=>n.put(t,e),eo),this}async values(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e)))}get[Symbol.toStringTag](){return this.#n}}const so=e=>{e.preventDefault(),e.stopImmediatePropagation()},oo="@pyscript.fs",ao="storage permissions not granted",io=new ro(oo),co=async t=>{if(!("showDirectoryPicker"in globalThis))return Promise.reject(new Error("showDirectoryPicker is not supported"));const{promise:n,resolve:r,reject:s}=e(),o={id:"pyscript",mode:"readwrite",...t};t.hint&&(o.startIn=t.hint);const a=async()=>{try{const e=await showDirectoryPicker(o);if("granted"===await e.requestPermission(o))return r(e),!0}catch({message:e}){console.warn(e)}return!1};if(navigator.userActivation?.isActive)await a()||s(new Error(ao));else{const e=B(document.createElement("dialog"),{className:"pyscript-fs",innerHTML:["<strong>ℹ️ Persistent FileSystem</strong><hr>","<p><small>PyScript would like to access a local folder.</small></p>","<div><button title='ok'>✅ Authorize</button>","<button title='cancel'>❌</button></div>"].join("")}),[t,n]=Ms("button",e);t.addEventListener("click",async t=>{so(t),await a()&&e.close()}),n.addEventListener("click",async t=>{so(t),s(new Error(ao)),e.close()}),document.body.appendChild(e).showModal()}return n};var lo=Object.freeze({__proto__:null,ERROR:ao,NAMESPACE:oo,getFileSystemDirectoryHandle:co,idb:io}),po={is_pyterminal:()=>!1,sleep:e=>new Promise(t=>setTimeout(t,1e3*e)),getFSHandler:e=>co(e),storeFSHandler:async(e,t={})=>!!await io.has(e)||co(t).then(async n=>(await io.set(e,{handler:n,options:t}),!0),()=>!1),async deleteFSHandler(e){const t=await io.has(e);return t&&await io.delete(e),t}};const fo=e=>{x(document,"currentScript",{configurable:!0,get:()=>e})},uo=()=>{delete document.currentScript};var mo=async(e,t,n,r)=>{const s=r.endsWith("Async");(r.startsWith("onBefore")?fo:uo)(n);for(const o of e(r))s?await o(t,n):o(t,n)};const _o=()=>!0,yo=e=>{throw new TypeError(e)},ho=(e,t)=>{const n=[];if(e)for(const t of e.split(/\s*\|\s*/))"object"===t?n.push(e=>null!==e&&typeof e===t):"null"===t?n.push(e=>null===e):n.push(e=>typeof e===t);if(t)for(const e of[].concat(t))n.push(t=>t instanceof e);switch(n.length){case 0:return _o;case 1:return n[0];default:return e=>n.some(t=>t(e))}},go=(e,t,n,r=yo)=>s=>{const o=[`Invalid ${typeof s} ${n}: expected `];e&&(o.push(e),t&&o.push(" or ")),t&&(o.push("an instanceof "),o.push([].concat(t).map(({name:e})=>e).join(" | "))),r(o.join(""),s)},wo=(e=>t=>{const[n,r]=((e,t="value")=>{const n=e?.typeof,r=e?.instanceof;return[ho(n,r),go(n,r,t,e?.onerror)]})(t);return class extends e{add(e){return n(e)?super.add(e):r(e)}}})(Set);function Ao(e=this){return String(e).replace(/^(async\s*)?(\bfunction\b)?(.*?)\(/,(e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e)}const{entries:bo}=Object,vo=["import os as _os","from pathlib import Path as _Path","_path = None"],Eo=new class extends Array{#c=!1;#l;#p;constructor(e,...t){super(),this.#p=e,this.#l=t}push(...e){return this.#c&&super.push(...e),this.#p.push(...e)}path(e){for(const t of this.#l)if(this.#c=e.startsWith(t))break}}(vo,"-"),ko=(e,t)=>{for(const[n,r]of bo(t))if(Eo.path(`${e}/${n}`),Eo.push(`_path = _Path("${e}/${n}")`),"string"==typeof r){const e=JSON.stringify(r);Eo.push(`_path.write_text(${e},encoding="utf-8")`)}else Eo.push(`if not _os.path.exists("${e}/${n}"):`),Eo.push(" _path.mkdir(parents=True, exist_ok=True)"),ko(`${e}/${n}`,r)};ko(".",{pyscript:{"__init__.py":"from polyscript import lazy_py_modules as py_import\nfrom pyscript.context import RUNNING_IN_WORKER,PyWorker,config,current_target,document,js_import,js_modules,sync,window\nfrom pyscript.display import HTML,display\nfrom pyscript.fetch import fetch\nfrom pyscript.storage import Storage,storage\nfrom pyscript.websocket import WebSocket\nfrom pyscript.events import when,Event\nif not RUNNING_IN_WORKER:from pyscript.workers import create_named_worker,workers","context.py":"_A=None\nimport json,sys,js\nfrom polyscript import config as _polyscript_config,js_modules\nfrom pyscript.util import NotSupported\nRUNNING_IN_WORKER=not hasattr(js,'document')\nconfig=json.loads(js.JSON.stringify(_polyscript_config))\nif isinstance(config,str):config={}\njs_import=_A\nwindow=_A\ndocument=_A\nsync=_A\nif'MicroPython'in sys.version:config['type']='mpy'\nelse:config['type']='py'\nclass _JSModuleProxy:\n\tdef __init__(A,name):A.name=name\n\tdef __getattr__(B,field):\n\t\tA=field\n\t\tif not A.startswith('_'):return getattr(getattr(js_modules,B.name),A)\nfor module_name in js.Reflect.ownKeys(js_modules):sys.modules[f\"pyscript.js_modules.{module_name}\"]=_JSModuleProxy(module_name)\nsys.modules['pyscript.js_modules']=js_modules\nif RUNNING_IN_WORKER:\n\timport polyscript;PyWorker=NotSupported('pyscript.PyWorker','pyscript.PyWorker works only when running in the main thread')\n\ttry:window=polyscript.xworker.window;document=window.document;js.document=document;js_import=window.Function('return (...urls) => Promise.all(urls.map((url) => import(url)))')()\n\texcept:\n\t\tsab_error_message='Unable to use `window` or `document` in worker. This requires SharedArrayBuffer support. See: https://docs.pyscript.net/latest/faq/#sharedarraybuffer'\n\t\tif not config.get('sync_main_only',False):js.console.warn(sab_error_message)\n\t\twindow=NotSupported('pyscript.window',sab_error_message);document=NotSupported('pyscript.document',sab_error_message)\n\tsync=polyscript.xworker.sync\n\tdef current_target():return polyscript.target\nelse:\n\timport _pyscript;from _pyscript import PyWorker as _PyWorker;from pyscript.ffi import to_js;js_import=_pyscript.js_import\n\tdef PyWorker(url,**A):return _PyWorker(url,to_js(A))\n\twindow=js;document=js.document;sync=NotSupported('pyscript.sync','pyscript.sync works only when running in a worker')\n\tdef current_target():return _pyscript.target","display.py":"_I='__repr__'\n_H='savefig'\n_G='application/json'\n_F='image/svg+xml'\n_E='application/javascript'\n_D='image/jpeg'\n_C='text/html'\n_B='image/png'\n_A='text/plain'\nimport base64,html,io\nfrom collections import OrderedDict\nfrom pyscript.context import current_target,document,window\nfrom pyscript.ffi import is_none\ndef _render_image(mime,value,meta):\n\tA=value\n\tif isinstance(A,bytes):A=base64.b64encode(A).decode('utf-8')\n\tB=''.join([f' {A}=\"{B}\"'for(A,B)in meta.items()]);return f'<img src=\"data:{mime};base64,{A}\"{B}>'\n_MIME_TO_RENDERERS={_A:lambda v,m:html.escape(v),_C:lambda v,m:v,_B:lambda v,m:_render_image(_B,v,m),_D:lambda v,m:_render_image(_D,v,m),_F:lambda v,m:v,_G:lambda v,m:v,_E:lambda v,m:f\"<script>{v}<\\\\/script>\"}\n_METHOD_TO_MIME=OrderedDict([(_H,_B),('_repr_png_',_B),('_repr_jpeg_',_D),('_repr_svg_',_F),('_repr_html_',_C),('_repr_json_',_G),('_repr_javascript_',_E),(_I,_A)])\nclass HTML:\n\tdef __init__(A,html):A._html=html\n\tdef _repr_html_(A):return A._html\ndef _get_representation(obj,method):\n\tB=method;A=obj\n\tif B==_I:return repr(A)\n\tif not hasattr(A,B):return\n\tif B==_H:C=io.BytesIO();A.savefig(C,format='png');C.seek(0);return base64.b64encode(C.read()).decode('utf-8')\n\treturn getattr(A,B)()\ndef _get_content_and_mime(obj):\n\tC=obj\n\tif isinstance(C,str):return html.escape(C),_A\n\tE=_get_representation(C,'_repr_mimebundle_')\n\tif E:\n\t\tif isinstance(E,tuple):F,G=E\n\t\telse:F,G=E,{}\n\t\tfor(B,A)in F.items():\n\t\t\tif B in _MIME_TO_RENDERERS:\n\t\t\t\tD=G.get(B,{})\n\t\t\t\tif isinstance(A,tuple):A,H=A;D.update(H)\n\t\t\t\treturn _MIME_TO_RENDERERS[B](A,D),B\n\tfor(I,B)in _METHOD_TO_MIME.items():\n\t\tif B not in _MIME_TO_RENDERERS:continue\n\t\tA=_get_representation(C,I)\n\t\tif A is None:continue\n\t\tD={}\n\t\tif isinstance(A,tuple):A,D=A\n\t\treturn _MIME_TO_RENDERERS[B](A,D),B\n\twindow.console.warn(f\"Object {type(C).__name__} has no supported representation method. Using __repr__ as fallback.\");A=repr(C);return html.escape(A),_A\ndef _write_to_dom(element,value,append):\n\tC=element;B,D=_get_content_and_mime(value)\n\tif not B.strip():return\n\tif append:A=document.createElement('div');C.append(A)\n\telse:A=C\n\tif D in(_E,_C):A.append(document.createRange().createContextualFragment(B))\n\telse:A.innerHTML=B\ndef display(*D,target=None,append=True):\n\tC=append;A=target\n\tif isinstance(A,str):A=A[1:]if A.startswith('#')else A\n\telif is_none(A):A=current_target()\n\tB=document.getElementById(A)\n\tif is_none(B):raise ValueError(f\"Cannot find element with id='{A}' in the page.\")\n\tif B.tagName=='SCRIPT'and hasattr(B,'target'):B=B.target\n\tif not C:B.replaceChildren()\n\tfor E in D:_write_to_dom(B,E,C)","events.py":"import asyncio,inspect\nfrom functools import wraps\nfrom pyscript.context import document\nfrom pyscript.ffi import create_proxy,to_js\nfrom pyscript.util import is_awaitable\nclass Event:\n\tdef __init__(A):A._listeners=[]\n\tdef trigger(C,result):\n\t\tB=result\n\t\tfor A in C._listeners:\n\t\t\tif is_awaitable(A):asyncio.create_task(A(B))\n\t\t\telse:A(B)\n\tdef add_listener(B,listener):\n\t\tA=listener\n\t\tif not callable(A):C='Listener must be callable.';raise ValueError(C)\n\t\tif A not in B._listeners:B._listeners.append(A)\n\tdef remove_listener(A,*B):\n\t\tif B:\n\t\t\tfor C in B:\n\t\t\t\ttry:A._listeners.remove(C)\n\t\t\t\texcept ValueError:pass\n\t\telse:A._listeners=[]\ndef when(event_type,selector=None,**C):\n\tB=selector;A=event_type\n\tif isinstance(A,str):\n\t\tif not B:raise ValueError('Selector required for DOM event handling.')\n\t\tD=_get_elements(B)\n\t\tif not D:raise ValueError(f\"No elements found for selector: {B}\")\n\tdef E(func):\n\t\tB=_create_wrapper(func)\n\t\tif isinstance(A,Event):A.add_listener(B)\n\t\telif isinstance(A,list)and all(isinstance(A,Event)for A in A):\n\t\t\tfor E in A:E.add_listener(B)\n\t\telse:\n\t\t\tfor F in D:F.addEventListener(A,create_proxy(B),to_js(C)if C else False)\n\t\treturn B\n\treturn E\ndef _get_elements(selector):\n\tA=selector;from pyscript.web import Element as B,ElementCollection as C\n\tif isinstance(A,str):return list(document.querySelectorAll(A))\n\telif isinstance(A,B):return[A._dom_element]\n\telif isinstance(A,C):return[A._dom_element for A in A]\n\telif isinstance(A,list):return A\n\telse:return[A]\ndef _create_wrapper(func):\n\tA=func;B=A\n\twhile hasattr(B,'__wrapped__'):B=B.__wrapped__\n\tE=inspect.signature(B);D=bool(E.parameters)\n\tif is_awaitable(A):\n\t\tif D:\n\t\t\tasync def C(event):return await A(event)\n\t\telse:\n\t\t\tasync def C(*B,**C):return await A()\n\telif D:\n\t\tdef C(event):return A(event)\n\telse:\n\t\tdef C(*B,**C):return A()\n\treturn wraps(A)(C)","fetch.py":"import json,js\nfrom pyscript.util import as_bytearray\nclass _FetchResponse:\n\tdef __init__(A,response):A._response=response\n\tdef __getattr__(A,attr):return getattr(A._response,attr)\n\tasync def arrayBuffer(B):\n\t\tA=await B._response.arrayBuffer()\n\t\tif hasattr(A,'to_py'):return A.to_py()\n\t\treturn memoryview(as_bytearray(A))\n\tasync def blob(A):return await A._response.blob()\n\tasync def bytearray(A):B=await A._response.arrayBuffer();return as_bytearray(B)\n\tasync def json(A):return json.loads(await A.text())\n\tasync def text(A):return await A._response.text()\nclass _FetchPromise:\n\tdef __init__(B,promise):A=promise;B._promise=A;A._response=None;A.arrayBuffer=B.arrayBuffer;A.blob=B.blob;A.bytearray=B.bytearray;A.json=B.json;A.text=B.text\n\t@staticmethod\n\tdef setup(promise,response):A=promise;A._response=_FetchResponse(response);return A._response\n\tasync def _get_response(A):\n\t\tif not A._promise._response:await A._promise\n\t\treturn A._promise._response\n\tasync def arrayBuffer(A):B=await A._get_response();return await B.arrayBuffer()\n\tasync def blob(A):B=await A._get_response();return await B.blob()\n\tasync def bytearray(A):B=await A._get_response();return await B.bytearray()\n\tasync def json(A):B=await A._get_response();return await B.json()\n\tasync def text(A):B=await A._get_response();return await B.text()\ndef fetch(url,**B):\n\tC=js.JSON.parse(json.dumps(B))\n\tdef D(response,*B):return _FetchPromise.setup(A,response)\n\tA=js.fetch(url,C).then(D);_FetchPromise(A);return A","ffi.py":"try:\n\timport js;from pyodide.ffi import create_proxy as _cp,to_js as _py_tjs,jsnull;from_entries=js.Object.fromEntries\n\tdef _to_js_wrapper(value,**A):\n\t\tB='dict_converter'\n\t\tif B not in A:A[B]=from_entries\n\t\treturn _py_tjs(value,**A)\nexcept:from jsffi import create_proxy as _cp;from jsffi import to_js as _to_js_wrapper;import js;jsnull=js.Object.getPrototypeOf(js.Object.prototype)\ndef create_proxy(func):return _cp(func)\ndef to_js(value,**A):return _to_js_wrapper(value,**A)\ndef is_none(value):A=value;return A is None or A is jsnull\ntry:from polyscript import ffi as _ffi;_assign=_ffi.assign;direct=_ffi.direct;gather=_ffi.gather;query=_ffi.query\nexcept:import js;_assign=js.Object.assign;direct=lambda source:source\ndef assign(source,*B):\n\tA=source\n\tfor C in B:_assign(A,to_js(C))\n\treturn A","flatted.py":"import json as _json\nclass _Known:\n\tdef __init__(A):A.key=[];A.value=[]\nclass _String:\n\tdef __init__(A,value):A.value=value\ndef _array_keys(value):\n\tA=[];B=0\n\tfor C in value:A.append(B);B+=1\n\treturn A\ndef _object_keys(value):\n\tA=[]\n\tfor B in value:A.append(B)\n\treturn A\ndef _is_array(value):return isinstance(value,(list,tuple))\ndef _is_object(value):return isinstance(value,dict)\ndef _is_string(value):return isinstance(value,str)\ndef _index(known,input,value):B=value;A=known;input.append(B);C=str(len(input)-1);A.key.append(B);A.value.append(C);return C\ndef _loop(keys,input,known,output):\n\tA=output\n\tfor B in keys:\n\t\tC=A[B]\n\t\tif isinstance(C,_String):_ref(B,input[int(C.value)],input,known,A)\n\treturn A\ndef _ref(key,value,input,known,output):\n\tB=known;A=value\n\tif _is_array(A)and A not in B:B.append(A);A=_loop(_array_keys(A),input,B,A)\n\telif _is_object(A)and A not in B:B.append(A);A=_loop(_object_keys(A),input,B,A)\n\toutput[key]=A\ndef _relate(known,input,value):\n\tB=known;A=value\n\tif _is_string(A)or _is_array(A)or _is_object(A):\n\t\ttry:return B.value[B.key.index(A)]\n\t\texcept:return _index(B,input,A)\n\treturn A\ndef _transform(known,input,value):\n\tB=known;A=value\n\tif _is_array(A):\n\t\tC=[]\n\t\tfor F in A:C.append(_relate(B,input,F))\n\t\treturn C\n\tif _is_object(A):\n\t\tD={}\n\t\tfor E in A:D[E]=_relate(B,input,A[E])\n\t\treturn D\n\treturn A\ndef _wrap(value):\n\tA=value\n\tif _is_string(A):return _String(A)\n\tif _is_array(A):\n\t\tB=0\n\t\tfor D in A:A[B]=_wrap(D);B+=1\n\telif _is_object(A):\n\t\tfor C in A:A[C]=_wrap(A[C])\n\treturn A\ndef parse(value,*C,**D):\n\tA=value;E=_json.loads(A,*C,**D);B=[]\n\tfor A in E:B.append(_wrap(A))\n\tinput=[]\n\tfor A in B:\n\t\tif isinstance(A,_String):input.append(A.value)\n\t\telse:input.append(A)\n\tA=input[0]\n\tif _is_array(A):return _loop(_array_keys(A),input,[A],A)\n\tif _is_object(A):return _loop(_object_keys(A),input,[A],A)\n\treturn A\ndef stringify(value,*D,**E):\n\tB=_Known();input=[];C=[];A=int(_index(B,input,value))\n\twhile A<len(input):C.append(_transform(B,input,input[A]));A+=1\n\treturn _json.dumps(C,*D,**E)","fs.py":"_B='pyscript'\n_A=None\nimport js\nfrom _pyscript import fs as _fs,interpreter\nfrom pyscript import window\nfrom pyscript.ffi import to_js\nfrom pyscript.context import RUNNING_IN_WORKER\nif RUNNING_IN_WORKER:from pyscript.context import sync as sync_with_worker;from polyscript import IDBMap\nmounted={}\nasync def _check_permission(details):A=details;B=A.handler;C=A.options;D=await B.queryPermission(C);return B if D=='granted'else _A\nasync def mount(path,mode='readwrite',root='',id=_B):\n\tC=path;js.console.warn('experimental pyscript.fs ⚠️');D=f\"{C}@{id}\"\n\tif C in mounted:\n\t\tfor H in mounted.keys():\n\t\t\tif H.startswith(f\"{C}@\")and H!=D:raise ValueError(f\"Path '{C}' is already mounted with a different ID. Unmount it first or use a different path.\")\n\tA=_A;B=_A;F={'id':id,'mode':mode}\n\tif root!='':F['startIn']=root\n\tif RUNNING_IN_WORKER:\n\t\tG=sync_with_worker.storeFSHandler(D,to_js(F))\n\t\tif isinstance(G,bool):E=G\n\t\telse:E=await G\n\t\tif E:\n\t\t\tJ=IDBMap.new(_fs.NAMESPACE);A=await J.get(D);B=await _check_permission(A)\n\t\t\tif B is _A:await js.Promise.resolve(sync_with_worker.getFSHandler(A.options));B=A.handler\n\t\telse:raise RuntimeError(_fs.ERROR)\n\telse:\n\t\tE=await _fs.idb.has(D)\n\t\tif E:\n\t\t\tA=await _fs.idb.get(D);B=await _check_permission(A)\n\t\t\tif B is _A:B=await _fs.getFileSystemDirectoryHandle(A.options)\n\t\telse:I=to_js(F);B=await _fs.getFileSystemDirectoryHandle(I);A={'handler':B,'options':I};await _fs.idb.set(D,to_js(A))\n\tmounted[C]=await interpreter.mountNativeFS(C,B)\nasync def sync(path):\n\tA=path\n\tif A not in mounted:raise KeyError(f\"Path '{A}' is not mounted. Use fs.mount() to mount it first.\")\n\tawait mounted[A].syncfs()\nasync def unmount(path):\n\tA=path\n\tif A not in mounted:raise KeyError(f\"Path '{A}' is not mounted. Cannot unmount.\")\n\tawait sync(A);interpreter._module.FS.unmount(A);del mounted[A]\nasync def revoke(path,id=_B):\n\tB=path;C=f\"{B}@{id}\"\n\tif RUNNING_IN_WORKER:A=sync_with_worker.deleteFSHandler(C)\n\telse:\n\t\tA=await _fs.idb.has(C)\n\t\tif A:A=await _fs.idb.delete(C)\n\tif A:\n\t\tinterpreter._module.FS.unmount(B)\n\t\tif B in mounted:del mounted[B]\n\treturn A","media.py":"from pyscript import window\nfrom pyscript.ffi import to_js\nclass Device:\n\tdef __init__(A,device):A._device_info=device\n\t@property\n\tdef id(self):return self._device_info.deviceId\n\t@property\n\tdef group(self):return self._device_info.groupId\n\t@property\n\tdef kind(self):return self._device_info.kind\n\t@property\n\tdef label(self):return self._device_info.label\n\tdef __getitem__(A,key):return getattr(A,key)\n\t@classmethod\n\tasync def request_stream(F,audio=False,video=True):\n\t\tE='video';D='audio';C=video;B=audio;A={}\n\t\tif isinstance(B,bool):A[D]=B\n\t\telif isinstance(B,dict):A[D]=B\n\t\tif isinstance(C,bool):A[E]=C\n\t\telif isinstance(C,dict):A[E]=C\n\t\treturn await window.navigator.mediaDevices.getUserMedia(to_js(A))\n\t@classmethod\n\tasync def load(A,audio=False,video=True):return await A.request_stream(audio=audio,video=video)\n\tasync def get_stream(A):B=A.kind.replace('input','').replace('output','');C={B:{'deviceId':{'exact':A.id}}};return await A.request_stream(**C)\nasync def list_devices():A=await window.navigator.mediaDevices.enumerateDevices();return[Device(A)for A in A]","storage.py":"_C='memoryview'\n_B='bytearray'\n_A='generic'\nfrom polyscript import storage as _polyscript_storage\nfrom pyscript.flatted import parse as _parse\nfrom pyscript.flatted import stringify as _stringify\nfrom pyscript.ffi import is_none\ndef _convert_to_idb(value):\n\tA=value\n\tif is_none(A):return _stringify(['null',0])\n\tif isinstance(A,(bool,float,int,str,list,dict,tuple)):return _stringify([_A,A])\n\tif isinstance(A,bytearray):return _stringify([_B,list(A)])\n\tif isinstance(A,memoryview):return _stringify([_C,list(A)])\n\traise TypeError(f\"Cannot serialize type {type(A).__name__} for storage.\")\ndef _convert_from_idb(value):\n\tC=value;A,B=_parse(C)\n\tif A=='null':return\n\tif A==_A:return B\n\tif A==_B:return bytearray(B)\n\tif A==_C:return memoryview(bytearray(B))\n\treturn C\nclass Storage(dict):\n\tdef __init__(B,store):A=store;super().__init__({A:_convert_from_idb(B)for(A,B)in A.entries()});B._store=A\n\tdef __delitem__(A,key):A._store.delete(key);super().__delitem__(key)\n\tdef __setitem__(B,key,value):A=value;B._store.set(key,_convert_to_idb(A));super().__setitem__(key,A)\n\tdef clear(A):A._store.clear();super().clear()\n\tasync def sync(A):await A._store.sync()\nasync def storage(name='',storage_class=Storage):\n\tif not name:raise ValueError('Storage name must be a non-empty string')\n\tA=await _polyscript_storage(f\"@pyscript/{name}\");return storage_class(A)","util.py":"import js,inspect\ndef as_bytearray(buffer):\n\tA=js.Uint8Array.new(buffer);B=A.length;C=bytearray(B)\n\tfor D in range(B):C[D]=A[D]\n\treturn C\nclass NotSupported:\n\tdef __init__(A,name,error):object.__setattr__(A,'name',name);object.__setattr__(A,'error',error)\n\tdef __repr__(A):return f\"<NotSupported {A.name} [{A.error}]>\"\n\tdef __getattr__(A,attr):raise AttributeError(A.error)\n\tdef __setattr__(A,attr,value):raise AttributeError(A.error)\n\tdef __call__(A,*B):raise TypeError(A.error)\ndef is_awaitable(obj):\n\tA=obj;from pyscript import config as C\n\tif C['type']=='mpy':\n\t\tB=repr(A)\n\t\tif'<closure <generator>'in B:return True\n\t\tif'<bound_method'in B and'<generator>'in B:return True\n\t\treturn inspect.isgeneratorfunction(A)\n\treturn inspect.iscoroutinefunction(A)","web.py":"_D='object'\n_C='tagName'\n_B='on_'\n_A=None\nfrom js import console\nfrom pyscript import document,Event\nfrom pyscript.ffi import create_proxy,is_none\ndef _wrap_if_not_none(dom_element):return Element.wrap_dom_element(dom_element)if not is_none(dom_element)else _A\ndef _find_by_id(dom_node,target_id):element_id=target_id[1:]if target_id.startswith('#')else target_id;result=dom_node.querySelector(f\"#{element_id}\");return _wrap_if_not_none(result)\ndef _find_and_wrap(dom_node,selector):return ElementCollection.wrap_dom_elements(dom_node.querySelectorAll(selector))\nclass Element:\n\telement_classes_by_tag_name={}\n\t@classmethod\n\tdef get_tag_name(cls):return cls.__name__.replace('_','')\n\t@classmethod\n\tdef register_element_classes(cls,element_classes):\n\t\tfor element_class in element_classes:tag_name=element_class.get_tag_name();cls.element_classes_by_tag_name[tag_name]=element_class\n\t@classmethod\n\tdef unregister_element_classes(cls,element_classes):\n\t\tfor element_class in element_classes:tag_name=element_class.get_tag_name();cls.element_classes_by_tag_name.pop(tag_name,_A)\n\t@classmethod\n\tdef wrap_dom_element(cls,dom_element):element_cls=cls.element_classes_by_tag_name.get(dom_element.tagName.lower(),cls);return element_cls(dom_element=dom_element)\n\tdef __init__(self,dom_element=_A,classes=_A,style=_A,**kwargs):\n\t\tif is_none(dom_element):self._dom_element=document.createElement(type(self).get_tag_name())\n\t\telse:self._dom_element=dom_element\n\t\tself._on_events={};self.update(classes=classes,style=style,**kwargs)\n\tdef __eq__(self,obj):return isinstance(obj,Element)and obj._dom_element==self._dom_element\n\tdef __getitem__(self,key):\n\t\tif isinstance(key,(int,slice)):return self.children[key]\n\t\tif isinstance(key,str):return _find_by_id(self._dom_element,key)\n\t\traise TypeError(f\"Element indices must be integers, slices, or strings, not {type(key).__name__}.\")\n\tdef __getattr__(self,name):\n\t\tif name.startswith(_B):return self.get_event(name)\n\t\tdom_name=self._normalize_attribute_name(name);return getattr(self._dom_element,dom_name)\n\tdef __setattr__(self,name,value):\n\t\tif name.startswith('_'):super().__setattr__(name,value)\n\t\telif name.startswith(_B):self.get_event(name).add_listener(value)\n\t\telse:dom_name=self._normalize_attribute_name(name);setattr(self._dom_element,dom_name,value)\n\tdef _normalize_attribute_name(self,name):\n\t\tif name.endswith('_'):name=name[:-1]\n\t\tif name=='for':return'htmlFor'\n\t\tif name=='class':return'className'\n\t\treturn name\n\tdef get_event(self,name):\n\t\tif not name.startswith(_B):raise ValueError(\"Event names must start with 'on_'.\")\n\t\tevent_name=name[3:]\n\t\tif not hasattr(self._dom_element,event_name):raise ValueError(f\"Element has no '{event_name}' event.\")\n\t\tif name in self._on_events:return self._on_events[name]\n\t\tev=Event();self._on_events[name]=ev;self._dom_element.addEventListener(event_name,create_proxy(ev.trigger));return ev\n\t@property\n\tdef children(self):return ElementCollection.wrap_dom_elements(self._dom_element.children)\n\t@property\n\tdef classes(self):\n\t\tif not hasattr(self,'_classes'):self._classes=Classes(self)\n\t\treturn self._classes\n\t@property\n\tdef style(self):\n\t\tif not hasattr(self,'_style'):self._style=Style(self)\n\t\treturn self._style\n\t@property\n\tdef parent(self):\n\t\tif is_none(self._dom_element.parentElement):return\n\t\treturn Element.wrap_dom_element(self._dom_element.parentElement)\n\tdef append(self,*items):\n\t\tfor item in items:\n\t\t\tif isinstance(item,Element):self._dom_element.appendChild(item._dom_element)\n\t\t\telif isinstance(item,ElementCollection):\n\t\t\t\tfor element in item:self._dom_element.appendChild(element._dom_element)\n\t\t\telif isinstance(item,(list,tuple)):\n\t\t\t\tfor child in item:self.append(child)\n\t\t\telif hasattr(item,_C):self._dom_element.appendChild(item)\n\t\t\telif hasattr(item,'length'):\n\t\t\t\tfor element in item:self._dom_element.appendChild(element)\n\t\t\telif isinstance(item,(str,int,float,bool)):self._dom_element.append(item)\n\t\t\telse:raise TypeError(f\"Cannot append {type(item).__name__} to element.\")\n\tdef clone(self,clone_id=_A):clone=Element.wrap_dom_element(self._dom_element.cloneNode(True));clone.id=clone_id;return clone\n\tdef find(self,selector):return _find_and_wrap(self._dom_element,selector)\n\tdef show_me(self):self._dom_element.scrollIntoView()\n\tdef update(self,classes=_A,style=_A,**kwargs):\n\t\tif classes:\n\t\t\tif isinstance(classes,str):self.classes.add(classes)\n\t\t\telse:\n\t\t\t\tfor class_name in classes:self.classes.add(class_name)\n\t\tif style:\n\t\t\tfor(key,value)in style.items():self.style[key]=value\n\t\tfor(name,value)in kwargs.items():setattr(self,name,value)\nclass Classes(set):\n\tdef __init__(self,element):self._class_list=element._dom_element.classList;super().__init__(self._class_list)\n\tdef _extract_class_names(self,class_name):return[name for name in class_name.split()if name]if' 'in class_name else[class_name]\n\tdef add(self,class_name):\n\t\tfor name in self._extract_class_names(class_name):super().add(name);self._class_list.add(name)\n\tdef remove(self,class_name):\n\t\tfor name in self._extract_class_names(class_name):\n\t\t\tif name in self:super().remove(name);self._class_list.remove(name)\n\t\t\telse:console.warn(f\"Class '{name}' not found in element classes.\")\n\tdef discard(self,class_name):\n\t\tfor name in self._extract_class_names(class_name):\n\t\t\tsuper().discard(name)\n\t\t\tif name in self._class_list:self._class_list.remove(name)\n\tdef clear(self):\n\t\tsuper().clear()\n\t\twhile self._class_list.length>0:self._class_list.remove(self._class_list.item(0))\nclass Style(dict):\n\tdef __init__(self,element):self._style=element._dom_element.style;super().__init__()\n\tdef __setitem__(self,key,value):super().__setitem__(key,value);self._style.setProperty(key,str(value))\n\tdef __delitem__(self,key):super().__delitem__(key);self._style.removeProperty(key)\nclass HasOptions:\n\t@property\n\tdef options(self):\n\t\tif not hasattr(self,'_options'):self._options=Options(self)\n\t\treturn self._options\nclass Options:\n\tdef __init__(self,element):self._element=element\n\tdef __getitem__(self,key):return self.options[key]\n\tdef __iter__(self):yield from self.options\n\tdef __len__(self):return len(self.options)\n\tdef __repr__(self):return f\"{self.__class__.__name__} (length: {len(self)}) {self.options}\"\n\t@property\n\tdef options(self):return[Element.wrap_dom_element(o)for o in self._element._dom_element.options]\n\t@property\n\tdef selected(self):return self.options[self._element._dom_element.selectedIndex]\n\tdef add(self,value=_A,html=_A,text=_A,before=_A,**kwargs):\n\t\tif value:kwargs['value']=value\n\t\tif html:kwargs['innerHTML']=html\n\t\tif text:kwargs['text']=text\n\t\tnew_option=option(**kwargs)\n\t\tif before and isinstance(before,Element):before=before._dom_element\n\t\tself._element._dom_element.add(new_option._dom_element,before)\n\tdef clear(self):self._element._dom_element.length=0\n\tdef remove(self,index):self._element._dom_element.remove(index)\nclass ContainerElement(Element):\n\tdef __init__(self,*args,children=_A,dom_element=_A,style=_A,classes=_A,**kwargs):\n\t\tsuper().__init__(dom_element=dom_element,style=style,classes=classes,**kwargs)\n\t\tfor child in list(args)+(children or[]):\n\t\t\tif isinstance(child,(Element,ElementCollection)):self.append(child)\n\t\t\telse:self._dom_element.insertAdjacentHTML('beforeend',child)\n\tdef __iter__(self):yield from self.children\nclass ElementCollection:\n\t@classmethod\n\tdef wrap_dom_elements(cls,dom_elements):return cls([Element.wrap_dom_element(dom_element)for dom_element in dom_elements])\n\tdef __init__(self,elements):self._elements=elements\n\tdef __eq__(self,obj):return isinstance(obj,ElementCollection)and obj._elements==self._elements\n\tdef __getitem__(self,key):\n\t\tif isinstance(key,int):return self._elements[key]\n\t\tif isinstance(key,slice):return ElementCollection(self._elements[key])\n\t\tif isinstance(key,str):\n\t\t\tfor element in self._elements:\n\t\t\t\telement_id=key[1:]if key.startswith('#')else key\n\t\t\t\tif element.id==element_id:return element\n\t\t\t\tresult=_find_by_id(element._dom_element,element_id)\n\t\t\t\tif result:return result\n\t\t\treturn\n\t\traise TypeError(f\"Collection indices must be integers, slices, or strings, not {type(key).__name__}\")\n\tdef __iter__(self):yield from self._elements\n\tdef __len__(self):return len(self._elements)\n\tdef __repr__(self):return f\"{self.__class__.__name__} (length: {len(self._elements)}) {self._elements}\"\n\t@property\n\tdef elements(self):return self._elements\n\tdef find(self,selector):\n\t\telements=[]\n\t\tfor element in self._elements:elements.extend(_find_and_wrap(element._dom_element,selector))\n\t\treturn ElementCollection(elements)\n\tdef update_all(self,classes=_A,style=_A,**kwargs):\n\t\tfor element in self._elements:element.update(classes=classes,style=style,**kwargs)\nclass canvas(ContainerElement):\n\tdef download(self,filename='snapped.png'):download_link=a(download=filename,href=self._dom_element.toDataURL());self.append(download_link);download_link._dom_element.click()\n\tdef draw(self,what,width=_A,height=_A):\n\t\tif isinstance(what,Element):what=what._dom_element\n\t\tctx=self._dom_element.getContext('2d')\n\t\tif width or height:ctx.drawImage(what,0,0,width,height)\n\t\telse:ctx.drawImage(what,0,0)\nclass video(ContainerElement):\n\tdef snap(self,to=_A,width=_A,height=_A):\n\t\tB='CANVAS';A='Element to snap to must be a canvas.';width=width if width else self.videoWidth;height=height if height else self.videoHeight\n\t\tif is_none(to):to=canvas(width=width,height=height)\n\t\telif isinstance(to,Element):\n\t\t\tif to.tag!='canvas':raise TypeError(A)\n\t\telif getattr(to,_C,'')==B:to=canvas(dom_element=to)\n\t\telif isinstance(to,str):\n\t\t\tnodelist=document.querySelectorAll(to)\n\t\t\tif nodelist.length==0:raise TypeError(f\"No element with selector {to} to snap to.\")\n\t\t\tif nodelist[0].tagName!=B:raise TypeError(A)\n\t\t\tto=canvas(dom_element=nodelist[0])\n\t\tto.draw(self,width,height);return to\nclass datalist(ContainerElement,HasOptions):0\nclass optgroup(ContainerElement,HasOptions):0\nclass select(ContainerElement,HasOptions):0\nCONTAINER_TAGS=['a','abbr','address','article','aside','audio','b','blockquote','body','button','caption','cite','code','colgroup','data','dd','del','details','dialog','div','dl','dt','em','fieldset','figcaption','figure','footer','form','h1','h2','h3','h4','h5','h6','head','header','hgroup','html','i','iframe','ins','kbd','label','legend','li','main','map','mark','menu','meta','meter','nav',_D,'ol','option','output','p','param','picture','pre','progress','q','s','script','section','small','span','strong','style','sub','summary','sup','table','tbody','td','template','textarea','tfoot','th','thead','time','title','tr','u','ul','var','wbr']\nVOID_TAGS=['area','base','br','col','embed','hr','img','input','link','source','track']\ndef _create_element_classes():\n\tA='__doc__';classes=[canvas,video,datalist,optgroup,select]\n\tfor tag in CONTAINER_TAGS:class_name=f\"{tag}_\"if tag in('del','map',_D)else tag;doc=f\"HTML <{tag}> element. Ref: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/{tag}\";cls=type(class_name,(ContainerElement,),{A:doc});globals()[class_name]=cls;classes.append(cls)\n\tfor tag in VOID_TAGS:class_name=f\"{tag}_\"if tag=='input'else tag;doc=f\"HTML <{tag}> element. Ref: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/{tag}\";cls=type(class_name,(Element,),{A:doc});globals()[class_name]=cls;classes.append(cls)\n\tElement.register_element_classes(classes)\n_create_element_classes()\nclass Page:\n\tdef __init__(self):self.html=Element.wrap_dom_element(document.documentElement);self.body=Element.wrap_dom_element(document.body);self.head=Element.wrap_dom_element(document.head)\n\tdef __getitem__(self,key):return _find_by_id(document,key)\n\t@property\n\tdef title(self):return document.title\n\t@title.setter\n\tdef title(self,value):document.title=value\n\tdef append(self,*items):self.body.append(*items)\n\tdef find(self,selector):return _find_and_wrap(document,selector)\npage=Page()","websocket.py":"import js\nfrom pyscript.ffi import create_proxy\nfrom pyscript.util import as_bytearray,is_awaitable\ndef _attach_event_handler(websocket,handler_name,handler_function):\n\tA=handler_function\n\tif is_awaitable(A):\n\t\tasync def C(event):await A(WebSocketEvent(event))\n\t\tB=create_proxy(C)\n\telse:B=create_proxy(lambda event:A(WebSocketEvent(event)))\n\tsetattr(websocket,handler_name,B)\nclass WebSocketEvent:\n\tdef __init__(A,event):A._event=event\n\tdef __getattr__(B,attr):\n\t\tA=getattr(B._event,attr)\n\t\tif attr=='data'and not isinstance(A,str):\n\t\t\tif hasattr(A,'to_py'):return A.to_py()\n\t\t\telse:return memoryview(as_bytearray(A))\n\t\treturn A\nclass WebSocket:\n\tCONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3\n\tdef __init__(B,url,protocols=None,**D):\n\t\tC=protocols\n\t\tif C:A=js.WebSocket.new(url,C)\n\t\telse:A=js.WebSocket.new(url)\n\t\tA.binaryType='arraybuffer';object.__setattr__(B,'_js_websocket',A)\n\t\tfor(E,F)in D.items():setattr(B,E,F)\n\tdef __getattr__(A,attr):return getattr(A._js_websocket,attr)\n\tdef __setattr__(B,attr,value):\n\t\tC=value;A=attr\n\t\tif A in['onclose','onerror','onmessage','onopen']:_attach_event_handler(B._js_websocket,A,C)\n\t\telse:setattr(B._js_websocket,A,C)\n\tdef send(B,data):\n\t\tA=data\n\t\tif isinstance(A,str):B._js_websocket.send(A)\n\t\telse:\n\t\t\tC=js.Uint8Array.new(len(A))\n\t\t\tfor(D,E)in enumerate(A):C[D]=E\n\t\t\tB._js_websocket.send(C)\n\tdef close(B,code=None,reason=None):\n\t\tC=reason;A=code\n\t\tif A and C:B._js_websocket.close(A,C)\n\t\telif A:B._js_websocket.close(A)\n\t\telse:B._js_websocket.close()","workers.py":"import js,json\nfrom polyscript import workers as _polyscript_workers\nclass _ReadOnlyWorkersProxy:\n\tdef __getitem__(A,name):return js.Reflect.get(_polyscript_workers,name)\n\tdef __getattr__(A,name):return js.Reflect.get(_polyscript_workers,name)\nworkers=_ReadOnlyWorkersProxy()\nasync def create_named_worker(src,name,config=None,type='py'):\n\tB=config;A=js.document.createElement('script');A.type=type;A.src=src;A.setAttribute('worker','');A.setAttribute('name',name)\n\tif B:\n\t\tif isinstance(B,str):C=B\n\t\telse:C=json.dumps(B)\n\t\tA.setAttribute('config',C)\n\tjs.document.body.append(A);return await workers[name]"}}),vo.push("import pyscript as _pyscript"),vo.push(...["_Path","_path","_os","_pyscript"].map(e=>`del ${e}`)),vo.push("\n");const Bo=vo.join("\n"),jo=Eo.join("\n"),So=e=>Oo.main[e],xo=e=>Oo.worker[e],Ro=(e,t,n,r)=>{e[n]=()=>{const e=r?[r]:[];return e.push(...t(n)),e.map(v).join("\n")}},Co=(e,t)=>{const n="mpy"===t?Bo.replace(jo,""):Bo,r={};return Ro(r,e,"codeBeforeRun",n),Ro(r,e,"codeBeforeRunAsync",n),Ro(r,e,"codeAfterRun"),Ro(r,e,"codeAfterRunAsync"),r},$o=(e,t)=>{const n=[...xo(t)];if(n.length){const r=Ao(e[`_${t}`]||(t.endsWith("Async")?async(e,t,...n)=>{for(const r of n)await r(e,t)}:(e,t,...n)=>{for(const r of n)r(e,t)})),s=n.map(Ao).join(", ");return Function(`return(w,x)=>(${r})(w,x,...[${s}])`)()}},Do=wo({typeof:"function"}),To=wo({typeof:"string"}),Po='\n import builtins\n def input(prompt=""):\n raise Exception("\\n ".join([\n "input() doesn\'t work when PyScript runs in the main thread.",\n "Consider using the worker attribute: https://pyscript.github.io/docs/2023.11.2/user-guide/workers/"\n ]))\n\n builtins.input = input\n del builtins\n del input\n',Oo={main:{onWorker:new Do,onReady:new Do,onBeforeRun:new Do,onBeforeRunAsync:new Do,onAfterRun:new Do,onAfterRunAsync:new Do,codeBeforeRun:new To([Po]),codeBeforeRunAsync:new To,codeAfterRun:new To,codeAfterRunAsync:new To},worker:{onReady:new Do,onBeforeRun:new Do,onBeforeRunAsync:new Do([({interpreter:e})=>{e.registerJsModule("_pyscript",{fs:{ERROR:"storage permissions not granted",NAMESPACE:"@pyscript.fs"},interpreter:e})}]),onAfterRun:new Do,onAfterRunAsync:new Do,codeBeforeRun:new To,codeBeforeRunAsync:new To,codeAfterRun:new To,codeAfterRunAsync:new To}};var Mo={get core(){return import("./codemirror-lAW8P_b2.js")},get state(){return import("./codemirror_state-BNbbkoNK.js")},get python(){return import("./codemirror_lang-python-C__shTTP.js")},get language(){return import("./codemirror_language-BRdaMe3x.js").then(function(e){return e.x})},get view(){return import("./codemirror_view-WuoIJFLW.js").then(function(e){return e.t})},get commands(){return import("./codemirror_commands-Og5MXTi1.js")}},Fo=Object.freeze({__proto__:null,default:Mo});
|
|
1
|
+
try{crypto.randomUUID()}catch(e){location.href.startsWith("http://0.0.0.0")&&(location.href=location.href.replace("0.0.0.0","localhost"))}var e=Promise.withResolvers.bind(Promise);const t=new WeakMap,n=e=>{const n=e||console,r={buffered:s,stderr:(n.stderr||console.error).bind(n),stdout:(n.stdout||console.log).bind(n)};return{stderr:(...e)=>r.stderr(...e),stdout:(...e)=>r.stdout(...e),async get(e){const n=await e;return t.set(n,r),n}}},r=new TextDecoder,s=(e,t=10)=>{const n=[];return s=>{if(s instanceof Uint8Array)for(const o of s)o===t?e(r.decode(new Uint8Array(n.splice(0)))):n.push(o);else e(s)}},o=Object.getOwnPropertyDescriptors(Response.prototype),a=e=>"function"==typeof e,i={get:(e,t)=>o.hasOwnProperty(t)?((e,t,{get:n,value:r})=>n||!a(r)?e.then(e=>e[t]):(...n)=>e.then(e=>e[t](...n)))(e,t,o[t]):((e,t)=>a(t)?t.bind(e):t)(e,e[t])};var c=(e,...t)=>new Proxy(fetch(e,...t).then(t=>t.ok?t:Promise.reject(new Error(`[${t.status}] Unable to fetch ${e}`))),i);const{assign:l}=Object,p="entries",f="readonly",u="readwrite",d={durability:"default",prefix:"IDBMap"},m=({target:{result:e}})=>e;let _=class extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(p,t,this.#t);return new Promise((t,r)=>l(e(n.objectStore(p)),{onsuccess:t,onerror:r}))}constructor(e,{durability:t=d.durability,prefix:n=d.prefix}=d){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise((t,n)=>{l(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(p),n.oncomplete=()=>t(e)},onsuccess(e){t(m(e))},onerror(e){n(e),this.dispatchEvent(e)}})}).then(e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e})}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?l(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r(e=>e.count(),f).then(m)}async clear(){await this.#r(e=>e.clear(),u)}async delete(e){await this.#r(t=>t.delete(e),u)}async entries(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e).then(t=>[e,t])))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r(t=>t.get(e),f).then(m)}async has(e){return void 0!==await this.#r(t=>t.getKey(e),f).then(m)}async keys(){return await this.#r(e=>e.getAllKeys(),f).then(m)}async set(e,t){return await this.#r(n=>n.put(t,e),u),this}async values(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e)))}get[Symbol.toStringTag](){return this.#n}};class y extends Map{#s;#o;constructor(...e){super(),this.#s=new _(...e),this.#o=this.#s.entries().then(e=>{for(const[t,n]of e)super.set(t,n)})}async close(){await this.#o,await this.#s.close()}async sync(){await this.#o}clear(){return this.#o=this.#o.then(()=>this.#s.clear()),super.clear()}delete(e){return this.#o=this.#o.then(()=>this.#s.delete(e)),super.delete(e)}set(e,t){return this.#o=this.#o.then(()=>this.#s.set(e,t)),super.set(e,t)}}const h={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\r\n]+/))if(t.trim().length){/^(\s+)/.test(t)&&(e=e.replace(new RegExp("^"+RegExp.$1,"gm"),""));break}return e}},{replace:g}="",w=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34);/g,A={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'},b=e=>A[e],v=(e,...t)=>h[typeof e](e,...t),E=e=>g.call(e,w,b),{isArray:k}=Array,{assign:B,create:j,defineProperties:S,defineProperty:x,entries:R}=Object,{all:C,resolve:$}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),D=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href;function T(e){return e.startsWith(".")?D(e,this):e}let P=0;const O=(e,t)=>({id:e.id||(e.id=`${t}-w${P++}`),tag:e.tagName}),M=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},F=(e,n,r,s)=>({type:n,config:r,interpreter:s,io:t.get(s),run:(t,...n)=>e.run(s,t,...n),runAsync:(t,...n)=>e.runAsync(s,t,...n),runEvent:(...t)=>e.runEvent(s,...t)}),L=e=>e.replace(/^(?:\n|\r\n)/,""),N=(e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,L(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,L(t),...o);return r&&await s(e,r,...o),a}},I=Symbol.for("polyscript.js_modules"),U=new Map;x(globalThis,I,{value:U});const H=new Proxy(U,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]}),W=(e,t)=>!t.startsWith("_"),q=(e,t)=>new Proxy(e,{has:W,get:(e,n)=>e[t][n]}),z=(e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,q(r,e));t.registerJSModule(n,s,r)},G=(e,t)=>import(e).then(e=>{U.set(t,{...e})}),J=e=>new Promise((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(B(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))}),K=e=>/\.css$/i.test(new URL(e).pathname),Y=e=>/^(?:false|0|no)$/i.test(e.getAttribute("async")),V=!globalThis.window,X=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):Z(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},Z=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},Q=e=>{const t=e.map(e=>e.trim().replace(/(^[/]*|[/]*$)/g,"")).filter(e=>""!==e&&"."!==e).join("/");return e[0].startsWith("/")?`/${t}`:t},ee=(e,t)=>c(D(e,t)).arrayBuffer(),te=(e,t,n,r)=>C((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use 'to_file' and 'files' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn't determine the filename from the path ${r}, please supply 'to_file' parameter.`)}return e.flatMap(({from:e="",to_folder:t=".",to_file:n,files:r})=>{if(k(r))return r.map(n=>({url:Q([e,n]),path:Q([t,n])}));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:Q([t,s])}]})})(n).map(({url:n,path:s})=>ee(n,r).then(n=>e.writeFile(t,s,n)))),ne=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,re=(e,t)=>e.replace(/\{.+?\}/g,e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)}),se=(e,t,n,r)=>C((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of R(e))if(/^\{.+\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,re(o,t))}else{const e=re(s,t),a=ne(e,re(o||"./",t));if(n.has(a)&&!a.endsWith("/*"))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map(({url:n,path:s})=>ee(n,r).then(r=>e.writeFile(t,s,r,n)))),oe=e=>t=>{dispatchEvent(new CustomEvent(`${e}:progress`,{detail:t}))};let ae=0;const ie=ae++,ce=ae++,le=ae++,pe=ae++,fe=ae++,ue=ae++,de=ae++,me=ae++,_e=ae++,ye=ae++,he=ae++,ge=ae++,we=ae++,Ae=ae++,be=ae++,ve=ae++,Ee=ae++,ke=ae++,Be=ae++,je=ae++,Se=ae++,xe=ae++,Re=ae++,Ce=ae++,$e=ae++,De=ae++,Te=ae++,Pe=ae++;const Oe=globalThis.ImageData||class{},Me=new TextDecoder,Fe=new TextEncoder,Le=new Map(Reflect.ownKeys(Symbol).map(e=>[Symbol[e],`@${String(e)}`])),Ne=e=>{switch(e[0]){case"@":return Symbol[e.slice(1)];case"#":return Symbol.for(e.slice(1));case"!":return Symbol(e.slice(1));default:return Symbol()}},Ie=e=>Le.get(e)||((e,t)=>void 0===t?"?":void 0===Symbol.keyFor(e)?`!${t}`:`#${t}`)(e,e.description),Ue=Object.defineProperty,He=Object.assign,We=Array.from,qe=Array.isArray,ze=ArrayBuffer.isView,Ge=(e,t)=>[e,t],Je=e=>e,Ke={},Ye=e=>(t,n=new Map)=>{for(let r=0,s=t.length;r<s;r++)t[r]=e(t[r],n);return t},Ve=([e,t])=>0===e?t:Ne(t),Xe=e=>"string"==typeof e?Ge(0,e):Ge(16,Ie(e)),Ze=(e,t)=>{for(let n=e.push,r=0,s=t.length;r<s;r+=32767)n.apply(e,t.subarray(r,r+32767))},Qe=new ArrayBuffer(8),et=new DataView(Qe),tt=new Uint8Array(Qe),nt=(e,t,n)=>(e.set(t,n),n),rt=e=>{tt[0]=e[at++],tt[1]=e[at++],tt[2]=e[at++],tt[3]=e[at++],tt[4]=e[at++],tt[5]=e[at++],tt[6]=e[at++],tt[7]=e[at++]},st=e=>(tt[0]=e[at++],tt[1]=e[at++],tt[2]=e[at++],tt[3]=e[at++],et.getUint32(0,!0)),ot=(e,t)=>{switch(e[at++]){case fe:return rt(e),et.getFloat64(0,!0);case ue:return e[at++];case Se:{const n=nt(t,at-1,{});for(let r=0,s=st(e);r<s;r++)n[ot(e,t)]=ot(e,t);return n}case ve:{const n=nt(t,at-1,[]);for(let r=0,s=st(e);r<s;r++)n.push(ot(e,t));return n}case Ce:{const n=at-1,r=ot(e,t);return nt(t,n,new globalThis[r](ot(e,t)))}case Ee:{const n=at-1,r=st(e);return nt(t,n,e.slice(at,at+=r).buffer)}case Ae:{const n=at-1,r=st(e);return nt(t,n,Me.decode(e.slice(at,at+=r)))}case ke:return nt(t,at-1,new Date(ot(e,t)));case je:{const n=nt(t,at-1,new Map);for(let r=0,s=st(e);r<s;r++)n.set(ot(e,t),ot(e,t));return n}case Re:{const n=nt(t,at-1,new Set);for(let r=0,s=st(e);r<s;r++)n.add(ot(e,t));return n}case Be:{const n=at-1,r=ot(e,t),s=ot(e,t),o=ot(e,t),a=new(globalThis[r]||Error)(s);return nt(t,n,Ue(a,"stack",{value:o}))}case $e:{const n=at-1,r=ot(e,t),s=ot(e,t),o=ot(e,t),a=ot(e,t),i=ot(e,t);return nt(t,n,new Oe(r,s,o,{colorSpace:a,pixelFormat:i}))}case xe:{const n=at-1,r=ot(e,t),s=ot(e,t);return nt(t,n,new RegExp(r,s))}case ie:return!1;case ce:return!0;case de:return NaN;case me:return 1/0;case _e:return-1/0;case ye:return 0;case he:return-0;case pe:return null;case ge:return rt(e),et.getBigInt64(0,!0);case we:return rt(e),et.getBigUint64(0,!0);case be:return Ne(ot(e,t));case Pe:return t.get(st(e));case De:{const n=at-1,r=ot(e,t),s=ot(e,t);return nt(t,n,new Blob([e.slice(at,at+=s)],{type:r}))}case Te:{const n=at-1,r=ot(e,t),s=ot(e,t),o=ot(e,t);return nt(t,n,new File([o],r,{type:o.type,lastModified:s}))}default:return}};let at=0;class it{static push(e,t){e.sync(!1),e._(t,t.length)}constructor(e,t){const n=[];this.l=0,this.o=n,this.v=new Uint8Array(e,t),this.push=n.push.bind(n)}get length(){return this.l+this.o.length}sync(e){const t=this.o,n=t.length;n&&this._(e?t:t.splice(0),n)}_(e,t){const{buffer:n,byteOffset:r}=this.v,s=this.l;this.l+=t,t+=r+s,n.byteLength<t&&n.grow(t),this.v.set(e,s)}}const{getPrototypeOf:ct}=Object,{construct:lt}=Reflect,{toStringTag:pt}=Symbol,{toString:ft}=Ke,ut=(e,t=e[pt])=>t in globalThis?t:ut(lt(ct(e.constructor),[0])),{isNaN:dt,isFinite:mt,isInteger:_t}=Number,{ownKeys:yt}=Reflect,{is:ht}=Object,gt=(e,t,n)=>{const r=n.get(e),s=!r;return s?(et.setUint32(0,t.length,!0),n.set(e,[tt[0],tt[1],tt[2],tt[3]])):t.push(Pe,r[0],r[1],r[2],r[3]),s},wt=(e,t,n)=>{et.setUint32(0,n,!0),e.push(t,tt[0],tt[1],tt[2],tt[3])},At=(e,t,n)=>{switch(typeof e){case"number":e&&mt(e)?_t(e)&&e<256&&-1<e?t.push(ue,e):(et.setFloat64(0,e,!0),t.push(fe,tt[0],tt[1],tt[2],tt[3],tt[4],tt[5],tt[6],tt[7])):dt(e)?t.push(de):e?t.push(e<0?_e:me):t.push(ht(e,0)?ye:he);break;case"object":switch(!0){case null===e:t.push(pe);break;case!gt(e,t,n):break;case qe(e):{const r=e.length;wt(t,ve,r);for(let s=0;s<r;s++)At(e[s],t,n);break}case ze(e):if(t.push(Ce),At(ut(e),t,n),e=e.buffer,!gt(e,t,n))break;case e instanceof ArrayBuffer:{const n=new Uint8Array(e);wt(t,Ee,n.length),vt(t,n);break}case e instanceof Date:t.push(ke),At(e.getTime(),t,n);break;case e instanceof Map:wt(t,je,e.size);for(const[r,s]of e)At(r,t,n),At(s,t,n);break;case e instanceof Set:wt(t,Re,e.size);for(const r of e)At(r,t,n);break;case e instanceof Error:t.push(Be),At(e.name,t,n),At(e.message,t,n),At(e.stack,t,n);break;case e instanceof Oe:t.push($e),At(e.data,t,n),At(e.width,t,n),At(e.height,t,n),At(e.colorSpace,t,n),At(e.pixelFormat,t,n);break;case e instanceof RegExp:t.push(xe),At(e.source,t,n),At(e.flags,t,n);break;case e instanceof File:t.push(Te),At(e.name,t,n),At(e.lastModified,t,n);case e instanceof Blob:{const r=e.size;t.push(De),At(e.type,t,n),At(r,t,n);const s=t.length;vt(t,new Uint8Array(r)),bt.push(e.arrayBuffer().then(e=>[s,e]));break}default:if("toJSON"in e){const r=e.toJSON();At(r===e?null:r,t,n)}else{const r=yt(e),s=r.length;wt(t,Se,s);for(let o=0;o<s;o++){const s=r[o];At(s,t,n),At(e[s],t,n)}}}break;case"string":if(gt(e,t,n)){const n=Fe.encode(e);wt(t,Ae,n.length),vt(t,n)}break;case"boolean":t.push(e?ce:ie);break;case"symbol":t.push(be),At(Ie(e),t,n);break;case"bigint":{let n=ge;9223372036854775807n<e?(et.setBigUint64(0,e,!0),n=we):et.setBigInt64(0,e,!0),t.push(n,tt[0],tt[1],tt[2],tt[3],tt[4],tt[5],tt[6],tt[7]);break}default:t.push(le)}},bt=[];let vt=Ze;const Et=({byteOffset:e=0,Array:t=it}={})=>(n,r)=>{const s=new t(r,e);vt=t.push,At(n,s,new Map);const o=s.length;return s.sync(!0),bt.length?Promise.all(bt.splice(0)).then(t=>{const n=new Uint8Array(r,e);for(const[e,r]of t)n.set(new Uint8Array(r),e);return o}):o},kt={parse:e=>(at=0,ot(e,new Map)),stringify:e=>{const t=[];return vt=Ze,At(e,t,new Map),t}},Bt=new WeakMap,jt=async(e,t,n,r,s)=>{r.files&&(t("Loading files"),await se(e,n,r.files,s),t("Loaded files")),r.fetch&&(t("Loading fetch"),await te(e,n,r.fetch,s),t("Loaded fetch")),r.js_modules&&(t("Loading JS modules"),await(({main:e,worker:t},n)=>{const r=[];if(t&&V)for(let[e,s]of R(t))e=D(e,n),r.push(G(e,s));if(e&&!V)for(let[t,s]of R(e))t=D(t,n),K(t)?J(t):r.push(G(t,s));return C(r)})(r.js_modules,s),t("Loaded JS modules"))},St=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await Bt.get(e)(t),t.map(t=>e.pyimport(t))),n.storage=async e=>{const t=new y(e);return await t.sync(),t},n.JSON=kt),e.registerJsModule(t,n)},xt=(e,t)=>{if(e.endsWith("/*")){if(/\.(zip|whl|tgz|tar(?:\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},Rt=(e,n,...r)=>{try{return e.runPython(v(n),...r)}catch(n){t.get(e).stderr(n)}},Ct=async(e,n,...r)=>{try{return await e.runPythonAsync(v(n),...r)}catch(n){t.get(e).stderr(n)}},$t=async(e,n,r)=>{const[s,...o]=n.split(".");let a,i=e.globals.get(s);for(const e of o)[a,i]=[i,i[e]];try{await i.call(a,r)}catch(n){t.get(e).stderr(n)}};var Dt=(new TextEncoder).encode("_F='github:'\n_E='user-agent'\n_D=True\n_C=False\n_B='/'\n_A=None\nfrom uio import StringIO\nimport sys\nclass Response:\n\tdef __init__(A,f):A.raw=f;A.encoding='utf-8';A._cached=_A\n\tdef close(A):\n\t\tif A.raw:A.raw.close();A.raw=_A\n\t\tA._cached=_A\n\t@property\n\tdef content(self):\n\t\tA=self\n\t\tif A._cached is _A:\n\t\t\ttry:A._cached=A.raw.read()\n\t\t\tfinally:A.raw.close();A.raw=_A\n\t\treturn A._cached\n\t@property\n\tdef text(self):return str(self.content,self.encoding)\n\tdef json(A):import ujson;return ujson.loads(A.content)\nHEADERS_TO_IGNORE=_E,\ntry:import js\nexcept Exception as err:raise OSError('This version of urequests can only be used in the browser')\nHEADERS_TO_IGNORE=_E,\ndef request(method,url,data=_A,json=_A,headers={},stream=_A,auth=_A,timeout=_A,parse_headers=_D):\n\tE=timeout;D=method;C=data;from js import XMLHttpRequest as G;A=G.new();A.withCredentials=_C\n\tif auth is not _A:import ubinascii;H,I=auth;A.open(D,url,_C,H,I)\n\telse:A.open(D,url,_C)\n\tfor(F,J)in headers.items():\n\t\tif F.lower()not in HEADERS_TO_IGNORE:A.setRequestHeader(F,J)\n\tif E:A.timeout=int(E*1000)\n\tif json is not _A:assert C is _A;import ujson;C=ujson.dumps(json);A.setRequestHeader('Content-Type','application/json')\n\tA.send(C);B=Response(StringIO(A.responseText));B.status_code=A.status;B.reason=A.statusText;B.headers=A.getAllResponseHeaders();return B\ndef get(url,**A):return request('GET',url,**A)\n_PACKAGE_INDEX=const('https://micropython.org/pi/v2')\n_CHUNK_SIZE=128\ndef _ensure_path_exists(path):\n\timport os;A=path.split(_B)\n\tif not A[0]:A.pop(0);A[0]=_B+A[0]\n\tB=''\n\tfor C in range(len(A)-1):\n\t\tB+=A[C]\n\t\ttry:os.stat(B)\n\t\texcept:os.mkdir(B)\n\t\tB+=_B\ndef _chunk(src,dest):\n\tA=memoryview(bytearray(_CHUNK_SIZE))\n\twhile _D:\n\t\tB=src.readinto(A)\n\t\tif B==0:break\n\t\tdest(A if B==_CHUNK_SIZE else A[:B])\ndef _check_exists(path,short_hash):\n\tA=short_hash;import os\n\ttry:\n\t\timport binascii as C,hashlib as D\n\t\twith open(path,'rb')as E:B=D.sha256();_chunk(E,B.update);F=str(C.hexlify(B.digest())[:len(A)],'utf-8');return F==A\n\texcept:return _C\ndef _rewrite_url(url,branch=_A):\n\tB=branch;A=url\n\tif not B:B='HEAD'\n\tif A.startswith(_F):A=A[7:].split(_B);A='https://raw.githubusercontent.com/'+A[0]+_B+A[1]+_B+B+_B+_B.join(A[2:])\n\treturn A\ndef _download_file(url,dest):\n\tB=dest;A=get(url)\n\ttry:\n\t\tif A.status_code!=200:print('Error',A.status_code,'requesting',url);return _C\n\t\tprint('Copying:',B);_ensure_path_exists(B)\n\t\twith open(B,'wb')as C:_chunk(A.raw,C.write)\n\t\treturn _D\n\tfinally:A.close()\ndef _install_json(package_json_url,index,target,version,mpy):\n\tK='File not found: {} {}';I=version;H=index;G=package_json_url;D=target;E=get(_rewrite_url(G,I))\n\ttry:\n\t\tif E.status_code!=200:print('Package not found:',G);return _C\n\t\tF=E.json()\n\tfinally:E.close()\n\tfor(A,C)in F.get('hashes',()):\n\t\tB=D+_B+A\n\t\tif _check_exists(B,C):print('Exists:',B)\n\t\telse:\n\t\t\tL='{}/file/{}/{}'.format(H,C[:2],C)\n\t\t\tif not _download_file(L,B):print(K.format(A,C));return _C\n\tfor(A,J)in F.get('urls',()):\n\t\tB=D+_B+A\n\t\tif not _download_file(_rewrite_url(J,I),B):print(K.format(A,J));return _C\n\tfor(M,N)in F.get('deps',()):\n\t\tif not _install_package(M,H,D,N,mpy):return _C\n\treturn _D\ndef _install_package(package,index,target,version,mpy):\n\tD=index;C=target;B=version;A=package\n\tif A.startswith('http://')or A.startswith('https://')or A.startswith(_F):\n\t\tif A.endswith('.py')or A.endswith('.mpy'):print('Downloading {} to {}'.format(A,C));return _download_file(_rewrite_url(A,B),C+_B+A.rsplit(_B)[-1])\n\t\telse:\n\t\t\tif not A.endswith('.json'):\n\t\t\t\tif not A.endswith(_B):A+=_B\n\t\t\t\tA+='package.json'\n\t\t\tprint('Installing {} to {}'.format(A,C))\n\telse:\n\t\tif not B:B='latest'\n\t\tprint('Installing {} ({}) from {} to {}'.format(A,B,D,C));E=sys.implementation._mpy&255 if mpy and hasattr(sys.implementation,'_mpy')else'py';A='{}/package/{}/{}/{}.json'.format(D,'py',A,B)\n\treturn _install_json(A,D,C,B,mpy)\ndef install(package,index=_A,target=_A,version=_A,mpy=_D):\n\tB=target;A=index\n\tif not B:\n\t\tfor C in sys.path:\n\t\t\tif C.endswith('/lib'):B=C;break\n\t\telse:print('Unable to find lib dir in sys.path');return\n\tif not A:A=_PACKAGE_INDEX\n\tif _install_package(package,A.rstrip(_B),B,version,mpy):print('Done')\n\telse:print('Package may be partially installed')");const Tt=async e=>(await import("./toml-V4Savzlc.js")).parse(e);async function Pt(e,t){return new Promise((n,r)=>{e.syncfs(t,e=>{e?r(e):n()})})}function Ot(e){const t=e.FS,n=e.FS.filesystems.MEMFS,r=e.PATH,s={DIR_MODE:16895,FILE_MODE:33279,mount:function(e){if(!e.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return n.mount.apply(null,arguments)},syncfs:async(e,t,n)=>{try{const r=s.getLocalSet(e),o=await s.getRemoteSet(e),a=t?o:r,i=t?r:o;await s.reconcile(e,a,i),n(null)}catch(e){n(e)}},getLocalSet:e=>{let n=Object.create(null);function s(e){return"."!==e&&".."!==e}function o(e){return t=>r.join2(e,t)}let a=t.readdir(e.mountpoint).filter(s).map(o(e.mountpoint));for(;a.length;){let e=a.pop(),r=t.stat(e);t.isDir(r.mode)&&a.push.apply(a,t.readdir(e).filter(s).map(o(e))),n[e]={timestamp:r.mtime,mode:r.mode}}return{type:"local",entries:n}},getRemoteSet:async e=>{const t=Object.create(null),n=await Mt(e.opts.fileSystemHandle);for(const[o,a]of n)"."!==o&&(t[r.join2(e.mountpoint,o)]={timestamp:"file"===a.kind?(await a.getFile()).lastModifiedDate:new Date,mode:"file"===a.kind?s.FILE_MODE:s.DIR_MODE});return{type:"remote",entries:t,handles:n}},loadLocalEntry:e=>{const r=t.lookupPath(e).node,s=t.stat(e);if(t.isDir(s.mode))return{timestamp:s.mtime,mode:s.mode};if(t.isFile(s.mode))return r.contents=n.getFileDataAsTypedArray(r),{timestamp:s.mtime,mode:s.mode,contents:r.contents};throw new Error("node type not supported")},storeLocalEntry:(e,n)=>{if(t.isDir(n.mode))t.mkdirTree(e,n.mode);else{if(!t.isFile(n.mode))throw new Error("node type not supported");t.writeFile(e,n.contents,{canOwn:!0})}t.chmod(e,n.mode),t.utime(e,n.timestamp,n.timestamp)},removeLocalEntry:e=>{var n=t.stat(e);t.isDir(n.mode)?t.rmdir(e):t.isFile(n.mode)&&t.unlink(e)},loadRemoteEntry:async e=>{if("file"===e.kind){const t=await e.getFile();return{contents:new Uint8Array(await t.arrayBuffer()),mode:s.FILE_MODE,timestamp:t.lastModifiedDate}}if("directory"===e.kind)return{mode:s.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+e.kind)},storeRemoteEntry:async(e,n,s)=>{const o=e.get(r.dirname(n)),a=t.isFile(s.mode)?await o.getFileHandle(r.basename(n),{create:!0}):await o.getDirectoryHandle(r.basename(n),{create:!0});if("file"===a.kind){const e=await a.createWritable();await e.write(s.contents),await e.close()}e.set(n,a)},removeRemoteEntry:async(e,t)=>{const n=e.get(r.dirname(t));await n.removeEntry(r.basename(t)),e.delete(t)},reconcile:async(e,n,o)=>{let a=0;const i=[];Object.keys(n.entries).forEach(function(e){const r=n.entries[e],s=o.entries[e];(!s||t.isFile(r.mode)&&r.timestamp.getTime()>s.timestamp.getTime())&&(i.push(e),a++)}),i.sort();const c=[];if(Object.keys(o.entries).forEach(function(e){n.entries[e]||(c.push(e),a++)}),c.sort().reverse(),!a)return;const l="remote"===n.type?n.handles:o.handles;for(const t of i){const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);if("local"===o.type){const e=l.get(n),r=await s.loadRemoteEntry(e);s.storeLocalEntry(t,r)}else{const e=s.loadLocalEntry(t);await s.storeRemoteEntry(l,n,e)}}for(const t of c)if("local"===o.type)s.removeLocalEntry(t);else{const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);await s.removeRemoteEntry(l,n)}}};return e.FS.filesystems.NATIVEFS_ASYNC=s,async function(e,n){if("FileSystemDirectoryHandle"!==n.constructor.name)throw new TypeError("Expected argument 'fileSystemHandle' to be a FileSystemDirectoryHandle");return function(e){t.mkdirTree?t.mkdirTree(e):Z(t,e);const{node:n}=t.lookupPath(e,{follow_mount:!1});if(t.isMountpoint(n))throw new Error(`path '${e}' is already a file system mount point`);if(!t.isDir(n.mode))throw new Error(`path '${e}' points to a file not a directory`);for(const t in n.contents)throw new Error(`directory '${e}' is not empty`)}(e),t.mount(t.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:n},e),await Pt(t,!0),{syncfs:async()=>await Pt(t,!1)}}}const Mt=async e=>{const t=[];await async function e(n){for await(const r of n.values())t.push(r),"directory"===r.kind&&await e(r)}(e);const n=new Map;n.set(".",e);for(const r of t){const t=(await e.resolve(r)).join("/");n.set(t,r)}return n},{parse:Ft}=JSON,Lt=(e,t)=>new URL(e,t).href,Nt=(e,t,n)=>{if(t in e)throw new Error(`Duplicated path: ${t}`);e[t]=n},It=(e,t,n)=>{for(const r in t)Nt(e,Lt(r,n),t[r])},Ut=(e,t,n,r)=>{const s=t[n];s&&(e[n]??={},It(e[n],s,r))},Ht=async([e,t],n=e.packages,r=new Set)=>{const s=[];for(const o of n){if(r.has(o))continue;r.add(o);const n=o.endsWith(".toml");if(n||o.endsWith(".json")){const{href:a}=new URL(o,t),i=await c(a).text(),{name:l,files:p,js_modules:f,packages:u}=n?await Tt(i):Ft(i);if(r.has(l))throw new Error(`Unable to process ${l} @ ${o}`);r.add(l),u&&s.push(...await Ht([e,a],u,r)),f&&(e.js_modules??={},Ut(e.js_modules,f,"main",o),Ut(e.js_modules,f,"worker",o)),p&&(e.files??={},It(e.files,p,o))}else s.push(o)}return s},Wt=(e,t)=>{try{e.mkdir(t)}catch(e){}},qt=oe("mpy");var zt={type:"micropython",module:(e="1.28.0-6")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,r,o){const{stderr:a,stdout:i,get:c}=n({stderr:s(console.error),stdout:s(console.log)}),l=[];t.debug&&l.push("settrace"),t.packages?.includes("ulab")&&(t.packages.splice(t.packages.indexOf("ulab"),1),l.push("ulab")),r=r.replace(/\.m?js$/,".wasm");for(const e of l)r=r.replace(/\.wasm$/,`-${e}.wasm`);qt("Loading MicroPython");const p=await c(e({linebuffer:!1,stderr:a,stdout:i,url:r}));globalThis[I].set("-T-",this.transform.bind(this,p));const f=Gt.bind(this,p,o);return Bt.set(p,f),t.packages&&(qt("Loading remote packages"),t.packages=await Ht([t,o]),qt("Loaded remote packages")),await jt(this,qt,p,t,o),this.writeFile(p,"./mip.py",Dt),t.packages&&(qt("Loading packages"),await f(t.packages.map(T,o)),qt("Loaded packages")),qt("Loaded MicroPython"),p.mountNativeFS||(p.mountNativeFS=Ot(p._module)),p},registerJSModule:St,run:Rt,runAsync:Ct,runEvent:$t,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=xt(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-CoY8ac0B.js").then(async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)Wt(s,i);else{Wt(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()})}case"tgz":case"tar.gz":{const t="./_.tar.gz";return X(i,t,n),void e.runPython(`\n import os, gzip, tarfile\n tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\n for f in tar:\n name = f"${r}{f.name}"\n if f.type == tarfile.DIRTYPE:\n if f.name != "./":\n os.mkdir(name.strip("/"))\n else:\n dir = os.path.dirname(name)\n if not os.path.exists(dir):\n os.mkdir(dir)\n source = tar.extractfile(f)\n with open(name, "wb") as dest:\n dest.write(source.read())\n dest.close()\n tar.close()\n os.remove("${t}")\n `)}}}return X(i,t,n)}};async function Gt(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=D(s,t),r=await c(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const Jt={dict_converter:Object.fromEntries},{stringify:Kt}=JSON,{apply:Yt}=Reflect,Vt=Function.prototype,Xt=e=>function(...t){return Yt(e,this,t)};let Zt,Qt;const en=e=>{const t=new WeakMap,n=n=>{for(let r,s=0;s<n.length;s++)switch(typeof(r=n[s])){case"object":if(null===r)break;case"function":if(Zt in r&&!r[Zt].shared?.gcRegistered){e=!1;let o=t.get(r)?.deref();if(!o){o=Qt(r);const e=new WeakRef(o);t.set(r,e),t.set(o,e)}n[s]=o,e=!0}}};Object.defineProperties(Vt,{apply:{value(t,r){return e&&n(r),Yt(this,t,r)}},call:{value(t,...r){return e&&n(r),Yt(this,t,r)}}})},tn=oe("py"),nn=new WeakMap;var rn={type:"pyodide",module:(e="0.29.3")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e,version:t},r,s,o){tn("Loading Pyodide");let{packages:a,index_urls:i}=r;if(a){if(a=a.map(T,o),!i){tn("Loading Packages Graph");const{default:e}=await import("./pyodide_graph-BvONa7d5.js");if(t in e){const n=e[t];for(const e of a){if(/^(?:\.|\/|https?:\/\/)/.test(e))continue;const r=e.split(/[>=<]=/)[0];r.toLowerCase()in n||console.warn(`Pyodide ${t} might not support ${e}. See: https://packages.pyscript.net/?q=${r}`)}}tn("Loaded Packages Graph")}tn("Loading remote packages"),r.packages=a=await Ht([r,o],a),tn("Loaded remote packages")}tn("Loading Storage");const c=s.slice(0,s.lastIndexOf("/")),l=new y(`${c}@${t}`),p={indexURL:c},f="never"!==r.packages_cache&&"0.28.0"!==t;if(await l.sync(),tn("Loaded Storage"),f||l.clear(),a&&f)if("passthrough"===r.packages_cache)p.packages=a,a=null,l.clear();else{a=a.sort();const e=Kt(a);if(l.has(e)){const n=l.get(e);if(p.packages=a.map(e=>e.split(/[>=<]=/)[0]),t.startsWith("0.27")){const e=new Blob([n],{type:"application/json"});p.lockFileURL=URL.createObjectURL(e)}else p.lockFileContents=n;a=null}}const{stderr:u,stdout:d,get:m}=n();tn("Loading interpreter");const _=await m(e({stderr:u,stdout:d,...p}));tn("Loaded interpreter"),globalThis[I].set("-T-",this.transform.bind(this,_)),r.debug&&_.setDebug(!0);const h=on.bind(_);return i&&nn.set(_,i),Bt.set(_,h),await jt(this,tn,_,r,o),a&&await h(a,l,f),await l.close(),p.lockFileURL&&URL.revokeObjectURL(p.lockFileURL),tn("Loaded Pyodide"),"auto"===r.experimental_create_proxy&&(_.runPython(["import js","from pyodide.ffi import to_js","o=js.Object.fromEntries","js.experimental_create_proxy=lambda r:to_js(r,dict_converter=o)"].join(";"),{globals:_.toPy({})}),Qt=globalThis.experimental_create_proxy,delete globalThis.experimental_create_proxy,[Zt]=Reflect.ownKeys(Qt).filter(e=>"symbol"==typeof e&&"Symbol(pyproxy.attrs)"===String(e)),en(!0)),_},registerJSModule:St,run:Xt(Rt),runAsync:Xt(Ct),runEvent:Xt($t),transform:(e,t)=>Yt(sn,e,[t]),writeFile:(e,t,n,r)=>{const s=xt(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return X({FS:o,PATH:a,PATH_FS:i},t,n)}};function sn(e){const{ffi:{PyProxy:t}}=this;if(e&&"object"==typeof e){if(e instanceof t)return e.toJs(Jt);if(e instanceof Map)return new Map([...e.entries()]);if(k(e))return e.map(sn,this)}return e}async function on(e,t,n=!1){const{log:r}=console,s=(e,...t)=>{r(e,...t),console.log=r,tn(e),console.log=s};console.log=s,await this.loadPackage("micropip");const o=this.pyimport("micropip");if(nn.has(this)&&o.set_index_urls(nn.get(this)),await o.install(e,{keep_going:!0}),console.log=r,n&&t instanceof y){const n=o.freeze();t.set(Kt(e),n)}o.destroy()}const an=new Map,cn=new Map,ln=[],pn=[],fn=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=an.get(n),o=/^(?:\.?\.?\/|[a-z0-9-]+:\/\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then(r=>(cn.set(t,e),s(r,e,n,o)))}}),un=e=>{for(const t of[].concat(e.type))an.set(t,e),ln.push(`script[type="${t}"]`),pn.push(`${t}-`)};for(const e of[zt,rn])un(e);const dn=(e,t=document)=>[...t.querySelectorAll(e)],mn=(e,t=document)=>{const n=(new XPathEvaluator).createExpression(e).evaluate(t,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE),r=[];for(let e=0,{snapshotLength:t}=n;e<t;e++)r.push(n.snapshotItem(e));return r},_n=Promise.withResolvers||function(){var e,t,n=new this((n,r)=>{e=n,t=r});return{resolve:e,reject:t,promise:n}};var yn=_n.bind(Promise);const hn=new Proxy(new Map,{get:(e,t)=>(e.has(t)||e.set(t,yn()),e.get(t))}),gn=new Set(["__dict__","constructor","get","has","includes","next","set","then"]),wn=new Proxy(Object.freeze({}),{get:(e,t)=>"string"!=typeof t||gn.has(t)?void 0:hn[t].promise.then(e=>e.sync)});let An=0;const bn=An++,vn=An++,En=An++,kn=An++,Bn=An++,jn=An++,Sn=An++,xn=An++,Rn=An++,Cn=An++,$n=An++,Dn=An++,Tn=An++,Pn=An++,On=An++;An++;const Mn=An++,Fn=An++,Ln=(e,t)=>[t?e:We(new Uint8Array(e)),e.resizable?e.maxByteLength:0],Nn=/\[('|")?(.+?)\1\]/g,In=(e,t)=>e?.[t];var Un=(e,t)=>t.replace(Nn,".$2").split(".").reduce(In,e),Hn=(e,...t)=>t.map(Wn,e);function Wn(e){return"string"==typeof e?Un(this,e):this[e]}var qn=e=>{const t=new Int32Array(1);return e&&(t[0]=e),()=>t[0]++};const zn=globalThis.Node||class{},{apply:Gn,construct:Jn,defineProperty:Kn,deleteProperty:Yn,get:Vn,getOwnPropertyDescriptor:Xn,getPrototypeOf:Zn,has:Qn,isExtensible:er,ownKeys:tr,set:nr,setPrototypeOf:rr}=Reflect;var sr=({reflect:e=Je,transform:t=Je,remote:n=Je,module:r=e=>import(e),buffer:s=!1,timeout:o=-1}=Ke)=>{const a=(t,r=new Map)=>{if(!qe(t))return t;const[s,o]=t;switch(s){case 2:{if(null===o)return globalThis;let e=r.get(t);if(!e){e=o,r.set(t,o);for(const e in o)o[e]=a(o[e],r)}return e}case 4:return r.get(t)||(r.set(t,o),c(o,r));case 8:{let t=h.get(o),r=t?.deref();return r||(t&&w.unregister(t),r=function(...t){n.apply(this,t);for(let e=0,n=t.length;e<n;e++)t[e]=i(t[e]);return e(jn,o,i(this),t).then(a)},t=new WeakRef(r),h.set(o,t),w.register(r,o,t)),r}case 16:return Ne(o);default:return 1&s?d(o):o}},i=e=>{switch(typeof e){case"object":{if(null===e)break;if(e===globalThis)return g;const n=t(e);return b&&A.has(n)||n instanceof Oe?Ge(0,n):ze(n)?Ge(68,((e,t)=>{const{BYTES_PER_ELEMENT:n,byteOffset:r,buffer:s,length:o}=e;return[ut(e),Ln(s,t),r,o!==(s.byteLength-r)/n?o:0]})(n,s)):n instanceof ArrayBuffer?Ge(64,Ln(n,s)):Ge(qe(n)?5:3,u(n))}case"function":return Ge(9,u(t(e)));case"symbol":return Ge(16,Ie(e));case"bigint":return Ge(32,e.toString())}return e},c=Ye(a),l=Ye(Ve),p=Ye(Xe),{clear:f,id:u,ref:d,unref:m}=((e=0,t=new Map,n=new Map)=>{const r=qn(e);return{clear:()=>{t.clear(),n.clear()},id:e=>{let s=n.get(e);if(void 0===s){for(;t.has(s=r()););t.set(s,e),n.set(e,s)}return s},ref:e=>t.get(e),unref:e=>(n.delete(t.get(e)),t.delete(e))}})(),_=/^(?:[0-9]+|length)$/,y=-1<o,h=new Map,g=Ge(2,null),w=new FinalizationRegistry(t=>{h.delete(t),e(bn,t)});let A,b=!1;return{assign:He,gather:Hn,query:Un,direct:e=>(b||(b=!0,A=new WeakSet),A.add(e),e),evaluate:(e,...t)=>Gn(e,null,t),reflect(e,t,...n){const s=null===t,o=s?globalThis:d(t);switch(e){case Cn:{const e=Ve(n[0]),t=s&&"import"===e,a=t?r:Vn(o,e),c=i(a);if(!y)return c;let l,p=t,f=o;if(!t&&!(f instanceof zn||qe(f)&&"string"==typeof e&&_.test(e)))if(e in o){for(;!(l=Xn(f,e))&&(f=Zn(f),f););p=!!l&&"value"in l}else p=!0;return[p,c]}case jn:{const e=new Map;return i(Gn(o,a(n[0],e),c(n[1],e)))}case Mn:return nr(o,Ve(n[0]),a(n[1]));case Tn:return Qn(o,Ve(n[0]));case On:return p(tr(o),h);case Sn:return i(Jn(o,c(n[0])));case $n:{const e=Xn(o,Ve(n[0]));if(e)for(const t in e)e[t]=i(e[t]);return e}case xn:return Kn(o,Ve(n[0]),a(n[1]));case Rn:return Yn(o,Ve(n[0]));case Dn:return i(Zn(o));case Fn:return rr(o,a(n[0]));case vn:return void He(o,a(n[0]));case En:{const e=a(n[0]),t=Function(`return(${e}).apply(null,arguments)`);return i(Gn(t,null,c(n[1])))}case kn:for(let e,t=0,r=(n=l(n[0],h)).length;t<r;t++)e=n[t],n[t]=i("string"==typeof e?Un(o,e):o[e]);return n;case Bn:return i(Un(o,n[0]));case bn:return m(t);case Pn:return er(o)}},terminate(){for(const e of h.values())w.unregister(e);h.clear(),f()}}};const{addEventListener:or}=EventTarget.prototype,ar=new WeakMap;Reflect.defineProperty(EventTarget.prototype,"addEventListener",{value(e,t,n){const r=n?.invoke;if(r){let t=ar.get(this);t||ar.set(this,t=new Map),t.set(e,[].concat(r)),delete n.invoke}return or.apply(this,arguments)}});const ir="59317780",cr="="+ir,lr="-"+ir;var pr=(e=e=>e)=>{const t=new Map,n=qn();return[()=>{let r;do{r=e(n())}while(t.has(r));const s=yn();return t.set(r,s),[r,s.promise]},(e,n,r)=>{const s=t.get(e);t.delete(e),r?s?.reject(r):s?.resolve(n)}]};const fr=[],ur=new WeakSet,dr=(...e)=>(ur.add(e),e);let{SharedArrayBuffer:mr}=globalThis,_r=!0;try{new mr(4,{maxByteLength:8})}catch(e){_r=!1,mr=class extends ArrayBuffer{get growable(){return super.resizable}grow(e){super.resize(e)}}}const{assign:yr,create:hr}=Object,gr=`coincident-${_r?crypto.randomUUID():Math.random().toString(36).substring(2)}`,wr={byteOffset:2*Int32Array.BYTES_PER_ELEMENT},Ar=(e,t,n)=>{const r="then"!==t;return r&&(e[t]=n),r},br=e=>{e.stopImmediatePropagation(),e.preventDefault()},vr=(e,t=-1)=>e?.reflected_ffi_timeout??t,{defineProperty:Er}=Object,[kr,Br]=pr();let[jr,Sr]=kr(),xr=()=>Sr,{Atomics:Rr,MessageChannel:Cr,Worker:$r}=globalThis;if(_r)Br(jr);else{const e=new Map,t=(e,...t)=>{e.addEventListener(...t)};if("importScripts"in globalThis){t(globalThis,"message",e=>{br(e),Br(jr,e.data)},{once:!0});const{wait:n}=Rr,{parse:r}=JSON,s=t=>{const n=new XMLHttpRequest;try{if(n.timeout=3e3,n.open("POST",`${i}?sabayon`,!1),n.setRequestHeader("Content-Type","application/json"),n.send(`["${a}",${e.get(t)}]`),200===n.status)return n;throw n}catch{return n.abort(),s(t)}},o=(e,t)=>(e.set(r(t.responseText)),"ok");let a,i;Rr={wait:(t,...r)=>e.has(t)?o(t,s(t)):n(t,...r)},Sr=Sr.then(e=>{[a,i]=e})}else{const n=[gr,Math.random()].join("-").replace(/\W/g,"-"),r=new BroadcastChannel("dc78209b-186c-4f83-80e9-406becb7d9f3");r.onmessage=async t=>{const[s,o,a]=t.data;if(o===n)for(const[t,[n,o]]of e)if(n===a){await o.promise;let e=t.length;for(;e--&&!t[e];);r.postMessage([s,t.slice(0,e+1)]);break}};const s=t=>{const[n,r,s]=t.data;e.set(r,[n,yn()]),Er(t,"data",{value:s})};Cr=class extends Cr{constructor(){super(),t(this.port1,"message",s)}},$r=class extends $r{constructor(e,t){super(e,t),super.postMessage([n,a])}};const{notify:o}=Rr;Rr={notify(t,...n){const r=e.get(t);return r?(r[1].resolve(),0):o(t,...n)}};let a="",i=null;const c=(e,n)=>{let r,s=!0;e.getRegistration(a).then(t=>t??e.register(a,n)).then(function n(o){const{controller:i}=e;if(s=s&&!!i,r=o.installing||o.waiting||o.active,"activated"===r.state){if(s){if(i.scriptURL===a)return Br(jr);o.unregister()}location.reload()}else t(r,"statechange",()=>n(o),{once:!0})})};xr=(e,t)=>{if(!i){const n=new URL(e,location.href);a=`${n.protocol}//${n.host}${n.pathname}`,c(navigator.serviceWorker,t),i=Sr}return i}}}const Dr="InstallTrigger"in globalThis?gr:"",Tr=e=>e,Pr=e=>e===cr?"main":e===lr?"worker":e;class Or extends Event{#a;constructor(e){super("message"),this.#a=e}get data(){return this.#a}}var Mr=e=>{const t=e?.transform,n=vr(e),r=(e?.encoder||Et)(wr),s=!1!==e?.transfer;return{Worker:class extends $r{constructor(e,o){const a=_r?"":o?.serviceWorker||"",{notify:i}=a?Rr:Atomics,{port1:c,port2:l}=new(a?Cr:MessageChannel),[p,f]=pr(Tr),u=new Map,d=hr(null);a&&xr(a);let m="";super(e,yr({type:"module"},o)),this.proxy=new Proxy(d,{get:(e,n)=>{if("then"===n)return;let r=u.get(n);return r||u.set(n,r=(...e)=>{const r=((e,t)=>{let n=fr;return e&&qe(t.at(-1))&&ur.has(t.at(-1))&&(n=t.pop(),ur.delete(n)),n})(s,e),[o,a]=p();return c.postMessage([o,n,t?e.map(t):e],r),((e,t)=>{if(m){const n=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${Pr(m)}() awaiting proxy.${Pr(t)}() ?`);e=e.then(e=>(clearTimeout(n),e),e=>(clearTimeout(n),Promise.reject(e)))}return e})(a,n)}),r},set:Ar}),Dr&&(_r||a)&&super.addEventListener("message",e=>{const{data:t}=e;t?.ID===Dr&&(br(e),c.dispatchEvent(new Or(t.data)))}),super.postMessage([Dr,a,vr(o,n)],[l]),c.addEventListener("message",async({data:e})=>{const n=e[0],s=typeof n;if("number"===s)f.apply(null,e);else if(m=e[1],await(async(e,t,n)=>{try{const r=await t[e[1]].apply(null,e[2]);e[1]=n?n(r):r,e[2]=null}catch(t){e[2]=t}})(e,d,t),m="","string"===s)c.postMessage(e);else{const t=e[2]||e[1],s=void 0===t?0:r(t,n.buffer);n[1]="number"==typeof s?s:await s,n[0]=1,i(n,0)}}),c.start()}},native:_r,transfer:dr}};const{url:Fr}=import.meta,Lr=/import\((['"])([^)]+?\.js)\1\)/g,Nr=(e,t,n)=>`import(${t}${new URL(n,Fr).href}${t})`,Ir=Symbol.for("polyscript.js_modules");let Ur;const{Worker:Hr}=(e=>{const t=e?.import,n=vr(e),r=Mr({...e,encoder:e?.encoder||Et});class s extends r.Worker{#i;constructor(e,r){const{proxy:s}=super(e,r),o=sr({...r,buffer:!0,reflect:s[lr],timeout:vr(r,n),remote(e){e instanceof Event&&(e=>{const{currentTarget:t,target:n,type:r}=e,s=ar.get(t||n)?.get(r);if(s)for(const t of s)e[t]()})(e)},module:r?.import||t||(e=>import(new URL(e,location).href))});this.#i=o.terminate,this.ffi={assign:o.assign,direct:o.direct,evaluate:o.evaluate,gather:o.gather,query:o.query},s[cr]=o.reflect}terminate(){this.#i(),super.terminate()}}return{...r,Worker:s}})({transfer:!1,transform:e=>(Ur||(Ur=globalThis[Ir]?.get("-T-")))?.(e)??e});const{parse:Wr}=JSON,qr=(e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[D(e),n]},zr=(e,t,n={})=>{const[r,s]=qr(e,t);if("json"===s)n=c(r).json();else if("toml"===s){const{parser:e}=n;n=c(r).text().then(async t=>{const n=e?await import(e):{parse:Tt};return(n.parse||n.default)(t)})}else"string"===s?n=Gr(e):"object"===s&&e?n=e:"txt"===s&&"string"==typeof n&&(n=Gr(n));return[n,e=r]},Gr=e=>{try{return Wr(e)}catch(t){return Tt(e)}},Jr=(e,t,n,r={})=>(t&&([r,t]=zr(t,n,r)),$(r).then(n=>fn[e](n,t))),Kr=(e,t="")=>`${e}@${t}`.replace(/@$/,"");function Yr(e=this){return String(e).replace(/^(async\s*)?(\bfunction\b)?(.*?)\(/,(e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e)}const Vr="BeforeRun",Xr="AfterRun",Zr=[`code${Vr}`,`code${Vr}Async`,`code${Xr}`,`code${Xr}Async`],Qr=["onWorker","onReady",`on${Vr}`,`on${Vr}Async`,`on${Xr}`,`on${Xr}Async`];function es(e,t){const{run:n,runAsync:r}=an.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const ts=(e,t,n,r,s,o)=>{if(s||o){const a=es.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let ns=class{constructor(e,t={}){const{main:n,worker:r}=t;this.interpreter=e,this.onWorker=n?.onWorker;for(const e of Qr.slice(1))this[e]=r?.[e];for(const e of Zr)this[e]=r?.[e]}toJSON(){const e={};for(const t of Qr.slice(1))this[t]&&(e[t]=Yr(this[t]));for(const t of Zr)this[t]&&(e[t]=v(this[t]()));return e}};var rs=(...e)=>function(t,n){if(e.length){const[t,r]=e;(n=B({},n||{type:t,version:r})).type||(n.type=t)}const[r]=qr(n.config,n.configURL),s=((...e)=>new Hr(URL.createObjectURL(new Blob(["/*@*/"+'const{assign:e}=Object,t="entries",n="readonly",r="readwrite",s={durability:"default",prefix:"IDBMap"},o=({target:{result:e}})=>e;class a extends EventTarget{#e;#t;#n;async#r(n,r){const s=(await this.#e).transaction(t,r,this.#t);return new Promise((r,o)=>e(n(s.objectStore(t)),{onsuccess:r,onerror:o}))}constructor(n,{durability:r=s.durability,prefix:a=s.prefix}=s){super(),this.#n=a,this.#t={durability:r},this.#e=new Promise((r,s)=>{e(indexedDB.open(`${this.#n}/${n}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(t),n.oncomplete=()=>r(e)},onsuccess(e){r(o(e))},onerror(e){s(e),this.dispatchEvent(e)}})}).then(e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e})}dispatchEvent(t){const{type:n,message:r,isTrusted:s}=t;return super.dispatchEvent(s?e(new Event(n),{message:r}):t)}async close(){(await this.#e).close()}get size(){return this.#r(e=>e.count(),n).then(o)}async clear(){await this.#r(e=>e.clear(),r)}async delete(e){await this.#r(t=>t.delete(e),r)}async entries(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e).then(t=>[e,t])))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r(t=>t.get(e),n).then(o)}async has(e){return void 0!==await this.#r(t=>t.getKey(e),n).then(o)}async keys(){return await this.#r(e=>e.getAllKeys(),n).then(o)}async set(e,t){return await this.#r(n=>n.put(t,e),r),this}async values(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e)))}get[Symbol.toStringTag](){return this.#n}}class i extends Map{#s;#o;constructor(...e){super(),this.#s=new a(...e),this.#o=this.#s.entries().then(e=>{for(const[t,n]of e)super.set(t,n)})}async close(){await this.#o,await this.#s.close()}async sync(){await this.#o}clear(){return this.#o=this.#o.then(()=>this.#s.clear()),super.clear()}delete(e){return this.#o=this.#o.then(()=>this.#s.delete(e)),super.delete(e)}set(e,t){return this.#o=this.#o.then(()=>this.#s.set(e,t)),super.set(e,t)}}const c="59317780",l="="+c,u="-"+c;let p=0;const f=p++,d=p++,h=p++,y=p++,m=p++,g=p++,w=p++,_=p++,b=p++,A=p++,k=p++,E=p++,v=p++,S=p++,x=p++,$=p++,B=p++,j=p++,P=p++,M=p++,D=p++,F=p++,T=p++,R=p++,L=p++,O=p++,C=p++,I=p++;const U=globalThis.ImageData||class{},H=new TextDecoder,W=new TextEncoder,N=new Map(Reflect.ownKeys(Symbol).map(e=>[Symbol[e],`@${String(e)}`])),q=e=>{switch(e[0]){case"@":return Symbol[e.slice(1)];case"#":return Symbol.for(e.slice(1));case"!":return Symbol(e.slice(1));default:return Symbol()}},z=e=>N.get(e)||((e,t)=>void 0===t?"?":void 0===Symbol.keyFor(e)?`!${t}`:`#${t}`)(e,e.description),J=Object.defineProperty,K=Object.assign,G=Array.isArray,V=ArrayBuffer.isView,X=(e,t)=>[e,t],Y=e=>e,Z=[],Q={},ee=function(){},te=e=>(t,n=new Map)=>{for(let r=0,s=t.length;r<s;r++)t[r]=e(t[r],n);return t},ne=([e,t])=>0===e?t:q(t),re=e=>"string"==typeof e?X(0,e):X(16,z(e)),se=(e,t)=>{for(let n=e.push,r=0,s=t.length;r<s;r+=32767)n.apply(e,t.subarray(r,r+32767))},oe=new ArrayBuffer(8),ae=new DataView(oe),ie=new Uint8Array(oe),ce=(e,t,n)=>(e.set(t,n),n),le=e=>{ie[0]=e[fe++],ie[1]=e[fe++],ie[2]=e[fe++],ie[3]=e[fe++],ie[4]=e[fe++],ie[5]=e[fe++],ie[6]=e[fe++],ie[7]=e[fe++]},ue=e=>(ie[0]=e[fe++],ie[1]=e[fe++],ie[2]=e[fe++],ie[3]=e[fe++],ae.getUint32(0,!0)),pe=(e,t)=>{switch(e[fe++]){case m:return le(e),ae.getFloat64(0,!0);case g:return e[fe++];case D:{const n=ce(t,fe-1,{});for(let r=0,s=ue(e);r<s;r++)n[pe(e,t)]=pe(e,t);return n}case $:{const n=ce(t,fe-1,[]);for(let r=0,s=ue(e);r<s;r++)n.push(pe(e,t));return n}case R:{const n=fe-1,r=pe(e,t);return ce(t,n,new globalThis[r](pe(e,t)))}case B:{const n=fe-1,r=ue(e);return ce(t,n,e.slice(fe,fe+=r).buffer)}case S:{const n=fe-1,r=ue(e);return ce(t,n,H.decode(e.slice(fe,fe+=r)))}case j:return ce(t,fe-1,new Date(pe(e,t)));case M:{const n=ce(t,fe-1,new Map);for(let r=0,s=ue(e);r<s;r++)n.set(pe(e,t),pe(e,t));return n}case T:{const n=ce(t,fe-1,new Set);for(let r=0,s=ue(e);r<s;r++)n.add(pe(e,t));return n}case P:{const n=fe-1,r=pe(e,t),s=pe(e,t),o=pe(e,t),a=new(globalThis[r]||Error)(s);return ce(t,n,J(a,"stack",{value:o}))}case L:{const n=fe-1,r=pe(e,t),s=pe(e,t),o=pe(e,t),a=pe(e,t),i=pe(e,t);return ce(t,n,new U(r,s,o,{colorSpace:a,pixelFormat:i}))}case F:{const n=fe-1,r=pe(e,t),s=pe(e,t);return ce(t,n,new RegExp(r,s))}case f:return!1;case d:return!0;case w:return NaN;case _:return 1/0;case b:return-1/0;case A:return 0;case k:return-0;case y:return null;case E:return le(e),ae.getBigInt64(0,!0);case v:return le(e),ae.getBigUint64(0,!0);case x:return q(pe(e,t));case I:return t.get(ue(e));case O:{const n=fe-1,r=pe(e,t),s=pe(e,t);return ce(t,n,new Blob([e.slice(fe,fe+=s)],{type:r}))}case C:{const n=fe-1,r=pe(e,t),s=pe(e,t),o=pe(e,t);return ce(t,n,new File([o],r,{type:o.type,lastModified:s}))}default:return}};let fe=0;const de=e=>(fe=0,pe(e,new Map)),he=({byteOffset:e=0}={})=>(t,n)=>de(new Uint8Array(n,e,t));let ye=0;const me=ye++,ge=ye++,we=ye++,_e=ye++,be=ye++,Ae=ye++,ke=ye++,Ee=ye++,ve=ye++,Se=ye++,xe=ye++,$e=ye++,Be=ye++,je=ye++,Pe=ye++;ye++;const Me=ye++,De=ye++,{getPrototypeOf:Fe}=Object,{construct:Te}=Reflect,{toStringTag:Re}=Symbol,{toString:Le}=Q,Oe=(e,t=Le.call(e).slice(8,-1))=>t in globalThis?t:Oe(Fe(e)||Q),Ce=(e,t=e[Re])=>t in globalThis?t:Ce(Te(Fe(e.constructor),[0])),Ie=(e,t)=>new ArrayBuffer(e,{maxByteLength:t}),Ue=([e,t],n)=>{const r=n?e.byteLength:e.length;if(n){if(t){const n=Ie(r,t);new Uint8Array(n).set(new Uint8Array(e)),e=n}}else{const n=t?Ie(r,t):new ArrayBuffer(r);new Uint8Array(n).set(e),e=n}return e};const He=/\\[(\'|")?(.+?)\\1\\]/g,We=(e,t)=>e?.[t];var Ne=e=>{const t=new Int32Array(1);return e&&(t[0]=e),()=>t[0]++},qe=e=>{const t=[],n=e=>{const n=t.splice(e);for(;e<n.length;)n[e++].delete(n[e++])};return class r extends Map{static keys=Symbol();static proto=Symbol();drop(e,t){return e!==r.proto&&super.delete(r.keys),super.delete(e),t}set(r,s){return((r,s)=>{t.push(r,s)<3&&setTimeout(n,e,0)})(super.set(r,s),r),s}}},ze=({reflect:e=Y,transform:t=Y,released:n=Y,buffer:r=!1,timeout:s=-1}=Q)=>{const o=te(ne),a=te(re),i=e=>{if(!G(e))return e;const[t,n]=e;if(1&t)return u(t,n);switch(t){case 2:return x;case 0:return n;case 16:return q(n);case 32:return BigInt(n);case 68:return(([e,t,n,r],s)=>{const o=Ue(t,s),a=globalThis[e];return r?new a(o,n,r):new a(o,n)})(n,r);case 64:return Ue(n,r)}},c=(e,n=new Map)=>{switch(typeof e){case"object":{if(null===e)break;if(e===globalThis)return S;if(v in e)return g;let r=n.get(e);if(!r){const s=t(e);if(w||!m.has(s)){if(G(s)){const t=[];r=X(4,t),n.set(e,r);for(let e=0,r=s.length;e<r;e++)t[e]=c(s[e],n);return r}if(!(V(s)||s instanceof ArrayBuffer||"Object"!==Oe(s))){const t={};r=X(2,t),n.set(e,r);for(const e in s)t[e]=c(s[e],n);return r}}r=X(0,s),n.set(e,r)}return r}case"function":{if(v in e)return g;let r=n.get(e);if(!r){const s=t(e);r=X(8,b(s)),n.set(e,r)}return r}case"symbol":return X(16,z(e))}return e},l=te(c),u=(e,t)=>{let n=E.get(t),r=n?.deref();return r||(n&&$.unregister(n),r=9===e?new Proxy(ee,new y(e,t)):new Proxy(3===e?Q:Z,new h(e,t)),n=new WeakRef(r),E.set(t,n),$.register(r,t,n)),r},p=e=>{switch(typeof e){case"object":if(null===e)break;case"function":return v in e}return!1},f=-1<s,d=f?qe(s):Map;class h{constructor(e,t){this.t=e,this.v=t,f&&(this.$=new d)}get(t,n){if(f&&this.$.has(n))return this.$.get(n);const r=e(Se,this.v,re(n));return f?r[0]?this.$.set(n,i(r[1])):i(r[1]):i(r)}set(t,n,r){const s=e(Me,this.v,re(n),c(r));return f?this.$.drop(n,s):s}has(t,n){return n===v?(g=[this.t,this.v],!0):e(Be,this.v,re(n))}_oK(){return o(e(Pe,this.v),E)}ownKeys(e){return f?this.$.has(d.keys)?this.$.get(d.keys):this.$.set(d.keys,this._oK()):this._oK()}getOwnPropertyDescriptor(t,n){const r=i(e(xe,this.v,re(n)));if(r)for(const e in r)r[e]=i(r[e]);return r}defineProperty(t,n,r){const s=e(Ee,this.v,re(n),c(r));return f?this.$.drop(n,s):s}deleteProperty(t,n){const r=e(ve,this.v,re(n));return f?this.$.drop(n,r):r}_gPO(){return i(e($e,this.v))}getPrototypeOf(e){return f?this.$.has(d.proto)?this.$.get(d.proto):this.$.set(d.proto,this._gPO()):this._gPO()}setPrototypeOf(t,n){const r=e(De,this.v,c(n));return f?this.$.drop(d.proto,r):r}isExtensible(t){return e(je,this.v)}preventExtensions(e){return!1}}class y extends h{construct(t,n){return i(e(ke,this.v,l(n)))}apply(t,n,r){const s=new Map;return i(e(Ae,this.v,c(n,s),l(r,s)))}get(e,t){switch(t){case"apply":return(t,n)=>this.apply(e,t,n);case"call":return(t,...n)=>this.apply(e,t,n);default:return super.get(e,t)}}}let m,g,w=!0;const{apply:_}=Reflect,{id:b,ref:A,unref:k}=((e=0,t=new Map,n=new Map)=>{const r=Ne(e);return{clear:()=>{t.clear(),n.clear()},id:e=>{let s=n.get(e);if(void 0===s){for(;t.has(s=r()););t.set(s,e),n.set(e,s)}return s},ref:e=>t.get(e),unref:e=>(n.delete(t.get(e)),t.delete(e))}})(),E=new Map,v=Symbol("reflected-ffi"),S=X(2,null),x=new Proxy(Q,new h(2,null)),$=new FinalizationRegistry(t=>{E.delete(t),e(me,t)});return{global:x,isProxy:p,assign(t,...n){const r=p(t),s=K(r?{}:t,...n);return r&&e(ge,g[1],c(s)),t},direct:e=>(w&&(w=!1,m=new WeakSet),m.add(e),e),evaluate:(t,...n)=>i(e(we,null,function(e=this){return String(e).replace(/^(async\\s*)?(\\bfunction\\b)?(.*?)\\(/,(e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e)}(t),l(n))),gather(t,...n){const r=p(t),s=r?i:e=>t[e];r&&(n=e(_e,g[1],a(n,E)));for(let e=0;e<n.length;e++)n[e]=s(n[e]);return n},query:(t,n)=>p(t)?i(e(be,g[1],n)):((e,t)=>t.replace(He,".$2").split(".").reduce(We,e))(t,n),reflect:async(e,t,...r)=>{switch(e){case Ae:{const[e,n]=r;for(let e=0,t=n.length;e<t;e++)n[e]=i(n[e]);return c(await _(A(t),i(e),n))}case me:return n(A(t)),k(t)}}}};const Je=Promise.withResolvers||function(){var e,t,n=new this((n,r)=>{e=n,t=r});return{resolve:e,reject:t,promise:n}};var Ke=Je.bind(Promise),Ge=(e=e=>e)=>{const t=new Map,n=Ne();return[()=>{let r;do{r=e(n())}while(t.has(r));const s=Ke();return t.set(r,s),[r,s.promise]},(e,n,r)=>{const s=t.get(e);t.delete(e),r?s?.reject(r):s?.resolve(n)}]};const Ve=[],Xe=new WeakSet,Ye=(...e)=>(Xe.add(e),e);let{SharedArrayBuffer:Ze}=globalThis,Qe=!0;try{new Ze(4,{maxByteLength:8})}catch(e){Qe=!1,Ze=class extends ArrayBuffer{get growable(){return super.resizable}grow(e){super.resize(e)}}}const{create:et}=Object,tt=`coincident-${Qe?crypto.randomUUID():Math.random().toString(36).substring(2)}`,nt=2*Int32Array.BYTES_PER_ELEMENT,rt={byteOffset:nt},st=(e,t,n)=>{const r="then"!==t;return r&&(e[t]=n),r},ot=e=>{e.stopImmediatePropagation(),e.preventDefault()},[at,it]=Ge();let[ct,lt]=at(),ut=()=>lt,pt=()=>{},{Atomics:ft,MessagePort:dt,SharedArrayBuffer:ht,postMessage:yt}=globalThis;if(Qe)it(ct);else{ht=Ze;const e=new Map,t=(e,...t)=>{e.addEventListener(...t)};if("importScripts"in globalThis){pt=t=>{e.set(t,null)};const n=t=>{const n=t[0],r=p++;return e.set(n,r),[r,n,t]},r=yt;yt=function(e,t){if(u){const s={ID:e.ID,data:n(e.data)};r(s,t)}else lt.then(()=>this.postMessage(e,t))},dt=class extends dt{postMessage(e,t){u?super.postMessage(n(e),t):lt.then(()=>this.postMessage(e,t))}},t(globalThis,"message",e=>{ot(e),it(ct,e.data)},{once:!0});const{wait:s}=ft,{parse:o}=JSON,a=t=>{const n=new XMLHttpRequest;try{if(n.timeout=3e3,n.open("POST",`${l}?sabayon`,!1),n.setRequestHeader("Content-Type","application/json"),n.send(`["${c}",${e.get(t)}]`),200===n.status)return n;throw n}catch{return n.abort(),a(t)}},i=(e,t)=>(e.set(o(t.responseText)),"ok");ft={wait:(t,...n)=>e.has(t)?i(t,a(t)):s(t,...n)};let c,l,u=!1,p=Math.random();lt=lt.then(e=>{[c,l]=e,u=!0})}else{const n=[tt,Math.random()].join("-").replace(/\\W/g,"-"),r=new BroadcastChannel("dc78209b-186c-4f83-80e9-406becb7d9f3");r.onmessage=async t=>{const[s,o,a]=t.data;if(o===n)for(const[t,[n,o]]of e)if(n===a){await o.promise;let e=t.length;for(;e--&&!t[e];);r.postMessage([s,t.slice(0,e+1)]);break}};const{notify:s}=ft;ft={notify(t,...n){const r=e.get(t);return r?(r[1].resolve(),0):s(t,...n)}};let o="",a=null;const i=(e,n)=>{let r,s=!0;e.getRegistration(o).then(t=>t??e.register(o,n)).then(function n(a){const{controller:i}=e;if(s=s&&!!i,r=a.installing||a.waiting||a.active,"activated"===r.state){if(s){if(i.scriptURL===o)return it(ct);a.unregister()}location.reload()}else t(r,"statechange",()=>n(a),{once:!0})})};ut=(e,t)=>{if(!a){const n=new URL(e,location.href);o=`${n.protocol}//${n.host}${n.pathname}`,i(navigator.serviceWorker,t),a=lt}return a}}}const{setPrototypeOf:mt}=Reflect;let{postMessage:gt}=globalThis;const wt=Ke(),_t=dt.prototype;addEventListener("message",e=>{ot(e);const[t,n,r]=e.data,[s]=e.ports;n&&(mt(s,_t),t&&(gt=yt)),wt.resolve([t,n,r,s])},{once:!0});var bt=async e=>{const[t,n,r,s]=await ut().then(()=>wt.promise),o=!!t,a=Qe||!!n,i=e?.transform,c=(e?.decoder||he)(rt),l=!1!==e?.transfer;let u,p,f,d;if(a){const t=new(n?ht:SharedArrayBuffer)(e?.minByteLength||32767,{maxByteLength:e?.maxByteLength||16777216});u=new Int32Array(t),n?(({wait:d}=ft),pt(u)):(({load:p,pause:f,wait:d}=Atomics),f&&(d=(e,t)=>{do{f()}while(p(e,t)<1)}))}const[h,y]=Ge(String),m=new Map,g=et(null),w=new Proxy(g,{get(e,n){if("then"===n)return;let r=m.get(n);return r||m.set(n,r=(...e)=>{const r=((e,t)=>{let n=Ve;return e&&G(t.at(-1))&&Xe.has(t.at(-1))&&(n=t.pop(),Xe.delete(n)),n})(l,e),p=[u,n,i?e.map(i):e];if(a){o?gt({ID:t,data:p},r):s.postMessage(p,r),d(u,0),u[0]=0;const e=u[1]?c(u[1],u.buffer):void 0;if(e instanceof Error)throw e;return e}{const[e,t]=h();return p[0]=e,s.postMessage(p,r),t}}),r},set:st});return s.addEventListener("message",async({data:e})=>{"string"==typeof e[0]?y.apply(null,e):(await(async(e,t,n)=>{try{const r=await t[e[1]].apply(null,e[2]);e[1]=n?n(r):r,e[2]=null}catch(t){e[2]=t}})(e,g,i),s.postMessage(e))}),s.start(),{native:Qe,proxy:w,ffi_timeout:r,sync:a,transfer:Ye}};const At={object(...e){return this.string(function(e){for(var t=e[0],n=1,r=arguments.length;n<r;n++)t+=arguments[n]+e[n];return t}(...e))},string(e){for(const t of e.split(/[\\r\\n]+/))if(t.trim().length){/^(\\s+)/.test(t)&&(e=e.replace(new RegExp("^"+RegExp.$1,"gm"),""));break}return e}},kt=new WeakMap,Et=e=>{const t=e||console,n={buffered:St,stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>n.stderr(...e),stdout:(...e)=>n.stdout(...e),async get(e){const t=await e;return kt.set(t,n),t}}},vt=new TextDecoder,St=(e,t=10)=>{const n=[];return r=>{if(r instanceof Uint8Array)for(const s of r)s===t?e(vt.decode(new Uint8Array(n.splice(0)))):n.push(s);else e(r)}},xt=(e,...t)=>At[typeof e](e,...t),{isArray:$t}=Array,{assign:Bt,create:jt,defineProperty:Pt,entries:Mt}=Object,{all:Dt,resolve:Ft}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),Tt=(e,t=location.href)=>new URL(e,t.replace(/^blob:/,"")).href;function Rt(e){return e.startsWith(".")?Tt(e,this):e}const Lt=(e,t,n,r=!1,s=CustomEvent)=>{e.dispatchEvent(new s(`${t}:${n}`,{bubbles:!0,detail:{worker:r}}))},Ot=e=>Function(`\'use strict\';return (${e})`)(),Ct=e=>e.replace(/^(?:\\n|\\r\\n)/,""),It=Symbol.for("polyscript.js_modules"),Ut=new Map;Pt(globalThis,It,{value:Ut}),new Proxy(Ut,{get:(e,t)=>e.get(t),has:(e,t)=>e.has(t),ownKeys:e=>[...e.keys()]});const Ht=(e,t)=>!t.startsWith("_"),Wt=(e,t)=>new Proxy(e,{has:Ht,get:(e,n)=>e[t][n]}),Nt=(e,t)=>import(e).then(e=>{Ut.set(t,{...e})}),qt=e=>new Promise((t,n)=>{document.querySelector(`link[rel="stylesheet"][href="${e}"]`)?t():document.head.append(Bt(document.createElement("link"),{rel:"stylesheet",href:e,onload:t,onerror:n}))}),zt=e=>/\\.css$/i.test(new URL(e).pathname),Jt=(e,t)=>e.has(t),Kt=e=>[...e.keys()];var Gt=(e,t,n,r)=>{const s=globalThis[It];if(n)for(let[e,t]of Mt(n)){let n=s.get(t);n&&!$t(n)||(s.set(t,n||(n=[])),n.push(e))}return((e,t,n,r)=>new Proxy(e,{has:Jt,ownKeys:Kt,get:(e,s)=>{let o=e.get(s);if($t(o)){let a=o;o=null;for(let e of a)e=Tt(e,r),zt(e)?n.importCSS(e):(n.importJS(e,s),o=t[It].get(s));e.set(s,o)}return o}}))(s,e,t,r)};const Vt=Object.getOwnPropertyDescriptors(Response.prototype),Xt=e=>"function"==typeof e,Yt={get:(e,t)=>Vt.hasOwnProperty(t)?((e,t,{get:n,value:r})=>n||!Xt(r)?e.then(e=>e[t]):(...n)=>e.then(e=>e[t](...n)))(e,t,Vt[t]):((e,t)=>Xt(t)?t.bind(e):t)(e,e[t])};var Zt=(e,...t)=>new Proxy(fetch(e,...t).then(t=>t.ok?t:Promise.reject(new Error(`[${t.status}] Unable to fetch ${e}`))),Yt);const Qt=!globalThis.window,en=({FS:e,PATH:t,PATH_FS:n},r,s)=>{const o=n.resolve(r),a=t.dirname(o);return e.mkdirTree?e.mkdirTree(a):tn(e,a),e.writeFile(o,new Uint8Array(s),{canOwn:!0})},tn=(e,t)=>{const n=[];for(const r of t.split("/"))"."!==r&&".."!==r&&(n.push(r),r&&e.mkdir(n.join("/")))},nn=e=>{const t=e.map(e=>e.trim().replace(/(^[/]*|[/]*$)/g,"")).filter(e=>""!==e&&"."!==e).join("/");return e[0].startsWith("/")?`/${t}`:t},rn=(e,t)=>Zt(Tt(e,t)).arrayBuffer(),sn=(e,t,n,r)=>Dt((e=>{for(const{files:t,to_file:n,from:r=""}of e){if(void 0!==t&&void 0!==n)throw new Error("Cannot use \'to_file\' and \'files\' parameters together!");if(void 0===t&&void 0===n&&r.endsWith("/"))throw new Error(`Couldn\'t determine the filename from the path ${r}, please supply \'to_file\' parameter.`)}return e.flatMap(({from:e="",to_folder:t=".",to_file:n,files:r})=>{if($t(r))return r.map(n=>({url:nn([e,n]),path:nn([t,n])}));const s=n||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:nn([t,s])}]})})(n).map(({url:n,path:s})=>rn(n,r).then(n=>e.writeFile(t,s,n)))),on=(e,t)=>t.endsWith("/")?`${t}${e.split("/").pop()}`:t,an=(e,t)=>e.replace(/\\{.+?\\}/g,e=>{if(!t.has(e))throw new SyntaxError(`Invalid template: ${e}`);return t.get(e)}),cn=(e,t,n,r)=>Dt((e=>{const t=new Map,n=new Set,r=[];for(const[s,o]of Mt(e))if(/^\\{.+\\}$/.test(s)){if(t.has(s))throw new SyntaxError(`Duplicated template: ${s}`);t.set(s,an(o,t))}else{const e=an(s,t),a=on(e,an(o||"./",t));if(n.has(a)&&!a.endsWith("/*"))throw new SyntaxError(`Duplicated destination: ${a}`);n.add(a),r.push({url:e,path:a})}return r})(n).map(({url:n,path:s})=>rn(n,r).then(r=>e.writeFile(t,s,r,n)))),ln=e=>t=>{dispatchEvent(new CustomEvent(`${e}:progress`,{detail:t}))},{isNaN:un,isFinite:pn,isInteger:fn}=Number,{ownKeys:dn}=Reflect,{is:hn}=Object,yn=(e,t,n)=>{const r=n.get(e),s=!r;return s?(ae.setUint32(0,t.length,!0),n.set(e,[ie[0],ie[1],ie[2],ie[3]])):t.push(I,r[0],r[1],r[2],r[3]),s},mn=(e,t,n)=>{ae.setUint32(0,n,!0),e.push(t,ie[0],ie[1],ie[2],ie[3])},gn=(e,t,n)=>{switch(typeof e){case"number":e&&pn(e)?fn(e)&&e<256&&-1<e?t.push(g,e):(ae.setFloat64(0,e,!0),t.push(m,ie[0],ie[1],ie[2],ie[3],ie[4],ie[5],ie[6],ie[7])):un(e)?t.push(w):e?t.push(e<0?b:_):t.push(hn(e,0)?A:k);break;case"object":switch(!0){case null===e:t.push(y);break;case!yn(e,t,n):break;case G(e):{const r=e.length;mn(t,$,r);for(let s=0;s<r;s++)gn(e[s],t,n);break}case V(e):if(t.push(R),gn(Ce(e),t,n),e=e.buffer,!yn(e,t,n))break;case e instanceof ArrayBuffer:{const n=new Uint8Array(e);mn(t,B,n.length),_n(t,n);break}case e instanceof Date:t.push(j),gn(e.getTime(),t,n);break;case e instanceof Map:mn(t,M,e.size);for(const[r,s]of e)gn(r,t,n),gn(s,t,n);break;case e instanceof Set:mn(t,T,e.size);for(const r of e)gn(r,t,n);break;case e instanceof Error:t.push(P),gn(e.name,t,n),gn(e.message,t,n),gn(e.stack,t,n);break;case e instanceof U:t.push(L),gn(e.data,t,n),gn(e.width,t,n),gn(e.height,t,n),gn(e.colorSpace,t,n),gn(e.pixelFormat,t,n);break;case e instanceof RegExp:t.push(F),gn(e.source,t,n),gn(e.flags,t,n);break;case e instanceof File:t.push(C),gn(e.name,t,n),gn(e.lastModified,t,n);case e instanceof Blob:{const r=e.size;t.push(O),gn(e.type,t,n),gn(r,t,n);const s=t.length;_n(t,new Uint8Array(r)),wn.push(e.arrayBuffer().then(e=>[s,e]));break}default:if("toJSON"in e){const r=e.toJSON();gn(r===e?null:r,t,n)}else{const r=dn(e),s=r.length;mn(t,D,s);for(let o=0;o<s;o++){const s=r[o];gn(s,t,n),gn(e[s],t,n)}}}break;case"string":if(yn(e,t,n)){const n=W.encode(e);mn(t,S,n.length),_n(t,n)}break;case"boolean":t.push(e?d:f);break;case"symbol":t.push(x),gn(z(e),t,n);break;case"bigint":{let n=E;9223372036854775807n<e?(ae.setBigUint64(0,e,!0),n=v):ae.setBigInt64(0,e,!0),t.push(n,ie[0],ie[1],ie[2],ie[3],ie[4],ie[5],ie[6],ie[7]);break}default:t.push(h)}},wn=[];let _n=se;const bn={parse:de,stringify:e=>{const t=[];return _n=se,gn(e,t,new Map),t}},An=new WeakMap,kn=async(e,t,n,r,s)=>{r.files&&(t("Loading files"),await cn(e,n,r.files,s),t("Loaded files")),r.fetch&&(t("Loading fetch"),await sn(e,n,r.fetch,s),t("Loaded fetch")),r.js_modules&&(t("Loading JS modules"),await(({main:e,worker:t},n)=>{const r=[];if(t&&Qt)for(let[e,s]of Mt(t))e=Tt(e,n),r.push(Nt(e,s));if(e&&!Qt)for(let[t,s]of Mt(e))t=Tt(t,n),zt(t)?qt(t):r.push(Nt(t,s));return Dt(r)})(r.js_modules,s),t("Loaded JS modules"))},En=(e,t,n)=>{"polyscript"===t&&(n.lazy_py_modules=async(...t)=>(await An.get(e)(t),t.map(t=>e.pyimport(t))),n.storage=async e=>{const t=new i(e);return await t.sync(),t},n.JSON=bn),e.registerJsModule(t,n)},vn=(e,t)=>{if(e.endsWith("/*")){if(/\\.(zip|whl|tgz|tar(?:\\.gz)?)$/.test(t))return RegExp.$1;throw new Error(`Unsupported archive ${t}`)}return""},Sn=(e,t,...n)=>{try{return e.runPython(xt(t),...n)}catch(t){kt.get(e).stderr(t)}},xn=async(e,t,...n)=>{try{return await e.runPythonAsync(xt(t),...n)}catch(t){kt.get(e).stderr(t)}},$n=async(e,t,n)=>{const[r,...s]=t.split(".");let o,a=e.globals.get(r);for(const e of s)[o,a]=[a,a[e]];try{await a.call(o,n)}catch(t){kt.get(e).stderr(t)}};var Bn=(new TextEncoder).encode("_F=\'github:\'\\n_E=\'user-agent\'\\n_D=True\\n_C=False\\n_B=\'/\'\\n_A=None\\nfrom uio import StringIO\\nimport sys\\nclass Response:\\n\\tdef __init__(A,f):A.raw=f;A.encoding=\'utf-8\';A._cached=_A\\n\\tdef close(A):\\n\\t\\tif A.raw:A.raw.close();A.raw=_A\\n\\t\\tA._cached=_A\\n\\t@property\\n\\tdef content(self):\\n\\t\\tA=self\\n\\t\\tif A._cached is _A:\\n\\t\\t\\ttry:A._cached=A.raw.read()\\n\\t\\t\\tfinally:A.raw.close();A.raw=_A\\n\\t\\treturn A._cached\\n\\t@property\\n\\tdef text(self):return str(self.content,self.encoding)\\n\\tdef json(A):import ujson;return ujson.loads(A.content)\\nHEADERS_TO_IGNORE=_E,\\ntry:import js\\nexcept Exception as err:raise OSError(\'This version of urequests can only be used in the browser\')\\nHEADERS_TO_IGNORE=_E,\\ndef request(method,url,data=_A,json=_A,headers={},stream=_A,auth=_A,timeout=_A,parse_headers=_D):\\n\\tE=timeout;D=method;C=data;from js import XMLHttpRequest as G;A=G.new();A.withCredentials=_C\\n\\tif auth is not _A:import ubinascii;H,I=auth;A.open(D,url,_C,H,I)\\n\\telse:A.open(D,url,_C)\\n\\tfor(F,J)in headers.items():\\n\\t\\tif F.lower()not in HEADERS_TO_IGNORE:A.setRequestHeader(F,J)\\n\\tif E:A.timeout=int(E*1000)\\n\\tif json is not _A:assert C is _A;import ujson;C=ujson.dumps(json);A.setRequestHeader(\'Content-Type\',\'application/json\')\\n\\tA.send(C);B=Response(StringIO(A.responseText));B.status_code=A.status;B.reason=A.statusText;B.headers=A.getAllResponseHeaders();return B\\ndef get(url,**A):return request(\'GET\',url,**A)\\n_PACKAGE_INDEX=const(\'https://micropython.org/pi/v2\')\\n_CHUNK_SIZE=128\\ndef _ensure_path_exists(path):\\n\\timport os;A=path.split(_B)\\n\\tif not A[0]:A.pop(0);A[0]=_B+A[0]\\n\\tB=\'\'\\n\\tfor C in range(len(A)-1):\\n\\t\\tB+=A[C]\\n\\t\\ttry:os.stat(B)\\n\\t\\texcept:os.mkdir(B)\\n\\t\\tB+=_B\\ndef _chunk(src,dest):\\n\\tA=memoryview(bytearray(_CHUNK_SIZE))\\n\\twhile _D:\\n\\t\\tB=src.readinto(A)\\n\\t\\tif B==0:break\\n\\t\\tdest(A if B==_CHUNK_SIZE else A[:B])\\ndef _check_exists(path,short_hash):\\n\\tA=short_hash;import os\\n\\ttry:\\n\\t\\timport binascii as C,hashlib as D\\n\\t\\twith open(path,\'rb\')as E:B=D.sha256();_chunk(E,B.update);F=str(C.hexlify(B.digest())[:len(A)],\'utf-8\');return F==A\\n\\texcept:return _C\\ndef _rewrite_url(url,branch=_A):\\n\\tB=branch;A=url\\n\\tif not B:B=\'HEAD\'\\n\\tif A.startswith(_F):A=A[7:].split(_B);A=\'https://raw.githubusercontent.com/\'+A[0]+_B+A[1]+_B+B+_B+_B.join(A[2:])\\n\\treturn A\\ndef _download_file(url,dest):\\n\\tB=dest;A=get(url)\\n\\ttry:\\n\\t\\tif A.status_code!=200:print(\'Error\',A.status_code,\'requesting\',url);return _C\\n\\t\\tprint(\'Copying:\',B);_ensure_path_exists(B)\\n\\t\\twith open(B,\'wb\')as C:_chunk(A.raw,C.write)\\n\\t\\treturn _D\\n\\tfinally:A.close()\\ndef _install_json(package_json_url,index,target,version,mpy):\\n\\tK=\'File not found: {} {}\';I=version;H=index;G=package_json_url;D=target;E=get(_rewrite_url(G,I))\\n\\ttry:\\n\\t\\tif E.status_code!=200:print(\'Package not found:\',G);return _C\\n\\t\\tF=E.json()\\n\\tfinally:E.close()\\n\\tfor(A,C)in F.get(\'hashes\',()):\\n\\t\\tB=D+_B+A\\n\\t\\tif _check_exists(B,C):print(\'Exists:\',B)\\n\\t\\telse:\\n\\t\\t\\tL=\'{}/file/{}/{}\'.format(H,C[:2],C)\\n\\t\\t\\tif not _download_file(L,B):print(K.format(A,C));return _C\\n\\tfor(A,J)in F.get(\'urls\',()):\\n\\t\\tB=D+_B+A\\n\\t\\tif not _download_file(_rewrite_url(J,I),B):print(K.format(A,J));return _C\\n\\tfor(M,N)in F.get(\'deps\',()):\\n\\t\\tif not _install_package(M,H,D,N,mpy):return _C\\n\\treturn _D\\ndef _install_package(package,index,target,version,mpy):\\n\\tD=index;C=target;B=version;A=package\\n\\tif A.startswith(\'http://\')or A.startswith(\'https://\')or A.startswith(_F):\\n\\t\\tif A.endswith(\'.py\')or A.endswith(\'.mpy\'):print(\'Downloading {} to {}\'.format(A,C));return _download_file(_rewrite_url(A,B),C+_B+A.rsplit(_B)[-1])\\n\\t\\telse:\\n\\t\\t\\tif not A.endswith(\'.json\'):\\n\\t\\t\\t\\tif not A.endswith(_B):A+=_B\\n\\t\\t\\t\\tA+=\'package.json\'\\n\\t\\t\\tprint(\'Installing {} to {}\'.format(A,C))\\n\\telse:\\n\\t\\tif not B:B=\'latest\'\\n\\t\\tprint(\'Installing {} ({}) from {} to {}\'.format(A,B,D,C));E=sys.implementation._mpy&255 if mpy and hasattr(sys.implementation,\'_mpy\')else\'py\';A=\'{}/package/{}/{}/{}.json\'.format(D,\'py\',A,B)\\n\\treturn _install_json(A,D,C,B,mpy)\\ndef install(package,index=_A,target=_A,version=_A,mpy=_D):\\n\\tB=target;A=index\\n\\tif not B:\\n\\t\\tfor C in sys.path:\\n\\t\\t\\tif C.endswith(\'/lib\'):B=C;break\\n\\t\\telse:print(\'Unable to find lib dir in sys.path\');return\\n\\tif not A:A=_PACKAGE_INDEX\\n\\tif _install_package(package,A.rstrip(_B),B,version,mpy):print(\'Done\')\\n\\telse:print(\'Package may be partially installed\')");const jn=async e=>(await import("./toml-V4Savzlc.js")).parse(e);async function Pn(e,t){return new Promise((n,r)=>{e.syncfs(t,e=>{e?r(e):n()})})}function Mn(e){const t=e.FS,n=e.FS.filesystems.MEMFS,r=e.PATH,s={DIR_MODE:16895,FILE_MODE:33279,mount:function(e){if(!e.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return n.mount.apply(null,arguments)},syncfs:async(e,t,n)=>{try{const r=s.getLocalSet(e),o=await s.getRemoteSet(e),a=t?o:r,i=t?r:o;await s.reconcile(e,a,i),n(null)}catch(e){n(e)}},getLocalSet:e=>{let n=Object.create(null);function s(e){return"."!==e&&".."!==e}function o(e){return t=>r.join2(e,t)}let a=t.readdir(e.mountpoint).filter(s).map(o(e.mountpoint));for(;a.length;){let e=a.pop(),r=t.stat(e);t.isDir(r.mode)&&a.push.apply(a,t.readdir(e).filter(s).map(o(e))),n[e]={timestamp:r.mtime,mode:r.mode}}return{type:"local",entries:n}},getRemoteSet:async e=>{const t=Object.create(null),n=await Dn(e.opts.fileSystemHandle);for(const[o,a]of n)"."!==o&&(t[r.join2(e.mountpoint,o)]={timestamp:"file"===a.kind?(await a.getFile()).lastModifiedDate:new Date,mode:"file"===a.kind?s.FILE_MODE:s.DIR_MODE});return{type:"remote",entries:t,handles:n}},loadLocalEntry:e=>{const r=t.lookupPath(e).node,s=t.stat(e);if(t.isDir(s.mode))return{timestamp:s.mtime,mode:s.mode};if(t.isFile(s.mode))return r.contents=n.getFileDataAsTypedArray(r),{timestamp:s.mtime,mode:s.mode,contents:r.contents};throw new Error("node type not supported")},storeLocalEntry:(e,n)=>{if(t.isDir(n.mode))t.mkdirTree(e,n.mode);else{if(!t.isFile(n.mode))throw new Error("node type not supported");t.writeFile(e,n.contents,{canOwn:!0})}t.chmod(e,n.mode),t.utime(e,n.timestamp,n.timestamp)},removeLocalEntry:e=>{var n=t.stat(e);t.isDir(n.mode)?t.rmdir(e):t.isFile(n.mode)&&t.unlink(e)},loadRemoteEntry:async e=>{if("file"===e.kind){const t=await e.getFile();return{contents:new Uint8Array(await t.arrayBuffer()),mode:s.FILE_MODE,timestamp:t.lastModifiedDate}}if("directory"===e.kind)return{mode:s.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+e.kind)},storeRemoteEntry:async(e,n,s)=>{const o=e.get(r.dirname(n)),a=t.isFile(s.mode)?await o.getFileHandle(r.basename(n),{create:!0}):await o.getDirectoryHandle(r.basename(n),{create:!0});if("file"===a.kind){const e=await a.createWritable();await e.write(s.contents),await e.close()}e.set(n,a)},removeRemoteEntry:async(e,t)=>{const n=e.get(r.dirname(t));await n.removeEntry(r.basename(t)),e.delete(t)},reconcile:async(e,n,o)=>{let a=0;const i=[];Object.keys(n.entries).forEach(function(e){const r=n.entries[e],s=o.entries[e];(!s||t.isFile(r.mode)&&r.timestamp.getTime()>s.timestamp.getTime())&&(i.push(e),a++)}),i.sort();const c=[];if(Object.keys(o.entries).forEach(function(e){n.entries[e]||(c.push(e),a++)}),c.sort().reverse(),!a)return;const l="remote"===n.type?n.handles:o.handles;for(const t of i){const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);if("local"===o.type){const e=l.get(n),r=await s.loadRemoteEntry(e);s.storeLocalEntry(t,r)}else{const e=s.loadLocalEntry(t);await s.storeRemoteEntry(l,n,e)}}for(const t of c)if("local"===o.type)s.removeLocalEntry(t);else{const n=r.normalize(t.replace(e.mountpoint,"/")).substring(1);await s.removeRemoteEntry(l,n)}}};return e.FS.filesystems.NATIVEFS_ASYNC=s,async function(e,n){if("FileSystemDirectoryHandle"!==n.constructor.name)throw new TypeError("Expected argument \'fileSystemHandle\' to be a FileSystemDirectoryHandle");return function(e){t.mkdirTree?t.mkdirTree(e):tn(t,e);const{node:n}=t.lookupPath(e,{follow_mount:!1});if(t.isMountpoint(n))throw new Error(`path \'${e}\' is already a file system mount point`);if(!t.isDir(n.mode))throw new Error(`path \'${e}\' points to a file not a directory`);for(const t in n.contents)throw new Error(`directory \'${e}\' is not empty`)}(e),t.mount(t.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:n},e),await Pn(t,!0),{syncfs:async()=>await Pn(t,!1)}}}const Dn=async e=>{const t=[];await async function e(n){for await(const r of n.values())t.push(r),"directory"===r.kind&&await e(r)}(e);const n=new Map;n.set(".",e);for(const r of t){const t=(await e.resolve(r)).join("/");n.set(t,r)}return n},{parse:Fn}=JSON,Tn=(e,t)=>new URL(e,t).href,Rn=(e,t,n)=>{if(t in e)throw new Error(`Duplicated path: ${t}`);e[t]=n},Ln=(e,t,n)=>{for(const r in t)Rn(e,Tn(r,n),t[r])},On=(e,t,n,r)=>{const s=t[n];s&&(e[n]??={},Ln(e[n],s,r))},Cn=async([e,t],n=e.packages,r=new Set)=>{const s=[];for(const o of n){if(r.has(o))continue;r.add(o);const n=o.endsWith(".toml");if(n||o.endsWith(".json")){const{href:a}=new URL(o,t),i=await Zt(a).text(),{name:c,files:l,js_modules:u,packages:p}=n?await jn(i):Fn(i);if(r.has(c))throw new Error(`Unable to process ${c} @ ${o}`);r.add(c),p&&s.push(...await Cn([e,a],p,r)),u&&(e.js_modules??={},On(e.js_modules,u,"main",o),On(e.js_modules,u,"worker",o)),l&&(e.files??={},Ln(e.files,l,o))}else s.push(o)}return s},In=(e,t)=>{try{e.mkdir(t)}catch(e){}},Un=ln("mpy");var Hn={type:"micropython",module:(e="1.28.0-6")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,n,r){const{stderr:s,stdout:o,get:a}=Et({stderr:St(console.error),stdout:St(console.log)}),i=[];t.debug&&i.push("settrace"),t.packages?.includes("ulab")&&(t.packages.splice(t.packages.indexOf("ulab"),1),i.push("ulab")),n=n.replace(/\\.m?js$/,".wasm");for(const e of i)n=n.replace(/\\.wasm$/,`-${e}.wasm`);Un("Loading MicroPython");const c=await a(e({linebuffer:!1,stderr:s,stdout:o,url:n}));globalThis[It].set("-T-",this.transform.bind(this,c));const l=Wn.bind(this,c,r);return An.set(c,l),t.packages&&(Un("Loading remote packages"),t.packages=await Cn([t,r]),Un("Loaded remote packages")),await kn(this,Un,c,t,r),this.writeFile(c,"./mip.py",Bn),t.packages&&(Un("Loading packages"),await l(t.packages.map(Rt,r)),Un("Loaded packages")),Un("Loaded MicroPython"),c.mountNativeFS||(c.mountNativeFS=Mn(c._module)),c},registerJSModule:En,run:Sn,runAsync:xn,runEvent:$n,transform:(e,t)=>e.PyProxy.toJs(t),writeFile:(e,t,n,r)=>{const{FS:s,_module:{PATH:o,PATH_FS:a}}=e,i={FS:s,PATH:o,PATH_FS:a},c=vn(t,r);if(c){const r=t.slice(0,-1);switch("./"!==r&&s.mkdir(r),c){case"whl":case"zip":{const e=new Blob([n],{type:"application/zip"});return import("./zip-CoY8ac0B.js").then(async({BlobReader:t,Uint8ArrayWriter:n,ZipReader:a})=>{const i=new a(new t(e));for(const e of await i.getEntries()){const{directory:t,filename:a}=e,i=r+a;if(t)In(s,i);else{In(s,o.dirname(i));const t=await e.getData(new n);s.writeFile(i,t,{canOwn:!0})}}i.close()})}case"tgz":case"tar.gz":{const t="./_.tar.gz";return en(i,t,n),void e.runPython(`\\n import os, gzip, tarfile\\n tar = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=open("${t}", "rb")))\\n for f in tar:\\n name = f"${r}{f.name}"\\n if f.type == tarfile.DIRTYPE:\\n if f.name != "./":\\n os.mkdir(name.strip("/"))\\n else:\\n dir = os.path.dirname(name)\\n if not os.path.exists(dir):\\n os.mkdir(dir)\\n source = tar.extractfile(f)\\n with open(name, "wb") as dest:\\n dest.write(source.read())\\n dest.close()\\n tar.close()\\n os.remove("${t}")\\n `)}}}return en(i,t,n)}};async function Wn(e,t,n){let r;for(const s of n)if(s.endsWith(".whl")){const n=Tt(s,t),r=await Zt(n).arrayBuffer();await this.writeFile(e,"./*",r,n)}else r||(r=e.pyimport("mip")),r.install(s)}const Nn={dict_converter:Object.fromEntries},{stringify:qn}=JSON,{apply:zn}=Reflect,Jn=Function.prototype,Kn=e=>function(...t){return zn(e,this,t)};let Gn,Vn;const Xn=e=>{const t=new WeakMap,n=n=>{for(let r,s=0;s<n.length;s++)switch(typeof(r=n[s])){case"object":if(null===r)break;case"function":if(Gn in r&&!r[Gn].shared?.gcRegistered){e=!1;let o=t.get(r)?.deref();if(!o){o=Vn(r);const e=new WeakRef(o);t.set(r,e),t.set(o,e)}n[s]=o,e=!0}}};Object.defineProperties(Jn,{apply:{value(t,r){return e&&n(r),zn(this,t,r)}},call:{value(t,...r){return e&&n(r),zn(this,t,r)}}})},Yn=ln("py"),Zn=new WeakMap;var Qn={type:"pyodide",module:(e="0.29.3")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e,version:t},n,r,s){Yn("Loading Pyodide");let{packages:o,index_urls:a}=n;if(o){if(o=o.map(Rt,s),!a){Yn("Loading Packages Graph");const{default:e}=await import("./pyodide_graph-BvONa7d5.js");if(t in e){const n=e[t];for(const e of o){if(/^(?:\\.|\\/|https?:\\/\\/)/.test(e))continue;const r=e.split(/[>=<]=/)[0];r.toLowerCase()in n||console.warn(`Pyodide ${t} might not support ${e}. See: https://packages.pyscript.net/?q=${r}`)}}Yn("Loaded Packages Graph")}Yn("Loading remote packages"),n.packages=o=await Cn([n,s],o),Yn("Loaded remote packages")}Yn("Loading Storage");const c=r.slice(0,r.lastIndexOf("/")),l=new i(`${c}@${t}`),u={indexURL:c},p="never"!==n.packages_cache&&"0.28.0"!==t;if(await l.sync(),Yn("Loaded Storage"),p||l.clear(),o&&p)if("passthrough"===n.packages_cache)u.packages=o,o=null,l.clear();else{o=o.sort();const e=qn(o);if(l.has(e)){const n=l.get(e);if(u.packages=o.map(e=>e.split(/[>=<]=/)[0]),t.startsWith("0.27")){const e=new Blob([n],{type:"application/json"});u.lockFileURL=URL.createObjectURL(e)}else u.lockFileContents=n;o=null}}const{stderr:f,stdout:d,get:h}=Et();Yn("Loading interpreter");const y=await h(e({stderr:f,stdout:d,...u}));Yn("Loaded interpreter"),globalThis[It].set("-T-",this.transform.bind(this,y)),n.debug&&y.setDebug(!0);const m=tr.bind(y);return a&&Zn.set(y,a),An.set(y,m),await kn(this,Yn,y,n,s),o&&await m(o,l,p),await l.close(),u.lockFileURL&&URL.revokeObjectURL(u.lockFileURL),Yn("Loaded Pyodide"),"auto"===n.experimental_create_proxy&&(y.runPython(["import js","from pyodide.ffi import to_js","o=js.Object.fromEntries","js.experimental_create_proxy=lambda r:to_js(r,dict_converter=o)"].join(";"),{globals:y.toPy({})}),Vn=globalThis.experimental_create_proxy,delete globalThis.experimental_create_proxy,[Gn]=Reflect.ownKeys(Vn).filter(e=>"symbol"==typeof e&&"Symbol(pyproxy.attrs)"===String(e)),Xn(!0)),y},registerJSModule:En,run:Kn(Sn),runAsync:Kn(xn),runEvent:Kn($n),transform:(e,t)=>zn(er,e,[t]),writeFile:(e,t,n,r)=>{const s=vn(t,r);if(s)return e.unpackArchive(n,s,{extractDir:t.slice(0,-1)});const{FS:o,PATH:a,_module:{PATH_FS:i}}=e;return en({FS:o,PATH:a,PATH_FS:i},t,n)}};function er(e){const{ffi:{PyProxy:t}}=this;if(e&&"object"==typeof e){if(e instanceof t)return e.toJs(Nn);if(e instanceof Map)return new Map([...e.entries()]);if($t(e))return e.map(er,this)}return e}async function tr(e,t,n=!1){const{log:r}=console,s=(e,...t)=>{r(e,...t),console.log=r,Yn(e),console.log=s};console.log=s,await this.loadPackage("micropip");const o=this.pyimport("micropip");if(Zn.has(this)&&o.set_index_urls(Zn.get(this)),await o.install(e,{keep_going:!0}),console.log=r,n&&t instanceof i){const n=o.freeze();t.set(qn(e),n)}o.destroy()}const nr=new Map,rr=new Map,sr=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[n,...r]=t.split("@"),s=nr.get(n),o=/^(?:\\.?\\.?\\/|[a-z0-9-]+:\\/\\/)/i.test(r)?r.join("@"):s.module(...r);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:n,module:r,engine:s}=e.get(t);return(e,o)=>r.then(r=>(rr.set(t,e),s(r,e,n,o)))}}),or=e=>{for(const t of[].concat(e.type))nr.set(t,e)};for(const e of[Hn,Qn])or(e);const{parse:ar}=JSON,ir=(e,t,n={})=>{const[r,s]=((e,t="./config.txt")=>{let n=typeof e;return"string"===n&&/\\.(json|toml|txt)$/.test(e)?n=RegExp.$1:e=t,[Tt(e),n]})(e,t);if("json"===s)n=Zt(r).json();else if("toml"===s){const{parser:e}=n;n=Zt(r).text().then(async t=>{const n=e?await import(e):{parse:jn};return(n.parse||n.default)(t)})}else"string"===s?n=cr(e):"object"===s&&e?n=e:"txt"===s&&"string"==typeof n&&(n=cr(n));return[n,e=r]},cr=e=>{try{return ar(e)}catch(t){return jn(e)}},lr="BeforeRun",ur="AfterRun",pr=[`code${lr}`,`code${lr}Async`,`code${ur}`,`code${ur}Async`],fr=["onWorker","onReady",`on${lr}`,`on${lr}Async`,`on${ur}`,`on${ur}Async`];function dr(e,t){const{run:n,runAsync:r}=nr.get(this.type);return{...e,run:n.bind(this,t),runAsync:r.bind(this,t)}}const hr=(e,t,n,r,s,o)=>{if(s||o){const a=dr.bind(e,t),i=r?"runAsync":"run",c=e[i];e[i]=r?async function(e,t,...r){s&&await s.call(this,a(e),n);const i=await c.call(this,e,t,...r);return o&&await o.call(this,a(e),n),i}:function(e,t,...r){s&&s.call(this,a(e),n);const i=c.call(this,e,t,...r);return o&&o.call(this,a(e),n),i}}};let yr,mr,gr;const wr=(e,t)=>{addEventListener(e,t||(async t=>{try{await yr,mr(`xworker.on${e}`,t)}catch(e){postMessage(e)}}),!!t&&{once:!0})},{proxy:_r,sync:br,native:Ar,window:kr,isWindowProxy:Er,ffi:vr}=await(async e=>{const t=await bt({...e,decoder:e?.decoder||he}),n=ze({...e,buffer:!0,reflect:t.proxy[l],timeout:t.ffi_timeout});return t.proxy[u]=n.reflect,{...t,window:n.global,isWindowProxy:n.isProxy,ffi:{assign:n.assign,direct:n.direct,evaluate:n.evaluate,gather:n.gather,query:n.query}}})({transfer:!1,transform:e=>gr?gr(e):e}),Sr={polyfill:br,sync:_r,window:Ar||br?kr:null,isWindowProxy:Er,onmessage:console.info,onerror:console.error,onmessageerror:console.warn,postMessage:postMessage.bind(self)};wr("message",({data:{options:e,config:t,configURL:n,code:r,hooks:s}})=>{yr=(async()=>{try{const{id:o,tag:c,type:l,custom:u,version:p,config:f,async:d}=e,h=((e,t="")=>`${e}@${t}`.replace(/@$/,""))(l,p),y=await((e,t,n,r={})=>(t&&([r,t]=ir(t,n,r)),Ft(r).then(n=>sr[e](n,t))))(h,t,n,f),{js_modules:m}=rr.get(h),g=m?.main,w=jt(nr.get(l)),_=((e,t,n,r)=>({type:t,config:n,interpreter:r,io:kt.get(r),run:(t,...n)=>e.run(r,t,...n),runAsync:(t,...n)=>e.runAsync(r,t,...n),runEvent:(...t)=>e.runEvent(r,...t)}))(w,u||l,f||{},y);let b="run";if(d&&(b+="Async"),s){let e,t,n="",r="";for(const e of pr){const t=s[e];if(t){const s=e.endsWith("Async");(s&&d||!s&&!d)&&(e.startsWith("codeBefore")?n=t:r=t)}}(n||r)&&((e,t,n,r)=>{const s=e[t].bind(e);e[t]="run"===t?(e,t,...o)=>{n&&s(e,n,...o);const a=s(e,Ct(t),...o);return r&&s(e,r,...o),a}:async(e,t,...o)=>{n&&await s(e,n,...o);const a=await s(e,Ct(t),...o);return r&&await s(e,r,...o),a}})(w,b,n,r);for(const n of fr.slice(2)){const r=s[n];if(r){const s=n.endsWith("Async");if(s&&d||!s&&!d){const s=Ot(r);n.startsWith("onBefore")?e=s:t=s}}}hr(w,_,Sr,d,e,t)}let A,k,E,v=null,S="";(Ar||br)&&(({CustomEvent:A,document:k}=kr),v=o&&k.getElementById(o)||null,E=e=>Lt(v,u||l,e,!0,A));const x=Gt(kr,_r,g,t);if(((e,t,n,r)=>{if("pyodide"===e)return;const s="polyscript.js_modules";for(const e of Reflect.ownKeys(r))t.registerJSModule(n,`${s}.${e}`,Wt(r,e));t.registerJSModule(n,s,r)})(l,w,y,x),w.registerJSModule(y,"polyscript",{IDBMap:a,IDBMapSync:i,xworker:Sr,currentScript:v,config:_.config,js_modules:x,ffi:vr,get target(){return!S&&v&&("SCRIPT"===c?v.after(Bt(kr.document.createElement(`script-${u||l}`),{id:S=`${o}-target`})):(S=o,v.replaceChildren(),v.style.display="block")),S}}),mr=w.runEvent.bind(w,y),gr=w.transform.bind(w,y),v&&E("ready"),s?.onReady&&Ot(s?.onReady).call(w,dr.call(w,_,y),Sr),await w[b](y,r),["micropython","pyodide"].includes(w.type)){const e="polyscript",t=`__${e}_workers__`,n="__export__";y.runPython([`import js as ${t}`,`${t}.${t} = "${n}" in locals() and ${n} or []`,`del ${t}`].join("\\n"));const r=[...globalThis[t]];delete globalThis[t],r.length&&y.runPython([`from ${e} import xworker as ${t}`,...r.map(e=>`${t}.sync.${e} = ${e}`),`del ${t}`].join("\\n"))}return v&&E("done"),postMessage("polyscript:done"),y}catch(e){postMessage(e)}})(),wr("error"),wr("message"),wr("messageerror"),(Ar||br)&&addEventListener("py:progress",({type:e,detail:t})=>{kr.dispatchEvent(new kr.CustomEvent(e,{detail:t}))})});\n'.replace(Lr,Nr)],{type:"text/javascript"})),...e))({serviceWorker:n?.serviceWorker||n?.service_worker,reflected_ffi_timeout:globalThis.reflected_ffi_timeout??-1}),{postMessage:o}=s,a=this instanceof ns;let i=!1;const l=B(s.proxy,{importJS:G,importCSS:J,isStuck:()=>i,notStuck(){i=!1}}),p=yn();let f=c(t).text().then(e=>{const t=a?this.toJSON():void 0;o.call(s,{options:n,config:r,code:e,hooks:t})}).then(()=>{f={then:e=>e()}});return S(s,{unstuck:{value(){i=!0}},sync:{value:l},ready:{value:p.promise},postMessage:{value:(e,...t)=>f.then(()=>o.call(s,e,...t))},onerror:{writable:!0,configurable:!0,value:console.error}}),s.addEventListener("message",e=>{const{data:t}=e,n=t instanceof Error;(n||"polyscript:done"===t)&&(e.stopImmediatePropagation(),n?(p.reject(t),s.onerror(j(e,{type:{value:"error"},error:{value:t}}))):p.resolve(s))}),a&&this.onWorker?.(this.interpreter,s),s};const ss="Invalid content";var os=e=>{const{src:t,worker:n}=e.attributes;if(n){let{value:r}=n;if(r)throw new SyntaxError("Invalid worker attribute");if(r=t?.value,!r){if(t)throw new SyntaxError("Invalid worker attribute");if(e.childElementCount){const{innerHTML:t,localName:n,type:s}=e,o=s||n.replace(/-script$/,"");r=E(t),console.warn(`Deprecated: use <script type="${o}"> for an always safe content parsing:\n`,r)}else r=e.textContent;return URL.createObjectURL(new Blob([v(r)],{type:"text/plain"}))}return r}if(t&&e.textContent.replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s*(?:\/\/|#).*/gm,"").trim())throw new SyntaxError(ss)};const as=(e,t)=>{const n=(e=>{let t=e;for(;t.parentNode;)t=t.parentNode;return t})(e);return n.getElementById(t)||((e,t=document)=>t.querySelector(e))(t,n)},is=new WeakMap,cs={get(){let e=is.get(this);return e||(e=document.createElement(`${this.type}-script`),is.set(this,e),ds(this)),e},set(e){"string"==typeof e?is.set(this,as(this,e)):(is.set(this,e),ds(this))}},ls=new WeakMap,ps=new Map,fs=(e,t)=>{const n=e?.value;return n?t+n:""},us=(e,t,n,r,s,o,a=e)=>{if(!ps.has(t)){const i={interpreter:Jr(n,s,o),queue:$(),XWorker:rs(e,r)};ps.set(t,i),ps.has(e)||ps.set(e,i),ps.has(a)||ps.set(a,i)}return ps.get(t)},ds=async e=>{if(ls.has(e)){const{target:t}=e;t&&(e.closest("head")?document.body.append(t):e.after(t))}else{const{attributes:{config:t,env:n,name:r,target:s,version:o,"service-worker":a},src:i,type:l}=e,p=!Y(e),f=o?.value,u=Kr(l,f);let d=fs(t,"|");const m=fs(n,"")||`${u}${d}`;d=d.slice(1);const h=os(e);if(h){const t=new(rs(l,f))(h,{...O(e,l),version:f,async:p,config:d,serviceWorker:a?.value});ls.set(x(e,"xworker",{value:t}),{xworker:t});const n=r?.value;return void(n&&hn[n].resolve(t.ready))}const g=fs(s,""),w=us(l,m,u,f,d);ls.set(x(e,"target",cs),w),g&&is.set(e,as(e,g));const A=i?c(i).text():e.textContent;w.queue=w.queue.then(()=>(async(e,t,n,r)=>{const{type:s}=e,o=an.get(s);o.experimental&&console.warn(`The ${s} interpreter is experimental`);const[a,i]=await C([ls.get(e).interpreter,t]);try{z(s,o,a,H),o.registerJSModule(a,"polyscript",{IDBMap:_,IDBMapSync:y,XWorker:n,currentScript:e,js_modules:H,workers:wn}),M(e,s,"ready"),x(document,"currentScript",{configurable:!0,get:()=>e});const t=M.bind(null,e,s,"done");let c=o[r?"runAsync":"run"](a,i);return r&&(c=await c),t(),c}finally{delete document.currentScript}})(e,A,w.XWorker,p))}},ms=new Proxy(j(null),{get:(e,t)=>new Promise(queueMicrotask).then(()=>_s(t))}),_s=async e=>{if(ps.has(e)){const{interpreter:t,queue:n}=ps.get(e);return(await C([t,n]))[0]}const t=ps.size?`Available interpreters are: ${[...ps.keys()].map(e=>`"${e}"`).join(", ")}.`:"There are no interpreters in this page.";throw new Error(`The interpreter "${e}" was not found. ${t}`)},ys=async e=>{const{type:t,currentTarget:n}=e;if(pn.length)for(let{name:r,value:s,ownerElement:o}of mn(`./@*[${pn.map(e=>`name()="${e}${t}"`).join(" or ")}]`,n)){r=r.slice(0,-(t.length+1));const n=await _s(o.getAttribute(`${r}-env`)||r);an.get(r).runEvent(n,s,e)}},hs=e=>{if(pn.length)for(let{name:t,ownerElement:n}of mn(`.//@*[${pn.map(e=>`starts-with(name(),"${e}")`).join(" or ")}]`,e)){const e=t.lastIndexOf("-"),r=t.slice(e+1);"env"!==r&&(n.addEventListener(r,ys),"disabled"in n&&!n.disabled&&(n.disabled=!0,ms[t.slice(0,e)].then(()=>{n.disabled=!1})))}},gs=rs(),ws=[],As=new Map,bs=new Map,vs=new Map,Es=async e=>{for(const t of ws)if(e.matches(t)){const n=bs.get(t),r=ks.get(n),{resolve:s}=vs.get(n),{options:o,known:a}=r;if(a.has(e))return;a.add(e);for(const[t,n]of As)e.matches(t)&&await n(e);const{interpreter:i,configURL:c,config:l,version:p,env:f,onerror:u,hooks:d,parser:m}=o;let h;try{const t=os(e);if(t){let r=p,o=c,a=e.getAttribute("config")||l||{};if(!r||!a){const[e,t]=zr(a,c,{parser:m});a=await e,o=t,r=a.version||a.interpreter,r&&/\.m?js$/.test(r)&&(r=new URL(r,o).href)}Number.isSafeInteger(a?.experimental_ffi_timeout)&&(globalThis.reflected_ffi_timeout=a.experimental_ffi_timeout);const f=gs.call(new ns(null,d),t,{...O(e,n),parser:m,configURL:o,version:r,type:i,custom:n,config:a,async:!Y(e),serviceWorker:e.getAttribute("service-worker")});x(e,"xworker",{value:f}),s({type:n,xworker:f});const u=e.getAttribute("name");return void(u&&hn[u].resolve(f.ready))}}catch(e){h=e}const g=Kr(i,p),w=f||`${g}${l?`|${l}`:""}`,{interpreter:A,XWorker:b}=us(n,w,g,p,l,c,i),E=await A,k=j(an.get(i)),B=new ns(E,d),S=function(...e){return b.apply(B,e)},R={...F(k,n,structuredClone(cn.get(g)),E),XWorker:S};z(i,k,E,H),k.registerJSModule(E,"polyscript",{IDBMap:_,IDBMapSync:y,XWorker:S,config:R.config,currentScript:n.startsWith("_")?null:e,js_modules:H,workers:wn});for(const t of["Run","RunAsync"]){let n,r,s="",o="";for(const e of Zr){const n=d?.main?.[e];n&&e.endsWith(t)&&(e.startsWith("codeBefore")?s=v(n()):o=v(n()))}(s||o)&&N(k,`r${t.slice(1)}`,s,o);for(let e=2;e<Qr.length;e++){const s=Qr[e],o=d?.main?.[s];o&&s.endsWith(t)&&(s.startsWith("onBefore")?n=o:r=o)}ts(k,R,e,t.endsWith("Async"),n,r)}r.queue=r.queue.then(()=>(s(R),h&&u?.(h,e),d?.main?.onReady?.(R,e)))}},ks=new Map;let Bs=0;const js=e=>(vs.has(e)||vs.set(e,yn()),vs.get(e).promise),[{customObserver:Ss,define:xs,whenDefined:Rs,env:Cs,Hook:$s,XWorker:Ds},Ts]=((e,t,n=globalThis)=>{const r=Symbol.for(e),s=r in n;return[s?n[r]:Object.defineProperty(n,r,{value:t})[r],s]})("polyscript",{customObserver:As,define:(e,t)=>{let n=null==e;if(n)e="_ps"+Bs++;else if(an.has(e)||ks.has(e))throw new Error(`<script type="${e}"> already registered`);if(!an.has(t?.interpreter))throw new Error("Unspecified interpreter");an.set(e,an.get(t.interpreter));const r=[`script[type="${e}"]`];if(js(e),n){const{hooks:n}=t,r=n?.main?.onReady;t={...t,hooks:{...n,main:{...n?.main,onReady(t,n){ws.splice(ws.indexOf(e),1),an.delete(e),ks.delete(e),vs.delete(e),n.remove(),r?.(t)}}}},document.head.append(B(document.createElement("script"),{type:e}))}else r.push(`${e}-script`),pn.push(`${e}-`);for(const t of r)bs.set(t,e);ws.push(...r),ks.set(e,{options:B({env:e},t),known:new WeakSet,queue:Promise.resolve()}),n||hs(document),dn(r.join(",")).forEach(Es)},whenDefined:js,env:ms,Hook:ns,XWorker:gs});if(!Ts){const e=new MutationObserver(e=>{const n=ln.join(",");for(const{type:r,target:s,attributeName:o,addedNodes:a}of e){if("attributes"===r){const e=o.lastIndexOf("-")+1;if(e){const t=o.slice(0,e);for(const n of pn)if(t===n){const t=o.slice(e);if("env"!==t){const e=s.hasAttribute(o)?"add":"remove";s[`${e}EventListener`](t,ys)}break}}continue}for(const e of a)1===e.nodeType&&(hs(e),n&&e.matches(n)?ds(e):t(n,e,!0))}}),t=(e,t,n)=>{e&&dn(e,t).forEach(ds),(e=ws.join(","))&&(n&&Es(t),dn(e,t).forEach(Es))},n=t=>(e.observe(t,{childList:!0,subtree:!0,attributes:!0}),t),{attachShadow:r}=Element.prototype;B(Element.prototype,{attachShadow(e){return n(r.call(this,e))}}),queueMicrotask(()=>{hs(n(document)),t(ln.join(","),document,!1)})}var Ps=new Map([["py","pyodide"],["mpy","micropython"]]);const Os=[];for(const[t]of Ps){const n=[`script[type="${t}"]`,`${t}-script`];for(const r of document.querySelectorAll(n.join(","))){const{promise:n,resolve:s}=e();Os.push(n),r.addEventListener(`${t}:done`,s,{once:!0})}}Promise.all(Os).then(()=>{dispatchEvent(new Event("py:all-done"))});const Ms=(e,t=document)=>[...t.querySelectorAll(e)];var Fs={codemirror:()=>Promise.resolve().then(function(){return Fo}),"deprecations-manager":()=>import("./deprecations-manager-BLZxpaBk.js"),donkey:()=>import("./donkey-DZXEwrem.js"),error:()=>import("./error-2Qk3Mfnr.js"),"py-editor":()=>import("./py-editor-BpXAdI0B.js"),"py-game":()=>import("./py-game-BljeiN-4.js"),"py-terminal":()=>import("./py-terminal-DQ2Uq7fJ.js")};const Ls={CONFLICTING_CODE:"PY0409",BAD_CONFIG:"PY1000",FETCH_ERROR:"PY0001",FETCH_UNAUTHORIZED_ERROR:"PY0401",FETCH_FORBIDDEN_ERROR:"PY0403",FETCH_NOT_FOUND_ERROR:"PY0404",FETCH_SERVER_ERROR:"PY0500",FETCH_UNAVAILABLE_ERROR:"PY0503"};class Ns extends Error{constructor(e,t="",n="text"){super(`(${e}): ${t}`),this.errorCode=e,this.messageType=n,this.name="UserError"}}class Is extends Ns{constructor(e,t){super(e,t),this.name="FetchError"}}const Us=e=>e.text();async function Hs(e,t){let n;try{n=await fetch(e,t)}catch(t){const n=t;let r;throw r=e.startsWith("http")?`Fetching from URL ${e} failed with error '${n.message}'. Are your filename and path correct?`:'Polyscript: Access to local files\n (using [[fetch]] configurations in <py-config>)\n is not available when directly opening a HTML file;\n you must use a webserver to serve the additional files.\n See <a style="text-decoration: underline;" href="https://github.com/pyscript/pyscript/issues/257#issuecomment-1119595062">this reference</a>\n on starting a simple webserver with Python.\n ',new Is(Ls.FETCH_ERROR,r)}if(!n.ok){const t=`Fetching from URL ${e} failed with error ${n.status} (${n.statusText}). Are your filename and path correct?`;switch(n.status){case 404:throw new Is(Ls.FETCH_NOT_FOUND_ERROR,t);case 401:throw new Is(Ls.FETCH_UNAUTHORIZED_ERROR,t);case 403:throw new Is(Ls.FETCH_FORBIDDEN_ERROR,t);case 500:throw new Is(Ls.FETCH_SERVER_ERROR,t);case 503:throw new Is(Ls.FETCH_UNAVAILABLE_ERROR,t);default:throw new Is(Ls.FETCH_ERROR,t)}}return n}const{BAD_CONFIG:Ws,CONFLICTING_CODE:qs}=Ls,zs=async(e,t)=>{let n=e?.trim(),r="",s=!1,o=/^{/.test(n)&&/}$/.test(n);if(!o&&/\.(\w+)(?:\?\S*)?$/.test(n)){const e=RegExp.$1;"json"===e&&"toml"!==t?o=!0:"toml"===e&&"json"!==t?s=!0:((e,t="")=>{let n=`(${Ws}): Invalid URL: ${e}`;throw t&&(n+=`\nexpected ${t} content`),new Error(n)})(n,t),r=n,n=(await Hs(r).then(Us)).trim()}return{json:o,toml:s||!o&&!!n,text:n,url:r}},Gs=e=>{const t=e.getAttribute("config-parser");return t?new URL(t,location.href).href:void 0},Js=e=>new Error(`(${qs}): ${e}`),Ks=(e,t=location.href)=>new URL(e,t).href,Ys=(e,t,{message:n})=>{let r=`(${Ws}): Invalid ${e}`;return t&&(r+=` @ ${t}`),new SyntaxError(`${r}\n${n}`)},Vs=new Map;for(const[e]of Ps){let t,n,r,s,o,a,i,c,l=Ms(`${e}-config`),p=Ms([`script[type="${e}"][config]:not([worker])`,`${e}-script[config]:not([worker])`].join(","));if(l.length>1?r=Js(`Too many ${e}-config`):l.length&&p.length?r=Js(`Ambiguous ${e}-config VS config attribute`):l.length?([c]=l,o=c.getAttribute("src")||c.textContent,a=c.getAttribute("type"),i=Gs(c)):p.length&&([c,...p]=p,o=c.getAttribute("config"),i=Gs(c),p.some(e=>e.getAttribute("config")!==o)&&(r=Js("Unable to use different configs on main"))),!r&&o)try{const{json:e,toml:t,text:c,url:l}=await zs(o,a);if(l&&(s=Ks(l)),o=c,e||"json"===a)try{n=JSON.parse(c)}catch(e){r=Ys("JSON",l,e)}else if(t||"toml"===a)try{const e=i?await import(i):await Tt(c).then(e=>({parse:()=>e}));n=(e.parse||e.default)(c)}catch(e){r=Ys("TOML",l,e)}}catch(e){r=e}t=async()=>{const e=[];for(const[t,s]of Object.entries(Fs))r?"error"===t&&s().then(({notify:e})=>e(r.message)):n?.plugins?.includes(`!${t}`)?"error"===t&&e.push(s().then(({notOnDOM:e})=>e())):e.push(s().then(({default:e})=>e));return await Promise.all(e)},Number.isSafeInteger(n?.experimental_ffi_timeout)&&(globalThis.reflected_ffi_timeout=n?.experimental_ffi_timeout),Vs.set(e,{config:n,configURL:s,parser:i,plugins:t,error:r})}const{assign:Xs}=Object,Zs="entries",Qs="readonly",eo="readwrite",to={durability:"default",prefix:"IDBMap"},no=({target:{result:e}})=>e;class ro extends EventTarget{#e;#t;#n;async#r(e,t){const n=(await this.#e).transaction(Zs,t,this.#t);return new Promise((t,r)=>Xs(e(n.objectStore(Zs)),{onsuccess:t,onerror:r}))}constructor(e,{durability:t=to.durability,prefix:n=to.prefix}=to){super(),this.#n=n,this.#t={durability:t},this.#e=new Promise((t,n)=>{Xs(indexedDB.open(`${this.#n}/${e}`),{onupgradeneeded({target:{result:e,transaction:n}}){e.objectStoreNames.length||e.createObjectStore(Zs),n.oncomplete=()=>t(e)},onsuccess(e){t(no(e))},onerror(e){n(e),this.dispatchEvent(e)}})}).then(e=>{const t=this.dispatchEvent.bind(this);for(const n in e)n.startsWith("on")&&(e[n]=t);return e})}dispatchEvent(e){const{type:t,message:n,isTrusted:r}=e;return super.dispatchEvent(r?Xs(new Event(t),{message:n}):e)}async close(){(await this.#e).close()}get size(){return this.#r(e=>e.count(),Qs).then(no)}async clear(){await this.#r(e=>e.clear(),eo)}async delete(e){await this.#r(t=>t.delete(e),eo)}async entries(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e).then(t=>[e,t])))}async forEach(e,t=this){for(const[n,r]of await this.entries())await e.call(t,r,n,this)}async get(e){return await this.#r(t=>t.get(e),Qs).then(no)}async has(e){return void 0!==await this.#r(t=>t.getKey(e),Qs).then(no)}async keys(){return await this.#r(e=>e.getAllKeys(),Qs).then(no)}async set(e,t){return await this.#r(n=>n.put(t,e),eo),this}async values(){const e=await this.keys();return Promise.all(e.map(e=>this.get(e)))}get[Symbol.toStringTag](){return this.#n}}const so=e=>{e.preventDefault(),e.stopImmediatePropagation()},oo="@pyscript.fs",ao="storage permissions not granted",io=new ro(oo),co=async t=>{if(!("showDirectoryPicker"in globalThis))return Promise.reject(new Error("showDirectoryPicker is not supported"));const{promise:n,resolve:r,reject:s}=e(),o={id:"pyscript",mode:"readwrite",...t};t.hint&&(o.startIn=t.hint);const a=async()=>{try{const e=await showDirectoryPicker(o);if("granted"===await e.requestPermission(o))return r(e),!0}catch({message:e}){console.warn(e)}return!1};if(navigator.userActivation?.isActive)await a()||s(new Error(ao));else{const e=B(document.createElement("dialog"),{className:"pyscript-fs",innerHTML:["<strong>ℹ️ Persistent FileSystem</strong><hr>","<p><small>PyScript would like to access a local folder.</small></p>","<div><button title='ok'>✅ Authorize</button>","<button title='cancel'>❌</button></div>"].join("")}),[t,n]=Ms("button",e);t.addEventListener("click",async t=>{so(t),await a()&&e.close()}),n.addEventListener("click",async t=>{so(t),s(new Error(ao)),e.close()}),document.body.appendChild(e).showModal()}return n};var lo=Object.freeze({__proto__:null,ERROR:ao,NAMESPACE:oo,getFileSystemDirectoryHandle:co,idb:io}),po={is_pyterminal:()=>!1,sleep:e=>new Promise(t=>setTimeout(t,1e3*e)),getFSHandler:e=>co(e),storeFSHandler:async(e,t={})=>!!await io.has(e)||co(t).then(async n=>(await io.set(e,{handler:n,options:t}),!0),()=>!1),async deleteFSHandler(e){const t=await io.has(e);return t&&await io.delete(e),t}};const fo=e=>{x(document,"currentScript",{configurable:!0,get:()=>e})},uo=()=>{delete document.currentScript};var mo=async(e,t,n,r)=>{const s=r.endsWith("Async");(r.startsWith("onBefore")?fo:uo)(n);for(const o of e(r))s?await o(t,n):o(t,n)};const _o=()=>!0,yo=e=>{throw new TypeError(e)},ho=(e,t)=>{const n=[];if(e)for(const t of e.split(/\s*\|\s*/))"object"===t?n.push(e=>null!==e&&typeof e===t):"null"===t?n.push(e=>null===e):n.push(e=>typeof e===t);if(t)for(const e of[].concat(t))n.push(t=>t instanceof e);switch(n.length){case 0:return _o;case 1:return n[0];default:return e=>n.some(t=>t(e))}},go=(e,t,n,r=yo)=>s=>{const o=[`Invalid ${typeof s} ${n}: expected `];e&&(o.push(e),t&&o.push(" or ")),t&&(o.push("an instanceof "),o.push([].concat(t).map(({name:e})=>e).join(" | "))),r(o.join(""),s)},wo=(e=>t=>{const[n,r]=((e,t="value")=>{const n=e?.typeof,r=e?.instanceof;return[ho(n,r),go(n,r,t,e?.onerror)]})(t);return class extends e{add(e){return n(e)?super.add(e):r(e)}}})(Set);function Ao(e=this){return String(e).replace(/^(async\s*)?(\bfunction\b)?(.*?)\(/,(e,t,n,r)=>r&&!n?`${t||""}function ${r}(`:e)}const{entries:bo}=Object,vo=["import os as _os","from pathlib import Path as _Path","_path = None"],Eo=new class extends Array{#c=!1;#l;#p;constructor(e,...t){super(),this.#p=e,this.#l=t}push(...e){return this.#c&&super.push(...e),this.#p.push(...e)}path(e){for(const t of this.#l)if(this.#c=e.startsWith(t))break}}(vo,"-"),ko=(e,t)=>{for(const[n,r]of bo(t))if(Eo.path(`${e}/${n}`),Eo.push(`_path = _Path("${e}/${n}")`),"string"==typeof r){const e=JSON.stringify(r);Eo.push(`_path.write_text(${e},encoding="utf-8")`)}else Eo.push(`if not _os.path.exists("${e}/${n}"):`),Eo.push(" _path.mkdir(parents=True, exist_ok=True)"),ko(`${e}/${n}`,r)};ko(".",{pyscript:{"__init__.py":"from polyscript import lazy_py_modules as py_import\nfrom pyscript.context import RUNNING_IN_WORKER,PyWorker,config,current_target,document,js_import,js_modules,sync,window\nfrom pyscript.display import HTML,display\nfrom pyscript.fetch import fetch\nfrom pyscript.storage import Storage,storage\nfrom pyscript.websocket import WebSocket\nfrom pyscript.events import when,Event\nif not RUNNING_IN_WORKER:from pyscript.workers import create_named_worker,workers","context.py":"_A=None\nimport json,sys,js\nfrom polyscript import config as _polyscript_config,js_modules\nfrom pyscript.util import NotSupported\nRUNNING_IN_WORKER=not hasattr(js,'document')\nconfig=json.loads(js.JSON.stringify(_polyscript_config))\nif isinstance(config,str):config={}\njs_import=_A\nwindow=_A\ndocument=_A\nsync=_A\nif'MicroPython'in sys.version:config['type']='mpy'\nelse:config['type']='py'\nclass _JSModuleProxy:\n\tdef __init__(A,name):A.name=name\n\tdef __getattr__(B,field):\n\t\tA=field\n\t\tif not A.startswith('_'):return getattr(getattr(js_modules,B.name),A)\nfor module_name in js.Reflect.ownKeys(js_modules):sys.modules[f\"pyscript.js_modules.{module_name}\"]=_JSModuleProxy(module_name)\nsys.modules['pyscript.js_modules']=js_modules\nif RUNNING_IN_WORKER:\n\timport polyscript;PyWorker=NotSupported('pyscript.PyWorker','pyscript.PyWorker works only when running in the main thread')\n\ttry:window=polyscript.xworker.window;document=window.document;js.document=document;js_import=window.Function('return (...urls) => Promise.all(urls.map((url) => import(url)))')()\n\texcept:\n\t\tsab_error_message='Unable to use `window` or `document` in worker. This requires SharedArrayBuffer support. See: https://docs.pyscript.net/latest/faq/#sharedarraybuffer'\n\t\tif not config.get('sync_main_only',False):js.console.warn(sab_error_message)\n\t\twindow=NotSupported('pyscript.window',sab_error_message);document=NotSupported('pyscript.document',sab_error_message)\n\tsync=polyscript.xworker.sync\n\tdef current_target():return polyscript.target\nelse:\n\timport _pyscript;from _pyscript import PyWorker as _PyWorker;from pyscript.ffi import to_js;js_import=_pyscript.js_import\n\tdef PyWorker(url,**A):return _PyWorker(url,to_js(A))\n\twindow=js;document=js.document;sync=NotSupported('pyscript.sync','pyscript.sync works only when running in a worker')\n\tdef current_target():return _pyscript.target","display.py":"_I='__repr__'\n_H='savefig'\n_G='application/json'\n_F='image/svg+xml'\n_E='application/javascript'\n_D='image/jpeg'\n_C='text/html'\n_B='image/png'\n_A='text/plain'\nimport base64,html,io\nfrom collections import OrderedDict\nfrom pyscript.context import current_target,document,window\nfrom pyscript.ffi import is_none\ndef _render_image(mime,value,meta):\n\tA=value\n\tif isinstance(A,bytes):A=base64.b64encode(A).decode('utf-8')\n\tB=''.join([f' {A}=\"{B}\"'for(A,B)in meta.items()]);return f'<img src=\"data:{mime};base64,{A}\"{B}>'\n_MIME_TO_RENDERERS={_A:lambda v,m:html.escape(v),_C:lambda v,m:v,_B:lambda v,m:_render_image(_B,v,m),_D:lambda v,m:_render_image(_D,v,m),_F:lambda v,m:v,_G:lambda v,m:v,_E:lambda v,m:f\"<script>{v}<\\\\/script>\"}\n_METHOD_TO_MIME=OrderedDict([(_H,_B),('_repr_png_',_B),('_repr_jpeg_',_D),('_repr_svg_',_F),('_repr_html_',_C),('_repr_json_',_G),('_repr_javascript_',_E),(_I,_A)])\nclass HTML:\n\tdef __init__(A,html):A._html=html\n\tdef _repr_html_(A):return A._html\ndef _get_representation(obj,method):\n\tB=method;A=obj\n\tif B==_I:return repr(A)\n\tif not hasattr(A,B):return\n\tif B==_H:C=io.BytesIO();A.savefig(C,format='png');C.seek(0);return base64.b64encode(C.read()).decode('utf-8')\n\treturn getattr(A,B)()\ndef _get_content_and_mime(obj):\n\tC=obj\n\tif isinstance(C,str):return html.escape(C),_A\n\tE=_get_representation(C,'_repr_mimebundle_')\n\tif E:\n\t\tif isinstance(E,tuple):F,G=E\n\t\telse:F,G=E,{}\n\t\tfor(B,A)in F.items():\n\t\t\tif B in _MIME_TO_RENDERERS:\n\t\t\t\tD=G.get(B,{})\n\t\t\t\tif isinstance(A,tuple):A,H=A;D.update(H)\n\t\t\t\treturn _MIME_TO_RENDERERS[B](A,D),B\n\tfor(I,B)in _METHOD_TO_MIME.items():\n\t\tif B not in _MIME_TO_RENDERERS:continue\n\t\tA=_get_representation(C,I)\n\t\tif A is None:continue\n\t\tD={}\n\t\tif isinstance(A,tuple):A,D=A\n\t\treturn _MIME_TO_RENDERERS[B](A,D),B\n\twindow.console.warn(f\"Object {type(C).__name__} has no supported representation method. Using __repr__ as fallback.\");A=repr(C);return html.escape(A),_A\ndef _write_to_dom(element,value,append):\n\tC=element;B,D=_get_content_and_mime(value)\n\tif not B.strip():return\n\tif append:A=document.createElement('div');C.append(A)\n\telse:A=C\n\tif D in(_E,_C):A.append(document.createRange().createContextualFragment(B))\n\telse:A.innerHTML=B\ndef display(*D,target=None,append=True):\n\tC=append;A=target\n\tif isinstance(A,str):A=A[1:]if A.startswith('#')else A\n\telif is_none(A):A=current_target()\n\tB=document.getElementById(A)\n\tif is_none(B):raise ValueError(f\"Cannot find element with id='{A}' in the page.\")\n\tif B.tagName=='SCRIPT'and hasattr(B,'target'):B=B.target\n\tif not C:B.replaceChildren()\n\tfor E in D:_write_to_dom(B,E,C)","events.py":"import asyncio,inspect\nfrom functools import wraps\nfrom pyscript.context import document\nfrom pyscript.ffi import create_proxy,to_js\nfrom pyscript.util import is_awaitable\nclass Event:\n\tdef __init__(A):A._listeners=[]\n\tdef trigger(C,result):\n\t\tB=result\n\t\tfor A in C._listeners:\n\t\t\tif is_awaitable(A):asyncio.create_task(A(B))\n\t\t\telse:A(B)\n\tdef add_listener(B,listener):\n\t\tA=listener\n\t\tif not callable(A):C='Listener must be callable.';raise ValueError(C)\n\t\tif A not in B._listeners:B._listeners.append(A)\n\tdef remove_listener(A,*B):\n\t\tif B:\n\t\t\tfor C in B:\n\t\t\t\ttry:A._listeners.remove(C)\n\t\t\t\texcept ValueError:pass\n\t\telse:A._listeners=[]\ndef when(event_type,selector=None,**C):\n\tB=selector;A=event_type\n\tif isinstance(A,str):\n\t\tif not B:raise ValueError('Selector required for DOM event handling.')\n\t\tD=_get_elements(B)\n\t\tif not D:raise ValueError(f\"No elements found for selector: {B}\")\n\tdef E(func):\n\t\tB=_create_wrapper(func)\n\t\tif isinstance(A,Event):A.add_listener(B)\n\t\telif isinstance(A,list)and all(isinstance(A,Event)for A in A):\n\t\t\tfor E in A:E.add_listener(B)\n\t\telse:\n\t\t\tfor F in D:F.addEventListener(A,create_proxy(B),to_js(C)if C else False)\n\t\treturn B\n\treturn E\ndef _get_elements(selector):\n\tA=selector;from pyscript.web import Element as B,ElementCollection as C\n\tif isinstance(A,str):return list(document.querySelectorAll(A))\n\telif isinstance(A,B):return[A._dom_element]\n\telif isinstance(A,C):return[A._dom_element for A in A]\n\telif isinstance(A,list):return A\n\telse:return[A]\ndef _create_wrapper(func):\n\tA=func;B=A\n\twhile hasattr(B,'__wrapped__'):B=B.__wrapped__\n\tE=inspect.signature(B);D=bool(E.parameters)\n\tif is_awaitable(A):\n\t\tif D:\n\t\t\tasync def C(event):return await A(event)\n\t\telse:\n\t\t\tasync def C(*B,**C):return await A()\n\telif D:\n\t\tdef C(event):return A(event)\n\telse:\n\t\tdef C(*B,**C):return A()\n\treturn wraps(A)(C)","fetch.py":"import json,js\nfrom pyscript.util import as_bytearray\nclass _FetchResponse:\n\tdef __init__(A,response):A._response=response\n\tdef __getattr__(A,attr):return getattr(A._response,attr)\n\tasync def arrayBuffer(B):\n\t\tA=await B._response.arrayBuffer()\n\t\tif hasattr(A,'to_py'):return A.to_py()\n\t\treturn memoryview(as_bytearray(A))\n\tasync def blob(A):return await A._response.blob()\n\tasync def bytearray(A):B=await A._response.arrayBuffer();return as_bytearray(B)\n\tasync def json(A):return json.loads(await A.text())\n\tasync def text(A):return await A._response.text()\nclass _FetchPromise:\n\tdef __init__(B,promise):A=promise;B._promise=A;A._response=None;A.arrayBuffer=B.arrayBuffer;A.blob=B.blob;A.bytearray=B.bytearray;A.json=B.json;A.text=B.text\n\t@staticmethod\n\tdef setup(promise,response):A=promise;A._response=_FetchResponse(response);return A._response\n\tasync def _get_response(A):\n\t\tif not A._promise._response:await A._promise\n\t\treturn A._promise._response\n\tasync def arrayBuffer(A):B=await A._get_response();return await B.arrayBuffer()\n\tasync def blob(A):B=await A._get_response();return await B.blob()\n\tasync def bytearray(A):B=await A._get_response();return await B.bytearray()\n\tasync def json(A):B=await A._get_response();return await B.json()\n\tasync def text(A):B=await A._get_response();return await B.text()\ndef fetch(url,**B):\n\tC=js.JSON.parse(json.dumps(B))\n\tdef D(response,*B):return _FetchPromise.setup(A,response)\n\tA=js.fetch(url,C).then(D);_FetchPromise(A);return A","ffi.py":"try:\n\timport js;from pyodide.ffi import create_proxy as _cp,to_js as _py_tjs,jsnull;from_entries=js.Object.fromEntries\n\tdef _to_js_wrapper(value,**A):\n\t\tB='dict_converter'\n\t\tif B not in A:A[B]=from_entries\n\t\treturn _py_tjs(value,**A)\nexcept:from jsffi import create_proxy as _cp;from jsffi import to_js as _to_js_wrapper;import js;jsnull=js.Object.getPrototypeOf(js.Object.prototype)\ndef create_proxy(func):return _cp(func)\ndef to_js(value,**A):return _to_js_wrapper(value,**A)\ndef is_none(value):A=value;return A is None or A is jsnull\ntry:from polyscript import ffi as _ffi;_assign=_ffi.assign;direct=_ffi.direct;gather=_ffi.gather;query=_ffi.query\nexcept:import js;_assign=js.Object.assign;direct=lambda source:source\ndef assign(source,*B):\n\tA=source\n\tfor C in B:_assign(A,to_js(C))\n\treturn A","flatted.py":"import json as _json\nclass _Known:\n\tdef __init__(A):A.key=[];A.value=[]\nclass _String:\n\tdef __init__(A,value):A.value=value\ndef _array_keys(value):\n\tA=[];B=0\n\tfor C in value:A.append(B);B+=1\n\treturn A\ndef _object_keys(value):\n\tA=[]\n\tfor B in value:A.append(B)\n\treturn A\ndef _is_array(value):return isinstance(value,(list,tuple))\ndef _is_object(value):return isinstance(value,dict)\ndef _is_string(value):return isinstance(value,str)\ndef _index(known,input,value):B=value;A=known;input.append(B);C=str(len(input)-1);A.key.append(B);A.value.append(C);return C\ndef _loop(keys,input,known,output):\n\tA=output\n\tfor B in keys:\n\t\tC=A[B]\n\t\tif isinstance(C,_String):_ref(B,input[int(C.value)],input,known,A)\n\treturn A\ndef _ref(key,value,input,known,output):\n\tB=known;A=value\n\tif _is_array(A)and A not in B:B.append(A);A=_loop(_array_keys(A),input,B,A)\n\telif _is_object(A)and A not in B:B.append(A);A=_loop(_object_keys(A),input,B,A)\n\toutput[key]=A\ndef _relate(known,input,value):\n\tB=known;A=value\n\tif _is_string(A)or _is_array(A)or _is_object(A):\n\t\ttry:return B.value[B.key.index(A)]\n\t\texcept:return _index(B,input,A)\n\treturn A\ndef _transform(known,input,value):\n\tB=known;A=value\n\tif _is_array(A):\n\t\tC=[]\n\t\tfor F in A:C.append(_relate(B,input,F))\n\t\treturn C\n\tif _is_object(A):\n\t\tD={}\n\t\tfor E in A:D[E]=_relate(B,input,A[E])\n\t\treturn D\n\treturn A\ndef _wrap(value):\n\tA=value\n\tif _is_string(A):return _String(A)\n\tif _is_array(A):\n\t\tB=0\n\t\tfor D in A:A[B]=_wrap(D);B+=1\n\telif _is_object(A):\n\t\tfor C in A:A[C]=_wrap(A[C])\n\treturn A\ndef parse(value,*C,**D):\n\tA=value;E=_json.loads(A,*C,**D);B=[]\n\tfor A in E:B.append(_wrap(A))\n\tinput=[]\n\tfor A in B:\n\t\tif isinstance(A,_String):input.append(A.value)\n\t\telse:input.append(A)\n\tA=input[0]\n\tif _is_array(A):return _loop(_array_keys(A),input,[A],A)\n\tif _is_object(A):return _loop(_object_keys(A),input,[A],A)\n\treturn A\ndef stringify(value,*D,**E):\n\tB=_Known();input=[];C=[];A=int(_index(B,input,value))\n\twhile A<len(input):C.append(_transform(B,input,input[A]));A+=1\n\treturn _json.dumps(C,*D,**E)","fs.py":"_B='pyscript'\n_A=None\nimport js\nfrom _pyscript import fs as _fs,interpreter\nfrom pyscript import window\nfrom pyscript.ffi import to_js\nfrom pyscript.context import RUNNING_IN_WORKER\nif RUNNING_IN_WORKER:from pyscript.context import sync as sync_with_worker;from polyscript import IDBMap\nmounted={}\nasync def _check_permission(details):A=details;B=A.handler;C=A.options;D=await B.queryPermission(C);return B if D=='granted'else _A\nasync def mount(path,mode='readwrite',root='',id=_B):\n\tC=path;js.console.warn('experimental pyscript.fs ⚠️');D=f\"{C}@{id}\"\n\tif C in mounted:\n\t\tfor H in mounted.keys():\n\t\t\tif H.startswith(f\"{C}@\")and H!=D:raise ValueError(f\"Path '{C}' is already mounted with a different ID. Unmount it first or use a different path.\")\n\tA=_A;B=_A;F={'id':id,'mode':mode}\n\tif root!='':F['startIn']=root\n\tif RUNNING_IN_WORKER:\n\t\tG=sync_with_worker.storeFSHandler(D,to_js(F))\n\t\tif isinstance(G,bool):E=G\n\t\telse:E=await G\n\t\tif E:\n\t\t\tJ=IDBMap.new(_fs.NAMESPACE);A=await J.get(D);B=await _check_permission(A)\n\t\t\tif B is _A:await js.Promise.resolve(sync_with_worker.getFSHandler(A.options));B=A.handler\n\t\telse:raise RuntimeError(_fs.ERROR)\n\telse:\n\t\tE=await _fs.idb.has(D)\n\t\tif E:\n\t\t\tA=await _fs.idb.get(D);B=await _check_permission(A)\n\t\t\tif B is _A:B=await _fs.getFileSystemDirectoryHandle(A.options)\n\t\telse:I=to_js(F);B=await _fs.getFileSystemDirectoryHandle(I);A={'handler':B,'options':I};await _fs.idb.set(D,to_js(A))\n\tmounted[C]=await interpreter.mountNativeFS(C,B)\nasync def sync(path):\n\tA=path\n\tif A not in mounted:raise KeyError(f\"Path '{A}' is not mounted. Use fs.mount() to mount it first.\")\n\tawait mounted[A].syncfs()\nasync def unmount(path):\n\tA=path\n\tif A not in mounted:raise KeyError(f\"Path '{A}' is not mounted. Cannot unmount.\")\n\tawait sync(A);interpreter._module.FS.unmount(A);del mounted[A]\nasync def revoke(path,id=_B):\n\tB=path;C=f\"{B}@{id}\"\n\tif RUNNING_IN_WORKER:A=sync_with_worker.deleteFSHandler(C)\n\telse:\n\t\tA=await _fs.idb.has(C)\n\t\tif A:A=await _fs.idb.delete(C)\n\tif A:\n\t\tinterpreter._module.FS.unmount(B)\n\t\tif B in mounted:del mounted[B]\n\treturn A","media.py":"from pyscript import window\nfrom pyscript.ffi import to_js\nclass Device:\n\tdef __init__(A,device):A._device_info=device\n\t@property\n\tdef id(self):return self._device_info.deviceId\n\t@property\n\tdef group(self):return self._device_info.groupId\n\t@property\n\tdef kind(self):return self._device_info.kind\n\t@property\n\tdef label(self):return self._device_info.label\n\tdef __getitem__(A,key):return getattr(A,key)\n\t@classmethod\n\tasync def request_stream(F,audio=False,video=True):\n\t\tE='video';D='audio';C=video;B=audio;A={}\n\t\tif isinstance(B,bool):A[D]=B\n\t\telif isinstance(B,dict):A[D]=B\n\t\tif isinstance(C,bool):A[E]=C\n\t\telif isinstance(C,dict):A[E]=C\n\t\treturn await window.navigator.mediaDevices.getUserMedia(to_js(A))\n\t@classmethod\n\tasync def load(A,audio=False,video=True):return await A.request_stream(audio=audio,video=video)\n\tasync def get_stream(A):B=A.kind.replace('input','').replace('output','');C={B:{'deviceId':{'exact':A.id}}};return await A.request_stream(**C)\nasync def list_devices():A=await window.navigator.mediaDevices.enumerateDevices();return[Device(A)for A in A]","storage.py":"_C='memoryview'\n_B='bytearray'\n_A='generic'\nfrom polyscript import storage as _polyscript_storage\nfrom pyscript.flatted import parse as _parse\nfrom pyscript.flatted import stringify as _stringify\nfrom pyscript.ffi import is_none\ndef _convert_to_idb(value):\n\tA=value\n\tif is_none(A):return _stringify(['null',0])\n\tif isinstance(A,(bool,float,int,str,list,dict,tuple)):return _stringify([_A,A])\n\tif isinstance(A,bytearray):return _stringify([_B,list(A)])\n\tif isinstance(A,memoryview):return _stringify([_C,list(A)])\n\traise TypeError(f\"Cannot serialize type {type(A).__name__} for storage.\")\ndef _convert_from_idb(value):\n\tC=value;A,B=_parse(C)\n\tif A=='null':return\n\tif A==_A:return B\n\tif A==_B:return bytearray(B)\n\tif A==_C:return memoryview(bytearray(B))\n\treturn C\nclass Storage(dict):\n\tdef __init__(B,store):A=store;super().__init__({A:_convert_from_idb(B)for(A,B)in A.entries()});B._store=A\n\tdef __delitem__(A,key):A._store.delete(key);super().__delitem__(key)\n\tdef __setitem__(B,key,value):A=value;B._store.set(key,_convert_to_idb(A));super().__setitem__(key,A)\n\tdef clear(A):A._store.clear();super().clear()\n\tasync def sync(A):await A._store.sync()\nasync def storage(name='',storage_class=Storage):\n\tif not name:raise ValueError('Storage name must be a non-empty string')\n\tA=await _polyscript_storage(f\"@pyscript/{name}\");return storage_class(A)","util.py":"import js,inspect\ndef as_bytearray(buffer):\n\tA=js.Uint8Array.new(buffer);B=A.length;C=bytearray(B)\n\tfor D in range(B):C[D]=A[D]\n\treturn C\nclass NotSupported:\n\tdef __init__(A,name,error):object.__setattr__(A,'name',name);object.__setattr__(A,'error',error)\n\tdef __repr__(A):return f\"<NotSupported {A.name} [{A.error}]>\"\n\tdef __getattr__(A,attr):raise AttributeError(A.error)\n\tdef __setattr__(A,attr,value):raise AttributeError(A.error)\n\tdef __call__(A,*B):raise TypeError(A.error)\ndef is_awaitable(obj):\n\tA=obj;from pyscript import config as C\n\tif C['type']=='mpy':\n\t\tB=repr(A)\n\t\tif'<closure <generator>'in B:return True\n\t\tif'<bound_method'in B and'<generator>'in B:return True\n\t\treturn inspect.isgeneratorfunction(A)\n\treturn inspect.iscoroutinefunction(A)","web.py":"_D='object'\n_C='tagName'\n_B='on_'\n_A=None\nfrom js import console\nfrom pyscript import document,Event\nfrom pyscript.ffi import create_proxy,is_none\ndef _wrap_if_not_none(dom_element):return Element.wrap_dom_element(dom_element)if not is_none(dom_element)else _A\ndef _find_by_id(dom_node,target_id):element_id=target_id[1:]if target_id.startswith('#')else target_id;result=dom_node.querySelector(f\"#{element_id}\");return _wrap_if_not_none(result)\ndef _find_and_wrap(dom_node,selector):return ElementCollection.wrap_dom_elements(dom_node.querySelectorAll(selector))\nclass Element:\n\telement_classes_by_tag_name={}\n\t@classmethod\n\tdef get_tag_name(cls):return cls.__name__.replace('_','')\n\t@classmethod\n\tdef register_element_classes(cls,element_classes):\n\t\tfor element_class in element_classes:tag_name=element_class.get_tag_name();cls.element_classes_by_tag_name[tag_name]=element_class\n\t@classmethod\n\tdef unregister_element_classes(cls,element_classes):\n\t\tfor element_class in element_classes:tag_name=element_class.get_tag_name();cls.element_classes_by_tag_name.pop(tag_name,_A)\n\t@classmethod\n\tdef wrap_dom_element(cls,dom_element):element_cls=cls.element_classes_by_tag_name.get(dom_element.tagName.lower(),cls);return element_cls(dom_element=dom_element)\n\tdef __init__(self,dom_element=_A,classes=_A,style=_A,**kwargs):\n\t\tif is_none(dom_element):self._dom_element=document.createElement(type(self).get_tag_name())\n\t\telse:self._dom_element=dom_element\n\t\tself._on_events={};self.update(classes=classes,style=style,**kwargs)\n\tdef __eq__(self,obj):return isinstance(obj,Element)and obj._dom_element==self._dom_element\n\tdef __getitem__(self,key):\n\t\tif isinstance(key,(int,slice)):return self.children[key]\n\t\tif isinstance(key,str):return _find_by_id(self._dom_element,key)\n\t\traise TypeError(f\"Element indices must be integers, slices, or strings, not {type(key).__name__}.\")\n\tdef __getattr__(self,name):\n\t\tif name.startswith(_B):return self.get_event(name)\n\t\tdom_name=self._normalize_attribute_name(name);return getattr(self._dom_element,dom_name)\n\tdef __setattr__(self,name,value):\n\t\tif name.startswith('_'):super().__setattr__(name,value)\n\t\telif name.startswith(_B):self.get_event(name).add_listener(value)\n\t\telse:dom_name=self._normalize_attribute_name(name);setattr(self._dom_element,dom_name,value)\n\tdef _normalize_attribute_name(self,name):\n\t\tif name.endswith('_'):name=name[:-1]\n\t\tif name=='for':return'htmlFor'\n\t\tif name=='class':return'className'\n\t\treturn name\n\tdef get_event(self,name):\n\t\tif not name.startswith(_B):raise ValueError(\"Event names must start with 'on_'.\")\n\t\tevent_name=name[3:]\n\t\tif not hasattr(self._dom_element,event_name):raise ValueError(f\"Element has no '{event_name}' event.\")\n\t\tif name in self._on_events:return self._on_events[name]\n\t\tev=Event();self._on_events[name]=ev;self._dom_element.addEventListener(event_name,create_proxy(ev.trigger));return ev\n\t@property\n\tdef children(self):return ElementCollection.wrap_dom_elements(self._dom_element.children)\n\t@property\n\tdef classes(self):\n\t\tif not hasattr(self,'_classes'):self._classes=Classes(self)\n\t\treturn self._classes\n\t@property\n\tdef style(self):\n\t\tif not hasattr(self,'_style'):self._style=Style(self)\n\t\treturn self._style\n\t@property\n\tdef parent(self):\n\t\tif is_none(self._dom_element.parentElement):return\n\t\treturn Element.wrap_dom_element(self._dom_element.parentElement)\n\tdef append(self,*items):\n\t\tfor item in items:\n\t\t\tif isinstance(item,Element):self._dom_element.appendChild(item._dom_element)\n\t\t\telif isinstance(item,ElementCollection):\n\t\t\t\tfor element in item:self._dom_element.appendChild(element._dom_element)\n\t\t\telif isinstance(item,(list,tuple)):\n\t\t\t\tfor child in item:self.append(child)\n\t\t\telif hasattr(item,_C):self._dom_element.appendChild(item)\n\t\t\telif hasattr(item,'length'):\n\t\t\t\tfor element in item:self._dom_element.appendChild(element)\n\t\t\telif isinstance(item,(str,int,float,bool)):self._dom_element.append(item)\n\t\t\telse:raise TypeError(f\"Cannot append {type(item).__name__} to element.\")\n\tdef clone(self,clone_id=_A):clone=Element.wrap_dom_element(self._dom_element.cloneNode(True));clone.id=clone_id;return clone\n\tdef find(self,selector):return _find_and_wrap(self._dom_element,selector)\n\tdef show_me(self):self._dom_element.scrollIntoView()\n\tdef update(self,classes=_A,style=_A,**kwargs):\n\t\tif classes:\n\t\t\tif isinstance(classes,str):self.classes.add(classes)\n\t\t\telse:\n\t\t\t\tfor class_name in classes:self.classes.add(class_name)\n\t\tif style:\n\t\t\tfor(key,value)in style.items():self.style[key]=value\n\t\tfor(name,value)in kwargs.items():setattr(self,name,value)\nclass Classes(set):\n\tdef __init__(self,element):self._class_list=element._dom_element.classList;super().__init__(self._class_list)\n\tdef _extract_class_names(self,class_name):return[name for name in class_name.split()if name]if' 'in class_name else[class_name]\n\tdef add(self,class_name):\n\t\tfor name in self._extract_class_names(class_name):super().add(name);self._class_list.add(name)\n\tdef remove(self,class_name):\n\t\tfor name in self._extract_class_names(class_name):\n\t\t\tif name in self:super().remove(name);self._class_list.remove(name)\n\t\t\telse:console.warn(f\"Class '{name}' not found in element classes.\")\n\tdef discard(self,class_name):\n\t\tfor name in self._extract_class_names(class_name):\n\t\t\tsuper().discard(name)\n\t\t\tif name in self._class_list:self._class_list.remove(name)\n\tdef clear(self):\n\t\tsuper().clear()\n\t\twhile self._class_list.length>0:self._class_list.remove(self._class_list.item(0))\nclass Style(dict):\n\tdef __init__(self,element):self._style=element._dom_element.style;super().__init__()\n\tdef __setitem__(self,key,value):super().__setitem__(key,value);self._style.setProperty(key,str(value))\n\tdef __delitem__(self,key):super().__delitem__(key);self._style.removeProperty(key)\nclass HasOptions:\n\t@property\n\tdef options(self):\n\t\tif not hasattr(self,'_options'):self._options=Options(self)\n\t\treturn self._options\nclass Options:\n\tdef __init__(self,element):self._element=element\n\tdef __getitem__(self,key):return self.options[key]\n\tdef __iter__(self):yield from self.options\n\tdef __len__(self):return len(self.options)\n\tdef __repr__(self):return f\"{self.__class__.__name__} (length: {len(self)}) {self.options}\"\n\t@property\n\tdef options(self):return[Element.wrap_dom_element(o)for o in self._element._dom_element.options]\n\t@property\n\tdef selected(self):return self.options[self._element._dom_element.selectedIndex]\n\tdef add(self,value=_A,html=_A,text=_A,before=_A,**kwargs):\n\t\tif value:kwargs['value']=value\n\t\tif html:kwargs['innerHTML']=html\n\t\tif text:kwargs['text']=text\n\t\tnew_option=option(**kwargs)\n\t\tif before and isinstance(before,Element):before=before._dom_element\n\t\tself._element._dom_element.add(new_option._dom_element,before)\n\tdef clear(self):self._element._dom_element.length=0\n\tdef remove(self,index):self._element._dom_element.remove(index)\nclass ContainerElement(Element):\n\tdef __init__(self,*args,children=_A,dom_element=_A,style=_A,classes=_A,**kwargs):\n\t\tsuper().__init__(dom_element=dom_element,style=style,classes=classes,**kwargs)\n\t\tfor child in list(args)+(children or[]):\n\t\t\tif isinstance(child,(Element,ElementCollection)):self.append(child)\n\t\t\telse:self._dom_element.insertAdjacentHTML('beforeend',child)\n\tdef __iter__(self):yield from self.children\nclass ElementCollection:\n\t@classmethod\n\tdef wrap_dom_elements(cls,dom_elements):return cls([Element.wrap_dom_element(dom_element)for dom_element in dom_elements])\n\tdef __init__(self,elements):self._elements=elements\n\tdef __eq__(self,obj):return isinstance(obj,ElementCollection)and obj._elements==self._elements\n\tdef __getitem__(self,key):\n\t\tif isinstance(key,int):return self._elements[key]\n\t\tif isinstance(key,slice):return ElementCollection(self._elements[key])\n\t\tif isinstance(key,str):\n\t\t\tfor element in self._elements:\n\t\t\t\telement_id=key[1:]if key.startswith('#')else key\n\t\t\t\tif element.id==element_id:return element\n\t\t\t\tresult=_find_by_id(element._dom_element,element_id)\n\t\t\t\tif result:return result\n\t\t\treturn\n\t\traise TypeError(f\"Collection indices must be integers, slices, or strings, not {type(key).__name__}\")\n\tdef __iter__(self):yield from self._elements\n\tdef __len__(self):return len(self._elements)\n\tdef __repr__(self):return f\"{self.__class__.__name__} (length: {len(self._elements)}) {self._elements}\"\n\t@property\n\tdef elements(self):return self._elements\n\tdef find(self,selector):\n\t\telements=[]\n\t\tfor element in self._elements:elements.extend(_find_and_wrap(element._dom_element,selector))\n\t\treturn ElementCollection(elements)\n\tdef update_all(self,classes=_A,style=_A,**kwargs):\n\t\tfor element in self._elements:element.update(classes=classes,style=style,**kwargs)\nclass canvas(ContainerElement):\n\tdef download(self,filename='snapped.png'):download_link=a(download=filename,href=self._dom_element.toDataURL());self.append(download_link);download_link._dom_element.click()\n\tdef draw(self,what,width=_A,height=_A):\n\t\tif isinstance(what,Element):what=what._dom_element\n\t\tctx=self._dom_element.getContext('2d')\n\t\tif width or height:ctx.drawImage(what,0,0,width,height)\n\t\telse:ctx.drawImage(what,0,0)\nclass video(ContainerElement):\n\tdef snap(self,to=_A,width=_A,height=_A):\n\t\tB='CANVAS';A='Element to snap to must be a canvas.';width=width if width else self.videoWidth;height=height if height else self.videoHeight\n\t\tif is_none(to):to=canvas(width=width,height=height)\n\t\telif isinstance(to,Element):\n\t\t\tif to.tag!='canvas':raise TypeError(A)\n\t\telif getattr(to,_C,'')==B:to=canvas(dom_element=to)\n\t\telif isinstance(to,str):\n\t\t\tnodelist=document.querySelectorAll(to)\n\t\t\tif nodelist.length==0:raise TypeError(f\"No element with selector {to} to snap to.\")\n\t\t\tif nodelist[0].tagName!=B:raise TypeError(A)\n\t\t\tto=canvas(dom_element=nodelist[0])\n\t\tto.draw(self,width,height);return to\nclass datalist(ContainerElement,HasOptions):0\nclass optgroup(ContainerElement,HasOptions):0\nclass select(ContainerElement,HasOptions):0\nCONTAINER_TAGS=['a','abbr','address','article','aside','audio','b','blockquote','body','button','caption','cite','code','colgroup','data','dd','del','details','dialog','div','dl','dt','em','fieldset','figcaption','figure','footer','form','h1','h2','h3','h4','h5','h6','head','header','hgroup','html','i','iframe','ins','kbd','label','legend','li','main','map','mark','menu','meta','meter','nav',_D,'ol','option','output','p','param','picture','pre','progress','q','s','script','section','small','span','strong','style','sub','summary','sup','table','tbody','td','template','textarea','tfoot','th','thead','time','title','tr','u','ul','var','wbr']\nVOID_TAGS=['area','base','br','col','embed','hr','img','input','link','source','track']\ndef _create_element_classes():\n\tA='__doc__';classes=[canvas,video,datalist,optgroup,select]\n\tfor tag in CONTAINER_TAGS:class_name=f\"{tag}_\"if tag in('del','map',_D)else tag;doc=f\"HTML <{tag}> element. Ref: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/{tag}\";cls=type(class_name,(ContainerElement,),{A:doc});globals()[class_name]=cls;classes.append(cls)\n\tfor tag in VOID_TAGS:class_name=f\"{tag}_\"if tag=='input'else tag;doc=f\"HTML <{tag}> element. Ref: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/{tag}\";cls=type(class_name,(Element,),{A:doc});globals()[class_name]=cls;classes.append(cls)\n\tElement.register_element_classes(classes)\n_create_element_classes()\nclass Page:\n\tdef __init__(self):self.html=Element.wrap_dom_element(document.documentElement);self.body=Element.wrap_dom_element(document.body);self.head=Element.wrap_dom_element(document.head)\n\tdef __getitem__(self,key):return _find_by_id(document,key)\n\t@property\n\tdef title(self):return document.title\n\t@title.setter\n\tdef title(self,value):document.title=value\n\tdef append(self,*items):self.body.append(*items)\n\tdef find(self,selector):return _find_and_wrap(document,selector)\npage=Page()","websocket.py":"import js\nfrom pyscript.ffi import create_proxy\nfrom pyscript.util import as_bytearray,is_awaitable\ndef _attach_event_handler(websocket,handler_name,handler_function):\n\tA=handler_function\n\tif is_awaitable(A):\n\t\tasync def C(event):await A(WebSocketEvent(event))\n\t\tB=create_proxy(C)\n\telse:B=create_proxy(lambda event:A(WebSocketEvent(event)))\n\tsetattr(websocket,handler_name,B)\nclass WebSocketEvent:\n\tdef __init__(A,event):A._event=event\n\tdef __getattr__(B,attr):\n\t\tA=getattr(B._event,attr)\n\t\tif attr=='data'and not isinstance(A,str):\n\t\t\tif hasattr(A,'to_py'):return A.to_py()\n\t\t\telse:return memoryview(as_bytearray(A))\n\t\treturn A\nclass WebSocket:\n\tCONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3\n\tdef __init__(B,url,protocols=None,**D):\n\t\tC=protocols\n\t\tif C:A=js.WebSocket.new(url,C)\n\t\telse:A=js.WebSocket.new(url)\n\t\tA.binaryType='arraybuffer';object.__setattr__(B,'_js_websocket',A)\n\t\tfor(E,F)in D.items():setattr(B,E,F)\n\tdef __getattr__(A,attr):return getattr(A._js_websocket,attr)\n\tdef __setattr__(B,attr,value):\n\t\tC=value;A=attr\n\t\tif A in['onclose','onerror','onmessage','onopen']:_attach_event_handler(B._js_websocket,A,C)\n\t\telse:setattr(B._js_websocket,A,C)\n\tdef send(B,data):\n\t\tA=data\n\t\tif isinstance(A,str):B._js_websocket.send(A)\n\t\telse:\n\t\t\tC=js.Uint8Array.new(len(A))\n\t\t\tfor(D,E)in enumerate(A):C[D]=E\n\t\t\tB._js_websocket.send(C)\n\tdef close(B,code=None,reason=None):\n\t\tC=reason;A=code\n\t\tif A and C:B._js_websocket.close(A,C)\n\t\telif A:B._js_websocket.close(A)\n\t\telse:B._js_websocket.close()","workers.py":"import js,json\nfrom polyscript import workers as _polyscript_workers\nclass _ReadOnlyWorkersProxy:\n\tdef __getitem__(A,name):return js.Reflect.get(_polyscript_workers,name)\n\tdef __getattr__(A,name):return js.Reflect.get(_polyscript_workers,name)\nworkers=_ReadOnlyWorkersProxy()\nasync def create_named_worker(src,name,config=None,type='py'):\n\tB=config;A=js.document.createElement('script');A.type=type;A.src=src;A.setAttribute('worker','');A.setAttribute('name',name)\n\tif B:\n\t\tif isinstance(B,str):C=B\n\t\telse:C=json.dumps(B)\n\t\tA.setAttribute('config',C)\n\tjs.document.body.append(A);return await workers[name]"}}),vo.push("import pyscript as _pyscript"),vo.push(...["_Path","_path","_os","_pyscript"].map(e=>`del ${e}`)),vo.push("\n");const Bo=vo.join("\n"),jo=Eo.join("\n"),So=e=>Oo.main[e],xo=e=>Oo.worker[e],Ro=(e,t,n,r)=>{e[n]=()=>{const e=r?[r]:[];return e.push(...t(n)),e.map(v).join("\n")}},Co=(e,t)=>{const n="mpy"===t?Bo.replace(jo,""):Bo,r={};return Ro(r,e,"codeBeforeRun",n),Ro(r,e,"codeBeforeRunAsync",n),Ro(r,e,"codeAfterRun"),Ro(r,e,"codeAfterRunAsync"),r},$o=(e,t)=>{const n=[...xo(t)];if(n.length){const r=Ao(e[`_${t}`]||(t.endsWith("Async")?async(e,t,...n)=>{for(const r of n)await r(e,t)}:(e,t,...n)=>{for(const r of n)r(e,t)})),s=n.map(Ao).join(", ");return Function(`return(w,x)=>(${r})(w,x,...[${s}])`)()}},Do=wo({typeof:"function"}),To=wo({typeof:"string"}),Po='\n import builtins\n def input(prompt=""):\n raise Exception("\\n ".join([\n "input() doesn\'t work when PyScript runs in the main thread.",\n "Consider using the worker attribute: https://pyscript.github.io/docs/2023.11.2/user-guide/workers/"\n ]))\n\n builtins.input = input\n del builtins\n del input\n',Oo={main:{onWorker:new Do,onReady:new Do,onBeforeRun:new Do,onBeforeRunAsync:new Do,onAfterRun:new Do,onAfterRunAsync:new Do,codeBeforeRun:new To([Po]),codeBeforeRunAsync:new To,codeAfterRun:new To,codeAfterRunAsync:new To},worker:{onReady:new Do,onBeforeRun:new Do,onBeforeRunAsync:new Do([({interpreter:e})=>{e.registerJsModule("_pyscript",{fs:{ERROR:"storage permissions not granted",NAMESPACE:"@pyscript.fs"},interpreter:e})}]),onAfterRun:new Do,onAfterRunAsync:new Do,codeBeforeRun:new To,codeBeforeRunAsync:new To,codeAfterRun:new To,codeAfterRunAsync:new To}};var Mo={get core(){return import("./codemirror-lAW8P_b2.js")},get state(){return import("./codemirror_state-BNbbkoNK.js")},get python(){return import("./codemirror_lang-python-C__shTTP.js")},get language(){return import("./codemirror_language-BRdaMe3x.js").then(function(e){return e.x})},get view(){return import("./codemirror_view-WuoIJFLW.js").then(function(e){return e.t})},get commands(){return import("./codemirror_commands-Og5MXTi1.js")}},Fo=Object.freeze({__proto__:null,default:Mo});
|
|
2
2
|
/*! (c) PyScript Development Team */
|
|
3
|
-
const Lo=e=>import("./donkey-
|
|
4
|
-
//# sourceMappingURL=core-
|
|
3
|
+
const Lo=e=>import("./donkey-DZXEwrem.js").then(t=>t.default(e)),No=({tagName:e})=>"SCRIPT"===e,[Io,Uo]=[...Ps.entries()].map(([e,t])=>async function(n,r){await Vs.get(e).plugins;const s=Ds.call(new $s(null,Yo.get(e)),n,{...r,type:t});return B(s.sync,po),s.ready}),[{PyWorker:Ho,MPWorker:Wo,hooks:qo,config:zo,whenDefined:Go},Jo]=((e,t,n=globalThis)=>{const r=Symbol.for(e),s=r in n;return[s?n[r]:Object.defineProperty(n,r,{value:t})[r],s]})("@pyscript/core",{PyWorker:Io,MPWorker:Uo,hooks:Oo,config:{},whenDefined:Rs}),Ko=e=>e?.interpreter&&Ks(e.interpreter),Yo=new Map;for(const[t,n]of Ps){if(Jo)break;const r=(e,n,r)=>{n?r.then(()=>M(e,t,"done")):M(e,t,"done")};let{config:s,configURL:o,parser:a,plugins:i,error:c}=Vs.get(t),l=0;const p=(e=t)=>`${e}-${l++}`,f=async(e,n,r)=>{if(e.hasAttribute("src"))try{return await Hs(e.getAttribute("src")).then(Us)}catch(e){n.stderr(e)}if(r)return v(e.textContent);const s=v(E(e.innerHTML));return console.warn(`Deprecated: use <script type="${t}"> for an always safe content parsing:\n`,s),s};let u,d=!1;const m=({XWorker:e,interpreter:t,io:n})=>{d||(d=!0,t.registerJsModule("_pyscript",{PyWorker:function(...t){const r=e(...t);return r.onerror=({error:e})=>n.stderr(e),r},fs:lo,interpreter:t,js_import:(...e)=>Promise.all(e.map(e=>import(e))),get target(){return No(u)?u.target.id:u.id}}))};i().then(()=>{if(c)return;const i=new Map,l={main:{...Co(So,t),async onReady(e,n){m(e);for(const t of So("onReady"))await t(e,n);if(i.has(n)){let{message:t}=i.get(n);i.delete(n);const r=t===ss;return t=`(${Ls.CONFLICTING_CODE}) ${t} for `,t+=n.cloneNode(r).outerHTML,void e.io.stderr(t)}if(No(n)){const s=!Y(n),o=n.getAttribute("target"),a=o?as(n,o):document.createElement("script-py");if(!o){const{head:e,body:t}=document;e.contains(n)?t.append(a):n.after(a)}a.id||(a.id=p()),x(n,"target",{value:a}),M(n,t,"ready"),r(n,s,e["run"+(s?"Async":"")](await f(n,e.io,!0)))}else n._wrap.resolve(e);console.debug("[pyscript/main] PyScript Ready")},onWorker(e,t){B(t.sync,po);for(const n of So("onWorker"))n(e,t)},onBeforeRun(e,t){u=t,mo(So,e,t,"onBeforeRun")},onBeforeRunAsync:(e,t)=>(u=t,mo(So,e,t,"onBeforeRunAsync")),onAfterRun(e,t){mo(So,e,t,"onAfterRun")},onAfterRunAsync:(e,t)=>mo(So,e,t,"onAfterRunAsync")},worker:{...Co(xo,t),get onReady(){return $o(this,"onReady")},get onBeforeRun(){return $o(this,"onBeforeRun")},get onBeforeRunAsync(){return $o(this,"onBeforeRunAsync")},get onAfterRun(){return $o(this,"onAfterRun")},get onAfterRunAsync(){return $o(this,"onAfterRunAsync")}}};Yo.set(t,l);let d=Ko(s);if(!d){const e="script[type='module'][offline]",t=document.querySelector(e)?.src;t&&import.meta.url.startsWith(t.replace(/\.js$/,""))&&(d=`./pyscript/${n}/${n}.mjs`,d=Ko({interpreter:d}))}xs(t,{config:s,configURL:o,interpreter:n,hooks:l,version:d,env:`${t}-script`,parser:a&&new URL(a,location.href).href,onerror(e,t){i.set(t,e)}}),customElements.define(`${t}-script`,class extends HTMLElement{constructor(){B(super(),{_wrap:e(),srcCode:"",executed:!1})}get id(){return super.id||(super.id=p())}set id(e){super.id=e}async connectedCallback(){if(!this.executed){this.executed=!0;const e=!Y(this),{io:n,run:s,runAsync:o}=await this._wrap.promise;this.srcCode=await f(this,n,!this.childElementCount),this.replaceChildren(),this.style.display="block",M(this,t,"ready"),r(this,e,(e?o:s)(this.srcCode))}}})}),zo[t]=structuredClone(s)}export{$s as H,Ps as T,Ds as X,v as a,Ss as b,Mo as c,S as d,qo as e,s as f,B as g,an as h,Po as i,xs as j,zs as k,jt as l,Us as m,oe as n,Ko as o,Wo as p,Ho as q,Ks as r,Bo as s,zo as t,Lo as u,jo as v,e as w,Go as x};
|
|
4
|
+
//# sourceMappingURL=core-Bj5dGi2O.js.map
|