aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-03-17 22:19:18 +0900
committernsfisis <nsfisis@gmail.com>2025-03-17 22:19:18 +0900
commitfacdf9357e576f6d47e7dd23f4f7b2b34f6a8d30 (patch)
tree21c6aee60b3ddc26ff88ee3273c887125bb5828f
parentc739bbfa7cbb68a51755254d59abf15e514795ca (diff)
downloadPHPerKaigi2025-tokens-facdf9357e576f6d47e7dd23f4f7b2b34f6a8d30.tar.gz
PHPerKaigi2025-tokens-facdf9357e576f6d47e7dd23f4f7b2b34f6a8d30.tar.zst
PHPerKaigi2025-tokens-facdf9357e576f6d47e7dd23f4f7b2b34f6a8d30.zip
commit files
-rw-r--r--.gitignore2
-rw-r--r--README.md13
-rw-r--r--docs/assets/index-Cfp0VNTF.css1
-rw-r--r--docs/assets/index-CifHWjMi.js50
-rw-r--r--docs/assets/php-wasm-bridge-BCntMcWX.js8366
-rw-r--r--docs/favicon.icobin0 -> 4286 bytes
-rw-r--r--docs/index.html14
-rwxr-xr-xdocs/php-wasm.wasmbin0 -> 5083643 bytes
-rw-r--r--eslint.config.js28
-rw-r--r--index.html13
-rw-r--r--package-lock.json3420
-rw-r--r--package.json33
-rw-r--r--public/favicon.icobin0 -> 4286 bytes
-rwxr-xr-xpublic/php-wasm.wasmbin0 -> 5083643 bytes
-rw-r--r--src/components/App.tsx72
-rw-r--r--src/components/FuncExpectedAnswer.tsx59
-rw-r--r--src/components/FuncMyAnswer.tsx32
-rw-r--r--src/components/QuizGroupSection.tsx19
-rw-r--r--src/components/QuizSection.tsx19
-rw-r--r--src/exec_php.ts95
-rw-r--r--src/main.tsx11
-rw-r--r--src/php-wasm-bridge.js8366
-rw-r--r--src/quiz.ts10
-rw-r--r--src/quiz_data.ts74
-rw-r--r--src/styles.css73
-rw-r--r--src/vite-env.d.ts1
-rwxr-xr-xtools/compile-php-to-wasm.sh10
-rw-r--r--tsconfig.app.json24
-rw-r--r--tsconfig.json7
-rw-r--r--tsconfig.node.json22
-rw-r--r--vite.config.ts10
-rw-r--r--wasm/Dockerfile66
-rw-r--r--wasm/php-wasm.c22
33 files changed, 20932 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..66ae19c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/.vite
+/node_modules
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..adb57de
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# PHPerKaigi 2025 デジタルサーカス株式会社トークン問題
+
+## 概要
+
+[PHPerKaigi 2025](https://phperkaigi.jp/2025/) の PHPer チャレンジにおける、[デジタルサーカス株式会社](https://www.dgcircus.com/)からのトークン問題です。
+
+## 問題
+
+
+## 注意
+
+この問題は、ソースコードを直接閲覧すれば容易にトークンを得ることができます。
+自力で解きたい場合は GitHub のソースコードやブラウザの DevTools などは開かないことをお勧めします。
diff --git a/docs/assets/index-Cfp0VNTF.css b/docs/assets/index-Cfp0VNTF.css
new file mode 100644
index 0000000..d3f6506
--- /dev/null
+++ b/docs/assets/index-Cfp0VNTF.css
@@ -0,0 +1 @@
+body{margin:0;padding:0;font-size:14px;background-color:#ee0}table#layout{width:800px;margin:0 auto;border:4px solid #000}#layout td{border:2px solid #00e;padding:10px;vertical-align:top}#header{text-align:center;font-weight:700;font-size:32px;background-color:#e0e;color:#fff}#sidebar{width:200px;background-color:#ec0}#sidebar .hidden{color:#ec0}#content{background-color:#ee0}code{background-color:#eee;padding:2px 4px}input[type=text]{width:180px;background-color:#eee;border:1px solid #000;padding:2px 4px}.marquee{overflow:hidden;white-space:nowrap;box-sizing:border-box;width:300px}.marquee span{display:inline-block;padding-left:100%;animation:marquee-scroll 10s linear infinite}@keyframes marquee-scroll{0%{transform:translate(0)}to{transform:translate(-100%)}}
diff --git a/docs/assets/index-CifHWjMi.js b/docs/assets/index-CifHWjMi.js
new file mode 100644
index 0000000..cb6e6a7
--- /dev/null
+++ b/docs/assets/index-CifHWjMi.js
@@ -0,0 +1,50 @@
+(function(){const N=document.createElement("link").relList;if(N&&N.supports&&N.supports("modulepreload"))return;for(const L of document.querySelectorAll('link[rel="modulepreload"]'))Z(L);new MutationObserver(L=>{for(const M of L)if(M.type==="childList")for(const D of M.addedNodes)D.tagName==="LINK"&&D.rel==="modulepreload"&&Z(D)}).observe(document,{childList:!0,subtree:!0});function m(L){const M={};return L.integrity&&(M.integrity=L.integrity),L.referrerPolicy&&(M.referrerPolicy=L.referrerPolicy),L.crossOrigin==="use-credentials"?M.credentials="include":L.crossOrigin==="anonymous"?M.credentials="omit":M.credentials="same-origin",M}function Z(L){if(L.ep)return;L.ep=!0;const M=m(L);fetch(L.href,M)}})();var _i={exports:{}},gr={},Ci={exports:{}},A={};/**
+ * @license React
+ * react.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var Pa;function Mf(){if(Pa)return A;Pa=1;var S=Symbol.for("react.element"),N=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),Z=Symbol.for("react.strict_mode"),L=Symbol.for("react.profiler"),M=Symbol.for("react.provider"),D=Symbol.for("react.context"),H=Symbol.for("react.forward_ref"),I=Symbol.for("react.suspense"),b=Symbol.for("react.memo"),te=Symbol.for("react.lazy"),V=Symbol.iterator;function X(c){return c===null||typeof c!="object"?null:(c=V&&c[V]||c["@@iterator"],typeof c=="function"?c:null)}var G={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Me=Object.assign,ee={};function $(c,v,U){this.props=c,this.context=v,this.refs=ee,this.updater=U||G}$.prototype.isReactComponent={},$.prototype.setState=function(c,v){if(typeof c!="object"&&typeof c!="function"&&c!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,c,v,"setState")},$.prototype.forceUpdate=function(c){this.updater.enqueueForceUpdate(this,c,"forceUpdate")};function et(){}et.prototype=$.prototype;function Ae(c,v,U){this.props=c,this.context=v,this.refs=ee,this.updater=U||G}var Ye=Ae.prototype=new et;Ye.constructor=Ae,Me(Ye,$.prototype),Ye.isPureReactComponent=!0;var ve=Array.isArray,ze=Object.prototype.hasOwnProperty,ke={current:null},Ce={key:!0,ref:!0,__self:!0,__source:!0};function Te(c,v,U){var B,W={},K=null,ne=null;if(v!=null)for(B in v.ref!==void 0&&(ne=v.ref),v.key!==void 0&&(K=""+v.key),v)ze.call(v,B)&&!Ce.hasOwnProperty(B)&&(W[B]=v[B]);var J=arguments.length-2;if(J===1)W.children=U;else if(1<J){for(var oe=Array(J),Ge=0;Ge<J;Ge++)oe[Ge]=arguments[Ge+2];W.children=oe}if(c&&c.defaultProps)for(B in J=c.defaultProps,J)W[B]===void 0&&(W[B]=J[B]);return{$$typeof:S,type:c,key:K,ref:ne,props:W,_owner:ke.current}}function Xe(c,v){return{$$typeof:S,type:c.type,key:v,ref:c.ref,props:c.props,_owner:c._owner}}function ie(c){return typeof c=="object"&&c!==null&&c.$$typeof===S}function pe(c){var v={"=":"=0",":":"=2"};return"$"+c.replace(/[=:]/g,function(U){return v[U]})}var De=/\/+/g;function Fe(c,v){return typeof c=="object"&&c!==null&&c.key!=null?pe(""+c.key):v.toString(36)}function ot(c,v,U,B,W){var K=typeof c;(K==="undefined"||K==="boolean")&&(c=null);var ne=!1;if(c===null)ne=!0;else switch(K){case"string":case"number":ne=!0;break;case"object":switch(c.$$typeof){case S:case N:ne=!0}}if(ne)return ne=c,W=W(ne),c=B===""?"."+Fe(ne,0):B,ve(W)?(U="",c!=null&&(U=c.replace(De,"$&/")+"/"),ot(W,v,U,"",function(Ge){return Ge})):W!=null&&(ie(W)&&(W=Xe(W,U+(!W.key||ne&&ne.key===W.key?"":(""+W.key).replace(De,"$&/")+"/")+c)),v.push(W)),1;if(ne=0,B=B===""?".":B+":",ve(c))for(var J=0;J<c.length;J++){K=c[J];var oe=B+Fe(K,J);ne+=ot(K,v,U,oe,W)}else if(oe=X(c),typeof oe=="function")for(c=oe.call(c),J=0;!(K=c.next()).done;)K=K.value,oe=B+Fe(K,J++),ne+=ot(K,v,U,oe,W);else if(K==="object")throw v=String(c),Error("Objects are not valid as a React child (found: "+(v==="[object Object]"?"object with keys {"+Object.keys(c).join(", ")+"}":v)+"). If you meant to render a collection of children, use an array instead.");return ne}function ht(c,v,U){if(c==null)return c;var B=[],W=0;return ot(c,B,"","",function(K){return v.call(U,K,W++)}),B}function Be(c){if(c._status===-1){var v=c._result;v=v(),v.then(function(U){(c._status===0||c._status===-1)&&(c._status=1,c._result=U)},function(U){(c._status===0||c._status===-1)&&(c._status=2,c._result=U)}),c._status===-1&&(c._status=0,c._result=v)}if(c._status===1)return c._result.default;throw c._result}var fe={current:null},k={transition:null},j={ReactCurrentDispatcher:fe,ReactCurrentBatchConfig:k,ReactCurrentOwner:ke};function _(){throw Error("act(...) is not supported in production builds of React.")}return A.Children={map:ht,forEach:function(c,v,U){ht(c,function(){v.apply(this,arguments)},U)},count:function(c){var v=0;return ht(c,function(){v++}),v},toArray:function(c){return ht(c,function(v){return v})||[]},only:function(c){if(!ie(c))throw Error("React.Children.only expected to receive a single React element child.");return c}},A.Component=$,A.Fragment=m,A.Profiler=L,A.PureComponent=Ae,A.StrictMode=Z,A.Suspense=I,A.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=j,A.act=_,A.cloneElement=function(c,v,U){if(c==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+c+".");var B=Me({},c.props),W=c.key,K=c.ref,ne=c._owner;if(v!=null){if(v.ref!==void 0&&(K=v.ref,ne=ke.current),v.key!==void 0&&(W=""+v.key),c.type&&c.type.defaultProps)var J=c.type.defaultProps;for(oe in v)ze.call(v,oe)&&!Ce.hasOwnProperty(oe)&&(B[oe]=v[oe]===void 0&&J!==void 0?J[oe]:v[oe])}var oe=arguments.length-2;if(oe===1)B.children=U;else if(1<oe){J=Array(oe);for(var Ge=0;Ge<oe;Ge++)J[Ge]=arguments[Ge+2];B.children=J}return{$$typeof:S,type:c.type,key:W,ref:K,props:B,_owner:ne}},A.createContext=function(c){return c={$$typeof:D,_currentValue:c,_currentValue2:c,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},c.Provider={$$typeof:M,_context:c},c.Consumer=c},A.createElement=Te,A.createFactory=function(c){var v=Te.bind(null,c);return v.type=c,v},A.createRef=function(){return{current:null}},A.forwardRef=function(c){return{$$typeof:H,render:c}},A.isValidElement=ie,A.lazy=function(c){return{$$typeof:te,_payload:{_status:-1,_result:c},_init:Be}},A.memo=function(c,v){return{$$typeof:b,type:c,compare:v===void 0?null:v}},A.startTransition=function(c){var v=k.transition;k.transition={};try{c()}finally{k.transition=v}},A.unstable_act=_,A.useCallback=function(c,v){return fe.current.useCallback(c,v)},A.useContext=function(c){return fe.current.useContext(c)},A.useDebugValue=function(){},A.useDeferredValue=function(c){return fe.current.useDeferredValue(c)},A.useEffect=function(c,v){return fe.current.useEffect(c,v)},A.useId=function(){return fe.current.useId()},A.useImperativeHandle=function(c,v,U){return fe.current.useImperativeHandle(c,v,U)},A.useInsertionEffect=function(c,v){return fe.current.useInsertionEffect(c,v)},A.useLayoutEffect=function(c,v){return fe.current.useLayoutEffect(c,v)},A.useMemo=function(c,v){return fe.current.useMemo(c,v)},A.useReducer=function(c,v,U){return fe.current.useReducer(c,v,U)},A.useRef=function(c){return fe.current.useRef(c)},A.useState=function(c){return fe.current.useState(c)},A.useSyncExternalStore=function(c,v,U){return fe.current.useSyncExternalStore(c,v,U)},A.useTransition=function(){return fe.current.useTransition()},A.version="18.3.1",A}var Na;function Ri(){return Na||(Na=1,Ci.exports=Mf()),Ci.exports}/**
+ * @license React
+ * react-jsx-runtime.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var za;function Df(){if(za)return gr;za=1;var S=Ri(),N=Symbol.for("react.element"),m=Symbol.for("react.fragment"),Z=Object.prototype.hasOwnProperty,L=S.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,M={key:!0,ref:!0,__self:!0,__source:!0};function D(H,I,b){var te,V={},X=null,G=null;b!==void 0&&(X=""+b),I.key!==void 0&&(X=""+I.key),I.ref!==void 0&&(G=I.ref);for(te in I)Z.call(I,te)&&!M.hasOwnProperty(te)&&(V[te]=I[te]);if(H&&H.defaultProps)for(te in I=H.defaultProps,I)V[te]===void 0&&(V[te]=I[te]);return{$$typeof:N,type:H,key:X,ref:G,props:V,_owner:L.current}}return gr.Fragment=m,gr.jsx=D,gr.jsxs=D,gr}var Ta;function Ff(){return Ta||(Ta=1,_i.exports=Df()),_i.exports}var F=Ff(),ge=Ri(),Tl={},Pi={exports:{}},Ke={},Ni={exports:{}},zi={};/**
+ * @license React
+ * scheduler.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var Ra;function If(){return Ra||(Ra=1,function(S){function N(k,j){var _=k.length;k.push(j);e:for(;0<_;){var c=_-1>>>1,v=k[c];if(0<L(v,j))k[c]=j,k[_]=v,_=c;else break e}}function m(k){return k.length===0?null:k[0]}function Z(k){if(k.length===0)return null;var j=k[0],_=k.pop();if(_!==j){k[0]=_;e:for(var c=0,v=k.length,U=v>>>1;c<U;){var B=2*(c+1)-1,W=k[B],K=B+1,ne=k[K];if(0>L(W,_))K<v&&0>L(ne,W)?(k[c]=ne,k[K]=_,c=K):(k[c]=W,k[B]=_,c=B);else if(K<v&&0>L(ne,_))k[c]=ne,k[K]=_,c=K;else break e}}return j}function L(k,j){var _=k.sortIndex-j.sortIndex;return _!==0?_:k.id-j.id}if(typeof performance=="object"&&typeof performance.now=="function"){var M=performance;S.unstable_now=function(){return M.now()}}else{var D=Date,H=D.now();S.unstable_now=function(){return D.now()-H}}var I=[],b=[],te=1,V=null,X=3,G=!1,Me=!1,ee=!1,$=typeof setTimeout=="function"?setTimeout:null,et=typeof clearTimeout=="function"?clearTimeout:null,Ae=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function Ye(k){for(var j=m(b);j!==null;){if(j.callback===null)Z(b);else if(j.startTime<=k)Z(b),j.sortIndex=j.expirationTime,N(I,j);else break;j=m(b)}}function ve(k){if(ee=!1,Ye(k),!Me)if(m(I)!==null)Me=!0,Be(ze);else{var j=m(b);j!==null&&fe(ve,j.startTime-k)}}function ze(k,j){Me=!1,ee&&(ee=!1,et(Te),Te=-1),G=!0;var _=X;try{for(Ye(j),V=m(I);V!==null&&(!(V.expirationTime>j)||k&&!pe());){var c=V.callback;if(typeof c=="function"){V.callback=null,X=V.priorityLevel;var v=c(V.expirationTime<=j);j=S.unstable_now(),typeof v=="function"?V.callback=v:V===m(I)&&Z(I),Ye(j)}else Z(I);V=m(I)}if(V!==null)var U=!0;else{var B=m(b);B!==null&&fe(ve,B.startTime-j),U=!1}return U}finally{V=null,X=_,G=!1}}var ke=!1,Ce=null,Te=-1,Xe=5,ie=-1;function pe(){return!(S.unstable_now()-ie<Xe)}function De(){if(Ce!==null){var k=S.unstable_now();ie=k;var j=!0;try{j=Ce(!0,k)}finally{j?Fe():(ke=!1,Ce=null)}}else ke=!1}var Fe;if(typeof Ae=="function")Fe=function(){Ae(De)};else if(typeof MessageChannel<"u"){var ot=new MessageChannel,ht=ot.port2;ot.port1.onmessage=De,Fe=function(){ht.postMessage(null)}}else Fe=function(){$(De,0)};function Be(k){Ce=k,ke||(ke=!0,Fe())}function fe(k,j){Te=$(function(){k(S.unstable_now())},j)}S.unstable_IdlePriority=5,S.unstable_ImmediatePriority=1,S.unstable_LowPriority=4,S.unstable_NormalPriority=3,S.unstable_Profiling=null,S.unstable_UserBlockingPriority=2,S.unstable_cancelCallback=function(k){k.callback=null},S.unstable_continueExecution=function(){Me||G||(Me=!0,Be(ze))},S.unstable_forceFrameRate=function(k){0>k||125<k?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):Xe=0<k?Math.floor(1e3/k):5},S.unstable_getCurrentPriorityLevel=function(){return X},S.unstable_getFirstCallbackNode=function(){return m(I)},S.unstable_next=function(k){switch(X){case 1:case 2:case 3:var j=3;break;default:j=X}var _=X;X=j;try{return k()}finally{X=_}},S.unstable_pauseExecution=function(){},S.unstable_requestPaint=function(){},S.unstable_runWithPriority=function(k,j){switch(k){case 1:case 2:case 3:case 4:case 5:break;default:k=3}var _=X;X=k;try{return j()}finally{X=_}},S.unstable_scheduleCallback=function(k,j,_){var c=S.unstable_now();switch(typeof _=="object"&&_!==null?(_=_.delay,_=typeof _=="number"&&0<_?c+_:c):_=c,k){case 1:var v=-1;break;case 2:v=250;break;case 5:v=1073741823;break;case 4:v=1e4;break;default:v=5e3}return v=_+v,k={id:te++,callback:j,priorityLevel:k,startTime:_,expirationTime:v,sortIndex:-1},_>c?(k.sortIndex=_,N(b,k),m(I)===null&&k===m(b)&&(ee?(et(Te),Te=-1):ee=!0,fe(ve,_-c))):(k.sortIndex=v,N(I,k),Me||G||(Me=!0,Be(ze))),k},S.unstable_shouldYield=pe,S.unstable_wrapCallback=function(k){var j=X;return function(){var _=X;X=j;try{return k.apply(this,arguments)}finally{X=_}}}}(zi)),zi}var La;function Uf(){return La||(La=1,Ni.exports=If()),Ni.exports}/**
+ * @license React
+ * react-dom.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var ja;function Af(){if(ja)return Ke;ja=1;var S=Ri(),N=Uf();function m(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var Z=new Set,L={};function M(e,t){D(e,t),D(e+"Capture",t)}function D(e,t){for(L[e]=t,e=0;e<t.length;e++)Z.add(t[e])}var H=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),I=Object.prototype.hasOwnProperty,b=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,te={},V={};function X(e){return I.call(V,e)?!0:I.call(te,e)?!1:b.test(e)?V[e]=!0:(te[e]=!0,!1)}function G(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Me(e,t,n,r){if(t===null||typeof t>"u"||G(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function ee(e,t,n,r,l,u,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=i}var $={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){$[e]=new ee(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];$[t]=new ee(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){$[e]=new ee(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){$[e]=new ee(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){$[e]=new ee(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){$[e]=new ee(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){$[e]=new ee(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){$[e]=new ee(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){$[e]=new ee(e,5,!1,e.toLowerCase(),null,!1,!1)});var et=/[\-:]([a-z])/g;function Ae(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(et,Ae);$[t]=new ee(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(et,Ae);$[t]=new ee(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(et,Ae);$[t]=new ee(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){$[e]=new ee(e,1,!1,e.toLowerCase(),null,!1,!1)}),$.xlinkHref=new ee("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){$[e]=new ee(e,1,!1,e.toLowerCase(),null,!0,!0)});function Ye(e,t,n,r){var l=$.hasOwnProperty(t)?$[t]:null;(l!==null?l.type!==0:r||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(Me(t,n,l,r)&&(n=null),r||l===null?X(t)&&(n===null?e.removeAttribute(t):e.setAttribute(t,""+n)):l.mustUseProperty?e[l.propertyName]=n===null?l.type===3?!1:"":n:(t=l.attributeName,r=l.attributeNamespace,n===null?e.removeAttribute(t):(l=l.type,n=l===3||l===4&&n===!0?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}var ve=S.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,ze=Symbol.for("react.element"),ke=Symbol.for("react.portal"),Ce=Symbol.for("react.fragment"),Te=Symbol.for("react.strict_mode"),Xe=Symbol.for("react.profiler"),ie=Symbol.for("react.provider"),pe=Symbol.for("react.context"),De=Symbol.for("react.forward_ref"),Fe=Symbol.for("react.suspense"),ot=Symbol.for("react.suspense_list"),ht=Symbol.for("react.memo"),Be=Symbol.for("react.lazy"),fe=Symbol.for("react.offscreen"),k=Symbol.iterator;function j(e){return e===null||typeof e!="object"?null:(e=k&&e[k]||e["@@iterator"],typeof e=="function"?e:null)}var _=Object.assign,c;function v(e){if(c===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);c=t&&t[1]||""}return`
+`+c+e}var U=!1;function B(e,t){if(!e||U)return"";U=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(p){var r=p}Reflect.construct(e,[],t)}else{try{t.call()}catch(p){r=p}e.call(t.prototype)}else{try{throw Error()}catch(p){r=p}e()}}catch(p){if(p&&r&&typeof p.stack=="string"){for(var l=p.stack.split(`
+`),u=r.stack.split(`
+`),i=l.length-1,o=u.length-1;1<=i&&0<=o&&l[i]!==u[o];)o--;for(;1<=i&&0<=o;i--,o--)if(l[i]!==u[o]){if(i!==1||o!==1)do if(i--,o--,0>o||l[i]!==u[o]){var s=`
+`+l[i].replace(" at new "," at ");return e.displayName&&s.includes("<anonymous>")&&(s=s.replace("<anonymous>",e.displayName)),s}while(1<=i&&0<=o);break}}}finally{U=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?v(e):""}function W(e){switch(e.tag){case 5:return v(e.type);case 16:return v("Lazy");case 13:return v("Suspense");case 19:return v("SuspenseList");case 0:case 2:case 15:return e=B(e.type,!1),e;case 11:return e=B(e.type.render,!1),e;case 1:return e=B(e.type,!0),e;default:return""}}function K(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Ce:return"Fragment";case ke:return"Portal";case Xe:return"Profiler";case Te:return"StrictMode";case Fe:return"Suspense";case ot:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case pe:return(e.displayName||"Context")+".Consumer";case ie:return(e._context.displayName||"Context")+".Provider";case De:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ht:return t=e.displayName||null,t!==null?t:K(e.type)||"Memo";case Be:t=e._payload,e=e._init;try{return K(e(t))}catch{}}return null}function ne(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return K(t);case 8:return t===Te?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function J(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function oe(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ge(e){var t=oe(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,u=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=""+i,u.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function wr(e){e._valueTracker||(e._valueTracker=Ge(e))}function Li(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=oe(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Sr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ll(e,t){var n=t.checked;return _({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function ji(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=J(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Oi(e,t){t=t.checked,t!=null&&Ye(e,"checked",t,!1)}function jl(e,t){Oi(e,t);var n=J(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ol(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ol(e,t.type,J(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Mi(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ol(e,t,n){(t!=="number"||Sr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var On=Array.isArray;function sn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l<n.length;l++)t["$"+n[l]]=!0;for(n=0;n<e.length;n++)l=t.hasOwnProperty("$"+e[n].value),e[n].selected!==l&&(e[n].selected=l),l&&r&&(e[n].defaultSelected=!0)}else{for(n=""+J(n),t=null,l=0;l<e.length;l++){if(e[l].value===n){e[l].selected=!0,r&&(e[l].defaultSelected=!0);return}t!==null||e[l].disabled||(t=e[l])}t!==null&&(t.selected=!0)}}function Ml(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(m(91));return _({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function Di(e,t){var n=t.value;if(n==null){if(n=t.children,t=t.defaultValue,n!=null){if(t!=null)throw Error(m(92));if(On(n)){if(1<n.length)throw Error(m(93));n=n[0]}t=n}t==null&&(t=""),n=t}e._wrapperState={initialValue:J(n)}}function Fi(e,t){var n=J(t.value),r=J(t.defaultValue);n!=null&&(n=""+n,n!==e.value&&(e.value=n),t.defaultValue==null&&e.defaultValue!==n&&(e.defaultValue=n)),r!=null&&(e.defaultValue=""+r)}function Ii(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function Ui(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Dl(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?Ui(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var kr,Ai=function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,n,r,l){MSApp.execUnsafeLocalFunction(function(){return e(t,n,r,l)})}:e}(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(kr=kr||document.createElement("div"),kr.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=kr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Mn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Dn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ia=["Webkit","ms","Moz","O"];Object.keys(Dn).forEach(function(e){Ia.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Dn[t]=Dn[e]})});function Bi(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Dn.hasOwnProperty(e)&&Dn[e]?(""+t).trim():t+"px"}function Hi(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=Bi(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Ua=_({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Fl(e,t){if(t){if(Ua[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(m(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(m(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(m(61))}if(t.style!=null&&typeof t.style!="object")throw Error(m(62))}}function Il(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ul=null;function Al(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Bl=null,an=null,cn=null;function Vi(e){if(e=rr(e)){if(typeof Bl!="function")throw Error(m(280));var t=e.stateNode;t&&(t=Qr(t),Bl(e.stateNode,e.type,t))}}function $i(e){an?cn?cn.push(e):cn=[e]:an=e}function Qi(){if(an){var e=an,t=cn;if(cn=an=null,Vi(e),t)for(e=0;e<t.length;e++)Vi(t[e])}}function Wi(e,t){return e(t)}function Ki(){}var Hl=!1;function Yi(e,t,n){if(Hl)return e(t,n);Hl=!0;try{return Wi(e,t,n)}finally{Hl=!1,(an!==null||cn!==null)&&(Ki(),Qi())}}function Fn(e,t){var n=e.stateNode;if(n===null)return null;var r=Qr(n);if(r===null)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(e=e.type,r=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!r;break e;default:e=!1}if(e)return null;if(n&&typeof n!="function")throw Error(m(231,t,typeof n));return n}var Vl=!1;if(H)try{var In={};Object.defineProperty(In,"passive",{get:function(){Vl=!0}}),window.addEventListener("test",In,In),window.removeEventListener("test",In,In)}catch{Vl=!1}function Aa(e,t,n,r,l,u,i,o,s){var p=Array.prototype.slice.call(arguments,3);try{t.apply(n,p)}catch(y){this.onError(y)}}var Un=!1,Er=null,xr=!1,$l=null,Ba={onError:function(e){Un=!0,Er=e}};function Ha(e,t,n,r,l,u,i,o,s){Un=!1,Er=null,Aa.apply(Ba,arguments)}function Va(e,t,n,r,l,u,i,o,s){if(Ha.apply(this,arguments),Un){if(Un){var p=Er;Un=!1,Er=null}else throw Error(m(198));xr||(xr=!0,$l=p)}}function Xt(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function Xi(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Gi(e){if(Xt(e)!==e)throw Error(m(188))}function $a(e){var t=e.alternate;if(!t){if(t=Xt(e),t===null)throw Error(m(188));return t!==e?null:e}for(var n=e,r=t;;){var l=n.return;if(l===null)break;var u=l.alternate;if(u===null){if(r=l.return,r!==null){n=r;continue}break}if(l.child===u.child){for(u=l.child;u;){if(u===n)return Gi(l),e;if(u===r)return Gi(l),t;u=u.sibling}throw Error(m(188))}if(n.return!==r.return)n=l,r=u;else{for(var i=!1,o=l.child;o;){if(o===n){i=!0,n=l,r=u;break}if(o===r){i=!0,r=l,n=u;break}o=o.sibling}if(!i){for(o=u.child;o;){if(o===n){i=!0,n=u,r=l;break}if(o===r){i=!0,r=u,n=l;break}o=o.sibling}if(!i)throw Error(m(189))}}if(n.alternate!==r)throw Error(m(190))}if(n.tag!==3)throw Error(m(188));return n.stateNode.current===n?e:t}function Zi(e){return e=$a(e),e!==null?Ji(e):null}function Ji(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=Ji(e);if(t!==null)return t;e=e.sibling}return null}var qi=N.unstable_scheduleCallback,bi=N.unstable_cancelCallback,Qa=N.unstable_shouldYield,Wa=N.unstable_requestPaint,me=N.unstable_now,Ka=N.unstable_getCurrentPriorityLevel,Ql=N.unstable_ImmediatePriority,eo=N.unstable_UserBlockingPriority,_r=N.unstable_NormalPriority,Ya=N.unstable_LowPriority,to=N.unstable_IdlePriority,Cr=null,vt=null;function Xa(e){if(vt&&typeof vt.onCommitFiberRoot=="function")try{vt.onCommitFiberRoot(Cr,e,void 0,(e.current.flags&128)===128)}catch{}}var st=Math.clz32?Math.clz32:Ja,Ga=Math.log,Za=Math.LN2;function Ja(e){return e>>>=0,e===0?32:31-(Ga(e)/Za|0)|0}var Pr=64,Nr=4194304;function An(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function zr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,u=e.pingedLanes,i=n&268435455;if(i!==0){var o=i&~l;o!==0?r=An(o):(u&=i,u!==0&&(r=An(u)))}else i=n&~l,i!==0?r=An(i):u!==0&&(r=An(u));if(r===0)return 0;if(t!==0&&t!==r&&(t&l)===0&&(l=r&-r,u=t&-t,l>=u||l===16&&(u&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0<t;)n=31-st(t),l=1<<n,r|=e[n],t&=~l;return r}function qa(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ba(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,l=e.expirationTimes,u=e.pendingLanes;0<u;){var i=31-st(u),o=1<<i,s=l[i];s===-1?((o&n)===0||(o&r)!==0)&&(l[i]=qa(o,t)):s<=t&&(e.expiredLanes|=o),u&=~o}}function Wl(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function no(){var e=Pr;return Pr<<=1,(Pr&4194240)===0&&(Pr=64),e}function Kl(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Bn(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-st(t),e[t]=n}function ec(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var l=31-st(n),u=1<<l;t[l]=0,r[l]=-1,e[l]=-1,n&=~u}}function Yl(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-st(n),l=1<<r;l&t|e[r]&t&&(e[r]|=t),n&=~l}}var q=0;function ro(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var lo,Xl,uo,io,oo,Gl=!1,Tr=[],Tt=null,Rt=null,Lt=null,Hn=new Map,Vn=new Map,jt=[],tc="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function so(e,t){switch(e){case"focusin":case"focusout":Tt=null;break;case"dragenter":case"dragleave":Rt=null;break;case"mouseover":case"mouseout":Lt=null;break;case"pointerover":case"pointerout":Hn.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Vn.delete(t.pointerId)}}function $n(e,t,n,r,l,u){return e===null||e.nativeEvent!==u?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:u,targetContainers:[l]},t!==null&&(t=rr(t),t!==null&&Xl(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,l!==null&&t.indexOf(l)===-1&&t.push(l),e)}function nc(e,t,n,r,l){switch(t){case"focusin":return Tt=$n(Tt,e,t,n,r,l),!0;case"dragenter":return Rt=$n(Rt,e,t,n,r,l),!0;case"mouseover":return Lt=$n(Lt,e,t,n,r,l),!0;case"pointerover":var u=l.pointerId;return Hn.set(u,$n(Hn.get(u)||null,e,t,n,r,l)),!0;case"gotpointercapture":return u=l.pointerId,Vn.set(u,$n(Vn.get(u)||null,e,t,n,r,l)),!0}return!1}function ao(e){var t=Gt(e.target);if(t!==null){var n=Xt(t);if(n!==null){if(t=n.tag,t===13){if(t=Xi(n),t!==null){e.blockedOn=t,oo(e.priority,function(){uo(n)});return}}else if(t===3&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=n.tag===3?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function Rr(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var n=Jl(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(n===null){n=e.nativeEvent;var r=new n.constructor(n.type,n);Ul=r,n.target.dispatchEvent(r),Ul=null}else return t=rr(n),t!==null&&Xl(t),e.blockedOn=n,!1;t.shift()}return!0}function co(e,t,n){Rr(e)&&n.delete(t)}function rc(){Gl=!1,Tt!==null&&Rr(Tt)&&(Tt=null),Rt!==null&&Rr(Rt)&&(Rt=null),Lt!==null&&Rr(Lt)&&(Lt=null),Hn.forEach(co),Vn.forEach(co)}function Qn(e,t){e.blockedOn===t&&(e.blockedOn=null,Gl||(Gl=!0,N.unstable_scheduleCallback(N.unstable_NormalPriority,rc)))}function Wn(e){function t(l){return Qn(l,e)}if(0<Tr.length){Qn(Tr[0],e);for(var n=1;n<Tr.length;n++){var r=Tr[n];r.blockedOn===e&&(r.blockedOn=null)}}for(Tt!==null&&Qn(Tt,e),Rt!==null&&Qn(Rt,e),Lt!==null&&Qn(Lt,e),Hn.forEach(t),Vn.forEach(t),n=0;n<jt.length;n++)r=jt[n],r.blockedOn===e&&(r.blockedOn=null);for(;0<jt.length&&(n=jt[0],n.blockedOn===null);)ao(n),n.blockedOn===null&&jt.shift()}var fn=ve.ReactCurrentBatchConfig,Lr=!0;function lc(e,t,n,r){var l=q,u=fn.transition;fn.transition=null;try{q=1,Zl(e,t,n,r)}finally{q=l,fn.transition=u}}function uc(e,t,n,r){var l=q,u=fn.transition;fn.transition=null;try{q=4,Zl(e,t,n,r)}finally{q=l,fn.transition=u}}function Zl(e,t,n,r){if(Lr){var l=Jl(e,t,n,r);if(l===null)mu(e,t,r,jr,n),so(e,r);else if(nc(l,e,t,n,r))r.stopPropagation();else if(so(e,r),t&4&&-1<tc.indexOf(e)){for(;l!==null;){var u=rr(l);if(u!==null&&lo(u),u=Jl(e,t,n,r),u===null&&mu(e,t,r,jr,n),u===l)break;l=u}l!==null&&r.stopPropagation()}else mu(e,t,r,null,n)}}var jr=null;function Jl(e,t,n,r){if(jr=null,e=Al(r),e=Gt(e),e!==null)if(t=Xt(e),t===null)e=null;else if(n=t.tag,n===13){if(e=Xi(t),e!==null)return e;e=null}else if(n===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return jr=e,null}function fo(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Ka()){case Ql:return 1;case eo:return 4;case _r:case Ya:return 16;case to:return 536870912;default:return 16}default:return 16}}var Ot=null,ql=null,Or=null;function po(){if(Or)return Or;var e,t=ql,n=t.length,r,l="value"in Ot?Ot.value:Ot.textContent,u=l.length;for(e=0;e<n&&t[e]===l[e];e++);var i=n-e;for(r=1;r<=i&&t[n-r]===l[u-r];r++);return Or=l.slice(e,1<r?1-r:void 0)}function Mr(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Dr(){return!0}function mo(){return!1}function Ze(e){function t(n,r,l,u,i){this._reactName=n,this._targetInst=l,this.type=r,this.nativeEvent=u,this.target=i,this.currentTarget=null;for(var o in e)e.hasOwnProperty(o)&&(n=e[o],this[o]=n?n(u):u[o]);return this.isDefaultPrevented=(u.defaultPrevented!=null?u.defaultPrevented:u.returnValue===!1)?Dr:mo,this.isPropagationStopped=mo,this}return _(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var n=this.nativeEvent;n&&(n.preventDefault?n.preventDefault():typeof n.returnValue!="unknown"&&(n.returnValue=!1),this.isDefaultPrevented=Dr)},stopPropagation:function(){var n=this.nativeEvent;n&&(n.stopPropagation?n.stopPropagation():typeof n.cancelBubble!="unknown"&&(n.cancelBubble=!0),this.isPropagationStopped=Dr)},persist:function(){},isPersistent:Dr}),t}var dn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},bl=Ze(dn),Kn=_({},dn,{view:0,detail:0}),ic=Ze(Kn),eu,tu,Yn,Fr=_({},Kn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:ru,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Yn&&(Yn&&e.type==="mousemove"?(eu=e.screenX-Yn.screenX,tu=e.screenY-Yn.screenY):tu=eu=0,Yn=e),eu)},movementY:function(e){return"movementY"in e?e.movementY:tu}}),ho=Ze(Fr),oc=_({},Fr,{dataTransfer:0}),sc=Ze(oc),ac=_({},Kn,{relatedTarget:0}),nu=Ze(ac),cc=_({},dn,{animationName:0,elapsedTime:0,pseudoElement:0}),fc=Ze(cc),dc=_({},dn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),pc=Ze(dc),mc=_({},dn,{data:0}),vo=Ze(mc),hc={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},vc={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},yc={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function gc(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=yc[e])?!!t[e]:!1}function ru(){return gc}var wc=_({},Kn,{key:function(e){if(e.key){var t=hc[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=Mr(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?vc[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:ru,charCode:function(e){return e.type==="keypress"?Mr(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?Mr(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),Sc=Ze(wc),kc=_({},Fr,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),yo=Ze(kc),Ec=_({},Kn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:ru}),xc=Ze(Ec),_c=_({},dn,{propertyName:0,elapsedTime:0,pseudoElement:0}),Cc=Ze(_c),Pc=_({},Fr,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Nc=Ze(Pc),zc=[9,13,27,32],lu=H&&"CompositionEvent"in window,Xn=null;H&&"documentMode"in document&&(Xn=document.documentMode);var Tc=H&&"TextEvent"in window&&!Xn,go=H&&(!lu||Xn&&8<Xn&&11>=Xn),wo=" ",So=!1;function ko(e,t){switch(e){case"keyup":return zc.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Eo(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var pn=!1;function Rc(e,t){switch(e){case"compositionend":return Eo(t);case"keypress":return t.which!==32?null:(So=!0,wo);case"textInput":return e=t.data,e===wo&&So?null:e;default:return null}}function Lc(e,t){if(pn)return e==="compositionend"||!lu&&ko(e,t)?(e=po(),Or=ql=Ot=null,pn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return go&&t.locale!=="ko"?null:t.data;default:return null}}var jc={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function xo(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!jc[e.type]:t==="textarea"}function _o(e,t,n,r){$i(r),t=Hr(t,"onChange"),0<t.length&&(n=new bl("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Gn=null,Zn=null;function Oc(e){Vo(e,0)}function Ir(e){var t=gn(e);if(Li(t))return e}function Mc(e,t){if(e==="change")return t}var Co=!1;if(H){var uu;if(H){var iu="oninput"in document;if(!iu){var Po=document.createElement("div");Po.setAttribute("oninput","return;"),iu=typeof Po.oninput=="function"}uu=iu}else uu=!1;Co=uu&&(!document.documentMode||9<document.documentMode)}function No(){Gn&&(Gn.detachEvent("onpropertychange",zo),Zn=Gn=null)}function zo(e){if(e.propertyName==="value"&&Ir(Zn)){var t=[];_o(t,Zn,e,Al(e)),Yi(Oc,t)}}function Dc(e,t,n){e==="focusin"?(No(),Gn=t,Zn=n,Gn.attachEvent("onpropertychange",zo)):e==="focusout"&&No()}function Fc(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return Ir(Zn)}function Ic(e,t){if(e==="click")return Ir(t)}function Uc(e,t){if(e==="input"||e==="change")return Ir(t)}function Ac(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var at=typeof Object.is=="function"?Object.is:Ac;function Jn(e,t){if(at(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var l=n[r];if(!I.call(t,l)||!at(e[l],t[l]))return!1}return!0}function To(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Ro(e,t){var n=To(e);e=0;for(var r;n;){if(n.nodeType===3){if(r=e+n.textContent.length,e<=t&&r>=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=To(n)}}function Lo(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Lo(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function jo(){for(var e=window,t=Sr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Sr(e.document)}return t}function ou(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Bc(e){var t=jo(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Lo(n.ownerDocument.documentElement,n)){if(r!==null&&ou(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,u=Math.min(r.start,l);r=r.end===void 0?u:Math.min(r.end,l),!e.extend&&u>r&&(l=r,r=u,u=l),l=Ro(n,u);var i=Ro(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),u>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n<t.length;n++)e=t[n],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var Hc=H&&"documentMode"in document&&11>=document.documentMode,mn=null,su=null,qn=null,au=!1;function Oo(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;au||mn==null||mn!==Sr(r)||(r=mn,"selectionStart"in r&&ou(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),qn&&Jn(qn,r)||(qn=r,r=Hr(su,"onSelect"),0<r.length&&(t=new bl("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=mn)))}function Ur(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var hn={animationend:Ur("Animation","AnimationEnd"),animationiteration:Ur("Animation","AnimationIteration"),animationstart:Ur("Animation","AnimationStart"),transitionend:Ur("Transition","TransitionEnd")},cu={},Mo={};H&&(Mo=document.createElement("div").style,"AnimationEvent"in window||(delete hn.animationend.animation,delete hn.animationiteration.animation,delete hn.animationstart.animation),"TransitionEvent"in window||delete hn.transitionend.transition);function Ar(e){if(cu[e])return cu[e];if(!hn[e])return e;var t=hn[e],n;for(n in t)if(t.hasOwnProperty(n)&&n in Mo)return cu[e]=t[n];return e}var Do=Ar("animationend"),Fo=Ar("animationiteration"),Io=Ar("animationstart"),Uo=Ar("transitionend"),Ao=new Map,Bo="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Mt(e,t){Ao.set(e,t),M(t,[e])}for(var fu=0;fu<Bo.length;fu++){var du=Bo[fu],Vc=du.toLowerCase(),$c=du[0].toUpperCase()+du.slice(1);Mt(Vc,"on"+$c)}Mt(Do,"onAnimationEnd"),Mt(Fo,"onAnimationIteration"),Mt(Io,"onAnimationStart"),Mt("dblclick","onDoubleClick"),Mt("focusin","onFocus"),Mt("focusout","onBlur"),Mt(Uo,"onTransitionEnd"),D("onMouseEnter",["mouseout","mouseover"]),D("onMouseLeave",["mouseout","mouseover"]),D("onPointerEnter",["pointerout","pointerover"]),D("onPointerLeave",["pointerout","pointerover"]),M("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),M("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),M("onBeforeInput",["compositionend","keypress","textInput","paste"]),M("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),M("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),M("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var bn="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Qc=new Set("cancel close invalid load scroll toggle".split(" ").concat(bn));function Ho(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,Va(r,t,void 0,e),e.currentTarget=null}function Vo(e,t){t=(t&4)!==0;for(var n=0;n<e.length;n++){var r=e[n],l=r.event;r=r.listeners;e:{var u=void 0;if(t)for(var i=r.length-1;0<=i;i--){var o=r[i],s=o.instance,p=o.currentTarget;if(o=o.listener,s!==u&&l.isPropagationStopped())break e;Ho(l,o,p),u=s}else for(i=0;i<r.length;i++){if(o=r[i],s=o.instance,p=o.currentTarget,o=o.listener,s!==u&&l.isPropagationStopped())break e;Ho(l,o,p),u=s}}}if(xr)throw e=$l,xr=!1,$l=null,e}function le(e,t){var n=t[Su];n===void 0&&(n=t[Su]=new Set);var r=e+"__bubble";n.has(r)||($o(t,e,2,!1),n.add(r))}function pu(e,t,n){var r=0;t&&(r|=4),$o(n,e,r,t)}var Br="_reactListening"+Math.random().toString(36).slice(2);function er(e){if(!e[Br]){e[Br]=!0,Z.forEach(function(n){n!=="selectionchange"&&(Qc.has(n)||pu(n,!1,e),pu(n,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Br]||(t[Br]=!0,pu("selectionchange",!1,t))}}function $o(e,t,n,r){switch(fo(t)){case 1:var l=lc;break;case 4:l=uc;break;default:l=Zl}n=l.bind(null,t,n,e),l=void 0,!Vl||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(l=!0),r?l!==void 0?e.addEventListener(t,n,{capture:!0,passive:l}):e.addEventListener(t,n,!0):l!==void 0?e.addEventListener(t,n,{passive:l}):e.addEventListener(t,n,!1)}function mu(e,t,n,r,l){var u=r;if((t&1)===0&&(t&2)===0&&r!==null)e:for(;;){if(r===null)return;var i=r.tag;if(i===3||i===4){var o=r.stateNode.containerInfo;if(o===l||o.nodeType===8&&o.parentNode===l)break;if(i===4)for(i=r.return;i!==null;){var s=i.tag;if((s===3||s===4)&&(s=i.stateNode.containerInfo,s===l||s.nodeType===8&&s.parentNode===l))return;i=i.return}for(;o!==null;){if(i=Gt(o),i===null)return;if(s=i.tag,s===5||s===6){r=u=i;continue e}o=o.parentNode}}r=r.return}Yi(function(){var p=u,y=Al(n),g=[];e:{var h=Ao.get(e);if(h!==void 0){var E=bl,C=e;switch(e){case"keypress":if(Mr(n)===0)break e;case"keydown":case"keyup":E=Sc;break;case"focusin":C="focus",E=nu;break;case"focusout":C="blur",E=nu;break;case"beforeblur":case"afterblur":E=nu;break;case"click":if(n.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":E=ho;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":E=sc;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":E=xc;break;case Do:case Fo:case Io:E=fc;break;case Uo:E=Cc;break;case"scroll":E=ic;break;case"wheel":E=Nc;break;case"copy":case"cut":case"paste":E=pc;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":E=yo}var P=(t&4)!==0,he=!P&&e==="scroll",f=P?h!==null?h+"Capture":null:h;P=[];for(var a=p,d;a!==null;){d=a;var w=d.stateNode;if(d.tag===5&&w!==null&&(d=w,f!==null&&(w=Fn(a,f),w!=null&&P.push(tr(a,w,d)))),he)break;a=a.return}0<P.length&&(h=new E(h,C,null,n,y),g.push({event:h,listeners:P}))}}if((t&7)===0){e:{if(h=e==="mouseover"||e==="pointerover",E=e==="mouseout"||e==="pointerout",h&&n!==Ul&&(C=n.relatedTarget||n.fromElement)&&(Gt(C)||C[kt]))break e;if((E||h)&&(h=y.window===y?y:(h=y.ownerDocument)?h.defaultView||h.parentWindow:window,E?(C=n.relatedTarget||n.toElement,E=p,C=C?Gt(C):null,C!==null&&(he=Xt(C),C!==he||C.tag!==5&&C.tag!==6)&&(C=null)):(E=null,C=p),E!==C)){if(P=ho,w="onMouseLeave",f="onMouseEnter",a="mouse",(e==="pointerout"||e==="pointerover")&&(P=yo,w="onPointerLeave",f="onPointerEnter",a="pointer"),he=E==null?h:gn(E),d=C==null?h:gn(C),h=new P(w,a+"leave",E,n,y),h.target=he,h.relatedTarget=d,w=null,Gt(y)===p&&(P=new P(f,a+"enter",C,n,y),P.target=d,P.relatedTarget=he,w=P),he=w,E&&C)t:{for(P=E,f=C,a=0,d=P;d;d=vn(d))a++;for(d=0,w=f;w;w=vn(w))d++;for(;0<a-d;)P=vn(P),a--;for(;0<d-a;)f=vn(f),d--;for(;a--;){if(P===f||f!==null&&P===f.alternate)break t;P=vn(P),f=vn(f)}P=null}else P=null;E!==null&&Qo(g,h,E,P,!1),C!==null&&he!==null&&Qo(g,he,C,P,!0)}}e:{if(h=p?gn(p):window,E=h.nodeName&&h.nodeName.toLowerCase(),E==="select"||E==="input"&&h.type==="file")var z=Mc;else if(xo(h))if(Co)z=Uc;else{z=Fc;var T=Dc}else(E=h.nodeName)&&E.toLowerCase()==="input"&&(h.type==="checkbox"||h.type==="radio")&&(z=Ic);if(z&&(z=z(e,p))){_o(g,z,n,y);break e}T&&T(e,h,p),e==="focusout"&&(T=h._wrapperState)&&T.controlled&&h.type==="number"&&Ol(h,"number",h.value)}switch(T=p?gn(p):window,e){case"focusin":(xo(T)||T.contentEditable==="true")&&(mn=T,su=p,qn=null);break;case"focusout":qn=su=mn=null;break;case"mousedown":au=!0;break;case"contextmenu":case"mouseup":case"dragend":au=!1,Oo(g,n,y);break;case"selectionchange":if(Hc)break;case"keydown":case"keyup":Oo(g,n,y)}var R;if(lu)e:{switch(e){case"compositionstart":var O="onCompositionStart";break e;case"compositionend":O="onCompositionEnd";break e;case"compositionupdate":O="onCompositionUpdate";break e}O=void 0}else pn?ko(e,n)&&(O="onCompositionEnd"):e==="keydown"&&n.keyCode===229&&(O="onCompositionStart");O&&(go&&n.locale!=="ko"&&(pn||O!=="onCompositionStart"?O==="onCompositionEnd"&&pn&&(R=po()):(Ot=y,ql="value"in Ot?Ot.value:Ot.textContent,pn=!0)),T=Hr(p,O),0<T.length&&(O=new vo(O,e,null,n,y),g.push({event:O,listeners:T}),R?O.data=R:(R=Eo(n),R!==null&&(O.data=R)))),(R=Tc?Rc(e,n):Lc(e,n))&&(p=Hr(p,"onBeforeInput"),0<p.length&&(y=new vo("onBeforeInput","beforeinput",null,n,y),g.push({event:y,listeners:p}),y.data=R))}Vo(g,t)})}function tr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Hr(e,t){for(var n=t+"Capture",r=[];e!==null;){var l=e,u=l.stateNode;l.tag===5&&u!==null&&(l=u,u=Fn(e,n),u!=null&&r.unshift(tr(e,u,l)),u=Fn(e,t),u!=null&&r.push(tr(e,u,l))),e=e.return}return r}function vn(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function Qo(e,t,n,r,l){for(var u=t._reactName,i=[];n!==null&&n!==r;){var o=n,s=o.alternate,p=o.stateNode;if(s!==null&&s===r)break;o.tag===5&&p!==null&&(o=p,l?(s=Fn(n,u),s!=null&&i.unshift(tr(n,s,o))):l||(s=Fn(n,u),s!=null&&i.push(tr(n,s,o)))),n=n.return}i.length!==0&&e.push({event:t,listeners:i})}var Wc=/\r\n?/g,Kc=/\u0000|\uFFFD/g;function Wo(e){return(typeof e=="string"?e:""+e).replace(Wc,`
+`).replace(Kc,"")}function Vr(e,t,n){if(t=Wo(t),Wo(e)!==t&&n)throw Error(m(425))}function $r(){}var hu=null,vu=null;function yu(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var gu=typeof setTimeout=="function"?setTimeout:void 0,Yc=typeof clearTimeout=="function"?clearTimeout:void 0,Ko=typeof Promise=="function"?Promise:void 0,Xc=typeof queueMicrotask=="function"?queueMicrotask:typeof Ko<"u"?function(e){return Ko.resolve(null).then(e).catch(Gc)}:gu;function Gc(e){setTimeout(function(){throw e})}function wu(e,t){var n=t,r=0;do{var l=n.nextSibling;if(e.removeChild(n),l&&l.nodeType===8)if(n=l.data,n==="/$"){if(r===0){e.removeChild(l),Wn(t);return}r--}else n!=="$"&&n!=="$?"&&n!=="$!"||r++;n=l}while(n);Wn(t)}function Dt(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Yo(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var n=e.data;if(n==="$"||n==="$!"||n==="$?"){if(t===0)return e;t--}else n==="/$"&&t++}e=e.previousSibling}return null}var yn=Math.random().toString(36).slice(2),yt="__reactFiber$"+yn,nr="__reactProps$"+yn,kt="__reactContainer$"+yn,Su="__reactEvents$"+yn,Zc="__reactListeners$"+yn,Jc="__reactHandles$"+yn;function Gt(e){var t=e[yt];if(t)return t;for(var n=e.parentNode;n;){if(t=n[kt]||n[yt]){if(n=t.alternate,t.child!==null||n!==null&&n.child!==null)for(e=Yo(e);e!==null;){if(n=e[yt])return n;e=Yo(e)}return t}e=n,n=e.parentNode}return null}function rr(e){return e=e[yt]||e[kt],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function gn(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(m(33))}function Qr(e){return e[nr]||null}var ku=[],wn=-1;function Ft(e){return{current:e}}function ue(e){0>wn||(e.current=ku[wn],ku[wn]=null,wn--)}function re(e,t){wn++,ku[wn]=e.current,e.current=t}var It={},Re=Ft(It),He=Ft(!1),Zt=It;function Sn(e,t){var n=e.type.contextTypes;if(!n)return It;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},u;for(u in n)l[u]=t[u];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function Ve(e){return e=e.childContextTypes,e!=null}function Wr(){ue(He),ue(Re)}function Xo(e,t,n){if(Re.current!==It)throw Error(m(168));re(Re,t),re(He,n)}function Go(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(m(108,ne(e)||"Unknown",l));return _({},n,r)}function Kr(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||It,Zt=Re.current,re(Re,e),re(He,He.current),!0}function Zo(e,t,n){var r=e.stateNode;if(!r)throw Error(m(169));n?(e=Go(e,t,Zt),r.__reactInternalMemoizedMergedChildContext=e,ue(He),ue(Re),re(Re,e)):ue(He),re(He,n)}var Et=null,Yr=!1,Eu=!1;function Jo(e){Et===null?Et=[e]:Et.push(e)}function qc(e){Yr=!0,Jo(e)}function Ut(){if(!Eu&&Et!==null){Eu=!0;var e=0,t=q;try{var n=Et;for(q=1;e<n.length;e++){var r=n[e];do r=r(!0);while(r!==null)}Et=null,Yr=!1}catch(l){throw Et!==null&&(Et=Et.slice(e+1)),qi(Ql,Ut),l}finally{q=t,Eu=!1}}return null}var kn=[],En=0,Xr=null,Gr=0,tt=[],nt=0,Jt=null,xt=1,_t="";function qt(e,t){kn[En++]=Gr,kn[En++]=Xr,Xr=e,Gr=t}function qo(e,t,n){tt[nt++]=xt,tt[nt++]=_t,tt[nt++]=Jt,Jt=e;var r=xt;e=_t;var l=32-st(r)-1;r&=~(1<<l),n+=1;var u=32-st(t)+l;if(30<u){var i=l-l%5;u=(r&(1<<i)-1).toString(32),r>>=i,l-=i,xt=1<<32-st(t)+l|n<<l|r,_t=u+e}else xt=1<<u|n<<l|r,_t=e}function xu(e){e.return!==null&&(qt(e,1),qo(e,1,0))}function _u(e){for(;e===Xr;)Xr=kn[--En],kn[En]=null,Gr=kn[--En],kn[En]=null;for(;e===Jt;)Jt=tt[--nt],tt[nt]=null,_t=tt[--nt],tt[nt]=null,xt=tt[--nt],tt[nt]=null}var Je=null,qe=null,se=!1,ct=null;function bo(e,t){var n=it(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,t=e.deletions,t===null?(e.deletions=[n],e.flags|=16):t.push(n)}function es(e,t){switch(e.tag){case 5:var n=e.type;return t=t.nodeType!==1||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,Je=e,qe=Dt(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Je=e,qe=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(n=Jt!==null?{id:xt,overflow:_t}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},n=it(18,null,null,0),n.stateNode=t,n.return=e,e.child=n,Je=e,qe=null,!0):!1;default:return!1}}function Cu(e){return(e.mode&1)!==0&&(e.flags&128)===0}function Pu(e){if(se){var t=qe;if(t){var n=t;if(!es(e,t)){if(Cu(e))throw Error(m(418));t=Dt(n.nextSibling);var r=Je;t&&es(e,t)?bo(r,n):(e.flags=e.flags&-4097|2,se=!1,Je=e)}}else{if(Cu(e))throw Error(m(418));e.flags=e.flags&-4097|2,se=!1,Je=e}}}function ts(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Je=e}function Zr(e){if(e!==Je)return!1;if(!se)return ts(e),se=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!yu(e.type,e.memoizedProps)),t&&(t=qe)){if(Cu(e))throw ns(),Error(m(418));for(;t;)bo(e,t),t=Dt(t.nextSibling)}if(ts(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(m(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var n=e.data;if(n==="/$"){if(t===0){qe=Dt(e.nextSibling);break e}t--}else n!=="$"&&n!=="$!"&&n!=="$?"||t++}e=e.nextSibling}qe=null}}else qe=Je?Dt(e.stateNode.nextSibling):null;return!0}function ns(){for(var e=qe;e;)e=Dt(e.nextSibling)}function xn(){qe=Je=null,se=!1}function Nu(e){ct===null?ct=[e]:ct.push(e)}var bc=ve.ReactCurrentBatchConfig;function lr(e,t,n){if(e=n.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(n._owner){if(n=n._owner,n){if(n.tag!==1)throw Error(m(309));var r=n.stateNode}if(!r)throw Error(m(147,e));var l=r,u=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===u?t.ref:(t=function(i){var o=l.refs;i===null?delete o[u]:o[u]=i},t._stringRef=u,t)}if(typeof e!="string")throw Error(m(284));if(!n._owner)throw Error(m(290,e))}return e}function Jr(e,t){throw e=Object.prototype.toString.call(t),Error(m(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function rs(e){var t=e._init;return t(e._payload)}function ls(e){function t(f,a){if(e){var d=f.deletions;d===null?(f.deletions=[a],f.flags|=16):d.push(a)}}function n(f,a){if(!e)return null;for(;a!==null;)t(f,a),a=a.sibling;return null}function r(f,a){for(f=new Map;a!==null;)a.key!==null?f.set(a.key,a):f.set(a.index,a),a=a.sibling;return f}function l(f,a){return f=Kt(f,a),f.index=0,f.sibling=null,f}function u(f,a,d){return f.index=d,e?(d=f.alternate,d!==null?(d=d.index,d<a?(f.flags|=2,a):d):(f.flags|=2,a)):(f.flags|=1048576,a)}function i(f){return e&&f.alternate===null&&(f.flags|=2),f}function o(f,a,d,w){return a===null||a.tag!==6?(a=gi(d,f.mode,w),a.return=f,a):(a=l(a,d),a.return=f,a)}function s(f,a,d,w){var z=d.type;return z===Ce?y(f,a,d.props.children,w,d.key):a!==null&&(a.elementType===z||typeof z=="object"&&z!==null&&z.$$typeof===Be&&rs(z)===a.type)?(w=l(a,d.props),w.ref=lr(f,a,d),w.return=f,w):(w=kl(d.type,d.key,d.props,null,f.mode,w),w.ref=lr(f,a,d),w.return=f,w)}function p(f,a,d,w){return a===null||a.tag!==4||a.stateNode.containerInfo!==d.containerInfo||a.stateNode.implementation!==d.implementation?(a=wi(d,f.mode,w),a.return=f,a):(a=l(a,d.children||[]),a.return=f,a)}function y(f,a,d,w,z){return a===null||a.tag!==7?(a=on(d,f.mode,w,z),a.return=f,a):(a=l(a,d),a.return=f,a)}function g(f,a,d){if(typeof a=="string"&&a!==""||typeof a=="number")return a=gi(""+a,f.mode,d),a.return=f,a;if(typeof a=="object"&&a!==null){switch(a.$$typeof){case ze:return d=kl(a.type,a.key,a.props,null,f.mode,d),d.ref=lr(f,null,a),d.return=f,d;case ke:return a=wi(a,f.mode,d),a.return=f,a;case Be:var w=a._init;return g(f,w(a._payload),d)}if(On(a)||j(a))return a=on(a,f.mode,d,null),a.return=f,a;Jr(f,a)}return null}function h(f,a,d,w){var z=a!==null?a.key:null;if(typeof d=="string"&&d!==""||typeof d=="number")return z!==null?null:o(f,a,""+d,w);if(typeof d=="object"&&d!==null){switch(d.$$typeof){case ze:return d.key===z?s(f,a,d,w):null;case ke:return d.key===z?p(f,a,d,w):null;case Be:return z=d._init,h(f,a,z(d._payload),w)}if(On(d)||j(d))return z!==null?null:y(f,a,d,w,null);Jr(f,d)}return null}function E(f,a,d,w,z){if(typeof w=="string"&&w!==""||typeof w=="number")return f=f.get(d)||null,o(a,f,""+w,z);if(typeof w=="object"&&w!==null){switch(w.$$typeof){case ze:return f=f.get(w.key===null?d:w.key)||null,s(a,f,w,z);case ke:return f=f.get(w.key===null?d:w.key)||null,p(a,f,w,z);case Be:var T=w._init;return E(f,a,d,T(w._payload),z)}if(On(w)||j(w))return f=f.get(d)||null,y(a,f,w,z,null);Jr(a,w)}return null}function C(f,a,d,w){for(var z=null,T=null,R=a,O=a=0,_e=null;R!==null&&O<d.length;O++){R.index>O?(_e=R,R=null):_e=R.sibling;var Y=h(f,R,d[O],w);if(Y===null){R===null&&(R=_e);break}e&&R&&Y.alternate===null&&t(f,R),a=u(Y,a,O),T===null?z=Y:T.sibling=Y,T=Y,R=_e}if(O===d.length)return n(f,R),se&&qt(f,O),z;if(R===null){for(;O<d.length;O++)R=g(f,d[O],w),R!==null&&(a=u(R,a,O),T===null?z=R:T.sibling=R,T=R);return se&&qt(f,O),z}for(R=r(f,R);O<d.length;O++)_e=E(R,f,O,d[O],w),_e!==null&&(e&&_e.alternate!==null&&R.delete(_e.key===null?O:_e.key),a=u(_e,a,O),T===null?z=_e:T.sibling=_e,T=_e);return e&&R.forEach(function(Yt){return t(f,Yt)}),se&&qt(f,O),z}function P(f,a,d,w){var z=j(d);if(typeof z!="function")throw Error(m(150));if(d=z.call(d),d==null)throw Error(m(151));for(var T=z=null,R=a,O=a=0,_e=null,Y=d.next();R!==null&&!Y.done;O++,Y=d.next()){R.index>O?(_e=R,R=null):_e=R.sibling;var Yt=h(f,R,Y.value,w);if(Yt===null){R===null&&(R=_e);break}e&&R&&Yt.alternate===null&&t(f,R),a=u(Yt,a,O),T===null?z=Yt:T.sibling=Yt,T=Yt,R=_e}if(Y.done)return n(f,R),se&&qt(f,O),z;if(R===null){for(;!Y.done;O++,Y=d.next())Y=g(f,Y.value,w),Y!==null&&(a=u(Y,a,O),T===null?z=Y:T.sibling=Y,T=Y);return se&&qt(f,O),z}for(R=r(f,R);!Y.done;O++,Y=d.next())Y=E(R,f,O,Y.value,w),Y!==null&&(e&&Y.alternate!==null&&R.delete(Y.key===null?O:Y.key),a=u(Y,a,O),T===null?z=Y:T.sibling=Y,T=Y);return e&&R.forEach(function(Of){return t(f,Of)}),se&&qt(f,O),z}function he(f,a,d,w){if(typeof d=="object"&&d!==null&&d.type===Ce&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case ze:e:{for(var z=d.key,T=a;T!==null;){if(T.key===z){if(z=d.type,z===Ce){if(T.tag===7){n(f,T.sibling),a=l(T,d.props.children),a.return=f,f=a;break e}}else if(T.elementType===z||typeof z=="object"&&z!==null&&z.$$typeof===Be&&rs(z)===T.type){n(f,T.sibling),a=l(T,d.props),a.ref=lr(f,T,d),a.return=f,f=a;break e}n(f,T);break}else t(f,T);T=T.sibling}d.type===Ce?(a=on(d.props.children,f.mode,w,d.key),a.return=f,f=a):(w=kl(d.type,d.key,d.props,null,f.mode,w),w.ref=lr(f,a,d),w.return=f,f=w)}return i(f);case ke:e:{for(T=d.key;a!==null;){if(a.key===T)if(a.tag===4&&a.stateNode.containerInfo===d.containerInfo&&a.stateNode.implementation===d.implementation){n(f,a.sibling),a=l(a,d.children||[]),a.return=f,f=a;break e}else{n(f,a);break}else t(f,a);a=a.sibling}a=wi(d,f.mode,w),a.return=f,f=a}return i(f);case Be:return T=d._init,he(f,a,T(d._payload),w)}if(On(d))return C(f,a,d,w);if(j(d))return P(f,a,d,w);Jr(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,a!==null&&a.tag===6?(n(f,a.sibling),a=l(a,d),a.return=f,f=a):(n(f,a),a=gi(d,f.mode,w),a.return=f,f=a),i(f)):n(f,a)}return he}var _n=ls(!0),us=ls(!1),qr=Ft(null),br=null,Cn=null,zu=null;function Tu(){zu=Cn=br=null}function Ru(e){var t=qr.current;ue(qr),e._currentValue=t}function Lu(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Pn(e,t){br=e,zu=Cn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&($e=!0),e.firstContext=null)}function rt(e){var t=e._currentValue;if(zu!==e)if(e={context:e,memoizedValue:t,next:null},Cn===null){if(br===null)throw Error(m(308));Cn=e,br.dependencies={lanes:0,firstContext:e}}else Cn=Cn.next=e;return t}var bt=null;function ju(e){bt===null?bt=[e]:bt.push(e)}function is(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,ju(t)):(n.next=l.next,l.next=n),t.interleaved=n,Ct(e,r)}function Ct(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var At=!1;function Ou(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function os(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Pt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Bt(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(Q&2)!==0){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,Ct(e,n)}return l=r.interleaved,l===null?(t.next=t,ju(r)):(t.next=l.next,l.next=t),r.interleaved=t,Ct(e,n)}function el(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Yl(e,n)}}function ss(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,u=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};u===null?l=u=i:u=u.next=i,n=n.next}while(n!==null);u===null?l=u=t:u=u.next=t}else l=u=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:u,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function tl(e,t,n,r){var l=e.updateQueue;At=!1;var u=l.firstBaseUpdate,i=l.lastBaseUpdate,o=l.shared.pending;if(o!==null){l.shared.pending=null;var s=o,p=s.next;s.next=null,i===null?u=p:i.next=p,i=s;var y=e.alternate;y!==null&&(y=y.updateQueue,o=y.lastBaseUpdate,o!==i&&(o===null?y.firstBaseUpdate=p:o.next=p,y.lastBaseUpdate=s))}if(u!==null){var g=l.baseState;i=0,y=p=s=null,o=u;do{var h=o.lane,E=o.eventTime;if((r&h)===h){y!==null&&(y=y.next={eventTime:E,lane:0,tag:o.tag,payload:o.payload,callback:o.callback,next:null});e:{var C=e,P=o;switch(h=t,E=n,P.tag){case 1:if(C=P.payload,typeof C=="function"){g=C.call(E,g,h);break e}g=C;break e;case 3:C.flags=C.flags&-65537|128;case 0:if(C=P.payload,h=typeof C=="function"?C.call(E,g,h):C,h==null)break e;g=_({},g,h);break e;case 2:At=!0}}o.callback!==null&&o.lane!==0&&(e.flags|=64,h=l.effects,h===null?l.effects=[o]:h.push(o))}else E={eventTime:E,lane:h,tag:o.tag,payload:o.payload,callback:o.callback,next:null},y===null?(p=y=E,s=g):y=y.next=E,i|=h;if(o=o.next,o===null){if(o=l.shared.pending,o===null)break;h=o,o=h.next,h.next=null,l.lastBaseUpdate=h,l.shared.pending=null}}while(!0);if(y===null&&(s=g),l.baseState=s,l.firstBaseUpdate=p,l.lastBaseUpdate=y,t=l.shared.interleaved,t!==null){l=t;do i|=l.lane,l=l.next;while(l!==t)}else u===null&&(l.shared.lanes=0);nn|=i,e.lanes=i,e.memoizedState=g}}function as(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var r=e[t],l=r.callback;if(l!==null){if(r.callback=null,r=n,typeof l!="function")throw Error(m(191,l));l.call(r)}}}var ur={},gt=Ft(ur),ir=Ft(ur),or=Ft(ur);function en(e){if(e===ur)throw Error(m(174));return e}function Mu(e,t){switch(re(or,t),re(ir,e),re(gt,ur),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Dl(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Dl(t,e)}ue(gt),re(gt,t)}function Nn(){ue(gt),ue(ir),ue(or)}function cs(e){en(or.current);var t=en(gt.current),n=Dl(t,e.type);t!==n&&(re(ir,e),re(gt,n))}function Du(e){ir.current===e&&(ue(gt),ue(ir))}var ae=Ft(0);function nl(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Fu=[];function Iu(){for(var e=0;e<Fu.length;e++)Fu[e]._workInProgressVersionPrimary=null;Fu.length=0}var rl=ve.ReactCurrentDispatcher,Uu=ve.ReactCurrentBatchConfig,tn=0,ce=null,we=null,Ee=null,ll=!1,sr=!1,ar=0,ef=0;function Le(){throw Error(m(321))}function Au(e,t){if(t===null)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!at(e[n],t[n]))return!1;return!0}function Bu(e,t,n,r,l,u){if(tn=u,ce=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,rl.current=e===null||e.memoizedState===null?lf:uf,e=n(r,l),sr){u=0;do{if(sr=!1,ar=0,25<=u)throw Error(m(301));u+=1,Ee=we=null,t.updateQueue=null,rl.current=of,e=n(r,l)}while(sr)}if(rl.current=ol,t=we!==null&&we.next!==null,tn=0,Ee=we=ce=null,ll=!1,t)throw Error(m(300));return e}function Hu(){var e=ar!==0;return ar=0,e}function wt(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Ee===null?ce.memoizedState=Ee=e:Ee=Ee.next=e,Ee}function lt(){if(we===null){var e=ce.alternate;e=e!==null?e.memoizedState:null}else e=we.next;var t=Ee===null?ce.memoizedState:Ee.next;if(t!==null)Ee=t,we=e;else{if(e===null)throw Error(m(310));we=e,e={memoizedState:we.memoizedState,baseState:we.baseState,baseQueue:we.baseQueue,queue:we.queue,next:null},Ee===null?ce.memoizedState=Ee=e:Ee=Ee.next=e}return Ee}function cr(e,t){return typeof t=="function"?t(e):t}function Vu(e){var t=lt(),n=t.queue;if(n===null)throw Error(m(311));n.lastRenderedReducer=e;var r=we,l=r.baseQueue,u=n.pending;if(u!==null){if(l!==null){var i=l.next;l.next=u.next,u.next=i}r.baseQueue=l=u,n.pending=null}if(l!==null){u=l.next,r=r.baseState;var o=i=null,s=null,p=u;do{var y=p.lane;if((tn&y)===y)s!==null&&(s=s.next={lane:0,action:p.action,hasEagerState:p.hasEagerState,eagerState:p.eagerState,next:null}),r=p.hasEagerState?p.eagerState:e(r,p.action);else{var g={lane:y,action:p.action,hasEagerState:p.hasEagerState,eagerState:p.eagerState,next:null};s===null?(o=s=g,i=r):s=s.next=g,ce.lanes|=y,nn|=y}p=p.next}while(p!==null&&p!==u);s===null?i=r:s.next=o,at(r,t.memoizedState)||($e=!0),t.memoizedState=r,t.baseState=i,t.baseQueue=s,n.lastRenderedState=r}if(e=n.interleaved,e!==null){l=e;do u=l.lane,ce.lanes|=u,nn|=u,l=l.next;while(l!==e)}else l===null&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function $u(e){var t=lt(),n=t.queue;if(n===null)throw Error(m(311));n.lastRenderedReducer=e;var r=n.dispatch,l=n.pending,u=t.memoizedState;if(l!==null){n.pending=null;var i=l=l.next;do u=e(u,i.action),i=i.next;while(i!==l);at(u,t.memoizedState)||($e=!0),t.memoizedState=u,t.baseQueue===null&&(t.baseState=u),n.lastRenderedState=u}return[u,r]}function fs(){}function ds(e,t){var n=ce,r=lt(),l=t(),u=!at(r.memoizedState,l);if(u&&(r.memoizedState=l,$e=!0),r=r.queue,Qu(hs.bind(null,n,r,e),[e]),r.getSnapshot!==t||u||Ee!==null&&Ee.memoizedState.tag&1){if(n.flags|=2048,fr(9,ms.bind(null,n,r,l,t),void 0,null),xe===null)throw Error(m(349));(tn&30)!==0||ps(n,t,l)}return l}function ps(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},t=ce.updateQueue,t===null?(t={lastEffect:null,stores:null},ce.updateQueue=t,t.stores=[e]):(n=t.stores,n===null?t.stores=[e]:n.push(e))}function ms(e,t,n,r){t.value=n,t.getSnapshot=r,vs(t)&&ys(e)}function hs(e,t,n){return n(function(){vs(t)&&ys(e)})}function vs(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!at(e,n)}catch{return!0}}function ys(e){var t=Ct(e,1);t!==null&&mt(t,e,1,-1)}function gs(e){var t=wt();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:cr,lastRenderedState:e},t.queue=e,e=e.dispatch=rf.bind(null,ce,e),[t.memoizedState,e]}function fr(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},t=ce.updateQueue,t===null?(t={lastEffect:null,stores:null},ce.updateQueue=t,t.lastEffect=e.next=e):(n=t.lastEffect,n===null?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e)),e}function ws(){return lt().memoizedState}function ul(e,t,n,r){var l=wt();ce.flags|=e,l.memoizedState=fr(1|t,n,void 0,r===void 0?null:r)}function il(e,t,n,r){var l=lt();r=r===void 0?null:r;var u=void 0;if(we!==null){var i=we.memoizedState;if(u=i.destroy,r!==null&&Au(r,i.deps)){l.memoizedState=fr(t,n,u,r);return}}ce.flags|=e,l.memoizedState=fr(1|t,n,u,r)}function Ss(e,t){return ul(8390656,8,e,t)}function Qu(e,t){return il(2048,8,e,t)}function ks(e,t){return il(4,2,e,t)}function Es(e,t){return il(4,4,e,t)}function xs(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function _s(e,t,n){return n=n!=null?n.concat([e]):null,il(4,4,xs.bind(null,t,e),n)}function Wu(){}function Cs(e,t){var n=lt();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&Au(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Ps(e,t){var n=lt();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&Au(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ns(e,t,n){return(tn&21)===0?(e.baseState&&(e.baseState=!1,$e=!0),e.memoizedState=n):(at(n,t)||(n=no(),ce.lanes|=n,nn|=n,e.baseState=!0),t)}function tf(e,t){var n=q;q=n!==0&&4>n?n:4,e(!0);var r=Uu.transition;Uu.transition={};try{e(!1),t()}finally{q=n,Uu.transition=r}}function zs(){return lt().memoizedState}function nf(e,t,n){var r=Qt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ts(e))Rs(t,n);else if(n=is(e,t,n,r),n!==null){var l=Ue();mt(n,e,r,l),Ls(n,t,r)}}function rf(e,t,n){var r=Qt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ts(e))Rs(t,l);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var i=t.lastRenderedState,o=u(i,n);if(l.hasEagerState=!0,l.eagerState=o,at(o,i)){var s=t.interleaved;s===null?(l.next=l,ju(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=is(e,t,l,r),n!==null&&(l=Ue(),mt(n,e,r,l),Ls(n,t,r))}}function Ts(e){var t=e.alternate;return e===ce||t!==null&&t===ce}function Rs(e,t){sr=ll=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Ls(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Yl(e,n)}}var ol={readContext:rt,useCallback:Le,useContext:Le,useEffect:Le,useImperativeHandle:Le,useInsertionEffect:Le,useLayoutEffect:Le,useMemo:Le,useReducer:Le,useRef:Le,useState:Le,useDebugValue:Le,useDeferredValue:Le,useTransition:Le,useMutableSource:Le,useSyncExternalStore:Le,useId:Le,unstable_isNewReconciler:!1},lf={readContext:rt,useCallback:function(e,t){return wt().memoizedState=[e,t===void 0?null:t],e},useContext:rt,useEffect:Ss,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,ul(4194308,4,xs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ul(4194308,4,e,t)},useInsertionEffect:function(e,t){return ul(4,2,e,t)},useMemo:function(e,t){var n=wt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=wt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=nf.bind(null,ce,e),[r.memoizedState,e]},useRef:function(e){var t=wt();return e={current:e},t.memoizedState=e},useState:gs,useDebugValue:Wu,useDeferredValue:function(e){return wt().memoizedState=e},useTransition:function(){var e=gs(!1),t=e[0];return e=tf.bind(null,e[1]),wt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ce,l=wt();if(se){if(n===void 0)throw Error(m(407));n=n()}else{if(n=t(),xe===null)throw Error(m(349));(tn&30)!==0||ps(r,t,n)}l.memoizedState=n;var u={value:n,getSnapshot:t};return l.queue=u,Ss(hs.bind(null,r,u,e),[e]),r.flags|=2048,fr(9,ms.bind(null,r,u,n,t),void 0,null),n},useId:function(){var e=wt(),t=xe.identifierPrefix;if(se){var n=_t,r=xt;n=(r&~(1<<32-st(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=ar++,0<n&&(t+="H"+n.toString(32)),t+=":"}else n=ef++,t=":"+t+"r"+n.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},uf={readContext:rt,useCallback:Cs,useContext:rt,useEffect:Qu,useImperativeHandle:_s,useInsertionEffect:ks,useLayoutEffect:Es,useMemo:Ps,useReducer:Vu,useRef:ws,useState:function(){return Vu(cr)},useDebugValue:Wu,useDeferredValue:function(e){var t=lt();return Ns(t,we.memoizedState,e)},useTransition:function(){var e=Vu(cr)[0],t=lt().memoizedState;return[e,t]},useMutableSource:fs,useSyncExternalStore:ds,useId:zs,unstable_isNewReconciler:!1},of={readContext:rt,useCallback:Cs,useContext:rt,useEffect:Qu,useImperativeHandle:_s,useInsertionEffect:ks,useLayoutEffect:Es,useMemo:Ps,useReducer:$u,useRef:ws,useState:function(){return $u(cr)},useDebugValue:Wu,useDeferredValue:function(e){var t=lt();return we===null?t.memoizedState=e:Ns(t,we.memoizedState,e)},useTransition:function(){var e=$u(cr)[0],t=lt().memoizedState;return[e,t]},useMutableSource:fs,useSyncExternalStore:ds,useId:zs,unstable_isNewReconciler:!1};function ft(e,t){if(e&&e.defaultProps){t=_({},t),e=e.defaultProps;for(var n in e)t[n]===void 0&&(t[n]=e[n]);return t}return t}function Ku(e,t,n,r){t=e.memoizedState,n=n(r,t),n=n==null?t:_({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var sl={isMounted:function(e){return(e=e._reactInternals)?Xt(e)===e:!1},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=Ue(),l=Qt(e),u=Pt(r,l);u.payload=t,n!=null&&(u.callback=n),t=Bt(e,u,l),t!==null&&(mt(t,e,l,r),el(t,e,l))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=Ue(),l=Qt(e),u=Pt(r,l);u.tag=1,u.payload=t,n!=null&&(u.callback=n),t=Bt(e,u,l),t!==null&&(mt(t,e,l,r),el(t,e,l))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Ue(),r=Qt(e),l=Pt(n,r);l.tag=2,t!=null&&(l.callback=t),t=Bt(e,l,r),t!==null&&(mt(t,e,r,n),el(t,e,r))}};function js(e,t,n,r,l,u,i){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(r,u,i):t.prototype&&t.prototype.isPureReactComponent?!Jn(n,r)||!Jn(l,u):!0}function Os(e,t,n){var r=!1,l=It,u=t.contextType;return typeof u=="object"&&u!==null?u=rt(u):(l=Ve(t)?Zt:Re.current,r=t.contextTypes,u=(r=r!=null)?Sn(e,l):It),t=new t(n,u),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=sl,e.stateNode=t,t._reactInternals=e,r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=l,e.__reactInternalMemoizedMaskedChildContext=u),t}function Ms(e,t,n,r){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(n,r),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&sl.enqueueReplaceState(t,t.state,null)}function Yu(e,t,n,r){var l=e.stateNode;l.props=n,l.state=e.memoizedState,l.refs={},Ou(e);var u=t.contextType;typeof u=="object"&&u!==null?l.context=rt(u):(u=Ve(t)?Zt:Re.current,l.context=Sn(e,u)),l.state=e.memoizedState,u=t.getDerivedStateFromProps,typeof u=="function"&&(Ku(e,t,u,n),l.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof l.getSnapshotBeforeUpdate=="function"||typeof l.UNSAFE_componentWillMount!="function"&&typeof l.componentWillMount!="function"||(t=l.state,typeof l.componentWillMount=="function"&&l.componentWillMount(),typeof l.UNSAFE_componentWillMount=="function"&&l.UNSAFE_componentWillMount(),t!==l.state&&sl.enqueueReplaceState(l,l.state,null),tl(e,n,l,r),l.state=e.memoizedState),typeof l.componentDidMount=="function"&&(e.flags|=4194308)}function zn(e,t){try{var n="",r=t;do n+=W(r),r=r.return;while(r);var l=n}catch(u){l=`
+Error generating stack: `+u.message+`
+`+u.stack}return{value:e,source:t,stack:l,digest:null}}function Xu(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function Gu(e,t){try{console.error(t.value)}catch(n){setTimeout(function(){throw n})}}var sf=typeof WeakMap=="function"?WeakMap:Map;function Ds(e,t,n){n=Pt(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){hl||(hl=!0,ci=r),Gu(e,t)},n}function Fs(e,t,n){n=Pt(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var l=t.value;n.payload=function(){return r(l)},n.callback=function(){Gu(e,t)}}var u=e.stateNode;return u!==null&&typeof u.componentDidCatch=="function"&&(n.callback=function(){Gu(e,t),typeof r!="function"&&(Vt===null?Vt=new Set([this]):Vt.add(this));var i=t.stack;this.componentDidCatch(t.value,{componentStack:i!==null?i:""})}),n}function Is(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new sf;var l=new Set;r.set(t,l)}else l=r.get(t),l===void 0&&(l=new Set,r.set(t,l));l.has(n)||(l.add(n),e=Ef.bind(null,e,t,n),t.then(e,e))}function Us(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function As(e,t,n,r,l){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=Pt(-1,1),t.tag=2,Bt(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=l,e)}var af=ve.ReactCurrentOwner,$e=!1;function Ie(e,t,n,r){t.child=e===null?us(t,null,n,r):_n(t,e.child,n,r)}function Bs(e,t,n,r,l){n=n.render;var u=t.ref;return Pn(t,l),r=Bu(e,t,n,r,u,l),n=Hu(),e!==null&&!$e?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,Nt(e,t,l)):(se&&n&&xu(t),t.flags|=1,Ie(e,t,r,l),t.child)}function Hs(e,t,n,r,l){if(e===null){var u=n.type;return typeof u=="function"&&!yi(u)&&u.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=u,Vs(e,t,u,r,l)):(e=kl(n.type,null,r,t,t.mode,l),e.ref=t.ref,e.return=t,t.child=e)}if(u=e.child,(e.lanes&l)===0){var i=u.memoizedProps;if(n=n.compare,n=n!==null?n:Jn,n(i,r)&&e.ref===t.ref)return Nt(e,t,l)}return t.flags|=1,e=Kt(u,r),e.ref=t.ref,e.return=t,t.child=e}function Vs(e,t,n,r,l){if(e!==null){var u=e.memoizedProps;if(Jn(u,r)&&e.ref===t.ref)if($e=!1,t.pendingProps=r=u,(e.lanes&l)!==0)(e.flags&131072)!==0&&($e=!0);else return t.lanes=e.lanes,Nt(e,t,l)}return Zu(e,t,n,r,l)}function $s(e,t,n){var r=t.pendingProps,l=r.children,u=e!==null?e.memoizedState:null;if(r.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},re(Rn,be),be|=n;else{if((n&1073741824)===0)return e=u!==null?u.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,re(Rn,be),be|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=u!==null?u.baseLanes:n,re(Rn,be),be|=r}else u!==null?(r=u.baseLanes|n,t.memoizedState=null):r=n,re(Rn,be),be|=r;return Ie(e,t,l,n),t.child}function Qs(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Zu(e,t,n,r,l){var u=Ve(n)?Zt:Re.current;return u=Sn(t,u),Pn(t,l),n=Bu(e,t,n,r,u,l),r=Hu(),e!==null&&!$e?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,Nt(e,t,l)):(se&&r&&xu(t),t.flags|=1,Ie(e,t,n,l),t.child)}function Ws(e,t,n,r,l){if(Ve(n)){var u=!0;Kr(t)}else u=!1;if(Pn(t,l),t.stateNode===null)cl(e,t),Os(t,n,r),Yu(t,n,r,l),r=!0;else if(e===null){var i=t.stateNode,o=t.memoizedProps;i.props=o;var s=i.context,p=n.contextType;typeof p=="object"&&p!==null?p=rt(p):(p=Ve(n)?Zt:Re.current,p=Sn(t,p));var y=n.getDerivedStateFromProps,g=typeof y=="function"||typeof i.getSnapshotBeforeUpdate=="function";g||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(o!==r||s!==p)&&Ms(t,i,r,p),At=!1;var h=t.memoizedState;i.state=h,tl(t,r,i,l),s=t.memoizedState,o!==r||h!==s||He.current||At?(typeof y=="function"&&(Ku(t,n,y,r),s=t.memoizedState),(o=At||js(t,n,o,r,h,s,p))?(g||typeof i.UNSAFE_componentWillMount!="function"&&typeof i.componentWillMount!="function"||(typeof i.componentWillMount=="function"&&i.componentWillMount(),typeof i.UNSAFE_componentWillMount=="function"&&i.UNSAFE_componentWillMount()),typeof i.componentDidMount=="function"&&(t.flags|=4194308)):(typeof i.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=s),i.props=r,i.state=s,i.context=p,r=o):(typeof i.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,os(e,t),o=t.memoizedProps,p=t.type===t.elementType?o:ft(t.type,o),i.props=p,g=t.pendingProps,h=i.context,s=n.contextType,typeof s=="object"&&s!==null?s=rt(s):(s=Ve(n)?Zt:Re.current,s=Sn(t,s));var E=n.getDerivedStateFromProps;(y=typeof E=="function"||typeof i.getSnapshotBeforeUpdate=="function")||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(o!==g||h!==s)&&Ms(t,i,r,s),At=!1,h=t.memoizedState,i.state=h,tl(t,r,i,l);var C=t.memoizedState;o!==g||h!==C||He.current||At?(typeof E=="function"&&(Ku(t,n,E,r),C=t.memoizedState),(p=At||js(t,n,p,r,h,C,s)||!1)?(y||typeof i.UNSAFE_componentWillUpdate!="function"&&typeof i.componentWillUpdate!="function"||(typeof i.componentWillUpdate=="function"&&i.componentWillUpdate(r,C,s),typeof i.UNSAFE_componentWillUpdate=="function"&&i.UNSAFE_componentWillUpdate(r,C,s)),typeof i.componentDidUpdate=="function"&&(t.flags|=4),typeof i.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof i.componentDidUpdate!="function"||o===e.memoizedProps&&h===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||o===e.memoizedProps&&h===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=C),i.props=r,i.state=C,i.context=s,r=p):(typeof i.componentDidUpdate!="function"||o===e.memoizedProps&&h===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||o===e.memoizedProps&&h===e.memoizedState||(t.flags|=1024),r=!1)}return Ju(e,t,n,r,u,l)}function Ju(e,t,n,r,l,u){Qs(e,t);var i=(t.flags&128)!==0;if(!r&&!i)return l&&Zo(t,n,!1),Nt(e,t,u);r=t.stateNode,af.current=t;var o=i&&typeof n.getDerivedStateFromError!="function"?null:r.render();return t.flags|=1,e!==null&&i?(t.child=_n(t,e.child,null,u),t.child=_n(t,null,o,u)):Ie(e,t,o,u),t.memoizedState=r.state,l&&Zo(t,n,!0),t.child}function Ks(e){var t=e.stateNode;t.pendingContext?Xo(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Xo(e,t.context,!1),Mu(e,t.containerInfo)}function Ys(e,t,n,r,l){return xn(),Nu(l),t.flags|=256,Ie(e,t,n,r),t.child}var qu={dehydrated:null,treeContext:null,retryLane:0};function bu(e){return{baseLanes:e,cachePool:null,transitions:null}}function Xs(e,t,n){var r=t.pendingProps,l=ae.current,u=!1,i=(t.flags&128)!==0,o;if((o=i)||(o=e!==null&&e.memoizedState===null?!1:(l&2)!==0),o?(u=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(l|=1),re(ae,l&1),e===null)return Pu(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(i=r.children,e=r.fallback,u?(r=t.mode,u=t.child,i={mode:"hidden",children:i},(r&1)===0&&u!==null?(u.childLanes=0,u.pendingProps=i):u=El(i,r,0,null),e=on(e,r,n,null),u.return=t,e.return=t,u.sibling=e,t.child=u,t.child.memoizedState=bu(n),t.memoizedState=qu,e):ei(t,i));if(l=e.memoizedState,l!==null&&(o=l.dehydrated,o!==null))return cf(e,t,i,r,o,l,n);if(u){u=r.fallback,i=t.mode,l=e.child,o=l.sibling;var s={mode:"hidden",children:r.children};return(i&1)===0&&t.child!==l?(r=t.child,r.childLanes=0,r.pendingProps=s,t.deletions=null):(r=Kt(l,s),r.subtreeFlags=l.subtreeFlags&14680064),o!==null?u=Kt(o,u):(u=on(u,i,n,null),u.flags|=2),u.return=t,r.return=t,r.sibling=u,t.child=r,r=u,u=t.child,i=e.child.memoizedState,i=i===null?bu(n):{baseLanes:i.baseLanes|n,cachePool:null,transitions:i.transitions},u.memoizedState=i,u.childLanes=e.childLanes&~n,t.memoizedState=qu,r}return u=e.child,e=u.sibling,r=Kt(u,{mode:"visible",children:r.children}),(t.mode&1)===0&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function ei(e,t){return t=El({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function al(e,t,n,r){return r!==null&&Nu(r),_n(t,e.child,null,n),e=ei(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function cf(e,t,n,r,l,u,i){if(n)return t.flags&256?(t.flags&=-257,r=Xu(Error(m(422))),al(e,t,i,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(u=r.fallback,l=t.mode,r=El({mode:"visible",children:r.children},l,0,null),u=on(u,l,i,null),u.flags|=2,r.return=t,u.return=t,r.sibling=u,t.child=r,(t.mode&1)!==0&&_n(t,e.child,null,i),t.child.memoizedState=bu(i),t.memoizedState=qu,u);if((t.mode&1)===0)return al(e,t,i,null);if(l.data==="$!"){if(r=l.nextSibling&&l.nextSibling.dataset,r)var o=r.dgst;return r=o,u=Error(m(419)),r=Xu(u,r,void 0),al(e,t,i,r)}if(o=(i&e.childLanes)!==0,$e||o){if(r=xe,r!==null){switch(i&-i){case 4:l=2;break;case 16:l=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:l=32;break;case 536870912:l=268435456;break;default:l=0}l=(l&(r.suspendedLanes|i))!==0?0:l,l!==0&&l!==u.retryLane&&(u.retryLane=l,Ct(e,l),mt(r,e,l,-1))}return vi(),r=Xu(Error(m(421))),al(e,t,i,r)}return l.data==="$?"?(t.flags|=128,t.child=e.child,t=xf.bind(null,e),l._reactRetry=t,null):(e=u.treeContext,qe=Dt(l.nextSibling),Je=t,se=!0,ct=null,e!==null&&(tt[nt++]=xt,tt[nt++]=_t,tt[nt++]=Jt,xt=e.id,_t=e.overflow,Jt=t),t=ei(t,r.children),t.flags|=4096,t)}function Gs(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),Lu(e.return,t,n)}function ti(e,t,n,r,l){var u=e.memoizedState;u===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:l}:(u.isBackwards=t,u.rendering=null,u.renderingStartTime=0,u.last=r,u.tail=n,u.tailMode=l)}function Zs(e,t,n){var r=t.pendingProps,l=r.revealOrder,u=r.tail;if(Ie(e,t,r.children,n),r=ae.current,(r&2)!==0)r=r&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Gs(e,n,t);else if(e.tag===19)Gs(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(re(ae,r),(t.mode&1)===0)t.memoizedState=null;else switch(l){case"forwards":for(n=t.child,l=null;n!==null;)e=n.alternate,e!==null&&nl(e)===null&&(l=n),n=n.sibling;n=l,n===null?(l=t.child,t.child=null):(l=n.sibling,n.sibling=null),ti(t,!1,l,n,u);break;case"backwards":for(n=null,l=t.child,t.child=null;l!==null;){if(e=l.alternate,e!==null&&nl(e)===null){t.child=l;break}e=l.sibling,l.sibling=n,n=l,l=e}ti(t,!0,n,null,u);break;case"together":ti(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function cl(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Nt(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),nn|=t.lanes,(n&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(m(153));if(t.child!==null){for(e=t.child,n=Kt(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=Kt(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function ff(e,t,n){switch(t.tag){case 3:Ks(t),xn();break;case 5:cs(t);break;case 1:Ve(t.type)&&Kr(t);break;case 4:Mu(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,l=t.memoizedProps.value;re(qr,r._currentValue),r._currentValue=l;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(re(ae,ae.current&1),t.flags|=128,null):(n&t.child.childLanes)!==0?Xs(e,t,n):(re(ae,ae.current&1),e=Nt(e,t,n),e!==null?e.sibling:null);re(ae,ae.current&1);break;case 19:if(r=(n&t.childLanes)!==0,(e.flags&128)!==0){if(r)return Zs(e,t,n);t.flags|=128}if(l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null,l.lastEffect=null),re(ae,ae.current),r)break;return null;case 22:case 23:return t.lanes=0,$s(e,t,n)}return Nt(e,t,n)}var Js,ni,qs,bs;Js=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},ni=function(){},qs=function(e,t,n,r){var l=e.memoizedProps;if(l!==r){e=t.stateNode,en(gt.current);var u=null;switch(n){case"input":l=Ll(e,l),r=Ll(e,r),u=[];break;case"select":l=_({},l,{value:void 0}),r=_({},r,{value:void 0}),u=[];break;case"textarea":l=Ml(e,l),r=Ml(e,r),u=[];break;default:typeof l.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=$r)}Fl(n,r);var i;n=null;for(p in l)if(!r.hasOwnProperty(p)&&l.hasOwnProperty(p)&&l[p]!=null)if(p==="style"){var o=l[p];for(i in o)o.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else p!=="dangerouslySetInnerHTML"&&p!=="children"&&p!=="suppressContentEditableWarning"&&p!=="suppressHydrationWarning"&&p!=="autoFocus"&&(L.hasOwnProperty(p)?u||(u=[]):(u=u||[]).push(p,null));for(p in r){var s=r[p];if(o=l!=null?l[p]:void 0,r.hasOwnProperty(p)&&s!==o&&(s!=null||o!=null))if(p==="style")if(o){for(i in o)!o.hasOwnProperty(i)||s&&s.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in s)s.hasOwnProperty(i)&&o[i]!==s[i]&&(n||(n={}),n[i]=s[i])}else n||(u||(u=[]),u.push(p,n)),n=s;else p==="dangerouslySetInnerHTML"?(s=s?s.__html:void 0,o=o?o.__html:void 0,s!=null&&o!==s&&(u=u||[]).push(p,s)):p==="children"?typeof s!="string"&&typeof s!="number"||(u=u||[]).push(p,""+s):p!=="suppressContentEditableWarning"&&p!=="suppressHydrationWarning"&&(L.hasOwnProperty(p)?(s!=null&&p==="onScroll"&&le("scroll",e),u||o===s||(u=[])):(u=u||[]).push(p,s))}n&&(u=u||[]).push("style",n);var p=u;(t.updateQueue=p)&&(t.flags|=4)}},bs=function(e,t,n,r){n!==r&&(t.flags|=4)};function dr(e,t){if(!se)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function je(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags&14680064,r|=l.flags&14680064,l.return=e,l=l.sibling;else for(l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags,r|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function df(e,t,n){var r=t.pendingProps;switch(_u(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return je(t),null;case 1:return Ve(t.type)&&Wr(),je(t),null;case 3:return r=t.stateNode,Nn(),ue(He),ue(Re),Iu(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(Zr(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,ct!==null&&(pi(ct),ct=null))),ni(e,t),je(t),null;case 5:Du(t);var l=en(or.current);if(n=t.type,e!==null&&t.stateNode!=null)qs(e,t,n,r,l),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(m(166));return je(t),null}if(e=en(gt.current),Zr(t)){r=t.stateNode,n=t.type;var u=t.memoizedProps;switch(r[yt]=t,r[nr]=u,e=(t.mode&1)!==0,n){case"dialog":le("cancel",r),le("close",r);break;case"iframe":case"object":case"embed":le("load",r);break;case"video":case"audio":for(l=0;l<bn.length;l++)le(bn[l],r);break;case"source":le("error",r);break;case"img":case"image":case"link":le("error",r),le("load",r);break;case"details":le("toggle",r);break;case"input":ji(r,u),le("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!u.multiple},le("invalid",r);break;case"textarea":Di(r,u),le("invalid",r)}Fl(n,u),l=null;for(var i in u)if(u.hasOwnProperty(i)){var o=u[i];i==="children"?typeof o=="string"?r.textContent!==o&&(u.suppressHydrationWarning!==!0&&Vr(r.textContent,o,e),l=["children",o]):typeof o=="number"&&r.textContent!==""+o&&(u.suppressHydrationWarning!==!0&&Vr(r.textContent,o,e),l=["children",""+o]):L.hasOwnProperty(i)&&o!=null&&i==="onScroll"&&le("scroll",r)}switch(n){case"input":wr(r),Mi(r,u,!0);break;case"textarea":wr(r),Ii(r);break;case"select":case"option":break;default:typeof u.onClick=="function"&&(r.onclick=$r)}r=l,t.updateQueue=r,r!==null&&(t.flags|=4)}else{i=l.nodeType===9?l:l.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=Ui(n)),e==="http://www.w3.org/1999/xhtml"?n==="script"?(e=i.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[yt]=t,e[nr]=r,Js(e,t,!1,!1),t.stateNode=e;e:{switch(i=Il(n,r),n){case"dialog":le("cancel",e),le("close",e),l=r;break;case"iframe":case"object":case"embed":le("load",e),l=r;break;case"video":case"audio":for(l=0;l<bn.length;l++)le(bn[l],e);l=r;break;case"source":le("error",e),l=r;break;case"img":case"image":case"link":le("error",e),le("load",e),l=r;break;case"details":le("toggle",e),l=r;break;case"input":ji(e,r),l=Ll(e,r),le("invalid",e);break;case"option":l=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},l=_({},r,{value:void 0}),le("invalid",e);break;case"textarea":Di(e,r),l=Ml(e,r),le("invalid",e);break;default:l=r}Fl(n,l),o=l;for(u in o)if(o.hasOwnProperty(u)){var s=o[u];u==="style"?Hi(e,s):u==="dangerouslySetInnerHTML"?(s=s?s.__html:void 0,s!=null&&Ai(e,s)):u==="children"?typeof s=="string"?(n!=="textarea"||s!=="")&&Mn(e,s):typeof s=="number"&&Mn(e,""+s):u!=="suppressContentEditableWarning"&&u!=="suppressHydrationWarning"&&u!=="autoFocus"&&(L.hasOwnProperty(u)?s!=null&&u==="onScroll"&&le("scroll",e):s!=null&&Ye(e,u,s,i))}switch(n){case"input":wr(e),Mi(e,r,!1);break;case"textarea":wr(e),Ii(e);break;case"option":r.value!=null&&e.setAttribute("value",""+J(r.value));break;case"select":e.multiple=!!r.multiple,u=r.value,u!=null?sn(e,!!r.multiple,u,!1):r.defaultValue!=null&&sn(e,!!r.multiple,r.defaultValue,!0);break;default:typeof l.onClick=="function"&&(e.onclick=$r)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return je(t),null;case 6:if(e&&t.stateNode!=null)bs(e,t,e.memoizedProps,r);else{if(typeof r!="string"&&t.stateNode===null)throw Error(m(166));if(n=en(or.current),en(gt.current),Zr(t)){if(r=t.stateNode,n=t.memoizedProps,r[yt]=t,(u=r.nodeValue!==n)&&(e=Je,e!==null))switch(e.tag){case 3:Vr(r.nodeValue,n,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&Vr(r.nodeValue,n,(e.mode&1)!==0)}u&&(t.flags|=4)}else r=(n.nodeType===9?n:n.ownerDocument).createTextNode(r),r[yt]=t,t.stateNode=r}return je(t),null;case 13:if(ue(ae),r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(se&&qe!==null&&(t.mode&1)!==0&&(t.flags&128)===0)ns(),xn(),t.flags|=98560,u=!1;else if(u=Zr(t),r!==null&&r.dehydrated!==null){if(e===null){if(!u)throw Error(m(318));if(u=t.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(m(317));u[yt]=t}else xn(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;je(t),u=!1}else ct!==null&&(pi(ct),ct=null),u=!0;if(!u)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=n,t):(r=r!==null,r!==(e!==null&&e.memoizedState!==null)&&r&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(ae.current&1)!==0?Se===0&&(Se=3):vi())),t.updateQueue!==null&&(t.flags|=4),je(t),null);case 4:return Nn(),ni(e,t),e===null&&er(t.stateNode.containerInfo),je(t),null;case 10:return Ru(t.type._context),je(t),null;case 17:return Ve(t.type)&&Wr(),je(t),null;case 19:if(ue(ae),u=t.memoizedState,u===null)return je(t),null;if(r=(t.flags&128)!==0,i=u.rendering,i===null)if(r)dr(u,!1);else{if(Se!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(i=nl(e),i!==null){for(t.flags|=128,dr(u,!1),r=i.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;n!==null;)u=n,e=r,u.flags&=14680066,i=u.alternate,i===null?(u.childLanes=0,u.lanes=e,u.child=null,u.subtreeFlags=0,u.memoizedProps=null,u.memoizedState=null,u.updateQueue=null,u.dependencies=null,u.stateNode=null):(u.childLanes=i.childLanes,u.lanes=i.lanes,u.child=i.child,u.subtreeFlags=0,u.deletions=null,u.memoizedProps=i.memoizedProps,u.memoizedState=i.memoizedState,u.updateQueue=i.updateQueue,u.type=i.type,e=i.dependencies,u.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return re(ae,ae.current&1|2),t.child}e=e.sibling}u.tail!==null&&me()>Ln&&(t.flags|=128,r=!0,dr(u,!1),t.lanes=4194304)}else{if(!r)if(e=nl(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),dr(u,!0),u.tail===null&&u.tailMode==="hidden"&&!i.alternate&&!se)return je(t),null}else 2*me()-u.renderingStartTime>Ln&&n!==1073741824&&(t.flags|=128,r=!0,dr(u,!1),t.lanes=4194304);u.isBackwards?(i.sibling=t.child,t.child=i):(n=u.last,n!==null?n.sibling=i:t.child=i,u.last=i)}return u.tail!==null?(t=u.tail,u.rendering=t,u.tail=t.sibling,u.renderingStartTime=me(),t.sibling=null,n=ae.current,re(ae,r?n&1|2:n&1),t):(je(t),null);case 22:case 23:return hi(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(be&1073741824)!==0&&(je(t),t.subtreeFlags&6&&(t.flags|=8192)):je(t),null;case 24:return null;case 25:return null}throw Error(m(156,t.tag))}function pf(e,t){switch(_u(t),t.tag){case 1:return Ve(t.type)&&Wr(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Nn(),ue(He),ue(Re),Iu(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Du(t),null;case 13:if(ue(ae),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(m(340));xn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ue(ae),null;case 4:return Nn(),null;case 10:return Ru(t.type._context),null;case 22:case 23:return hi(),null;case 24:return null;default:return null}}var fl=!1,Oe=!1,mf=typeof WeakSet=="function"?WeakSet:Set,x=null;function Tn(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){de(e,t,r)}else n.current=null}function ri(e,t,n){try{n()}catch(r){de(e,t,r)}}var ea=!1;function hf(e,t){if(hu=Lr,e=jo(),ou(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,u=r.focusNode;r=r.focusOffset;try{n.nodeType,u.nodeType}catch{n=null;break e}var i=0,o=-1,s=-1,p=0,y=0,g=e,h=null;t:for(;;){for(var E;g!==n||l!==0&&g.nodeType!==3||(o=i+l),g!==u||r!==0&&g.nodeType!==3||(s=i+r),g.nodeType===3&&(i+=g.nodeValue.length),(E=g.firstChild)!==null;)h=g,g=E;for(;;){if(g===e)break t;if(h===n&&++p===l&&(o=i),h===u&&++y===r&&(s=i),(E=g.nextSibling)!==null)break;g=h,h=g.parentNode}g=E}n=o===-1||s===-1?null:{start:o,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(vu={focusedElem:e,selectionRange:n},Lr=!1,x=t;x!==null;)if(t=x,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,x=e;else for(;x!==null;){t=x;try{var C=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(C!==null){var P=C.memoizedProps,he=C.memoizedState,f=t.stateNode,a=f.getSnapshotBeforeUpdate(t.elementType===t.type?P:ft(t.type,P),he);f.__reactInternalSnapshotBeforeUpdate=a}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(m(163))}}catch(w){de(t,t.return,w)}if(e=t.sibling,e!==null){e.return=t.return,x=e;break}x=t.return}return C=ea,ea=!1,C}function pr(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var u=l.destroy;l.destroy=void 0,u!==void 0&&ri(t,n,u)}l=l.next}while(l!==r)}}function dl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function li(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function ta(e){var t=e.alternate;t!==null&&(e.alternate=null,ta(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[yt],delete t[nr],delete t[Su],delete t[Zc],delete t[Jc])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function na(e){return e.tag===5||e.tag===3||e.tag===4}function ra(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||na(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ui(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=$r));else if(r!==4&&(e=e.child,e!==null))for(ui(e,t,n),e=e.sibling;e!==null;)ui(e,t,n),e=e.sibling}function ii(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ii(e,t,n),e=e.sibling;e!==null;)ii(e,t,n),e=e.sibling}var Pe=null,dt=!1;function Ht(e,t,n){for(n=n.child;n!==null;)la(e,t,n),n=n.sibling}function la(e,t,n){if(vt&&typeof vt.onCommitFiberUnmount=="function")try{vt.onCommitFiberUnmount(Cr,n)}catch{}switch(n.tag){case 5:Oe||Tn(n,t);case 6:var r=Pe,l=dt;Pe=null,Ht(e,t,n),Pe=r,dt=l,Pe!==null&&(dt?(e=Pe,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Pe.removeChild(n.stateNode));break;case 18:Pe!==null&&(dt?(e=Pe,n=n.stateNode,e.nodeType===8?wu(e.parentNode,n):e.nodeType===1&&wu(e,n),Wn(e)):wu(Pe,n.stateNode));break;case 4:r=Pe,l=dt,Pe=n.stateNode.containerInfo,dt=!0,Ht(e,t,n),Pe=r,dt=l;break;case 0:case 11:case 14:case 15:if(!Oe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var u=l,i=u.destroy;u=u.tag,i!==void 0&&((u&2)!==0||(u&4)!==0)&&ri(n,t,i),l=l.next}while(l!==r)}Ht(e,t,n);break;case 1:if(!Oe&&(Tn(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(o){de(n,t,o)}Ht(e,t,n);break;case 21:Ht(e,t,n);break;case 22:n.mode&1?(Oe=(r=Oe)||n.memoizedState!==null,Ht(e,t,n),Oe=r):Ht(e,t,n);break;default:Ht(e,t,n)}}function ua(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new mf),t.forEach(function(r){var l=_f.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function pt(e,t){var n=t.deletions;if(n!==null)for(var r=0;r<n.length;r++){var l=n[r];try{var u=e,i=t,o=i;e:for(;o!==null;){switch(o.tag){case 5:Pe=o.stateNode,dt=!1;break e;case 3:Pe=o.stateNode.containerInfo,dt=!0;break e;case 4:Pe=o.stateNode.containerInfo,dt=!0;break e}o=o.return}if(Pe===null)throw Error(m(160));la(u,i,l),Pe=null,dt=!1;var s=l.alternate;s!==null&&(s.return=null),l.return=null}catch(p){de(l,t,p)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)ia(t,e),t=t.sibling}function ia(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(pt(t,e),St(e),r&4){try{pr(3,e,e.return),dl(3,e)}catch(P){de(e,e.return,P)}try{pr(5,e,e.return)}catch(P){de(e,e.return,P)}}break;case 1:pt(t,e),St(e),r&512&&n!==null&&Tn(n,n.return);break;case 5:if(pt(t,e),St(e),r&512&&n!==null&&Tn(n,n.return),e.flags&32){var l=e.stateNode;try{Mn(l,"")}catch(P){de(e,e.return,P)}}if(r&4&&(l=e.stateNode,l!=null)){var u=e.memoizedProps,i=n!==null?n.memoizedProps:u,o=e.type,s=e.updateQueue;if(e.updateQueue=null,s!==null)try{o==="input"&&u.type==="radio"&&u.name!=null&&Oi(l,u),Il(o,i);var p=Il(o,u);for(i=0;i<s.length;i+=2){var y=s[i],g=s[i+1];y==="style"?Hi(l,g):y==="dangerouslySetInnerHTML"?Ai(l,g):y==="children"?Mn(l,g):Ye(l,y,g,p)}switch(o){case"input":jl(l,u);break;case"textarea":Fi(l,u);break;case"select":var h=l._wrapperState.wasMultiple;l._wrapperState.wasMultiple=!!u.multiple;var E=u.value;E!=null?sn(l,!!u.multiple,E,!1):h!==!!u.multiple&&(u.defaultValue!=null?sn(l,!!u.multiple,u.defaultValue,!0):sn(l,!!u.multiple,u.multiple?[]:"",!1))}l[nr]=u}catch(P){de(e,e.return,P)}}break;case 6:if(pt(t,e),St(e),r&4){if(e.stateNode===null)throw Error(m(162));l=e.stateNode,u=e.memoizedProps;try{l.nodeValue=u}catch(P){de(e,e.return,P)}}break;case 3:if(pt(t,e),St(e),r&4&&n!==null&&n.memoizedState.isDehydrated)try{Wn(t.containerInfo)}catch(P){de(e,e.return,P)}break;case 4:pt(t,e),St(e);break;case 13:pt(t,e),St(e),l=e.child,l.flags&8192&&(u=l.memoizedState!==null,l.stateNode.isHidden=u,!u||l.alternate!==null&&l.alternate.memoizedState!==null||(ai=me())),r&4&&ua(e);break;case 22:if(y=n!==null&&n.memoizedState!==null,e.mode&1?(Oe=(p=Oe)||y,pt(t,e),Oe=p):pt(t,e),St(e),r&8192){if(p=e.memoizedState!==null,(e.stateNode.isHidden=p)&&!y&&(e.mode&1)!==0)for(x=e,y=e.child;y!==null;){for(g=x=y;x!==null;){switch(h=x,E=h.child,h.tag){case 0:case 11:case 14:case 15:pr(4,h,h.return);break;case 1:Tn(h,h.return);var C=h.stateNode;if(typeof C.componentWillUnmount=="function"){r=h,n=h.return;try{t=r,C.props=t.memoizedProps,C.state=t.memoizedState,C.componentWillUnmount()}catch(P){de(r,n,P)}}break;case 5:Tn(h,h.return);break;case 22:if(h.memoizedState!==null){aa(g);continue}}E!==null?(E.return=h,x=E):aa(g)}y=y.sibling}e:for(y=null,g=e;;){if(g.tag===5){if(y===null){y=g;try{l=g.stateNode,p?(u=l.style,typeof u.setProperty=="function"?u.setProperty("display","none","important"):u.display="none"):(o=g.stateNode,s=g.memoizedProps.style,i=s!=null&&s.hasOwnProperty("display")?s.display:null,o.style.display=Bi("display",i))}catch(P){de(e,e.return,P)}}}else if(g.tag===6){if(y===null)try{g.stateNode.nodeValue=p?"":g.memoizedProps}catch(P){de(e,e.return,P)}}else if((g.tag!==22&&g.tag!==23||g.memoizedState===null||g===e)&&g.child!==null){g.child.return=g,g=g.child;continue}if(g===e)break e;for(;g.sibling===null;){if(g.return===null||g.return===e)break e;y===g&&(y=null),g=g.return}y===g&&(y=null),g.sibling.return=g.return,g=g.sibling}}break;case 19:pt(t,e),St(e),r&4&&ua(e);break;case 21:break;default:pt(t,e),St(e)}}function St(e){var t=e.flags;if(t&2){try{e:{for(var n=e.return;n!==null;){if(na(n)){var r=n;break e}n=n.return}throw Error(m(160))}switch(r.tag){case 5:var l=r.stateNode;r.flags&32&&(Mn(l,""),r.flags&=-33);var u=ra(e);ii(e,u,l);break;case 3:case 4:var i=r.stateNode.containerInfo,o=ra(e);ui(e,o,i);break;default:throw Error(m(161))}}catch(s){de(e,e.return,s)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function vf(e,t,n){x=e,oa(e)}function oa(e,t,n){for(var r=(e.mode&1)!==0;x!==null;){var l=x,u=l.child;if(l.tag===22&&r){var i=l.memoizedState!==null||fl;if(!i){var o=l.alternate,s=o!==null&&o.memoizedState!==null||Oe;o=fl;var p=Oe;if(fl=i,(Oe=s)&&!p)for(x=l;x!==null;)i=x,s=i.child,i.tag===22&&i.memoizedState!==null?ca(l):s!==null?(s.return=i,x=s):ca(l);for(;u!==null;)x=u,oa(u),u=u.sibling;x=l,fl=o,Oe=p}sa(e)}else(l.subtreeFlags&8772)!==0&&u!==null?(u.return=l,x=u):sa(e)}}function sa(e){for(;x!==null;){var t=x;if((t.flags&8772)!==0){var n=t.alternate;try{if((t.flags&8772)!==0)switch(t.tag){case 0:case 11:case 15:Oe||dl(5,t);break;case 1:var r=t.stateNode;if(t.flags&4&&!Oe)if(n===null)r.componentDidMount();else{var l=t.elementType===t.type?n.memoizedProps:ft(t.type,n.memoizedProps);r.componentDidUpdate(l,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var u=t.updateQueue;u!==null&&as(t,u,r);break;case 3:var i=t.updateQueue;if(i!==null){if(n=null,t.child!==null)switch(t.child.tag){case 5:n=t.child.stateNode;break;case 1:n=t.child.stateNode}as(t,i,n)}break;case 5:var o=t.stateNode;if(n===null&&t.flags&4){n=o;var s=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":s.autoFocus&&n.focus();break;case"img":s.src&&(n.src=s.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var p=t.alternate;if(p!==null){var y=p.memoizedState;if(y!==null){var g=y.dehydrated;g!==null&&Wn(g)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(m(163))}Oe||t.flags&512&&li(t)}catch(h){de(t,t.return,h)}}if(t===e){x=null;break}if(n=t.sibling,n!==null){n.return=t.return,x=n;break}x=t.return}}function aa(e){for(;x!==null;){var t=x;if(t===e){x=null;break}var n=t.sibling;if(n!==null){n.return=t.return,x=n;break}x=t.return}}function ca(e){for(;x!==null;){var t=x;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{dl(4,t)}catch(s){de(t,n,s)}break;case 1:var r=t.stateNode;if(typeof r.componentDidMount=="function"){var l=t.return;try{r.componentDidMount()}catch(s){de(t,l,s)}}var u=t.return;try{li(t)}catch(s){de(t,u,s)}break;case 5:var i=t.return;try{li(t)}catch(s){de(t,i,s)}}}catch(s){de(t,t.return,s)}if(t===e){x=null;break}var o=t.sibling;if(o!==null){o.return=t.return,x=o;break}x=t.return}}var yf=Math.ceil,pl=ve.ReactCurrentDispatcher,oi=ve.ReactCurrentOwner,ut=ve.ReactCurrentBatchConfig,Q=0,xe=null,ye=null,Ne=0,be=0,Rn=Ft(0),Se=0,mr=null,nn=0,ml=0,si=0,hr=null,Qe=null,ai=0,Ln=1/0,zt=null,hl=!1,ci=null,Vt=null,vl=!1,$t=null,yl=0,vr=0,fi=null,gl=-1,wl=0;function Ue(){return(Q&6)!==0?me():gl!==-1?gl:gl=me()}function Qt(e){return(e.mode&1)===0?1:(Q&2)!==0&&Ne!==0?Ne&-Ne:bc.transition!==null?(wl===0&&(wl=no()),wl):(e=q,e!==0||(e=window.event,e=e===void 0?16:fo(e.type)),e)}function mt(e,t,n,r){if(50<vr)throw vr=0,fi=null,Error(m(185));Bn(e,n,r),((Q&2)===0||e!==xe)&&(e===xe&&((Q&2)===0&&(ml|=n),Se===4&&Wt(e,Ne)),We(e,r),n===1&&Q===0&&(t.mode&1)===0&&(Ln=me()+500,Yr&&Ut()))}function We(e,t){var n=e.callbackNode;ba(e,t);var r=zr(e,e===xe?Ne:0);if(r===0)n!==null&&bi(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(n!=null&&bi(n),t===1)e.tag===0?qc(da.bind(null,e)):Jo(da.bind(null,e)),Xc(function(){(Q&6)===0&&Ut()}),n=null;else{switch(ro(r)){case 1:n=Ql;break;case 4:n=eo;break;case 16:n=_r;break;case 536870912:n=to;break;default:n=_r}n=Sa(n,fa.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function fa(e,t){if(gl=-1,wl=0,(Q&6)!==0)throw Error(m(327));var n=e.callbackNode;if(jn()&&e.callbackNode!==n)return null;var r=zr(e,e===xe?Ne:0);if(r===0)return null;if((r&30)!==0||(r&e.expiredLanes)!==0||t)t=Sl(e,r);else{t=r;var l=Q;Q|=2;var u=ma();(xe!==e||Ne!==t)&&(zt=null,Ln=me()+500,ln(e,t));do try{Sf();break}catch(o){pa(e,o)}while(!0);Tu(),pl.current=u,Q=l,ye!==null?t=0:(xe=null,Ne=0,t=Se)}if(t!==0){if(t===2&&(l=Wl(e),l!==0&&(r=l,t=di(e,l))),t===1)throw n=mr,ln(e,0),Wt(e,r),We(e,me()),n;if(t===6)Wt(e,r);else{if(l=e.current.alternate,(r&30)===0&&!gf(l)&&(t=Sl(e,r),t===2&&(u=Wl(e),u!==0&&(r=u,t=di(e,u))),t===1))throw n=mr,ln(e,0),Wt(e,r),We(e,me()),n;switch(e.finishedWork=l,e.finishedLanes=r,t){case 0:case 1:throw Error(m(345));case 2:un(e,Qe,zt);break;case 3:if(Wt(e,r),(r&130023424)===r&&(t=ai+500-me(),10<t)){if(zr(e,0)!==0)break;if(l=e.suspendedLanes,(l&r)!==r){Ue(),e.pingedLanes|=e.suspendedLanes&l;break}e.timeoutHandle=gu(un.bind(null,e,Qe,zt),t);break}un(e,Qe,zt);break;case 4:if(Wt(e,r),(r&4194240)===r)break;for(t=e.eventTimes,l=-1;0<r;){var i=31-st(r);u=1<<i,i=t[i],i>l&&(l=i),r&=~u}if(r=l,r=me()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*yf(r/1960))-r,10<r){e.timeoutHandle=gu(un.bind(null,e,Qe,zt),r);break}un(e,Qe,zt);break;case 5:un(e,Qe,zt);break;default:throw Error(m(329))}}}return We(e,me()),e.callbackNode===n?fa.bind(null,e):null}function di(e,t){var n=hr;return e.current.memoizedState.isDehydrated&&(ln(e,t).flags|=256),e=Sl(e,t),e!==2&&(t=Qe,Qe=n,t!==null&&pi(t)),e}function pi(e){Qe===null?Qe=e:Qe.push.apply(Qe,e)}function gf(e){for(var t=e;;){if(t.flags&16384){var n=t.updateQueue;if(n!==null&&(n=n.stores,n!==null))for(var r=0;r<n.length;r++){var l=n[r],u=l.getSnapshot;l=l.value;try{if(!at(u(),l))return!1}catch{return!1}}}if(n=t.child,t.subtreeFlags&16384&&n!==null)n.return=t,t=n;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Wt(e,t){for(t&=~si,t&=~ml,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-st(t),r=1<<n;e[n]=-1,t&=~r}}function da(e){if((Q&6)!==0)throw Error(m(327));jn();var t=zr(e,0);if((t&1)===0)return We(e,me()),null;var n=Sl(e,t);if(e.tag!==0&&n===2){var r=Wl(e);r!==0&&(t=r,n=di(e,r))}if(n===1)throw n=mr,ln(e,0),Wt(e,t),We(e,me()),n;if(n===6)throw Error(m(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,un(e,Qe,zt),We(e,me()),null}function mi(e,t){var n=Q;Q|=1;try{return e(t)}finally{Q=n,Q===0&&(Ln=me()+500,Yr&&Ut())}}function rn(e){$t!==null&&$t.tag===0&&(Q&6)===0&&jn();var t=Q;Q|=1;var n=ut.transition,r=q;try{if(ut.transition=null,q=1,e)return e()}finally{q=r,ut.transition=n,Q=t,(Q&6)===0&&Ut()}}function hi(){be=Rn.current,ue(Rn)}function ln(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(n!==-1&&(e.timeoutHandle=-1,Yc(n)),ye!==null)for(n=ye.return;n!==null;){var r=n;switch(_u(r),r.tag){case 1:r=r.type.childContextTypes,r!=null&&Wr();break;case 3:Nn(),ue(He),ue(Re),Iu();break;case 5:Du(r);break;case 4:Nn();break;case 13:ue(ae);break;case 19:ue(ae);break;case 10:Ru(r.type._context);break;case 22:case 23:hi()}n=n.return}if(xe=e,ye=e=Kt(e.current,null),Ne=be=t,Se=0,mr=null,si=ml=nn=0,Qe=hr=null,bt!==null){for(t=0;t<bt.length;t++)if(n=bt[t],r=n.interleaved,r!==null){n.interleaved=null;var l=r.next,u=n.pending;if(u!==null){var i=u.next;u.next=l,r.next=i}n.pending=r}bt=null}return e}function pa(e,t){do{var n=ye;try{if(Tu(),rl.current=ol,ll){for(var r=ce.memoizedState;r!==null;){var l=r.queue;l!==null&&(l.pending=null),r=r.next}ll=!1}if(tn=0,Ee=we=ce=null,sr=!1,ar=0,oi.current=null,n===null||n.return===null){Se=1,mr=t,ye=null;break}e:{var u=e,i=n.return,o=n,s=t;if(t=Ne,o.flags|=32768,s!==null&&typeof s=="object"&&typeof s.then=="function"){var p=s,y=o,g=y.tag;if((y.mode&1)===0&&(g===0||g===11||g===15)){var h=y.alternate;h?(y.updateQueue=h.updateQueue,y.memoizedState=h.memoizedState,y.lanes=h.lanes):(y.updateQueue=null,y.memoizedState=null)}var E=Us(i);if(E!==null){E.flags&=-257,As(E,i,o,u,t),E.mode&1&&Is(u,p,t),t=E,s=p;var C=t.updateQueue;if(C===null){var P=new Set;P.add(s),t.updateQueue=P}else C.add(s);break e}else{if((t&1)===0){Is(u,p,t),vi();break e}s=Error(m(426))}}else if(se&&o.mode&1){var he=Us(i);if(he!==null){(he.flags&65536)===0&&(he.flags|=256),As(he,i,o,u,t),Nu(zn(s,o));break e}}u=s=zn(s,o),Se!==4&&(Se=2),hr===null?hr=[u]:hr.push(u),u=i;do{switch(u.tag){case 3:u.flags|=65536,t&=-t,u.lanes|=t;var f=Ds(u,s,t);ss(u,f);break e;case 1:o=s;var a=u.type,d=u.stateNode;if((u.flags&128)===0&&(typeof a.getDerivedStateFromError=="function"||d!==null&&typeof d.componentDidCatch=="function"&&(Vt===null||!Vt.has(d)))){u.flags|=65536,t&=-t,u.lanes|=t;var w=Fs(u,o,t);ss(u,w);break e}}u=u.return}while(u!==null)}va(n)}catch(z){t=z,ye===n&&n!==null&&(ye=n=n.return);continue}break}while(!0)}function ma(){var e=pl.current;return pl.current=ol,e===null?ol:e}function vi(){(Se===0||Se===3||Se===2)&&(Se=4),xe===null||(nn&268435455)===0&&(ml&268435455)===0||Wt(xe,Ne)}function Sl(e,t){var n=Q;Q|=2;var r=ma();(xe!==e||Ne!==t)&&(zt=null,ln(e,t));do try{wf();break}catch(l){pa(e,l)}while(!0);if(Tu(),Q=n,pl.current=r,ye!==null)throw Error(m(261));return xe=null,Ne=0,Se}function wf(){for(;ye!==null;)ha(ye)}function Sf(){for(;ye!==null&&!Qa();)ha(ye)}function ha(e){var t=wa(e.alternate,e,be);e.memoizedProps=e.pendingProps,t===null?va(e):ye=t,oi.current=null}function va(e){var t=e;do{var n=t.alternate;if(e=t.return,(t.flags&32768)===0){if(n=df(n,t,be),n!==null){ye=n;return}}else{if(n=pf(n,t),n!==null){n.flags&=32767,ye=n;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{Se=6,ye=null;return}}if(t=t.sibling,t!==null){ye=t;return}ye=t=e}while(t!==null);Se===0&&(Se=5)}function un(e,t,n){var r=q,l=ut.transition;try{ut.transition=null,q=1,kf(e,t,n,r)}finally{ut.transition=l,q=r}return null}function kf(e,t,n,r){do jn();while($t!==null);if((Q&6)!==0)throw Error(m(327));n=e.finishedWork;var l=e.finishedLanes;if(n===null)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(m(177));e.callbackNode=null,e.callbackPriority=0;var u=n.lanes|n.childLanes;if(ec(e,u),e===xe&&(ye=xe=null,Ne=0),(n.subtreeFlags&2064)===0&&(n.flags&2064)===0||vl||(vl=!0,Sa(_r,function(){return jn(),null})),u=(n.flags&15990)!==0,(n.subtreeFlags&15990)!==0||u){u=ut.transition,ut.transition=null;var i=q;q=1;var o=Q;Q|=4,oi.current=null,hf(e,n),ia(n,e),Bc(vu),Lr=!!hu,vu=hu=null,e.current=n,vf(n),Wa(),Q=o,q=i,ut.transition=u}else e.current=n;if(vl&&(vl=!1,$t=e,yl=l),u=e.pendingLanes,u===0&&(Vt=null),Xa(n.stateNode),We(e,me()),t!==null)for(r=e.onRecoverableError,n=0;n<t.length;n++)l=t[n],r(l.value,{componentStack:l.stack,digest:l.digest});if(hl)throw hl=!1,e=ci,ci=null,e;return(yl&1)!==0&&e.tag!==0&&jn(),u=e.pendingLanes,(u&1)!==0?e===fi?vr++:(vr=0,fi=e):vr=0,Ut(),null}function jn(){if($t!==null){var e=ro(yl),t=ut.transition,n=q;try{if(ut.transition=null,q=16>e?16:e,$t===null)var r=!1;else{if(e=$t,$t=null,yl=0,(Q&6)!==0)throw Error(m(331));var l=Q;for(Q|=4,x=e.current;x!==null;){var u=x,i=u.child;if((x.flags&16)!==0){var o=u.deletions;if(o!==null){for(var s=0;s<o.length;s++){var p=o[s];for(x=p;x!==null;){var y=x;switch(y.tag){case 0:case 11:case 15:pr(8,y,u)}var g=y.child;if(g!==null)g.return=y,x=g;else for(;x!==null;){y=x;var h=y.sibling,E=y.return;if(ta(y),y===p){x=null;break}if(h!==null){h.return=E,x=h;break}x=E}}}var C=u.alternate;if(C!==null){var P=C.child;if(P!==null){C.child=null;do{var he=P.sibling;P.sibling=null,P=he}while(P!==null)}}x=u}}if((u.subtreeFlags&2064)!==0&&i!==null)i.return=u,x=i;else e:for(;x!==null;){if(u=x,(u.flags&2048)!==0)switch(u.tag){case 0:case 11:case 15:pr(9,u,u.return)}var f=u.sibling;if(f!==null){f.return=u.return,x=f;break e}x=u.return}}var a=e.current;for(x=a;x!==null;){i=x;var d=i.child;if((i.subtreeFlags&2064)!==0&&d!==null)d.return=i,x=d;else e:for(i=a;x!==null;){if(o=x,(o.flags&2048)!==0)try{switch(o.tag){case 0:case 11:case 15:dl(9,o)}}catch(z){de(o,o.return,z)}if(o===i){x=null;break e}var w=o.sibling;if(w!==null){w.return=o.return,x=w;break e}x=o.return}}if(Q=l,Ut(),vt&&typeof vt.onPostCommitFiberRoot=="function")try{vt.onPostCommitFiberRoot(Cr,e)}catch{}r=!0}return r}finally{q=n,ut.transition=t}}return!1}function ya(e,t,n){t=zn(n,t),t=Ds(e,t,1),e=Bt(e,t,1),t=Ue(),e!==null&&(Bn(e,1,t),We(e,t))}function de(e,t,n){if(e.tag===3)ya(e,e,n);else for(;t!==null;){if(t.tag===3){ya(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof r.componentDidCatch=="function"&&(Vt===null||!Vt.has(r))){e=zn(n,e),e=Fs(t,e,1),t=Bt(t,e,1),e=Ue(),t!==null&&(Bn(t,1,e),We(t,e));break}}t=t.return}}function Ef(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),t=Ue(),e.pingedLanes|=e.suspendedLanes&n,xe===e&&(Ne&n)===n&&(Se===4||Se===3&&(Ne&130023424)===Ne&&500>me()-ai?ln(e,0):si|=n),We(e,t)}function ga(e,t){t===0&&((e.mode&1)===0?t=1:(t=Nr,Nr<<=1,(Nr&130023424)===0&&(Nr=4194304)));var n=Ue();e=Ct(e,t),e!==null&&(Bn(e,t,n),We(e,n))}function xf(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),ga(e,n)}function _f(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(m(314))}r!==null&&r.delete(t),ga(e,n)}var wa;wa=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||He.current)$e=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return $e=!1,ff(e,t,n);$e=(e.flags&131072)!==0}else $e=!1,se&&(t.flags&1048576)!==0&&qo(t,Gr,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;cl(e,t),e=t.pendingProps;var l=Sn(t,Re.current);Pn(t,n),l=Bu(null,t,r,e,l,n);var u=Hu();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ve(r)?(u=!0,Kr(t)):u=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Ou(t),l.updater=sl,t.stateNode=l,l._reactInternals=t,Yu(t,r,e,n),t=Ju(null,t,r,!0,u,n)):(t.tag=0,se&&u&&xu(t),Ie(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(cl(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=Pf(r),e=ft(r,e),l){case 0:t=Zu(null,t,r,e,n);break e;case 1:t=Ws(null,t,r,e,n);break e;case 11:t=Bs(null,t,r,e,n);break e;case 14:t=Hs(null,t,r,ft(r.type,e),n);break e}throw Error(m(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ft(r,l),Zu(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ft(r,l),Ws(e,t,r,l,n);case 3:e:{if(Ks(t),e===null)throw Error(m(387));r=t.pendingProps,u=t.memoizedState,l=u.element,os(e,t),tl(t,r,null,n);var i=t.memoizedState;if(r=i.element,u.isDehydrated)if(u={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){l=zn(Error(m(423)),t),t=Ys(e,t,r,n,l);break e}else if(r!==l){l=zn(Error(m(424)),t),t=Ys(e,t,r,n,l);break e}else for(qe=Dt(t.stateNode.containerInfo.firstChild),Je=t,se=!0,ct=null,n=us(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(xn(),r===l){t=Nt(e,t,n);break e}Ie(e,t,r,n)}t=t.child}return t;case 5:return cs(t),e===null&&Pu(t),r=t.type,l=t.pendingProps,u=e!==null?e.memoizedProps:null,i=l.children,yu(r,l)?i=null:u!==null&&yu(r,u)&&(t.flags|=32),Qs(e,t),Ie(e,t,i,n),t.child;case 6:return e===null&&Pu(t),null;case 13:return Xs(e,t,n);case 4:return Mu(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=_n(t,null,r,n):Ie(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ft(r,l),Bs(e,t,r,l,n);case 7:return Ie(e,t,t.pendingProps,n),t.child;case 8:return Ie(e,t,t.pendingProps.children,n),t.child;case 12:return Ie(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,u=t.memoizedProps,i=l.value,re(qr,r._currentValue),r._currentValue=i,u!==null)if(at(u.value,i)){if(u.children===l.children&&!He.current){t=Nt(e,t,n);break e}}else for(u=t.child,u!==null&&(u.return=t);u!==null;){var o=u.dependencies;if(o!==null){i=u.child;for(var s=o.firstContext;s!==null;){if(s.context===r){if(u.tag===1){s=Pt(-1,n&-n),s.tag=2;var p=u.updateQueue;if(p!==null){p=p.shared;var y=p.pending;y===null?s.next=s:(s.next=y.next,y.next=s),p.pending=s}}u.lanes|=n,s=u.alternate,s!==null&&(s.lanes|=n),Lu(u.return,n,t),o.lanes|=n;break}s=s.next}}else if(u.tag===10)i=u.type===t.type?null:u.child;else if(u.tag===18){if(i=u.return,i===null)throw Error(m(341));i.lanes|=n,o=i.alternate,o!==null&&(o.lanes|=n),Lu(i,n,t),i=u.sibling}else i=u.child;if(i!==null)i.return=u;else for(i=u;i!==null;){if(i===t){i=null;break}if(u=i.sibling,u!==null){u.return=i.return,i=u;break}i=i.return}u=i}Ie(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,Pn(t,n),l=rt(l),r=r(l),t.flags|=1,Ie(e,t,r,n),t.child;case 14:return r=t.type,l=ft(r,t.pendingProps),l=ft(r.type,l),Hs(e,t,r,l,n);case 15:return Vs(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ft(r,l),cl(e,t),t.tag=1,Ve(r)?(e=!0,Kr(t)):e=!1,Pn(t,n),Os(t,r,l),Yu(t,r,l,n),Ju(null,t,r,!0,e,n);case 19:return Zs(e,t,n);case 22:return $s(e,t,n)}throw Error(m(156,t.tag))};function Sa(e,t){return qi(e,t)}function Cf(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function it(e,t,n,r){return new Cf(e,t,n,r)}function yi(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Pf(e){if(typeof e=="function")return yi(e)?1:0;if(e!=null){if(e=e.$$typeof,e===De)return 11;if(e===ht)return 14}return 2}function Kt(e,t){var n=e.alternate;return n===null?(n=it(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function kl(e,t,n,r,l,u){var i=2;if(r=e,typeof e=="function")yi(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case Ce:return on(n.children,l,u,t);case Te:i=8,l|=8;break;case Xe:return e=it(12,n,t,l|2),e.elementType=Xe,e.lanes=u,e;case Fe:return e=it(13,n,t,l),e.elementType=Fe,e.lanes=u,e;case ot:return e=it(19,n,t,l),e.elementType=ot,e.lanes=u,e;case fe:return El(n,l,u,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ie:i=10;break e;case pe:i=9;break e;case De:i=11;break e;case ht:i=14;break e;case Be:i=16,r=null;break e}throw Error(m(130,e==null?e:typeof e,""))}return t=it(i,n,t,l),t.elementType=e,t.type=r,t.lanes=u,t}function on(e,t,n,r){return e=it(7,e,r,t),e.lanes=n,e}function El(e,t,n,r){return e=it(22,e,r,t),e.elementType=fe,e.lanes=n,e.stateNode={isHidden:!1},e}function gi(e,t,n){return e=it(6,e,null,t),e.lanes=n,e}function wi(e,t,n){return t=it(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Nf(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Kl(0),this.expirationTimes=Kl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Kl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Si(e,t,n,r,l,u,i,o,s){return e=new Nf(e,t,n,o,s),t===1?(t=1,u===!0&&(t|=8)):t=0,u=it(3,null,null,t),e.current=u,u.stateNode=e,u.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ou(u),e}function zf(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:ke,key:r==null?null:""+r,children:e,containerInfo:t,implementation:n}}function ka(e){if(!e)return It;e=e._reactInternals;e:{if(Xt(e)!==e||e.tag!==1)throw Error(m(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Ve(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(m(171))}if(e.tag===1){var n=e.type;if(Ve(n))return Go(e,n,t)}return t}function Ea(e,t,n,r,l,u,i,o,s){return e=Si(n,r,!0,e,l,u,i,o,s),e.context=ka(null),n=e.current,r=Ue(),l=Qt(n),u=Pt(r,l),u.callback=t??null,Bt(n,u,l),e.current.lanes=l,Bn(e,l,r),We(e,r),e}function xl(e,t,n,r){var l=t.current,u=Ue(),i=Qt(l);return n=ka(n),t.context===null?t.context=n:t.pendingContext=n,t=Pt(u,i),t.payload={element:e},r=r===void 0?null:r,r!==null&&(t.callback=r),e=Bt(l,t,i),e!==null&&(mt(e,l,i,u),el(e,l,i)),i}function _l(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function xa(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var n=e.retryLane;e.retryLane=n!==0&&n<t?n:t}}function ki(e,t){xa(e,t),(e=e.alternate)&&xa(e,t)}function Tf(){return null}var _a=typeof reportError=="function"?reportError:function(e){console.error(e)};function Ei(e){this._internalRoot=e}Cl.prototype.render=Ei.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(m(409));xl(e,t,null,null)},Cl.prototype.unmount=Ei.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;rn(function(){xl(null,e,null,null)}),t[kt]=null}};function Cl(e){this._internalRoot=e}Cl.prototype.unstable_scheduleHydration=function(e){if(e){var t=io();e={blockedOn:null,target:e,priority:t};for(var n=0;n<jt.length&&t!==0&&t<jt[n].priority;n++);jt.splice(n,0,e),n===0&&ao(e)}};function xi(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function Pl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function Ca(){}function Rf(e,t,n,r,l){if(l){if(typeof r=="function"){var u=r;r=function(){var p=_l(i);u.call(p)}}var i=Ea(t,r,e,0,null,!1,!1,"",Ca);return e._reactRootContainer=i,e[kt]=i.current,er(e.nodeType===8?e.parentNode:e),rn(),i}for(;l=e.lastChild;)e.removeChild(l);if(typeof r=="function"){var o=r;r=function(){var p=_l(s);o.call(p)}}var s=Si(e,0,!1,null,null,!1,!1,"",Ca);return e._reactRootContainer=s,e[kt]=s.current,er(e.nodeType===8?e.parentNode:e),rn(function(){xl(t,s,n,r)}),s}function Nl(e,t,n,r,l){var u=n._reactRootContainer;if(u){var i=u;if(typeof l=="function"){var o=l;l=function(){var s=_l(i);o.call(s)}}xl(t,i,e,l)}else i=Rf(n,t,e,l,r);return _l(i)}lo=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=An(t.pendingLanes);n!==0&&(Yl(t,n|1),We(t,me()),(Q&6)===0&&(Ln=me()+500,Ut()))}break;case 13:rn(function(){var r=Ct(e,1);if(r!==null){var l=Ue();mt(r,e,1,l)}}),ki(e,1)}},Xl=function(e){if(e.tag===13){var t=Ct(e,134217728);if(t!==null){var n=Ue();mt(t,e,134217728,n)}ki(e,134217728)}},uo=function(e){if(e.tag===13){var t=Qt(e),n=Ct(e,t);if(n!==null){var r=Ue();mt(n,e,t,r)}ki(e,t)}},io=function(){return q},oo=function(e,t){var n=q;try{return q=e,t()}finally{q=n}},Bl=function(e,t,n){switch(t){case"input":if(jl(e,n),t=n.name,n.type==="radio"&&t!=null){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var l=Qr(r);if(!l)throw Error(m(90));Li(r),jl(r,l)}}}break;case"textarea":Fi(e,n);break;case"select":t=n.value,t!=null&&sn(e,!!n.multiple,t,!1)}},Wi=mi,Ki=rn;var Lf={usingClientEntryPoint:!1,Events:[rr,gn,Qr,$i,Qi,mi]},yr={findFiberByHostInstance:Gt,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},jf={bundleType:yr.bundleType,version:yr.version,rendererPackageName:yr.rendererPackageName,rendererConfig:yr.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:ve.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Zi(e),e===null?null:e.stateNode},findFiberByHostInstance:yr.findFiberByHostInstance||Tf,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var zl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!zl.isDisabled&&zl.supportsFiber)try{Cr=zl.inject(jf),vt=zl}catch{}}return Ke.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Lf,Ke.createPortal=function(e,t){var n=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!xi(t))throw Error(m(200));return zf(e,t,null,n)},Ke.createRoot=function(e,t){if(!xi(e))throw Error(m(299));var n=!1,r="",l=_a;return t!=null&&(t.unstable_strictMode===!0&&(n=!0),t.identifierPrefix!==void 0&&(r=t.identifierPrefix),t.onRecoverableError!==void 0&&(l=t.onRecoverableError)),t=Si(e,1,!1,null,null,n,!1,r,l),e[kt]=t.current,er(e.nodeType===8?e.parentNode:e),new Ei(t)},Ke.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(m(188)):(e=Object.keys(e).join(","),Error(m(268,e)));return e=Zi(t),e=e===null?null:e.stateNode,e},Ke.flushSync=function(e){return rn(e)},Ke.hydrate=function(e,t,n){if(!Pl(t))throw Error(m(200));return Nl(null,e,t,!0,n)},Ke.hydrateRoot=function(e,t,n){if(!xi(e))throw Error(m(405));var r=n!=null&&n.hydratedSources||null,l=!1,u="",i=_a;if(n!=null&&(n.unstable_strictMode===!0&&(l=!0),n.identifierPrefix!==void 0&&(u=n.identifierPrefix),n.onRecoverableError!==void 0&&(i=n.onRecoverableError)),t=Ea(t,null,e,1,n??null,l,!1,u,i),e[kt]=t.current,er(e),r)for(e=0;e<r.length;e++)n=r[e],l=n._getVersion,l=l(n._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[n,l]:t.mutableSourceEagerHydrationData.push(n,l);return new Cl(t)},Ke.render=function(e,t,n){if(!Pl(t))throw Error(m(200));return Nl(null,e,t,!1,n)},Ke.unmountComponentAtNode=function(e){if(!Pl(e))throw Error(m(40));return e._reactRootContainer?(rn(function(){Nl(null,null,e,!1,function(){e._reactRootContainer=null,e[kt]=null})}),!0):!1},Ke.unstable_batchedUpdates=mi,Ke.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Pl(n))throw Error(m(200));if(e==null||e._reactInternals===void 0)throw Error(m(38));return Nl(e,t,n,!1,r)},Ke.version="18.3.1-next-f1338f8080-20240426",Ke}var Oa;function Bf(){if(Oa)return Pi.exports;Oa=1;function S(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(S)}catch(N){console.error(N)}}return S(),Pi.exports=Af(),Pi.exports}var Ma;function Hf(){if(Ma)return Tl;Ma=1;var S=Bf();return Tl.createRoot=S.createRoot,Tl.hydrateRoot=S.hydrateRoot,Tl}var Vf=Hf();const $f="/assets/php-wasm-bridge-BCntMcWX.js",Rl=1024;let Ti=null;async function Qf(){return Ti||(Ti=new Promise((S,N)=>{fetch("/php-wasm.wasm").then(m=>(m.ok||N(`Failed to fetch wasm binary: ${m.status} (${m.url})`),m)).then(m=>m.arrayBuffer()).then(m=>S(m))})),Ti}async function Wf(S){let N=0;const m=new TextEncoder().encode(S);let Z=0;const L=new Uint8Array(Rl);let M=0;const D=new Uint8Array(Rl),{default:H}=await import($f),{ccall:I}=await H({wasmBinary:await Qf(),stdin:()=>m.length<=N?null:m[N++],stdout:G=>{G!==null&&(Rl<=Z||(G<0&&(G+=256),L[Z++]=G))},stderr:G=>{G!==null&&(Rl<=M||(G<0&&(G+=256),D[M++]=G))}});let b,te=null;try{b=I("php_wasm_run","number",["string"],[S])}catch(G){if(G instanceof WebAssembly.RuntimeError)te=G.message;else throw G}const V=new TextDecoder().decode(L.subarray(0,Z)),X=new TextDecoder().decode(D.subarray(0,M));return{success:b===0,stdout:V,stderr:te==null?X:`${X}
+${te}`}}function Kf(S,N,m){var Z=this,L=ge.useRef(null),M=ge.useRef(0),D=ge.useRef(null),H=ge.useRef([]),I=ge.useRef(),b=ge.useRef(),te=ge.useRef(S),V=ge.useRef(!0);te.current=S;var X=typeof window<"u",G=!N&&N!==0&&X;if(typeof S!="function")throw new TypeError("Expected a function");N=+N||0;var Me=!!(m=m||{}).leading,ee=!("trailing"in m)||!!m.trailing,$="maxWait"in m,et="debounceOnServer"in m&&!!m.debounceOnServer,Ae=$?Math.max(+m.maxWait||0,N):null;ge.useEffect(function(){return V.current=!0,function(){V.current=!1}},[]);var Ye=ge.useMemo(function(){var ve=function(ie){var pe=H.current,De=I.current;return H.current=I.current=null,M.current=ie,b.current=te.current.apply(De,pe)},ze=function(ie,pe){G&&cancelAnimationFrame(D.current),D.current=G?requestAnimationFrame(ie):setTimeout(ie,pe)},ke=function(ie){if(!V.current)return!1;var pe=ie-L.current;return!L.current||pe>=N||pe<0||$&&ie-M.current>=Ae},Ce=function(ie){return D.current=null,ee&&H.current?ve(ie):(H.current=I.current=null,b.current)},Te=function ie(){var pe=Date.now();if(ke(pe))return Ce(pe);if(V.current){var De=N-(pe-L.current),Fe=$?Math.min(De,Ae-(pe-M.current)):De;ze(ie,Fe)}},Xe=function(){if(X||et){var ie=Date.now(),pe=ke(ie);if(H.current=[].slice.call(arguments),I.current=Z,L.current=ie,pe){if(!D.current&&V.current)return M.current=L.current,ze(Te,N),Me?ve(L.current):b.current;if($)return ze(Te,N),ve(L.current)}return D.current||ze(Te,N),b.current}};return Xe.cancel=function(){D.current&&(G?cancelAnimationFrame(D.current):clearTimeout(D.current)),M.current=0,H.current=L.current=I.current=D.current=null},Xe.isPending=function(){return!!D.current},Xe.flush=function(){return D.current?Ce(Date.now()):b.current},Xe},[Me,$,N,Ae,ee,G,X,et]);return Ye}function Yf(S,N){return S===N}function Fa(S,N,m){var Z=Yf,L=ge.useRef(S),M=ge.useState({})[1],D=Kf(ge.useCallback(function(I){L.current=I,M({})},[M]),N,m),H=ge.useRef(S);return Z(H.current,S)||(D(S),H.current=S),[L.current,D]}function Xf({quiz:S}){const[N,m]=ge.useState("123"),[Z]=Fa(N,1e3),[L,M]=ge.useState(""),[D,H]=ge.useState(!0),I=b=>{m(b.target.value)};return ge.useEffect(()=>{if(Z===""){M("<empty>");return}H(!0),M("");const b=`
+ function f($x) {
+ return ${S.func}($x);
+ }
+ try {
+ var_dump(f(${Z}));
+ } catch (\\Throwable $e) {
+ echo $e->getMessage(), PHP_EOL;
+ }
+ `;Wf(b).then(te=>{const V=te.stdout+te.stderr;M(V.replaceAll(S.func,"<answer is masked>")),H(!1)})},[Z,S.func]),F.jsxs("div",{children:[F.jsxs("code",{children:["f(",F.jsx("input",{type:"text",value:N,onChange:I}),")"]}),"は ",F.jsx("code",{children:D?"running...":L})," を返す。"]})}const Da="your_answer";function Gf({quiz:S}){const[N,m]=ge.useState(Da),[Z]=Fa(N,500),L=Z!==Da,M=Z===S.func,D=H=>{m(H.target.value)};return F.jsxs("div",{children:["この関数は?",F.jsx("input",{type:"text",value:N,onChange:D}),F.jsx("p",{children:L&&(M?`正解!${S.message}`:"不正解")})]})}function Zf({quiz:S}){return F.jsxs("section",{children:[F.jsx("h3",{children:S.label}),F.jsx(Xf,{quiz:S}),F.jsx(Gf,{quiz:S})]})}function Jf({quizGroup:S}){return F.jsxs("section",{children:[F.jsx("h2",{children:S.label}),S.quizzes.map(N=>F.jsx(Zf,{quiz:N},N.label))]})}function qf({quizGroups:S}){return F.jsxs("table",{id:"layout",children:[F.jsx("tr",{children:F.jsx("td",{id:"header",colSpan:2,className:"marquee",children:F.jsx("span",{children:"PHPerKaigi 2025 デジタルサーカス株式会社トークン問題"})})}),F.jsxs("tr",{children:[F.jsxs("td",{id:"sidebar",children:[F.jsx("h2",{children:"メニュー"}),F.jsxs("ul",{children:[F.jsx("li",{children:F.jsx("a",{href:"",children:"ホーム"})}),F.jsx("li",{children:F.jsx("a",{href:"https://github.com/nsfisis/PHPerKaigi2024-tokens",target:"_blank",children:"トークン問題2024"})}),F.jsx("li",{children:F.jsx("a",{href:"https://github.com/nsfisis/PHPerKaigi2023-tokens",target:"_blank",children:"トークン問題2023"})}),F.jsx("li",{children:F.jsx("a",{href:"https://github.com/nsfisis/PHPerKaigi2022-tokens",target:"_blank",children:"トークン問題2022"})}),F.jsx("li",{className:"hidden",children:"ここにトークンはないよ"})]})]}),F.jsx("td",{id:"content",children:F.jsxs("main",{children:[F.jsxs("p",{children:["PHPerKaigi 2025 の PHPer チャレンジ企画において、",F.jsx("a",{href:"https://www.dgcircus.com/",children:"デジタルサーカス株式会社"}),"から出題するトークン問題です (作問"," ",F.jsx("a",{href:"https://x.com/nsfisis",children:"@nsfisis"}),")。"]}),F.jsx("p",{children:"それぞれの問題に、PHP の標準関数がひとつ設定されています。 好きな引数を渡すと実行されます。その実行結果を見て、何の関数かを当ててください。"}),S.map(N=>F.jsx(Jf,{quizGroup:N},N.label))]})})]})]})}const bf=[{label:"チュートリアル",quizzes:[{label:"Q1",func:"abs",message:"トークン1文字目「#」"}]},{label:"かんたん",quizzes:[{label:"Q2",func:"strlen",message:"トークン2文字目「W」"},{label:"Q3",func:"gettype",message:"トークン3文字目「E」"},{label:"Q4",func:"count",message:"トークン4文字目「❤」"}]},{label:"ふつう",quizzes:[{label:"Q5",func:"md5",message:"トークン5文字目「P」"},{label:"Q6",func:"strtoupper",message:"トークン6文字目「H」"},{label:"Q7",func:"array_keys",message:"トークン7文字目「P」。トークンはこれでおわり"}]},{label:"むずかしい",quizzes:[{label:"Q8",func:"str_rot13",message:"すごい!"},{label:"Q9",func:"metaphone",message:"すごい!"},{label:"Q10",func:"array_change_key_case",message:"すごい!"}]}];Vf.createRoot(document.getElementById("root")).render(F.jsx(ge.StrictMode,{children:F.jsx(qf,{quizGroups:bf})}));
diff --git a/docs/assets/php-wasm-bridge-BCntMcWX.js b/docs/assets/php-wasm-bridge-BCntMcWX.js
new file mode 100644
index 0000000..fbf574b
--- /dev/null
+++ b/docs/assets/php-wasm-bridge-BCntMcWX.js
@@ -0,0 +1,8366 @@
+var Module = (() => {
+ var _scriptName = import.meta.url;
+
+ return function (moduleArg = {}) {
+ var moduleRtn;
+
+ // include: shell.js
+ // The Module object: Our interface to the outside world. We import
+ // and export values on it. There are various ways Module can be used:
+ // 1. Not defined. We create it here
+ // 2. A function parameter, function(moduleArg) => Promise<Module>
+ // 3. pre-run appended it, var Module = {}; ..generated code..
+ // 4. External script tag defines var Module.
+ // We need to check if Module already exists (e.g. case 3 above).
+ // Substitution will be replaced with actual code on later stage of the build,
+ // this way Closure Compiler will not mangle it (e.g. case 4. above).
+ // Note that if you want to run closure, and also to use Module
+ // after the generated code, you will need to define var Module = {};
+ // before the code. Then that object will be used in the code, and you
+ // can continue to use Module afterwards as well.
+ var Module = moduleArg;
+
+ // Set up the promise that indicates the Module is initialized
+ var readyPromiseResolve, readyPromiseReject;
+ var readyPromise = new Promise((resolve, reject) => {
+ readyPromiseResolve = resolve;
+ readyPromiseReject = reject;
+ });
+ [
+ "_memory",
+ "_php_wasm_run",
+ "___indirect_function_table",
+ "onRuntimeInitialized",
+ ].forEach((prop) => {
+ if (!Object.getOwnPropertyDescriptor(readyPromise, prop)) {
+ Object.defineProperty(readyPromise, prop, {
+ get: () =>
+ abort(
+ "You are getting " +
+ prop +
+ " on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js",
+ ),
+ set: () =>
+ abort(
+ "You are setting " +
+ prop +
+ " on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js",
+ ),
+ });
+ }
+ });
+
+ // Determine the runtime environment we are in. You can customize this by
+ // setting the ENVIRONMENT setting at compile time (see settings.js).
+
+ var ENVIRONMENT_IS_WEB = true;
+ var ENVIRONMENT_IS_WORKER = false;
+ var ENVIRONMENT_IS_NODE = false;
+ var ENVIRONMENT_IS_SHELL = false;
+
+ // --pre-jses are emitted after the Module integration code, so that they can
+ // refer to Module (if they choose; they can also define Module)
+
+ // Sometimes an existing Module object exists with properties
+ // meant to overwrite the default module functionality. Here
+ // we collect those properties and reapply _after_ we configure
+ // the current environment's defaults to avoid having to be so
+ // defensive during initialization.
+ var moduleOverrides = Object.assign({}, Module);
+
+ var arguments_ = [];
+ var thisProgram = "./this.program";
+ var quit_ = (status, toThrow) => {
+ throw toThrow;
+ };
+
+ // `/` should be present at the end if `scriptDirectory` is not empty
+ var scriptDirectory = "";
+ function locateFile(path) {
+ if (Module["locateFile"]) {
+ return Module["locateFile"](path, scriptDirectory);
+ }
+ return scriptDirectory + path;
+ }
+
+ // Hooks that are implemented differently in different runtime environments.
+ var readAsync, readBinary;
+
+ if (ENVIRONMENT_IS_SHELL) {
+ if (
+ (typeof process == "object" && typeof require === "function") ||
+ typeof window == "object" ||
+ typeof WorkerGlobalScope != "undefined"
+ )
+ throw new Error(
+ "not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)",
+ );
+ }
+
+ // Note that this includes Node.js workers when relevant (pthreads is enabled).
+ // Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
+ // ENVIRONMENT_IS_NODE.
+ else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
+ if (ENVIRONMENT_IS_WORKER) {
+ // Check worker, not web, since window could be polyfilled
+ scriptDirectory = self.location.href;
+ } else if (typeof document != "undefined" && document.currentScript) {
+ // web
+ scriptDirectory = document.currentScript.src;
+ }
+ // When MODULARIZE, this JS may be executed later, after document.currentScript
+ // is gone, so we saved it, and we use it here instead of any other info.
+ if (_scriptName) {
+ scriptDirectory = _scriptName;
+ }
+ // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.
+ // otherwise, slice off the final part of the url to find the script directory.
+ // if scriptDirectory does not contain a slash, lastIndexOf will return -1,
+ // and scriptDirectory will correctly be replaced with an empty string.
+ // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),
+ // they are removed because they could contain a slash.
+ if (scriptDirectory.startsWith("blob:")) {
+ scriptDirectory = "";
+ } else {
+ scriptDirectory = scriptDirectory.substr(
+ 0,
+ scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1,
+ );
+ }
+
+ if (
+ !(typeof window == "object" || typeof WorkerGlobalScope != "undefined")
+ )
+ throw new Error(
+ "not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)",
+ );
+
+ {
+ // include: web_or_worker_shell_read.js
+ readAsync = async (url) => {
+ assert(!isFileURI(url), "readAsync does not work with file:// URLs");
+ var response = await fetch(url, { credentials: "same-origin" });
+ if (response.ok) {
+ return response.arrayBuffer();
+ }
+ throw new Error(response.status + " : " + response.url);
+ };
+ // end include: web_or_worker_shell_read.js
+ }
+ } else {
+ throw new Error("environment detection error");
+ }
+
+ var out = Module["print"] || console.log.bind(console);
+ var err = Module["printErr"] || console.error.bind(console);
+
+ // Merge back in the overrides
+ Object.assign(Module, moduleOverrides);
+ // Free the object hierarchy contained in the overrides, this lets the GC
+ // reclaim data used.
+ moduleOverrides = null;
+ checkIncomingModuleAPI();
+
+ // Emit code to handle expected values on the Module object. This applies Module.x
+ // to the proper local x. This has two benefits: first, we only emit it if it is
+ // expected to arrive, and second, by using a local everywhere else that can be
+ // minified.
+
+ if (Module["arguments"]) arguments_ = Module["arguments"];
+ legacyModuleProp("arguments", "arguments_");
+
+ if (Module["thisProgram"]) thisProgram = Module["thisProgram"];
+ legacyModuleProp("thisProgram", "thisProgram");
+
+ // perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
+ // Assertions on removed incoming Module JS APIs.
+ assert(
+ typeof Module["memoryInitializerPrefixURL"] == "undefined",
+ "Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead",
+ );
+ assert(
+ typeof Module["pthreadMainPrefixURL"] == "undefined",
+ "Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead",
+ );
+ assert(
+ typeof Module["cdInitializerPrefixURL"] == "undefined",
+ "Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead",
+ );
+ assert(
+ typeof Module["filePackagePrefixURL"] == "undefined",
+ "Module.filePackagePrefixURL option was removed, use Module.locateFile instead",
+ );
+ assert(
+ typeof Module["read"] == "undefined",
+ "Module.read option was removed",
+ );
+ assert(
+ typeof Module["readAsync"] == "undefined",
+ "Module.readAsync option was removed (modify readAsync in JS)",
+ );
+ assert(
+ typeof Module["readBinary"] == "undefined",
+ "Module.readBinary option was removed (modify readBinary in JS)",
+ );
+ assert(
+ typeof Module["setWindowTitle"] == "undefined",
+ "Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)",
+ );
+ assert(
+ typeof Module["TOTAL_MEMORY"] == "undefined",
+ "Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY",
+ );
+ legacyModuleProp("asm", "wasmExports");
+ legacyModuleProp("readAsync", "readAsync");
+ legacyModuleProp("readBinary", "readBinary");
+ legacyModuleProp("setWindowTitle", "setWindowTitle");
+ var IDBFS = "IDBFS is no longer included by default; build with -lidbfs.js";
+ var PROXYFS =
+ "PROXYFS is no longer included by default; build with -lproxyfs.js";
+ var WORKERFS =
+ "WORKERFS is no longer included by default; build with -lworkerfs.js";
+ var FETCHFS =
+ "FETCHFS is no longer included by default; build with -lfetchfs.js";
+ var ICASEFS =
+ "ICASEFS is no longer included by default; build with -licasefs.js";
+ var JSFILEFS =
+ "JSFILEFS is no longer included by default; build with -ljsfilefs.js";
+ var OPFS = "OPFS is no longer included by default; build with -lopfs.js";
+
+ var NODEFS =
+ "NODEFS is no longer included by default; build with -lnodefs.js";
+
+ assert(
+ !ENVIRONMENT_IS_WORKER,
+ "worker environment detected but not enabled at build time. Add `worker` to `-sENVIRONMENT` to enable.",
+ );
+
+ assert(
+ !ENVIRONMENT_IS_NODE,
+ "node environment detected but not enabled at build time. Add `node` to `-sENVIRONMENT` to enable.",
+ );
+
+ assert(
+ !ENVIRONMENT_IS_SHELL,
+ "shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable.",
+ );
+
+ // end include: shell.js
+
+ // include: preamble.js
+ // === Preamble library stuff ===
+
+ // Documentation for the public APIs defined in this file must be updated in:
+ // site/source/docs/api_reference/preamble.js.rst
+ // A prebuilt local version of the documentation is available at:
+ // site/build/text/docs/api_reference/preamble.js.txt
+ // You can also build docs locally as HTML or other formats in site/
+ // An online HTML version (which may be of a different version of Emscripten)
+ // is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
+
+ var wasmBinary = Module["wasmBinary"];
+ legacyModuleProp("wasmBinary", "wasmBinary");
+
+ if (typeof WebAssembly != "object") {
+ err("no native wasm support detected");
+ }
+
+ // Wasm globals
+
+ var wasmMemory;
+
+ //========================================
+ // Runtime essentials
+ //========================================
+
+ // whether we are quitting the application. no code should run after this.
+ // set in exit() and abort()
+ var ABORT = false;
+
+ // set by exit() and abort(). Passed to 'onExit' handler.
+ // NOTE: This is also used as the process return code code in shell environments
+ // but only when noExitRuntime is false.
+ var EXITSTATUS;
+
+ // In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we
+ // don't define it at all in release modes. This matches the behaviour of
+ // MINIMAL_RUNTIME.
+ // TODO(sbc): Make this the default even without STRICT enabled.
+ /** @type {function(*, string=)} */
+ function assert(condition, text) {
+ if (!condition) {
+ abort("Assertion failed" + (text ? ": " + text : ""));
+ }
+ }
+
+ // We used to include malloc/free by default in the past. Show a helpful error in
+ // builds with assertions.
+ function _free() {
+ // Show a helpful error since we used to include free by default in the past.
+ abort(
+ "free() called but not included in the build - add `_free` to EXPORTED_FUNCTIONS",
+ );
+ }
+
+ // Memory management
+
+ var HEAP,
+ /** @type {!Int8Array} */
+ HEAP8,
+ /** @type {!Uint8Array} */
+ HEAPU8,
+ /** @type {!Int16Array} */
+ HEAP16,
+ /** @type {!Uint16Array} */
+ HEAPU16,
+ /** @type {!Int32Array} */
+ HEAP32,
+ /** @type {!Uint32Array} */
+ HEAPU32,
+ /** @type {!Float32Array} */
+ HEAPF32,
+ /** @type {!Float64Array} */
+ HEAPF64;
+
+ // include: runtime_shared.js
+ function updateMemoryViews() {
+ var b = wasmMemory.buffer;
+ Module["HEAP8"] = HEAP8 = new Int8Array(b);
+ Module["HEAP16"] = HEAP16 = new Int16Array(b);
+ Module["HEAPU8"] = HEAPU8 = new Uint8Array(b);
+ Module["HEAPU16"] = HEAPU16 = new Uint16Array(b);
+ Module["HEAP32"] = HEAP32 = new Int32Array(b);
+ Module["HEAPU32"] = HEAPU32 = new Uint32Array(b);
+ Module["HEAPF32"] = HEAPF32 = new Float32Array(b);
+ Module["HEAPF64"] = HEAPF64 = new Float64Array(b);
+ }
+
+ // end include: runtime_shared.js
+ assert(
+ !Module["STACK_SIZE"],
+ "STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time",
+ );
+
+ assert(
+ typeof Int32Array != "undefined" &&
+ typeof Float64Array !== "undefined" &&
+ Int32Array.prototype.subarray != undefined &&
+ Int32Array.prototype.set != undefined,
+ "JS engine does not provide full typed array support",
+ );
+
+ // If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY
+ assert(
+ !Module["wasmMemory"],
+ "Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally",
+ );
+ assert(
+ !Module["INITIAL_MEMORY"],
+ "Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically",
+ );
+
+ // include: runtime_stack_check.js
+ // Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
+ function writeStackCookie() {
+ var max = _emscripten_stack_get_end();
+ assert((max & 3) == 0);
+ // If the stack ends at address zero we write our cookies 4 bytes into the
+ // stack. This prevents interference with SAFE_HEAP and ASAN which also
+ // monitor writes to address zero.
+ if (max == 0) {
+ max += 4;
+ }
+ // The stack grow downwards towards _emscripten_stack_get_end.
+ // We write cookies to the final two words in the stack and detect if they are
+ // ever overwritten.
+ HEAPU32[max >> 2] = 0x02135467;
+ HEAPU32[(max + 4) >> 2] = 0x89bacdfe;
+ // Also test the global address 0 for integrity.
+ HEAPU32[0 >> 2] = 1668509029;
+ }
+
+ function checkStackCookie() {
+ if (ABORT) return;
+ var max = _emscripten_stack_get_end();
+ // See writeStackCookie().
+ if (max == 0) {
+ max += 4;
+ }
+ var cookie1 = HEAPU32[max >> 2];
+ var cookie2 = HEAPU32[(max + 4) >> 2];
+ if (cookie1 != 0x02135467 || cookie2 != 0x89bacdfe) {
+ abort(
+ `Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`,
+ );
+ }
+ // Also test the global address 0 for integrity.
+ if (HEAPU32[0 >> 2] != 0x63736d65 /* 'emsc' */) {
+ abort(
+ "Runtime error: The application has corrupted its heap memory area (address zero)!",
+ );
+ }
+ }
+ // end include: runtime_stack_check.js
+ var __ATPRERUN__ = []; // functions called before the runtime is initialized
+ var __ATINIT__ = []; // functions called during startup
+ var __ATEXIT__ = []; // functions called during shutdown
+ var __ATPOSTRUN__ = []; // functions called after the main() is called
+
+ var runtimeInitialized = false;
+
+ function preRun() {
+ if (Module["preRun"]) {
+ if (typeof Module["preRun"] == "function")
+ Module["preRun"] = [Module["preRun"]];
+ while (Module["preRun"].length) {
+ addOnPreRun(Module["preRun"].shift());
+ }
+ }
+ callRuntimeCallbacks(__ATPRERUN__);
+ }
+
+ function initRuntime() {
+ assert(!runtimeInitialized);
+ runtimeInitialized = true;
+
+ checkStackCookie();
+
+ if (!Module["noFSInit"] && !FS.initialized) FS.init();
+ FS.ignorePermissions = false;
+
+ TTY.init();
+ SOCKFS.root = FS.mount(SOCKFS, {}, null);
+ PIPEFS.root = FS.mount(PIPEFS, {}, null);
+ callRuntimeCallbacks(__ATINIT__);
+ }
+
+ function postRun() {
+ checkStackCookie();
+
+ if (Module["postRun"]) {
+ if (typeof Module["postRun"] == "function")
+ Module["postRun"] = [Module["postRun"]];
+ while (Module["postRun"].length) {
+ addOnPostRun(Module["postRun"].shift());
+ }
+ }
+
+ callRuntimeCallbacks(__ATPOSTRUN__);
+ }
+
+ function addOnPreRun(cb) {
+ __ATPRERUN__.unshift(cb);
+ }
+
+ function addOnInit(cb) {
+ __ATINIT__.unshift(cb);
+ }
+
+ function addOnExit(cb) {}
+
+ function addOnPostRun(cb) {
+ __ATPOSTRUN__.unshift(cb);
+ }
+
+ // include: runtime_math.js
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc
+
+ assert(
+ Math.imul,
+ "This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill",
+ );
+ assert(
+ Math.fround,
+ "This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill",
+ );
+ assert(
+ Math.clz32,
+ "This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill",
+ );
+ assert(
+ Math.trunc,
+ "This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill",
+ );
+ // end include: runtime_math.js
+ // A counter of dependencies for calling run(). If we need to
+ // do asynchronous work before running, increment this and
+ // decrement it. Incrementing must happen in a place like
+ // Module.preRun (used by emcc to add file preloading).
+ // Note that you can add dependencies in preRun, even though
+ // it happens right before run - run will be postponed until
+ // the dependencies are met.
+ var runDependencies = 0;
+ var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
+ var runDependencyTracking = {};
+ var runDependencyWatcher = null;
+
+ function getUniqueRunDependency(id) {
+ var orig = id;
+ while (1) {
+ if (!runDependencyTracking[id]) return id;
+ id = orig + Math.random();
+ }
+ }
+
+ function addRunDependency(id) {
+ runDependencies++;
+
+ Module["monitorRunDependencies"]?.(runDependencies);
+
+ if (id) {
+ assert(!runDependencyTracking[id]);
+ runDependencyTracking[id] = 1;
+ if (
+ runDependencyWatcher === null &&
+ typeof setInterval != "undefined"
+ ) {
+ // Check for missing dependencies every few seconds
+ runDependencyWatcher = setInterval(() => {
+ if (ABORT) {
+ clearInterval(runDependencyWatcher);
+ runDependencyWatcher = null;
+ return;
+ }
+ var shown = false;
+ for (var dep in runDependencyTracking) {
+ if (!shown) {
+ shown = true;
+ err("still waiting on run dependencies:");
+ }
+ err(`dependency: ${dep}`);
+ }
+ if (shown) {
+ err("(end of list)");
+ }
+ }, 10000);
+ }
+ } else {
+ err("warning: run dependency added without ID");
+ }
+ }
+
+ function removeRunDependency(id) {
+ runDependencies--;
+
+ Module["monitorRunDependencies"]?.(runDependencies);
+
+ if (id) {
+ assert(runDependencyTracking[id]);
+ delete runDependencyTracking[id];
+ } else {
+ err("warning: run dependency removed without ID");
+ }
+ if (runDependencies == 0) {
+ if (runDependencyWatcher !== null) {
+ clearInterval(runDependencyWatcher);
+ runDependencyWatcher = null;
+ }
+ if (dependenciesFulfilled) {
+ var callback = dependenciesFulfilled;
+ dependenciesFulfilled = null;
+ callback(); // can add another dependenciesFulfilled
+ }
+ }
+ }
+
+ /** @param {string|number=} what */
+ function abort(what) {
+ Module["onAbort"]?.(what);
+
+ what = "Aborted(" + what + ")";
+ // TODO(sbc): Should we remove printing and leave it up to whoever
+ // catches the exception?
+ err(what);
+
+ ABORT = true;
+
+ // Use a wasm runtime error, because a JS error might be seen as a foreign
+ // exception, which means we'd run destructors on it. We need the error to
+ // simply make the program stop.
+ // FIXME This approach does not work in Wasm EH because it currently does not assume
+ // all RuntimeErrors are from traps; it decides whether a RuntimeError is from
+ // a trap or not based on a hidden field within the object. So at the moment
+ // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that
+ // allows this in the wasm spec.
+
+ // Suppress closure compiler warning here. Closure compiler's builtin extern
+ // definition for WebAssembly.RuntimeError claims it takes no arguments even
+ // though it can.
+ // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.
+ /** @suppress {checkTypes} */
+ var e = new WebAssembly.RuntimeError(what);
+
+ readyPromiseReject(e);
+ // Throw the error whether or not MODULARIZE is set because abort is used
+ // in code paths apart from instantiation where an exception is expected
+ // to be thrown when abort is called.
+ throw e;
+ }
+
+ // include: memoryprofiler.js
+ // end include: memoryprofiler.js
+ // include: URIUtils.js
+ // Prefix of data URIs emitted by SINGLE_FILE and related options.
+ var dataURIPrefix = "data:application/octet-stream;base64,";
+
+ /**
+ * Indicates whether filename is a base64 data URI.
+ * @noinline
+ */
+ var isDataURI = (filename) => filename.startsWith(dataURIPrefix);
+
+ /**
+ * Indicates whether filename is delivered via file protocol (as opposed to http/https)
+ * @noinline
+ */
+ var isFileURI = (filename) => filename.startsWith("file://");
+ // end include: URIUtils.js
+ function createExportWrapper(name, nargs) {
+ return (...args) => {
+ assert(
+ runtimeInitialized,
+ `native function \`${name}\` called before runtime initialization`,
+ );
+ var f = wasmExports[name];
+ assert(f, `exported native function \`${name}\` not found`);
+ // Only assert for too many arguments. Too few can be valid since the missing arguments will be zero filled.
+ assert(
+ args.length <= nargs,
+ `native function \`${name}\` called with ${args.length} args but expects ${nargs}`,
+ );
+ return f(...args);
+ };
+ }
+
+ // include: runtime_exceptions.js
+ // end include: runtime_exceptions.js
+ function findWasmBinary() {
+ if (Module["locateFile"]) {
+ var f = "php-wasm.wasm";
+ if (!isDataURI(f)) {
+ return locateFile(f);
+ }
+ return f;
+ }
+ // Use bundler-friendly `new URL(..., import.meta.url)` pattern; works in browsers too.
+ return new URL("php-wasm.wasm", import.meta.url).href;
+ }
+
+ var wasmBinaryFile;
+
+ function getBinarySync(file) {
+ if (file == wasmBinaryFile && wasmBinary) {
+ return new Uint8Array(wasmBinary);
+ }
+ if (readBinary) {
+ return readBinary(file);
+ }
+ throw "both async and sync fetching of the wasm failed";
+ }
+
+ async function getWasmBinary(binaryFile) {
+ // If we don't have the binary yet, load it asynchronously using readAsync.
+ if (!wasmBinary) {
+ // Fetch the binary using readAsync
+ try {
+ var response = await readAsync(binaryFile);
+ return new Uint8Array(response);
+ } catch {
+ // Fall back to getBinarySync below;
+ }
+ }
+
+ // Otherwise, getBinarySync should be able to get it synchronously
+ return getBinarySync(binaryFile);
+ }
+
+ async function instantiateArrayBuffer(binaryFile, imports) {
+ try {
+ var binary = await getWasmBinary(binaryFile);
+ var instance = await WebAssembly.instantiate(binary, imports);
+ return instance;
+ } catch (reason) {
+ err(`failed to asynchronously prepare wasm: ${reason}`);
+
+ // Warn on some common problems.
+ if (isFileURI(wasmBinaryFile)) {
+ err(
+ `warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`,
+ );
+ }
+ abort(reason);
+ }
+ }
+
+ async function instantiateAsync(binary, binaryFile, imports) {
+ if (
+ !binary &&
+ typeof WebAssembly.instantiateStreaming == "function" &&
+ !isDataURI(binaryFile) &&
+ typeof fetch == "function"
+ ) {
+ try {
+ var response = fetch(binaryFile, { credentials: "same-origin" });
+ var instantiationResult = await WebAssembly.instantiateStreaming(
+ response,
+ imports,
+ );
+ return instantiationResult;
+ } catch (reason) {
+ // We expect the most common failure cause to be a bad MIME type for the binary,
+ // in which case falling back to ArrayBuffer instantiation should work.
+ err(`wasm streaming compile failed: ${reason}`);
+ err("falling back to ArrayBuffer instantiation");
+ // fall back of instantiateArrayBuffer below
+ }
+ }
+ return instantiateArrayBuffer(binaryFile, imports);
+ }
+
+ function getWasmImports() {
+ // prepare imports
+ return {
+ env: wasmImports,
+ wasi_snapshot_preview1: wasmImports,
+ };
+ }
+
+ // Create the wasm instance.
+ // Receives the wasm imports, returns the exports.
+ async function createWasm() {
+ // Load the wasm module and create an instance of using native support in the JS engine.
+ // handle a generated wasm instance, receiving its exports and
+ // performing other necessary setup
+ /** @param {WebAssembly.Module=} module*/
+ function receiveInstance(instance, module) {
+ wasmExports = instance.exports;
+
+ wasmMemory = wasmExports["memory"];
+
+ assert(wasmMemory, "memory not found in wasm exports");
+ updateMemoryViews();
+
+ wasmTable = wasmExports["__indirect_function_table"];
+
+ assert(wasmTable, "table not found in wasm exports");
+
+ addOnInit(wasmExports["__wasm_call_ctors"]);
+
+ removeRunDependency("wasm-instantiate");
+ return wasmExports;
+ }
+ // wait for the pthread pool (if any)
+ addRunDependency("wasm-instantiate");
+
+ // Prefer streaming instantiation if available.
+ // Async compilation can be confusing when an error on the page overwrites Module
+ // (for example, if the order of elements is wrong, and the one defining Module is
+ // later), so we save Module and check it later.
+ var trueModule = Module;
+ function receiveInstantiationResult(result) {
+ // 'result' is a ResultObject object which has both the module and instance.
+ // receiveInstance() will swap in the exports (to Module.asm) so they can be called
+ assert(
+ Module === trueModule,
+ "the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?",
+ );
+ trueModule = null;
+ // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
+ // When the regression is fixed, can restore the above PTHREADS-enabled path.
+ receiveInstance(result["instance"]);
+ }
+
+ var info = getWasmImports();
+
+ // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
+ // to manually instantiate the Wasm module themselves. This allows pages to
+ // run the instantiation parallel to any other async startup actions they are
+ // performing.
+ // Also pthreads and wasm workers initialize the wasm instance through this
+ // path.
+ if (Module["instantiateWasm"]) {
+ try {
+ return Module["instantiateWasm"](info, receiveInstance);
+ } catch (e) {
+ err(`Module.instantiateWasm callback failed with error: ${e}`);
+ // If instantiation fails, reject the module ready promise.
+ readyPromiseReject(e);
+ }
+ }
+
+ wasmBinaryFile ??= findWasmBinary();
+
+ try {
+ var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
+ receiveInstantiationResult(result);
+ return result;
+ } catch (e) {
+ // If instantiation fails, reject the module ready promise.
+ readyPromiseReject(e);
+ return;
+ }
+ }
+
+ // Globals used by JS i64 conversions (see makeSetValue)
+ var tempDouble;
+ var tempI64;
+
+ // include: runtime_debug.js
+ // Endianness check
+ (() => {
+ var h16 = new Int16Array(1);
+ var h8 = new Int8Array(h16.buffer);
+ h16[0] = 0x6373;
+ if (h8[0] !== 0x73 || h8[1] !== 0x63)
+ throw "Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)";
+ })();
+
+ if (Module["ENVIRONMENT"]) {
+ throw new Error(
+ "Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)",
+ );
+ }
+
+ function legacyModuleProp(prop, newName, incoming = true) {
+ if (!Object.getOwnPropertyDescriptor(Module, prop)) {
+ Object.defineProperty(Module, prop, {
+ configurable: true,
+ get() {
+ let extra = incoming
+ ? " (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)"
+ : "";
+ abort(
+ `\`Module.${prop}\` has been replaced by \`${newName}\`` + extra,
+ );
+ },
+ });
+ }
+ }
+
+ function ignoredModuleProp(prop) {
+ if (Object.getOwnPropertyDescriptor(Module, prop)) {
+ abort(
+ `\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`,
+ );
+ }
+ }
+
+ // forcing the filesystem exports a few things by default
+ function isExportedByForceFilesystem(name) {
+ return (
+ name === "FS_createPath" ||
+ name === "FS_createDataFile" ||
+ name === "FS_createPreloadedFile" ||
+ name === "FS_unlink" ||
+ name === "addRunDependency" ||
+ // The old FS has some functionality that WasmFS lacks.
+ name === "FS_createLazyFile" ||
+ name === "FS_createDevice" ||
+ name === "removeRunDependency"
+ );
+ }
+
+ /**
+ * Intercept access to a global symbol. This enables us to give informative
+ * warnings/errors when folks attempt to use symbols they did not include in
+ * their build, or no symbols that no longer exist.
+ */
+ function hookGlobalSymbolAccess(sym, func) {
+ if (
+ typeof globalThis != "undefined" &&
+ !Object.getOwnPropertyDescriptor(globalThis, sym)
+ ) {
+ Object.defineProperty(globalThis, sym, {
+ configurable: true,
+ get() {
+ func();
+ return undefined;
+ },
+ });
+ }
+ }
+
+ function missingGlobal(sym, msg) {
+ hookGlobalSymbolAccess(sym, () => {
+ warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`);
+ });
+ }
+
+ missingGlobal("buffer", "Please use HEAP8.buffer or wasmMemory.buffer");
+ missingGlobal("asm", "Please use wasmExports instead");
+
+ function missingLibrarySymbol(sym) {
+ hookGlobalSymbolAccess(sym, () => {
+ // Can't `abort()` here because it would break code that does runtime
+ // checks. e.g. `if (typeof SDL === 'undefined')`.
+ var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`;
+ // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in
+ // library.js, which means $name for a JS name with no prefix, or name
+ // for a JS name like _name.
+ var librarySymbol = sym;
+ if (!librarySymbol.startsWith("_")) {
+ librarySymbol = "$" + sym;
+ }
+ msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`;
+ if (isExportedByForceFilesystem(sym)) {
+ msg +=
+ ". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you";
+ }
+ warnOnce(msg);
+ });
+
+ // Any symbol that is not included from the JS library is also (by definition)
+ // not exported on the Module object.
+ unexportedRuntimeSymbol(sym);
+ }
+
+ function unexportedRuntimeSymbol(sym) {
+ if (!Object.getOwnPropertyDescriptor(Module, sym)) {
+ Object.defineProperty(Module, sym, {
+ configurable: true,
+ get() {
+ var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`;
+ if (isExportedByForceFilesystem(sym)) {
+ msg +=
+ ". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you";
+ }
+ abort(msg);
+ },
+ });
+ }
+ }
+
+ // Used by XXXXX_DEBUG settings to output debug messages.
+ function dbg(...args) {
+ // TODO(sbc): Make this configurable somehow. Its not always convenient for
+ // logging to show up as warnings.
+ console.warn(...args);
+ }
+ // end include: runtime_debug.js
+ // === Body ===
+ // end include: preamble.js
+
+ class ExitStatus {
+ name = "ExitStatus";
+ constructor(status) {
+ this.message = `Program terminated with exit(${status})`;
+ this.status = status;
+ }
+ }
+
+ var callRuntimeCallbacks = (callbacks) => {
+ while (callbacks.length > 0) {
+ // Pass the module as the first argument.
+ callbacks.shift()(Module);
+ }
+ };
+
+ /**
+ * @param {number} ptr
+ * @param {string} type
+ */
+ function getValue(ptr, type = "i8") {
+ if (type.endsWith("*")) type = "*";
+ switch (type) {
+ case "i1":
+ return HEAP8[ptr];
+ case "i8":
+ return HEAP8[ptr];
+ case "i16":
+ return HEAP16[ptr >> 1];
+ case "i32":
+ return HEAP32[ptr >> 2];
+ case "i64":
+ abort("to do getValue(i64) use WASM_BIGINT");
+ case "float":
+ return HEAPF32[ptr >> 2];
+ case "double":
+ return HEAPF64[ptr >> 3];
+ case "*":
+ return HEAPU32[ptr >> 2];
+ default:
+ abort(`invalid type for getValue: ${type}`);
+ }
+ }
+
+ var noExitRuntime = Module["noExitRuntime"] || true;
+
+ var ptrToString = (ptr) => {
+ assert(typeof ptr === "number");
+ // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
+ ptr >>>= 0;
+ return "0x" + ptr.toString(16).padStart(8, "0");
+ };
+
+ /**
+ * @param {number} ptr
+ * @param {number} value
+ * @param {string} type
+ */
+ function setValue(ptr, value, type = "i8") {
+ if (type.endsWith("*")) type = "*";
+ switch (type) {
+ case "i1":
+ HEAP8[ptr] = value;
+ break;
+ case "i8":
+ HEAP8[ptr] = value;
+ break;
+ case "i16":
+ HEAP16[ptr >> 1] = value;
+ break;
+ case "i32":
+ HEAP32[ptr >> 2] = value;
+ break;
+ case "i64":
+ abort("to do setValue(i64) use WASM_BIGINT");
+ case "float":
+ HEAPF32[ptr >> 2] = value;
+ break;
+ case "double":
+ HEAPF64[ptr >> 3] = value;
+ break;
+ case "*":
+ HEAPU32[ptr >> 2] = value;
+ break;
+ default:
+ abort(`invalid type for setValue: ${type}`);
+ }
+ }
+
+ var stackRestore = (val) => __emscripten_stack_restore(val);
+
+ var stackSave = () => _emscripten_stack_get_current();
+
+ var warnOnce = (text) => {
+ warnOnce.shown ||= {};
+ if (!warnOnce.shown[text]) {
+ warnOnce.shown[text] = 1;
+ err(text);
+ }
+ };
+
+ var UTF8Decoder =
+ typeof TextDecoder != "undefined" ? new TextDecoder() : undefined;
+
+ /**
+ * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given
+ * array that contains uint8 values, returns a copy of that string as a
+ * Javascript String object.
+ * heapOrArray is either a regular array, or a JavaScript typed array view.
+ * @param {number=} idx
+ * @param {number=} maxBytesToRead
+ * @return {string}
+ */
+ var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => {
+ var endIdx = idx + maxBytesToRead;
+ var endPtr = idx;
+ // TextDecoder needs to know the byte length in advance, it doesn't stop on
+ // null terminator by itself. Also, use the length info to avoid running tiny
+ // strings through TextDecoder, since .subarray() allocates garbage.
+ // (As a tiny code save trick, compare endPtr against endIdx using a negation,
+ // so that undefined/NaN means Infinity)
+ while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;
+
+ if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
+ return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));
+ }
+ var str = "";
+ // If building with TextDecoder, we have already computed the string length
+ // above, so test loop end condition against that
+ while (idx < endPtr) {
+ // For UTF8 byte structure, see:
+ // http://en.wikipedia.org/wiki/UTF-8#Description
+ // https://www.ietf.org/rfc/rfc2279.txt
+ // https://tools.ietf.org/html/rfc3629
+ var u0 = heapOrArray[idx++];
+ if (!(u0 & 0x80)) {
+ str += String.fromCharCode(u0);
+ continue;
+ }
+ var u1 = heapOrArray[idx++] & 63;
+ if ((u0 & 0xe0) == 0xc0) {
+ str += String.fromCharCode(((u0 & 31) << 6) | u1);
+ continue;
+ }
+ var u2 = heapOrArray[idx++] & 63;
+ if ((u0 & 0xf0) == 0xe0) {
+ u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
+ } else {
+ if ((u0 & 0xf8) != 0xf0)
+ warnOnce(
+ "Invalid UTF-8 leading byte " +
+ ptrToString(u0) +
+ " encountered when deserializing a UTF-8 string in wasm memory to a JS string!",
+ );
+ u0 =
+ ((u0 & 7) << 18) |
+ (u1 << 12) |
+ (u2 << 6) |
+ (heapOrArray[idx++] & 63);
+ }
+
+ if (u0 < 0x10000) {
+ str += String.fromCharCode(u0);
+ } else {
+ var ch = u0 - 0x10000;
+ str += String.fromCharCode(
+ 0xd800 | (ch >> 10),
+ 0xdc00 | (ch & 0x3ff),
+ );
+ }
+ }
+ return str;
+ };
+
+ /**
+ * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the
+ * emscripten HEAP, returns a copy of that string as a Javascript String object.
+ *
+ * @param {number} ptr
+ * @param {number=} maxBytesToRead - An optional length that specifies the
+ * maximum number of bytes to read. You can omit this parameter to scan the
+ * string until the first 0 byte. If maxBytesToRead is passed, and the string
+ * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the
+ * string will cut short at that byte index (i.e. maxBytesToRead will not
+ * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing
+ * frequent uses of UTF8ToString() with and without maxBytesToRead may throw
+ * JS JIT optimizations off, so it is worth to consider consistently using one
+ * @return {string}
+ */
+ var UTF8ToString = (ptr, maxBytesToRead) => {
+ assert(
+ typeof ptr == "number",
+ `UTF8ToString expects a number (got ${typeof ptr})`,
+ );
+ return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "";
+ };
+ var ___assert_fail = (condition, filename, line, func) =>
+ abort(
+ `Assertion failed: ${UTF8ToString(condition)}, at: ` +
+ [
+ filename ? UTF8ToString(filename) : "unknown filename",
+ line,
+ func ? UTF8ToString(func) : "unknown function",
+ ],
+ );
+
+ var wasmTableMirror = [];
+
+ /** @type {WebAssembly.Table} */
+ var wasmTable;
+ var getWasmTableEntry = (funcPtr) => {
+ var func = wasmTableMirror[funcPtr];
+ if (!func) {
+ if (funcPtr >= wasmTableMirror.length)
+ wasmTableMirror.length = funcPtr + 1;
+ /** @suppress {checkTypes} */
+ wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);
+ }
+ /** @suppress {checkTypes} */
+ assert(
+ wasmTable.get(funcPtr) == func,
+ "JavaScript-side Wasm function table mirror is out of date!",
+ );
+ return func;
+ };
+ var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig);
+
+ var PATH = {
+ isAbs: (path) => path.charAt(0) === "/",
+ splitPath: (filename) => {
+ var splitPathRe =
+ /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
+ return splitPathRe.exec(filename).slice(1);
+ },
+ normalizeArray: (parts, allowAboveRoot) => {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length - 1; i >= 0; i--) {
+ var last = parts[i];
+ if (last === ".") {
+ parts.splice(i, 1);
+ } else if (last === "..") {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up; up--) {
+ parts.unshift("..");
+ }
+ }
+ return parts;
+ },
+ normalize: (path) => {
+ var isAbsolute = PATH.isAbs(path),
+ trailingSlash = path.substr(-1) === "/";
+ // Normalize the path
+ path = PATH.normalizeArray(
+ path.split("/").filter((p) => !!p),
+ !isAbsolute,
+ ).join("/");
+ if (!path && !isAbsolute) {
+ path = ".";
+ }
+ if (path && trailingSlash) {
+ path += "/";
+ }
+ return (isAbsolute ? "/" : "") + path;
+ },
+ dirname: (path) => {
+ var result = PATH.splitPath(path),
+ root = result[0],
+ dir = result[1];
+ if (!root && !dir) {
+ // No dirname whatsoever
+ return ".";
+ }
+ if (dir) {
+ // It has a dirname, strip trailing slash
+ dir = dir.substr(0, dir.length - 1);
+ }
+ return root + dir;
+ },
+ basename: (path) => {
+ // EMSCRIPTEN return '/'' for '/', not an empty string
+ if (path === "/") return "/";
+ path = PATH.normalize(path);
+ path = path.replace(/\/$/, "");
+ var lastSlash = path.lastIndexOf("/");
+ if (lastSlash === -1) return path;
+ return path.substr(lastSlash + 1);
+ },
+ join: (...paths) => PATH.normalize(paths.join("/")),
+ join2: (l, r) => PATH.normalize(l + "/" + r),
+ };
+
+ var initRandomFill = () => {
+ if (
+ typeof crypto == "object" &&
+ typeof crypto["getRandomValues"] == "function"
+ ) {
+ // for modern web browsers
+ return (view) => crypto.getRandomValues(view);
+ }
+ // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096
+ else
+ abort(
+ "no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: (array) => { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };",
+ );
+ };
+ var randomFill = (view) => {
+ // Lazily init on the first invocation.
+ return (randomFill = initRandomFill())(view);
+ };
+
+ var PATH_FS = {
+ resolve: (...args) => {
+ var resolvedPath = "",
+ resolvedAbsolute = false;
+ for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+ var path = i >= 0 ? args[i] : FS.cwd();
+ // Skip empty and invalid entries
+ if (typeof path != "string") {
+ throw new TypeError("Arguments to path.resolve must be strings");
+ } else if (!path) {
+ return ""; // an invalid portion invalidates the whole thing
+ }
+ resolvedPath = path + "/" + resolvedPath;
+ resolvedAbsolute = PATH.isAbs(path);
+ }
+ // At this point the path should be resolved to a full absolute path, but
+ // handle relative paths to be safe (might happen when process.cwd() fails)
+ resolvedPath = PATH.normalizeArray(
+ resolvedPath.split("/").filter((p) => !!p),
+ !resolvedAbsolute,
+ ).join("/");
+ return (resolvedAbsolute ? "/" : "") + resolvedPath || ".";
+ },
+ relative: (from, to) => {
+ from = PATH_FS.resolve(from).substr(1);
+ to = PATH_FS.resolve(to).substr(1);
+ function trim(arr) {
+ var start = 0;
+ for (; start < arr.length; start++) {
+ if (arr[start] !== "") break;
+ }
+ var end = arr.length - 1;
+ for (; end >= 0; end--) {
+ if (arr[end] !== "") break;
+ }
+ if (start > end) return [];
+ return arr.slice(start, end - start + 1);
+ }
+ var fromParts = trim(from.split("/"));
+ var toParts = trim(to.split("/"));
+ var length = Math.min(fromParts.length, toParts.length);
+ var samePartsLength = length;
+ for (var i = 0; i < length; i++) {
+ if (fromParts[i] !== toParts[i]) {
+ samePartsLength = i;
+ break;
+ }
+ }
+ var outputParts = [];
+ for (var i = samePartsLength; i < fromParts.length; i++) {
+ outputParts.push("..");
+ }
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
+ return outputParts.join("/");
+ },
+ };
+
+ var FS_stdin_getChar_buffer = [];
+
+ var lengthBytesUTF8 = (str) => {
+ var len = 0;
+ for (var i = 0; i < str.length; ++i) {
+ // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
+ // unit, not a Unicode code point of the character! So decode
+ // UTF16->UTF32->UTF8.
+ // See http://unicode.org/faq/utf_bom.html#utf16-3
+ var c = str.charCodeAt(i); // possibly a lead surrogate
+ if (c <= 0x7f) {
+ len++;
+ } else if (c <= 0x7ff) {
+ len += 2;
+ } else if (c >= 0xd800 && c <= 0xdfff) {
+ len += 4;
+ ++i;
+ } else {
+ len += 3;
+ }
+ }
+ return len;
+ };
+
+ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
+ assert(
+ typeof str === "string",
+ `stringToUTF8Array expects a string (got ${typeof str})`,
+ );
+ // Parameter maxBytesToWrite is not optional. Negative values, 0, null,
+ // undefined and false each don't write out any bytes.
+ if (!(maxBytesToWrite > 0)) return 0;
+
+ var startIdx = outIdx;
+ var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
+ for (var i = 0; i < str.length; ++i) {
+ // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
+ // unit, not a Unicode code point of the character! So decode
+ // UTF16->UTF32->UTF8.
+ // See http://unicode.org/faq/utf_bom.html#utf16-3
+ // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description
+ // and https://www.ietf.org/rfc/rfc2279.txt
+ // and https://tools.ietf.org/html/rfc3629
+ var u = str.charCodeAt(i); // possibly a lead surrogate
+ if (u >= 0xd800 && u <= 0xdfff) {
+ var u1 = str.charCodeAt(++i);
+ u = (0x10000 + ((u & 0x3ff) << 10)) | (u1 & 0x3ff);
+ }
+ if (u <= 0x7f) {
+ if (outIdx >= endIdx) break;
+ heap[outIdx++] = u;
+ } else if (u <= 0x7ff) {
+ if (outIdx + 1 >= endIdx) break;
+ heap[outIdx++] = 0xc0 | (u >> 6);
+ heap[outIdx++] = 0x80 | (u & 63);
+ } else if (u <= 0xffff) {
+ if (outIdx + 2 >= endIdx) break;
+ heap[outIdx++] = 0xe0 | (u >> 12);
+ heap[outIdx++] = 0x80 | ((u >> 6) & 63);
+ heap[outIdx++] = 0x80 | (u & 63);
+ } else {
+ if (outIdx + 3 >= endIdx) break;
+ if (u > 0x10ffff)
+ warnOnce(
+ "Invalid Unicode code point " +
+ ptrToString(u) +
+ " encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).",
+ );
+ heap[outIdx++] = 0xf0 | (u >> 18);
+ heap[outIdx++] = 0x80 | ((u >> 12) & 63);
+ heap[outIdx++] = 0x80 | ((u >> 6) & 63);
+ heap[outIdx++] = 0x80 | (u & 63);
+ }
+ }
+ // Null-terminate the pointer to the buffer.
+ heap[outIdx] = 0;
+ return outIdx - startIdx;
+ };
+ /** @type {function(string, boolean=, number=)} */
+ function intArrayFromString(stringy, dontAddNull, length) {
+ var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
+ var u8array = new Array(len);
+ var numBytesWritten = stringToUTF8Array(
+ stringy,
+ u8array,
+ 0,
+ u8array.length,
+ );
+ if (dontAddNull) u8array.length = numBytesWritten;
+ return u8array;
+ }
+ var FS_stdin_getChar = () => {
+ if (!FS_stdin_getChar_buffer.length) {
+ var result = null;
+ if (
+ typeof window != "undefined" &&
+ typeof window.prompt == "function"
+ ) {
+ // Browser.
+ result = window.prompt("Input: "); // returns null on cancel
+ if (result !== null) {
+ result += "\n";
+ }
+ } else {
+ }
+ if (!result) {
+ return null;
+ }
+ FS_stdin_getChar_buffer = intArrayFromString(result, true);
+ }
+ return FS_stdin_getChar_buffer.shift();
+ };
+ var TTY = {
+ ttys: [],
+ init() {
+ // https://github.com/emscripten-core/emscripten/pull/1555
+ // if (ENVIRONMENT_IS_NODE) {
+ // // currently, FS.init does not distinguish if process.stdin is a file or TTY
+ // // device, it always assumes it's a TTY device. because of this, we're forcing
+ // // process.stdin to UTF8 encoding to at least make stdin reading compatible
+ // // with text files until FS.init can be refactored.
+ // process.stdin.setEncoding('utf8');
+ // }
+ },
+ shutdown() {
+ // https://github.com/emscripten-core/emscripten/pull/1555
+ // if (ENVIRONMENT_IS_NODE) {
+ // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?
+ // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation
+ // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?
+ // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle
+ // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call
+ // process.stdin.pause();
+ // }
+ },
+ register(dev, ops) {
+ TTY.ttys[dev] = { input: [], output: [], ops: ops };
+ FS.registerDevice(dev, TTY.stream_ops);
+ },
+ stream_ops: {
+ open(stream) {
+ var tty = TTY.ttys[stream.node.rdev];
+ if (!tty) {
+ throw new FS.ErrnoError(43);
+ }
+ stream.tty = tty;
+ stream.seekable = false;
+ },
+ close(stream) {
+ // flush any pending line data
+ stream.tty.ops.fsync(stream.tty);
+ },
+ fsync(stream) {
+ stream.tty.ops.fsync(stream.tty);
+ },
+ read(stream, buffer, offset, length, pos /* ignored */) {
+ if (!stream.tty || !stream.tty.ops.get_char) {
+ throw new FS.ErrnoError(60);
+ }
+ var bytesRead = 0;
+ for (var i = 0; i < length; i++) {
+ var result;
+ try {
+ result = stream.tty.ops.get_char(stream.tty);
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ if (result === undefined && bytesRead === 0) {
+ throw new FS.ErrnoError(6);
+ }
+ if (result === null || result === undefined) break;
+ bytesRead++;
+ buffer[offset + i] = result;
+ }
+ if (bytesRead) {
+ stream.node.atime = Date.now();
+ }
+ return bytesRead;
+ },
+ write(stream, buffer, offset, length, pos) {
+ if (!stream.tty || !stream.tty.ops.put_char) {
+ throw new FS.ErrnoError(60);
+ }
+ try {
+ for (var i = 0; i < length; i++) {
+ stream.tty.ops.put_char(stream.tty, buffer[offset + i]);
+ }
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ if (length) {
+ stream.node.mtime = stream.node.ctime = Date.now();
+ }
+ return i;
+ },
+ },
+ default_tty_ops: {
+ get_char(tty) {
+ return FS_stdin_getChar();
+ },
+ put_char(tty, val) {
+ if (val === null || val === 10) {
+ out(UTF8ArrayToString(tty.output));
+ tty.output = [];
+ } else {
+ if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle.
+ }
+ },
+ fsync(tty) {
+ if (tty.output && tty.output.length > 0) {
+ out(UTF8ArrayToString(tty.output));
+ tty.output = [];
+ }
+ },
+ ioctl_tcgets(tty) {
+ // typical setting
+ return {
+ c_iflag: 25856,
+ c_oflag: 5,
+ c_cflag: 191,
+ c_lflag: 35387,
+ c_cc: [
+ 0x03, 0x1c, 0x7f, 0x15, 0x04, 0x00, 0x01, 0x00, 0x11, 0x13, 0x1a,
+ 0x00, 0x12, 0x0f, 0x17, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ ],
+ };
+ },
+ ioctl_tcsets(tty, optional_actions, data) {
+ // currently just ignore
+ return 0;
+ },
+ ioctl_tiocgwinsz(tty) {
+ return [24, 80];
+ },
+ },
+ default_tty1_ops: {
+ put_char(tty, val) {
+ if (val === null || val === 10) {
+ err(UTF8ArrayToString(tty.output));
+ tty.output = [];
+ } else {
+ if (val != 0) tty.output.push(val);
+ }
+ },
+ fsync(tty) {
+ if (tty.output && tty.output.length > 0) {
+ err(UTF8ArrayToString(tty.output));
+ tty.output = [];
+ }
+ },
+ },
+ };
+
+ var zeroMemory = (address, size) => {
+ HEAPU8.fill(0, address, address + size);
+ };
+
+ var alignMemory = (size, alignment) => {
+ assert(alignment, "alignment argument is required");
+ return Math.ceil(size / alignment) * alignment;
+ };
+ var mmapAlloc = (size) => {
+ size = alignMemory(size, 65536);
+ var ptr = _emscripten_builtin_memalign(65536, size);
+ if (ptr) zeroMemory(ptr, size);
+ return ptr;
+ };
+ var MEMFS = {
+ ops_table: null,
+ mount(mount) {
+ return MEMFS.createNode(null, "/", 16895, 0);
+ },
+ createNode(parent, name, mode, dev) {
+ if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
+ // no supported
+ throw new FS.ErrnoError(63);
+ }
+ MEMFS.ops_table ||= {
+ dir: {
+ node: {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ lookup: MEMFS.node_ops.lookup,
+ mknod: MEMFS.node_ops.mknod,
+ rename: MEMFS.node_ops.rename,
+ unlink: MEMFS.node_ops.unlink,
+ rmdir: MEMFS.node_ops.rmdir,
+ readdir: MEMFS.node_ops.readdir,
+ symlink: MEMFS.node_ops.symlink,
+ },
+ stream: {
+ llseek: MEMFS.stream_ops.llseek,
+ },
+ },
+ file: {
+ node: {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ },
+ stream: {
+ llseek: MEMFS.stream_ops.llseek,
+ read: MEMFS.stream_ops.read,
+ write: MEMFS.stream_ops.write,
+ allocate: MEMFS.stream_ops.allocate,
+ mmap: MEMFS.stream_ops.mmap,
+ msync: MEMFS.stream_ops.msync,
+ },
+ },
+ link: {
+ node: {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ readlink: MEMFS.node_ops.readlink,
+ },
+ stream: {},
+ },
+ chrdev: {
+ node: {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ },
+ stream: FS.chrdev_stream_ops,
+ },
+ };
+ var node = FS.createNode(parent, name, mode, dev);
+ if (FS.isDir(node.mode)) {
+ node.node_ops = MEMFS.ops_table.dir.node;
+ node.stream_ops = MEMFS.ops_table.dir.stream;
+ node.contents = {};
+ } else if (FS.isFile(node.mode)) {
+ node.node_ops = MEMFS.ops_table.file.node;
+ node.stream_ops = MEMFS.ops_table.file.stream;
+ node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity.
+ // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred
+ // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size
+ // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme.
+ node.contents = null;
+ } else if (FS.isLink(node.mode)) {
+ node.node_ops = MEMFS.ops_table.link.node;
+ node.stream_ops = MEMFS.ops_table.link.stream;
+ } else if (FS.isChrdev(node.mode)) {
+ node.node_ops = MEMFS.ops_table.chrdev.node;
+ node.stream_ops = MEMFS.ops_table.chrdev.stream;
+ }
+ node.atime = node.mtime = node.ctime = Date.now();
+ // add the new node to the parent
+ if (parent) {
+ parent.contents[name] = node;
+ parent.atime = parent.mtime = parent.ctime = node.atime;
+ }
+ return node;
+ },
+ getFileDataAsTypedArray(node) {
+ if (!node.contents) return new Uint8Array(0);
+ if (node.contents.subarray)
+ return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes.
+ return new Uint8Array(node.contents);
+ },
+ expandFileStorage(node, newCapacity) {
+ var prevCapacity = node.contents ? node.contents.length : 0;
+ if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough.
+ // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity.
+ // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to
+ // avoid overshooting the allocation cap by a very large margin.
+ var CAPACITY_DOUBLING_MAX = 1024 * 1024;
+ newCapacity = Math.max(
+ newCapacity,
+ (prevCapacity *
+ (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>>
+ 0,
+ );
+ if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding.
+ var oldContents = node.contents;
+ node.contents = new Uint8Array(newCapacity); // Allocate new storage.
+ if (node.usedBytes > 0)
+ node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage.
+ },
+ resizeFileStorage(node, newSize) {
+ if (node.usedBytes == newSize) return;
+ if (newSize == 0) {
+ node.contents = null; // Fully decommit when requesting a resize to zero.
+ node.usedBytes = 0;
+ } else {
+ var oldContents = node.contents;
+ node.contents = new Uint8Array(newSize); // Allocate new storage.
+ if (oldContents) {
+ node.contents.set(
+ oldContents.subarray(0, Math.min(newSize, node.usedBytes)),
+ ); // Copy old data over to the new storage.
+ }
+ node.usedBytes = newSize;
+ }
+ },
+ node_ops: {
+ getattr(node) {
+ var attr = {};
+ // device numbers reuse inode numbers.
+ attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
+ attr.ino = node.id;
+ attr.mode = node.mode;
+ attr.nlink = 1;
+ attr.uid = 0;
+ attr.gid = 0;
+ attr.rdev = node.rdev;
+ if (FS.isDir(node.mode)) {
+ attr.size = 4096;
+ } else if (FS.isFile(node.mode)) {
+ attr.size = node.usedBytes;
+ } else if (FS.isLink(node.mode)) {
+ attr.size = node.link.length;
+ } else {
+ attr.size = 0;
+ }
+ attr.atime = new Date(node.atime);
+ attr.mtime = new Date(node.mtime);
+ attr.ctime = new Date(node.ctime);
+ // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
+ // but this is not required by the standard.
+ attr.blksize = 4096;
+ attr.blocks = Math.ceil(attr.size / attr.blksize);
+ return attr;
+ },
+ setattr(node, attr) {
+ for (const key of ["mode", "atime", "mtime", "ctime"]) {
+ if (attr[key]) {
+ node[key] = attr[key];
+ }
+ }
+ if (attr.size !== undefined) {
+ MEMFS.resizeFileStorage(node, attr.size);
+ }
+ },
+ lookup(parent, name) {
+ throw new FS.ErrnoError(44);
+ },
+ mknod(parent, name, mode, dev) {
+ return MEMFS.createNode(parent, name, mode, dev);
+ },
+ rename(old_node, new_dir, new_name) {
+ var new_node;
+ try {
+ new_node = FS.lookupNode(new_dir, new_name);
+ } catch (e) {}
+ if (new_node) {
+ if (FS.isDir(old_node.mode)) {
+ // if we're overwriting a directory at new_name, make sure it's empty.
+ for (var i in new_node.contents) {
+ throw new FS.ErrnoError(55);
+ }
+ }
+ FS.hashRemoveNode(new_node);
+ }
+ // do the internal rewiring
+ delete old_node.parent.contents[old_node.name];
+ new_dir.contents[new_name] = old_node;
+ old_node.name = new_name;
+ new_dir.ctime =
+ new_dir.mtime =
+ old_node.parent.ctime =
+ old_node.parent.mtime =
+ Date.now();
+ },
+ unlink(parent, name) {
+ delete parent.contents[name];
+ parent.ctime = parent.mtime = Date.now();
+ },
+ rmdir(parent, name) {
+ var node = FS.lookupNode(parent, name);
+ for (var i in node.contents) {
+ throw new FS.ErrnoError(55);
+ }
+ delete parent.contents[name];
+ parent.ctime = parent.mtime = Date.now();
+ },
+ readdir(node) {
+ return [".", "..", ...Object.keys(node.contents)];
+ },
+ symlink(parent, newname, oldpath) {
+ var node = MEMFS.createNode(parent, newname, 0o777 | 40960, 0);
+ node.link = oldpath;
+ return node;
+ },
+ readlink(node) {
+ if (!FS.isLink(node.mode)) {
+ throw new FS.ErrnoError(28);
+ }
+ return node.link;
+ },
+ },
+ stream_ops: {
+ read(stream, buffer, offset, length, position) {
+ var contents = stream.node.contents;
+ if (position >= stream.node.usedBytes) return 0;
+ var size = Math.min(stream.node.usedBytes - position, length);
+ assert(size >= 0);
+ if (size > 8 && contents.subarray) {
+ // non-trivial, and typed array
+ buffer.set(contents.subarray(position, position + size), offset);
+ } else {
+ for (var i = 0; i < size; i++)
+ buffer[offset + i] = contents[position + i];
+ }
+ return size;
+ },
+ write(stream, buffer, offset, length, position, canOwn) {
+ // The data buffer should be a typed array view
+ assert(!(buffer instanceof ArrayBuffer));
+
+ if (!length) return 0;
+ var node = stream.node;
+ node.mtime = node.ctime = Date.now();
+
+ if (buffer.subarray && (!node.contents || node.contents.subarray)) {
+ // This write is from a typed array to a typed array?
+ if (canOwn) {
+ assert(
+ position === 0,
+ "canOwn must imply no weird position inside the file",
+ );
+ node.contents = buffer.subarray(offset, offset + length);
+ node.usedBytes = length;
+ return length;
+ } else if (node.usedBytes === 0 && position === 0) {
+ // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data.
+ node.contents = buffer.slice(offset, offset + length);
+ node.usedBytes = length;
+ return length;
+ } else if (position + length <= node.usedBytes) {
+ // Writing to an already allocated and used subrange of the file?
+ node.contents.set(
+ buffer.subarray(offset, offset + length),
+ position,
+ );
+ return length;
+ }
+ }
+
+ // Appending to an existing file and we need to reallocate, or source data did not come as a typed array.
+ MEMFS.expandFileStorage(node, position + length);
+ if (node.contents.subarray && buffer.subarray) {
+ // Use typed array write which is available.
+ node.contents.set(
+ buffer.subarray(offset, offset + length),
+ position,
+ );
+ } else {
+ for (var i = 0; i < length; i++) {
+ node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not.
+ }
+ }
+ node.usedBytes = Math.max(node.usedBytes, position + length);
+ return length;
+ },
+ llseek(stream, offset, whence) {
+ var position = offset;
+ if (whence === 1) {
+ position += stream.position;
+ } else if (whence === 2) {
+ if (FS.isFile(stream.node.mode)) {
+ position += stream.node.usedBytes;
+ }
+ }
+ if (position < 0) {
+ throw new FS.ErrnoError(28);
+ }
+ return position;
+ },
+ allocate(stream, offset, length) {
+ MEMFS.expandFileStorage(stream.node, offset + length);
+ stream.node.usedBytes = Math.max(
+ stream.node.usedBytes,
+ offset + length,
+ );
+ },
+ mmap(stream, length, position, prot, flags) {
+ if (!FS.isFile(stream.node.mode)) {
+ throw new FS.ErrnoError(43);
+ }
+ var ptr;
+ var allocated;
+ var contents = stream.node.contents;
+ // Only make a new copy when MAP_PRIVATE is specified.
+ if (!(flags & 2) && contents && contents.buffer === HEAP8.buffer) {
+ // We can't emulate MAP_SHARED when the file is not backed by the
+ // buffer we're mapping to (e.g. the HEAP buffer).
+ allocated = false;
+ ptr = contents.byteOffset;
+ } else {
+ allocated = true;
+ ptr = mmapAlloc(length);
+ if (!ptr) {
+ throw new FS.ErrnoError(48);
+ }
+ if (contents) {
+ // Try to avoid unnecessary slices.
+ if (position > 0 || position + length < contents.length) {
+ if (contents.subarray) {
+ contents = contents.subarray(position, position + length);
+ } else {
+ contents = Array.prototype.slice.call(
+ contents,
+ position,
+ position + length,
+ );
+ }
+ }
+ HEAP8.set(contents, ptr);
+ }
+ }
+ return { ptr, allocated };
+ },
+ msync(stream, buffer, offset, length, mmapFlags) {
+ MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
+ // should we check if bytesWritten and length are the same?
+ return 0;
+ },
+ },
+ };
+
+ var asyncLoad = async (url) => {
+ var arrayBuffer = await readAsync(url);
+ assert(
+ arrayBuffer,
+ `Loading data file "${url}" failed (no arrayBuffer).`,
+ );
+ return new Uint8Array(arrayBuffer);
+ };
+
+ var FS_createDataFile = (
+ parent,
+ name,
+ fileData,
+ canRead,
+ canWrite,
+ canOwn,
+ ) => {
+ FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn);
+ };
+
+ var preloadPlugins = Module["preloadPlugins"] || [];
+ var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => {
+ // Ensure plugins are ready.
+ if (typeof Browser != "undefined") Browser.init();
+
+ var handled = false;
+ preloadPlugins.forEach((plugin) => {
+ if (handled) return;
+ if (plugin["canHandle"](fullname)) {
+ plugin["handle"](byteArray, fullname, finish, onerror);
+ handled = true;
+ }
+ });
+ return handled;
+ };
+ var FS_createPreloadedFile = (
+ parent,
+ name,
+ url,
+ canRead,
+ canWrite,
+ onload,
+ onerror,
+ dontCreateFile,
+ canOwn,
+ preFinish,
+ ) => {
+ // TODO we should allow people to just pass in a complete filename instead
+ // of parent and name being that we just join them anyways
+ var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;
+ var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname
+ function processData(byteArray) {
+ function finish(byteArray) {
+ preFinish?.();
+ if (!dontCreateFile) {
+ FS_createDataFile(
+ parent,
+ name,
+ byteArray,
+ canRead,
+ canWrite,
+ canOwn,
+ );
+ }
+ onload?.();
+ removeRunDependency(dep);
+ }
+ if (
+ FS_handledByPreloadPlugin(byteArray, fullname, finish, () => {
+ onerror?.();
+ removeRunDependency(dep);
+ })
+ ) {
+ return;
+ }
+ finish(byteArray);
+ }
+ addRunDependency(dep);
+ if (typeof url == "string") {
+ asyncLoad(url).then(processData, onerror);
+ } else {
+ processData(url);
+ }
+ };
+
+ var FS_modeStringToFlags = (str) => {
+ var flagModes = {
+ r: 0,
+ "r+": 2,
+ w: 512 | 64 | 1,
+ "w+": 512 | 64 | 2,
+ a: 1024 | 64 | 1,
+ "a+": 1024 | 64 | 2,
+ };
+ var flags = flagModes[str];
+ if (typeof flags == "undefined") {
+ throw new Error(`Unknown file open mode: ${str}`);
+ }
+ return flags;
+ };
+
+ var FS_getMode = (canRead, canWrite) => {
+ var mode = 0;
+ if (canRead) mode |= 292 | 73;
+ if (canWrite) mode |= 146;
+ return mode;
+ };
+
+ var strError = (errno) => UTF8ToString(_strerror(errno));
+
+ var ERRNO_CODES = {
+ EPERM: 63,
+ ENOENT: 44,
+ ESRCH: 71,
+ EINTR: 27,
+ EIO: 29,
+ ENXIO: 60,
+ E2BIG: 1,
+ ENOEXEC: 45,
+ EBADF: 8,
+ ECHILD: 12,
+ EAGAIN: 6,
+ EWOULDBLOCK: 6,
+ ENOMEM: 48,
+ EACCES: 2,
+ EFAULT: 21,
+ ENOTBLK: 105,
+ EBUSY: 10,
+ EEXIST: 20,
+ EXDEV: 75,
+ ENODEV: 43,
+ ENOTDIR: 54,
+ EISDIR: 31,
+ EINVAL: 28,
+ ENFILE: 41,
+ EMFILE: 33,
+ ENOTTY: 59,
+ ETXTBSY: 74,
+ EFBIG: 22,
+ ENOSPC: 51,
+ ESPIPE: 70,
+ EROFS: 69,
+ EMLINK: 34,
+ EPIPE: 64,
+ EDOM: 18,
+ ERANGE: 68,
+ ENOMSG: 49,
+ EIDRM: 24,
+ ECHRNG: 106,
+ EL2NSYNC: 156,
+ EL3HLT: 107,
+ EL3RST: 108,
+ ELNRNG: 109,
+ EUNATCH: 110,
+ ENOCSI: 111,
+ EL2HLT: 112,
+ EDEADLK: 16,
+ ENOLCK: 46,
+ EBADE: 113,
+ EBADR: 114,
+ EXFULL: 115,
+ ENOANO: 104,
+ EBADRQC: 103,
+ EBADSLT: 102,
+ EDEADLOCK: 16,
+ EBFONT: 101,
+ ENOSTR: 100,
+ ENODATA: 116,
+ ETIME: 117,
+ ENOSR: 118,
+ ENONET: 119,
+ ENOPKG: 120,
+ EREMOTE: 121,
+ ENOLINK: 47,
+ EADV: 122,
+ ESRMNT: 123,
+ ECOMM: 124,
+ EPROTO: 65,
+ EMULTIHOP: 36,
+ EDOTDOT: 125,
+ EBADMSG: 9,
+ ENOTUNIQ: 126,
+ EBADFD: 127,
+ EREMCHG: 128,
+ ELIBACC: 129,
+ ELIBBAD: 130,
+ ELIBSCN: 131,
+ ELIBMAX: 132,
+ ELIBEXEC: 133,
+ ENOSYS: 52,
+ ENOTEMPTY: 55,
+ ENAMETOOLONG: 37,
+ ELOOP: 32,
+ EOPNOTSUPP: 138,
+ EPFNOSUPPORT: 139,
+ ECONNRESET: 15,
+ ENOBUFS: 42,
+ EAFNOSUPPORT: 5,
+ EPROTOTYPE: 67,
+ ENOTSOCK: 57,
+ ENOPROTOOPT: 50,
+ ESHUTDOWN: 140,
+ ECONNREFUSED: 14,
+ EADDRINUSE: 3,
+ ECONNABORTED: 13,
+ ENETUNREACH: 40,
+ ENETDOWN: 38,
+ ETIMEDOUT: 73,
+ EHOSTDOWN: 142,
+ EHOSTUNREACH: 23,
+ EINPROGRESS: 26,
+ EALREADY: 7,
+ EDESTADDRREQ: 17,
+ EMSGSIZE: 35,
+ EPROTONOSUPPORT: 66,
+ ESOCKTNOSUPPORT: 137,
+ EADDRNOTAVAIL: 4,
+ ENETRESET: 39,
+ EISCONN: 30,
+ ENOTCONN: 53,
+ ETOOMANYREFS: 141,
+ EUSERS: 136,
+ EDQUOT: 19,
+ ESTALE: 72,
+ ENOTSUP: 138,
+ ENOMEDIUM: 148,
+ EILSEQ: 25,
+ EOVERFLOW: 61,
+ ECANCELED: 11,
+ ENOTRECOVERABLE: 56,
+ EOWNERDEAD: 62,
+ ESTRPIPE: 135,
+ };
+ var FS = {
+ root: null,
+ mounts: [],
+ devices: {},
+ streams: [],
+ nextInode: 1,
+ nameTable: null,
+ currentPath: "/",
+ initialized: false,
+ ignorePermissions: true,
+ ErrnoError: class extends Error {
+ name = "ErrnoError";
+ // We set the `name` property to be able to identify `FS.ErrnoError`
+ // - the `name` is a standard ECMA-262 property of error objects. Kind of good to have it anyway.
+ // - when using PROXYFS, an error can come from an underlying FS
+ // as different FS objects have their own FS.ErrnoError each,
+ // the test `err instanceof FS.ErrnoError` won't detect an error coming from another filesystem, causing bugs.
+ // we'll use the reliable test `err.name == "ErrnoError"` instead
+ constructor(errno) {
+ super(runtimeInitialized ? strError(errno) : "");
+ this.errno = errno;
+ for (var key in ERRNO_CODES) {
+ if (ERRNO_CODES[key] === errno) {
+ this.code = key;
+ break;
+ }
+ }
+ }
+ },
+ filesystems: null,
+ syncFSRequests: 0,
+ readFiles: {},
+ FSStream: class {
+ shared = {};
+ get object() {
+ return this.node;
+ }
+ set object(val) {
+ this.node = val;
+ }
+ get isRead() {
+ return (this.flags & 2097155) !== 1;
+ }
+ get isWrite() {
+ return (this.flags & 2097155) !== 0;
+ }
+ get isAppend() {
+ return this.flags & 1024;
+ }
+ get flags() {
+ return this.shared.flags;
+ }
+ set flags(val) {
+ this.shared.flags = val;
+ }
+ get position() {
+ return this.shared.position;
+ }
+ set position(val) {
+ this.shared.position = val;
+ }
+ },
+ FSNode: class {
+ node_ops = {};
+ stream_ops = {};
+ readMode = 292 | 73;
+ writeMode = 146;
+ mounted = null;
+ constructor(parent, name, mode, rdev) {
+ if (!parent) {
+ parent = this; // root node sets parent to itself
+ }
+ this.parent = parent;
+ this.mount = parent.mount;
+ this.id = FS.nextInode++;
+ this.name = name;
+ this.mode = mode;
+ this.rdev = rdev;
+ this.atime = this.mtime = this.ctime = Date.now();
+ }
+ get read() {
+ return (this.mode & this.readMode) === this.readMode;
+ }
+ set read(val) {
+ val ? (this.mode |= this.readMode) : (this.mode &= ~this.readMode);
+ }
+ get write() {
+ return (this.mode & this.writeMode) === this.writeMode;
+ }
+ set write(val) {
+ val ? (this.mode |= this.writeMode) : (this.mode &= ~this.writeMode);
+ }
+ get isFolder() {
+ return FS.isDir(this.mode);
+ }
+ get isDevice() {
+ return FS.isChrdev(this.mode);
+ }
+ },
+ lookupPath(path, opts = {}) {
+ if (!path) return { path: "", node: null };
+ opts.follow_mount ??= true;
+
+ if (!PATH.isAbs(path)) {
+ path = FS.cwd() + "/" + path;
+ }
+
+ // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
+ linkloop: for (var nlinks = 0; nlinks < 40; nlinks++) {
+ // split the absolute path
+ var parts = path.split("/").filter((p) => !!p && p !== ".");
+
+ // start at the root
+ var current = FS.root;
+ var current_path = "/";
+
+ for (var i = 0; i < parts.length; i++) {
+ var islast = i === parts.length - 1;
+ if (islast && opts.parent) {
+ // stop resolving
+ break;
+ }
+
+ if (parts[i] === "..") {
+ current_path = PATH.dirname(current_path);
+ current = current.parent;
+ continue;
+ }
+
+ current_path = PATH.join2(current_path, parts[i]);
+ try {
+ current = FS.lookupNode(current, parts[i]);
+ } catch (e) {
+ // if noent_okay is true, suppress a ENOENT in the last component
+ // and return an object with an undefined node. This is needed for
+ // resolving symlinks in the path when creating a file.
+ if (e?.errno === 44 && islast && opts.noent_okay) {
+ return { path: current_path };
+ }
+ throw e;
+ }
+
+ // jump to the mount's root node if this is a mountpoint
+ if (FS.isMountpoint(current) && (!islast || opts.follow_mount)) {
+ current = current.mounted.root;
+ }
+
+ // by default, lookupPath will not follow a symlink if it is the final path component.
+ // setting opts.follow = true will override this behavior.
+ if (FS.isLink(current.mode) && (!islast || opts.follow)) {
+ if (!current.node_ops.readlink) {
+ throw new FS.ErrnoError(52);
+ }
+ var link = current.node_ops.readlink(current);
+ if (!PATH.isAbs(link)) {
+ link = PATH.dirname(current_path) + "/" + link;
+ }
+ path = link + "/" + parts.slice(i + 1).join("/");
+ continue linkloop;
+ }
+ }
+ return { path: current_path, node: current };
+ }
+ throw new FS.ErrnoError(32);
+ },
+ getPath(node) {
+ var path;
+ while (true) {
+ if (FS.isRoot(node)) {
+ var mount = node.mount.mountpoint;
+ if (!path) return mount;
+ return mount[mount.length - 1] !== "/"
+ ? `${mount}/${path}`
+ : mount + path;
+ }
+ path = path ? `${node.name}/${path}` : node.name;
+ node = node.parent;
+ }
+ },
+ hashName(parentid, name) {
+ var hash = 0;
+
+ for (var i = 0; i < name.length; i++) {
+ hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
+ }
+ return ((parentid + hash) >>> 0) % FS.nameTable.length;
+ },
+ hashAddNode(node) {
+ var hash = FS.hashName(node.parent.id, node.name);
+ node.name_next = FS.nameTable[hash];
+ FS.nameTable[hash] = node;
+ },
+ hashRemoveNode(node) {
+ var hash = FS.hashName(node.parent.id, node.name);
+ if (FS.nameTable[hash] === node) {
+ FS.nameTable[hash] = node.name_next;
+ } else {
+ var current = FS.nameTable[hash];
+ while (current) {
+ if (current.name_next === node) {
+ current.name_next = node.name_next;
+ break;
+ }
+ current = current.name_next;
+ }
+ }
+ },
+ lookupNode(parent, name) {
+ var errCode = FS.mayLookup(parent);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ var hash = FS.hashName(parent.id, name);
+ for (var node = FS.nameTable[hash]; node; node = node.name_next) {
+ var nodeName = node.name;
+ if (node.parent.id === parent.id && nodeName === name) {
+ return node;
+ }
+ }
+ // if we failed to find it in the cache, call into the VFS
+ return FS.lookup(parent, name);
+ },
+ createNode(parent, name, mode, rdev) {
+ assert(typeof parent == "object");
+ var node = new FS.FSNode(parent, name, mode, rdev);
+
+ FS.hashAddNode(node);
+
+ return node;
+ },
+ destroyNode(node) {
+ FS.hashRemoveNode(node);
+ },
+ isRoot(node) {
+ return node === node.parent;
+ },
+ isMountpoint(node) {
+ return !!node.mounted;
+ },
+ isFile(mode) {
+ return (mode & 61440) === 32768;
+ },
+ isDir(mode) {
+ return (mode & 61440) === 16384;
+ },
+ isLink(mode) {
+ return (mode & 61440) === 40960;
+ },
+ isChrdev(mode) {
+ return (mode & 61440) === 8192;
+ },
+ isBlkdev(mode) {
+ return (mode & 61440) === 24576;
+ },
+ isFIFO(mode) {
+ return (mode & 61440) === 4096;
+ },
+ isSocket(mode) {
+ return (mode & 49152) === 49152;
+ },
+ flagsToPermissionString(flag) {
+ var perms = ["r", "w", "rw"][flag & 3];
+ if (flag & 512) {
+ perms += "w";
+ }
+ return perms;
+ },
+ nodePermissions(node, perms) {
+ if (FS.ignorePermissions) {
+ return 0;
+ }
+ // return 0 if any user, group or owner bits are set.
+ if (perms.includes("r") && !(node.mode & 292)) {
+ return 2;
+ } else if (perms.includes("w") && !(node.mode & 146)) {
+ return 2;
+ } else if (perms.includes("x") && !(node.mode & 73)) {
+ return 2;
+ }
+ return 0;
+ },
+ mayLookup(dir) {
+ if (!FS.isDir(dir.mode)) return 54;
+ var errCode = FS.nodePermissions(dir, "x");
+ if (errCode) return errCode;
+ if (!dir.node_ops.lookup) return 2;
+ return 0;
+ },
+ mayCreate(dir, name) {
+ if (!FS.isDir(dir.mode)) {
+ return 54;
+ }
+ try {
+ var node = FS.lookupNode(dir, name);
+ return 20;
+ } catch (e) {}
+ return FS.nodePermissions(dir, "wx");
+ },
+ mayDelete(dir, name, isdir) {
+ var node;
+ try {
+ node = FS.lookupNode(dir, name);
+ } catch (e) {
+ return e.errno;
+ }
+ var errCode = FS.nodePermissions(dir, "wx");
+ if (errCode) {
+ return errCode;
+ }
+ if (isdir) {
+ if (!FS.isDir(node.mode)) {
+ return 54;
+ }
+ if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
+ return 10;
+ }
+ } else {
+ if (FS.isDir(node.mode)) {
+ return 31;
+ }
+ }
+ return 0;
+ },
+ mayOpen(node, flags) {
+ if (!node) {
+ return 44;
+ }
+ if (FS.isLink(node.mode)) {
+ return 32;
+ } else if (FS.isDir(node.mode)) {
+ if (
+ FS.flagsToPermissionString(flags) !== "r" || // opening for write
+ flags & 512
+ ) {
+ // TODO: check for O_SEARCH? (== search for dir only)
+ return 31;
+ }
+ }
+ return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
+ },
+ MAX_OPEN_FDS: 4096,
+ nextfd() {
+ for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) {
+ if (!FS.streams[fd]) {
+ return fd;
+ }
+ }
+ throw new FS.ErrnoError(33);
+ },
+ getStreamChecked(fd) {
+ var stream = FS.getStream(fd);
+ if (!stream) {
+ throw new FS.ErrnoError(8);
+ }
+ return stream;
+ },
+ getStream: (fd) => FS.streams[fd],
+ createStream(stream, fd = -1) {
+ assert(fd >= -1);
+
+ // clone it, so we can return an instance of FSStream
+ stream = Object.assign(new FS.FSStream(), stream);
+ if (fd == -1) {
+ fd = FS.nextfd();
+ }
+ stream.fd = fd;
+ FS.streams[fd] = stream;
+ return stream;
+ },
+ closeStream(fd) {
+ FS.streams[fd] = null;
+ },
+ dupStream(origStream, fd = -1) {
+ var stream = FS.createStream(origStream, fd);
+ stream.stream_ops?.dup?.(stream);
+ return stream;
+ },
+ chrdev_stream_ops: {
+ open(stream) {
+ var device = FS.getDevice(stream.node.rdev);
+ // override node's stream ops with the device's
+ stream.stream_ops = device.stream_ops;
+ // forward the open call
+ stream.stream_ops.open?.(stream);
+ },
+ llseek() {
+ throw new FS.ErrnoError(70);
+ },
+ },
+ major: (dev) => dev >> 8,
+ minor: (dev) => dev & 0xff,
+ makedev: (ma, mi) => (ma << 8) | mi,
+ registerDevice(dev, ops) {
+ FS.devices[dev] = { stream_ops: ops };
+ },
+ getDevice: (dev) => FS.devices[dev],
+ getMounts(mount) {
+ var mounts = [];
+ var check = [mount];
+
+ while (check.length) {
+ var m = check.pop();
+
+ mounts.push(m);
+
+ check.push(...m.mounts);
+ }
+
+ return mounts;
+ },
+ syncfs(populate, callback) {
+ if (typeof populate == "function") {
+ callback = populate;
+ populate = false;
+ }
+
+ FS.syncFSRequests++;
+
+ if (FS.syncFSRequests > 1) {
+ err(
+ `warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`,
+ );
+ }
+
+ var mounts = FS.getMounts(FS.root.mount);
+ var completed = 0;
+
+ function doCallback(errCode) {
+ assert(FS.syncFSRequests > 0);
+ FS.syncFSRequests--;
+ return callback(errCode);
+ }
+
+ function done(errCode) {
+ if (errCode) {
+ if (!done.errored) {
+ done.errored = true;
+ return doCallback(errCode);
+ }
+ return;
+ }
+ if (++completed >= mounts.length) {
+ doCallback(null);
+ }
+ }
+
+ // sync all mounts
+ mounts.forEach((mount) => {
+ if (!mount.type.syncfs) {
+ return done(null);
+ }
+ mount.type.syncfs(mount, populate, done);
+ });
+ },
+ mount(type, opts, mountpoint) {
+ if (typeof type == "string") {
+ // The filesystem was not included, and instead we have an error
+ // message stored in the variable.
+ throw type;
+ }
+ var root = mountpoint === "/";
+ var pseudo = !mountpoint;
+ var node;
+
+ if (root && FS.root) {
+ throw new FS.ErrnoError(10);
+ } else if (!root && !pseudo) {
+ var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
+
+ mountpoint = lookup.path; // use the absolute path
+ node = lookup.node;
+
+ if (FS.isMountpoint(node)) {
+ throw new FS.ErrnoError(10);
+ }
+
+ if (!FS.isDir(node.mode)) {
+ throw new FS.ErrnoError(54);
+ }
+ }
+
+ var mount = {
+ type,
+ opts,
+ mountpoint,
+ mounts: [],
+ };
+
+ // create a root node for the fs
+ var mountRoot = type.mount(mount);
+ mountRoot.mount = mount;
+ mount.root = mountRoot;
+
+ if (root) {
+ FS.root = mountRoot;
+ } else if (node) {
+ // set as a mountpoint
+ node.mounted = mount;
+
+ // add the new mount to the current mount's children
+ if (node.mount) {
+ node.mount.mounts.push(mount);
+ }
+ }
+
+ return mountRoot;
+ },
+ unmount(mountpoint) {
+ var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
+
+ if (!FS.isMountpoint(lookup.node)) {
+ throw new FS.ErrnoError(28);
+ }
+
+ // destroy the nodes for this mount, and all its child mounts
+ var node = lookup.node;
+ var mount = node.mounted;
+ var mounts = FS.getMounts(mount);
+
+ Object.keys(FS.nameTable).forEach((hash) => {
+ var current = FS.nameTable[hash];
+
+ while (current) {
+ var next = current.name_next;
+
+ if (mounts.includes(current.mount)) {
+ FS.destroyNode(current);
+ }
+
+ current = next;
+ }
+ });
+
+ // no longer a mountpoint
+ node.mounted = null;
+
+ // remove this mount from the child mounts
+ var idx = node.mount.mounts.indexOf(mount);
+ assert(idx !== -1);
+ node.mount.mounts.splice(idx, 1);
+ },
+ lookup(parent, name) {
+ return parent.node_ops.lookup(parent, name);
+ },
+ mknod(path, mode, dev) {
+ var lookup = FS.lookupPath(path, { parent: true });
+ var parent = lookup.node;
+ var name = PATH.basename(path);
+ if (!name || name === "." || name === "..") {
+ throw new FS.ErrnoError(28);
+ }
+ var errCode = FS.mayCreate(parent, name);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!parent.node_ops.mknod) {
+ throw new FS.ErrnoError(63);
+ }
+ return parent.node_ops.mknod(parent, name, mode, dev);
+ },
+ statfs(path) {
+ // NOTE: None of the defaults here are true. We're just returning safe and
+ // sane values.
+ var rtn = {
+ bsize: 4096,
+ frsize: 4096,
+ blocks: 1e6,
+ bfree: 5e5,
+ bavail: 5e5,
+ files: FS.nextInode,
+ ffree: FS.nextInode - 1,
+ fsid: 42,
+ flags: 2,
+ namelen: 255,
+ };
+
+ var parent = FS.lookupPath(path, { follow: true }).node;
+ if (parent?.node_ops.statfs) {
+ Object.assign(rtn, parent.node_ops.statfs(parent.mount.opts.root));
+ }
+ return rtn;
+ },
+ create(path, mode = 0o666) {
+ mode &= 4095;
+ mode |= 32768;
+ return FS.mknod(path, mode, 0);
+ },
+ mkdir(path, mode = 0o777) {
+ mode &= 511 | 512;
+ mode |= 16384;
+ return FS.mknod(path, mode, 0);
+ },
+ mkdirTree(path, mode) {
+ var dirs = path.split("/");
+ var d = "";
+ for (var i = 0; i < dirs.length; ++i) {
+ if (!dirs[i]) continue;
+ d += "/" + dirs[i];
+ try {
+ FS.mkdir(d, mode);
+ } catch (e) {
+ if (e.errno != 20) throw e;
+ }
+ }
+ },
+ mkdev(path, mode, dev) {
+ if (typeof dev == "undefined") {
+ dev = mode;
+ mode = 0o666;
+ }
+ mode |= 8192;
+ return FS.mknod(path, mode, dev);
+ },
+ symlink(oldpath, newpath) {
+ if (!PATH_FS.resolve(oldpath)) {
+ throw new FS.ErrnoError(44);
+ }
+ var lookup = FS.lookupPath(newpath, { parent: true });
+ var parent = lookup.node;
+ if (!parent) {
+ throw new FS.ErrnoError(44);
+ }
+ var newname = PATH.basename(newpath);
+ var errCode = FS.mayCreate(parent, newname);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!parent.node_ops.symlink) {
+ throw new FS.ErrnoError(63);
+ }
+ return parent.node_ops.symlink(parent, newname, oldpath);
+ },
+ rename(old_path, new_path) {
+ var old_dirname = PATH.dirname(old_path);
+ var new_dirname = PATH.dirname(new_path);
+ var old_name = PATH.basename(old_path);
+ var new_name = PATH.basename(new_path);
+ // parents must exist
+ var lookup, old_dir, new_dir;
+
+ // let the errors from non existent directories percolate up
+ lookup = FS.lookupPath(old_path, { parent: true });
+ old_dir = lookup.node;
+ lookup = FS.lookupPath(new_path, { parent: true });
+ new_dir = lookup.node;
+
+ if (!old_dir || !new_dir) throw new FS.ErrnoError(44);
+ // need to be part of the same mount
+ if (old_dir.mount !== new_dir.mount) {
+ throw new FS.ErrnoError(75);
+ }
+ // source must exist
+ var old_node = FS.lookupNode(old_dir, old_name);
+ // old path should not be an ancestor of the new path
+ var relative = PATH_FS.relative(old_path, new_dirname);
+ if (relative.charAt(0) !== ".") {
+ throw new FS.ErrnoError(28);
+ }
+ // new path should not be an ancestor of the old path
+ relative = PATH_FS.relative(new_path, old_dirname);
+ if (relative.charAt(0) !== ".") {
+ throw new FS.ErrnoError(55);
+ }
+ // see if the new path already exists
+ var new_node;
+ try {
+ new_node = FS.lookupNode(new_dir, new_name);
+ } catch (e) {
+ // not fatal
+ }
+ // early out if nothing needs to change
+ if (old_node === new_node) {
+ return;
+ }
+ // we'll need to delete the old entry
+ var isdir = FS.isDir(old_node.mode);
+ var errCode = FS.mayDelete(old_dir, old_name, isdir);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ // need delete permissions if we'll be overwriting.
+ // need create permissions if new doesn't already exist.
+ errCode = new_node
+ ? FS.mayDelete(new_dir, new_name, isdir)
+ : FS.mayCreate(new_dir, new_name);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!old_dir.node_ops.rename) {
+ throw new FS.ErrnoError(63);
+ }
+ if (
+ FS.isMountpoint(old_node) ||
+ (new_node && FS.isMountpoint(new_node))
+ ) {
+ throw new FS.ErrnoError(10);
+ }
+ // if we are going to change the parent, check write permissions
+ if (new_dir !== old_dir) {
+ errCode = FS.nodePermissions(old_dir, "w");
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ }
+ // remove the node from the lookup hash
+ FS.hashRemoveNode(old_node);
+ // do the underlying fs rename
+ try {
+ old_dir.node_ops.rename(old_node, new_dir, new_name);
+ // update old node (we do this here to avoid each backend
+ // needing to)
+ old_node.parent = new_dir;
+ } catch (e) {
+ throw e;
+ } finally {
+ // add the node back to the hash (in case node_ops.rename
+ // changed its name)
+ FS.hashAddNode(old_node);
+ }
+ },
+ rmdir(path) {
+ var lookup = FS.lookupPath(path, { parent: true });
+ var parent = lookup.node;
+ var name = PATH.basename(path);
+ var node = FS.lookupNode(parent, name);
+ var errCode = FS.mayDelete(parent, name, true);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!parent.node_ops.rmdir) {
+ throw new FS.ErrnoError(63);
+ }
+ if (FS.isMountpoint(node)) {
+ throw new FS.ErrnoError(10);
+ }
+ parent.node_ops.rmdir(parent, name);
+ FS.destroyNode(node);
+ },
+ readdir(path) {
+ var lookup = FS.lookupPath(path, { follow: true });
+ var node = lookup.node;
+ if (!node.node_ops.readdir) {
+ throw new FS.ErrnoError(54);
+ }
+ return node.node_ops.readdir(node);
+ },
+ unlink(path) {
+ var lookup = FS.lookupPath(path, { parent: true });
+ var parent = lookup.node;
+ if (!parent) {
+ throw new FS.ErrnoError(44);
+ }
+ var name = PATH.basename(path);
+ var node = FS.lookupNode(parent, name);
+ var errCode = FS.mayDelete(parent, name, false);
+ if (errCode) {
+ // According to POSIX, we should map EISDIR to EPERM, but
+ // we instead do what Linux does (and we must, as we use
+ // the musl linux libc).
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!parent.node_ops.unlink) {
+ throw new FS.ErrnoError(63);
+ }
+ if (FS.isMountpoint(node)) {
+ throw new FS.ErrnoError(10);
+ }
+ parent.node_ops.unlink(parent, name);
+ FS.destroyNode(node);
+ },
+ readlink(path) {
+ var lookup = FS.lookupPath(path);
+ var link = lookup.node;
+ if (!link) {
+ throw new FS.ErrnoError(44);
+ }
+ if (!link.node_ops.readlink) {
+ throw new FS.ErrnoError(28);
+ }
+ return link.node_ops.readlink(link);
+ },
+ stat(path, dontFollow) {
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
+ var node = lookup.node;
+ if (!node) {
+ throw new FS.ErrnoError(44);
+ }
+ if (!node.node_ops.getattr) {
+ throw new FS.ErrnoError(63);
+ }
+ return node.node_ops.getattr(node);
+ },
+ lstat(path) {
+ return FS.stat(path, true);
+ },
+ chmod(path, mode, dontFollow) {
+ var node;
+ if (typeof path == "string") {
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
+ node = lookup.node;
+ } else {
+ node = path;
+ }
+ if (!node.node_ops.setattr) {
+ throw new FS.ErrnoError(63);
+ }
+ node.node_ops.setattr(node, {
+ mode: (mode & 4095) | (node.mode & ~4095),
+ ctime: Date.now(),
+ });
+ },
+ lchmod(path, mode) {
+ FS.chmod(path, mode, true);
+ },
+ fchmod(fd, mode) {
+ var stream = FS.getStreamChecked(fd);
+ FS.chmod(stream.node, mode);
+ },
+ chown(path, uid, gid, dontFollow) {
+ var node;
+ if (typeof path == "string") {
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
+ node = lookup.node;
+ } else {
+ node = path;
+ }
+ if (!node.node_ops.setattr) {
+ throw new FS.ErrnoError(63);
+ }
+ node.node_ops.setattr(node, {
+ timestamp: Date.now(),
+ // we ignore the uid / gid for now
+ });
+ },
+ lchown(path, uid, gid) {
+ FS.chown(path, uid, gid, true);
+ },
+ fchown(fd, uid, gid) {
+ var stream = FS.getStreamChecked(fd);
+ FS.chown(stream.node, uid, gid);
+ },
+ truncate(path, len) {
+ if (len < 0) {
+ throw new FS.ErrnoError(28);
+ }
+ var node;
+ if (typeof path == "string") {
+ var lookup = FS.lookupPath(path, { follow: true });
+ node = lookup.node;
+ } else {
+ node = path;
+ }
+ if (!node.node_ops.setattr) {
+ throw new FS.ErrnoError(63);
+ }
+ if (FS.isDir(node.mode)) {
+ throw new FS.ErrnoError(31);
+ }
+ if (!FS.isFile(node.mode)) {
+ throw new FS.ErrnoError(28);
+ }
+ var errCode = FS.nodePermissions(node, "w");
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ node.node_ops.setattr(node, {
+ size: len,
+ timestamp: Date.now(),
+ });
+ },
+ ftruncate(fd, len) {
+ var stream = FS.getStreamChecked(fd);
+ if ((stream.flags & 2097155) === 0) {
+ throw new FS.ErrnoError(28);
+ }
+ FS.truncate(stream.node, len);
+ },
+ utime(path, atime, mtime) {
+ var lookup = FS.lookupPath(path, { follow: true });
+ var node = lookup.node;
+ node.node_ops.setattr(node, {
+ atime: atime,
+ mtime: mtime,
+ });
+ },
+ open(path, flags, mode = 0o666) {
+ if (path === "") {
+ throw new FS.ErrnoError(44);
+ }
+ flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags;
+ if (flags & 64) {
+ mode = (mode & 4095) | 32768;
+ } else {
+ mode = 0;
+ }
+ var node;
+ if (typeof path == "object") {
+ node = path;
+ } else {
+ // noent_okay makes it so that if the final component of the path
+ // doesn't exist, lookupPath returns `node: undefined`. `path` will be
+ // updated to point to the target of all symlinks.
+ var lookup = FS.lookupPath(path, {
+ follow: !(flags & 131072),
+ noent_okay: true,
+ });
+ node = lookup.node;
+ path = lookup.path;
+ }
+ // perhaps we need to create the node
+ var created = false;
+ if (flags & 64) {
+ if (node) {
+ // if O_CREAT and O_EXCL are set, error out if the node already exists
+ if (flags & 128) {
+ throw new FS.ErrnoError(20);
+ }
+ } else {
+ // node doesn't exist, try to create it
+ node = FS.mknod(path, mode, 0);
+ created = true;
+ }
+ }
+ if (!node) {
+ throw new FS.ErrnoError(44);
+ }
+ // can't truncate a device
+ if (FS.isChrdev(node.mode)) {
+ flags &= ~512;
+ }
+ // if asked only for a directory, then this must be one
+ if (flags & 65536 && !FS.isDir(node.mode)) {
+ throw new FS.ErrnoError(54);
+ }
+ // check permissions, if this is not a file we just created now (it is ok to
+ // create and write to a file with read-only permissions; it is read-only
+ // for later use)
+ if (!created) {
+ var errCode = FS.mayOpen(node, flags);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ }
+ // do truncation if necessary
+ if (flags & 512 && !created) {
+ FS.truncate(node, 0);
+ }
+ // we've already handled these, don't pass down to the underlying vfs
+ flags &= ~(128 | 512 | 131072);
+
+ // register the stream with the filesystem
+ var stream = FS.createStream({
+ node,
+ path: FS.getPath(node), // we want the absolute path to the node
+ flags,
+ seekable: true,
+ position: 0,
+ stream_ops: node.stream_ops,
+ // used by the file family libc calls (fopen, fwrite, ferror, etc.)
+ ungotten: [],
+ error: false,
+ });
+ // call the new stream's open function
+ if (stream.stream_ops.open) {
+ stream.stream_ops.open(stream);
+ }
+ if (Module["logReadFiles"] && !(flags & 1)) {
+ if (!(path in FS.readFiles)) {
+ FS.readFiles[path] = 1;
+ }
+ }
+ return stream;
+ },
+ close(stream) {
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if (stream.getdents) stream.getdents = null; // free readdir state
+ try {
+ if (stream.stream_ops.close) {
+ stream.stream_ops.close(stream);
+ }
+ } catch (e) {
+ throw e;
+ } finally {
+ FS.closeStream(stream.fd);
+ }
+ stream.fd = null;
+ },
+ isClosed(stream) {
+ return stream.fd === null;
+ },
+ llseek(stream, offset, whence) {
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if (!stream.seekable || !stream.stream_ops.llseek) {
+ throw new FS.ErrnoError(70);
+ }
+ if (whence != 0 && whence != 1 && whence != 2) {
+ throw new FS.ErrnoError(28);
+ }
+ stream.position = stream.stream_ops.llseek(stream, offset, whence);
+ stream.ungotten = [];
+ return stream.position;
+ },
+ read(stream, buffer, offset, length, position) {
+ assert(offset >= 0);
+ if (length < 0 || position < 0) {
+ throw new FS.ErrnoError(28);
+ }
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if ((stream.flags & 2097155) === 1) {
+ throw new FS.ErrnoError(8);
+ }
+ if (FS.isDir(stream.node.mode)) {
+ throw new FS.ErrnoError(31);
+ }
+ if (!stream.stream_ops.read) {
+ throw new FS.ErrnoError(28);
+ }
+ var seeking = typeof position != "undefined";
+ if (!seeking) {
+ position = stream.position;
+ } else if (!stream.seekable) {
+ throw new FS.ErrnoError(70);
+ }
+ var bytesRead = stream.stream_ops.read(
+ stream,
+ buffer,
+ offset,
+ length,
+ position,
+ );
+ if (!seeking) stream.position += bytesRead;
+ return bytesRead;
+ },
+ write(stream, buffer, offset, length, position, canOwn) {
+ assert(offset >= 0);
+ if (length < 0 || position < 0) {
+ throw new FS.ErrnoError(28);
+ }
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if ((stream.flags & 2097155) === 0) {
+ throw new FS.ErrnoError(8);
+ }
+ if (FS.isDir(stream.node.mode)) {
+ throw new FS.ErrnoError(31);
+ }
+ if (!stream.stream_ops.write) {
+ throw new FS.ErrnoError(28);
+ }
+ if (stream.seekable && stream.flags & 1024) {
+ // seek to the end before writing in append mode
+ FS.llseek(stream, 0, 2);
+ }
+ var seeking = typeof position != "undefined";
+ if (!seeking) {
+ position = stream.position;
+ } else if (!stream.seekable) {
+ throw new FS.ErrnoError(70);
+ }
+ var bytesWritten = stream.stream_ops.write(
+ stream,
+ buffer,
+ offset,
+ length,
+ position,
+ canOwn,
+ );
+ if (!seeking) stream.position += bytesWritten;
+ return bytesWritten;
+ },
+ allocate(stream, offset, length) {
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if (offset < 0 || length <= 0) {
+ throw new FS.ErrnoError(28);
+ }
+ if ((stream.flags & 2097155) === 0) {
+ throw new FS.ErrnoError(8);
+ }
+ if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
+ throw new FS.ErrnoError(43);
+ }
+ if (!stream.stream_ops.allocate) {
+ throw new FS.ErrnoError(138);
+ }
+ stream.stream_ops.allocate(stream, offset, length);
+ },
+ mmap(stream, length, position, prot, flags) {
+ // User requests writing to file (prot & PROT_WRITE != 0).
+ // Checking if we have permissions to write to the file unless
+ // MAP_PRIVATE flag is set. According to POSIX spec it is possible
+ // to write to file opened in read-only mode with MAP_PRIVATE flag,
+ // as all modifications will be visible only in the memory of
+ // the current process.
+ if (
+ (prot & 2) !== 0 &&
+ (flags & 2) === 0 &&
+ (stream.flags & 2097155) !== 2
+ ) {
+ throw new FS.ErrnoError(2);
+ }
+ if ((stream.flags & 2097155) === 1) {
+ throw new FS.ErrnoError(2);
+ }
+ if (!stream.stream_ops.mmap) {
+ throw new FS.ErrnoError(43);
+ }
+ if (!length) {
+ throw new FS.ErrnoError(28);
+ }
+ return stream.stream_ops.mmap(stream, length, position, prot, flags);
+ },
+ msync(stream, buffer, offset, length, mmapFlags) {
+ assert(offset >= 0);
+ if (!stream.stream_ops.msync) {
+ return 0;
+ }
+ return stream.stream_ops.msync(
+ stream,
+ buffer,
+ offset,
+ length,
+ mmapFlags,
+ );
+ },
+ ioctl(stream, cmd, arg) {
+ if (!stream.stream_ops.ioctl) {
+ throw new FS.ErrnoError(59);
+ }
+ return stream.stream_ops.ioctl(stream, cmd, arg);
+ },
+ readFile(path, opts = {}) {
+ opts.flags = opts.flags || 0;
+ opts.encoding = opts.encoding || "binary";
+ if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
+ throw new Error(`Invalid encoding type "${opts.encoding}"`);
+ }
+ var ret;
+ var stream = FS.open(path, opts.flags);
+ var stat = FS.stat(path);
+ var length = stat.size;
+ var buf = new Uint8Array(length);
+ FS.read(stream, buf, 0, length, 0);
+ if (opts.encoding === "utf8") {
+ ret = UTF8ArrayToString(buf);
+ } else if (opts.encoding === "binary") {
+ ret = buf;
+ }
+ FS.close(stream);
+ return ret;
+ },
+ writeFile(path, data, opts = {}) {
+ opts.flags = opts.flags || 577;
+ var stream = FS.open(path, opts.flags, opts.mode);
+ if (typeof data == "string") {
+ var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
+ var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
+ FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn);
+ } else if (ArrayBuffer.isView(data)) {
+ FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn);
+ } else {
+ throw new Error("Unsupported data type");
+ }
+ FS.close(stream);
+ },
+ cwd: () => FS.currentPath,
+ chdir(path) {
+ var lookup = FS.lookupPath(path, { follow: true });
+ if (lookup.node === null) {
+ throw new FS.ErrnoError(44);
+ }
+ if (!FS.isDir(lookup.node.mode)) {
+ throw new FS.ErrnoError(54);
+ }
+ var errCode = FS.nodePermissions(lookup.node, "x");
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ FS.currentPath = lookup.path;
+ },
+ createDefaultDirectories() {
+ FS.mkdir("/tmp");
+ FS.mkdir("/home");
+ FS.mkdir("/home/web_user");
+ },
+ createDefaultDevices() {
+ // create /dev
+ FS.mkdir("/dev");
+ // setup /dev/null
+ FS.registerDevice(FS.makedev(1, 3), {
+ read: () => 0,
+ write: (stream, buffer, offset, length, pos) => length,
+ llseek: () => 0,
+ });
+ FS.mkdev("/dev/null", FS.makedev(1, 3));
+ // setup /dev/tty and /dev/tty1
+ // stderr needs to print output using err() rather than out()
+ // so we register a second tty just for it.
+ TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
+ TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
+ FS.mkdev("/dev/tty", FS.makedev(5, 0));
+ FS.mkdev("/dev/tty1", FS.makedev(6, 0));
+ // setup /dev/[u]random
+ // use a buffer to avoid overhead of individual crypto calls per byte
+ var randomBuffer = new Uint8Array(1024),
+ randomLeft = 0;
+ var randomByte = () => {
+ if (randomLeft === 0) {
+ randomLeft = randomFill(randomBuffer).byteLength;
+ }
+ return randomBuffer[--randomLeft];
+ };
+ FS.createDevice("/dev", "random", randomByte);
+ FS.createDevice("/dev", "urandom", randomByte);
+ // we're not going to emulate the actual shm device,
+ // just create the tmp dirs that reside in it commonly
+ FS.mkdir("/dev/shm");
+ FS.mkdir("/dev/shm/tmp");
+ },
+ createSpecialDirectories() {
+ // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the
+ // name of the stream for fd 6 (see test_unistd_ttyname)
+ FS.mkdir("/proc");
+ var proc_self = FS.mkdir("/proc/self");
+ FS.mkdir("/proc/self/fd");
+ FS.mount(
+ {
+ mount() {
+ var node = FS.createNode(proc_self, "fd", 16895, 73);
+ node.stream_ops = {
+ llseek: MEMFS.stream_ops.llseek,
+ };
+ node.node_ops = {
+ lookup(parent, name) {
+ var fd = +name;
+ var stream = FS.getStreamChecked(fd);
+ var ret = {
+ parent: null,
+ mount: { mountpoint: "fake" },
+ node_ops: { readlink: () => stream.path },
+ id: fd + 1,
+ };
+ ret.parent = ret; // make it look like a simple root node
+ return ret;
+ },
+ readdir() {
+ return Array.from(FS.streams.entries())
+ .filter(([k, v]) => v)
+ .map(([k, v]) => k.toString());
+ },
+ };
+ return node;
+ },
+ },
+ {},
+ "/proc/self/fd",
+ );
+ },
+ createStandardStreams(input, output, error) {
+ // TODO deprecate the old functionality of a single
+ // input / output callback and that utilizes FS.createDevice
+ // and instead require a unique set of stream ops
+
+ // by default, we symlink the standard streams to the
+ // default tty devices. however, if the standard streams
+ // have been overwritten we create a unique device for
+ // them instead.
+ if (input) {
+ FS.createDevice("/dev", "stdin", input);
+ } else {
+ FS.symlink("/dev/tty", "/dev/stdin");
+ }
+ if (output) {
+ FS.createDevice("/dev", "stdout", null, output);
+ } else {
+ FS.symlink("/dev/tty", "/dev/stdout");
+ }
+ if (error) {
+ FS.createDevice("/dev", "stderr", null, error);
+ } else {
+ FS.symlink("/dev/tty1", "/dev/stderr");
+ }
+
+ // open default streams for the stdin, stdout and stderr devices
+ var stdin = FS.open("/dev/stdin", 0);
+ var stdout = FS.open("/dev/stdout", 1);
+ var stderr = FS.open("/dev/stderr", 1);
+ assert(stdin.fd === 0, `invalid handle for stdin (${stdin.fd})`);
+ assert(stdout.fd === 1, `invalid handle for stdout (${stdout.fd})`);
+ assert(stderr.fd === 2, `invalid handle for stderr (${stderr.fd})`);
+ },
+ staticInit() {
+ FS.nameTable = new Array(4096);
+
+ FS.mount(MEMFS, {}, "/");
+
+ FS.createDefaultDirectories();
+ FS.createDefaultDevices();
+ FS.createSpecialDirectories();
+
+ FS.filesystems = {
+ MEMFS: MEMFS,
+ };
+ },
+ init(input, output, error) {
+ assert(
+ !FS.initialized,
+ "FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)",
+ );
+ FS.initialized = true;
+
+ // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
+ input ??= Module["stdin"];
+ output ??= Module["stdout"];
+ error ??= Module["stderr"];
+
+ FS.createStandardStreams(input, output, error);
+ },
+ quit() {
+ FS.initialized = false;
+ // force-flush all streams, so we get musl std streams printed out
+ _fflush(0);
+ // close all of our streams
+ for (var i = 0; i < FS.streams.length; i++) {
+ var stream = FS.streams[i];
+ if (!stream) {
+ continue;
+ }
+ FS.close(stream);
+ }
+ },
+ findObject(path, dontResolveLastLink) {
+ var ret = FS.analyzePath(path, dontResolveLastLink);
+ if (!ret.exists) {
+ return null;
+ }
+ return ret.object;
+ },
+ analyzePath(path, dontResolveLastLink) {
+ // operate from within the context of the symlink's target
+ try {
+ var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
+ path = lookup.path;
+ } catch (e) {}
+ var ret = {
+ isRoot: false,
+ exists: false,
+ error: 0,
+ name: null,
+ path: null,
+ object: null,
+ parentExists: false,
+ parentPath: null,
+ parentObject: null,
+ };
+ try {
+ var lookup = FS.lookupPath(path, { parent: true });
+ ret.parentExists = true;
+ ret.parentPath = lookup.path;
+ ret.parentObject = lookup.node;
+ ret.name = PATH.basename(path);
+ lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
+ ret.exists = true;
+ ret.path = lookup.path;
+ ret.object = lookup.node;
+ ret.name = lookup.node.name;
+ ret.isRoot = lookup.path === "/";
+ } catch (e) {
+ ret.error = e.errno;
+ }
+ return ret;
+ },
+ createPath(parent, path, canRead, canWrite) {
+ parent = typeof parent == "string" ? parent : FS.getPath(parent);
+ var parts = path.split("/").reverse();
+ while (parts.length) {
+ var part = parts.pop();
+ if (!part) continue;
+ var current = PATH.join2(parent, part);
+ try {
+ FS.mkdir(current);
+ } catch (e) {
+ // ignore EEXIST
+ }
+ parent = current;
+ }
+ return current;
+ },
+ createFile(parent, name, properties, canRead, canWrite) {
+ var path = PATH.join2(
+ typeof parent == "string" ? parent : FS.getPath(parent),
+ name,
+ );
+ var mode = FS_getMode(canRead, canWrite);
+ return FS.create(path, mode);
+ },
+ createDataFile(parent, name, data, canRead, canWrite, canOwn) {
+ var path = name;
+ if (parent) {
+ parent = typeof parent == "string" ? parent : FS.getPath(parent);
+ path = name ? PATH.join2(parent, name) : parent;
+ }
+ var mode = FS_getMode(canRead, canWrite);
+ var node = FS.create(path, mode);
+ if (data) {
+ if (typeof data == "string") {
+ var arr = new Array(data.length);
+ for (var i = 0, len = data.length; i < len; ++i)
+ arr[i] = data.charCodeAt(i);
+ data = arr;
+ }
+ // make sure we can write to the file
+ FS.chmod(node, mode | 146);
+ var stream = FS.open(node, 577);
+ FS.write(stream, data, 0, data.length, 0, canOwn);
+ FS.close(stream);
+ FS.chmod(node, mode);
+ }
+ },
+ createDevice(parent, name, input, output) {
+ var path = PATH.join2(
+ typeof parent == "string" ? parent : FS.getPath(parent),
+ name,
+ );
+ var mode = FS_getMode(!!input, !!output);
+ FS.createDevice.major ??= 64;
+ var dev = FS.makedev(FS.createDevice.major++, 0);
+ // Create a fake device that a set of stream ops to emulate
+ // the old behavior.
+ FS.registerDevice(dev, {
+ open(stream) {
+ stream.seekable = false;
+ },
+ close(stream) {
+ // flush any pending line data
+ if (output?.buffer?.length) {
+ output(10);
+ }
+ },
+ read(stream, buffer, offset, length, pos /* ignored */) {
+ var bytesRead = 0;
+ for (var i = 0; i < length; i++) {
+ var result;
+ try {
+ result = input();
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ if (result === undefined && bytesRead === 0) {
+ throw new FS.ErrnoError(6);
+ }
+ if (result === null || result === undefined) break;
+ bytesRead++;
+ buffer[offset + i] = result;
+ }
+ if (bytesRead) {
+ stream.node.atime = Date.now();
+ }
+ return bytesRead;
+ },
+ write(stream, buffer, offset, length, pos) {
+ for (var i = 0; i < length; i++) {
+ try {
+ output(buffer[offset + i]);
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ }
+ if (length) {
+ stream.node.mtime = stream.node.ctime = Date.now();
+ }
+ return i;
+ },
+ });
+ return FS.mkdev(path, mode, dev);
+ },
+ forceLoadFile(obj) {
+ if (obj.isDevice || obj.isFolder || obj.link || obj.contents)
+ return true;
+ if (typeof XMLHttpRequest != "undefined") {
+ throw new Error(
+ "Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.",
+ );
+ } else {
+ // Command-line.
+ try {
+ obj.contents = readBinary(obj.url);
+ obj.usedBytes = obj.contents.length;
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ }
+ },
+ createLazyFile(parent, name, url, canRead, canWrite) {
+ // Lazy chunked Uint8Array (implements get and length from Uint8Array).
+ // Actual getting is abstracted away for eventual reuse.
+ class LazyUint8Array {
+ lengthKnown = false;
+ chunks = []; // Loaded chunks. Index is the chunk number
+ get(idx) {
+ if (idx > this.length - 1 || idx < 0) {
+ return undefined;
+ }
+ var chunkOffset = idx % this.chunkSize;
+ var chunkNum = (idx / this.chunkSize) | 0;
+ return this.getter(chunkNum)[chunkOffset];
+ }
+ setDataGetter(getter) {
+ this.getter = getter;
+ }
+ cacheLength() {
+ // Find length
+ var xhr = new XMLHttpRequest();
+ xhr.open("HEAD", url, false);
+ xhr.send(null);
+ if (
+ !((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
+ )
+ throw new Error(
+ "Couldn't load " + url + ". Status: " + xhr.status,
+ );
+ var datalength = Number(xhr.getResponseHeader("Content-length"));
+ var header;
+ var hasByteServing =
+ (header = xhr.getResponseHeader("Accept-Ranges")) &&
+ header === "bytes";
+ var usesGzip =
+ (header = xhr.getResponseHeader("Content-Encoding")) &&
+ header === "gzip";
+
+ var chunkSize = 1024 * 1024; // Chunk size in bytes
+
+ if (!hasByteServing) chunkSize = datalength;
+
+ // Function to get a range from the remote URL.
+ var doXHR = (from, to) => {
+ if (from > to)
+ throw new Error(
+ "invalid range (" +
+ from +
+ ", " +
+ to +
+ ") or no bytes requested!",
+ );
+ if (to > datalength - 1)
+ throw new Error(
+ "only " + datalength + " bytes available! programmer error!",
+ );
+
+ // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, false);
+ if (datalength !== chunkSize)
+ xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
+
+ // Some hints to the browser that we want binary data.
+ xhr.responseType = "arraybuffer";
+ if (xhr.overrideMimeType) {
+ xhr.overrideMimeType("text/plain; charset=x-user-defined");
+ }
+
+ xhr.send(null);
+ if (
+ !((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
+ )
+ throw new Error(
+ "Couldn't load " + url + ". Status: " + xhr.status,
+ );
+ if (xhr.response !== undefined) {
+ return new Uint8Array(
+ /** @type{Array<number>} */ (xhr.response || []),
+ );
+ }
+ return intArrayFromString(xhr.responseText || "", true);
+ };
+ var lazyArray = this;
+ lazyArray.setDataGetter((chunkNum) => {
+ var start = chunkNum * chunkSize;
+ var end = (chunkNum + 1) * chunkSize - 1; // including this byte
+ end = Math.min(end, datalength - 1); // if datalength-1 is selected, this is the last block
+ if (typeof lazyArray.chunks[chunkNum] == "undefined") {
+ lazyArray.chunks[chunkNum] = doXHR(start, end);
+ }
+ if (typeof lazyArray.chunks[chunkNum] == "undefined")
+ throw new Error("doXHR failed!");
+ return lazyArray.chunks[chunkNum];
+ });
+
+ if (usesGzip || !datalength) {
+ // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length
+ chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file
+ datalength = this.getter(0).length;
+ chunkSize = datalength;
+ out(
+ "LazyFiles on gzip forces download of the whole file when length is accessed",
+ );
+ }
+
+ this._length = datalength;
+ this._chunkSize = chunkSize;
+ this.lengthKnown = true;
+ }
+ get length() {
+ if (!this.lengthKnown) {
+ this.cacheLength();
+ }
+ return this._length;
+ }
+ get chunkSize() {
+ if (!this.lengthKnown) {
+ this.cacheLength();
+ }
+ return this._chunkSize;
+ }
+ }
+
+ if (typeof XMLHttpRequest != "undefined") {
+ if (!ENVIRONMENT_IS_WORKER)
+ throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
+ var lazyArray = new LazyUint8Array();
+ var properties = { isDevice: false, contents: lazyArray };
+ } else {
+ var properties = { isDevice: false, url: url };
+ }
+
+ var node = FS.createFile(parent, name, properties, canRead, canWrite);
+ // This is a total hack, but I want to get this lazy file code out of the
+ // core of MEMFS. If we want to keep this lazy file concept I feel it should
+ // be its own thin LAZYFS proxying calls to MEMFS.
+ if (properties.contents) {
+ node.contents = properties.contents;
+ } else if (properties.url) {
+ node.contents = null;
+ node.url = properties.url;
+ }
+ // Add a function that defers querying the file size until it is asked the first time.
+ Object.defineProperties(node, {
+ usedBytes: {
+ get: function () {
+ return this.contents.length;
+ },
+ },
+ });
+ // override each stream op with one that tries to force load the lazy file first
+ var stream_ops = {};
+ var keys = Object.keys(node.stream_ops);
+ keys.forEach((key) => {
+ var fn = node.stream_ops[key];
+ stream_ops[key] = (...args) => {
+ FS.forceLoadFile(node);
+ return fn(...args);
+ };
+ });
+ function writeChunks(stream, buffer, offset, length, position) {
+ var contents = stream.node.contents;
+ if (position >= contents.length) return 0;
+ var size = Math.min(contents.length - position, length);
+ assert(size >= 0);
+ if (contents.slice) {
+ // normal array
+ for (var i = 0; i < size; i++) {
+ buffer[offset + i] = contents[position + i];
+ }
+ } else {
+ for (var i = 0; i < size; i++) {
+ // LazyUint8Array from sync binary XHR
+ buffer[offset + i] = contents.get(position + i);
+ }
+ }
+ return size;
+ }
+ // use a custom read function
+ stream_ops.read = (stream, buffer, offset, length, position) => {
+ FS.forceLoadFile(node);
+ return writeChunks(stream, buffer, offset, length, position);
+ };
+ // use a custom mmap function
+ stream_ops.mmap = (stream, length, position, prot, flags) => {
+ FS.forceLoadFile(node);
+ var ptr = mmapAlloc(length);
+ if (!ptr) {
+ throw new FS.ErrnoError(48);
+ }
+ writeChunks(stream, HEAP8, ptr, length, position);
+ return { ptr, allocated: true };
+ };
+ node.stream_ops = stream_ops;
+ return node;
+ },
+ absolutePath() {
+ abort("FS.absolutePath has been removed; use PATH_FS.resolve instead");
+ },
+ createFolder() {
+ abort("FS.createFolder has been removed; use FS.mkdir instead");
+ },
+ createLink() {
+ abort("FS.createLink has been removed; use FS.symlink instead");
+ },
+ joinPath() {
+ abort("FS.joinPath has been removed; use PATH.join instead");
+ },
+ mmapAlloc() {
+ abort(
+ "FS.mmapAlloc has been replaced by the top level function mmapAlloc",
+ );
+ },
+ standardizePath() {
+ abort(
+ "FS.standardizePath has been removed; use PATH.normalize instead",
+ );
+ },
+ };
+
+ var SYSCALLS = {
+ DEFAULT_POLLMASK: 5,
+ calculateAt(dirfd, path, allowEmpty) {
+ if (PATH.isAbs(path)) {
+ return path;
+ }
+ // relative path
+ var dir;
+ if (dirfd === -100) {
+ dir = FS.cwd();
+ } else {
+ var dirstream = SYSCALLS.getStreamFromFD(dirfd);
+ dir = dirstream.path;
+ }
+ if (path.length == 0) {
+ if (!allowEmpty) {
+ throw new FS.ErrnoError(44);
+ }
+ return dir;
+ }
+ return dir + "/" + path;
+ },
+ doStat(func, path, buf) {
+ var stat = func(path);
+ HEAP32[buf >> 2] = stat.dev;
+ HEAP32[(buf + 4) >> 2] = stat.mode;
+ HEAPU32[(buf + 8) >> 2] = stat.nlink;
+ HEAP32[(buf + 12) >> 2] = stat.uid;
+ HEAP32[(buf + 16) >> 2] = stat.gid;
+ HEAP32[(buf + 20) >> 2] = stat.rdev;
+ (tempI64 = [
+ stat.size >>> 0,
+ ((tempDouble = stat.size),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 24) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 28) >> 2] = tempI64[1]);
+ HEAP32[(buf + 32) >> 2] = 4096;
+ HEAP32[(buf + 36) >> 2] = stat.blocks;
+ var atime = stat.atime.getTime();
+ var mtime = stat.mtime.getTime();
+ var ctime = stat.ctime.getTime();
+ (tempI64 = [
+ Math.floor(atime / 1000) >>> 0,
+ ((tempDouble = Math.floor(atime / 1000)),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 40) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 44) >> 2] = tempI64[1]);
+ HEAPU32[(buf + 48) >> 2] = (atime % 1000) * 1000 * 1000;
+ (tempI64 = [
+ Math.floor(mtime / 1000) >>> 0,
+ ((tempDouble = Math.floor(mtime / 1000)),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 56) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 60) >> 2] = tempI64[1]);
+ HEAPU32[(buf + 64) >> 2] = (mtime % 1000) * 1000 * 1000;
+ (tempI64 = [
+ Math.floor(ctime / 1000) >>> 0,
+ ((tempDouble = Math.floor(ctime / 1000)),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 72) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 76) >> 2] = tempI64[1]);
+ HEAPU32[(buf + 80) >> 2] = (ctime % 1000) * 1000 * 1000;
+ (tempI64 = [
+ stat.ino >>> 0,
+ ((tempDouble = stat.ino),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 88) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 92) >> 2] = tempI64[1]);
+ return 0;
+ },
+ doMsync(addr, stream, len, flags, offset) {
+ if (!FS.isFile(stream.node.mode)) {
+ throw new FS.ErrnoError(43);
+ }
+ if (flags & 2) {
+ // MAP_PRIVATE calls need not to be synced back to underlying fs
+ return 0;
+ }
+ var buffer = HEAPU8.slice(addr, addr + len);
+ FS.msync(stream, buffer, offset, len, flags);
+ },
+ getStreamFromFD(fd) {
+ var stream = FS.getStreamChecked(fd);
+ return stream;
+ },
+ varargs: undefined,
+ getStr(ptr) {
+ var ret = UTF8ToString(ptr);
+ return ret;
+ },
+ };
+ var ___syscall__newselect = function (
+ nfds,
+ readfds,
+ writefds,
+ exceptfds,
+ timeout,
+ ) {
+ try {
+ // readfds are supported,
+ // writefds checks socket open status
+ // exceptfds are supported, although on web, such exceptional conditions never arise in web sockets
+ // and so the exceptfds list will always return empty.
+ // timeout is supported, although on SOCKFS and PIPEFS these are ignored and always treated as 0 - fully async
+ assert(nfds <= 64, "nfds must be less than or equal to 64"); // fd sets have 64 bits // TODO: this could be 1024 based on current musl headers
+
+ var total = 0;
+
+ var srcReadLow = readfds ? HEAP32[readfds >> 2] : 0,
+ srcReadHigh = readfds ? HEAP32[(readfds + 4) >> 2] : 0;
+ var srcWriteLow = writefds ? HEAP32[writefds >> 2] : 0,
+ srcWriteHigh = writefds ? HEAP32[(writefds + 4) >> 2] : 0;
+ var srcExceptLow = exceptfds ? HEAP32[exceptfds >> 2] : 0,
+ srcExceptHigh = exceptfds ? HEAP32[(exceptfds + 4) >> 2] : 0;
+
+ var dstReadLow = 0,
+ dstReadHigh = 0;
+ var dstWriteLow = 0,
+ dstWriteHigh = 0;
+ var dstExceptLow = 0,
+ dstExceptHigh = 0;
+
+ var allLow =
+ (readfds ? HEAP32[readfds >> 2] : 0) |
+ (writefds ? HEAP32[writefds >> 2] : 0) |
+ (exceptfds ? HEAP32[exceptfds >> 2] : 0);
+ var allHigh =
+ (readfds ? HEAP32[(readfds + 4) >> 2] : 0) |
+ (writefds ? HEAP32[(writefds + 4) >> 2] : 0) |
+ (exceptfds ? HEAP32[(exceptfds + 4) >> 2] : 0);
+
+ var check = (fd, low, high, val) => (fd < 32 ? low & val : high & val);
+
+ for (var fd = 0; fd < nfds; fd++) {
+ var mask = 1 << (fd % 32);
+ if (!check(fd, allLow, allHigh, mask)) {
+ continue; // index isn't in the set
+ }
+
+ var stream = SYSCALLS.getStreamFromFD(fd);
+
+ var flags = SYSCALLS.DEFAULT_POLLMASK;
+
+ if (stream.stream_ops.poll) {
+ var timeoutInMillis = -1;
+ if (timeout) {
+ // select(2) is declared to accept "struct timeval { time_t tv_sec; suseconds_t tv_usec; }".
+ // However, musl passes the two values to the syscall as an array of long values.
+ // Note that sizeof(time_t) != sizeof(long) in wasm32. The former is 8, while the latter is 4.
+ // This means using "C_STRUCTS.timeval.tv_usec" leads to a wrong offset.
+ // So, instead, we use POINTER_SIZE.
+ var tv_sec = readfds ? HEAP32[timeout >> 2] : 0,
+ tv_usec = readfds ? HEAP32[(timeout + 4) >> 2] : 0;
+ timeoutInMillis = (tv_sec + tv_usec / 1000000) * 1000;
+ }
+ flags = stream.stream_ops.poll(stream, timeoutInMillis);
+ }
+
+ if (flags & 1 && check(fd, srcReadLow, srcReadHigh, mask)) {
+ fd < 32
+ ? (dstReadLow = dstReadLow | mask)
+ : (dstReadHigh = dstReadHigh | mask);
+ total++;
+ }
+ if (flags & 4 && check(fd, srcWriteLow, srcWriteHigh, mask)) {
+ fd < 32
+ ? (dstWriteLow = dstWriteLow | mask)
+ : (dstWriteHigh = dstWriteHigh | mask);
+ total++;
+ }
+ if (flags & 2 && check(fd, srcExceptLow, srcExceptHigh, mask)) {
+ fd < 32
+ ? (dstExceptLow = dstExceptLow | mask)
+ : (dstExceptHigh = dstExceptHigh | mask);
+ total++;
+ }
+ }
+
+ if (readfds) {
+ HEAP32[readfds >> 2] = dstReadLow;
+ HEAP32[(readfds + 4) >> 2] = dstReadHigh;
+ }
+ if (writefds) {
+ HEAP32[writefds >> 2] = dstWriteLow;
+ HEAP32[(writefds + 4) >> 2] = dstWriteHigh;
+ }
+ if (exceptfds) {
+ HEAP32[exceptfds >> 2] = dstExceptLow;
+ HEAP32[(exceptfds + 4) >> 2] = dstExceptHigh;
+ }
+
+ return total;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ };
+
+ var SOCKFS = {
+ websocketArgs: {},
+ callbacks: {},
+ on(event, callback) {
+ SOCKFS.callbacks[event] = callback;
+ },
+ emit(event, param) {
+ SOCKFS.callbacks[event]?.(param);
+ },
+ mount(mount) {
+ // The incomming Module['websocket'] can be used for configuring
+ // configuring subprotocol/url, etc
+ SOCKFS.websocketArgs = Module["websocket"] || {};
+ // Add the Event registration mechanism to the exported websocket configuration
+ // object so we can register network callbacks from native JavaScript too.
+ // For more documentation see system/include/emscripten/emscripten.h
+ (Module["websocket"] ??= {})["on"] = SOCKFS.on;
+
+ return FS.createNode(null, "/", 16895, 0);
+ },
+ createSocket(family, type, protocol) {
+ type &= ~526336; // Some applications may pass it; it makes no sense for a single process.
+ var streaming = type == 1;
+ if (streaming && protocol && protocol != 6) {
+ throw new FS.ErrnoError(66); // if SOCK_STREAM, must be tcp or 0.
+ }
+
+ // create our internal socket structure
+ var sock = {
+ family,
+ type,
+ protocol,
+ server: null,
+ error: null, // Used in getsockopt for SOL_SOCKET/SO_ERROR test
+ peers: {},
+ pending: [],
+ recv_queue: [],
+ sock_ops: SOCKFS.websocket_sock_ops,
+ };
+
+ // create the filesystem node to store the socket structure
+ var name = SOCKFS.nextname();
+ var node = FS.createNode(SOCKFS.root, name, 49152, 0);
+ node.sock = sock;
+
+ // and the wrapping stream that enables library functions such
+ // as read and write to indirectly interact with the socket
+ var stream = FS.createStream({
+ path: name,
+ node,
+ flags: 2,
+ seekable: false,
+ stream_ops: SOCKFS.stream_ops,
+ });
+
+ // map the new stream to the socket structure (sockets have a 1:1
+ // relationship with a stream)
+ sock.stream = stream;
+
+ return sock;
+ },
+ getSocket(fd) {
+ var stream = FS.getStream(fd);
+ if (!stream || !FS.isSocket(stream.node.mode)) {
+ return null;
+ }
+ return stream.node.sock;
+ },
+ stream_ops: {
+ poll(stream) {
+ var sock = stream.node.sock;
+ return sock.sock_ops.poll(sock);
+ },
+ ioctl(stream, request, varargs) {
+ var sock = stream.node.sock;
+ return sock.sock_ops.ioctl(sock, request, varargs);
+ },
+ read(stream, buffer, offset, length, position /* ignored */) {
+ var sock = stream.node.sock;
+ var msg = sock.sock_ops.recvmsg(sock, length);
+ if (!msg) {
+ // socket is closed
+ return 0;
+ }
+ buffer.set(msg.buffer, offset);
+ return msg.buffer.length;
+ },
+ write(stream, buffer, offset, length, position /* ignored */) {
+ var sock = stream.node.sock;
+ return sock.sock_ops.sendmsg(sock, buffer, offset, length);
+ },
+ close(stream) {
+ var sock = stream.node.sock;
+ sock.sock_ops.close(sock);
+ },
+ },
+ nextname() {
+ if (!SOCKFS.nextname.current) {
+ SOCKFS.nextname.current = 0;
+ }
+ return `socket[${SOCKFS.nextname.current++}]`;
+ },
+ websocket_sock_ops: {
+ createPeer(sock, addr, port) {
+ var ws;
+
+ if (typeof addr == "object") {
+ ws = addr;
+ addr = null;
+ port = null;
+ }
+
+ if (ws) {
+ // for sockets that've already connected (e.g. we're the server)
+ // we can inspect the _socket property for the address
+ if (ws._socket) {
+ addr = ws._socket.remoteAddress;
+ port = ws._socket.remotePort;
+ }
+ // if we're just now initializing a connection to the remote,
+ // inspect the url property
+ else {
+ var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);
+ if (!result) {
+ throw new Error(
+ "WebSocket URL must be in the format ws(s)://address:port",
+ );
+ }
+ addr = result[1];
+ port = parseInt(result[2], 10);
+ }
+ } else {
+ // create the actual websocket object and connect
+ try {
+ // The default value is 'ws://' the replace is needed because the compiler replaces '//' comments with '#'
+ // comments without checking context, so we'd end up with ws:#, the replace swaps the '#' for '//' again.
+ var url = "ws:#".replace("#", "//");
+ // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set.
+ var subProtocols = "binary"; // The default value is 'binary'
+ // The default WebSocket options
+ var opts = undefined;
+
+ // Fetch runtime WebSocket URL config.
+ if (SOCKFS.websocketArgs["url"]) {
+ url = SOCKFS.websocketArgs["url"];
+ }
+ // Fetch runtime WebSocket subprotocol config.
+ if (SOCKFS.websocketArgs["subprotocol"]) {
+ subProtocols = SOCKFS.websocketArgs["subprotocol"];
+ } else if (SOCKFS.websocketArgs["subprotocol"] === null) {
+ subProtocols = "null";
+ }
+
+ if (url === "ws://" || url === "wss://") {
+ // Is the supplied URL config just a prefix, if so complete it.
+ var parts = addr.split("/");
+ url =
+ url + parts[0] + ":" + port + "/" + parts.slice(1).join("/");
+ }
+
+ if (subProtocols !== "null") {
+ // The regex trims the string (removes spaces at the beginning and end, then splits the string by
+ // <any space>,<any space> into an Array. Whitespace removal is important for Websockify and ws.
+ subProtocols = subProtocols
+ .replace(/^ +| +$/g, "")
+ .split(/ *, */);
+
+ opts = subProtocols;
+ }
+
+ // If node we use the ws library.
+ var WebSocketConstructor;
+ {
+ WebSocketConstructor = WebSocket;
+ }
+ ws = new WebSocketConstructor(url, opts);
+ ws.binaryType = "arraybuffer";
+ } catch (e) {
+ throw new FS.ErrnoError(23);
+ }
+ }
+
+ var peer = {
+ addr,
+ port,
+ socket: ws,
+ msg_send_queue: [],
+ };
+
+ SOCKFS.websocket_sock_ops.addPeer(sock, peer);
+ SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);
+
+ // if this is a bound dgram socket, send the port number first to allow
+ // us to override the ephemeral port reported to us by remotePort on the
+ // remote end.
+ if (sock.type === 2 && typeof sock.sport != "undefined") {
+ peer.msg_send_queue.push(
+ new Uint8Array([
+ 255,
+ 255,
+ 255,
+ 255,
+ "p".charCodeAt(0),
+ "o".charCodeAt(0),
+ "r".charCodeAt(0),
+ "t".charCodeAt(0),
+ (sock.sport & 0xff00) >> 8,
+ sock.sport & 0xff,
+ ]),
+ );
+ }
+
+ return peer;
+ },
+ getPeer(sock, addr, port) {
+ return sock.peers[addr + ":" + port];
+ },
+ addPeer(sock, peer) {
+ sock.peers[peer.addr + ":" + peer.port] = peer;
+ },
+ removePeer(sock, peer) {
+ delete sock.peers[peer.addr + ":" + peer.port];
+ },
+ handlePeerEvents(sock, peer) {
+ var first = true;
+
+ var handleOpen = function () {
+ sock.connecting = false;
+ SOCKFS.emit("open", sock.stream.fd);
+
+ try {
+ var queued = peer.msg_send_queue.shift();
+ while (queued) {
+ peer.socket.send(queued);
+ queued = peer.msg_send_queue.shift();
+ }
+ } catch (e) {
+ // not much we can do here in the way of proper error handling as we've already
+ // lied and said this data was sent. shut it down.
+ peer.socket.close();
+ }
+ };
+
+ function handleMessage(data) {
+ if (typeof data == "string") {
+ var encoder = new TextEncoder(); // should be utf-8
+ data = encoder.encode(data); // make a typed array from the string
+ } else {
+ assert(data.byteLength !== undefined); // must receive an ArrayBuffer
+ if (data.byteLength == 0) {
+ // An empty ArrayBuffer will emit a pseudo disconnect event
+ // as recv/recvmsg will return zero which indicates that a socket
+ // has performed a shutdown although the connection has not been disconnected yet.
+ return;
+ }
+ data = new Uint8Array(data); // make a typed array view on the array buffer
+ }
+
+ // if this is the port message, override the peer's port with it
+ var wasfirst = first;
+ first = false;
+ if (
+ wasfirst &&
+ data.length === 10 &&
+ data[0] === 255 &&
+ data[1] === 255 &&
+ data[2] === 255 &&
+ data[3] === 255 &&
+ data[4] === "p".charCodeAt(0) &&
+ data[5] === "o".charCodeAt(0) &&
+ data[6] === "r".charCodeAt(0) &&
+ data[7] === "t".charCodeAt(0)
+ ) {
+ // update the peer's port and it's key in the peer map
+ var newport = (data[8] << 8) | data[9];
+ SOCKFS.websocket_sock_ops.removePeer(sock, peer);
+ peer.port = newport;
+ SOCKFS.websocket_sock_ops.addPeer(sock, peer);
+ return;
+ }
+
+ sock.recv_queue.push({
+ addr: peer.addr,
+ port: peer.port,
+ data: data,
+ });
+ SOCKFS.emit("message", sock.stream.fd);
+ }
+
+ if (ENVIRONMENT_IS_NODE) {
+ peer.socket.on("open", handleOpen);
+ peer.socket.on("message", function (data, isBinary) {
+ if (!isBinary) {
+ return;
+ }
+ handleMessage(new Uint8Array(data).buffer); // copy from node Buffer -> ArrayBuffer
+ });
+ peer.socket.on("close", function () {
+ SOCKFS.emit("close", sock.stream.fd);
+ });
+ peer.socket.on("error", function (error) {
+ // Although the ws library may pass errors that may be more descriptive than
+ // ECONNREFUSED they are not necessarily the expected error code e.g.
+ // ENOTFOUND on getaddrinfo seems to be node.js specific, so using ECONNREFUSED
+ // is still probably the most useful thing to do.
+ sock.error = 14; // Used in getsockopt for SOL_SOCKET/SO_ERROR test.
+ SOCKFS.emit("error", [
+ sock.stream.fd,
+ sock.error,
+ "ECONNREFUSED: Connection refused",
+ ]);
+ // don't throw
+ });
+ } else {
+ peer.socket.onopen = handleOpen;
+ peer.socket.onclose = function () {
+ SOCKFS.emit("close", sock.stream.fd);
+ };
+ peer.socket.onmessage = function peer_socket_onmessage(event) {
+ handleMessage(event.data);
+ };
+ peer.socket.onerror = function (error) {
+ // The WebSocket spec only allows a 'simple event' to be thrown on error,
+ // so we only really know as much as ECONNREFUSED.
+ sock.error = 14; // Used in getsockopt for SOL_SOCKET/SO_ERROR test.
+ SOCKFS.emit("error", [
+ sock.stream.fd,
+ sock.error,
+ "ECONNREFUSED: Connection refused",
+ ]);
+ };
+ }
+ },
+ poll(sock) {
+ if (sock.type === 1 && sock.server) {
+ // listen sockets should only say they're available for reading
+ // if there are pending clients.
+ return sock.pending.length ? 64 | 1 : 0;
+ }
+
+ var mask = 0;
+ var dest =
+ sock.type === 1
+ ? // we only care about the socket state for connection-based sockets
+ SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport)
+ : null;
+
+ if (
+ sock.recv_queue.length ||
+ !dest || // connection-less sockets are always ready to read
+ (dest && dest.socket.readyState === dest.socket.CLOSING) ||
+ (dest && dest.socket.readyState === dest.socket.CLOSED)
+ ) {
+ // let recv return 0 once closed
+ mask |= 64 | 1;
+ }
+
+ if (
+ !dest || // connection-less sockets are always ready to write
+ (dest && dest.socket.readyState === dest.socket.OPEN)
+ ) {
+ mask |= 4;
+ }
+
+ if (
+ (dest && dest.socket.readyState === dest.socket.CLOSING) ||
+ (dest && dest.socket.readyState === dest.socket.CLOSED)
+ ) {
+ // When an non-blocking connect fails mark the socket as writable.
+ // Its up to the calling code to then use getsockopt with SO_ERROR to
+ // retrieve the error.
+ // See https://man7.org/linux/man-pages/man2/connect.2.html
+ if (sock.connecting) {
+ mask |= 4;
+ } else {
+ mask |= 16;
+ }
+ }
+
+ return mask;
+ },
+ ioctl(sock, request, arg) {
+ switch (request) {
+ case 21531:
+ var bytes = 0;
+ if (sock.recv_queue.length) {
+ bytes = sock.recv_queue[0].data.length;
+ }
+ HEAP32[arg >> 2] = bytes;
+ return 0;
+ default:
+ return 28;
+ }
+ },
+ close(sock) {
+ // if we've spawned a listen server, close it
+ if (sock.server) {
+ try {
+ sock.server.close();
+ } catch (e) {}
+ sock.server = null;
+ }
+ // close any peer connections
+ var peers = Object.keys(sock.peers);
+ for (var i = 0; i < peers.length; i++) {
+ var peer = sock.peers[peers[i]];
+ try {
+ peer.socket.close();
+ } catch (e) {}
+ SOCKFS.websocket_sock_ops.removePeer(sock, peer);
+ }
+ return 0;
+ },
+ bind(sock, addr, port) {
+ if (
+ typeof sock.saddr != "undefined" ||
+ typeof sock.sport != "undefined"
+ ) {
+ throw new FS.ErrnoError(28); // already bound
+ }
+ sock.saddr = addr;
+ sock.sport = port;
+ // in order to emulate dgram sockets, we need to launch a listen server when
+ // binding on a connection-less socket
+ // note: this is only required on the server side
+ if (sock.type === 2) {
+ // close the existing server if it exists
+ if (sock.server) {
+ sock.server.close();
+ sock.server = null;
+ }
+ // swallow error operation not supported error that occurs when binding in the
+ // browser where this isn't supported
+ try {
+ sock.sock_ops.listen(sock, 0);
+ } catch (e) {
+ if (!(e.name === "ErrnoError")) throw e;
+ if (e.errno !== 138) throw e;
+ }
+ }
+ },
+ connect(sock, addr, port) {
+ if (sock.server) {
+ throw new FS.ErrnoError(138);
+ }
+
+ // TODO autobind
+ // if (!sock.addr && sock.type == 2) {
+ // }
+
+ // early out if we're already connected / in the middle of connecting
+ if (
+ typeof sock.daddr != "undefined" &&
+ typeof sock.dport != "undefined"
+ ) {
+ var dest = SOCKFS.websocket_sock_ops.getPeer(
+ sock,
+ sock.daddr,
+ sock.dport,
+ );
+ if (dest) {
+ if (dest.socket.readyState === dest.socket.CONNECTING) {
+ throw new FS.ErrnoError(7);
+ } else {
+ throw new FS.ErrnoError(30);
+ }
+ }
+ }
+
+ // add the socket to our peer list and set our
+ // destination address / port to match
+ var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
+ sock.daddr = peer.addr;
+ sock.dport = peer.port;
+
+ // because we cannot synchronously block to wait for the WebSocket
+ // connection to complete, we return here pretending that the connection
+ // was a success.
+ sock.connecting = true;
+ },
+ listen(sock, backlog) {
+ if (!ENVIRONMENT_IS_NODE) {
+ throw new FS.ErrnoError(138);
+ }
+ },
+ accept(listensock) {
+ if (!listensock.server || !listensock.pending.length) {
+ throw new FS.ErrnoError(28);
+ }
+ var newsock = listensock.pending.shift();
+ newsock.stream.flags = listensock.stream.flags;
+ return newsock;
+ },
+ getname(sock, peer) {
+ var addr, port;
+ if (peer) {
+ if (sock.daddr === undefined || sock.dport === undefined) {
+ throw new FS.ErrnoError(53);
+ }
+ addr = sock.daddr;
+ port = sock.dport;
+ } else {
+ // TODO saddr and sport will be set for bind()'d UDP sockets, but what
+ // should we be returning for TCP sockets that've been connect()'d?
+ addr = sock.saddr || 0;
+ port = sock.sport || 0;
+ }
+ return { addr, port };
+ },
+ sendmsg(sock, buffer, offset, length, addr, port) {
+ if (sock.type === 2) {
+ // connection-less sockets will honor the message address,
+ // and otherwise fall back to the bound destination address
+ if (addr === undefined || port === undefined) {
+ addr = sock.daddr;
+ port = sock.dport;
+ }
+ // if there was no address to fall back to, error out
+ if (addr === undefined || port === undefined) {
+ throw new FS.ErrnoError(17);
+ }
+ } else {
+ // connection-based sockets will only use the bound
+ addr = sock.daddr;
+ port = sock.dport;
+ }
+
+ // find the peer for the destination address
+ var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);
+
+ // early out if not connected with a connection-based socket
+ if (sock.type === 1) {
+ if (
+ !dest ||
+ dest.socket.readyState === dest.socket.CLOSING ||
+ dest.socket.readyState === dest.socket.CLOSED
+ ) {
+ throw new FS.ErrnoError(53);
+ }
+ }
+
+ // create a copy of the incoming data to send, as the WebSocket API
+ // doesn't work entirely with an ArrayBufferView, it'll just send
+ // the entire underlying buffer
+ if (ArrayBuffer.isView(buffer)) {
+ offset += buffer.byteOffset;
+ buffer = buffer.buffer;
+ }
+
+ var data = buffer.slice(offset, offset + length);
+
+ // if we don't have a cached connectionless UDP datagram connection, or
+ // the TCP socket is still connecting, queue the message to be sent upon
+ // connect, and lie, saying the data was sent now.
+ if (!dest || dest.socket.readyState !== dest.socket.OPEN) {
+ // if we're not connected, open a new connection
+ if (sock.type === 2) {
+ if (
+ !dest ||
+ dest.socket.readyState === dest.socket.CLOSING ||
+ dest.socket.readyState === dest.socket.CLOSED
+ ) {
+ dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
+ }
+ }
+ dest.msg_send_queue.push(data);
+ return length;
+ }
+
+ try {
+ // send the actual data
+ dest.socket.send(data);
+ return length;
+ } catch (e) {
+ throw new FS.ErrnoError(28);
+ }
+ },
+ recvmsg(sock, length) {
+ // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html
+ if (sock.type === 1 && sock.server) {
+ // tcp servers should not be recv()'ing on the listen socket
+ throw new FS.ErrnoError(53);
+ }
+
+ var queued = sock.recv_queue.shift();
+ if (!queued) {
+ if (sock.type === 1) {
+ var dest = SOCKFS.websocket_sock_ops.getPeer(
+ sock,
+ sock.daddr,
+ sock.dport,
+ );
+
+ if (!dest) {
+ // if we have a destination address but are not connected, error out
+ throw new FS.ErrnoError(53);
+ }
+ if (
+ dest.socket.readyState === dest.socket.CLOSING ||
+ dest.socket.readyState === dest.socket.CLOSED
+ ) {
+ // return null if the socket has closed
+ return null;
+ }
+ // else, our socket is in a valid state but truly has nothing available
+ throw new FS.ErrnoError(6);
+ }
+ throw new FS.ErrnoError(6);
+ }
+
+ // queued.data will be an ArrayBuffer if it's unadulterated, but if it's
+ // requeued TCP data it'll be an ArrayBufferView
+ var queuedLength = queued.data.byteLength || queued.data.length;
+ var queuedOffset = queued.data.byteOffset || 0;
+ var queuedBuffer = queued.data.buffer || queued.data;
+ var bytesRead = Math.min(length, queuedLength);
+ var res = {
+ buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),
+ addr: queued.addr,
+ port: queued.port,
+ };
+
+ // push back any unread data for TCP connections
+ if (sock.type === 1 && bytesRead < queuedLength) {
+ var bytesRemaining = queuedLength - bytesRead;
+ queued.data = new Uint8Array(
+ queuedBuffer,
+ queuedOffset + bytesRead,
+ bytesRemaining,
+ );
+ sock.recv_queue.unshift(queued);
+ }
+
+ return res;
+ },
+ },
+ };
+
+ var getSocketFromFD = (fd) => {
+ var socket = SOCKFS.getSocket(fd);
+ if (!socket) throw new FS.ErrnoError(8);
+ return socket;
+ };
+
+ var Sockets = {
+ BUFFER_SIZE: 10240,
+ MAX_BUFFER_SIZE: 10485760,
+ nextFd: 1,
+ fds: {},
+ nextport: 1,
+ maxport: 65535,
+ peer: null,
+ connections: {},
+ portmap: {},
+ localAddr: 4261412874,
+ addrPool: [
+ 33554442, 50331658, 67108874, 83886090, 100663306, 117440522, 134217738,
+ 150994954, 167772170, 184549386, 201326602, 218103818, 234881034,
+ ],
+ };
+
+ var inetPton4 = (str) => {
+ var b = str.split(".");
+ for (var i = 0; i < 4; i++) {
+ var tmp = Number(b[i]);
+ if (isNaN(tmp)) return null;
+ b[i] = tmp;
+ }
+ return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0;
+ };
+
+ /** @suppress {checkTypes} */
+ var jstoi_q = (str) => parseInt(str);
+ var inetPton6 = (str) => {
+ var words;
+ var w, offset, z, i;
+ /* http://home.deds.nl/~aeron/regex/ */
+ var valid6regx =
+ /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;
+ var parts = [];
+ if (!valid6regx.test(str)) {
+ return null;
+ }
+ if (str === "::") {
+ return [0, 0, 0, 0, 0, 0, 0, 0];
+ }
+ // Z placeholder to keep track of zeros when splitting the string on ":"
+ if (str.startsWith("::")) {
+ str = str.replace("::", "Z:"); // leading zeros case
+ } else {
+ str = str.replace("::", ":Z:");
+ }
+
+ if (str.indexOf(".") > 0) {
+ // parse IPv4 embedded stress
+ str = str.replace(new RegExp("[.]", "g"), ":");
+ words = str.split(":");
+ words[words.length - 4] =
+ jstoi_q(words[words.length - 4]) +
+ jstoi_q(words[words.length - 3]) * 256;
+ words[words.length - 3] =
+ jstoi_q(words[words.length - 2]) +
+ jstoi_q(words[words.length - 1]) * 256;
+ words = words.slice(0, words.length - 2);
+ } else {
+ words = str.split(":");
+ }
+
+ offset = 0;
+ z = 0;
+ for (w = 0; w < words.length; w++) {
+ if (typeof words[w] == "string") {
+ if (words[w] === "Z") {
+ // compressed zeros - write appropriate number of zero words
+ for (z = 0; z < 8 - words.length + 1; z++) {
+ parts[w + z] = 0;
+ }
+ offset = z - 1;
+ } else {
+ // parse hex to field to 16-bit value and write it in network byte-order
+ parts[w + offset] = _htons(parseInt(words[w], 16));
+ }
+ } else {
+ // parsed IPv4 words
+ parts[w + offset] = words[w];
+ }
+ }
+ return [
+ (parts[1] << 16) | parts[0],
+ (parts[3] << 16) | parts[2],
+ (parts[5] << 16) | parts[4],
+ (parts[7] << 16) | parts[6],
+ ];
+ };
+
+ /** @param {number=} addrlen */
+ var writeSockaddr = (sa, family, addr, port, addrlen) => {
+ switch (family) {
+ case 2:
+ addr = inetPton4(addr);
+ zeroMemory(sa, 16);
+ if (addrlen) {
+ HEAP32[addrlen >> 2] = 16;
+ }
+ HEAP16[sa >> 1] = family;
+ HEAP32[(sa + 4) >> 2] = addr;
+ HEAP16[(sa + 2) >> 1] = _htons(port);
+ break;
+ case 10:
+ addr = inetPton6(addr);
+ zeroMemory(sa, 28);
+ if (addrlen) {
+ HEAP32[addrlen >> 2] = 28;
+ }
+ HEAP32[sa >> 2] = family;
+ HEAP32[(sa + 8) >> 2] = addr[0];
+ HEAP32[(sa + 12) >> 2] = addr[1];
+ HEAP32[(sa + 16) >> 2] = addr[2];
+ HEAP32[(sa + 20) >> 2] = addr[3];
+ HEAP16[(sa + 2) >> 1] = _htons(port);
+ break;
+ default:
+ return 5;
+ }
+ return 0;
+ };
+
+ var DNS = {
+ address_map: {
+ id: 1,
+ addrs: {},
+ names: {},
+ },
+ lookup_name(name) {
+ // If the name is already a valid ipv4 / ipv6 address, don't generate a fake one.
+ var res = inetPton4(name);
+ if (res !== null) {
+ return name;
+ }
+ res = inetPton6(name);
+ if (res !== null) {
+ return name;
+ }
+
+ // See if this name is already mapped.
+ var addr;
+
+ if (DNS.address_map.addrs[name]) {
+ addr = DNS.address_map.addrs[name];
+ } else {
+ var id = DNS.address_map.id++;
+ assert(id < 65535, "exceeded max address mappings of 65535");
+
+ addr = "172.29." + (id & 0xff) + "." + (id & 0xff00);
+
+ DNS.address_map.names[addr] = name;
+ DNS.address_map.addrs[name] = addr;
+ }
+
+ return addr;
+ },
+ lookup_addr(addr) {
+ if (DNS.address_map.names[addr]) {
+ return DNS.address_map.names[addr];
+ }
+
+ return null;
+ },
+ };
+ function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) {
+ try {
+ var sock = getSocketFromFD(fd);
+ var newsock = sock.sock_ops.accept(sock);
+ if (addr) {
+ var errno = writeSockaddr(
+ addr,
+ newsock.family,
+ DNS.lookup_name(newsock.daddr),
+ newsock.dport,
+ addrlen,
+ );
+ assert(!errno);
+ }
+ return newsock.stream.fd;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var inetNtop4 = (addr) =>
+ (addr & 0xff) +
+ "." +
+ ((addr >> 8) & 0xff) +
+ "." +
+ ((addr >> 16) & 0xff) +
+ "." +
+ ((addr >> 24) & 0xff);
+
+ var inetNtop6 = (ints) => {
+ // ref: http://www.ietf.org/rfc/rfc2373.txt - section 2.5.4
+ // Format for IPv4 compatible and mapped 128-bit IPv6 Addresses
+ // 128-bits are split into eight 16-bit words
+ // stored in network byte order (big-endian)
+ // | 80 bits | 16 | 32 bits |
+ // +-----------------------------------------------------------------+
+ // | 10 bytes | 2 | 4 bytes |
+ // +--------------------------------------+--------------------------+
+ // + 5 words | 1 | 2 words |
+ // +--------------------------------------+--------------------------+
+ // |0000..............................0000|0000| IPv4 ADDRESS | (compatible)
+ // +--------------------------------------+----+---------------------+
+ // |0000..............................0000|FFFF| IPv4 ADDRESS | (mapped)
+ // +--------------------------------------+----+---------------------+
+ var str = "";
+ var word = 0;
+ var longest = 0;
+ var lastzero = 0;
+ var zstart = 0;
+ var len = 0;
+ var i = 0;
+ var parts = [
+ ints[0] & 0xffff,
+ ints[0] >> 16,
+ ints[1] & 0xffff,
+ ints[1] >> 16,
+ ints[2] & 0xffff,
+ ints[2] >> 16,
+ ints[3] & 0xffff,
+ ints[3] >> 16,
+ ];
+
+ // Handle IPv4-compatible, IPv4-mapped, loopback and any/unspecified addresses
+
+ var hasipv4 = true;
+ var v4part = "";
+ // check if the 10 high-order bytes are all zeros (first 5 words)
+ for (i = 0; i < 5; i++) {
+ if (parts[i] !== 0) {
+ hasipv4 = false;
+ break;
+ }
+ }
+
+ if (hasipv4) {
+ // low-order 32-bits store an IPv4 address (bytes 13 to 16) (last 2 words)
+ v4part = inetNtop4(parts[6] | (parts[7] << 16));
+ // IPv4-mapped IPv6 address if 16-bit value (bytes 11 and 12) == 0xFFFF (6th word)
+ if (parts[5] === -1) {
+ str = "::ffff:";
+ str += v4part;
+ return str;
+ }
+ // IPv4-compatible IPv6 address if 16-bit value (bytes 11 and 12) == 0x0000 (6th word)
+ if (parts[5] === 0) {
+ str = "::";
+ //special case IPv6 addresses
+ if (v4part === "0.0.0.0") v4part = ""; // any/unspecified address
+ if (v4part === "0.0.0.1") v4part = "1"; // loopback address
+ str += v4part;
+ return str;
+ }
+ }
+
+ // Handle all other IPv6 addresses
+
+ // first run to find the longest contiguous zero words
+ for (word = 0; word < 8; word++) {
+ if (parts[word] === 0) {
+ if (word - lastzero > 1) {
+ len = 0;
+ }
+ lastzero = word;
+ len++;
+ }
+ if (len > longest) {
+ longest = len;
+ zstart = word - longest + 1;
+ }
+ }
+
+ for (word = 0; word < 8; word++) {
+ if (longest > 1) {
+ // compress contiguous zeros - to produce "::"
+ if (parts[word] === 0 && word >= zstart && word < zstart + longest) {
+ if (word === zstart) {
+ str += ":";
+ if (zstart === 0) str += ":"; //leading zeros case
+ }
+ continue;
+ }
+ }
+ // converts 16-bit words from big-endian to little-endian before converting to hex string
+ str += Number(_ntohs(parts[word] & 0xffff)).toString(16);
+ str += word < 7 ? ":" : "";
+ }
+ return str;
+ };
+
+ var readSockaddr = (sa, salen) => {
+ // family / port offsets are common to both sockaddr_in and sockaddr_in6
+ var family = HEAP16[sa >> 1];
+ var port = _ntohs(HEAPU16[(sa + 2) >> 1]);
+ var addr;
+
+ switch (family) {
+ case 2:
+ if (salen !== 16) {
+ return { errno: 28 };
+ }
+ addr = HEAP32[(sa + 4) >> 2];
+ addr = inetNtop4(addr);
+ break;
+ case 10:
+ if (salen !== 28) {
+ return { errno: 28 };
+ }
+ addr = [
+ HEAP32[(sa + 8) >> 2],
+ HEAP32[(sa + 12) >> 2],
+ HEAP32[(sa + 16) >> 2],
+ HEAP32[(sa + 20) >> 2],
+ ];
+ addr = inetNtop6(addr);
+ break;
+ default:
+ return { errno: 5 };
+ }
+
+ return { family: family, addr: addr, port: port };
+ };
+
+ var getSocketAddress = (addrp, addrlen) => {
+ var info = readSockaddr(addrp, addrlen);
+ if (info.errno) throw new FS.ErrnoError(info.errno);
+ info.addr = DNS.lookup_addr(info.addr) || info.addr;
+ return info;
+ };
+ function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) {
+ try {
+ var sock = getSocketFromFD(fd);
+ var info = getSocketAddress(addr, addrlen);
+ sock.sock_ops.bind(sock, info.addr, info.port);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_chdir(path) {
+ try {
+ path = SYSCALLS.getStr(path);
+ FS.chdir(path);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_chmod(path, mode) {
+ try {
+ path = SYSCALLS.getStr(path);
+ FS.chmod(path, mode);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) {
+ try {
+ var sock = getSocketFromFD(fd);
+ var info = getSocketAddress(addr, addrlen);
+ sock.sock_ops.connect(sock, info.addr, info.port);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_dup(fd) {
+ try {
+ var old = SYSCALLS.getStreamFromFD(fd);
+ return FS.dupStream(old).fd;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_faccessat(dirfd, path, amode, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ assert(flags === 0 || flags == 512);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ if (amode & ~7) {
+ // need a valid mode
+ return -28;
+ }
+ var lookup = FS.lookupPath(path, { follow: true });
+ var node = lookup.node;
+ if (!node) {
+ return -44;
+ }
+ var perms = "";
+ if (amode & 4) perms += "r";
+ if (amode & 2) perms += "w";
+ if (amode & 1) perms += "x";
+ if (
+ perms /* otherwise, they've just passed F_OK */ &&
+ FS.nodePermissions(node, perms)
+ ) {
+ return -2;
+ }
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_fchownat(dirfd, path, owner, group, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ var nofollow = flags & 256;
+ flags = flags & ~256;
+ assert(flags === 0);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ (nofollow ? FS.lchown : FS.chown)(path, owner, group);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ /** @suppress {duplicate } */
+ var syscallGetVarargI = () => {
+ assert(SYSCALLS.varargs != undefined);
+ // the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number.
+ var ret = HEAP32[+SYSCALLS.varargs >> 2];
+ SYSCALLS.varargs += 4;
+ return ret;
+ };
+ var syscallGetVarargP = syscallGetVarargI;
+
+ function ___syscall_fcntl64(fd, cmd, varargs) {
+ SYSCALLS.varargs = varargs;
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ switch (cmd) {
+ case 0: {
+ var arg = syscallGetVarargI();
+ if (arg < 0) {
+ return -28;
+ }
+ while (FS.streams[arg]) {
+ arg++;
+ }
+ var newStream;
+ newStream = FS.dupStream(stream, arg);
+ return newStream.fd;
+ }
+ case 1:
+ case 2:
+ return 0; // FD_CLOEXEC makes no sense for a single process.
+ case 3:
+ return stream.flags;
+ case 4: {
+ var arg = syscallGetVarargI();
+ stream.flags |= arg;
+ return 0;
+ }
+ case 12: {
+ var arg = syscallGetVarargP();
+ var offset = 0;
+ // We're always unlocked.
+ HEAP16[(arg + offset) >> 1] = 2;
+ return 0;
+ }
+ case 13:
+ case 14:
+ return 0; // Pretend that the locking is successful.
+ }
+ return -28;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_fdatasync(fd) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ return 0; // we can't do anything synchronously; the in-memory FS is already synced to
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_fstat64(fd, buf) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ return SYSCALLS.doStat(FS.stat, stream.path, buf);
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var convertI32PairToI53Checked = (lo, hi) => {
+ assert(lo == lo >>> 0 || lo == (lo | 0)); // lo should either be a i32 or a u32
+ assert(hi === (hi | 0)); // hi should be a i32
+ return (hi + 0x200000) >>> 0 < 0x400001 - !!lo
+ ? (lo >>> 0) + hi * 4294967296
+ : NaN;
+ };
+ function ___syscall_ftruncate64(fd, length_low, length_high) {
+ var length = convertI32PairToI53Checked(length_low, length_high);
+
+ try {
+ if (isNaN(length)) return 61;
+ FS.ftruncate(fd, length);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var stringToUTF8 = (str, outPtr, maxBytesToWrite) => {
+ assert(
+ typeof maxBytesToWrite == "number",
+ "stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!",
+ );
+ return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
+ };
+ function ___syscall_getcwd(buf, size) {
+ try {
+ if (size === 0) return -28;
+ var cwd = FS.cwd();
+ var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1;
+ if (size < cwdLengthInBytes) return -68;
+ stringToUTF8(cwd, buf, size);
+ return cwdLengthInBytes;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_getdents64(fd, dirp, count) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ stream.getdents ||= FS.readdir(stream.path);
+
+ var struct_size = 280;
+ var pos = 0;
+ var off = FS.llseek(stream, 0, 1);
+
+ var startIdx = Math.floor(off / struct_size);
+ var endIdx = Math.min(
+ stream.getdents.length,
+ startIdx + Math.floor(count / struct_size),
+ );
+ for (var idx = startIdx; idx < endIdx; idx++) {
+ var id;
+ var type;
+ var name = stream.getdents[idx];
+ if (name === ".") {
+ id = stream.node.id;
+ type = 4; // DT_DIR
+ } else if (name === "..") {
+ var lookup = FS.lookupPath(stream.path, { parent: true });
+ id = lookup.node.id;
+ type = 4; // DT_DIR
+ } else {
+ var child;
+ try {
+ child = FS.lookupNode(stream.node, name);
+ } catch (e) {
+ // If the entry is not a directory, file, or symlink, nodefs
+ // lookupNode will raise EINVAL. Skip these and continue.
+ if (e?.errno === 28) {
+ continue;
+ }
+ throw e;
+ }
+ id = child.id;
+ type = FS.isChrdev(child.mode)
+ ? 2
+ : // DT_CHR, character device.
+ FS.isDir(child.mode)
+ ? 4
+ : // DT_DIR, directory.
+ FS.isLink(child.mode)
+ ? 10
+ : // DT_LNK, symbolic link.
+ 8; // DT_REG, regular file.
+ }
+ assert(id);
+ (tempI64 = [
+ id >>> 0,
+ ((tempDouble = id),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(dirp + pos) >> 2] = tempI64[0]),
+ (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]);
+ (tempI64 = [
+ ((idx + 1) * struct_size) >>> 0,
+ ((tempDouble = (idx + 1) * struct_size),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]),
+ (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]);
+ HEAP16[(dirp + pos + 16) >> 1] = 280;
+ HEAP8[dirp + pos + 18] = type;
+ stringToUTF8(name, dirp + pos + 19, 256);
+ pos += struct_size;
+ }
+ FS.llseek(stream, idx * struct_size, 0);
+ return pos;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) {
+ try {
+ var sock = getSocketFromFD(fd);
+ if (!sock.daddr) {
+ return -53; // The socket is not connected.
+ }
+ var errno = writeSockaddr(
+ addr,
+ sock.family,
+ DNS.lookup_name(sock.daddr),
+ sock.dport,
+ addrlen,
+ );
+ assert(!errno);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) {
+ try {
+ var sock = getSocketFromFD(fd);
+ // TODO: sock.saddr should never be undefined, see TODO in websocket_sock_ops.getname
+ var errno = writeSockaddr(
+ addr,
+ sock.family,
+ DNS.lookup_name(sock.saddr || "0.0.0.0"),
+ sock.sport,
+ addrlen,
+ );
+ assert(!errno);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) {
+ try {
+ var sock = getSocketFromFD(fd);
+ // Minimal getsockopt aimed at resolving https://github.com/emscripten-core/emscripten/issues/2211
+ // so only supports SOL_SOCKET with SO_ERROR.
+ if (level === 1) {
+ if (optname === 4) {
+ HEAP32[optval >> 2] = sock.error;
+ HEAP32[optlen >> 2] = 4;
+ sock.error = null; // Clear the error (The SO_ERROR option obtains and then clears this field).
+ return 0;
+ }
+ }
+ return -50; // The option is unknown at the level indicated.
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_ioctl(fd, op, varargs) {
+ SYSCALLS.varargs = varargs;
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ switch (op) {
+ case 21509: {
+ if (!stream.tty) return -59;
+ return 0;
+ }
+ case 21505: {
+ if (!stream.tty) return -59;
+ if (stream.tty.ops.ioctl_tcgets) {
+ var termios = stream.tty.ops.ioctl_tcgets(stream);
+ var argp = syscallGetVarargP();
+ HEAP32[argp >> 2] = termios.c_iflag || 0;
+ HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0;
+ HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0;
+ HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0;
+ for (var i = 0; i < 32; i++) {
+ HEAP8[argp + i + 17] = termios.c_cc[i] || 0;
+ }
+ return 0;
+ }
+ return 0;
+ }
+ case 21510:
+ case 21511:
+ case 21512: {
+ if (!stream.tty) return -59;
+ return 0; // no-op, not actually adjusting terminal settings
+ }
+ case 21506:
+ case 21507:
+ case 21508: {
+ if (!stream.tty) return -59;
+ if (stream.tty.ops.ioctl_tcsets) {
+ var argp = syscallGetVarargP();
+ var c_iflag = HEAP32[argp >> 2];
+ var c_oflag = HEAP32[(argp + 4) >> 2];
+ var c_cflag = HEAP32[(argp + 8) >> 2];
+ var c_lflag = HEAP32[(argp + 12) >> 2];
+ var c_cc = [];
+ for (var i = 0; i < 32; i++) {
+ c_cc.push(HEAP8[argp + i + 17]);
+ }
+ return stream.tty.ops.ioctl_tcsets(stream.tty, op, {
+ c_iflag,
+ c_oflag,
+ c_cflag,
+ c_lflag,
+ c_cc,
+ });
+ }
+ return 0; // no-op, not actually adjusting terminal settings
+ }
+ case 21519: {
+ if (!stream.tty) return -59;
+ var argp = syscallGetVarargP();
+ HEAP32[argp >> 2] = 0;
+ return 0;
+ }
+ case 21520: {
+ if (!stream.tty) return -59;
+ return -28; // not supported
+ }
+ case 21531: {
+ var argp = syscallGetVarargP();
+ return FS.ioctl(stream, op, argp);
+ }
+ case 21523: {
+ // TODO: in theory we should write to the winsize struct that gets
+ // passed in, but for now musl doesn't read anything on it
+ if (!stream.tty) return -59;
+ if (stream.tty.ops.ioctl_tiocgwinsz) {
+ var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty);
+ var argp = syscallGetVarargP();
+ HEAP16[argp >> 1] = winsize[0];
+ HEAP16[(argp + 2) >> 1] = winsize[1];
+ }
+ return 0;
+ }
+ case 21524: {
+ // TODO: technically, this ioctl call should change the window size.
+ // but, since emscripten doesn't have any concept of a terminal window
+ // yet, we'll just silently throw it away as we do TIOCGWINSZ
+ if (!stream.tty) return -59;
+ return 0;
+ }
+ case 21515: {
+ if (!stream.tty) return -59;
+ return 0;
+ }
+ default:
+ return -28; // not supported
+ }
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_listen(fd, backlog) {
+ try {
+ var sock = getSocketFromFD(fd);
+ sock.sock_ops.listen(sock, backlog);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_lstat64(path, buf) {
+ try {
+ path = SYSCALLS.getStr(path);
+ return SYSCALLS.doStat(FS.lstat, path, buf);
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_mkdirat(dirfd, path, mode) {
+ try {
+ path = SYSCALLS.getStr(path);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ FS.mkdir(path, mode, 0);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_newfstatat(dirfd, path, buf, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ var nofollow = flags & 256;
+ var allowEmpty = flags & 4096;
+ flags = flags & ~6400;
+ assert(!flags, `unknown flags in __syscall_newfstatat: ${flags}`);
+ path = SYSCALLS.calculateAt(dirfd, path, allowEmpty);
+ return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf);
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_openat(dirfd, path, flags, varargs) {
+ SYSCALLS.varargs = varargs;
+ try {
+ path = SYSCALLS.getStr(path);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ var mode = varargs ? syscallGetVarargI() : 0;
+ return FS.open(path, flags, mode).fd;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var PIPEFS = {
+ BUCKET_BUFFER_SIZE: 8192,
+ mount(mount) {
+ // Do not pollute the real root directory or its child nodes with pipes
+ // Looks like it is OK to create another pseudo-root node not linked to the FS.root hierarchy this way
+ return FS.createNode(null, "/", 16384 | 0o777, 0);
+ },
+ createPipe() {
+ var pipe = {
+ buckets: [],
+ // refcnt 2 because pipe has a read end and a write end. We need to be
+ // able to read from the read end after write end is closed.
+ refcnt: 2,
+ };
+
+ pipe.buckets.push({
+ buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),
+ offset: 0,
+ roffset: 0,
+ });
+
+ var rName = PIPEFS.nextname();
+ var wName = PIPEFS.nextname();
+ var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0);
+ var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0);
+
+ rNode.pipe = pipe;
+ wNode.pipe = pipe;
+
+ var readableStream = FS.createStream({
+ path: rName,
+ node: rNode,
+ flags: 0,
+ seekable: false,
+ stream_ops: PIPEFS.stream_ops,
+ });
+ rNode.stream = readableStream;
+
+ var writableStream = FS.createStream({
+ path: wName,
+ node: wNode,
+ flags: 1,
+ seekable: false,
+ stream_ops: PIPEFS.stream_ops,
+ });
+ wNode.stream = writableStream;
+
+ return {
+ readable_fd: readableStream.fd,
+ writable_fd: writableStream.fd,
+ };
+ },
+ stream_ops: {
+ poll(stream) {
+ var pipe = stream.node.pipe;
+
+ if ((stream.flags & 2097155) === 1) {
+ return 256 | 4;
+ }
+ if (pipe.buckets.length > 0) {
+ for (var i = 0; i < pipe.buckets.length; i++) {
+ var bucket = pipe.buckets[i];
+ if (bucket.offset - bucket.roffset > 0) {
+ return 64 | 1;
+ }
+ }
+ }
+
+ return 0;
+ },
+ ioctl(stream, request, varargs) {
+ return 28;
+ },
+ fsync(stream) {
+ return 28;
+ },
+ read(stream, buffer, offset, length, position /* ignored */) {
+ var pipe = stream.node.pipe;
+ var currentLength = 0;
+
+ for (var i = 0; i < pipe.buckets.length; i++) {
+ var bucket = pipe.buckets[i];
+ currentLength += bucket.offset - bucket.roffset;
+ }
+
+ assert(buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer));
+ var data = buffer.subarray(offset, offset + length);
+
+ if (length <= 0) {
+ return 0;
+ }
+ if (currentLength == 0) {
+ // Behave as if the read end is always non-blocking
+ throw new FS.ErrnoError(6);
+ }
+ var toRead = Math.min(currentLength, length);
+
+ var totalRead = toRead;
+ var toRemove = 0;
+
+ for (var i = 0; i < pipe.buckets.length; i++) {
+ var currBucket = pipe.buckets[i];
+ var bucketSize = currBucket.offset - currBucket.roffset;
+
+ if (toRead <= bucketSize) {
+ var tmpSlice = currBucket.buffer.subarray(
+ currBucket.roffset,
+ currBucket.offset,
+ );
+ if (toRead < bucketSize) {
+ tmpSlice = tmpSlice.subarray(0, toRead);
+ currBucket.roffset += toRead;
+ } else {
+ toRemove++;
+ }
+ data.set(tmpSlice);
+ break;
+ } else {
+ var tmpSlice = currBucket.buffer.subarray(
+ currBucket.roffset,
+ currBucket.offset,
+ );
+ data.set(tmpSlice);
+ data = data.subarray(tmpSlice.byteLength);
+ toRead -= tmpSlice.byteLength;
+ toRemove++;
+ }
+ }
+
+ if (toRemove && toRemove == pipe.buckets.length) {
+ // Do not generate excessive garbage in use cases such as
+ // write several bytes, read everything, write several bytes, read everything...
+ toRemove--;
+ pipe.buckets[toRemove].offset = 0;
+ pipe.buckets[toRemove].roffset = 0;
+ }
+
+ pipe.buckets.splice(0, toRemove);
+
+ return totalRead;
+ },
+ write(stream, buffer, offset, length, position /* ignored */) {
+ var pipe = stream.node.pipe;
+
+ assert(buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer));
+ var data = buffer.subarray(offset, offset + length);
+
+ var dataLen = data.byteLength;
+ if (dataLen <= 0) {
+ return 0;
+ }
+
+ var currBucket = null;
+
+ if (pipe.buckets.length == 0) {
+ currBucket = {
+ buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),
+ offset: 0,
+ roffset: 0,
+ };
+ pipe.buckets.push(currBucket);
+ } else {
+ currBucket = pipe.buckets[pipe.buckets.length - 1];
+ }
+
+ assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE);
+
+ var freeBytesInCurrBuffer =
+ PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset;
+ if (freeBytesInCurrBuffer >= dataLen) {
+ currBucket.buffer.set(data, currBucket.offset);
+ currBucket.offset += dataLen;
+ return dataLen;
+ } else if (freeBytesInCurrBuffer > 0) {
+ currBucket.buffer.set(
+ data.subarray(0, freeBytesInCurrBuffer),
+ currBucket.offset,
+ );
+ currBucket.offset += freeBytesInCurrBuffer;
+ data = data.subarray(freeBytesInCurrBuffer, data.byteLength);
+ }
+
+ var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0;
+ var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE;
+
+ for (var i = 0; i < numBuckets; i++) {
+ var newBucket = {
+ buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),
+ offset: PIPEFS.BUCKET_BUFFER_SIZE,
+ roffset: 0,
+ };
+ pipe.buckets.push(newBucket);
+ newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE));
+ data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength);
+ }
+
+ if (remElements > 0) {
+ var newBucket = {
+ buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),
+ offset: data.byteLength,
+ roffset: 0,
+ };
+ pipe.buckets.push(newBucket);
+ newBucket.buffer.set(data);
+ }
+
+ return dataLen;
+ },
+ close(stream) {
+ var pipe = stream.node.pipe;
+ pipe.refcnt--;
+ if (pipe.refcnt === 0) {
+ pipe.buckets = null;
+ }
+ },
+ },
+ nextname() {
+ if (!PIPEFS.nextname.current) {
+ PIPEFS.nextname.current = 0;
+ }
+ return "pipe[" + PIPEFS.nextname.current++ + "]";
+ },
+ };
+ function ___syscall_pipe(fdPtr) {
+ try {
+ if (fdPtr == 0) {
+ throw new FS.ErrnoError(21);
+ }
+
+ var res = PIPEFS.createPipe();
+
+ HEAP32[fdPtr >> 2] = res.readable_fd;
+ HEAP32[(fdPtr + 4) >> 2] = res.writable_fd;
+
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_poll(fds, nfds, timeout) {
+ try {
+ var nonzero = 0;
+ for (var i = 0; i < nfds; i++) {
+ var pollfd = fds + 8 * i;
+ var fd = HEAP32[pollfd >> 2];
+ var events = HEAP16[(pollfd + 4) >> 1];
+ var mask = 32;
+ var stream = FS.getStream(fd);
+ if (stream) {
+ mask = SYSCALLS.DEFAULT_POLLMASK;
+ if (stream.stream_ops.poll) {
+ mask = stream.stream_ops.poll(stream, -1);
+ }
+ }
+ mask &= events | 8 | 16;
+ if (mask) nonzero++;
+ HEAP16[(pollfd + 6) >> 1] = mask;
+ }
+ return nonzero;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_readlinkat(dirfd, path, buf, bufsize) {
+ try {
+ path = SYSCALLS.getStr(path);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ if (bufsize <= 0) return -28;
+ var ret = FS.readlink(path);
+
+ var len = Math.min(bufsize, lengthBytesUTF8(ret));
+ var endChar = HEAP8[buf + len];
+ stringToUTF8(ret, buf, bufsize + 1);
+ // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!)
+ // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write.
+ HEAP8[buf + len] = endChar;
+ return len;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) {
+ try {
+ var sock = getSocketFromFD(fd);
+ var msg = sock.sock_ops.recvmsg(sock, len);
+ if (!msg) return 0; // socket is closed
+ if (addr) {
+ var errno = writeSockaddr(
+ addr,
+ sock.family,
+ DNS.lookup_name(msg.addr),
+ msg.port,
+ addrlen,
+ );
+ assert(!errno);
+ }
+ HEAPU8.set(msg.buffer, buf);
+ return msg.buffer.byteLength;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) {
+ try {
+ oldpath = SYSCALLS.getStr(oldpath);
+ newpath = SYSCALLS.getStr(newpath);
+ oldpath = SYSCALLS.calculateAt(olddirfd, oldpath);
+ newpath = SYSCALLS.calculateAt(newdirfd, newpath);
+ FS.rename(oldpath, newpath);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_rmdir(path) {
+ try {
+ path = SYSCALLS.getStr(path);
+ FS.rmdir(path);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_sendto(fd, message, length, flags, addr, addr_len) {
+ try {
+ var sock = getSocketFromFD(fd);
+ if (!addr) {
+ // send, no address provided
+ return FS.write(sock.stream, HEAP8, message, length);
+ }
+ var dest = getSocketAddress(addr, addr_len);
+ // sendto an address
+ return sock.sock_ops.sendmsg(
+ sock,
+ HEAP8,
+ message,
+ length,
+ dest.addr,
+ dest.port,
+ );
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_socket(domain, type, protocol) {
+ try {
+ var sock = SOCKFS.createSocket(domain, type, protocol);
+ assert(sock.stream.fd < 64); // XXX ? select() assumes socket fd values are in 0..63
+ return sock.stream.fd;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_stat64(path, buf) {
+ try {
+ path = SYSCALLS.getStr(path);
+ return SYSCALLS.doStat(FS.stat, path, buf);
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_statfs64(path, size, buf) {
+ try {
+ assert(size === 64);
+ var stats = FS.statfs(SYSCALLS.getStr(path));
+ HEAP32[(buf + 4) >> 2] = stats.bsize;
+ HEAP32[(buf + 40) >> 2] = stats.bsize;
+ HEAP32[(buf + 8) >> 2] = stats.blocks;
+ HEAP32[(buf + 12) >> 2] = stats.bfree;
+ HEAP32[(buf + 16) >> 2] = stats.bavail;
+ HEAP32[(buf + 20) >> 2] = stats.files;
+ HEAP32[(buf + 24) >> 2] = stats.ffree;
+ HEAP32[(buf + 28) >> 2] = stats.fsid;
+ HEAP32[(buf + 44) >> 2] = stats.flags; // ST_NOSUID
+ HEAP32[(buf + 36) >> 2] = stats.namelen;
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_symlinkat(target, dirfd, linkpath) {
+ try {
+ target = SYSCALLS.getStr(target);
+ linkpath = SYSCALLS.getStr(linkpath);
+ linkpath = SYSCALLS.calculateAt(dirfd, linkpath);
+ FS.symlink(target, linkpath);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_unlinkat(dirfd, path, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ if (flags === 0) {
+ FS.unlink(path);
+ } else if (flags === 512) {
+ FS.rmdir(path);
+ } else {
+ abort("Invalid flags passed to unlinkat");
+ }
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var readI53FromI64 = (ptr) => {
+ return HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296;
+ };
+
+ function ___syscall_utimensat(dirfd, path, times, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ assert(flags === 0);
+ path = SYSCALLS.calculateAt(dirfd, path, true);
+ var now = Date.now(),
+ atime,
+ mtime;
+ if (!times) {
+ atime = now;
+ mtime = now;
+ } else {
+ var seconds = readI53FromI64(times);
+ var nanoseconds = HEAP32[(times + 8) >> 2];
+ if (nanoseconds == 1073741823) {
+ atime = now;
+ } else if (nanoseconds == 1073741822) {
+ atime = null;
+ } else {
+ atime = seconds * 1000 + nanoseconds / (1000 * 1000);
+ }
+ times += 16;
+ seconds = readI53FromI64(times);
+ nanoseconds = HEAP32[(times + 8) >> 2];
+ if (nanoseconds == 1073741823) {
+ mtime = now;
+ } else if (nanoseconds == 1073741822) {
+ mtime = null;
+ } else {
+ mtime = seconds * 1000 + nanoseconds / (1000 * 1000);
+ }
+ }
+ // null here means UTIME_OMIT was passed. If both were set to UTIME_OMIT then
+ // we can skip the call completely.
+ if ((mtime ?? atime) !== null) {
+ FS.utime(path, atime, mtime);
+ }
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var __abort_js = () => abort("native code called abort()");
+
+ var __emscripten_lookup_name = (name) => {
+ // uint32_t _emscripten_lookup_name(const char *name);
+ var nameString = UTF8ToString(name);
+ return inetPton4(DNS.lookup_name(nameString));
+ };
+
+ var __emscripten_memcpy_js = (dest, src, num) =>
+ HEAPU8.copyWithin(dest, src, src + num);
+
+ var runtimeKeepaliveCounter = 0;
+ var __emscripten_runtime_keepalive_clear = () => {
+ noExitRuntime = false;
+ runtimeKeepaliveCounter = 0;
+ };
+
+ var __emscripten_throw_longjmp = () => {
+ throw Infinity;
+ };
+
+ function __gmtime_js(time_low, time_high, tmPtr) {
+ var time = convertI32PairToI53Checked(time_low, time_high);
+
+ var date = new Date(time * 1000);
+ HEAP32[tmPtr >> 2] = date.getUTCSeconds();
+ HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes();
+ HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours();
+ HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate();
+ HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth();
+ HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900;
+ HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay();
+ var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);
+ var yday = ((date.getTime() - start) / (1000 * 60 * 60 * 24)) | 0;
+ HEAP32[(tmPtr + 28) >> 2] = yday;
+ }
+
+ var isLeapYear = (year) =>
+ year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
+
+ var MONTH_DAYS_LEAP_CUMULATIVE = [
+ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335,
+ ];
+
+ var MONTH_DAYS_REGULAR_CUMULATIVE = [
+ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
+ ];
+ var ydayFromDate = (date) => {
+ var leap = isLeapYear(date.getFullYear());
+ var monthDaysCumulative = leap
+ ? MONTH_DAYS_LEAP_CUMULATIVE
+ : MONTH_DAYS_REGULAR_CUMULATIVE;
+ var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; // -1 since it's days since Jan 1
+
+ return yday;
+ };
+
+ function __localtime_js(time_low, time_high, tmPtr) {
+ var time = convertI32PairToI53Checked(time_low, time_high);
+
+ var date = new Date(time * 1000);
+ HEAP32[tmPtr >> 2] = date.getSeconds();
+ HEAP32[(tmPtr + 4) >> 2] = date.getMinutes();
+ HEAP32[(tmPtr + 8) >> 2] = date.getHours();
+ HEAP32[(tmPtr + 12) >> 2] = date.getDate();
+ HEAP32[(tmPtr + 16) >> 2] = date.getMonth();
+ HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900;
+ HEAP32[(tmPtr + 24) >> 2] = date.getDay();
+
+ var yday = ydayFromDate(date) | 0;
+ HEAP32[(tmPtr + 28) >> 2] = yday;
+ HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60);
+
+ // Attention: DST is in December in South, and some regions don't have DST at all.
+ var start = new Date(date.getFullYear(), 0, 1);
+ var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset();
+ var winterOffset = start.getTimezoneOffset();
+ var dst =
+ (summerOffset != winterOffset &&
+ date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0;
+ HEAP32[(tmPtr + 32) >> 2] = dst;
+ }
+
+ /** @suppress {duplicate } */
+ var setTempRet0 = (val) => __emscripten_tempret_set(val);
+ var _setTempRet0 = setTempRet0;
+
+ var __mktime_js = function (tmPtr) {
+ var ret = (() => {
+ var date = new Date(
+ HEAP32[(tmPtr + 20) >> 2] + 1900,
+ HEAP32[(tmPtr + 16) >> 2],
+ HEAP32[(tmPtr + 12) >> 2],
+ HEAP32[(tmPtr + 8) >> 2],
+ HEAP32[(tmPtr + 4) >> 2],
+ HEAP32[tmPtr >> 2],
+ 0,
+ );
+
+ // There's an ambiguous hour when the time goes back; the tm_isdst field is
+ // used to disambiguate it. Date() basically guesses, so we fix it up if it
+ // guessed wrong, or fill in tm_isdst with the guess if it's -1.
+ var dst = HEAP32[(tmPtr + 32) >> 2];
+ var guessedOffset = date.getTimezoneOffset();
+ var start = new Date(date.getFullYear(), 0, 1);
+ var summerOffset = new Date(
+ date.getFullYear(),
+ 6,
+ 1,
+ ).getTimezoneOffset();
+ var winterOffset = start.getTimezoneOffset();
+ var dstOffset = Math.min(winterOffset, summerOffset); // DST is in December in South
+ if (dst < 0) {
+ // Attention: some regions don't have DST at all.
+ HEAP32[(tmPtr + 32) >> 2] = Number(
+ summerOffset != winterOffset && dstOffset == guessedOffset,
+ );
+ } else if (dst > 0 != (dstOffset == guessedOffset)) {
+ var nonDstOffset = Math.max(winterOffset, summerOffset);
+ var trueOffset = dst > 0 ? dstOffset : nonDstOffset;
+ // Don't try setMinutes(date.getMinutes() + ...) -- it's messed up.
+ date.setTime(date.getTime() + (trueOffset - guessedOffset) * 60000);
+ }
+
+ HEAP32[(tmPtr + 24) >> 2] = date.getDay();
+ var yday = ydayFromDate(date) | 0;
+ HEAP32[(tmPtr + 28) >> 2] = yday;
+ // To match expected behavior, update fields from date
+ HEAP32[tmPtr >> 2] = date.getSeconds();
+ HEAP32[(tmPtr + 4) >> 2] = date.getMinutes();
+ HEAP32[(tmPtr + 8) >> 2] = date.getHours();
+ HEAP32[(tmPtr + 12) >> 2] = date.getDate();
+ HEAP32[(tmPtr + 16) >> 2] = date.getMonth();
+ HEAP32[(tmPtr + 20) >> 2] = date.getYear();
+
+ var timeMs = date.getTime();
+ if (isNaN(timeMs)) {
+ return -1;
+ }
+ // Return time in microseconds
+ return timeMs / 1000;
+ })();
+ return (
+ setTempRet0(
+ ((tempDouble = ret),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ),
+ ret >>> 0
+ );
+ };
+
+ function __mmap_js(
+ len,
+ prot,
+ flags,
+ fd,
+ offset_low,
+ offset_high,
+ allocated,
+ addr,
+ ) {
+ var offset = convertI32PairToI53Checked(offset_low, offset_high);
+
+ try {
+ if (isNaN(offset)) return 61;
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ var res = FS.mmap(stream, len, offset, prot, flags);
+ var ptr = res.ptr;
+ HEAP32[allocated >> 2] = res.allocated;
+ HEAPU32[addr >> 2] = ptr;
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function __munmap_js(addr, len, prot, flags, fd, offset_low, offset_high) {
+ var offset = convertI32PairToI53Checked(offset_low, offset_high);
+
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ if (prot & 2) {
+ SYSCALLS.doMsync(addr, stream, len, flags, offset);
+ }
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var timers = {};
+
+ var handleException = (e) => {
+ // Certain exception types we do not treat as errors since they are used for
+ // internal control flow.
+ // 1. ExitStatus, which is thrown by exit()
+ // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others
+ // that wish to return to JS event loop.
+ if (e instanceof ExitStatus || e == "unwind") {
+ return EXITSTATUS;
+ }
+ checkStackCookie();
+ if (e instanceof WebAssembly.RuntimeError) {
+ if (_emscripten_stack_get_current() <= 0) {
+ err(
+ "Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)",
+ );
+ }
+ }
+ quit_(1, e);
+ };
+
+ var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0;
+ var _proc_exit = (code) => {
+ EXITSTATUS = code;
+ if (!keepRuntimeAlive()) {
+ Module["onExit"]?.(code);
+ ABORT = true;
+ }
+ quit_(code, new ExitStatus(code));
+ };
+
+ /** @suppress {duplicate } */
+ /** @param {boolean|number=} implicit */
+ var exitJS = (status, implicit) => {
+ EXITSTATUS = status;
+
+ checkUnflushedContent();
+
+ // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down
+ if (keepRuntimeAlive() && !implicit) {
+ var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`;
+ readyPromiseReject(msg);
+ err(msg);
+ }
+
+ _proc_exit(status);
+ };
+ var _exit = exitJS;
+
+ var maybeExit = () => {
+ if (!keepRuntimeAlive()) {
+ try {
+ _exit(EXITSTATUS);
+ } catch (e) {
+ handleException(e);
+ }
+ }
+ };
+ var callUserCallback = (func) => {
+ if (ABORT) {
+ err(
+ "user callback triggered after runtime exited or application aborted. Ignoring.",
+ );
+ return;
+ }
+ try {
+ func();
+ maybeExit();
+ } catch (e) {
+ handleException(e);
+ }
+ };
+
+ var _emscripten_get_now = () => performance.now();
+ var __setitimer_js = (which, timeout_ms) => {
+ // First, clear any existing timer.
+ if (timers[which]) {
+ clearTimeout(timers[which].id);
+ delete timers[which];
+ }
+
+ // A timeout of zero simply cancels the current timeout so we have nothing
+ // more to do.
+ if (!timeout_ms) return 0;
+
+ var id = setTimeout(() => {
+ assert(which in timers);
+ delete timers[which];
+ callUserCallback(() =>
+ __emscripten_timeout(which, _emscripten_get_now()),
+ );
+ }, timeout_ms);
+ timers[which] = { id, timeout_ms };
+ return 0;
+ };
+
+ var __tzset_js = (timezone, daylight, std_name, dst_name) => {
+ // TODO: Use (malleable) environment variables instead of system settings.
+ var currentYear = new Date().getFullYear();
+ var winter = new Date(currentYear, 0, 1);
+ var summer = new Date(currentYear, 6, 1);
+ var winterOffset = winter.getTimezoneOffset();
+ var summerOffset = summer.getTimezoneOffset();
+
+ // Local standard timezone offset. Local standard time is not adjusted for
+ // daylight savings. This code uses the fact that getTimezoneOffset returns
+ // a greater value during Standard Time versus Daylight Saving Time (DST).
+ // Thus it determines the expected output during Standard Time, and it
+ // compares whether the output of the given date the same (Standard) or less
+ // (DST).
+ var stdTimezoneOffset = Math.max(winterOffset, summerOffset);
+
+ // timezone is specified as seconds west of UTC ("The external variable
+ // `timezone` shall be set to the difference, in seconds, between
+ // Coordinated Universal Time (UTC) and local standard time."), the same
+ // as returned by stdTimezoneOffset.
+ // See http://pubs.opengroup.org/onlinepubs/009695399/functions/tzset.html
+ HEAPU32[timezone >> 2] = stdTimezoneOffset * 60;
+
+ HEAP32[daylight >> 2] = Number(winterOffset != summerOffset);
+
+ var extractZone = (timezoneOffset) => {
+ // Why inverse sign?
+ // Read here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
+ var sign = timezoneOffset >= 0 ? "-" : "+";
+
+ var absOffset = Math.abs(timezoneOffset);
+ var hours = String(Math.floor(absOffset / 60)).padStart(2, "0");
+ var minutes = String(absOffset % 60).padStart(2, "0");
+
+ return `UTC${sign}${hours}${minutes}`;
+ };
+
+ var winterName = extractZone(winterOffset);
+ var summerName = extractZone(summerOffset);
+ assert(winterName);
+ assert(summerName);
+ assert(
+ lengthBytesUTF8(winterName) <= 16,
+ `timezone name truncated to fit in TZNAME_MAX (${winterName})`,
+ );
+ assert(
+ lengthBytesUTF8(summerName) <= 16,
+ `timezone name truncated to fit in TZNAME_MAX (${summerName})`,
+ );
+ if (summerOffset < winterOffset) {
+ // Northern hemisphere
+ stringToUTF8(winterName, std_name, 17);
+ stringToUTF8(summerName, dst_name, 17);
+ } else {
+ stringToUTF8(winterName, dst_name, 17);
+ stringToUTF8(summerName, std_name, 17);
+ }
+ };
+
+ var _emscripten_date_now = () => Date.now();
+
+ var nowIsMonotonic = 1;
+
+ var checkWasiClock = (clock_id) => clock_id >= 0 && clock_id <= 3;
+
+ function _clock_time_get(
+ clk_id,
+ ignored_precision_low,
+ ignored_precision_high,
+ ptime,
+ ) {
+ var ignored_precision = convertI32PairToI53Checked(
+ ignored_precision_low,
+ ignored_precision_high,
+ );
+
+ if (!checkWasiClock(clk_id)) {
+ return 28;
+ }
+ var now;
+ // all wasi clocks but realtime are monotonic
+ if (clk_id === 0) {
+ now = _emscripten_date_now();
+ } else if (nowIsMonotonic) {
+ now = _emscripten_get_now();
+ } else {
+ return 52;
+ }
+ // "now" is in ms, and wasi times are in ns.
+ var nsec = Math.round(now * 1000 * 1000);
+ (tempI64 = [
+ nsec >>> 0,
+ ((tempDouble = nsec),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[ptime >> 2] = tempI64[0]),
+ (HEAP32[(ptime + 4) >> 2] = tempI64[1]);
+ return 0;
+ }
+
+ var _emscripten_err = (str) => err(UTF8ToString(str));
+
+ var getHeapMax = () => HEAPU8.length;
+ var _emscripten_get_heap_max = () => getHeapMax();
+
+ var abortOnCannotGrowMemory = (requestedSize) => {
+ abort(
+ `Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ${HEAP8.length}, (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0`,
+ );
+ };
+ var _emscripten_resize_heap = (requestedSize) => {
+ var oldSize = HEAPU8.length;
+ // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
+ requestedSize >>>= 0;
+ abortOnCannotGrowMemory(requestedSize);
+ };
+
+ var ENV = {};
+
+ var getExecutableName = () => thisProgram || "./this.program";
+ var getEnvStrings = () => {
+ if (!getEnvStrings.strings) {
+ // Default values.
+ // Browser language detection #8751
+ var lang =
+ (
+ (typeof navigator == "object" &&
+ navigator.languages &&
+ navigator.languages[0]) ||
+ "C"
+ ).replace("-", "_") + ".UTF-8";
+ var env = {
+ USER: "web_user",
+ LOGNAME: "web_user",
+ PATH: "/",
+ PWD: "/",
+ HOME: "/home/web_user",
+ LANG: lang,
+ _: getExecutableName(),
+ };
+ // Apply the user-provided values, if any.
+ for (var x in ENV) {
+ // x is a key in ENV; if ENV[x] is undefined, that means it was
+ // explicitly set to be so. We allow user code to do that to
+ // force variables with default values to remain unset.
+ if (ENV[x] === undefined) delete env[x];
+ else env[x] = ENV[x];
+ }
+ var strings = [];
+ for (var x in env) {
+ strings.push(`${x}=${env[x]}`);
+ }
+ getEnvStrings.strings = strings;
+ }
+ return getEnvStrings.strings;
+ };
+
+ var stringToAscii = (str, buffer) => {
+ for (var i = 0; i < str.length; ++i) {
+ assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff));
+ HEAP8[buffer++] = str.charCodeAt(i);
+ }
+ // Null-terminate the string
+ HEAP8[buffer] = 0;
+ };
+ var _environ_get = (__environ, environ_buf) => {
+ var bufSize = 0;
+ getEnvStrings().forEach((string, i) => {
+ var ptr = environ_buf + bufSize;
+ HEAPU32[(__environ + i * 4) >> 2] = ptr;
+ stringToAscii(string, ptr);
+ bufSize += string.length + 1;
+ });
+ return 0;
+ };
+
+ var _environ_sizes_get = (penviron_count, penviron_buf_size) => {
+ var strings = getEnvStrings();
+ HEAPU32[penviron_count >> 2] = strings.length;
+ var bufSize = 0;
+ strings.forEach((string) => (bufSize += string.length + 1));
+ HEAPU32[penviron_buf_size >> 2] = bufSize;
+ return 0;
+ };
+
+ function _fd_close(fd) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ FS.close(stream);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ function _fd_fdstat_get(fd, pbuf) {
+ try {
+ var rightsBase = 0;
+ var rightsInheriting = 0;
+ var flags = 0;
+ {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ // All character devices are terminals (other things a Linux system would
+ // assume is a character device, like the mouse, we have special APIs for).
+ var type = stream.tty
+ ? 2
+ : FS.isDir(stream.mode)
+ ? 3
+ : FS.isLink(stream.mode)
+ ? 7
+ : 4;
+ }
+ HEAP8[pbuf] = type;
+ HEAP16[(pbuf + 2) >> 1] = flags;
+ (tempI64 = [
+ rightsBase >>> 0,
+ ((tempDouble = rightsBase),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(pbuf + 8) >> 2] = tempI64[0]),
+ (HEAP32[(pbuf + 12) >> 2] = tempI64[1]);
+ (tempI64 = [
+ rightsInheriting >>> 0,
+ ((tempDouble = rightsInheriting),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(pbuf + 16) >> 2] = tempI64[0]),
+ (HEAP32[(pbuf + 20) >> 2] = tempI64[1]);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ /** @param {number=} offset */
+ var doReadv = (stream, iov, iovcnt, offset) => {
+ var ret = 0;
+ for (var i = 0; i < iovcnt; i++) {
+ var ptr = HEAPU32[iov >> 2];
+ var len = HEAPU32[(iov + 4) >> 2];
+ iov += 8;
+ var curr = FS.read(stream, HEAP8, ptr, len, offset);
+ if (curr < 0) return -1;
+ ret += curr;
+ if (curr < len) break; // nothing more to read
+ if (typeof offset != "undefined") {
+ offset += curr;
+ }
+ }
+ return ret;
+ };
+
+ function _fd_read(fd, iov, iovcnt, pnum) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ var num = doReadv(stream, iov, iovcnt);
+ HEAPU32[pnum >> 2] = num;
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
+ var offset = convertI32PairToI53Checked(offset_low, offset_high);
+
+ try {
+ if (isNaN(offset)) return 61;
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ FS.llseek(stream, offset, whence);
+ (tempI64 = [
+ stream.position >>> 0,
+ ((tempDouble = stream.position),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[newOffset >> 2] = tempI64[0]),
+ (HEAP32[(newOffset + 4) >> 2] = tempI64[1]);
+ if (stream.getdents && offset === 0 && whence === 0)
+ stream.getdents = null; // reset readdir state
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ function _fd_sync(fd) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ if (stream.stream_ops?.fsync) {
+ return stream.stream_ops.fsync(stream);
+ }
+ return 0; // we can't do anything synchronously; the in-memory FS is already synced to
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ /** @param {number=} offset */
+ var doWritev = (stream, iov, iovcnt, offset) => {
+ var ret = 0;
+ for (var i = 0; i < iovcnt; i++) {
+ var ptr = HEAPU32[iov >> 2];
+ var len = HEAPU32[(iov + 4) >> 2];
+ iov += 8;
+ var curr = FS.write(stream, HEAP8, ptr, len, offset);
+ if (curr < 0) return -1;
+ ret += curr;
+ if (curr < len) {
+ // No more space to write.
+ break;
+ }
+ if (typeof offset != "undefined") {
+ offset += curr;
+ }
+ }
+ return ret;
+ };
+
+ function _fd_write(fd, iov, iovcnt, pnum) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ var num = doWritev(stream, iov, iovcnt);
+ HEAPU32[pnum >> 2] = num;
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ var _getaddrinfo = (node, service, hint, out) => {
+ // Note getaddrinfo currently only returns a single addrinfo with ai_next defaulting to NULL. When NULL
+ // hints are specified or ai_family set to AF_UNSPEC or ai_socktype or ai_protocol set to 0 then we
+ // really should provide a linked list of suitable addrinfo values.
+ var addrs = [];
+ var canon = null;
+ var addr = 0;
+ var port = 0;
+ var flags = 0;
+ var family = 0;
+ var type = 0;
+ var proto = 0;
+ var ai, last;
+
+ function allocaddrinfo(family, type, proto, canon, addr, port) {
+ var sa, salen, ai;
+ var errno;
+
+ salen = family === 10 ? 28 : 16;
+ addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr);
+ sa = _malloc(salen);
+ errno = writeSockaddr(sa, family, addr, port);
+ assert(!errno);
+
+ ai = _malloc(32);
+ HEAP32[(ai + 4) >> 2] = family;
+ HEAP32[(ai + 8) >> 2] = type;
+ HEAP32[(ai + 12) >> 2] = proto;
+ HEAPU32[(ai + 24) >> 2] = canon;
+ HEAPU32[(ai + 20) >> 2] = sa;
+ if (family === 10) {
+ HEAP32[(ai + 16) >> 2] = 28;
+ } else {
+ HEAP32[(ai + 16) >> 2] = 16;
+ }
+ HEAP32[(ai + 28) >> 2] = 0;
+
+ return ai;
+ }
+
+ if (hint) {
+ flags = HEAP32[hint >> 2];
+ family = HEAP32[(hint + 4) >> 2];
+ type = HEAP32[(hint + 8) >> 2];
+ proto = HEAP32[(hint + 12) >> 2];
+ }
+ if (type && !proto) {
+ proto = type === 2 ? 17 : 6;
+ }
+ if (!type && proto) {
+ type = proto === 17 ? 2 : 1;
+ }
+
+ // If type or proto are set to zero in hints we should really be returning multiple addrinfo values, but for
+ // now default to a TCP STREAM socket so we can at least return a sensible addrinfo given NULL hints.
+ if (proto === 0) {
+ proto = 6;
+ }
+ if (type === 0) {
+ type = 1;
+ }
+
+ if (!node && !service) {
+ return -2;
+ }
+ if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) {
+ return -1;
+ }
+ if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) {
+ return -1;
+ }
+ if (flags & 32) {
+ // TODO
+ return -2;
+ }
+ if (type !== 0 && type !== 1 && type !== 2) {
+ return -7;
+ }
+ if (family !== 0 && family !== 2 && family !== 10) {
+ return -6;
+ }
+
+ if (service) {
+ service = UTF8ToString(service);
+ port = parseInt(service, 10);
+
+ if (isNaN(port)) {
+ if (flags & 1024) {
+ return -2;
+ }
+ // TODO support resolving well-known service names from:
+ // http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt
+ return -8;
+ }
+ }
+
+ if (!node) {
+ if (family === 0) {
+ family = 2;
+ }
+ if ((flags & 1) === 0) {
+ if (family === 2) {
+ addr = _htonl(2130706433);
+ } else {
+ addr = [0, 0, 0, _htonl(1)];
+ }
+ }
+ ai = allocaddrinfo(family, type, proto, null, addr, port);
+ HEAPU32[out >> 2] = ai;
+ return 0;
+ }
+
+ //
+ // try as a numeric address
+ //
+ node = UTF8ToString(node);
+ addr = inetPton4(node);
+ if (addr !== null) {
+ // incoming node is a valid ipv4 address
+ if (family === 0 || family === 2) {
+ family = 2;
+ } else if (family === 10 && flags & 8) {
+ addr = [0, 0, _htonl(0xffff), addr];
+ family = 10;
+ } else {
+ return -2;
+ }
+ } else {
+ addr = inetPton6(node);
+ if (addr !== null) {
+ // incoming node is a valid ipv6 address
+ if (family === 0 || family === 10) {
+ family = 10;
+ } else {
+ return -2;
+ }
+ }
+ }
+ if (addr != null) {
+ ai = allocaddrinfo(family, type, proto, node, addr, port);
+ HEAPU32[out >> 2] = ai;
+ return 0;
+ }
+ if (flags & 4) {
+ return -2;
+ }
+
+ //
+ // try as a hostname
+ //
+ // resolve the hostname to a temporary fake address
+ node = DNS.lookup_name(node);
+ addr = inetPton4(node);
+ if (family === 0) {
+ family = 2;
+ } else if (family === 10) {
+ addr = [0, 0, _htonl(0xffff), addr];
+ }
+ ai = allocaddrinfo(family, type, proto, null, addr, port);
+ HEAPU32[out >> 2] = ai;
+ return 0;
+ };
+
+ /** @type {function(...*):?} */
+ function _getcontext() {
+ abort("missing function: getcontext");
+ }
+ _getcontext.stub = true;
+
+ /** @type {function(...*):?} */
+ function _getdtablesize() {
+ abort("missing function: getdtablesize");
+ }
+ _getdtablesize.stub = true;
+
+ var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => {
+ var info = readSockaddr(sa, salen);
+ if (info.errno) {
+ return -6;
+ }
+ var port = info.port;
+ var addr = info.addr;
+
+ var overflowed = false;
+
+ if (node && nodelen) {
+ var lookup;
+ if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) {
+ if (flags & 8) {
+ return -2;
+ }
+ } else {
+ addr = lookup;
+ }
+ var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen);
+
+ if (numBytesWrittenExclNull + 1 >= nodelen) {
+ overflowed = true;
+ }
+ }
+
+ if (serv && servlen) {
+ port = "" + port;
+ var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen);
+
+ if (numBytesWrittenExclNull + 1 >= servlen) {
+ overflowed = true;
+ }
+ }
+
+ if (overflowed) {
+ // Note: even when we overflow, getnameinfo() is specced to write out the truncated results.
+ return -12;
+ }
+
+ return 0;
+ };
+
+ var Protocols = {
+ list: [],
+ map: {},
+ };
+
+ var _setprotoent = (stayopen) => {
+ // void setprotoent(int stayopen);
+
+ // Allocate and populate a protoent structure given a name, protocol number and array of aliases
+ function allocprotoent(name, proto, aliases) {
+ // write name into buffer
+ var nameBuf = _malloc(name.length + 1);
+ stringToAscii(name, nameBuf);
+
+ // write aliases into buffer
+ var j = 0;
+ var length = aliases.length;
+ var aliasListBuf = _malloc((length + 1) * 4); // Use length + 1 so we have space for the terminating NULL ptr.
+
+ for (var i = 0; i < length; i++, j += 4) {
+ var alias = aliases[i];
+ var aliasBuf = _malloc(alias.length + 1);
+ stringToAscii(alias, aliasBuf);
+ HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf;
+ }
+ HEAPU32[(aliasListBuf + j) >> 2] = 0; // Terminating NULL pointer.
+
+ // generate protoent
+ var pe = _malloc(12);
+ HEAPU32[pe >> 2] = nameBuf;
+ HEAPU32[(pe + 4) >> 2] = aliasListBuf;
+ HEAP32[(pe + 8) >> 2] = proto;
+ return pe;
+ }
+
+ // Populate the protocol 'database'. The entries are limited to tcp and udp, though it is fairly trivial
+ // to add extra entries from /etc/protocols if desired - though not sure if that'd actually be useful.
+ var list = Protocols.list;
+ var map = Protocols.map;
+ if (list.length === 0) {
+ var entry = allocprotoent("tcp", 6, ["TCP"]);
+ list.push(entry);
+ map["tcp"] = map["6"] = entry;
+ entry = allocprotoent("udp", 17, ["UDP"]);
+ list.push(entry);
+ map["udp"] = map["17"] = entry;
+ }
+
+ _setprotoent.index = 0;
+ };
+
+ var _getprotobyname = (name) => {
+ // struct protoent *getprotobyname(const char *);
+ name = UTF8ToString(name);
+ _setprotoent(true);
+ var result = Protocols.map[name];
+ return result;
+ };
+
+ var _getprotobynumber = (number) => {
+ // struct protoent *getprotobynumber(int proto);
+ _setprotoent(true);
+ var result = Protocols.map[number];
+ return result;
+ };
+
+ /** @type {function(...*):?} */
+ function _makecontext() {
+ abort("missing function: makecontext");
+ }
+ _makecontext.stub = true;
+
+ /** @type {function(...*):?} */
+ function _posix_spawnp() {
+ abort("missing function: posix_spawnp");
+ }
+ _posix_spawnp.stub = true;
+
+ var arraySum = (array, index) => {
+ var sum = 0;
+ for (var i = 0; i <= index; sum += array[i++]) {
+ // no-op
+ }
+ return sum;
+ };
+
+ var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+ var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+ var addDays = (date, days) => {
+ var newDate = new Date(date.getTime());
+ while (days > 0) {
+ var leap = isLeapYear(newDate.getFullYear());
+ var currentMonth = newDate.getMonth();
+ var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[
+ currentMonth
+ ];
+
+ if (days > daysInCurrentMonth - newDate.getDate()) {
+ // we spill over to next month
+ days -= daysInCurrentMonth - newDate.getDate() + 1;
+ newDate.setDate(1);
+ if (currentMonth < 11) {
+ newDate.setMonth(currentMonth + 1);
+ } else {
+ newDate.setMonth(0);
+ newDate.setFullYear(newDate.getFullYear() + 1);
+ }
+ } else {
+ // we stay in current month
+ newDate.setDate(newDate.getDate() + days);
+ return newDate;
+ }
+ }
+
+ return newDate;
+ };
+
+ var _strptime = (buf, format, tm) => {
+ // char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tm);
+ // http://pubs.opengroup.org/onlinepubs/009695399/functions/strptime.html
+ var pattern = UTF8ToString(format);
+
+ // escape special characters
+ // TODO: not sure we really need to escape all of these in JS regexps
+ var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,.";
+ for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) {
+ pattern = pattern.replace(
+ new RegExp("\\" + SPECIAL_CHARS[i], "g"),
+ "\\" + SPECIAL_CHARS[i],
+ );
+ }
+
+ // reduce number of matchers
+ var EQUIVALENT_MATCHERS = {
+ A: "%a",
+ B: "%b",
+ c: "%a %b %d %H:%M:%S %Y",
+ D: "%m\\/%d\\/%y",
+ e: "%d",
+ F: "%Y-%m-%d",
+ h: "%b",
+ R: "%H\\:%M",
+ r: "%I\\:%M\\:%S\\s%p",
+ T: "%H\\:%M\\:%S",
+ x: "%m\\/%d\\/(?:%y|%Y)",
+ X: "%H\\:%M\\:%S",
+ };
+ // TODO: take care of locale
+
+ var DATE_PATTERNS = {
+ /* weekday name */ a: "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)",
+ /* month name */ b: "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)",
+ /* century */ C: "\\d\\d",
+ /* day of month */ d: "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31",
+ /* hour (24hr) */ H: "\\d(?!\\d)|[0,1]\\d|20|21|22|23",
+ /* hour (12hr) */ I: "\\d(?!\\d)|0\\d|10|11|12",
+ /* day of year */ j: "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d",
+ /* month */ m: "0[1-9]|[1-9](?!\\d)|10|11|12",
+ /* minutes */ M: "0\\d|\\d(?!\\d)|[1-5]\\d",
+ /* whitespace */ n: " ",
+ /* AM/PM */ p: "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.",
+ /* seconds */ S: "0\\d|\\d(?!\\d)|[1-5]\\d|60",
+ /* week number */ U: "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53",
+ /* week number */ W: "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53",
+ /* weekday number */ w: "[0-6]",
+ /* 2-digit year */ y: "\\d\\d",
+ /* 4-digit year */ Y: "\\d\\d\\d\\d",
+ /* whitespace */ t: " ",
+ /* time zone */ z: "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)",
+ };
+
+ var MONTH_NUMBERS = {
+ JAN: 0,
+ FEB: 1,
+ MAR: 2,
+ APR: 3,
+ MAY: 4,
+ JUN: 5,
+ JUL: 6,
+ AUG: 7,
+ SEP: 8,
+ OCT: 9,
+ NOV: 10,
+ DEC: 11,
+ };
+ var DAY_NUMBERS_SUN_FIRST = {
+ SUN: 0,
+ MON: 1,
+ TUE: 2,
+ WED: 3,
+ THU: 4,
+ FRI: 5,
+ SAT: 6,
+ };
+ var DAY_NUMBERS_MON_FIRST = {
+ MON: 0,
+ TUE: 1,
+ WED: 2,
+ THU: 3,
+ FRI: 4,
+ SAT: 5,
+ SUN: 6,
+ };
+
+ var capture = [];
+ var pattern_out = pattern
+ .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m)
+ .replace(/%(.)/g, (_, c) => {
+ let pat = DATE_PATTERNS[c];
+ if (pat) {
+ capture.push(c);
+ return `(${pat})`;
+ } else {
+ return c;
+ }
+ })
+ .replace(
+ // any number of space or tab characters match zero or more spaces
+ /\s+/g,
+ "\\s*",
+ );
+
+ var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf));
+
+ function initDate() {
+ function fixup(value, min, max) {
+ return typeof value != "number" || isNaN(value)
+ ? min
+ : value >= min
+ ? value <= max
+ ? value
+ : max
+ : min;
+ }
+ return {
+ year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999),
+ month: fixup(HEAP32[(tm + 16) >> 2], 0, 11),
+ day: fixup(HEAP32[(tm + 12) >> 2], 1, 31),
+ hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23),
+ min: fixup(HEAP32[(tm + 4) >> 2], 0, 59),
+ sec: fixup(HEAP32[tm >> 2], 0, 59),
+ gmtoff: 0,
+ };
+ }
+
+ if (matches) {
+ var date = initDate();
+ var value;
+
+ var getMatch = (symbol) => {
+ var pos = capture.indexOf(symbol);
+ // check if symbol appears in regexp
+ if (pos >= 0) {
+ // return matched value or null (falsy!) for non-matches
+ return matches[pos + 1];
+ }
+ return;
+ };
+
+ // seconds
+ if ((value = getMatch("S"))) {
+ date.sec = jstoi_q(value);
+ }
+
+ // minutes
+ if ((value = getMatch("M"))) {
+ date.min = jstoi_q(value);
+ }
+
+ // hours
+ if ((value = getMatch("H"))) {
+ // 24h clock
+ date.hour = jstoi_q(value);
+ } else if ((value = getMatch("I"))) {
+ // AM/PM clock
+ var hour = jstoi_q(value);
+ if ((value = getMatch("p"))) {
+ hour += value.toUpperCase()[0] === "P" ? 12 : 0;
+ }
+ date.hour = hour;
+ }
+
+ // year
+ if ((value = getMatch("Y"))) {
+ // parse from four-digit year
+ date.year = jstoi_q(value);
+ } else if ((value = getMatch("y"))) {
+ // parse from two-digit year...
+ var year = jstoi_q(value);
+ if ((value = getMatch("C"))) {
+ // ...and century
+ year += jstoi_q(value) * 100;
+ } else {
+ // ...and rule-of-thumb
+ year += year < 69 ? 2000 : 1900;
+ }
+ date.year = year;
+ }
+
+ // month
+ if ((value = getMatch("m"))) {
+ // parse from month number
+ date.month = jstoi_q(value) - 1;
+ } else if ((value = getMatch("b"))) {
+ // parse from month name
+ date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0;
+ // TODO: derive month from day in year+year, week number+day of week+year
+ }
+
+ // day
+ if ((value = getMatch("d"))) {
+ // get day of month directly
+ date.day = jstoi_q(value);
+ } else if ((value = getMatch("j"))) {
+ // get day of month from day of year ...
+ var day = jstoi_q(value);
+ var leapYear = isLeapYear(date.year);
+ for (var month = 0; month < 12; ++month) {
+ var daysUntilMonth = arraySum(
+ leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR,
+ month - 1,
+ );
+ if (
+ day <=
+ daysUntilMonth +
+ (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]
+ ) {
+ date.day = day - daysUntilMonth;
+ }
+ }
+ } else if ((value = getMatch("a"))) {
+ // get day of month from weekday ...
+ var weekDay = value.substring(0, 3).toUpperCase();
+ if ((value = getMatch("U"))) {
+ // ... and week number (Sunday being first day of week)
+ // Week number of the year (Sunday as the first day of the week) as a decimal number [00,53].
+ // All days in a new year preceding the first Sunday are considered to be in week 0.
+ var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay];
+ var weekNumber = jstoi_q(value);
+
+ // January 1st
+ var janFirst = new Date(date.year, 0, 1);
+ var endDate;
+ if (janFirst.getDay() === 0) {
+ // Jan 1st is a Sunday, and, hence in the 1st CW
+ endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1));
+ } else {
+ // Jan 1st is not a Sunday, and, hence still in the 0th CW
+ endDate = addDays(
+ janFirst,
+ 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1),
+ );
+ }
+ date.day = endDate.getDate();
+ date.month = endDate.getMonth();
+ } else if ((value = getMatch("W"))) {
+ // ... and week number (Monday being first day of week)
+ // Week number of the year (Monday as the first day of the week) as a decimal number [00,53].
+ // All days in a new year preceding the first Monday are considered to be in week 0.
+ var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay];
+ var weekNumber = jstoi_q(value);
+
+ // January 1st
+ var janFirst = new Date(date.year, 0, 1);
+ var endDate;
+ if (janFirst.getDay() === 1) {
+ // Jan 1st is a Monday, and, hence in the 1st CW
+ endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1));
+ } else {
+ // Jan 1st is not a Monday, and, hence still in the 0th CW
+ endDate = addDays(
+ janFirst,
+ 7 -
+ janFirst.getDay() +
+ 1 +
+ weekDayNumber +
+ 7 * (weekNumber - 1),
+ );
+ }
+
+ date.day = endDate.getDate();
+ date.month = endDate.getMonth();
+ }
+ }
+
+ // time zone
+ if ((value = getMatch("z"))) {
+ // GMT offset as either 'Z' or +-HH:MM or +-HH or +-HHMM
+ if (value.toLowerCase() === "z") {
+ date.gmtoff = 0;
+ } else {
+ var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/);
+ date.gmtoff = match[1] * 3600;
+ if (match[2]) {
+ date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60;
+ }
+ }
+ }
+
+ /*
+ tm_sec int seconds after the minute 0-61*
+ tm_min int minutes after the hour 0-59
+ tm_hour int hours since midnight 0-23
+ tm_mday int day of the month 1-31
+ tm_mon int months since January 0-11
+ tm_year int years since 1900
+ tm_wday int days since Sunday 0-6
+ tm_yday int days since January 1 0-365
+ tm_isdst int Daylight Saving Time flag
+ tm_gmtoff long offset from GMT (seconds)
+ */
+
+ var fullDate = new Date(
+ date.year,
+ date.month,
+ date.day,
+ date.hour,
+ date.min,
+ date.sec,
+ 0,
+ );
+ HEAP32[tm >> 2] = fullDate.getSeconds();
+ HEAP32[(tm + 4) >> 2] = fullDate.getMinutes();
+ HEAP32[(tm + 8) >> 2] = fullDate.getHours();
+ HEAP32[(tm + 12) >> 2] = fullDate.getDate();
+ HEAP32[(tm + 16) >> 2] = fullDate.getMonth();
+ HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900;
+ HEAP32[(tm + 24) >> 2] = fullDate.getDay();
+ HEAP32[(tm + 28) >> 2] =
+ arraySum(
+ isLeapYear(fullDate.getFullYear())
+ ? MONTH_DAYS_LEAP
+ : MONTH_DAYS_REGULAR,
+ fullDate.getMonth() - 1,
+ ) +
+ fullDate.getDate() -
+ 1;
+ HEAP32[(tm + 32) >> 2] = 0;
+ HEAP32[(tm + 36) >> 2] = date.gmtoff;
+
+ // we need to convert the matched sequence into an integer array to take care of UTF-8 characters > 0x7F
+ // TODO: not sure that intArrayFromString handles all unicode characters correctly
+ return buf + intArrayFromString(matches[0]).length - 1;
+ }
+
+ return 0;
+ };
+
+ /** @type {function(...*):?} */
+ function _swapcontext() {
+ abort("missing function: swapcontext");
+ }
+ _swapcontext.stub = true;
+
+ var getCFunc = (ident) => {
+ var func = Module["_" + ident]; // closure exported function
+ assert(
+ func,
+ "Cannot call unknown function " + ident + ", make sure it is exported",
+ );
+ return func;
+ };
+
+ var writeArrayToMemory = (array, buffer) => {
+ assert(
+ array.length >= 0,
+ "writeArrayToMemory array must have a length (should be an array or typed array)",
+ );
+ HEAP8.set(array, buffer);
+ };
+
+ var stackAlloc = (sz) => __emscripten_stack_alloc(sz);
+ var stringToUTF8OnStack = (str) => {
+ var size = lengthBytesUTF8(str) + 1;
+ var ret = stackAlloc(size);
+ stringToUTF8(str, ret, size);
+ return ret;
+ };
+
+ /**
+ * @param {string|null=} returnType
+ * @param {Array=} argTypes
+ * @param {Arguments|Array=} args
+ * @param {Object=} opts
+ */
+ var ccall = (ident, returnType, argTypes, args, opts) => {
+ // For fast lookup of conversion functions
+ var toC = {
+ string: (str) => {
+ var ret = 0;
+ if (str !== null && str !== undefined && str !== 0) {
+ // null string
+ ret = stringToUTF8OnStack(str);
+ }
+ return ret;
+ },
+ array: (arr) => {
+ var ret = stackAlloc(arr.length);
+ writeArrayToMemory(arr, ret);
+ return ret;
+ },
+ };
+
+ function convertReturnValue(ret) {
+ if (returnType === "string") {
+ return UTF8ToString(ret);
+ }
+ if (returnType === "boolean") return Boolean(ret);
+ return ret;
+ }
+
+ var func = getCFunc(ident);
+ var cArgs = [];
+ var stack = 0;
+ assert(returnType !== "array", 'Return type should not be "array".');
+ if (args) {
+ for (var i = 0; i < args.length; i++) {
+ var converter = toC[argTypes[i]];
+ if (converter) {
+ if (stack === 0) stack = stackSave();
+ cArgs[i] = converter(args[i]);
+ } else {
+ cArgs[i] = args[i];
+ }
+ }
+ }
+ var ret = func(...cArgs);
+ function onDone(ret) {
+ if (stack !== 0) stackRestore(stack);
+ return convertReturnValue(ret);
+ }
+
+ ret = onDone(ret);
+ return ret;
+ };
+
+ FS.createPreloadedFile = FS_createPreloadedFile;
+ FS.staticInit();
+ // Set module methods based on EXPORTED_RUNTIME_METHODS
+ function checkIncomingModuleAPI() {
+ ignoredModuleProp("fetchSettings");
+ }
+ var wasmImports = {
+ /** @export */
+ __assert_fail: ___assert_fail,
+ /** @export */
+ __call_sighandler: ___call_sighandler,
+ /** @export */
+ __syscall__newselect: ___syscall__newselect,
+ /** @export */
+ __syscall_accept4: ___syscall_accept4,
+ /** @export */
+ __syscall_bind: ___syscall_bind,
+ /** @export */
+ __syscall_chdir: ___syscall_chdir,
+ /** @export */
+ __syscall_chmod: ___syscall_chmod,
+ /** @export */
+ __syscall_connect: ___syscall_connect,
+ /** @export */
+ __syscall_dup: ___syscall_dup,
+ /** @export */
+ __syscall_faccessat: ___syscall_faccessat,
+ /** @export */
+ __syscall_fchownat: ___syscall_fchownat,
+ /** @export */
+ __syscall_fcntl64: ___syscall_fcntl64,
+ /** @export */
+ __syscall_fdatasync: ___syscall_fdatasync,
+ /** @export */
+ __syscall_fstat64: ___syscall_fstat64,
+ /** @export */
+ __syscall_ftruncate64: ___syscall_ftruncate64,
+ /** @export */
+ __syscall_getcwd: ___syscall_getcwd,
+ /** @export */
+ __syscall_getdents64: ___syscall_getdents64,
+ /** @export */
+ __syscall_getpeername: ___syscall_getpeername,
+ /** @export */
+ __syscall_getsockname: ___syscall_getsockname,
+ /** @export */
+ __syscall_getsockopt: ___syscall_getsockopt,
+ /** @export */
+ __syscall_ioctl: ___syscall_ioctl,
+ /** @export */
+ __syscall_listen: ___syscall_listen,
+ /** @export */
+ __syscall_lstat64: ___syscall_lstat64,
+ /** @export */
+ __syscall_mkdirat: ___syscall_mkdirat,
+ /** @export */
+ __syscall_newfstatat: ___syscall_newfstatat,
+ /** @export */
+ __syscall_openat: ___syscall_openat,
+ /** @export */
+ __syscall_pipe: ___syscall_pipe,
+ /** @export */
+ __syscall_poll: ___syscall_poll,
+ /** @export */
+ __syscall_readlinkat: ___syscall_readlinkat,
+ /** @export */
+ __syscall_recvfrom: ___syscall_recvfrom,
+ /** @export */
+ __syscall_renameat: ___syscall_renameat,
+ /** @export */
+ __syscall_rmdir: ___syscall_rmdir,
+ /** @export */
+ __syscall_sendto: ___syscall_sendto,
+ /** @export */
+ __syscall_socket: ___syscall_socket,
+ /** @export */
+ __syscall_stat64: ___syscall_stat64,
+ /** @export */
+ __syscall_statfs64: ___syscall_statfs64,
+ /** @export */
+ __syscall_symlinkat: ___syscall_symlinkat,
+ /** @export */
+ __syscall_unlinkat: ___syscall_unlinkat,
+ /** @export */
+ __syscall_utimensat: ___syscall_utimensat,
+ /** @export */
+ _abort_js: __abort_js,
+ /** @export */
+ _emscripten_lookup_name: __emscripten_lookup_name,
+ /** @export */
+ _emscripten_memcpy_js: __emscripten_memcpy_js,
+ /** @export */
+ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear,
+ /** @export */
+ _emscripten_throw_longjmp: __emscripten_throw_longjmp,
+ /** @export */
+ _gmtime_js: __gmtime_js,
+ /** @export */
+ _localtime_js: __localtime_js,
+ /** @export */
+ _mktime_js: __mktime_js,
+ /** @export */
+ _mmap_js: __mmap_js,
+ /** @export */
+ _munmap_js: __munmap_js,
+ /** @export */
+ _setitimer_js: __setitimer_js,
+ /** @export */
+ _tzset_js: __tzset_js,
+ /** @export */
+ clock_time_get: _clock_time_get,
+ /** @export */
+ emscripten_date_now: _emscripten_date_now,
+ /** @export */
+ emscripten_err: _emscripten_err,
+ /** @export */
+ emscripten_get_heap_max: _emscripten_get_heap_max,
+ /** @export */
+ emscripten_get_now: _emscripten_get_now,
+ /** @export */
+ emscripten_resize_heap: _emscripten_resize_heap,
+ /** @export */
+ environ_get: _environ_get,
+ /** @export */
+ environ_sizes_get: _environ_sizes_get,
+ /** @export */
+ exit: _exit,
+ /** @export */
+ fd_close: _fd_close,
+ /** @export */
+ fd_fdstat_get: _fd_fdstat_get,
+ /** @export */
+ fd_read: _fd_read,
+ /** @export */
+ fd_seek: _fd_seek,
+ /** @export */
+ fd_sync: _fd_sync,
+ /** @export */
+ fd_write: _fd_write,
+ /** @export */
+ getaddrinfo: _getaddrinfo,
+ /** @export */
+ getcontext: _getcontext,
+ /** @export */
+ getdtablesize: _getdtablesize,
+ /** @export */
+ getnameinfo: _getnameinfo,
+ /** @export */
+ getprotobyname: _getprotobyname,
+ /** @export */
+ getprotobynumber: _getprotobynumber,
+ /** @export */
+ invoke_i,
+ /** @export */
+ invoke_ii,
+ /** @export */
+ invoke_iii,
+ /** @export */
+ invoke_iiii,
+ /** @export */
+ invoke_iiiii,
+ /** @export */
+ invoke_iiiiii,
+ /** @export */
+ invoke_iiiiiii,
+ /** @export */
+ invoke_iiiiiiiiii,
+ /** @export */
+ invoke_v,
+ /** @export */
+ invoke_vi,
+ /** @export */
+ invoke_vii,
+ /** @export */
+ invoke_viidii,
+ /** @export */
+ invoke_viii,
+ /** @export */
+ invoke_viiii,
+ /** @export */
+ invoke_viiiii,
+ /** @export */
+ makecontext: _makecontext,
+ /** @export */
+ posix_spawnp: _posix_spawnp,
+ /** @export */
+ proc_exit: _proc_exit,
+ /** @export */
+ strptime: _strptime,
+ /** @export */
+ swapcontext: _swapcontext,
+ };
+ var wasmExports;
+ createWasm();
+ var ___wasm_call_ctors = createExportWrapper("__wasm_call_ctors", 0);
+ var _php_wasm_run = (Module["_php_wasm_run"] = createExportWrapper(
+ "php_wasm_run",
+ 1,
+ ));
+ var _fflush = createExportWrapper("fflush", 1);
+ var _malloc = createExportWrapper("malloc", 1);
+ var _strerror = createExportWrapper("strerror", 1);
+ var _htons = createExportWrapper("htons", 1);
+ var _ntohs = createExportWrapper("ntohs", 1);
+ var _htonl = createExportWrapper("htonl", 1);
+ var _emscripten_builtin_memalign = createExportWrapper(
+ "emscripten_builtin_memalign",
+ 2,
+ );
+ var __emscripten_timeout = createExportWrapper("_emscripten_timeout", 2);
+ var _setThrew = createExportWrapper("setThrew", 2);
+ var __emscripten_tempret_set = createExportWrapper(
+ "_emscripten_tempret_set",
+ 1,
+ );
+ var _emscripten_stack_init = () =>
+ (_emscripten_stack_init = wasmExports["emscripten_stack_init"])();
+ var _emscripten_stack_get_free = () =>
+ (_emscripten_stack_get_free = wasmExports["emscripten_stack_get_free"])();
+ var _emscripten_stack_get_base = () =>
+ (_emscripten_stack_get_base = wasmExports["emscripten_stack_get_base"])();
+ var _emscripten_stack_get_end = () =>
+ (_emscripten_stack_get_end = wasmExports["emscripten_stack_get_end"])();
+ var __emscripten_stack_restore = (a0) =>
+ (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(
+ a0,
+ );
+ var __emscripten_stack_alloc = (a0) =>
+ (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0);
+ var _emscripten_stack_get_current = () =>
+ (_emscripten_stack_get_current =
+ wasmExports["emscripten_stack_get_current"])();
+ var dynCall_jiji = (Module["dynCall_jiji"] = createExportWrapper(
+ "dynCall_jiji",
+ 5,
+ ));
+
+ function invoke_iii(index, a1, a2) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiiii(index, a1, a2, a3, a4) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3, a4);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_v(index) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)();
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_ii(index, a1) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_viii(index, a1, a2, a3) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2, a3);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_vii(index, a1, a2) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_vi(index, a1) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_i(index) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)();
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3, a4, a5, a6);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiii(index, a1, a2, a3) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_viiii(index, a1, a2, a3, a4) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2, a3, a4);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_viiiii(index, a1, a2, a3, a4, a5) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2, a3, a4, a5);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiiiii(index, a1, a2, a3, a4, a5) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3, a4, a5);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3, a4, a5, a6, a7, a8, a9);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_viidii(index, a1, a2, a3, a4, a5) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2, a3, a4, a5);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ // include: postamble.js
+ // === Auto-generated postamble setup entry stuff ===
+
+ Module["ccall"] = ccall;
+ var missingLibrarySymbols = [
+ "writeI53ToI64",
+ "writeI53ToI64Clamped",
+ "writeI53ToI64Signaling",
+ "writeI53ToU64Clamped",
+ "writeI53ToU64Signaling",
+ "readI53FromU64",
+ "convertI32PairToI53",
+ "convertU32PairToI53",
+ "getTempRet0",
+ "growMemory",
+ "emscriptenLog",
+ "readEmAsmArgs",
+ "listenOnce",
+ "autoResumeAudioContext",
+ "dynCallLegacy",
+ "getDynCaller",
+ "dynCall",
+ "runtimeKeepalivePush",
+ "runtimeKeepalivePop",
+ "asmjsMangle",
+ "HandleAllocator",
+ "getNativeTypeSize",
+ "STACK_SIZE",
+ "STACK_ALIGN",
+ "POINTER_SIZE",
+ "ASSERTIONS",
+ "cwrap",
+ "uleb128Encode",
+ "sigToWasmTypes",
+ "generateFuncType",
+ "convertJsFunctionToWasm",
+ "getEmptyTableSlot",
+ "updateTableMap",
+ "getFunctionAddress",
+ "addFunction",
+ "removeFunction",
+ "reallyNegative",
+ "unSign",
+ "strLen",
+ "reSign",
+ "formatString",
+ "intArrayToString",
+ "AsciiToString",
+ "UTF16ToString",
+ "stringToUTF16",
+ "lengthBytesUTF16",
+ "UTF32ToString",
+ "stringToUTF32",
+ "lengthBytesUTF32",
+ "stringToNewUTF8",
+ "registerKeyEventCallback",
+ "maybeCStringToJsString",
+ "findEventTarget",
+ "getBoundingClientRect",
+ "fillMouseEventData",
+ "registerMouseEventCallback",
+ "registerWheelEventCallback",
+ "registerUiEventCallback",
+ "registerFocusEventCallback",
+ "fillDeviceOrientationEventData",
+ "registerDeviceOrientationEventCallback",
+ "fillDeviceMotionEventData",
+ "registerDeviceMotionEventCallback",
+ "screenOrientation",
+ "fillOrientationChangeEventData",
+ "registerOrientationChangeEventCallback",
+ "fillFullscreenChangeEventData",
+ "registerFullscreenChangeEventCallback",
+ "JSEvents_requestFullscreen",
+ "JSEvents_resizeCanvasForFullscreen",
+ "registerRestoreOldStyle",
+ "hideEverythingExceptGivenElement",
+ "restoreHiddenElements",
+ "setLetterbox",
+ "softFullscreenResizeWebGLRenderTarget",
+ "doRequestFullscreen",
+ "fillPointerlockChangeEventData",
+ "registerPointerlockChangeEventCallback",
+ "registerPointerlockErrorEventCallback",
+ "requestPointerLock",
+ "fillVisibilityChangeEventData",
+ "registerVisibilityChangeEventCallback",
+ "registerTouchEventCallback",
+ "fillGamepadEventData",
+ "registerGamepadEventCallback",
+ "registerBeforeUnloadEventCallback",
+ "fillBatteryEventData",
+ "battery",
+ "registerBatteryEventCallback",
+ "setCanvasElementSize",
+ "getCanvasElementSize",
+ "jsStackTrace",
+ "getCallstack",
+ "convertPCtoSourceLocation",
+ "wasiRightsToMuslOFlags",
+ "wasiOFlagsToMuslOFlags",
+ "safeSetTimeout",
+ "setImmediateWrapped",
+ "safeRequestAnimationFrame",
+ "clearImmediateWrapped",
+ "polyfillSetImmediate",
+ "registerPostMainLoop",
+ "registerPreMainLoop",
+ "getPromise",
+ "makePromise",
+ "idsToPromises",
+ "makePromiseCallback",
+ "ExceptionInfo",
+ "findMatchingCatch",
+ "Browser_asyncPrepareDataCounter",
+ "FS_unlink",
+ "FS_mkdirTree",
+ "_setNetworkCallback",
+ "heapObjectForWebGLType",
+ "toTypedArrayIndex",
+ "webgl_enable_ANGLE_instanced_arrays",
+ "webgl_enable_OES_vertex_array_object",
+ "webgl_enable_WEBGL_draw_buffers",
+ "webgl_enable_WEBGL_multi_draw",
+ "webgl_enable_EXT_polygon_offset_clamp",
+ "webgl_enable_EXT_clip_control",
+ "webgl_enable_WEBGL_polygon_mode",
+ "emscriptenWebGLGet",
+ "computeUnpackAlignedImageSize",
+ "colorChannelsInGlTextureFormat",
+ "emscriptenWebGLGetTexPixelData",
+ "emscriptenWebGLGetUniform",
+ "webglGetUniformLocation",
+ "webglPrepareUniformLocationsBeforeFirstUse",
+ "webglGetLeftBracePos",
+ "emscriptenWebGLGetVertexAttrib",
+ "__glGetActiveAttribOrUniform",
+ "writeGLArray",
+ "registerWebGlEventCallback",
+ "runAndAbortIfError",
+ "ALLOC_NORMAL",
+ "ALLOC_STACK",
+ "allocate",
+ "writeStringToMemory",
+ "writeAsciiToMemory",
+ "setErrNo",
+ "demangle",
+ "stackTrace",
+ ];
+ missingLibrarySymbols.forEach(missingLibrarySymbol);
+
+ var unexportedSymbols = [
+ "run",
+ "addOnPreRun",
+ "addOnInit",
+ "addOnPreMain",
+ "addOnExit",
+ "addOnPostRun",
+ "addRunDependency",
+ "removeRunDependency",
+ "out",
+ "err",
+ "callMain",
+ "abort",
+ "wasmMemory",
+ "wasmExports",
+ "writeStackCookie",
+ "checkStackCookie",
+ "readI53FromI64",
+ "convertI32PairToI53Checked",
+ "stackSave",
+ "stackRestore",
+ "stackAlloc",
+ "setTempRet0",
+ "ptrToString",
+ "zeroMemory",
+ "exitJS",
+ "getHeapMax",
+ "abortOnCannotGrowMemory",
+ "ENV",
+ "ERRNO_CODES",
+ "strError",
+ "inetPton4",
+ "inetNtop4",
+ "inetPton6",
+ "inetNtop6",
+ "readSockaddr",
+ "writeSockaddr",
+ "DNS",
+ "Protocols",
+ "Sockets",
+ "timers",
+ "warnOnce",
+ "readEmAsmArgsArray",
+ "jstoi_q",
+ "jstoi_s",
+ "getExecutableName",
+ "handleException",
+ "keepRuntimeAlive",
+ "callUserCallback",
+ "maybeExit",
+ "asyncLoad",
+ "alignMemory",
+ "mmapAlloc",
+ "wasmTable",
+ "noExitRuntime",
+ "getCFunc",
+ "freeTableIndexes",
+ "functionsInTableMap",
+ "setValue",
+ "getValue",
+ "PATH",
+ "PATH_FS",
+ "UTF8Decoder",
+ "UTF8ArrayToString",
+ "UTF8ToString",
+ "stringToUTF8Array",
+ "stringToUTF8",
+ "lengthBytesUTF8",
+ "intArrayFromString",
+ "stringToAscii",
+ "UTF16Decoder",
+ "stringToUTF8OnStack",
+ "writeArrayToMemory",
+ "JSEvents",
+ "specialHTMLTargets",
+ "findCanvasEventTarget",
+ "currentFullscreenStrategy",
+ "restoreOldWindowedStyle",
+ "UNWIND_CACHE",
+ "ExitStatus",
+ "getEnvStrings",
+ "checkWasiClock",
+ "doReadv",
+ "doWritev",
+ "initRandomFill",
+ "randomFill",
+ "promiseMap",
+ "uncaughtExceptionCount",
+ "exceptionLast",
+ "exceptionCaught",
+ "Browser",
+ "getPreloadedImageData__data",
+ "wget",
+ "MONTH_DAYS_REGULAR",
+ "MONTH_DAYS_LEAP",
+ "MONTH_DAYS_REGULAR_CUMULATIVE",
+ "MONTH_DAYS_LEAP_CUMULATIVE",
+ "isLeapYear",
+ "ydayFromDate",
+ "arraySum",
+ "addDays",
+ "SYSCALLS",
+ "getSocketFromFD",
+ "getSocketAddress",
+ "preloadPlugins",
+ "FS_createPreloadedFile",
+ "FS_modeStringToFlags",
+ "FS_getMode",
+ "FS_stdin_getChar_buffer",
+ "FS_stdin_getChar",
+ "FS_createPath",
+ "FS_createDevice",
+ "FS_readFile",
+ "FS",
+ "FS_createDataFile",
+ "FS_createLazyFile",
+ "MEMFS",
+ "TTY",
+ "PIPEFS",
+ "SOCKFS",
+ "tempFixedLengthArray",
+ "miniTempWebGLFloatBuffers",
+ "miniTempWebGLIntBuffers",
+ "GL",
+ "AL",
+ "GLUT",
+ "EGL",
+ "GLEW",
+ "IDBStore",
+ "SDL",
+ "SDL_gfx",
+ "allocateUTF8",
+ "allocateUTF8OnStack",
+ "print",
+ "printErr",
+ ];
+ unexportedSymbols.forEach(unexportedRuntimeSymbol);
+
+ var calledRun;
+
+ dependenciesFulfilled = function runCaller() {
+ // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
+ if (!calledRun) run();
+ if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
+ };
+
+ function stackCheckInit() {
+ // This is normally called automatically during __wasm_call_ctors but need to
+ // get these values before even running any of the ctors so we call it redundantly
+ // here.
+ _emscripten_stack_init();
+ // TODO(sbc): Move writeStackCookie to native to to avoid this.
+ writeStackCookie();
+ }
+
+ function run() {
+ if (runDependencies > 0) {
+ return;
+ }
+
+ stackCheckInit();
+
+ preRun();
+
+ // a preRun added a dependency, run will be called later
+ if (runDependencies > 0) {
+ return;
+ }
+
+ function doRun() {
+ // run may have just been called through dependencies being fulfilled just in this very frame,
+ // or while the async setStatus time below was happening
+ if (calledRun) return;
+ calledRun = true;
+ Module["calledRun"] = true;
+
+ if (ABORT) return;
+
+ initRuntime();
+
+ readyPromiseResolve(Module);
+ Module["onRuntimeInitialized"]?.();
+
+ assert(
+ !Module["_main"],
+ 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]',
+ );
+
+ postRun();
+ }
+
+ if (Module["setStatus"]) {
+ Module["setStatus"]("Running...");
+ setTimeout(() => {
+ setTimeout(() => Module["setStatus"](""), 1);
+ doRun();
+ }, 1);
+ } else {
+ doRun();
+ }
+ checkStackCookie();
+ }
+
+ function checkUnflushedContent() {
+ // Compiler settings do not allow exiting the runtime, so flushing
+ // the streams is not possible. but in ASSERTIONS mode we check
+ // if there was something to flush, and if so tell the user they
+ // should request that the runtime be exitable.
+ // Normally we would not even include flush() at all, but in ASSERTIONS
+ // builds we do so just for this check, and here we see if there is any
+ // content to flush, that is, we check if there would have been
+ // something a non-ASSERTIONS build would have not seen.
+ // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0
+ // mode (which has its own special function for this; otherwise, all
+ // the code is inside libc)
+ var oldOut = out;
+ var oldErr = err;
+ var has = false;
+ out = err = (x) => {
+ has = true;
+ };
+ try {
+ // it doesn't matter if it fails
+ _fflush(0);
+ // also flush in the JS FS layer
+ ["stdout", "stderr"].forEach((name) => {
+ var info = FS.analyzePath("/dev/" + name);
+ if (!info) return;
+ var stream = info.object;
+ var rdev = stream.rdev;
+ var tty = TTY.ttys[rdev];
+ if (tty?.output?.length) {
+ has = true;
+ }
+ });
+ } catch (e) {}
+ out = oldOut;
+ err = oldErr;
+ if (has) {
+ warnOnce(
+ "stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.",
+ );
+ }
+ }
+
+ if (Module["preInit"]) {
+ if (typeof Module["preInit"] == "function")
+ Module["preInit"] = [Module["preInit"]];
+ while (Module["preInit"].length > 0) {
+ Module["preInit"].pop()();
+ }
+ }
+
+ run();
+
+ // end include: postamble.js
+
+ // include: postamble_modularize.js
+ // In MODULARIZE mode we wrap the generated code in a factory function
+ // and return either the Module itself, or a promise of the module.
+ //
+ // We assign to the `moduleRtn` global here and configure closure to see
+ // this as and extern so it won't get minified.
+
+ moduleRtn = readyPromise;
+
+ // Assertion for attempting to access module properties on the incoming
+ // moduleArg. In the past we used this object as the prototype of the module
+ // and assigned properties to it, but now we return a distinct object. This
+ // keeps the instance private until it is ready (i.e the promise has been
+ // resolved).
+ for (const prop of Object.keys(Module)) {
+ if (!(prop in moduleArg)) {
+ Object.defineProperty(moduleArg, prop, {
+ configurable: true,
+ get() {
+ abort(
+ `Access to module property ('${prop}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`,
+ );
+ },
+ });
+ }
+ }
+ // end include: postamble_modularize.js
+
+ return moduleRtn;
+ };
+})();
+export default Module;
diff --git a/docs/favicon.ico b/docs/favicon.ico
new file mode 100644
index 0000000..f1277ee
--- /dev/null
+++ b/docs/favicon.ico
Binary files differ
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..e48e877
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html lang="ja_JP">
+ <head>
+ <meta charset="UTF-8" />
+ <link rel="icon" type="image/vnd.microsoft.icon" href="/favicon.ico" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>PHPerKaigi 2025 デジタルサーカス株式会社トークン問題</title>
+ <script type="module" crossorigin src="/assets/index-CifHWjMi.js"></script>
+ <link rel="stylesheet" crossorigin href="/assets/index-Cfp0VNTF.css">
+ </head>
+ <body>
+ <div id="root"></div>
+ </body>
+</html>
diff --git a/docs/php-wasm.wasm b/docs/php-wasm.wasm
new file mode 100755
index 0000000..dcf4364
--- /dev/null
+++ b/docs/php-wasm.wasm
Binary files differ
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..fd1b968
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,28 @@
+import js from "@eslint/js";
+import globals from "globals";
+import reactHooks from "eslint-plugin-react-hooks";
+import reactRefresh from "eslint-plugin-react-refresh";
+import tseslint from "typescript-eslint";
+
+export default tseslint.config(
+ { ignores: ["dist"] },
+ {
+ extends: [js.configs.recommended, ...tseslint.configs.recommended],
+ files: ["**/*.{ts,tsx}"],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ plugins: {
+ "react-hooks": reactHooks,
+ "react-refresh": reactRefresh,
+ },
+ rules: {
+ ...reactHooks.configs.recommended.rules,
+ "react-refresh/only-export-components": [
+ "warn",
+ { allowConstantExport: true },
+ ],
+ },
+ },
+);
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..98c89c2
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<html lang="ja_JP">
+ <head>
+ <meta charset="UTF-8" />
+ <link rel="icon" type="image/vnd.microsoft.icon" href="/favicon.ico" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>PHPerKaigi 2025 デジタルサーカス株式会社トークン問題</title>
+ </head>
+ <body>
+ <div id="root"></div>
+ <script type="module" src="/src/main.tsx"></script>
+ </body>
+</html>
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..b5e5462
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3420 @@
+{
+ "name": "PHPerKaigi2025-tokens",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "PHPerKaigi2025-tokens",
+ "version": "0.1.0",
+ "dependencies": {
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "use-debounce": "^10.0.4"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "1.9.4",
+ "@eslint/js": "^9.17.0",
+ "@types/react": "^18.3.18",
+ "@types/react-dom": "^18.3.5",
+ "@vitejs/plugin-react": "^4.3.4",
+ "eslint": "^9.17.0",
+ "eslint-plugin-react-hooks": "^5.0.0",
+ "eslint-plugin-react-refresh": "^0.4.16",
+ "globals": "^15.14.0",
+ "typescript": "~5.6.2",
+ "typescript-eslint": "^8.18.2",
+ "vite": "^6.0.5"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
+ "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
+ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.10",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.10",
+ "@babel/parser": "^7.26.10",
+ "@babel/template": "^7.26.9",
+ "@babel/traverse": "^7.26.10",
+ "@babel/types": "^7.26.10",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz",
+ "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.26.10",
+ "@babel/types": "^7.26.10",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz",
+ "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.10"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
+ "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.10"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
+ "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
+ "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
+ "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/parser": "^7.26.9",
+ "@babel/types": "^7.26.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz",
+ "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.10",
+ "@babel/parser": "^7.26.10",
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.10",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
+ "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@biomejs/biome": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz",
+ "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT OR Apache-2.0",
+ "bin": {
+ "biome": "bin/biome"
+ },
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/biome"
+ },
+ "optionalDependencies": {
+ "@biomejs/cli-darwin-arm64": "1.9.4",
+ "@biomejs/cli-darwin-x64": "1.9.4",
+ "@biomejs/cli-linux-arm64": "1.9.4",
+ "@biomejs/cli-linux-arm64-musl": "1.9.4",
+ "@biomejs/cli-linux-x64": "1.9.4",
+ "@biomejs/cli-linux-x64-musl": "1.9.4",
+ "@biomejs/cli-win32-arm64": "1.9.4",
+ "@biomejs/cli-win32-x64": "1.9.4"
+ }
+ },
+ "node_modules/@biomejs/cli-darwin-arm64": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz",
+ "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-darwin-x64": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz",
+ "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-arm64": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz",
+ "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-arm64-musl": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz",
+ "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-x64": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz",
+ "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-x64-musl": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz",
+ "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-win32-arm64": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz",
+ "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-win32-x64": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz",
+ "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
+ "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
+ "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
+ "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
+ "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
+ "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
+ "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
+ "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
+ "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
+ "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
+ "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
+ "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
+ "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
+ "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
+ "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
+ "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz",
+ "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
+ "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
+ "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
+ "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
+ "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz",
+ "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz",
+ "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.1.0.tgz",
+ "integrity": "sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
+ "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz",
+ "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.22.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz",
+ "integrity": "sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz",
+ "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.12.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
+ "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz",
+ "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz",
+ "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz",
+ "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz",
+ "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz",
+ "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz",
+ "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz",
+ "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz",
+ "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz",
+ "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz",
+ "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz",
+ "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz",
+ "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz",
+ "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz",
+ "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz",
+ "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz",
+ "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz",
+ "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz",
+ "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz",
+ "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.18",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz",
+ "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.5",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz",
+ "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.26.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz",
+ "integrity": "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.26.1",
+ "@typescript-eslint/type-utils": "8.26.1",
+ "@typescript-eslint/utils": "8.26.1",
+ "@typescript-eslint/visitor-keys": "8.26.1",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.26.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz",
+ "integrity": "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.26.1",
+ "@typescript-eslint/types": "8.26.1",
+ "@typescript-eslint/typescript-estree": "8.26.1",
+ "@typescript-eslint/visitor-keys": "8.26.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.26.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz",
+ "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.26.1",
+ "@typescript-eslint/visitor-keys": "8.26.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.26.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz",
+ "integrity": "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "8.26.1",
+ "@typescript-eslint/utils": "8.26.1",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.26.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz",
+ "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.26.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz",
+ "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.26.1",
+ "@typescript-eslint/visitor-keys": "8.26.1",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.26.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz",
+ "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "8.26.1",
+ "@typescript-eslint/types": "8.26.1",
+ "@typescript-eslint/typescript-estree": "8.26.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.26.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz",
+ "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.26.1",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
+ "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.26.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-source": "^7.25.9",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.14.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001705",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz",
+ "integrity": "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.119",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.119.tgz",
+ "integrity": "sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
+ "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.1",
+ "@esbuild/android-arm": "0.25.1",
+ "@esbuild/android-arm64": "0.25.1",
+ "@esbuild/android-x64": "0.25.1",
+ "@esbuild/darwin-arm64": "0.25.1",
+ "@esbuild/darwin-x64": "0.25.1",
+ "@esbuild/freebsd-arm64": "0.25.1",
+ "@esbuild/freebsd-x64": "0.25.1",
+ "@esbuild/linux-arm": "0.25.1",
+ "@esbuild/linux-arm64": "0.25.1",
+ "@esbuild/linux-ia32": "0.25.1",
+ "@esbuild/linux-loong64": "0.25.1",
+ "@esbuild/linux-mips64el": "0.25.1",
+ "@esbuild/linux-ppc64": "0.25.1",
+ "@esbuild/linux-riscv64": "0.25.1",
+ "@esbuild/linux-s390x": "0.25.1",
+ "@esbuild/linux-x64": "0.25.1",
+ "@esbuild/netbsd-arm64": "0.25.1",
+ "@esbuild/netbsd-x64": "0.25.1",
+ "@esbuild/openbsd-arm64": "0.25.1",
+ "@esbuild/openbsd-x64": "0.25.1",
+ "@esbuild/sunos-x64": "0.25.1",
+ "@esbuild/win32-arm64": "0.25.1",
+ "@esbuild/win32-ia32": "0.25.1",
+ "@esbuild/win32-x64": "0.25.1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.22.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz",
+ "integrity": "sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.19.2",
+ "@eslint/config-helpers": "^0.1.0",
+ "@eslint/core": "^0.12.0",
+ "@eslint/eslintrc": "^3.3.0",
+ "@eslint/js": "9.22.0",
+ "@eslint/plugin-kit": "^0.2.7",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.3.0",
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz",
+ "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
+ "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz",
+ "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz",
+ "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.36.0",
+ "@rollup/rollup-android-arm64": "4.36.0",
+ "@rollup/rollup-darwin-arm64": "4.36.0",
+ "@rollup/rollup-darwin-x64": "4.36.0",
+ "@rollup/rollup-freebsd-arm64": "4.36.0",
+ "@rollup/rollup-freebsd-x64": "4.36.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.36.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.36.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.36.0",
+ "@rollup/rollup-linux-arm64-musl": "4.36.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.36.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.36.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.36.0",
+ "@rollup/rollup-linux-x64-gnu": "4.36.0",
+ "@rollup/rollup-linux-x64-musl": "4.36.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.36.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.36.0",
+ "@rollup/rollup-win32-x64-msvc": "4.36.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz",
+ "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.26.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.1.tgz",
+ "integrity": "sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.26.1",
+ "@typescript-eslint/parser": "8.26.1",
+ "@typescript-eslint/utils": "8.26.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-debounce": {
+ "version": "10.0.4",
+ "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.4.tgz",
+ "integrity": "sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/vite": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz",
+ "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "postcss": "^8.5.3",
+ "rollup": "^4.30.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..7c8ed8e
--- /dev/null
+++ b/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "PHPerKaigi2025-tokens",
+ "private": true,
+ "version": "0.1.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "format": "biome format --write .",
+ "lint": "eslint .",
+ "tsc": "tsc --noEmit",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "use-debounce": "^10.0.4"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "1.9.4",
+ "@eslint/js": "^9.17.0",
+ "@types/react": "^18.3.18",
+ "@types/react-dom": "^18.3.5",
+ "@vitejs/plugin-react": "^4.3.4",
+ "eslint": "^9.17.0",
+ "eslint-plugin-react-hooks": "^5.0.0",
+ "eslint-plugin-react-refresh": "^0.4.16",
+ "globals": "^15.14.0",
+ "typescript": "~5.6.2",
+ "typescript-eslint": "^8.18.2",
+ "vite": "^6.0.5"
+ }
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..f1277ee
--- /dev/null
+++ b/public/favicon.ico
Binary files differ
diff --git a/public/php-wasm.wasm b/public/php-wasm.wasm
new file mode 100755
index 0000000..dcf4364
--- /dev/null
+++ b/public/php-wasm.wasm
Binary files differ
diff --git a/src/components/App.tsx b/src/components/App.tsx
new file mode 100644
index 0000000..aa2a386
--- /dev/null
+++ b/src/components/App.tsx
@@ -0,0 +1,72 @@
+import type { QuizGroup } from "../quiz";
+import QuizGroupSection from "./QuizGroupSection";
+
+type Props = {
+ quizGroups: QuizGroup[];
+};
+
+function App({ quizGroups }: Props) {
+ return (
+ <table id="layout">
+ <tr>
+ <td id="header" colSpan={2} className="marquee">
+ <span>PHPerKaigi 2025 デジタルサーカス株式会社トークン問題</span>
+ </td>
+ </tr>
+ <tr>
+ <td id="sidebar">
+ <h2>メニュー</h2>
+ <ul>
+ <li>
+ <a href="">ホーム</a>
+ </li>
+ <li>
+ <a
+ href="https://github.com/nsfisis/PHPerKaigi2024-tokens"
+ target="_blank"
+ >
+ トークン問題2024
+ </a>
+ </li>
+ <li>
+ <a
+ href="https://github.com/nsfisis/PHPerKaigi2023-tokens"
+ target="_blank"
+ >
+ トークン問題2023
+ </a>
+ </li>
+ <li>
+ <a
+ href="https://github.com/nsfisis/PHPerKaigi2022-tokens"
+ target="_blank"
+ >
+ トークン問題2022
+ </a>
+ </li>
+ <li className="hidden">ここにトークンはないよ</li>
+ </ul>
+ </td>
+ <td id="content">
+ <main>
+ <p>
+ PHPerKaigi 2025 の PHPer チャレンジ企画において、
+ <a href="https://www.dgcircus.com/">デジタルサーカス株式会社</a>
+ から出題するトークン問題です (作問{" "}
+ <a href="https://x.com/nsfisis">@nsfisis</a>)。
+ </p>
+ <p>
+ それぞれの問題に、PHP の標準関数がひとつ設定されています。
+ 好きな引数を渡すと実行されます。その実行結果を見て、何の関数かを当ててください。
+ </p>
+ {quizGroups.map((group) => (
+ <QuizGroupSection key={group.label} quizGroup={group} />
+ ))}
+ </main>
+ </td>
+ </tr>
+ </table>
+ );
+}
+
+export default App;
diff --git a/src/components/FuncExpectedAnswer.tsx b/src/components/FuncExpectedAnswer.tsx
new file mode 100644
index 0000000..f412ba5
--- /dev/null
+++ b/src/components/FuncExpectedAnswer.tsx
@@ -0,0 +1,59 @@
+import type { Quiz } from "../quiz";
+import { execPHP } from "../exec_php";
+import React, { useState, useEffect } from "react";
+import { useDebounce } from "use-debounce";
+
+type Props = {
+ quiz: Quiz;
+};
+
+function FuncExpectedAnswer({ quiz }: Props) {
+ const [argument, setArgument] = useState<string>("123");
+ const [debouncedArgument] = useDebounce(argument, 1000);
+ const [result, setResult] = useState<string>("");
+ const [loading, setLoading] = useState<boolean>(true);
+
+ const handleArgumentChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+ setArgument(e.target.value);
+ };
+
+ useEffect(() => {
+ if (debouncedArgument === "") {
+ setResult("<empty>");
+ return;
+ }
+
+ setLoading(true);
+ setResult("");
+
+ const code = `
+ function f($x) {
+ return ${quiz.func}($x);
+ }
+ try {
+ var_dump(f(${debouncedArgument}));
+ } catch (\\Throwable $e) {
+ echo $e->getMessage(), PHP_EOL;
+ }
+ `;
+
+ execPHP(code).then((result) => {
+ const output = result.stdout + result.stderr;
+ setResult(output.replaceAll(quiz.func, "<answer is masked>"));
+ setLoading(false);
+ });
+ }, [debouncedArgument, quiz.func]);
+
+ return (
+ <div>
+ <code>
+ {`f(`}
+ <input type="text" value={argument} onChange={handleArgumentChange} />
+ {`)`}
+ </code>
+ は <code>{loading ? "running..." : result}</code> を返す。
+ </div>
+ );
+}
+
+export default FuncExpectedAnswer;
diff --git a/src/components/FuncMyAnswer.tsx b/src/components/FuncMyAnswer.tsx
new file mode 100644
index 0000000..63cd427
--- /dev/null
+++ b/src/components/FuncMyAnswer.tsx
@@ -0,0 +1,32 @@
+import type { Quiz } from "../quiz";
+import React, { useState } from "react";
+import { useDebounce } from "use-debounce";
+
+type Props = {
+ quiz: Quiz;
+};
+
+const INITIAL_ANSWER = "your_answer";
+
+function FuncMyAnswer({ quiz }: Props) {
+ const [answer, setAnswer] = useState<string>(INITIAL_ANSWER);
+ const [debouncedAnswer] = useDebounce(answer, 500);
+ const hasAnyAnswer = debouncedAnswer !== INITIAL_ANSWER;
+ const isCorrectAnswer = debouncedAnswer === quiz.func;
+
+ const handleAnswerChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+ setAnswer(e.target.value);
+ };
+
+ return (
+ <div>
+ この関数は?
+ <input type="text" value={answer} onChange={handleAnswerChange} />
+ <p>
+ {hasAnyAnswer && (isCorrectAnswer ? `正解!${quiz.message}` : "不正解")}
+ </p>
+ </div>
+ );
+}
+
+export default FuncMyAnswer;
diff --git a/src/components/QuizGroupSection.tsx b/src/components/QuizGroupSection.tsx
new file mode 100644
index 0000000..b2bbee7
--- /dev/null
+++ b/src/components/QuizGroupSection.tsx
@@ -0,0 +1,19 @@
+import type { QuizGroup } from "../quiz";
+import QuizSection from "./QuizSection";
+
+type Props = {
+ quizGroup: QuizGroup;
+};
+
+function QuizGroupSection({ quizGroup }: Props) {
+ return (
+ <section>
+ <h2>{quizGroup.label}</h2>
+ {quizGroup.quizzes.map((quiz) => (
+ <QuizSection key={quiz.label} quiz={quiz} />
+ ))}
+ </section>
+ );
+}
+
+export default QuizGroupSection;
diff --git a/src/components/QuizSection.tsx b/src/components/QuizSection.tsx
new file mode 100644
index 0000000..27dc384
--- /dev/null
+++ b/src/components/QuizSection.tsx
@@ -0,0 +1,19 @@
+import type { Quiz } from "../quiz";
+import FuncExpectedAnswer from "./FuncExpectedAnswer";
+import FuncMyAnswer from "./FuncMyAnswer";
+
+type Props = {
+ quiz: Quiz;
+};
+
+function QuizSection({ quiz }: Props) {
+ return (
+ <section>
+ <h3>{quiz.label}</h3>
+ <FuncExpectedAnswer quiz={quiz} />
+ <FuncMyAnswer quiz={quiz} />
+ </section>
+ );
+}
+
+export default QuizSection;
diff --git a/src/exec_php.ts b/src/exec_php.ts
new file mode 100644
index 0000000..3c38cf4
--- /dev/null
+++ b/src/exec_php.ts
@@ -0,0 +1,95 @@
+import phpWasmBridgeUrl from "./php-wasm-bridge.js?url";
+
+export type PHPExecResult = {
+ success: boolean;
+ stdout: string;
+ stderr: string;
+};
+
+const BUFFER_MAX = 1024;
+
+let fetchingWasmBinaryPromise: Promise<ArrayBuffer> | null = null;
+
+// Fetching is performed only once.
+async function fetchWasmBinary(): Promise<ArrayBuffer> {
+ if (!fetchingWasmBinaryPromise) {
+ fetchingWasmBinaryPromise = new Promise((resolve, reject) => {
+ fetch("/php-wasm.wasm")
+ .then((res) => {
+ if (!res.ok) {
+ reject(`Failed to fetch wasm binary: ${res.status} (${res.url})`);
+ }
+ return res;
+ })
+ .then((res) => res.arrayBuffer())
+ .then((buf) => resolve(buf));
+ });
+ }
+ return fetchingWasmBinaryPromise;
+}
+
+export async function execPHP(code: string): Promise<PHPExecResult> {
+ let stdinPos = 0; // bytewise
+ const stdinBuf = new TextEncoder().encode(code);
+ let stdoutPos = 0; // bytewise
+ const stdoutBuf = new Uint8Array(BUFFER_MAX);
+ let stderrPos = 0; // bytewise
+ const stderrBuf = new Uint8Array(BUFFER_MAX);
+
+ const { default: PHPWasm } = await import(
+ /* @vite-ignore */ phpWasmBridgeUrl
+ );
+ const { ccall } = await PHPWasm({
+ wasmBinary: await fetchWasmBinary(),
+ stdin: () => {
+ if (stdinBuf.length <= stdinPos) {
+ return null;
+ }
+ return stdinBuf[stdinPos++];
+ },
+ stdout: (asciiCode: number | null) => {
+ if (asciiCode === null) {
+ return; // flush
+ }
+ if (BUFFER_MAX <= stdoutPos) {
+ return; // ignore
+ }
+ if (asciiCode < 0) {
+ asciiCode += 256;
+ }
+ stdoutBuf[stdoutPos++] = asciiCode;
+ },
+ stderr: (asciiCode: number | null) => {
+ if (asciiCode === null) {
+ return; // flush
+ }
+ if (BUFFER_MAX <= stderrPos) {
+ return; // ignore
+ }
+ if (asciiCode < 0) {
+ asciiCode += 256;
+ }
+ stderrBuf[stderrPos++] = asciiCode;
+ },
+ });
+
+ let result;
+ let extraError = null;
+ try {
+ result = ccall("php_wasm_run", "number", ["string"], [code]);
+ } catch (e) {
+ if (e instanceof WebAssembly.RuntimeError) {
+ extraError = e.message;
+ } else {
+ throw e;
+ }
+ }
+ const stdout = new TextDecoder().decode(stdoutBuf.subarray(0, stdoutPos));
+ const stderr = new TextDecoder().decode(stderrBuf.subarray(0, stderrPos));
+
+ return {
+ success: result === 0,
+ stdout,
+ stderr: extraError == null ? stderr : `${stderr}\n${extraError}`,
+ };
+}
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 0000000..6e65eda
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,11 @@
+import { StrictMode } from "react";
+import { createRoot } from "react-dom/client";
+import App from "./components/App.tsx";
+import { QUIZ_GROUPS } from "./quiz_data";
+import "./styles.css";
+
+createRoot(document.getElementById("root")!).render(
+ <StrictMode>
+ <App quizGroups={QUIZ_GROUPS} />
+ </StrictMode>,
+);
diff --git a/src/php-wasm-bridge.js b/src/php-wasm-bridge.js
new file mode 100644
index 0000000..fbf574b
--- /dev/null
+++ b/src/php-wasm-bridge.js
@@ -0,0 +1,8366 @@
+var Module = (() => {
+ var _scriptName = import.meta.url;
+
+ return function (moduleArg = {}) {
+ var moduleRtn;
+
+ // include: shell.js
+ // The Module object: Our interface to the outside world. We import
+ // and export values on it. There are various ways Module can be used:
+ // 1. Not defined. We create it here
+ // 2. A function parameter, function(moduleArg) => Promise<Module>
+ // 3. pre-run appended it, var Module = {}; ..generated code..
+ // 4. External script tag defines var Module.
+ // We need to check if Module already exists (e.g. case 3 above).
+ // Substitution will be replaced with actual code on later stage of the build,
+ // this way Closure Compiler will not mangle it (e.g. case 4. above).
+ // Note that if you want to run closure, and also to use Module
+ // after the generated code, you will need to define var Module = {};
+ // before the code. Then that object will be used in the code, and you
+ // can continue to use Module afterwards as well.
+ var Module = moduleArg;
+
+ // Set up the promise that indicates the Module is initialized
+ var readyPromiseResolve, readyPromiseReject;
+ var readyPromise = new Promise((resolve, reject) => {
+ readyPromiseResolve = resolve;
+ readyPromiseReject = reject;
+ });
+ [
+ "_memory",
+ "_php_wasm_run",
+ "___indirect_function_table",
+ "onRuntimeInitialized",
+ ].forEach((prop) => {
+ if (!Object.getOwnPropertyDescriptor(readyPromise, prop)) {
+ Object.defineProperty(readyPromise, prop, {
+ get: () =>
+ abort(
+ "You are getting " +
+ prop +
+ " on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js",
+ ),
+ set: () =>
+ abort(
+ "You are setting " +
+ prop +
+ " on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js",
+ ),
+ });
+ }
+ });
+
+ // Determine the runtime environment we are in. You can customize this by
+ // setting the ENVIRONMENT setting at compile time (see settings.js).
+
+ var ENVIRONMENT_IS_WEB = true;
+ var ENVIRONMENT_IS_WORKER = false;
+ var ENVIRONMENT_IS_NODE = false;
+ var ENVIRONMENT_IS_SHELL = false;
+
+ // --pre-jses are emitted after the Module integration code, so that they can
+ // refer to Module (if they choose; they can also define Module)
+
+ // Sometimes an existing Module object exists with properties
+ // meant to overwrite the default module functionality. Here
+ // we collect those properties and reapply _after_ we configure
+ // the current environment's defaults to avoid having to be so
+ // defensive during initialization.
+ var moduleOverrides = Object.assign({}, Module);
+
+ var arguments_ = [];
+ var thisProgram = "./this.program";
+ var quit_ = (status, toThrow) => {
+ throw toThrow;
+ };
+
+ // `/` should be present at the end if `scriptDirectory` is not empty
+ var scriptDirectory = "";
+ function locateFile(path) {
+ if (Module["locateFile"]) {
+ return Module["locateFile"](path, scriptDirectory);
+ }
+ return scriptDirectory + path;
+ }
+
+ // Hooks that are implemented differently in different runtime environments.
+ var readAsync, readBinary;
+
+ if (ENVIRONMENT_IS_SHELL) {
+ if (
+ (typeof process == "object" && typeof require === "function") ||
+ typeof window == "object" ||
+ typeof WorkerGlobalScope != "undefined"
+ )
+ throw new Error(
+ "not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)",
+ );
+ }
+
+ // Note that this includes Node.js workers when relevant (pthreads is enabled).
+ // Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
+ // ENVIRONMENT_IS_NODE.
+ else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
+ if (ENVIRONMENT_IS_WORKER) {
+ // Check worker, not web, since window could be polyfilled
+ scriptDirectory = self.location.href;
+ } else if (typeof document != "undefined" && document.currentScript) {
+ // web
+ scriptDirectory = document.currentScript.src;
+ }
+ // When MODULARIZE, this JS may be executed later, after document.currentScript
+ // is gone, so we saved it, and we use it here instead of any other info.
+ if (_scriptName) {
+ scriptDirectory = _scriptName;
+ }
+ // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.
+ // otherwise, slice off the final part of the url to find the script directory.
+ // if scriptDirectory does not contain a slash, lastIndexOf will return -1,
+ // and scriptDirectory will correctly be replaced with an empty string.
+ // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),
+ // they are removed because they could contain a slash.
+ if (scriptDirectory.startsWith("blob:")) {
+ scriptDirectory = "";
+ } else {
+ scriptDirectory = scriptDirectory.substr(
+ 0,
+ scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1,
+ );
+ }
+
+ if (
+ !(typeof window == "object" || typeof WorkerGlobalScope != "undefined")
+ )
+ throw new Error(
+ "not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)",
+ );
+
+ {
+ // include: web_or_worker_shell_read.js
+ readAsync = async (url) => {
+ assert(!isFileURI(url), "readAsync does not work with file:// URLs");
+ var response = await fetch(url, { credentials: "same-origin" });
+ if (response.ok) {
+ return response.arrayBuffer();
+ }
+ throw new Error(response.status + " : " + response.url);
+ };
+ // end include: web_or_worker_shell_read.js
+ }
+ } else {
+ throw new Error("environment detection error");
+ }
+
+ var out = Module["print"] || console.log.bind(console);
+ var err = Module["printErr"] || console.error.bind(console);
+
+ // Merge back in the overrides
+ Object.assign(Module, moduleOverrides);
+ // Free the object hierarchy contained in the overrides, this lets the GC
+ // reclaim data used.
+ moduleOverrides = null;
+ checkIncomingModuleAPI();
+
+ // Emit code to handle expected values on the Module object. This applies Module.x
+ // to the proper local x. This has two benefits: first, we only emit it if it is
+ // expected to arrive, and second, by using a local everywhere else that can be
+ // minified.
+
+ if (Module["arguments"]) arguments_ = Module["arguments"];
+ legacyModuleProp("arguments", "arguments_");
+
+ if (Module["thisProgram"]) thisProgram = Module["thisProgram"];
+ legacyModuleProp("thisProgram", "thisProgram");
+
+ // perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
+ // Assertions on removed incoming Module JS APIs.
+ assert(
+ typeof Module["memoryInitializerPrefixURL"] == "undefined",
+ "Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead",
+ );
+ assert(
+ typeof Module["pthreadMainPrefixURL"] == "undefined",
+ "Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead",
+ );
+ assert(
+ typeof Module["cdInitializerPrefixURL"] == "undefined",
+ "Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead",
+ );
+ assert(
+ typeof Module["filePackagePrefixURL"] == "undefined",
+ "Module.filePackagePrefixURL option was removed, use Module.locateFile instead",
+ );
+ assert(
+ typeof Module["read"] == "undefined",
+ "Module.read option was removed",
+ );
+ assert(
+ typeof Module["readAsync"] == "undefined",
+ "Module.readAsync option was removed (modify readAsync in JS)",
+ );
+ assert(
+ typeof Module["readBinary"] == "undefined",
+ "Module.readBinary option was removed (modify readBinary in JS)",
+ );
+ assert(
+ typeof Module["setWindowTitle"] == "undefined",
+ "Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)",
+ );
+ assert(
+ typeof Module["TOTAL_MEMORY"] == "undefined",
+ "Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY",
+ );
+ legacyModuleProp("asm", "wasmExports");
+ legacyModuleProp("readAsync", "readAsync");
+ legacyModuleProp("readBinary", "readBinary");
+ legacyModuleProp("setWindowTitle", "setWindowTitle");
+ var IDBFS = "IDBFS is no longer included by default; build with -lidbfs.js";
+ var PROXYFS =
+ "PROXYFS is no longer included by default; build with -lproxyfs.js";
+ var WORKERFS =
+ "WORKERFS is no longer included by default; build with -lworkerfs.js";
+ var FETCHFS =
+ "FETCHFS is no longer included by default; build with -lfetchfs.js";
+ var ICASEFS =
+ "ICASEFS is no longer included by default; build with -licasefs.js";
+ var JSFILEFS =
+ "JSFILEFS is no longer included by default; build with -ljsfilefs.js";
+ var OPFS = "OPFS is no longer included by default; build with -lopfs.js";
+
+ var NODEFS =
+ "NODEFS is no longer included by default; build with -lnodefs.js";
+
+ assert(
+ !ENVIRONMENT_IS_WORKER,
+ "worker environment detected but not enabled at build time. Add `worker` to `-sENVIRONMENT` to enable.",
+ );
+
+ assert(
+ !ENVIRONMENT_IS_NODE,
+ "node environment detected but not enabled at build time. Add `node` to `-sENVIRONMENT` to enable.",
+ );
+
+ assert(
+ !ENVIRONMENT_IS_SHELL,
+ "shell environment detected but not enabled at build time. Add `shell` to `-sENVIRONMENT` to enable.",
+ );
+
+ // end include: shell.js
+
+ // include: preamble.js
+ // === Preamble library stuff ===
+
+ // Documentation for the public APIs defined in this file must be updated in:
+ // site/source/docs/api_reference/preamble.js.rst
+ // A prebuilt local version of the documentation is available at:
+ // site/build/text/docs/api_reference/preamble.js.txt
+ // You can also build docs locally as HTML or other formats in site/
+ // An online HTML version (which may be of a different version of Emscripten)
+ // is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
+
+ var wasmBinary = Module["wasmBinary"];
+ legacyModuleProp("wasmBinary", "wasmBinary");
+
+ if (typeof WebAssembly != "object") {
+ err("no native wasm support detected");
+ }
+
+ // Wasm globals
+
+ var wasmMemory;
+
+ //========================================
+ // Runtime essentials
+ //========================================
+
+ // whether we are quitting the application. no code should run after this.
+ // set in exit() and abort()
+ var ABORT = false;
+
+ // set by exit() and abort(). Passed to 'onExit' handler.
+ // NOTE: This is also used as the process return code code in shell environments
+ // but only when noExitRuntime is false.
+ var EXITSTATUS;
+
+ // In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we
+ // don't define it at all in release modes. This matches the behaviour of
+ // MINIMAL_RUNTIME.
+ // TODO(sbc): Make this the default even without STRICT enabled.
+ /** @type {function(*, string=)} */
+ function assert(condition, text) {
+ if (!condition) {
+ abort("Assertion failed" + (text ? ": " + text : ""));
+ }
+ }
+
+ // We used to include malloc/free by default in the past. Show a helpful error in
+ // builds with assertions.
+ function _free() {
+ // Show a helpful error since we used to include free by default in the past.
+ abort(
+ "free() called but not included in the build - add `_free` to EXPORTED_FUNCTIONS",
+ );
+ }
+
+ // Memory management
+
+ var HEAP,
+ /** @type {!Int8Array} */
+ HEAP8,
+ /** @type {!Uint8Array} */
+ HEAPU8,
+ /** @type {!Int16Array} */
+ HEAP16,
+ /** @type {!Uint16Array} */
+ HEAPU16,
+ /** @type {!Int32Array} */
+ HEAP32,
+ /** @type {!Uint32Array} */
+ HEAPU32,
+ /** @type {!Float32Array} */
+ HEAPF32,
+ /** @type {!Float64Array} */
+ HEAPF64;
+
+ // include: runtime_shared.js
+ function updateMemoryViews() {
+ var b = wasmMemory.buffer;
+ Module["HEAP8"] = HEAP8 = new Int8Array(b);
+ Module["HEAP16"] = HEAP16 = new Int16Array(b);
+ Module["HEAPU8"] = HEAPU8 = new Uint8Array(b);
+ Module["HEAPU16"] = HEAPU16 = new Uint16Array(b);
+ Module["HEAP32"] = HEAP32 = new Int32Array(b);
+ Module["HEAPU32"] = HEAPU32 = new Uint32Array(b);
+ Module["HEAPF32"] = HEAPF32 = new Float32Array(b);
+ Module["HEAPF64"] = HEAPF64 = new Float64Array(b);
+ }
+
+ // end include: runtime_shared.js
+ assert(
+ !Module["STACK_SIZE"],
+ "STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time",
+ );
+
+ assert(
+ typeof Int32Array != "undefined" &&
+ typeof Float64Array !== "undefined" &&
+ Int32Array.prototype.subarray != undefined &&
+ Int32Array.prototype.set != undefined,
+ "JS engine does not provide full typed array support",
+ );
+
+ // If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY
+ assert(
+ !Module["wasmMemory"],
+ "Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally",
+ );
+ assert(
+ !Module["INITIAL_MEMORY"],
+ "Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically",
+ );
+
+ // include: runtime_stack_check.js
+ // Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
+ function writeStackCookie() {
+ var max = _emscripten_stack_get_end();
+ assert((max & 3) == 0);
+ // If the stack ends at address zero we write our cookies 4 bytes into the
+ // stack. This prevents interference with SAFE_HEAP and ASAN which also
+ // monitor writes to address zero.
+ if (max == 0) {
+ max += 4;
+ }
+ // The stack grow downwards towards _emscripten_stack_get_end.
+ // We write cookies to the final two words in the stack and detect if they are
+ // ever overwritten.
+ HEAPU32[max >> 2] = 0x02135467;
+ HEAPU32[(max + 4) >> 2] = 0x89bacdfe;
+ // Also test the global address 0 for integrity.
+ HEAPU32[0 >> 2] = 1668509029;
+ }
+
+ function checkStackCookie() {
+ if (ABORT) return;
+ var max = _emscripten_stack_get_end();
+ // See writeStackCookie().
+ if (max == 0) {
+ max += 4;
+ }
+ var cookie1 = HEAPU32[max >> 2];
+ var cookie2 = HEAPU32[(max + 4) >> 2];
+ if (cookie1 != 0x02135467 || cookie2 != 0x89bacdfe) {
+ abort(
+ `Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`,
+ );
+ }
+ // Also test the global address 0 for integrity.
+ if (HEAPU32[0 >> 2] != 0x63736d65 /* 'emsc' */) {
+ abort(
+ "Runtime error: The application has corrupted its heap memory area (address zero)!",
+ );
+ }
+ }
+ // end include: runtime_stack_check.js
+ var __ATPRERUN__ = []; // functions called before the runtime is initialized
+ var __ATINIT__ = []; // functions called during startup
+ var __ATEXIT__ = []; // functions called during shutdown
+ var __ATPOSTRUN__ = []; // functions called after the main() is called
+
+ var runtimeInitialized = false;
+
+ function preRun() {
+ if (Module["preRun"]) {
+ if (typeof Module["preRun"] == "function")
+ Module["preRun"] = [Module["preRun"]];
+ while (Module["preRun"].length) {
+ addOnPreRun(Module["preRun"].shift());
+ }
+ }
+ callRuntimeCallbacks(__ATPRERUN__);
+ }
+
+ function initRuntime() {
+ assert(!runtimeInitialized);
+ runtimeInitialized = true;
+
+ checkStackCookie();
+
+ if (!Module["noFSInit"] && !FS.initialized) FS.init();
+ FS.ignorePermissions = false;
+
+ TTY.init();
+ SOCKFS.root = FS.mount(SOCKFS, {}, null);
+ PIPEFS.root = FS.mount(PIPEFS, {}, null);
+ callRuntimeCallbacks(__ATINIT__);
+ }
+
+ function postRun() {
+ checkStackCookie();
+
+ if (Module["postRun"]) {
+ if (typeof Module["postRun"] == "function")
+ Module["postRun"] = [Module["postRun"]];
+ while (Module["postRun"].length) {
+ addOnPostRun(Module["postRun"].shift());
+ }
+ }
+
+ callRuntimeCallbacks(__ATPOSTRUN__);
+ }
+
+ function addOnPreRun(cb) {
+ __ATPRERUN__.unshift(cb);
+ }
+
+ function addOnInit(cb) {
+ __ATINIT__.unshift(cb);
+ }
+
+ function addOnExit(cb) {}
+
+ function addOnPostRun(cb) {
+ __ATPOSTRUN__.unshift(cb);
+ }
+
+ // include: runtime_math.js
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
+
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc
+
+ assert(
+ Math.imul,
+ "This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill",
+ );
+ assert(
+ Math.fround,
+ "This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill",
+ );
+ assert(
+ Math.clz32,
+ "This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill",
+ );
+ assert(
+ Math.trunc,
+ "This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill",
+ );
+ // end include: runtime_math.js
+ // A counter of dependencies for calling run(). If we need to
+ // do asynchronous work before running, increment this and
+ // decrement it. Incrementing must happen in a place like
+ // Module.preRun (used by emcc to add file preloading).
+ // Note that you can add dependencies in preRun, even though
+ // it happens right before run - run will be postponed until
+ // the dependencies are met.
+ var runDependencies = 0;
+ var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
+ var runDependencyTracking = {};
+ var runDependencyWatcher = null;
+
+ function getUniqueRunDependency(id) {
+ var orig = id;
+ while (1) {
+ if (!runDependencyTracking[id]) return id;
+ id = orig + Math.random();
+ }
+ }
+
+ function addRunDependency(id) {
+ runDependencies++;
+
+ Module["monitorRunDependencies"]?.(runDependencies);
+
+ if (id) {
+ assert(!runDependencyTracking[id]);
+ runDependencyTracking[id] = 1;
+ if (
+ runDependencyWatcher === null &&
+ typeof setInterval != "undefined"
+ ) {
+ // Check for missing dependencies every few seconds
+ runDependencyWatcher = setInterval(() => {
+ if (ABORT) {
+ clearInterval(runDependencyWatcher);
+ runDependencyWatcher = null;
+ return;
+ }
+ var shown = false;
+ for (var dep in runDependencyTracking) {
+ if (!shown) {
+ shown = true;
+ err("still waiting on run dependencies:");
+ }
+ err(`dependency: ${dep}`);
+ }
+ if (shown) {
+ err("(end of list)");
+ }
+ }, 10000);
+ }
+ } else {
+ err("warning: run dependency added without ID");
+ }
+ }
+
+ function removeRunDependency(id) {
+ runDependencies--;
+
+ Module["monitorRunDependencies"]?.(runDependencies);
+
+ if (id) {
+ assert(runDependencyTracking[id]);
+ delete runDependencyTracking[id];
+ } else {
+ err("warning: run dependency removed without ID");
+ }
+ if (runDependencies == 0) {
+ if (runDependencyWatcher !== null) {
+ clearInterval(runDependencyWatcher);
+ runDependencyWatcher = null;
+ }
+ if (dependenciesFulfilled) {
+ var callback = dependenciesFulfilled;
+ dependenciesFulfilled = null;
+ callback(); // can add another dependenciesFulfilled
+ }
+ }
+ }
+
+ /** @param {string|number=} what */
+ function abort(what) {
+ Module["onAbort"]?.(what);
+
+ what = "Aborted(" + what + ")";
+ // TODO(sbc): Should we remove printing and leave it up to whoever
+ // catches the exception?
+ err(what);
+
+ ABORT = true;
+
+ // Use a wasm runtime error, because a JS error might be seen as a foreign
+ // exception, which means we'd run destructors on it. We need the error to
+ // simply make the program stop.
+ // FIXME This approach does not work in Wasm EH because it currently does not assume
+ // all RuntimeErrors are from traps; it decides whether a RuntimeError is from
+ // a trap or not based on a hidden field within the object. So at the moment
+ // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that
+ // allows this in the wasm spec.
+
+ // Suppress closure compiler warning here. Closure compiler's builtin extern
+ // definition for WebAssembly.RuntimeError claims it takes no arguments even
+ // though it can.
+ // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.
+ /** @suppress {checkTypes} */
+ var e = new WebAssembly.RuntimeError(what);
+
+ readyPromiseReject(e);
+ // Throw the error whether or not MODULARIZE is set because abort is used
+ // in code paths apart from instantiation where an exception is expected
+ // to be thrown when abort is called.
+ throw e;
+ }
+
+ // include: memoryprofiler.js
+ // end include: memoryprofiler.js
+ // include: URIUtils.js
+ // Prefix of data URIs emitted by SINGLE_FILE and related options.
+ var dataURIPrefix = "data:application/octet-stream;base64,";
+
+ /**
+ * Indicates whether filename is a base64 data URI.
+ * @noinline
+ */
+ var isDataURI = (filename) => filename.startsWith(dataURIPrefix);
+
+ /**
+ * Indicates whether filename is delivered via file protocol (as opposed to http/https)
+ * @noinline
+ */
+ var isFileURI = (filename) => filename.startsWith("file://");
+ // end include: URIUtils.js
+ function createExportWrapper(name, nargs) {
+ return (...args) => {
+ assert(
+ runtimeInitialized,
+ `native function \`${name}\` called before runtime initialization`,
+ );
+ var f = wasmExports[name];
+ assert(f, `exported native function \`${name}\` not found`);
+ // Only assert for too many arguments. Too few can be valid since the missing arguments will be zero filled.
+ assert(
+ args.length <= nargs,
+ `native function \`${name}\` called with ${args.length} args but expects ${nargs}`,
+ );
+ return f(...args);
+ };
+ }
+
+ // include: runtime_exceptions.js
+ // end include: runtime_exceptions.js
+ function findWasmBinary() {
+ if (Module["locateFile"]) {
+ var f = "php-wasm.wasm";
+ if (!isDataURI(f)) {
+ return locateFile(f);
+ }
+ return f;
+ }
+ // Use bundler-friendly `new URL(..., import.meta.url)` pattern; works in browsers too.
+ return new URL("php-wasm.wasm", import.meta.url).href;
+ }
+
+ var wasmBinaryFile;
+
+ function getBinarySync(file) {
+ if (file == wasmBinaryFile && wasmBinary) {
+ return new Uint8Array(wasmBinary);
+ }
+ if (readBinary) {
+ return readBinary(file);
+ }
+ throw "both async and sync fetching of the wasm failed";
+ }
+
+ async function getWasmBinary(binaryFile) {
+ // If we don't have the binary yet, load it asynchronously using readAsync.
+ if (!wasmBinary) {
+ // Fetch the binary using readAsync
+ try {
+ var response = await readAsync(binaryFile);
+ return new Uint8Array(response);
+ } catch {
+ // Fall back to getBinarySync below;
+ }
+ }
+
+ // Otherwise, getBinarySync should be able to get it synchronously
+ return getBinarySync(binaryFile);
+ }
+
+ async function instantiateArrayBuffer(binaryFile, imports) {
+ try {
+ var binary = await getWasmBinary(binaryFile);
+ var instance = await WebAssembly.instantiate(binary, imports);
+ return instance;
+ } catch (reason) {
+ err(`failed to asynchronously prepare wasm: ${reason}`);
+
+ // Warn on some common problems.
+ if (isFileURI(wasmBinaryFile)) {
+ err(
+ `warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`,
+ );
+ }
+ abort(reason);
+ }
+ }
+
+ async function instantiateAsync(binary, binaryFile, imports) {
+ if (
+ !binary &&
+ typeof WebAssembly.instantiateStreaming == "function" &&
+ !isDataURI(binaryFile) &&
+ typeof fetch == "function"
+ ) {
+ try {
+ var response = fetch(binaryFile, { credentials: "same-origin" });
+ var instantiationResult = await WebAssembly.instantiateStreaming(
+ response,
+ imports,
+ );
+ return instantiationResult;
+ } catch (reason) {
+ // We expect the most common failure cause to be a bad MIME type for the binary,
+ // in which case falling back to ArrayBuffer instantiation should work.
+ err(`wasm streaming compile failed: ${reason}`);
+ err("falling back to ArrayBuffer instantiation");
+ // fall back of instantiateArrayBuffer below
+ }
+ }
+ return instantiateArrayBuffer(binaryFile, imports);
+ }
+
+ function getWasmImports() {
+ // prepare imports
+ return {
+ env: wasmImports,
+ wasi_snapshot_preview1: wasmImports,
+ };
+ }
+
+ // Create the wasm instance.
+ // Receives the wasm imports, returns the exports.
+ async function createWasm() {
+ // Load the wasm module and create an instance of using native support in the JS engine.
+ // handle a generated wasm instance, receiving its exports and
+ // performing other necessary setup
+ /** @param {WebAssembly.Module=} module*/
+ function receiveInstance(instance, module) {
+ wasmExports = instance.exports;
+
+ wasmMemory = wasmExports["memory"];
+
+ assert(wasmMemory, "memory not found in wasm exports");
+ updateMemoryViews();
+
+ wasmTable = wasmExports["__indirect_function_table"];
+
+ assert(wasmTable, "table not found in wasm exports");
+
+ addOnInit(wasmExports["__wasm_call_ctors"]);
+
+ removeRunDependency("wasm-instantiate");
+ return wasmExports;
+ }
+ // wait for the pthread pool (if any)
+ addRunDependency("wasm-instantiate");
+
+ // Prefer streaming instantiation if available.
+ // Async compilation can be confusing when an error on the page overwrites Module
+ // (for example, if the order of elements is wrong, and the one defining Module is
+ // later), so we save Module and check it later.
+ var trueModule = Module;
+ function receiveInstantiationResult(result) {
+ // 'result' is a ResultObject object which has both the module and instance.
+ // receiveInstance() will swap in the exports (to Module.asm) so they can be called
+ assert(
+ Module === trueModule,
+ "the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?",
+ );
+ trueModule = null;
+ // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
+ // When the regression is fixed, can restore the above PTHREADS-enabled path.
+ receiveInstance(result["instance"]);
+ }
+
+ var info = getWasmImports();
+
+ // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
+ // to manually instantiate the Wasm module themselves. This allows pages to
+ // run the instantiation parallel to any other async startup actions they are
+ // performing.
+ // Also pthreads and wasm workers initialize the wasm instance through this
+ // path.
+ if (Module["instantiateWasm"]) {
+ try {
+ return Module["instantiateWasm"](info, receiveInstance);
+ } catch (e) {
+ err(`Module.instantiateWasm callback failed with error: ${e}`);
+ // If instantiation fails, reject the module ready promise.
+ readyPromiseReject(e);
+ }
+ }
+
+ wasmBinaryFile ??= findWasmBinary();
+
+ try {
+ var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);
+ receiveInstantiationResult(result);
+ return result;
+ } catch (e) {
+ // If instantiation fails, reject the module ready promise.
+ readyPromiseReject(e);
+ return;
+ }
+ }
+
+ // Globals used by JS i64 conversions (see makeSetValue)
+ var tempDouble;
+ var tempI64;
+
+ // include: runtime_debug.js
+ // Endianness check
+ (() => {
+ var h16 = new Int16Array(1);
+ var h8 = new Int8Array(h16.buffer);
+ h16[0] = 0x6373;
+ if (h8[0] !== 0x73 || h8[1] !== 0x63)
+ throw "Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)";
+ })();
+
+ if (Module["ENVIRONMENT"]) {
+ throw new Error(
+ "Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)",
+ );
+ }
+
+ function legacyModuleProp(prop, newName, incoming = true) {
+ if (!Object.getOwnPropertyDescriptor(Module, prop)) {
+ Object.defineProperty(Module, prop, {
+ configurable: true,
+ get() {
+ let extra = incoming
+ ? " (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)"
+ : "";
+ abort(
+ `\`Module.${prop}\` has been replaced by \`${newName}\`` + extra,
+ );
+ },
+ });
+ }
+ }
+
+ function ignoredModuleProp(prop) {
+ if (Object.getOwnPropertyDescriptor(Module, prop)) {
+ abort(
+ `\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`,
+ );
+ }
+ }
+
+ // forcing the filesystem exports a few things by default
+ function isExportedByForceFilesystem(name) {
+ return (
+ name === "FS_createPath" ||
+ name === "FS_createDataFile" ||
+ name === "FS_createPreloadedFile" ||
+ name === "FS_unlink" ||
+ name === "addRunDependency" ||
+ // The old FS has some functionality that WasmFS lacks.
+ name === "FS_createLazyFile" ||
+ name === "FS_createDevice" ||
+ name === "removeRunDependency"
+ );
+ }
+
+ /**
+ * Intercept access to a global symbol. This enables us to give informative
+ * warnings/errors when folks attempt to use symbols they did not include in
+ * their build, or no symbols that no longer exist.
+ */
+ function hookGlobalSymbolAccess(sym, func) {
+ if (
+ typeof globalThis != "undefined" &&
+ !Object.getOwnPropertyDescriptor(globalThis, sym)
+ ) {
+ Object.defineProperty(globalThis, sym, {
+ configurable: true,
+ get() {
+ func();
+ return undefined;
+ },
+ });
+ }
+ }
+
+ function missingGlobal(sym, msg) {
+ hookGlobalSymbolAccess(sym, () => {
+ warnOnce(`\`${sym}\` is not longer defined by emscripten. ${msg}`);
+ });
+ }
+
+ missingGlobal("buffer", "Please use HEAP8.buffer or wasmMemory.buffer");
+ missingGlobal("asm", "Please use wasmExports instead");
+
+ function missingLibrarySymbol(sym) {
+ hookGlobalSymbolAccess(sym, () => {
+ // Can't `abort()` here because it would break code that does runtime
+ // checks. e.g. `if (typeof SDL === 'undefined')`.
+ var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`;
+ // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in
+ // library.js, which means $name for a JS name with no prefix, or name
+ // for a JS name like _name.
+ var librarySymbol = sym;
+ if (!librarySymbol.startsWith("_")) {
+ librarySymbol = "$" + sym;
+ }
+ msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`;
+ if (isExportedByForceFilesystem(sym)) {
+ msg +=
+ ". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you";
+ }
+ warnOnce(msg);
+ });
+
+ // Any symbol that is not included from the JS library is also (by definition)
+ // not exported on the Module object.
+ unexportedRuntimeSymbol(sym);
+ }
+
+ function unexportedRuntimeSymbol(sym) {
+ if (!Object.getOwnPropertyDescriptor(Module, sym)) {
+ Object.defineProperty(Module, sym, {
+ configurable: true,
+ get() {
+ var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`;
+ if (isExportedByForceFilesystem(sym)) {
+ msg +=
+ ". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you";
+ }
+ abort(msg);
+ },
+ });
+ }
+ }
+
+ // Used by XXXXX_DEBUG settings to output debug messages.
+ function dbg(...args) {
+ // TODO(sbc): Make this configurable somehow. Its not always convenient for
+ // logging to show up as warnings.
+ console.warn(...args);
+ }
+ // end include: runtime_debug.js
+ // === Body ===
+ // end include: preamble.js
+
+ class ExitStatus {
+ name = "ExitStatus";
+ constructor(status) {
+ this.message = `Program terminated with exit(${status})`;
+ this.status = status;
+ }
+ }
+
+ var callRuntimeCallbacks = (callbacks) => {
+ while (callbacks.length > 0) {
+ // Pass the module as the first argument.
+ callbacks.shift()(Module);
+ }
+ };
+
+ /**
+ * @param {number} ptr
+ * @param {string} type
+ */
+ function getValue(ptr, type = "i8") {
+ if (type.endsWith("*")) type = "*";
+ switch (type) {
+ case "i1":
+ return HEAP8[ptr];
+ case "i8":
+ return HEAP8[ptr];
+ case "i16":
+ return HEAP16[ptr >> 1];
+ case "i32":
+ return HEAP32[ptr >> 2];
+ case "i64":
+ abort("to do getValue(i64) use WASM_BIGINT");
+ case "float":
+ return HEAPF32[ptr >> 2];
+ case "double":
+ return HEAPF64[ptr >> 3];
+ case "*":
+ return HEAPU32[ptr >> 2];
+ default:
+ abort(`invalid type for getValue: ${type}`);
+ }
+ }
+
+ var noExitRuntime = Module["noExitRuntime"] || true;
+
+ var ptrToString = (ptr) => {
+ assert(typeof ptr === "number");
+ // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
+ ptr >>>= 0;
+ return "0x" + ptr.toString(16).padStart(8, "0");
+ };
+
+ /**
+ * @param {number} ptr
+ * @param {number} value
+ * @param {string} type
+ */
+ function setValue(ptr, value, type = "i8") {
+ if (type.endsWith("*")) type = "*";
+ switch (type) {
+ case "i1":
+ HEAP8[ptr] = value;
+ break;
+ case "i8":
+ HEAP8[ptr] = value;
+ break;
+ case "i16":
+ HEAP16[ptr >> 1] = value;
+ break;
+ case "i32":
+ HEAP32[ptr >> 2] = value;
+ break;
+ case "i64":
+ abort("to do setValue(i64) use WASM_BIGINT");
+ case "float":
+ HEAPF32[ptr >> 2] = value;
+ break;
+ case "double":
+ HEAPF64[ptr >> 3] = value;
+ break;
+ case "*":
+ HEAPU32[ptr >> 2] = value;
+ break;
+ default:
+ abort(`invalid type for setValue: ${type}`);
+ }
+ }
+
+ var stackRestore = (val) => __emscripten_stack_restore(val);
+
+ var stackSave = () => _emscripten_stack_get_current();
+
+ var warnOnce = (text) => {
+ warnOnce.shown ||= {};
+ if (!warnOnce.shown[text]) {
+ warnOnce.shown[text] = 1;
+ err(text);
+ }
+ };
+
+ var UTF8Decoder =
+ typeof TextDecoder != "undefined" ? new TextDecoder() : undefined;
+
+ /**
+ * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given
+ * array that contains uint8 values, returns a copy of that string as a
+ * Javascript String object.
+ * heapOrArray is either a regular array, or a JavaScript typed array view.
+ * @param {number=} idx
+ * @param {number=} maxBytesToRead
+ * @return {string}
+ */
+ var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => {
+ var endIdx = idx + maxBytesToRead;
+ var endPtr = idx;
+ // TextDecoder needs to know the byte length in advance, it doesn't stop on
+ // null terminator by itself. Also, use the length info to avoid running tiny
+ // strings through TextDecoder, since .subarray() allocates garbage.
+ // (As a tiny code save trick, compare endPtr against endIdx using a negation,
+ // so that undefined/NaN means Infinity)
+ while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;
+
+ if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
+ return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));
+ }
+ var str = "";
+ // If building with TextDecoder, we have already computed the string length
+ // above, so test loop end condition against that
+ while (idx < endPtr) {
+ // For UTF8 byte structure, see:
+ // http://en.wikipedia.org/wiki/UTF-8#Description
+ // https://www.ietf.org/rfc/rfc2279.txt
+ // https://tools.ietf.org/html/rfc3629
+ var u0 = heapOrArray[idx++];
+ if (!(u0 & 0x80)) {
+ str += String.fromCharCode(u0);
+ continue;
+ }
+ var u1 = heapOrArray[idx++] & 63;
+ if ((u0 & 0xe0) == 0xc0) {
+ str += String.fromCharCode(((u0 & 31) << 6) | u1);
+ continue;
+ }
+ var u2 = heapOrArray[idx++] & 63;
+ if ((u0 & 0xf0) == 0xe0) {
+ u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
+ } else {
+ if ((u0 & 0xf8) != 0xf0)
+ warnOnce(
+ "Invalid UTF-8 leading byte " +
+ ptrToString(u0) +
+ " encountered when deserializing a UTF-8 string in wasm memory to a JS string!",
+ );
+ u0 =
+ ((u0 & 7) << 18) |
+ (u1 << 12) |
+ (u2 << 6) |
+ (heapOrArray[idx++] & 63);
+ }
+
+ if (u0 < 0x10000) {
+ str += String.fromCharCode(u0);
+ } else {
+ var ch = u0 - 0x10000;
+ str += String.fromCharCode(
+ 0xd800 | (ch >> 10),
+ 0xdc00 | (ch & 0x3ff),
+ );
+ }
+ }
+ return str;
+ };
+
+ /**
+ * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the
+ * emscripten HEAP, returns a copy of that string as a Javascript String object.
+ *
+ * @param {number} ptr
+ * @param {number=} maxBytesToRead - An optional length that specifies the
+ * maximum number of bytes to read. You can omit this parameter to scan the
+ * string until the first 0 byte. If maxBytesToRead is passed, and the string
+ * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the
+ * string will cut short at that byte index (i.e. maxBytesToRead will not
+ * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing
+ * frequent uses of UTF8ToString() with and without maxBytesToRead may throw
+ * JS JIT optimizations off, so it is worth to consider consistently using one
+ * @return {string}
+ */
+ var UTF8ToString = (ptr, maxBytesToRead) => {
+ assert(
+ typeof ptr == "number",
+ `UTF8ToString expects a number (got ${typeof ptr})`,
+ );
+ return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "";
+ };
+ var ___assert_fail = (condition, filename, line, func) =>
+ abort(
+ `Assertion failed: ${UTF8ToString(condition)}, at: ` +
+ [
+ filename ? UTF8ToString(filename) : "unknown filename",
+ line,
+ func ? UTF8ToString(func) : "unknown function",
+ ],
+ );
+
+ var wasmTableMirror = [];
+
+ /** @type {WebAssembly.Table} */
+ var wasmTable;
+ var getWasmTableEntry = (funcPtr) => {
+ var func = wasmTableMirror[funcPtr];
+ if (!func) {
+ if (funcPtr >= wasmTableMirror.length)
+ wasmTableMirror.length = funcPtr + 1;
+ /** @suppress {checkTypes} */
+ wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);
+ }
+ /** @suppress {checkTypes} */
+ assert(
+ wasmTable.get(funcPtr) == func,
+ "JavaScript-side Wasm function table mirror is out of date!",
+ );
+ return func;
+ };
+ var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig);
+
+ var PATH = {
+ isAbs: (path) => path.charAt(0) === "/",
+ splitPath: (filename) => {
+ var splitPathRe =
+ /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
+ return splitPathRe.exec(filename).slice(1);
+ },
+ normalizeArray: (parts, allowAboveRoot) => {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length - 1; i >= 0; i--) {
+ var last = parts[i];
+ if (last === ".") {
+ parts.splice(i, 1);
+ } else if (last === "..") {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up; up--) {
+ parts.unshift("..");
+ }
+ }
+ return parts;
+ },
+ normalize: (path) => {
+ var isAbsolute = PATH.isAbs(path),
+ trailingSlash = path.substr(-1) === "/";
+ // Normalize the path
+ path = PATH.normalizeArray(
+ path.split("/").filter((p) => !!p),
+ !isAbsolute,
+ ).join("/");
+ if (!path && !isAbsolute) {
+ path = ".";
+ }
+ if (path && trailingSlash) {
+ path += "/";
+ }
+ return (isAbsolute ? "/" : "") + path;
+ },
+ dirname: (path) => {
+ var result = PATH.splitPath(path),
+ root = result[0],
+ dir = result[1];
+ if (!root && !dir) {
+ // No dirname whatsoever
+ return ".";
+ }
+ if (dir) {
+ // It has a dirname, strip trailing slash
+ dir = dir.substr(0, dir.length - 1);
+ }
+ return root + dir;
+ },
+ basename: (path) => {
+ // EMSCRIPTEN return '/'' for '/', not an empty string
+ if (path === "/") return "/";
+ path = PATH.normalize(path);
+ path = path.replace(/\/$/, "");
+ var lastSlash = path.lastIndexOf("/");
+ if (lastSlash === -1) return path;
+ return path.substr(lastSlash + 1);
+ },
+ join: (...paths) => PATH.normalize(paths.join("/")),
+ join2: (l, r) => PATH.normalize(l + "/" + r),
+ };
+
+ var initRandomFill = () => {
+ if (
+ typeof crypto == "object" &&
+ typeof crypto["getRandomValues"] == "function"
+ ) {
+ // for modern web browsers
+ return (view) => crypto.getRandomValues(view);
+ }
+ // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096
+ else
+ abort(
+ "no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: (array) => { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };",
+ );
+ };
+ var randomFill = (view) => {
+ // Lazily init on the first invocation.
+ return (randomFill = initRandomFill())(view);
+ };
+
+ var PATH_FS = {
+ resolve: (...args) => {
+ var resolvedPath = "",
+ resolvedAbsolute = false;
+ for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+ var path = i >= 0 ? args[i] : FS.cwd();
+ // Skip empty and invalid entries
+ if (typeof path != "string") {
+ throw new TypeError("Arguments to path.resolve must be strings");
+ } else if (!path) {
+ return ""; // an invalid portion invalidates the whole thing
+ }
+ resolvedPath = path + "/" + resolvedPath;
+ resolvedAbsolute = PATH.isAbs(path);
+ }
+ // At this point the path should be resolved to a full absolute path, but
+ // handle relative paths to be safe (might happen when process.cwd() fails)
+ resolvedPath = PATH.normalizeArray(
+ resolvedPath.split("/").filter((p) => !!p),
+ !resolvedAbsolute,
+ ).join("/");
+ return (resolvedAbsolute ? "/" : "") + resolvedPath || ".";
+ },
+ relative: (from, to) => {
+ from = PATH_FS.resolve(from).substr(1);
+ to = PATH_FS.resolve(to).substr(1);
+ function trim(arr) {
+ var start = 0;
+ for (; start < arr.length; start++) {
+ if (arr[start] !== "") break;
+ }
+ var end = arr.length - 1;
+ for (; end >= 0; end--) {
+ if (arr[end] !== "") break;
+ }
+ if (start > end) return [];
+ return arr.slice(start, end - start + 1);
+ }
+ var fromParts = trim(from.split("/"));
+ var toParts = trim(to.split("/"));
+ var length = Math.min(fromParts.length, toParts.length);
+ var samePartsLength = length;
+ for (var i = 0; i < length; i++) {
+ if (fromParts[i] !== toParts[i]) {
+ samePartsLength = i;
+ break;
+ }
+ }
+ var outputParts = [];
+ for (var i = samePartsLength; i < fromParts.length; i++) {
+ outputParts.push("..");
+ }
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
+ return outputParts.join("/");
+ },
+ };
+
+ var FS_stdin_getChar_buffer = [];
+
+ var lengthBytesUTF8 = (str) => {
+ var len = 0;
+ for (var i = 0; i < str.length; ++i) {
+ // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
+ // unit, not a Unicode code point of the character! So decode
+ // UTF16->UTF32->UTF8.
+ // See http://unicode.org/faq/utf_bom.html#utf16-3
+ var c = str.charCodeAt(i); // possibly a lead surrogate
+ if (c <= 0x7f) {
+ len++;
+ } else if (c <= 0x7ff) {
+ len += 2;
+ } else if (c >= 0xd800 && c <= 0xdfff) {
+ len += 4;
+ ++i;
+ } else {
+ len += 3;
+ }
+ }
+ return len;
+ };
+
+ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
+ assert(
+ typeof str === "string",
+ `stringToUTF8Array expects a string (got ${typeof str})`,
+ );
+ // Parameter maxBytesToWrite is not optional. Negative values, 0, null,
+ // undefined and false each don't write out any bytes.
+ if (!(maxBytesToWrite > 0)) return 0;
+
+ var startIdx = outIdx;
+ var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
+ for (var i = 0; i < str.length; ++i) {
+ // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
+ // unit, not a Unicode code point of the character! So decode
+ // UTF16->UTF32->UTF8.
+ // See http://unicode.org/faq/utf_bom.html#utf16-3
+ // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description
+ // and https://www.ietf.org/rfc/rfc2279.txt
+ // and https://tools.ietf.org/html/rfc3629
+ var u = str.charCodeAt(i); // possibly a lead surrogate
+ if (u >= 0xd800 && u <= 0xdfff) {
+ var u1 = str.charCodeAt(++i);
+ u = (0x10000 + ((u & 0x3ff) << 10)) | (u1 & 0x3ff);
+ }
+ if (u <= 0x7f) {
+ if (outIdx >= endIdx) break;
+ heap[outIdx++] = u;
+ } else if (u <= 0x7ff) {
+ if (outIdx + 1 >= endIdx) break;
+ heap[outIdx++] = 0xc0 | (u >> 6);
+ heap[outIdx++] = 0x80 | (u & 63);
+ } else if (u <= 0xffff) {
+ if (outIdx + 2 >= endIdx) break;
+ heap[outIdx++] = 0xe0 | (u >> 12);
+ heap[outIdx++] = 0x80 | ((u >> 6) & 63);
+ heap[outIdx++] = 0x80 | (u & 63);
+ } else {
+ if (outIdx + 3 >= endIdx) break;
+ if (u > 0x10ffff)
+ warnOnce(
+ "Invalid Unicode code point " +
+ ptrToString(u) +
+ " encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).",
+ );
+ heap[outIdx++] = 0xf0 | (u >> 18);
+ heap[outIdx++] = 0x80 | ((u >> 12) & 63);
+ heap[outIdx++] = 0x80 | ((u >> 6) & 63);
+ heap[outIdx++] = 0x80 | (u & 63);
+ }
+ }
+ // Null-terminate the pointer to the buffer.
+ heap[outIdx] = 0;
+ return outIdx - startIdx;
+ };
+ /** @type {function(string, boolean=, number=)} */
+ function intArrayFromString(stringy, dontAddNull, length) {
+ var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
+ var u8array = new Array(len);
+ var numBytesWritten = stringToUTF8Array(
+ stringy,
+ u8array,
+ 0,
+ u8array.length,
+ );
+ if (dontAddNull) u8array.length = numBytesWritten;
+ return u8array;
+ }
+ var FS_stdin_getChar = () => {
+ if (!FS_stdin_getChar_buffer.length) {
+ var result = null;
+ if (
+ typeof window != "undefined" &&
+ typeof window.prompt == "function"
+ ) {
+ // Browser.
+ result = window.prompt("Input: "); // returns null on cancel
+ if (result !== null) {
+ result += "\n";
+ }
+ } else {
+ }
+ if (!result) {
+ return null;
+ }
+ FS_stdin_getChar_buffer = intArrayFromString(result, true);
+ }
+ return FS_stdin_getChar_buffer.shift();
+ };
+ var TTY = {
+ ttys: [],
+ init() {
+ // https://github.com/emscripten-core/emscripten/pull/1555
+ // if (ENVIRONMENT_IS_NODE) {
+ // // currently, FS.init does not distinguish if process.stdin is a file or TTY
+ // // device, it always assumes it's a TTY device. because of this, we're forcing
+ // // process.stdin to UTF8 encoding to at least make stdin reading compatible
+ // // with text files until FS.init can be refactored.
+ // process.stdin.setEncoding('utf8');
+ // }
+ },
+ shutdown() {
+ // https://github.com/emscripten-core/emscripten/pull/1555
+ // if (ENVIRONMENT_IS_NODE) {
+ // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?
+ // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation
+ // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?
+ // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle
+ // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call
+ // process.stdin.pause();
+ // }
+ },
+ register(dev, ops) {
+ TTY.ttys[dev] = { input: [], output: [], ops: ops };
+ FS.registerDevice(dev, TTY.stream_ops);
+ },
+ stream_ops: {
+ open(stream) {
+ var tty = TTY.ttys[stream.node.rdev];
+ if (!tty) {
+ throw new FS.ErrnoError(43);
+ }
+ stream.tty = tty;
+ stream.seekable = false;
+ },
+ close(stream) {
+ // flush any pending line data
+ stream.tty.ops.fsync(stream.tty);
+ },
+ fsync(stream) {
+ stream.tty.ops.fsync(stream.tty);
+ },
+ read(stream, buffer, offset, length, pos /* ignored */) {
+ if (!stream.tty || !stream.tty.ops.get_char) {
+ throw new FS.ErrnoError(60);
+ }
+ var bytesRead = 0;
+ for (var i = 0; i < length; i++) {
+ var result;
+ try {
+ result = stream.tty.ops.get_char(stream.tty);
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ if (result === undefined && bytesRead === 0) {
+ throw new FS.ErrnoError(6);
+ }
+ if (result === null || result === undefined) break;
+ bytesRead++;
+ buffer[offset + i] = result;
+ }
+ if (bytesRead) {
+ stream.node.atime = Date.now();
+ }
+ return bytesRead;
+ },
+ write(stream, buffer, offset, length, pos) {
+ if (!stream.tty || !stream.tty.ops.put_char) {
+ throw new FS.ErrnoError(60);
+ }
+ try {
+ for (var i = 0; i < length; i++) {
+ stream.tty.ops.put_char(stream.tty, buffer[offset + i]);
+ }
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ if (length) {
+ stream.node.mtime = stream.node.ctime = Date.now();
+ }
+ return i;
+ },
+ },
+ default_tty_ops: {
+ get_char(tty) {
+ return FS_stdin_getChar();
+ },
+ put_char(tty, val) {
+ if (val === null || val === 10) {
+ out(UTF8ArrayToString(tty.output));
+ tty.output = [];
+ } else {
+ if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle.
+ }
+ },
+ fsync(tty) {
+ if (tty.output && tty.output.length > 0) {
+ out(UTF8ArrayToString(tty.output));
+ tty.output = [];
+ }
+ },
+ ioctl_tcgets(tty) {
+ // typical setting
+ return {
+ c_iflag: 25856,
+ c_oflag: 5,
+ c_cflag: 191,
+ c_lflag: 35387,
+ c_cc: [
+ 0x03, 0x1c, 0x7f, 0x15, 0x04, 0x00, 0x01, 0x00, 0x11, 0x13, 0x1a,
+ 0x00, 0x12, 0x0f, 0x17, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ ],
+ };
+ },
+ ioctl_tcsets(tty, optional_actions, data) {
+ // currently just ignore
+ return 0;
+ },
+ ioctl_tiocgwinsz(tty) {
+ return [24, 80];
+ },
+ },
+ default_tty1_ops: {
+ put_char(tty, val) {
+ if (val === null || val === 10) {
+ err(UTF8ArrayToString(tty.output));
+ tty.output = [];
+ } else {
+ if (val != 0) tty.output.push(val);
+ }
+ },
+ fsync(tty) {
+ if (tty.output && tty.output.length > 0) {
+ err(UTF8ArrayToString(tty.output));
+ tty.output = [];
+ }
+ },
+ },
+ };
+
+ var zeroMemory = (address, size) => {
+ HEAPU8.fill(0, address, address + size);
+ };
+
+ var alignMemory = (size, alignment) => {
+ assert(alignment, "alignment argument is required");
+ return Math.ceil(size / alignment) * alignment;
+ };
+ var mmapAlloc = (size) => {
+ size = alignMemory(size, 65536);
+ var ptr = _emscripten_builtin_memalign(65536, size);
+ if (ptr) zeroMemory(ptr, size);
+ return ptr;
+ };
+ var MEMFS = {
+ ops_table: null,
+ mount(mount) {
+ return MEMFS.createNode(null, "/", 16895, 0);
+ },
+ createNode(parent, name, mode, dev) {
+ if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
+ // no supported
+ throw new FS.ErrnoError(63);
+ }
+ MEMFS.ops_table ||= {
+ dir: {
+ node: {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ lookup: MEMFS.node_ops.lookup,
+ mknod: MEMFS.node_ops.mknod,
+ rename: MEMFS.node_ops.rename,
+ unlink: MEMFS.node_ops.unlink,
+ rmdir: MEMFS.node_ops.rmdir,
+ readdir: MEMFS.node_ops.readdir,
+ symlink: MEMFS.node_ops.symlink,
+ },
+ stream: {
+ llseek: MEMFS.stream_ops.llseek,
+ },
+ },
+ file: {
+ node: {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ },
+ stream: {
+ llseek: MEMFS.stream_ops.llseek,
+ read: MEMFS.stream_ops.read,
+ write: MEMFS.stream_ops.write,
+ allocate: MEMFS.stream_ops.allocate,
+ mmap: MEMFS.stream_ops.mmap,
+ msync: MEMFS.stream_ops.msync,
+ },
+ },
+ link: {
+ node: {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ readlink: MEMFS.node_ops.readlink,
+ },
+ stream: {},
+ },
+ chrdev: {
+ node: {
+ getattr: MEMFS.node_ops.getattr,
+ setattr: MEMFS.node_ops.setattr,
+ },
+ stream: FS.chrdev_stream_ops,
+ },
+ };
+ var node = FS.createNode(parent, name, mode, dev);
+ if (FS.isDir(node.mode)) {
+ node.node_ops = MEMFS.ops_table.dir.node;
+ node.stream_ops = MEMFS.ops_table.dir.stream;
+ node.contents = {};
+ } else if (FS.isFile(node.mode)) {
+ node.node_ops = MEMFS.ops_table.file.node;
+ node.stream_ops = MEMFS.ops_table.file.stream;
+ node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity.
+ // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred
+ // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size
+ // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme.
+ node.contents = null;
+ } else if (FS.isLink(node.mode)) {
+ node.node_ops = MEMFS.ops_table.link.node;
+ node.stream_ops = MEMFS.ops_table.link.stream;
+ } else if (FS.isChrdev(node.mode)) {
+ node.node_ops = MEMFS.ops_table.chrdev.node;
+ node.stream_ops = MEMFS.ops_table.chrdev.stream;
+ }
+ node.atime = node.mtime = node.ctime = Date.now();
+ // add the new node to the parent
+ if (parent) {
+ parent.contents[name] = node;
+ parent.atime = parent.mtime = parent.ctime = node.atime;
+ }
+ return node;
+ },
+ getFileDataAsTypedArray(node) {
+ if (!node.contents) return new Uint8Array(0);
+ if (node.contents.subarray)
+ return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes.
+ return new Uint8Array(node.contents);
+ },
+ expandFileStorage(node, newCapacity) {
+ var prevCapacity = node.contents ? node.contents.length : 0;
+ if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough.
+ // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity.
+ // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to
+ // avoid overshooting the allocation cap by a very large margin.
+ var CAPACITY_DOUBLING_MAX = 1024 * 1024;
+ newCapacity = Math.max(
+ newCapacity,
+ (prevCapacity *
+ (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>>
+ 0,
+ );
+ if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding.
+ var oldContents = node.contents;
+ node.contents = new Uint8Array(newCapacity); // Allocate new storage.
+ if (node.usedBytes > 0)
+ node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage.
+ },
+ resizeFileStorage(node, newSize) {
+ if (node.usedBytes == newSize) return;
+ if (newSize == 0) {
+ node.contents = null; // Fully decommit when requesting a resize to zero.
+ node.usedBytes = 0;
+ } else {
+ var oldContents = node.contents;
+ node.contents = new Uint8Array(newSize); // Allocate new storage.
+ if (oldContents) {
+ node.contents.set(
+ oldContents.subarray(0, Math.min(newSize, node.usedBytes)),
+ ); // Copy old data over to the new storage.
+ }
+ node.usedBytes = newSize;
+ }
+ },
+ node_ops: {
+ getattr(node) {
+ var attr = {};
+ // device numbers reuse inode numbers.
+ attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
+ attr.ino = node.id;
+ attr.mode = node.mode;
+ attr.nlink = 1;
+ attr.uid = 0;
+ attr.gid = 0;
+ attr.rdev = node.rdev;
+ if (FS.isDir(node.mode)) {
+ attr.size = 4096;
+ } else if (FS.isFile(node.mode)) {
+ attr.size = node.usedBytes;
+ } else if (FS.isLink(node.mode)) {
+ attr.size = node.link.length;
+ } else {
+ attr.size = 0;
+ }
+ attr.atime = new Date(node.atime);
+ attr.mtime = new Date(node.mtime);
+ attr.ctime = new Date(node.ctime);
+ // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),
+ // but this is not required by the standard.
+ attr.blksize = 4096;
+ attr.blocks = Math.ceil(attr.size / attr.blksize);
+ return attr;
+ },
+ setattr(node, attr) {
+ for (const key of ["mode", "atime", "mtime", "ctime"]) {
+ if (attr[key]) {
+ node[key] = attr[key];
+ }
+ }
+ if (attr.size !== undefined) {
+ MEMFS.resizeFileStorage(node, attr.size);
+ }
+ },
+ lookup(parent, name) {
+ throw new FS.ErrnoError(44);
+ },
+ mknod(parent, name, mode, dev) {
+ return MEMFS.createNode(parent, name, mode, dev);
+ },
+ rename(old_node, new_dir, new_name) {
+ var new_node;
+ try {
+ new_node = FS.lookupNode(new_dir, new_name);
+ } catch (e) {}
+ if (new_node) {
+ if (FS.isDir(old_node.mode)) {
+ // if we're overwriting a directory at new_name, make sure it's empty.
+ for (var i in new_node.contents) {
+ throw new FS.ErrnoError(55);
+ }
+ }
+ FS.hashRemoveNode(new_node);
+ }
+ // do the internal rewiring
+ delete old_node.parent.contents[old_node.name];
+ new_dir.contents[new_name] = old_node;
+ old_node.name = new_name;
+ new_dir.ctime =
+ new_dir.mtime =
+ old_node.parent.ctime =
+ old_node.parent.mtime =
+ Date.now();
+ },
+ unlink(parent, name) {
+ delete parent.contents[name];
+ parent.ctime = parent.mtime = Date.now();
+ },
+ rmdir(parent, name) {
+ var node = FS.lookupNode(parent, name);
+ for (var i in node.contents) {
+ throw new FS.ErrnoError(55);
+ }
+ delete parent.contents[name];
+ parent.ctime = parent.mtime = Date.now();
+ },
+ readdir(node) {
+ return [".", "..", ...Object.keys(node.contents)];
+ },
+ symlink(parent, newname, oldpath) {
+ var node = MEMFS.createNode(parent, newname, 0o777 | 40960, 0);
+ node.link = oldpath;
+ return node;
+ },
+ readlink(node) {
+ if (!FS.isLink(node.mode)) {
+ throw new FS.ErrnoError(28);
+ }
+ return node.link;
+ },
+ },
+ stream_ops: {
+ read(stream, buffer, offset, length, position) {
+ var contents = stream.node.contents;
+ if (position >= stream.node.usedBytes) return 0;
+ var size = Math.min(stream.node.usedBytes - position, length);
+ assert(size >= 0);
+ if (size > 8 && contents.subarray) {
+ // non-trivial, and typed array
+ buffer.set(contents.subarray(position, position + size), offset);
+ } else {
+ for (var i = 0; i < size; i++)
+ buffer[offset + i] = contents[position + i];
+ }
+ return size;
+ },
+ write(stream, buffer, offset, length, position, canOwn) {
+ // The data buffer should be a typed array view
+ assert(!(buffer instanceof ArrayBuffer));
+
+ if (!length) return 0;
+ var node = stream.node;
+ node.mtime = node.ctime = Date.now();
+
+ if (buffer.subarray && (!node.contents || node.contents.subarray)) {
+ // This write is from a typed array to a typed array?
+ if (canOwn) {
+ assert(
+ position === 0,
+ "canOwn must imply no weird position inside the file",
+ );
+ node.contents = buffer.subarray(offset, offset + length);
+ node.usedBytes = length;
+ return length;
+ } else if (node.usedBytes === 0 && position === 0) {
+ // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data.
+ node.contents = buffer.slice(offset, offset + length);
+ node.usedBytes = length;
+ return length;
+ } else if (position + length <= node.usedBytes) {
+ // Writing to an already allocated and used subrange of the file?
+ node.contents.set(
+ buffer.subarray(offset, offset + length),
+ position,
+ );
+ return length;
+ }
+ }
+
+ // Appending to an existing file and we need to reallocate, or source data did not come as a typed array.
+ MEMFS.expandFileStorage(node, position + length);
+ if (node.contents.subarray && buffer.subarray) {
+ // Use typed array write which is available.
+ node.contents.set(
+ buffer.subarray(offset, offset + length),
+ position,
+ );
+ } else {
+ for (var i = 0; i < length; i++) {
+ node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not.
+ }
+ }
+ node.usedBytes = Math.max(node.usedBytes, position + length);
+ return length;
+ },
+ llseek(stream, offset, whence) {
+ var position = offset;
+ if (whence === 1) {
+ position += stream.position;
+ } else if (whence === 2) {
+ if (FS.isFile(stream.node.mode)) {
+ position += stream.node.usedBytes;
+ }
+ }
+ if (position < 0) {
+ throw new FS.ErrnoError(28);
+ }
+ return position;
+ },
+ allocate(stream, offset, length) {
+ MEMFS.expandFileStorage(stream.node, offset + length);
+ stream.node.usedBytes = Math.max(
+ stream.node.usedBytes,
+ offset + length,
+ );
+ },
+ mmap(stream, length, position, prot, flags) {
+ if (!FS.isFile(stream.node.mode)) {
+ throw new FS.ErrnoError(43);
+ }
+ var ptr;
+ var allocated;
+ var contents = stream.node.contents;
+ // Only make a new copy when MAP_PRIVATE is specified.
+ if (!(flags & 2) && contents && contents.buffer === HEAP8.buffer) {
+ // We can't emulate MAP_SHARED when the file is not backed by the
+ // buffer we're mapping to (e.g. the HEAP buffer).
+ allocated = false;
+ ptr = contents.byteOffset;
+ } else {
+ allocated = true;
+ ptr = mmapAlloc(length);
+ if (!ptr) {
+ throw new FS.ErrnoError(48);
+ }
+ if (contents) {
+ // Try to avoid unnecessary slices.
+ if (position > 0 || position + length < contents.length) {
+ if (contents.subarray) {
+ contents = contents.subarray(position, position + length);
+ } else {
+ contents = Array.prototype.slice.call(
+ contents,
+ position,
+ position + length,
+ );
+ }
+ }
+ HEAP8.set(contents, ptr);
+ }
+ }
+ return { ptr, allocated };
+ },
+ msync(stream, buffer, offset, length, mmapFlags) {
+ MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
+ // should we check if bytesWritten and length are the same?
+ return 0;
+ },
+ },
+ };
+
+ var asyncLoad = async (url) => {
+ var arrayBuffer = await readAsync(url);
+ assert(
+ arrayBuffer,
+ `Loading data file "${url}" failed (no arrayBuffer).`,
+ );
+ return new Uint8Array(arrayBuffer);
+ };
+
+ var FS_createDataFile = (
+ parent,
+ name,
+ fileData,
+ canRead,
+ canWrite,
+ canOwn,
+ ) => {
+ FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn);
+ };
+
+ var preloadPlugins = Module["preloadPlugins"] || [];
+ var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => {
+ // Ensure plugins are ready.
+ if (typeof Browser != "undefined") Browser.init();
+
+ var handled = false;
+ preloadPlugins.forEach((plugin) => {
+ if (handled) return;
+ if (plugin["canHandle"](fullname)) {
+ plugin["handle"](byteArray, fullname, finish, onerror);
+ handled = true;
+ }
+ });
+ return handled;
+ };
+ var FS_createPreloadedFile = (
+ parent,
+ name,
+ url,
+ canRead,
+ canWrite,
+ onload,
+ onerror,
+ dontCreateFile,
+ canOwn,
+ preFinish,
+ ) => {
+ // TODO we should allow people to just pass in a complete filename instead
+ // of parent and name being that we just join them anyways
+ var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;
+ var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname
+ function processData(byteArray) {
+ function finish(byteArray) {
+ preFinish?.();
+ if (!dontCreateFile) {
+ FS_createDataFile(
+ parent,
+ name,
+ byteArray,
+ canRead,
+ canWrite,
+ canOwn,
+ );
+ }
+ onload?.();
+ removeRunDependency(dep);
+ }
+ if (
+ FS_handledByPreloadPlugin(byteArray, fullname, finish, () => {
+ onerror?.();
+ removeRunDependency(dep);
+ })
+ ) {
+ return;
+ }
+ finish(byteArray);
+ }
+ addRunDependency(dep);
+ if (typeof url == "string") {
+ asyncLoad(url).then(processData, onerror);
+ } else {
+ processData(url);
+ }
+ };
+
+ var FS_modeStringToFlags = (str) => {
+ var flagModes = {
+ r: 0,
+ "r+": 2,
+ w: 512 | 64 | 1,
+ "w+": 512 | 64 | 2,
+ a: 1024 | 64 | 1,
+ "a+": 1024 | 64 | 2,
+ };
+ var flags = flagModes[str];
+ if (typeof flags == "undefined") {
+ throw new Error(`Unknown file open mode: ${str}`);
+ }
+ return flags;
+ };
+
+ var FS_getMode = (canRead, canWrite) => {
+ var mode = 0;
+ if (canRead) mode |= 292 | 73;
+ if (canWrite) mode |= 146;
+ return mode;
+ };
+
+ var strError = (errno) => UTF8ToString(_strerror(errno));
+
+ var ERRNO_CODES = {
+ EPERM: 63,
+ ENOENT: 44,
+ ESRCH: 71,
+ EINTR: 27,
+ EIO: 29,
+ ENXIO: 60,
+ E2BIG: 1,
+ ENOEXEC: 45,
+ EBADF: 8,
+ ECHILD: 12,
+ EAGAIN: 6,
+ EWOULDBLOCK: 6,
+ ENOMEM: 48,
+ EACCES: 2,
+ EFAULT: 21,
+ ENOTBLK: 105,
+ EBUSY: 10,
+ EEXIST: 20,
+ EXDEV: 75,
+ ENODEV: 43,
+ ENOTDIR: 54,
+ EISDIR: 31,
+ EINVAL: 28,
+ ENFILE: 41,
+ EMFILE: 33,
+ ENOTTY: 59,
+ ETXTBSY: 74,
+ EFBIG: 22,
+ ENOSPC: 51,
+ ESPIPE: 70,
+ EROFS: 69,
+ EMLINK: 34,
+ EPIPE: 64,
+ EDOM: 18,
+ ERANGE: 68,
+ ENOMSG: 49,
+ EIDRM: 24,
+ ECHRNG: 106,
+ EL2NSYNC: 156,
+ EL3HLT: 107,
+ EL3RST: 108,
+ ELNRNG: 109,
+ EUNATCH: 110,
+ ENOCSI: 111,
+ EL2HLT: 112,
+ EDEADLK: 16,
+ ENOLCK: 46,
+ EBADE: 113,
+ EBADR: 114,
+ EXFULL: 115,
+ ENOANO: 104,
+ EBADRQC: 103,
+ EBADSLT: 102,
+ EDEADLOCK: 16,
+ EBFONT: 101,
+ ENOSTR: 100,
+ ENODATA: 116,
+ ETIME: 117,
+ ENOSR: 118,
+ ENONET: 119,
+ ENOPKG: 120,
+ EREMOTE: 121,
+ ENOLINK: 47,
+ EADV: 122,
+ ESRMNT: 123,
+ ECOMM: 124,
+ EPROTO: 65,
+ EMULTIHOP: 36,
+ EDOTDOT: 125,
+ EBADMSG: 9,
+ ENOTUNIQ: 126,
+ EBADFD: 127,
+ EREMCHG: 128,
+ ELIBACC: 129,
+ ELIBBAD: 130,
+ ELIBSCN: 131,
+ ELIBMAX: 132,
+ ELIBEXEC: 133,
+ ENOSYS: 52,
+ ENOTEMPTY: 55,
+ ENAMETOOLONG: 37,
+ ELOOP: 32,
+ EOPNOTSUPP: 138,
+ EPFNOSUPPORT: 139,
+ ECONNRESET: 15,
+ ENOBUFS: 42,
+ EAFNOSUPPORT: 5,
+ EPROTOTYPE: 67,
+ ENOTSOCK: 57,
+ ENOPROTOOPT: 50,
+ ESHUTDOWN: 140,
+ ECONNREFUSED: 14,
+ EADDRINUSE: 3,
+ ECONNABORTED: 13,
+ ENETUNREACH: 40,
+ ENETDOWN: 38,
+ ETIMEDOUT: 73,
+ EHOSTDOWN: 142,
+ EHOSTUNREACH: 23,
+ EINPROGRESS: 26,
+ EALREADY: 7,
+ EDESTADDRREQ: 17,
+ EMSGSIZE: 35,
+ EPROTONOSUPPORT: 66,
+ ESOCKTNOSUPPORT: 137,
+ EADDRNOTAVAIL: 4,
+ ENETRESET: 39,
+ EISCONN: 30,
+ ENOTCONN: 53,
+ ETOOMANYREFS: 141,
+ EUSERS: 136,
+ EDQUOT: 19,
+ ESTALE: 72,
+ ENOTSUP: 138,
+ ENOMEDIUM: 148,
+ EILSEQ: 25,
+ EOVERFLOW: 61,
+ ECANCELED: 11,
+ ENOTRECOVERABLE: 56,
+ EOWNERDEAD: 62,
+ ESTRPIPE: 135,
+ };
+ var FS = {
+ root: null,
+ mounts: [],
+ devices: {},
+ streams: [],
+ nextInode: 1,
+ nameTable: null,
+ currentPath: "/",
+ initialized: false,
+ ignorePermissions: true,
+ ErrnoError: class extends Error {
+ name = "ErrnoError";
+ // We set the `name` property to be able to identify `FS.ErrnoError`
+ // - the `name` is a standard ECMA-262 property of error objects. Kind of good to have it anyway.
+ // - when using PROXYFS, an error can come from an underlying FS
+ // as different FS objects have their own FS.ErrnoError each,
+ // the test `err instanceof FS.ErrnoError` won't detect an error coming from another filesystem, causing bugs.
+ // we'll use the reliable test `err.name == "ErrnoError"` instead
+ constructor(errno) {
+ super(runtimeInitialized ? strError(errno) : "");
+ this.errno = errno;
+ for (var key in ERRNO_CODES) {
+ if (ERRNO_CODES[key] === errno) {
+ this.code = key;
+ break;
+ }
+ }
+ }
+ },
+ filesystems: null,
+ syncFSRequests: 0,
+ readFiles: {},
+ FSStream: class {
+ shared = {};
+ get object() {
+ return this.node;
+ }
+ set object(val) {
+ this.node = val;
+ }
+ get isRead() {
+ return (this.flags & 2097155) !== 1;
+ }
+ get isWrite() {
+ return (this.flags & 2097155) !== 0;
+ }
+ get isAppend() {
+ return this.flags & 1024;
+ }
+ get flags() {
+ return this.shared.flags;
+ }
+ set flags(val) {
+ this.shared.flags = val;
+ }
+ get position() {
+ return this.shared.position;
+ }
+ set position(val) {
+ this.shared.position = val;
+ }
+ },
+ FSNode: class {
+ node_ops = {};
+ stream_ops = {};
+ readMode = 292 | 73;
+ writeMode = 146;
+ mounted = null;
+ constructor(parent, name, mode, rdev) {
+ if (!parent) {
+ parent = this; // root node sets parent to itself
+ }
+ this.parent = parent;
+ this.mount = parent.mount;
+ this.id = FS.nextInode++;
+ this.name = name;
+ this.mode = mode;
+ this.rdev = rdev;
+ this.atime = this.mtime = this.ctime = Date.now();
+ }
+ get read() {
+ return (this.mode & this.readMode) === this.readMode;
+ }
+ set read(val) {
+ val ? (this.mode |= this.readMode) : (this.mode &= ~this.readMode);
+ }
+ get write() {
+ return (this.mode & this.writeMode) === this.writeMode;
+ }
+ set write(val) {
+ val ? (this.mode |= this.writeMode) : (this.mode &= ~this.writeMode);
+ }
+ get isFolder() {
+ return FS.isDir(this.mode);
+ }
+ get isDevice() {
+ return FS.isChrdev(this.mode);
+ }
+ },
+ lookupPath(path, opts = {}) {
+ if (!path) return { path: "", node: null };
+ opts.follow_mount ??= true;
+
+ if (!PATH.isAbs(path)) {
+ path = FS.cwd() + "/" + path;
+ }
+
+ // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
+ linkloop: for (var nlinks = 0; nlinks < 40; nlinks++) {
+ // split the absolute path
+ var parts = path.split("/").filter((p) => !!p && p !== ".");
+
+ // start at the root
+ var current = FS.root;
+ var current_path = "/";
+
+ for (var i = 0; i < parts.length; i++) {
+ var islast = i === parts.length - 1;
+ if (islast && opts.parent) {
+ // stop resolving
+ break;
+ }
+
+ if (parts[i] === "..") {
+ current_path = PATH.dirname(current_path);
+ current = current.parent;
+ continue;
+ }
+
+ current_path = PATH.join2(current_path, parts[i]);
+ try {
+ current = FS.lookupNode(current, parts[i]);
+ } catch (e) {
+ // if noent_okay is true, suppress a ENOENT in the last component
+ // and return an object with an undefined node. This is needed for
+ // resolving symlinks in the path when creating a file.
+ if (e?.errno === 44 && islast && opts.noent_okay) {
+ return { path: current_path };
+ }
+ throw e;
+ }
+
+ // jump to the mount's root node if this is a mountpoint
+ if (FS.isMountpoint(current) && (!islast || opts.follow_mount)) {
+ current = current.mounted.root;
+ }
+
+ // by default, lookupPath will not follow a symlink if it is the final path component.
+ // setting opts.follow = true will override this behavior.
+ if (FS.isLink(current.mode) && (!islast || opts.follow)) {
+ if (!current.node_ops.readlink) {
+ throw new FS.ErrnoError(52);
+ }
+ var link = current.node_ops.readlink(current);
+ if (!PATH.isAbs(link)) {
+ link = PATH.dirname(current_path) + "/" + link;
+ }
+ path = link + "/" + parts.slice(i + 1).join("/");
+ continue linkloop;
+ }
+ }
+ return { path: current_path, node: current };
+ }
+ throw new FS.ErrnoError(32);
+ },
+ getPath(node) {
+ var path;
+ while (true) {
+ if (FS.isRoot(node)) {
+ var mount = node.mount.mountpoint;
+ if (!path) return mount;
+ return mount[mount.length - 1] !== "/"
+ ? `${mount}/${path}`
+ : mount + path;
+ }
+ path = path ? `${node.name}/${path}` : node.name;
+ node = node.parent;
+ }
+ },
+ hashName(parentid, name) {
+ var hash = 0;
+
+ for (var i = 0; i < name.length; i++) {
+ hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
+ }
+ return ((parentid + hash) >>> 0) % FS.nameTable.length;
+ },
+ hashAddNode(node) {
+ var hash = FS.hashName(node.parent.id, node.name);
+ node.name_next = FS.nameTable[hash];
+ FS.nameTable[hash] = node;
+ },
+ hashRemoveNode(node) {
+ var hash = FS.hashName(node.parent.id, node.name);
+ if (FS.nameTable[hash] === node) {
+ FS.nameTable[hash] = node.name_next;
+ } else {
+ var current = FS.nameTable[hash];
+ while (current) {
+ if (current.name_next === node) {
+ current.name_next = node.name_next;
+ break;
+ }
+ current = current.name_next;
+ }
+ }
+ },
+ lookupNode(parent, name) {
+ var errCode = FS.mayLookup(parent);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ var hash = FS.hashName(parent.id, name);
+ for (var node = FS.nameTable[hash]; node; node = node.name_next) {
+ var nodeName = node.name;
+ if (node.parent.id === parent.id && nodeName === name) {
+ return node;
+ }
+ }
+ // if we failed to find it in the cache, call into the VFS
+ return FS.lookup(parent, name);
+ },
+ createNode(parent, name, mode, rdev) {
+ assert(typeof parent == "object");
+ var node = new FS.FSNode(parent, name, mode, rdev);
+
+ FS.hashAddNode(node);
+
+ return node;
+ },
+ destroyNode(node) {
+ FS.hashRemoveNode(node);
+ },
+ isRoot(node) {
+ return node === node.parent;
+ },
+ isMountpoint(node) {
+ return !!node.mounted;
+ },
+ isFile(mode) {
+ return (mode & 61440) === 32768;
+ },
+ isDir(mode) {
+ return (mode & 61440) === 16384;
+ },
+ isLink(mode) {
+ return (mode & 61440) === 40960;
+ },
+ isChrdev(mode) {
+ return (mode & 61440) === 8192;
+ },
+ isBlkdev(mode) {
+ return (mode & 61440) === 24576;
+ },
+ isFIFO(mode) {
+ return (mode & 61440) === 4096;
+ },
+ isSocket(mode) {
+ return (mode & 49152) === 49152;
+ },
+ flagsToPermissionString(flag) {
+ var perms = ["r", "w", "rw"][flag & 3];
+ if (flag & 512) {
+ perms += "w";
+ }
+ return perms;
+ },
+ nodePermissions(node, perms) {
+ if (FS.ignorePermissions) {
+ return 0;
+ }
+ // return 0 if any user, group or owner bits are set.
+ if (perms.includes("r") && !(node.mode & 292)) {
+ return 2;
+ } else if (perms.includes("w") && !(node.mode & 146)) {
+ return 2;
+ } else if (perms.includes("x") && !(node.mode & 73)) {
+ return 2;
+ }
+ return 0;
+ },
+ mayLookup(dir) {
+ if (!FS.isDir(dir.mode)) return 54;
+ var errCode = FS.nodePermissions(dir, "x");
+ if (errCode) return errCode;
+ if (!dir.node_ops.lookup) return 2;
+ return 0;
+ },
+ mayCreate(dir, name) {
+ if (!FS.isDir(dir.mode)) {
+ return 54;
+ }
+ try {
+ var node = FS.lookupNode(dir, name);
+ return 20;
+ } catch (e) {}
+ return FS.nodePermissions(dir, "wx");
+ },
+ mayDelete(dir, name, isdir) {
+ var node;
+ try {
+ node = FS.lookupNode(dir, name);
+ } catch (e) {
+ return e.errno;
+ }
+ var errCode = FS.nodePermissions(dir, "wx");
+ if (errCode) {
+ return errCode;
+ }
+ if (isdir) {
+ if (!FS.isDir(node.mode)) {
+ return 54;
+ }
+ if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
+ return 10;
+ }
+ } else {
+ if (FS.isDir(node.mode)) {
+ return 31;
+ }
+ }
+ return 0;
+ },
+ mayOpen(node, flags) {
+ if (!node) {
+ return 44;
+ }
+ if (FS.isLink(node.mode)) {
+ return 32;
+ } else if (FS.isDir(node.mode)) {
+ if (
+ FS.flagsToPermissionString(flags) !== "r" || // opening for write
+ flags & 512
+ ) {
+ // TODO: check for O_SEARCH? (== search for dir only)
+ return 31;
+ }
+ }
+ return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
+ },
+ MAX_OPEN_FDS: 4096,
+ nextfd() {
+ for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) {
+ if (!FS.streams[fd]) {
+ return fd;
+ }
+ }
+ throw new FS.ErrnoError(33);
+ },
+ getStreamChecked(fd) {
+ var stream = FS.getStream(fd);
+ if (!stream) {
+ throw new FS.ErrnoError(8);
+ }
+ return stream;
+ },
+ getStream: (fd) => FS.streams[fd],
+ createStream(stream, fd = -1) {
+ assert(fd >= -1);
+
+ // clone it, so we can return an instance of FSStream
+ stream = Object.assign(new FS.FSStream(), stream);
+ if (fd == -1) {
+ fd = FS.nextfd();
+ }
+ stream.fd = fd;
+ FS.streams[fd] = stream;
+ return stream;
+ },
+ closeStream(fd) {
+ FS.streams[fd] = null;
+ },
+ dupStream(origStream, fd = -1) {
+ var stream = FS.createStream(origStream, fd);
+ stream.stream_ops?.dup?.(stream);
+ return stream;
+ },
+ chrdev_stream_ops: {
+ open(stream) {
+ var device = FS.getDevice(stream.node.rdev);
+ // override node's stream ops with the device's
+ stream.stream_ops = device.stream_ops;
+ // forward the open call
+ stream.stream_ops.open?.(stream);
+ },
+ llseek() {
+ throw new FS.ErrnoError(70);
+ },
+ },
+ major: (dev) => dev >> 8,
+ minor: (dev) => dev & 0xff,
+ makedev: (ma, mi) => (ma << 8) | mi,
+ registerDevice(dev, ops) {
+ FS.devices[dev] = { stream_ops: ops };
+ },
+ getDevice: (dev) => FS.devices[dev],
+ getMounts(mount) {
+ var mounts = [];
+ var check = [mount];
+
+ while (check.length) {
+ var m = check.pop();
+
+ mounts.push(m);
+
+ check.push(...m.mounts);
+ }
+
+ return mounts;
+ },
+ syncfs(populate, callback) {
+ if (typeof populate == "function") {
+ callback = populate;
+ populate = false;
+ }
+
+ FS.syncFSRequests++;
+
+ if (FS.syncFSRequests > 1) {
+ err(
+ `warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`,
+ );
+ }
+
+ var mounts = FS.getMounts(FS.root.mount);
+ var completed = 0;
+
+ function doCallback(errCode) {
+ assert(FS.syncFSRequests > 0);
+ FS.syncFSRequests--;
+ return callback(errCode);
+ }
+
+ function done(errCode) {
+ if (errCode) {
+ if (!done.errored) {
+ done.errored = true;
+ return doCallback(errCode);
+ }
+ return;
+ }
+ if (++completed >= mounts.length) {
+ doCallback(null);
+ }
+ }
+
+ // sync all mounts
+ mounts.forEach((mount) => {
+ if (!mount.type.syncfs) {
+ return done(null);
+ }
+ mount.type.syncfs(mount, populate, done);
+ });
+ },
+ mount(type, opts, mountpoint) {
+ if (typeof type == "string") {
+ // The filesystem was not included, and instead we have an error
+ // message stored in the variable.
+ throw type;
+ }
+ var root = mountpoint === "/";
+ var pseudo = !mountpoint;
+ var node;
+
+ if (root && FS.root) {
+ throw new FS.ErrnoError(10);
+ } else if (!root && !pseudo) {
+ var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
+
+ mountpoint = lookup.path; // use the absolute path
+ node = lookup.node;
+
+ if (FS.isMountpoint(node)) {
+ throw new FS.ErrnoError(10);
+ }
+
+ if (!FS.isDir(node.mode)) {
+ throw new FS.ErrnoError(54);
+ }
+ }
+
+ var mount = {
+ type,
+ opts,
+ mountpoint,
+ mounts: [],
+ };
+
+ // create a root node for the fs
+ var mountRoot = type.mount(mount);
+ mountRoot.mount = mount;
+ mount.root = mountRoot;
+
+ if (root) {
+ FS.root = mountRoot;
+ } else if (node) {
+ // set as a mountpoint
+ node.mounted = mount;
+
+ // add the new mount to the current mount's children
+ if (node.mount) {
+ node.mount.mounts.push(mount);
+ }
+ }
+
+ return mountRoot;
+ },
+ unmount(mountpoint) {
+ var lookup = FS.lookupPath(mountpoint, { follow_mount: false });
+
+ if (!FS.isMountpoint(lookup.node)) {
+ throw new FS.ErrnoError(28);
+ }
+
+ // destroy the nodes for this mount, and all its child mounts
+ var node = lookup.node;
+ var mount = node.mounted;
+ var mounts = FS.getMounts(mount);
+
+ Object.keys(FS.nameTable).forEach((hash) => {
+ var current = FS.nameTable[hash];
+
+ while (current) {
+ var next = current.name_next;
+
+ if (mounts.includes(current.mount)) {
+ FS.destroyNode(current);
+ }
+
+ current = next;
+ }
+ });
+
+ // no longer a mountpoint
+ node.mounted = null;
+
+ // remove this mount from the child mounts
+ var idx = node.mount.mounts.indexOf(mount);
+ assert(idx !== -1);
+ node.mount.mounts.splice(idx, 1);
+ },
+ lookup(parent, name) {
+ return parent.node_ops.lookup(parent, name);
+ },
+ mknod(path, mode, dev) {
+ var lookup = FS.lookupPath(path, { parent: true });
+ var parent = lookup.node;
+ var name = PATH.basename(path);
+ if (!name || name === "." || name === "..") {
+ throw new FS.ErrnoError(28);
+ }
+ var errCode = FS.mayCreate(parent, name);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!parent.node_ops.mknod) {
+ throw new FS.ErrnoError(63);
+ }
+ return parent.node_ops.mknod(parent, name, mode, dev);
+ },
+ statfs(path) {
+ // NOTE: None of the defaults here are true. We're just returning safe and
+ // sane values.
+ var rtn = {
+ bsize: 4096,
+ frsize: 4096,
+ blocks: 1e6,
+ bfree: 5e5,
+ bavail: 5e5,
+ files: FS.nextInode,
+ ffree: FS.nextInode - 1,
+ fsid: 42,
+ flags: 2,
+ namelen: 255,
+ };
+
+ var parent = FS.lookupPath(path, { follow: true }).node;
+ if (parent?.node_ops.statfs) {
+ Object.assign(rtn, parent.node_ops.statfs(parent.mount.opts.root));
+ }
+ return rtn;
+ },
+ create(path, mode = 0o666) {
+ mode &= 4095;
+ mode |= 32768;
+ return FS.mknod(path, mode, 0);
+ },
+ mkdir(path, mode = 0o777) {
+ mode &= 511 | 512;
+ mode |= 16384;
+ return FS.mknod(path, mode, 0);
+ },
+ mkdirTree(path, mode) {
+ var dirs = path.split("/");
+ var d = "";
+ for (var i = 0; i < dirs.length; ++i) {
+ if (!dirs[i]) continue;
+ d += "/" + dirs[i];
+ try {
+ FS.mkdir(d, mode);
+ } catch (e) {
+ if (e.errno != 20) throw e;
+ }
+ }
+ },
+ mkdev(path, mode, dev) {
+ if (typeof dev == "undefined") {
+ dev = mode;
+ mode = 0o666;
+ }
+ mode |= 8192;
+ return FS.mknod(path, mode, dev);
+ },
+ symlink(oldpath, newpath) {
+ if (!PATH_FS.resolve(oldpath)) {
+ throw new FS.ErrnoError(44);
+ }
+ var lookup = FS.lookupPath(newpath, { parent: true });
+ var parent = lookup.node;
+ if (!parent) {
+ throw new FS.ErrnoError(44);
+ }
+ var newname = PATH.basename(newpath);
+ var errCode = FS.mayCreate(parent, newname);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!parent.node_ops.symlink) {
+ throw new FS.ErrnoError(63);
+ }
+ return parent.node_ops.symlink(parent, newname, oldpath);
+ },
+ rename(old_path, new_path) {
+ var old_dirname = PATH.dirname(old_path);
+ var new_dirname = PATH.dirname(new_path);
+ var old_name = PATH.basename(old_path);
+ var new_name = PATH.basename(new_path);
+ // parents must exist
+ var lookup, old_dir, new_dir;
+
+ // let the errors from non existent directories percolate up
+ lookup = FS.lookupPath(old_path, { parent: true });
+ old_dir = lookup.node;
+ lookup = FS.lookupPath(new_path, { parent: true });
+ new_dir = lookup.node;
+
+ if (!old_dir || !new_dir) throw new FS.ErrnoError(44);
+ // need to be part of the same mount
+ if (old_dir.mount !== new_dir.mount) {
+ throw new FS.ErrnoError(75);
+ }
+ // source must exist
+ var old_node = FS.lookupNode(old_dir, old_name);
+ // old path should not be an ancestor of the new path
+ var relative = PATH_FS.relative(old_path, new_dirname);
+ if (relative.charAt(0) !== ".") {
+ throw new FS.ErrnoError(28);
+ }
+ // new path should not be an ancestor of the old path
+ relative = PATH_FS.relative(new_path, old_dirname);
+ if (relative.charAt(0) !== ".") {
+ throw new FS.ErrnoError(55);
+ }
+ // see if the new path already exists
+ var new_node;
+ try {
+ new_node = FS.lookupNode(new_dir, new_name);
+ } catch (e) {
+ // not fatal
+ }
+ // early out if nothing needs to change
+ if (old_node === new_node) {
+ return;
+ }
+ // we'll need to delete the old entry
+ var isdir = FS.isDir(old_node.mode);
+ var errCode = FS.mayDelete(old_dir, old_name, isdir);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ // need delete permissions if we'll be overwriting.
+ // need create permissions if new doesn't already exist.
+ errCode = new_node
+ ? FS.mayDelete(new_dir, new_name, isdir)
+ : FS.mayCreate(new_dir, new_name);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!old_dir.node_ops.rename) {
+ throw new FS.ErrnoError(63);
+ }
+ if (
+ FS.isMountpoint(old_node) ||
+ (new_node && FS.isMountpoint(new_node))
+ ) {
+ throw new FS.ErrnoError(10);
+ }
+ // if we are going to change the parent, check write permissions
+ if (new_dir !== old_dir) {
+ errCode = FS.nodePermissions(old_dir, "w");
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ }
+ // remove the node from the lookup hash
+ FS.hashRemoveNode(old_node);
+ // do the underlying fs rename
+ try {
+ old_dir.node_ops.rename(old_node, new_dir, new_name);
+ // update old node (we do this here to avoid each backend
+ // needing to)
+ old_node.parent = new_dir;
+ } catch (e) {
+ throw e;
+ } finally {
+ // add the node back to the hash (in case node_ops.rename
+ // changed its name)
+ FS.hashAddNode(old_node);
+ }
+ },
+ rmdir(path) {
+ var lookup = FS.lookupPath(path, { parent: true });
+ var parent = lookup.node;
+ var name = PATH.basename(path);
+ var node = FS.lookupNode(parent, name);
+ var errCode = FS.mayDelete(parent, name, true);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!parent.node_ops.rmdir) {
+ throw new FS.ErrnoError(63);
+ }
+ if (FS.isMountpoint(node)) {
+ throw new FS.ErrnoError(10);
+ }
+ parent.node_ops.rmdir(parent, name);
+ FS.destroyNode(node);
+ },
+ readdir(path) {
+ var lookup = FS.lookupPath(path, { follow: true });
+ var node = lookup.node;
+ if (!node.node_ops.readdir) {
+ throw new FS.ErrnoError(54);
+ }
+ return node.node_ops.readdir(node);
+ },
+ unlink(path) {
+ var lookup = FS.lookupPath(path, { parent: true });
+ var parent = lookup.node;
+ if (!parent) {
+ throw new FS.ErrnoError(44);
+ }
+ var name = PATH.basename(path);
+ var node = FS.lookupNode(parent, name);
+ var errCode = FS.mayDelete(parent, name, false);
+ if (errCode) {
+ // According to POSIX, we should map EISDIR to EPERM, but
+ // we instead do what Linux does (and we must, as we use
+ // the musl linux libc).
+ throw new FS.ErrnoError(errCode);
+ }
+ if (!parent.node_ops.unlink) {
+ throw new FS.ErrnoError(63);
+ }
+ if (FS.isMountpoint(node)) {
+ throw new FS.ErrnoError(10);
+ }
+ parent.node_ops.unlink(parent, name);
+ FS.destroyNode(node);
+ },
+ readlink(path) {
+ var lookup = FS.lookupPath(path);
+ var link = lookup.node;
+ if (!link) {
+ throw new FS.ErrnoError(44);
+ }
+ if (!link.node_ops.readlink) {
+ throw new FS.ErrnoError(28);
+ }
+ return link.node_ops.readlink(link);
+ },
+ stat(path, dontFollow) {
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
+ var node = lookup.node;
+ if (!node) {
+ throw new FS.ErrnoError(44);
+ }
+ if (!node.node_ops.getattr) {
+ throw new FS.ErrnoError(63);
+ }
+ return node.node_ops.getattr(node);
+ },
+ lstat(path) {
+ return FS.stat(path, true);
+ },
+ chmod(path, mode, dontFollow) {
+ var node;
+ if (typeof path == "string") {
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
+ node = lookup.node;
+ } else {
+ node = path;
+ }
+ if (!node.node_ops.setattr) {
+ throw new FS.ErrnoError(63);
+ }
+ node.node_ops.setattr(node, {
+ mode: (mode & 4095) | (node.mode & ~4095),
+ ctime: Date.now(),
+ });
+ },
+ lchmod(path, mode) {
+ FS.chmod(path, mode, true);
+ },
+ fchmod(fd, mode) {
+ var stream = FS.getStreamChecked(fd);
+ FS.chmod(stream.node, mode);
+ },
+ chown(path, uid, gid, dontFollow) {
+ var node;
+ if (typeof path == "string") {
+ var lookup = FS.lookupPath(path, { follow: !dontFollow });
+ node = lookup.node;
+ } else {
+ node = path;
+ }
+ if (!node.node_ops.setattr) {
+ throw new FS.ErrnoError(63);
+ }
+ node.node_ops.setattr(node, {
+ timestamp: Date.now(),
+ // we ignore the uid / gid for now
+ });
+ },
+ lchown(path, uid, gid) {
+ FS.chown(path, uid, gid, true);
+ },
+ fchown(fd, uid, gid) {
+ var stream = FS.getStreamChecked(fd);
+ FS.chown(stream.node, uid, gid);
+ },
+ truncate(path, len) {
+ if (len < 0) {
+ throw new FS.ErrnoError(28);
+ }
+ var node;
+ if (typeof path == "string") {
+ var lookup = FS.lookupPath(path, { follow: true });
+ node = lookup.node;
+ } else {
+ node = path;
+ }
+ if (!node.node_ops.setattr) {
+ throw new FS.ErrnoError(63);
+ }
+ if (FS.isDir(node.mode)) {
+ throw new FS.ErrnoError(31);
+ }
+ if (!FS.isFile(node.mode)) {
+ throw new FS.ErrnoError(28);
+ }
+ var errCode = FS.nodePermissions(node, "w");
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ node.node_ops.setattr(node, {
+ size: len,
+ timestamp: Date.now(),
+ });
+ },
+ ftruncate(fd, len) {
+ var stream = FS.getStreamChecked(fd);
+ if ((stream.flags & 2097155) === 0) {
+ throw new FS.ErrnoError(28);
+ }
+ FS.truncate(stream.node, len);
+ },
+ utime(path, atime, mtime) {
+ var lookup = FS.lookupPath(path, { follow: true });
+ var node = lookup.node;
+ node.node_ops.setattr(node, {
+ atime: atime,
+ mtime: mtime,
+ });
+ },
+ open(path, flags, mode = 0o666) {
+ if (path === "") {
+ throw new FS.ErrnoError(44);
+ }
+ flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags;
+ if (flags & 64) {
+ mode = (mode & 4095) | 32768;
+ } else {
+ mode = 0;
+ }
+ var node;
+ if (typeof path == "object") {
+ node = path;
+ } else {
+ // noent_okay makes it so that if the final component of the path
+ // doesn't exist, lookupPath returns `node: undefined`. `path` will be
+ // updated to point to the target of all symlinks.
+ var lookup = FS.lookupPath(path, {
+ follow: !(flags & 131072),
+ noent_okay: true,
+ });
+ node = lookup.node;
+ path = lookup.path;
+ }
+ // perhaps we need to create the node
+ var created = false;
+ if (flags & 64) {
+ if (node) {
+ // if O_CREAT and O_EXCL are set, error out if the node already exists
+ if (flags & 128) {
+ throw new FS.ErrnoError(20);
+ }
+ } else {
+ // node doesn't exist, try to create it
+ node = FS.mknod(path, mode, 0);
+ created = true;
+ }
+ }
+ if (!node) {
+ throw new FS.ErrnoError(44);
+ }
+ // can't truncate a device
+ if (FS.isChrdev(node.mode)) {
+ flags &= ~512;
+ }
+ // if asked only for a directory, then this must be one
+ if (flags & 65536 && !FS.isDir(node.mode)) {
+ throw new FS.ErrnoError(54);
+ }
+ // check permissions, if this is not a file we just created now (it is ok to
+ // create and write to a file with read-only permissions; it is read-only
+ // for later use)
+ if (!created) {
+ var errCode = FS.mayOpen(node, flags);
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ }
+ // do truncation if necessary
+ if (flags & 512 && !created) {
+ FS.truncate(node, 0);
+ }
+ // we've already handled these, don't pass down to the underlying vfs
+ flags &= ~(128 | 512 | 131072);
+
+ // register the stream with the filesystem
+ var stream = FS.createStream({
+ node,
+ path: FS.getPath(node), // we want the absolute path to the node
+ flags,
+ seekable: true,
+ position: 0,
+ stream_ops: node.stream_ops,
+ // used by the file family libc calls (fopen, fwrite, ferror, etc.)
+ ungotten: [],
+ error: false,
+ });
+ // call the new stream's open function
+ if (stream.stream_ops.open) {
+ stream.stream_ops.open(stream);
+ }
+ if (Module["logReadFiles"] && !(flags & 1)) {
+ if (!(path in FS.readFiles)) {
+ FS.readFiles[path] = 1;
+ }
+ }
+ return stream;
+ },
+ close(stream) {
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if (stream.getdents) stream.getdents = null; // free readdir state
+ try {
+ if (stream.stream_ops.close) {
+ stream.stream_ops.close(stream);
+ }
+ } catch (e) {
+ throw e;
+ } finally {
+ FS.closeStream(stream.fd);
+ }
+ stream.fd = null;
+ },
+ isClosed(stream) {
+ return stream.fd === null;
+ },
+ llseek(stream, offset, whence) {
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if (!stream.seekable || !stream.stream_ops.llseek) {
+ throw new FS.ErrnoError(70);
+ }
+ if (whence != 0 && whence != 1 && whence != 2) {
+ throw new FS.ErrnoError(28);
+ }
+ stream.position = stream.stream_ops.llseek(stream, offset, whence);
+ stream.ungotten = [];
+ return stream.position;
+ },
+ read(stream, buffer, offset, length, position) {
+ assert(offset >= 0);
+ if (length < 0 || position < 0) {
+ throw new FS.ErrnoError(28);
+ }
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if ((stream.flags & 2097155) === 1) {
+ throw new FS.ErrnoError(8);
+ }
+ if (FS.isDir(stream.node.mode)) {
+ throw new FS.ErrnoError(31);
+ }
+ if (!stream.stream_ops.read) {
+ throw new FS.ErrnoError(28);
+ }
+ var seeking = typeof position != "undefined";
+ if (!seeking) {
+ position = stream.position;
+ } else if (!stream.seekable) {
+ throw new FS.ErrnoError(70);
+ }
+ var bytesRead = stream.stream_ops.read(
+ stream,
+ buffer,
+ offset,
+ length,
+ position,
+ );
+ if (!seeking) stream.position += bytesRead;
+ return bytesRead;
+ },
+ write(stream, buffer, offset, length, position, canOwn) {
+ assert(offset >= 0);
+ if (length < 0 || position < 0) {
+ throw new FS.ErrnoError(28);
+ }
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if ((stream.flags & 2097155) === 0) {
+ throw new FS.ErrnoError(8);
+ }
+ if (FS.isDir(stream.node.mode)) {
+ throw new FS.ErrnoError(31);
+ }
+ if (!stream.stream_ops.write) {
+ throw new FS.ErrnoError(28);
+ }
+ if (stream.seekable && stream.flags & 1024) {
+ // seek to the end before writing in append mode
+ FS.llseek(stream, 0, 2);
+ }
+ var seeking = typeof position != "undefined";
+ if (!seeking) {
+ position = stream.position;
+ } else if (!stream.seekable) {
+ throw new FS.ErrnoError(70);
+ }
+ var bytesWritten = stream.stream_ops.write(
+ stream,
+ buffer,
+ offset,
+ length,
+ position,
+ canOwn,
+ );
+ if (!seeking) stream.position += bytesWritten;
+ return bytesWritten;
+ },
+ allocate(stream, offset, length) {
+ if (FS.isClosed(stream)) {
+ throw new FS.ErrnoError(8);
+ }
+ if (offset < 0 || length <= 0) {
+ throw new FS.ErrnoError(28);
+ }
+ if ((stream.flags & 2097155) === 0) {
+ throw new FS.ErrnoError(8);
+ }
+ if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
+ throw new FS.ErrnoError(43);
+ }
+ if (!stream.stream_ops.allocate) {
+ throw new FS.ErrnoError(138);
+ }
+ stream.stream_ops.allocate(stream, offset, length);
+ },
+ mmap(stream, length, position, prot, flags) {
+ // User requests writing to file (prot & PROT_WRITE != 0).
+ // Checking if we have permissions to write to the file unless
+ // MAP_PRIVATE flag is set. According to POSIX spec it is possible
+ // to write to file opened in read-only mode with MAP_PRIVATE flag,
+ // as all modifications will be visible only in the memory of
+ // the current process.
+ if (
+ (prot & 2) !== 0 &&
+ (flags & 2) === 0 &&
+ (stream.flags & 2097155) !== 2
+ ) {
+ throw new FS.ErrnoError(2);
+ }
+ if ((stream.flags & 2097155) === 1) {
+ throw new FS.ErrnoError(2);
+ }
+ if (!stream.stream_ops.mmap) {
+ throw new FS.ErrnoError(43);
+ }
+ if (!length) {
+ throw new FS.ErrnoError(28);
+ }
+ return stream.stream_ops.mmap(stream, length, position, prot, flags);
+ },
+ msync(stream, buffer, offset, length, mmapFlags) {
+ assert(offset >= 0);
+ if (!stream.stream_ops.msync) {
+ return 0;
+ }
+ return stream.stream_ops.msync(
+ stream,
+ buffer,
+ offset,
+ length,
+ mmapFlags,
+ );
+ },
+ ioctl(stream, cmd, arg) {
+ if (!stream.stream_ops.ioctl) {
+ throw new FS.ErrnoError(59);
+ }
+ return stream.stream_ops.ioctl(stream, cmd, arg);
+ },
+ readFile(path, opts = {}) {
+ opts.flags = opts.flags || 0;
+ opts.encoding = opts.encoding || "binary";
+ if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
+ throw new Error(`Invalid encoding type "${opts.encoding}"`);
+ }
+ var ret;
+ var stream = FS.open(path, opts.flags);
+ var stat = FS.stat(path);
+ var length = stat.size;
+ var buf = new Uint8Array(length);
+ FS.read(stream, buf, 0, length, 0);
+ if (opts.encoding === "utf8") {
+ ret = UTF8ArrayToString(buf);
+ } else if (opts.encoding === "binary") {
+ ret = buf;
+ }
+ FS.close(stream);
+ return ret;
+ },
+ writeFile(path, data, opts = {}) {
+ opts.flags = opts.flags || 577;
+ var stream = FS.open(path, opts.flags, opts.mode);
+ if (typeof data == "string") {
+ var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
+ var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
+ FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn);
+ } else if (ArrayBuffer.isView(data)) {
+ FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn);
+ } else {
+ throw new Error("Unsupported data type");
+ }
+ FS.close(stream);
+ },
+ cwd: () => FS.currentPath,
+ chdir(path) {
+ var lookup = FS.lookupPath(path, { follow: true });
+ if (lookup.node === null) {
+ throw new FS.ErrnoError(44);
+ }
+ if (!FS.isDir(lookup.node.mode)) {
+ throw new FS.ErrnoError(54);
+ }
+ var errCode = FS.nodePermissions(lookup.node, "x");
+ if (errCode) {
+ throw new FS.ErrnoError(errCode);
+ }
+ FS.currentPath = lookup.path;
+ },
+ createDefaultDirectories() {
+ FS.mkdir("/tmp");
+ FS.mkdir("/home");
+ FS.mkdir("/home/web_user");
+ },
+ createDefaultDevices() {
+ // create /dev
+ FS.mkdir("/dev");
+ // setup /dev/null
+ FS.registerDevice(FS.makedev(1, 3), {
+ read: () => 0,
+ write: (stream, buffer, offset, length, pos) => length,
+ llseek: () => 0,
+ });
+ FS.mkdev("/dev/null", FS.makedev(1, 3));
+ // setup /dev/tty and /dev/tty1
+ // stderr needs to print output using err() rather than out()
+ // so we register a second tty just for it.
+ TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
+ TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
+ FS.mkdev("/dev/tty", FS.makedev(5, 0));
+ FS.mkdev("/dev/tty1", FS.makedev(6, 0));
+ // setup /dev/[u]random
+ // use a buffer to avoid overhead of individual crypto calls per byte
+ var randomBuffer = new Uint8Array(1024),
+ randomLeft = 0;
+ var randomByte = () => {
+ if (randomLeft === 0) {
+ randomLeft = randomFill(randomBuffer).byteLength;
+ }
+ return randomBuffer[--randomLeft];
+ };
+ FS.createDevice("/dev", "random", randomByte);
+ FS.createDevice("/dev", "urandom", randomByte);
+ // we're not going to emulate the actual shm device,
+ // just create the tmp dirs that reside in it commonly
+ FS.mkdir("/dev/shm");
+ FS.mkdir("/dev/shm/tmp");
+ },
+ createSpecialDirectories() {
+ // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the
+ // name of the stream for fd 6 (see test_unistd_ttyname)
+ FS.mkdir("/proc");
+ var proc_self = FS.mkdir("/proc/self");
+ FS.mkdir("/proc/self/fd");
+ FS.mount(
+ {
+ mount() {
+ var node = FS.createNode(proc_self, "fd", 16895, 73);
+ node.stream_ops = {
+ llseek: MEMFS.stream_ops.llseek,
+ };
+ node.node_ops = {
+ lookup(parent, name) {
+ var fd = +name;
+ var stream = FS.getStreamChecked(fd);
+ var ret = {
+ parent: null,
+ mount: { mountpoint: "fake" },
+ node_ops: { readlink: () => stream.path },
+ id: fd + 1,
+ };
+ ret.parent = ret; // make it look like a simple root node
+ return ret;
+ },
+ readdir() {
+ return Array.from(FS.streams.entries())
+ .filter(([k, v]) => v)
+ .map(([k, v]) => k.toString());
+ },
+ };
+ return node;
+ },
+ },
+ {},
+ "/proc/self/fd",
+ );
+ },
+ createStandardStreams(input, output, error) {
+ // TODO deprecate the old functionality of a single
+ // input / output callback and that utilizes FS.createDevice
+ // and instead require a unique set of stream ops
+
+ // by default, we symlink the standard streams to the
+ // default tty devices. however, if the standard streams
+ // have been overwritten we create a unique device for
+ // them instead.
+ if (input) {
+ FS.createDevice("/dev", "stdin", input);
+ } else {
+ FS.symlink("/dev/tty", "/dev/stdin");
+ }
+ if (output) {
+ FS.createDevice("/dev", "stdout", null, output);
+ } else {
+ FS.symlink("/dev/tty", "/dev/stdout");
+ }
+ if (error) {
+ FS.createDevice("/dev", "stderr", null, error);
+ } else {
+ FS.symlink("/dev/tty1", "/dev/stderr");
+ }
+
+ // open default streams for the stdin, stdout and stderr devices
+ var stdin = FS.open("/dev/stdin", 0);
+ var stdout = FS.open("/dev/stdout", 1);
+ var stderr = FS.open("/dev/stderr", 1);
+ assert(stdin.fd === 0, `invalid handle for stdin (${stdin.fd})`);
+ assert(stdout.fd === 1, `invalid handle for stdout (${stdout.fd})`);
+ assert(stderr.fd === 2, `invalid handle for stderr (${stderr.fd})`);
+ },
+ staticInit() {
+ FS.nameTable = new Array(4096);
+
+ FS.mount(MEMFS, {}, "/");
+
+ FS.createDefaultDirectories();
+ FS.createDefaultDevices();
+ FS.createSpecialDirectories();
+
+ FS.filesystems = {
+ MEMFS: MEMFS,
+ };
+ },
+ init(input, output, error) {
+ assert(
+ !FS.initialized,
+ "FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)",
+ );
+ FS.initialized = true;
+
+ // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here
+ input ??= Module["stdin"];
+ output ??= Module["stdout"];
+ error ??= Module["stderr"];
+
+ FS.createStandardStreams(input, output, error);
+ },
+ quit() {
+ FS.initialized = false;
+ // force-flush all streams, so we get musl std streams printed out
+ _fflush(0);
+ // close all of our streams
+ for (var i = 0; i < FS.streams.length; i++) {
+ var stream = FS.streams[i];
+ if (!stream) {
+ continue;
+ }
+ FS.close(stream);
+ }
+ },
+ findObject(path, dontResolveLastLink) {
+ var ret = FS.analyzePath(path, dontResolveLastLink);
+ if (!ret.exists) {
+ return null;
+ }
+ return ret.object;
+ },
+ analyzePath(path, dontResolveLastLink) {
+ // operate from within the context of the symlink's target
+ try {
+ var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
+ path = lookup.path;
+ } catch (e) {}
+ var ret = {
+ isRoot: false,
+ exists: false,
+ error: 0,
+ name: null,
+ path: null,
+ object: null,
+ parentExists: false,
+ parentPath: null,
+ parentObject: null,
+ };
+ try {
+ var lookup = FS.lookupPath(path, { parent: true });
+ ret.parentExists = true;
+ ret.parentPath = lookup.path;
+ ret.parentObject = lookup.node;
+ ret.name = PATH.basename(path);
+ lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });
+ ret.exists = true;
+ ret.path = lookup.path;
+ ret.object = lookup.node;
+ ret.name = lookup.node.name;
+ ret.isRoot = lookup.path === "/";
+ } catch (e) {
+ ret.error = e.errno;
+ }
+ return ret;
+ },
+ createPath(parent, path, canRead, canWrite) {
+ parent = typeof parent == "string" ? parent : FS.getPath(parent);
+ var parts = path.split("/").reverse();
+ while (parts.length) {
+ var part = parts.pop();
+ if (!part) continue;
+ var current = PATH.join2(parent, part);
+ try {
+ FS.mkdir(current);
+ } catch (e) {
+ // ignore EEXIST
+ }
+ parent = current;
+ }
+ return current;
+ },
+ createFile(parent, name, properties, canRead, canWrite) {
+ var path = PATH.join2(
+ typeof parent == "string" ? parent : FS.getPath(parent),
+ name,
+ );
+ var mode = FS_getMode(canRead, canWrite);
+ return FS.create(path, mode);
+ },
+ createDataFile(parent, name, data, canRead, canWrite, canOwn) {
+ var path = name;
+ if (parent) {
+ parent = typeof parent == "string" ? parent : FS.getPath(parent);
+ path = name ? PATH.join2(parent, name) : parent;
+ }
+ var mode = FS_getMode(canRead, canWrite);
+ var node = FS.create(path, mode);
+ if (data) {
+ if (typeof data == "string") {
+ var arr = new Array(data.length);
+ for (var i = 0, len = data.length; i < len; ++i)
+ arr[i] = data.charCodeAt(i);
+ data = arr;
+ }
+ // make sure we can write to the file
+ FS.chmod(node, mode | 146);
+ var stream = FS.open(node, 577);
+ FS.write(stream, data, 0, data.length, 0, canOwn);
+ FS.close(stream);
+ FS.chmod(node, mode);
+ }
+ },
+ createDevice(parent, name, input, output) {
+ var path = PATH.join2(
+ typeof parent == "string" ? parent : FS.getPath(parent),
+ name,
+ );
+ var mode = FS_getMode(!!input, !!output);
+ FS.createDevice.major ??= 64;
+ var dev = FS.makedev(FS.createDevice.major++, 0);
+ // Create a fake device that a set of stream ops to emulate
+ // the old behavior.
+ FS.registerDevice(dev, {
+ open(stream) {
+ stream.seekable = false;
+ },
+ close(stream) {
+ // flush any pending line data
+ if (output?.buffer?.length) {
+ output(10);
+ }
+ },
+ read(stream, buffer, offset, length, pos /* ignored */) {
+ var bytesRead = 0;
+ for (var i = 0; i < length; i++) {
+ var result;
+ try {
+ result = input();
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ if (result === undefined && bytesRead === 0) {
+ throw new FS.ErrnoError(6);
+ }
+ if (result === null || result === undefined) break;
+ bytesRead++;
+ buffer[offset + i] = result;
+ }
+ if (bytesRead) {
+ stream.node.atime = Date.now();
+ }
+ return bytesRead;
+ },
+ write(stream, buffer, offset, length, pos) {
+ for (var i = 0; i < length; i++) {
+ try {
+ output(buffer[offset + i]);
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ }
+ if (length) {
+ stream.node.mtime = stream.node.ctime = Date.now();
+ }
+ return i;
+ },
+ });
+ return FS.mkdev(path, mode, dev);
+ },
+ forceLoadFile(obj) {
+ if (obj.isDevice || obj.isFolder || obj.link || obj.contents)
+ return true;
+ if (typeof XMLHttpRequest != "undefined") {
+ throw new Error(
+ "Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.",
+ );
+ } else {
+ // Command-line.
+ try {
+ obj.contents = readBinary(obj.url);
+ obj.usedBytes = obj.contents.length;
+ } catch (e) {
+ throw new FS.ErrnoError(29);
+ }
+ }
+ },
+ createLazyFile(parent, name, url, canRead, canWrite) {
+ // Lazy chunked Uint8Array (implements get and length from Uint8Array).
+ // Actual getting is abstracted away for eventual reuse.
+ class LazyUint8Array {
+ lengthKnown = false;
+ chunks = []; // Loaded chunks. Index is the chunk number
+ get(idx) {
+ if (idx > this.length - 1 || idx < 0) {
+ return undefined;
+ }
+ var chunkOffset = idx % this.chunkSize;
+ var chunkNum = (idx / this.chunkSize) | 0;
+ return this.getter(chunkNum)[chunkOffset];
+ }
+ setDataGetter(getter) {
+ this.getter = getter;
+ }
+ cacheLength() {
+ // Find length
+ var xhr = new XMLHttpRequest();
+ xhr.open("HEAD", url, false);
+ xhr.send(null);
+ if (
+ !((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
+ )
+ throw new Error(
+ "Couldn't load " + url + ". Status: " + xhr.status,
+ );
+ var datalength = Number(xhr.getResponseHeader("Content-length"));
+ var header;
+ var hasByteServing =
+ (header = xhr.getResponseHeader("Accept-Ranges")) &&
+ header === "bytes";
+ var usesGzip =
+ (header = xhr.getResponseHeader("Content-Encoding")) &&
+ header === "gzip";
+
+ var chunkSize = 1024 * 1024; // Chunk size in bytes
+
+ if (!hasByteServing) chunkSize = datalength;
+
+ // Function to get a range from the remote URL.
+ var doXHR = (from, to) => {
+ if (from > to)
+ throw new Error(
+ "invalid range (" +
+ from +
+ ", " +
+ to +
+ ") or no bytes requested!",
+ );
+ if (to > datalength - 1)
+ throw new Error(
+ "only " + datalength + " bytes available! programmer error!",
+ );
+
+ // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, false);
+ if (datalength !== chunkSize)
+ xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
+
+ // Some hints to the browser that we want binary data.
+ xhr.responseType = "arraybuffer";
+ if (xhr.overrideMimeType) {
+ xhr.overrideMimeType("text/plain; charset=x-user-defined");
+ }
+
+ xhr.send(null);
+ if (
+ !((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)
+ )
+ throw new Error(
+ "Couldn't load " + url + ". Status: " + xhr.status,
+ );
+ if (xhr.response !== undefined) {
+ return new Uint8Array(
+ /** @type{Array<number>} */ (xhr.response || []),
+ );
+ }
+ return intArrayFromString(xhr.responseText || "", true);
+ };
+ var lazyArray = this;
+ lazyArray.setDataGetter((chunkNum) => {
+ var start = chunkNum * chunkSize;
+ var end = (chunkNum + 1) * chunkSize - 1; // including this byte
+ end = Math.min(end, datalength - 1); // if datalength-1 is selected, this is the last block
+ if (typeof lazyArray.chunks[chunkNum] == "undefined") {
+ lazyArray.chunks[chunkNum] = doXHR(start, end);
+ }
+ if (typeof lazyArray.chunks[chunkNum] == "undefined")
+ throw new Error("doXHR failed!");
+ return lazyArray.chunks[chunkNum];
+ });
+
+ if (usesGzip || !datalength) {
+ // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length
+ chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file
+ datalength = this.getter(0).length;
+ chunkSize = datalength;
+ out(
+ "LazyFiles on gzip forces download of the whole file when length is accessed",
+ );
+ }
+
+ this._length = datalength;
+ this._chunkSize = chunkSize;
+ this.lengthKnown = true;
+ }
+ get length() {
+ if (!this.lengthKnown) {
+ this.cacheLength();
+ }
+ return this._length;
+ }
+ get chunkSize() {
+ if (!this.lengthKnown) {
+ this.cacheLength();
+ }
+ return this._chunkSize;
+ }
+ }
+
+ if (typeof XMLHttpRequest != "undefined") {
+ if (!ENVIRONMENT_IS_WORKER)
+ throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
+ var lazyArray = new LazyUint8Array();
+ var properties = { isDevice: false, contents: lazyArray };
+ } else {
+ var properties = { isDevice: false, url: url };
+ }
+
+ var node = FS.createFile(parent, name, properties, canRead, canWrite);
+ // This is a total hack, but I want to get this lazy file code out of the
+ // core of MEMFS. If we want to keep this lazy file concept I feel it should
+ // be its own thin LAZYFS proxying calls to MEMFS.
+ if (properties.contents) {
+ node.contents = properties.contents;
+ } else if (properties.url) {
+ node.contents = null;
+ node.url = properties.url;
+ }
+ // Add a function that defers querying the file size until it is asked the first time.
+ Object.defineProperties(node, {
+ usedBytes: {
+ get: function () {
+ return this.contents.length;
+ },
+ },
+ });
+ // override each stream op with one that tries to force load the lazy file first
+ var stream_ops = {};
+ var keys = Object.keys(node.stream_ops);
+ keys.forEach((key) => {
+ var fn = node.stream_ops[key];
+ stream_ops[key] = (...args) => {
+ FS.forceLoadFile(node);
+ return fn(...args);
+ };
+ });
+ function writeChunks(stream, buffer, offset, length, position) {
+ var contents = stream.node.contents;
+ if (position >= contents.length) return 0;
+ var size = Math.min(contents.length - position, length);
+ assert(size >= 0);
+ if (contents.slice) {
+ // normal array
+ for (var i = 0; i < size; i++) {
+ buffer[offset + i] = contents[position + i];
+ }
+ } else {
+ for (var i = 0; i < size; i++) {
+ // LazyUint8Array from sync binary XHR
+ buffer[offset + i] = contents.get(position + i);
+ }
+ }
+ return size;
+ }
+ // use a custom read function
+ stream_ops.read = (stream, buffer, offset, length, position) => {
+ FS.forceLoadFile(node);
+ return writeChunks(stream, buffer, offset, length, position);
+ };
+ // use a custom mmap function
+ stream_ops.mmap = (stream, length, position, prot, flags) => {
+ FS.forceLoadFile(node);
+ var ptr = mmapAlloc(length);
+ if (!ptr) {
+ throw new FS.ErrnoError(48);
+ }
+ writeChunks(stream, HEAP8, ptr, length, position);
+ return { ptr, allocated: true };
+ };
+ node.stream_ops = stream_ops;
+ return node;
+ },
+ absolutePath() {
+ abort("FS.absolutePath has been removed; use PATH_FS.resolve instead");
+ },
+ createFolder() {
+ abort("FS.createFolder has been removed; use FS.mkdir instead");
+ },
+ createLink() {
+ abort("FS.createLink has been removed; use FS.symlink instead");
+ },
+ joinPath() {
+ abort("FS.joinPath has been removed; use PATH.join instead");
+ },
+ mmapAlloc() {
+ abort(
+ "FS.mmapAlloc has been replaced by the top level function mmapAlloc",
+ );
+ },
+ standardizePath() {
+ abort(
+ "FS.standardizePath has been removed; use PATH.normalize instead",
+ );
+ },
+ };
+
+ var SYSCALLS = {
+ DEFAULT_POLLMASK: 5,
+ calculateAt(dirfd, path, allowEmpty) {
+ if (PATH.isAbs(path)) {
+ return path;
+ }
+ // relative path
+ var dir;
+ if (dirfd === -100) {
+ dir = FS.cwd();
+ } else {
+ var dirstream = SYSCALLS.getStreamFromFD(dirfd);
+ dir = dirstream.path;
+ }
+ if (path.length == 0) {
+ if (!allowEmpty) {
+ throw new FS.ErrnoError(44);
+ }
+ return dir;
+ }
+ return dir + "/" + path;
+ },
+ doStat(func, path, buf) {
+ var stat = func(path);
+ HEAP32[buf >> 2] = stat.dev;
+ HEAP32[(buf + 4) >> 2] = stat.mode;
+ HEAPU32[(buf + 8) >> 2] = stat.nlink;
+ HEAP32[(buf + 12) >> 2] = stat.uid;
+ HEAP32[(buf + 16) >> 2] = stat.gid;
+ HEAP32[(buf + 20) >> 2] = stat.rdev;
+ (tempI64 = [
+ stat.size >>> 0,
+ ((tempDouble = stat.size),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 24) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 28) >> 2] = tempI64[1]);
+ HEAP32[(buf + 32) >> 2] = 4096;
+ HEAP32[(buf + 36) >> 2] = stat.blocks;
+ var atime = stat.atime.getTime();
+ var mtime = stat.mtime.getTime();
+ var ctime = stat.ctime.getTime();
+ (tempI64 = [
+ Math.floor(atime / 1000) >>> 0,
+ ((tempDouble = Math.floor(atime / 1000)),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 40) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 44) >> 2] = tempI64[1]);
+ HEAPU32[(buf + 48) >> 2] = (atime % 1000) * 1000 * 1000;
+ (tempI64 = [
+ Math.floor(mtime / 1000) >>> 0,
+ ((tempDouble = Math.floor(mtime / 1000)),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 56) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 60) >> 2] = tempI64[1]);
+ HEAPU32[(buf + 64) >> 2] = (mtime % 1000) * 1000 * 1000;
+ (tempI64 = [
+ Math.floor(ctime / 1000) >>> 0,
+ ((tempDouble = Math.floor(ctime / 1000)),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 72) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 76) >> 2] = tempI64[1]);
+ HEAPU32[(buf + 80) >> 2] = (ctime % 1000) * 1000 * 1000;
+ (tempI64 = [
+ stat.ino >>> 0,
+ ((tempDouble = stat.ino),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(buf + 88) >> 2] = tempI64[0]),
+ (HEAP32[(buf + 92) >> 2] = tempI64[1]);
+ return 0;
+ },
+ doMsync(addr, stream, len, flags, offset) {
+ if (!FS.isFile(stream.node.mode)) {
+ throw new FS.ErrnoError(43);
+ }
+ if (flags & 2) {
+ // MAP_PRIVATE calls need not to be synced back to underlying fs
+ return 0;
+ }
+ var buffer = HEAPU8.slice(addr, addr + len);
+ FS.msync(stream, buffer, offset, len, flags);
+ },
+ getStreamFromFD(fd) {
+ var stream = FS.getStreamChecked(fd);
+ return stream;
+ },
+ varargs: undefined,
+ getStr(ptr) {
+ var ret = UTF8ToString(ptr);
+ return ret;
+ },
+ };
+ var ___syscall__newselect = function (
+ nfds,
+ readfds,
+ writefds,
+ exceptfds,
+ timeout,
+ ) {
+ try {
+ // readfds are supported,
+ // writefds checks socket open status
+ // exceptfds are supported, although on web, such exceptional conditions never arise in web sockets
+ // and so the exceptfds list will always return empty.
+ // timeout is supported, although on SOCKFS and PIPEFS these are ignored and always treated as 0 - fully async
+ assert(nfds <= 64, "nfds must be less than or equal to 64"); // fd sets have 64 bits // TODO: this could be 1024 based on current musl headers
+
+ var total = 0;
+
+ var srcReadLow = readfds ? HEAP32[readfds >> 2] : 0,
+ srcReadHigh = readfds ? HEAP32[(readfds + 4) >> 2] : 0;
+ var srcWriteLow = writefds ? HEAP32[writefds >> 2] : 0,
+ srcWriteHigh = writefds ? HEAP32[(writefds + 4) >> 2] : 0;
+ var srcExceptLow = exceptfds ? HEAP32[exceptfds >> 2] : 0,
+ srcExceptHigh = exceptfds ? HEAP32[(exceptfds + 4) >> 2] : 0;
+
+ var dstReadLow = 0,
+ dstReadHigh = 0;
+ var dstWriteLow = 0,
+ dstWriteHigh = 0;
+ var dstExceptLow = 0,
+ dstExceptHigh = 0;
+
+ var allLow =
+ (readfds ? HEAP32[readfds >> 2] : 0) |
+ (writefds ? HEAP32[writefds >> 2] : 0) |
+ (exceptfds ? HEAP32[exceptfds >> 2] : 0);
+ var allHigh =
+ (readfds ? HEAP32[(readfds + 4) >> 2] : 0) |
+ (writefds ? HEAP32[(writefds + 4) >> 2] : 0) |
+ (exceptfds ? HEAP32[(exceptfds + 4) >> 2] : 0);
+
+ var check = (fd, low, high, val) => (fd < 32 ? low & val : high & val);
+
+ for (var fd = 0; fd < nfds; fd++) {
+ var mask = 1 << (fd % 32);
+ if (!check(fd, allLow, allHigh, mask)) {
+ continue; // index isn't in the set
+ }
+
+ var stream = SYSCALLS.getStreamFromFD(fd);
+
+ var flags = SYSCALLS.DEFAULT_POLLMASK;
+
+ if (stream.stream_ops.poll) {
+ var timeoutInMillis = -1;
+ if (timeout) {
+ // select(2) is declared to accept "struct timeval { time_t tv_sec; suseconds_t tv_usec; }".
+ // However, musl passes the two values to the syscall as an array of long values.
+ // Note that sizeof(time_t) != sizeof(long) in wasm32. The former is 8, while the latter is 4.
+ // This means using "C_STRUCTS.timeval.tv_usec" leads to a wrong offset.
+ // So, instead, we use POINTER_SIZE.
+ var tv_sec = readfds ? HEAP32[timeout >> 2] : 0,
+ tv_usec = readfds ? HEAP32[(timeout + 4) >> 2] : 0;
+ timeoutInMillis = (tv_sec + tv_usec / 1000000) * 1000;
+ }
+ flags = stream.stream_ops.poll(stream, timeoutInMillis);
+ }
+
+ if (flags & 1 && check(fd, srcReadLow, srcReadHigh, mask)) {
+ fd < 32
+ ? (dstReadLow = dstReadLow | mask)
+ : (dstReadHigh = dstReadHigh | mask);
+ total++;
+ }
+ if (flags & 4 && check(fd, srcWriteLow, srcWriteHigh, mask)) {
+ fd < 32
+ ? (dstWriteLow = dstWriteLow | mask)
+ : (dstWriteHigh = dstWriteHigh | mask);
+ total++;
+ }
+ if (flags & 2 && check(fd, srcExceptLow, srcExceptHigh, mask)) {
+ fd < 32
+ ? (dstExceptLow = dstExceptLow | mask)
+ : (dstExceptHigh = dstExceptHigh | mask);
+ total++;
+ }
+ }
+
+ if (readfds) {
+ HEAP32[readfds >> 2] = dstReadLow;
+ HEAP32[(readfds + 4) >> 2] = dstReadHigh;
+ }
+ if (writefds) {
+ HEAP32[writefds >> 2] = dstWriteLow;
+ HEAP32[(writefds + 4) >> 2] = dstWriteHigh;
+ }
+ if (exceptfds) {
+ HEAP32[exceptfds >> 2] = dstExceptLow;
+ HEAP32[(exceptfds + 4) >> 2] = dstExceptHigh;
+ }
+
+ return total;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ };
+
+ var SOCKFS = {
+ websocketArgs: {},
+ callbacks: {},
+ on(event, callback) {
+ SOCKFS.callbacks[event] = callback;
+ },
+ emit(event, param) {
+ SOCKFS.callbacks[event]?.(param);
+ },
+ mount(mount) {
+ // The incomming Module['websocket'] can be used for configuring
+ // configuring subprotocol/url, etc
+ SOCKFS.websocketArgs = Module["websocket"] || {};
+ // Add the Event registration mechanism to the exported websocket configuration
+ // object so we can register network callbacks from native JavaScript too.
+ // For more documentation see system/include/emscripten/emscripten.h
+ (Module["websocket"] ??= {})["on"] = SOCKFS.on;
+
+ return FS.createNode(null, "/", 16895, 0);
+ },
+ createSocket(family, type, protocol) {
+ type &= ~526336; // Some applications may pass it; it makes no sense for a single process.
+ var streaming = type == 1;
+ if (streaming && protocol && protocol != 6) {
+ throw new FS.ErrnoError(66); // if SOCK_STREAM, must be tcp or 0.
+ }
+
+ // create our internal socket structure
+ var sock = {
+ family,
+ type,
+ protocol,
+ server: null,
+ error: null, // Used in getsockopt for SOL_SOCKET/SO_ERROR test
+ peers: {},
+ pending: [],
+ recv_queue: [],
+ sock_ops: SOCKFS.websocket_sock_ops,
+ };
+
+ // create the filesystem node to store the socket structure
+ var name = SOCKFS.nextname();
+ var node = FS.createNode(SOCKFS.root, name, 49152, 0);
+ node.sock = sock;
+
+ // and the wrapping stream that enables library functions such
+ // as read and write to indirectly interact with the socket
+ var stream = FS.createStream({
+ path: name,
+ node,
+ flags: 2,
+ seekable: false,
+ stream_ops: SOCKFS.stream_ops,
+ });
+
+ // map the new stream to the socket structure (sockets have a 1:1
+ // relationship with a stream)
+ sock.stream = stream;
+
+ return sock;
+ },
+ getSocket(fd) {
+ var stream = FS.getStream(fd);
+ if (!stream || !FS.isSocket(stream.node.mode)) {
+ return null;
+ }
+ return stream.node.sock;
+ },
+ stream_ops: {
+ poll(stream) {
+ var sock = stream.node.sock;
+ return sock.sock_ops.poll(sock);
+ },
+ ioctl(stream, request, varargs) {
+ var sock = stream.node.sock;
+ return sock.sock_ops.ioctl(sock, request, varargs);
+ },
+ read(stream, buffer, offset, length, position /* ignored */) {
+ var sock = stream.node.sock;
+ var msg = sock.sock_ops.recvmsg(sock, length);
+ if (!msg) {
+ // socket is closed
+ return 0;
+ }
+ buffer.set(msg.buffer, offset);
+ return msg.buffer.length;
+ },
+ write(stream, buffer, offset, length, position /* ignored */) {
+ var sock = stream.node.sock;
+ return sock.sock_ops.sendmsg(sock, buffer, offset, length);
+ },
+ close(stream) {
+ var sock = stream.node.sock;
+ sock.sock_ops.close(sock);
+ },
+ },
+ nextname() {
+ if (!SOCKFS.nextname.current) {
+ SOCKFS.nextname.current = 0;
+ }
+ return `socket[${SOCKFS.nextname.current++}]`;
+ },
+ websocket_sock_ops: {
+ createPeer(sock, addr, port) {
+ var ws;
+
+ if (typeof addr == "object") {
+ ws = addr;
+ addr = null;
+ port = null;
+ }
+
+ if (ws) {
+ // for sockets that've already connected (e.g. we're the server)
+ // we can inspect the _socket property for the address
+ if (ws._socket) {
+ addr = ws._socket.remoteAddress;
+ port = ws._socket.remotePort;
+ }
+ // if we're just now initializing a connection to the remote,
+ // inspect the url property
+ else {
+ var result = /ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);
+ if (!result) {
+ throw new Error(
+ "WebSocket URL must be in the format ws(s)://address:port",
+ );
+ }
+ addr = result[1];
+ port = parseInt(result[2], 10);
+ }
+ } else {
+ // create the actual websocket object and connect
+ try {
+ // The default value is 'ws://' the replace is needed because the compiler replaces '//' comments with '#'
+ // comments without checking context, so we'd end up with ws:#, the replace swaps the '#' for '//' again.
+ var url = "ws:#".replace("#", "//");
+ // Make the WebSocket subprotocol (Sec-WebSocket-Protocol) default to binary if no configuration is set.
+ var subProtocols = "binary"; // The default value is 'binary'
+ // The default WebSocket options
+ var opts = undefined;
+
+ // Fetch runtime WebSocket URL config.
+ if (SOCKFS.websocketArgs["url"]) {
+ url = SOCKFS.websocketArgs["url"];
+ }
+ // Fetch runtime WebSocket subprotocol config.
+ if (SOCKFS.websocketArgs["subprotocol"]) {
+ subProtocols = SOCKFS.websocketArgs["subprotocol"];
+ } else if (SOCKFS.websocketArgs["subprotocol"] === null) {
+ subProtocols = "null";
+ }
+
+ if (url === "ws://" || url === "wss://") {
+ // Is the supplied URL config just a prefix, if so complete it.
+ var parts = addr.split("/");
+ url =
+ url + parts[0] + ":" + port + "/" + parts.slice(1).join("/");
+ }
+
+ if (subProtocols !== "null") {
+ // The regex trims the string (removes spaces at the beginning and end, then splits the string by
+ // <any space>,<any space> into an Array. Whitespace removal is important for Websockify and ws.
+ subProtocols = subProtocols
+ .replace(/^ +| +$/g, "")
+ .split(/ *, */);
+
+ opts = subProtocols;
+ }
+
+ // If node we use the ws library.
+ var WebSocketConstructor;
+ {
+ WebSocketConstructor = WebSocket;
+ }
+ ws = new WebSocketConstructor(url, opts);
+ ws.binaryType = "arraybuffer";
+ } catch (e) {
+ throw new FS.ErrnoError(23);
+ }
+ }
+
+ var peer = {
+ addr,
+ port,
+ socket: ws,
+ msg_send_queue: [],
+ };
+
+ SOCKFS.websocket_sock_ops.addPeer(sock, peer);
+ SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);
+
+ // if this is a bound dgram socket, send the port number first to allow
+ // us to override the ephemeral port reported to us by remotePort on the
+ // remote end.
+ if (sock.type === 2 && typeof sock.sport != "undefined") {
+ peer.msg_send_queue.push(
+ new Uint8Array([
+ 255,
+ 255,
+ 255,
+ 255,
+ "p".charCodeAt(0),
+ "o".charCodeAt(0),
+ "r".charCodeAt(0),
+ "t".charCodeAt(0),
+ (sock.sport & 0xff00) >> 8,
+ sock.sport & 0xff,
+ ]),
+ );
+ }
+
+ return peer;
+ },
+ getPeer(sock, addr, port) {
+ return sock.peers[addr + ":" + port];
+ },
+ addPeer(sock, peer) {
+ sock.peers[peer.addr + ":" + peer.port] = peer;
+ },
+ removePeer(sock, peer) {
+ delete sock.peers[peer.addr + ":" + peer.port];
+ },
+ handlePeerEvents(sock, peer) {
+ var first = true;
+
+ var handleOpen = function () {
+ sock.connecting = false;
+ SOCKFS.emit("open", sock.stream.fd);
+
+ try {
+ var queued = peer.msg_send_queue.shift();
+ while (queued) {
+ peer.socket.send(queued);
+ queued = peer.msg_send_queue.shift();
+ }
+ } catch (e) {
+ // not much we can do here in the way of proper error handling as we've already
+ // lied and said this data was sent. shut it down.
+ peer.socket.close();
+ }
+ };
+
+ function handleMessage(data) {
+ if (typeof data == "string") {
+ var encoder = new TextEncoder(); // should be utf-8
+ data = encoder.encode(data); // make a typed array from the string
+ } else {
+ assert(data.byteLength !== undefined); // must receive an ArrayBuffer
+ if (data.byteLength == 0) {
+ // An empty ArrayBuffer will emit a pseudo disconnect event
+ // as recv/recvmsg will return zero which indicates that a socket
+ // has performed a shutdown although the connection has not been disconnected yet.
+ return;
+ }
+ data = new Uint8Array(data); // make a typed array view on the array buffer
+ }
+
+ // if this is the port message, override the peer's port with it
+ var wasfirst = first;
+ first = false;
+ if (
+ wasfirst &&
+ data.length === 10 &&
+ data[0] === 255 &&
+ data[1] === 255 &&
+ data[2] === 255 &&
+ data[3] === 255 &&
+ data[4] === "p".charCodeAt(0) &&
+ data[5] === "o".charCodeAt(0) &&
+ data[6] === "r".charCodeAt(0) &&
+ data[7] === "t".charCodeAt(0)
+ ) {
+ // update the peer's port and it's key in the peer map
+ var newport = (data[8] << 8) | data[9];
+ SOCKFS.websocket_sock_ops.removePeer(sock, peer);
+ peer.port = newport;
+ SOCKFS.websocket_sock_ops.addPeer(sock, peer);
+ return;
+ }
+
+ sock.recv_queue.push({
+ addr: peer.addr,
+ port: peer.port,
+ data: data,
+ });
+ SOCKFS.emit("message", sock.stream.fd);
+ }
+
+ if (ENVIRONMENT_IS_NODE) {
+ peer.socket.on("open", handleOpen);
+ peer.socket.on("message", function (data, isBinary) {
+ if (!isBinary) {
+ return;
+ }
+ handleMessage(new Uint8Array(data).buffer); // copy from node Buffer -> ArrayBuffer
+ });
+ peer.socket.on("close", function () {
+ SOCKFS.emit("close", sock.stream.fd);
+ });
+ peer.socket.on("error", function (error) {
+ // Although the ws library may pass errors that may be more descriptive than
+ // ECONNREFUSED they are not necessarily the expected error code e.g.
+ // ENOTFOUND on getaddrinfo seems to be node.js specific, so using ECONNREFUSED
+ // is still probably the most useful thing to do.
+ sock.error = 14; // Used in getsockopt for SOL_SOCKET/SO_ERROR test.
+ SOCKFS.emit("error", [
+ sock.stream.fd,
+ sock.error,
+ "ECONNREFUSED: Connection refused",
+ ]);
+ // don't throw
+ });
+ } else {
+ peer.socket.onopen = handleOpen;
+ peer.socket.onclose = function () {
+ SOCKFS.emit("close", sock.stream.fd);
+ };
+ peer.socket.onmessage = function peer_socket_onmessage(event) {
+ handleMessage(event.data);
+ };
+ peer.socket.onerror = function (error) {
+ // The WebSocket spec only allows a 'simple event' to be thrown on error,
+ // so we only really know as much as ECONNREFUSED.
+ sock.error = 14; // Used in getsockopt for SOL_SOCKET/SO_ERROR test.
+ SOCKFS.emit("error", [
+ sock.stream.fd,
+ sock.error,
+ "ECONNREFUSED: Connection refused",
+ ]);
+ };
+ }
+ },
+ poll(sock) {
+ if (sock.type === 1 && sock.server) {
+ // listen sockets should only say they're available for reading
+ // if there are pending clients.
+ return sock.pending.length ? 64 | 1 : 0;
+ }
+
+ var mask = 0;
+ var dest =
+ sock.type === 1
+ ? // we only care about the socket state for connection-based sockets
+ SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport)
+ : null;
+
+ if (
+ sock.recv_queue.length ||
+ !dest || // connection-less sockets are always ready to read
+ (dest && dest.socket.readyState === dest.socket.CLOSING) ||
+ (dest && dest.socket.readyState === dest.socket.CLOSED)
+ ) {
+ // let recv return 0 once closed
+ mask |= 64 | 1;
+ }
+
+ if (
+ !dest || // connection-less sockets are always ready to write
+ (dest && dest.socket.readyState === dest.socket.OPEN)
+ ) {
+ mask |= 4;
+ }
+
+ if (
+ (dest && dest.socket.readyState === dest.socket.CLOSING) ||
+ (dest && dest.socket.readyState === dest.socket.CLOSED)
+ ) {
+ // When an non-blocking connect fails mark the socket as writable.
+ // Its up to the calling code to then use getsockopt with SO_ERROR to
+ // retrieve the error.
+ // See https://man7.org/linux/man-pages/man2/connect.2.html
+ if (sock.connecting) {
+ mask |= 4;
+ } else {
+ mask |= 16;
+ }
+ }
+
+ return mask;
+ },
+ ioctl(sock, request, arg) {
+ switch (request) {
+ case 21531:
+ var bytes = 0;
+ if (sock.recv_queue.length) {
+ bytes = sock.recv_queue[0].data.length;
+ }
+ HEAP32[arg >> 2] = bytes;
+ return 0;
+ default:
+ return 28;
+ }
+ },
+ close(sock) {
+ // if we've spawned a listen server, close it
+ if (sock.server) {
+ try {
+ sock.server.close();
+ } catch (e) {}
+ sock.server = null;
+ }
+ // close any peer connections
+ var peers = Object.keys(sock.peers);
+ for (var i = 0; i < peers.length; i++) {
+ var peer = sock.peers[peers[i]];
+ try {
+ peer.socket.close();
+ } catch (e) {}
+ SOCKFS.websocket_sock_ops.removePeer(sock, peer);
+ }
+ return 0;
+ },
+ bind(sock, addr, port) {
+ if (
+ typeof sock.saddr != "undefined" ||
+ typeof sock.sport != "undefined"
+ ) {
+ throw new FS.ErrnoError(28); // already bound
+ }
+ sock.saddr = addr;
+ sock.sport = port;
+ // in order to emulate dgram sockets, we need to launch a listen server when
+ // binding on a connection-less socket
+ // note: this is only required on the server side
+ if (sock.type === 2) {
+ // close the existing server if it exists
+ if (sock.server) {
+ sock.server.close();
+ sock.server = null;
+ }
+ // swallow error operation not supported error that occurs when binding in the
+ // browser where this isn't supported
+ try {
+ sock.sock_ops.listen(sock, 0);
+ } catch (e) {
+ if (!(e.name === "ErrnoError")) throw e;
+ if (e.errno !== 138) throw e;
+ }
+ }
+ },
+ connect(sock, addr, port) {
+ if (sock.server) {
+ throw new FS.ErrnoError(138);
+ }
+
+ // TODO autobind
+ // if (!sock.addr && sock.type == 2) {
+ // }
+
+ // early out if we're already connected / in the middle of connecting
+ if (
+ typeof sock.daddr != "undefined" &&
+ typeof sock.dport != "undefined"
+ ) {
+ var dest = SOCKFS.websocket_sock_ops.getPeer(
+ sock,
+ sock.daddr,
+ sock.dport,
+ );
+ if (dest) {
+ if (dest.socket.readyState === dest.socket.CONNECTING) {
+ throw new FS.ErrnoError(7);
+ } else {
+ throw new FS.ErrnoError(30);
+ }
+ }
+ }
+
+ // add the socket to our peer list and set our
+ // destination address / port to match
+ var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
+ sock.daddr = peer.addr;
+ sock.dport = peer.port;
+
+ // because we cannot synchronously block to wait for the WebSocket
+ // connection to complete, we return here pretending that the connection
+ // was a success.
+ sock.connecting = true;
+ },
+ listen(sock, backlog) {
+ if (!ENVIRONMENT_IS_NODE) {
+ throw new FS.ErrnoError(138);
+ }
+ },
+ accept(listensock) {
+ if (!listensock.server || !listensock.pending.length) {
+ throw new FS.ErrnoError(28);
+ }
+ var newsock = listensock.pending.shift();
+ newsock.stream.flags = listensock.stream.flags;
+ return newsock;
+ },
+ getname(sock, peer) {
+ var addr, port;
+ if (peer) {
+ if (sock.daddr === undefined || sock.dport === undefined) {
+ throw new FS.ErrnoError(53);
+ }
+ addr = sock.daddr;
+ port = sock.dport;
+ } else {
+ // TODO saddr and sport will be set for bind()'d UDP sockets, but what
+ // should we be returning for TCP sockets that've been connect()'d?
+ addr = sock.saddr || 0;
+ port = sock.sport || 0;
+ }
+ return { addr, port };
+ },
+ sendmsg(sock, buffer, offset, length, addr, port) {
+ if (sock.type === 2) {
+ // connection-less sockets will honor the message address,
+ // and otherwise fall back to the bound destination address
+ if (addr === undefined || port === undefined) {
+ addr = sock.daddr;
+ port = sock.dport;
+ }
+ // if there was no address to fall back to, error out
+ if (addr === undefined || port === undefined) {
+ throw new FS.ErrnoError(17);
+ }
+ } else {
+ // connection-based sockets will only use the bound
+ addr = sock.daddr;
+ port = sock.dport;
+ }
+
+ // find the peer for the destination address
+ var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);
+
+ // early out if not connected with a connection-based socket
+ if (sock.type === 1) {
+ if (
+ !dest ||
+ dest.socket.readyState === dest.socket.CLOSING ||
+ dest.socket.readyState === dest.socket.CLOSED
+ ) {
+ throw new FS.ErrnoError(53);
+ }
+ }
+
+ // create a copy of the incoming data to send, as the WebSocket API
+ // doesn't work entirely with an ArrayBufferView, it'll just send
+ // the entire underlying buffer
+ if (ArrayBuffer.isView(buffer)) {
+ offset += buffer.byteOffset;
+ buffer = buffer.buffer;
+ }
+
+ var data = buffer.slice(offset, offset + length);
+
+ // if we don't have a cached connectionless UDP datagram connection, or
+ // the TCP socket is still connecting, queue the message to be sent upon
+ // connect, and lie, saying the data was sent now.
+ if (!dest || dest.socket.readyState !== dest.socket.OPEN) {
+ // if we're not connected, open a new connection
+ if (sock.type === 2) {
+ if (
+ !dest ||
+ dest.socket.readyState === dest.socket.CLOSING ||
+ dest.socket.readyState === dest.socket.CLOSED
+ ) {
+ dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);
+ }
+ }
+ dest.msg_send_queue.push(data);
+ return length;
+ }
+
+ try {
+ // send the actual data
+ dest.socket.send(data);
+ return length;
+ } catch (e) {
+ throw new FS.ErrnoError(28);
+ }
+ },
+ recvmsg(sock, length) {
+ // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html
+ if (sock.type === 1 && sock.server) {
+ // tcp servers should not be recv()'ing on the listen socket
+ throw new FS.ErrnoError(53);
+ }
+
+ var queued = sock.recv_queue.shift();
+ if (!queued) {
+ if (sock.type === 1) {
+ var dest = SOCKFS.websocket_sock_ops.getPeer(
+ sock,
+ sock.daddr,
+ sock.dport,
+ );
+
+ if (!dest) {
+ // if we have a destination address but are not connected, error out
+ throw new FS.ErrnoError(53);
+ }
+ if (
+ dest.socket.readyState === dest.socket.CLOSING ||
+ dest.socket.readyState === dest.socket.CLOSED
+ ) {
+ // return null if the socket has closed
+ return null;
+ }
+ // else, our socket is in a valid state but truly has nothing available
+ throw new FS.ErrnoError(6);
+ }
+ throw new FS.ErrnoError(6);
+ }
+
+ // queued.data will be an ArrayBuffer if it's unadulterated, but if it's
+ // requeued TCP data it'll be an ArrayBufferView
+ var queuedLength = queued.data.byteLength || queued.data.length;
+ var queuedOffset = queued.data.byteOffset || 0;
+ var queuedBuffer = queued.data.buffer || queued.data;
+ var bytesRead = Math.min(length, queuedLength);
+ var res = {
+ buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),
+ addr: queued.addr,
+ port: queued.port,
+ };
+
+ // push back any unread data for TCP connections
+ if (sock.type === 1 && bytesRead < queuedLength) {
+ var bytesRemaining = queuedLength - bytesRead;
+ queued.data = new Uint8Array(
+ queuedBuffer,
+ queuedOffset + bytesRead,
+ bytesRemaining,
+ );
+ sock.recv_queue.unshift(queued);
+ }
+
+ return res;
+ },
+ },
+ };
+
+ var getSocketFromFD = (fd) => {
+ var socket = SOCKFS.getSocket(fd);
+ if (!socket) throw new FS.ErrnoError(8);
+ return socket;
+ };
+
+ var Sockets = {
+ BUFFER_SIZE: 10240,
+ MAX_BUFFER_SIZE: 10485760,
+ nextFd: 1,
+ fds: {},
+ nextport: 1,
+ maxport: 65535,
+ peer: null,
+ connections: {},
+ portmap: {},
+ localAddr: 4261412874,
+ addrPool: [
+ 33554442, 50331658, 67108874, 83886090, 100663306, 117440522, 134217738,
+ 150994954, 167772170, 184549386, 201326602, 218103818, 234881034,
+ ],
+ };
+
+ var inetPton4 = (str) => {
+ var b = str.split(".");
+ for (var i = 0; i < 4; i++) {
+ var tmp = Number(b[i]);
+ if (isNaN(tmp)) return null;
+ b[i] = tmp;
+ }
+ return (b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0;
+ };
+
+ /** @suppress {checkTypes} */
+ var jstoi_q = (str) => parseInt(str);
+ var inetPton6 = (str) => {
+ var words;
+ var w, offset, z, i;
+ /* http://home.deds.nl/~aeron/regex/ */
+ var valid6regx =
+ /^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;
+ var parts = [];
+ if (!valid6regx.test(str)) {
+ return null;
+ }
+ if (str === "::") {
+ return [0, 0, 0, 0, 0, 0, 0, 0];
+ }
+ // Z placeholder to keep track of zeros when splitting the string on ":"
+ if (str.startsWith("::")) {
+ str = str.replace("::", "Z:"); // leading zeros case
+ } else {
+ str = str.replace("::", ":Z:");
+ }
+
+ if (str.indexOf(".") > 0) {
+ // parse IPv4 embedded stress
+ str = str.replace(new RegExp("[.]", "g"), ":");
+ words = str.split(":");
+ words[words.length - 4] =
+ jstoi_q(words[words.length - 4]) +
+ jstoi_q(words[words.length - 3]) * 256;
+ words[words.length - 3] =
+ jstoi_q(words[words.length - 2]) +
+ jstoi_q(words[words.length - 1]) * 256;
+ words = words.slice(0, words.length - 2);
+ } else {
+ words = str.split(":");
+ }
+
+ offset = 0;
+ z = 0;
+ for (w = 0; w < words.length; w++) {
+ if (typeof words[w] == "string") {
+ if (words[w] === "Z") {
+ // compressed zeros - write appropriate number of zero words
+ for (z = 0; z < 8 - words.length + 1; z++) {
+ parts[w + z] = 0;
+ }
+ offset = z - 1;
+ } else {
+ // parse hex to field to 16-bit value and write it in network byte-order
+ parts[w + offset] = _htons(parseInt(words[w], 16));
+ }
+ } else {
+ // parsed IPv4 words
+ parts[w + offset] = words[w];
+ }
+ }
+ return [
+ (parts[1] << 16) | parts[0],
+ (parts[3] << 16) | parts[2],
+ (parts[5] << 16) | parts[4],
+ (parts[7] << 16) | parts[6],
+ ];
+ };
+
+ /** @param {number=} addrlen */
+ var writeSockaddr = (sa, family, addr, port, addrlen) => {
+ switch (family) {
+ case 2:
+ addr = inetPton4(addr);
+ zeroMemory(sa, 16);
+ if (addrlen) {
+ HEAP32[addrlen >> 2] = 16;
+ }
+ HEAP16[sa >> 1] = family;
+ HEAP32[(sa + 4) >> 2] = addr;
+ HEAP16[(sa + 2) >> 1] = _htons(port);
+ break;
+ case 10:
+ addr = inetPton6(addr);
+ zeroMemory(sa, 28);
+ if (addrlen) {
+ HEAP32[addrlen >> 2] = 28;
+ }
+ HEAP32[sa >> 2] = family;
+ HEAP32[(sa + 8) >> 2] = addr[0];
+ HEAP32[(sa + 12) >> 2] = addr[1];
+ HEAP32[(sa + 16) >> 2] = addr[2];
+ HEAP32[(sa + 20) >> 2] = addr[3];
+ HEAP16[(sa + 2) >> 1] = _htons(port);
+ break;
+ default:
+ return 5;
+ }
+ return 0;
+ };
+
+ var DNS = {
+ address_map: {
+ id: 1,
+ addrs: {},
+ names: {},
+ },
+ lookup_name(name) {
+ // If the name is already a valid ipv4 / ipv6 address, don't generate a fake one.
+ var res = inetPton4(name);
+ if (res !== null) {
+ return name;
+ }
+ res = inetPton6(name);
+ if (res !== null) {
+ return name;
+ }
+
+ // See if this name is already mapped.
+ var addr;
+
+ if (DNS.address_map.addrs[name]) {
+ addr = DNS.address_map.addrs[name];
+ } else {
+ var id = DNS.address_map.id++;
+ assert(id < 65535, "exceeded max address mappings of 65535");
+
+ addr = "172.29." + (id & 0xff) + "." + (id & 0xff00);
+
+ DNS.address_map.names[addr] = name;
+ DNS.address_map.addrs[name] = addr;
+ }
+
+ return addr;
+ },
+ lookup_addr(addr) {
+ if (DNS.address_map.names[addr]) {
+ return DNS.address_map.names[addr];
+ }
+
+ return null;
+ },
+ };
+ function ___syscall_accept4(fd, addr, addrlen, flags, d1, d2) {
+ try {
+ var sock = getSocketFromFD(fd);
+ var newsock = sock.sock_ops.accept(sock);
+ if (addr) {
+ var errno = writeSockaddr(
+ addr,
+ newsock.family,
+ DNS.lookup_name(newsock.daddr),
+ newsock.dport,
+ addrlen,
+ );
+ assert(!errno);
+ }
+ return newsock.stream.fd;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var inetNtop4 = (addr) =>
+ (addr & 0xff) +
+ "." +
+ ((addr >> 8) & 0xff) +
+ "." +
+ ((addr >> 16) & 0xff) +
+ "." +
+ ((addr >> 24) & 0xff);
+
+ var inetNtop6 = (ints) => {
+ // ref: http://www.ietf.org/rfc/rfc2373.txt - section 2.5.4
+ // Format for IPv4 compatible and mapped 128-bit IPv6 Addresses
+ // 128-bits are split into eight 16-bit words
+ // stored in network byte order (big-endian)
+ // | 80 bits | 16 | 32 bits |
+ // +-----------------------------------------------------------------+
+ // | 10 bytes | 2 | 4 bytes |
+ // +--------------------------------------+--------------------------+
+ // + 5 words | 1 | 2 words |
+ // +--------------------------------------+--------------------------+
+ // |0000..............................0000|0000| IPv4 ADDRESS | (compatible)
+ // +--------------------------------------+----+---------------------+
+ // |0000..............................0000|FFFF| IPv4 ADDRESS | (mapped)
+ // +--------------------------------------+----+---------------------+
+ var str = "";
+ var word = 0;
+ var longest = 0;
+ var lastzero = 0;
+ var zstart = 0;
+ var len = 0;
+ var i = 0;
+ var parts = [
+ ints[0] & 0xffff,
+ ints[0] >> 16,
+ ints[1] & 0xffff,
+ ints[1] >> 16,
+ ints[2] & 0xffff,
+ ints[2] >> 16,
+ ints[3] & 0xffff,
+ ints[3] >> 16,
+ ];
+
+ // Handle IPv4-compatible, IPv4-mapped, loopback and any/unspecified addresses
+
+ var hasipv4 = true;
+ var v4part = "";
+ // check if the 10 high-order bytes are all zeros (first 5 words)
+ for (i = 0; i < 5; i++) {
+ if (parts[i] !== 0) {
+ hasipv4 = false;
+ break;
+ }
+ }
+
+ if (hasipv4) {
+ // low-order 32-bits store an IPv4 address (bytes 13 to 16) (last 2 words)
+ v4part = inetNtop4(parts[6] | (parts[7] << 16));
+ // IPv4-mapped IPv6 address if 16-bit value (bytes 11 and 12) == 0xFFFF (6th word)
+ if (parts[5] === -1) {
+ str = "::ffff:";
+ str += v4part;
+ return str;
+ }
+ // IPv4-compatible IPv6 address if 16-bit value (bytes 11 and 12) == 0x0000 (6th word)
+ if (parts[5] === 0) {
+ str = "::";
+ //special case IPv6 addresses
+ if (v4part === "0.0.0.0") v4part = ""; // any/unspecified address
+ if (v4part === "0.0.0.1") v4part = "1"; // loopback address
+ str += v4part;
+ return str;
+ }
+ }
+
+ // Handle all other IPv6 addresses
+
+ // first run to find the longest contiguous zero words
+ for (word = 0; word < 8; word++) {
+ if (parts[word] === 0) {
+ if (word - lastzero > 1) {
+ len = 0;
+ }
+ lastzero = word;
+ len++;
+ }
+ if (len > longest) {
+ longest = len;
+ zstart = word - longest + 1;
+ }
+ }
+
+ for (word = 0; word < 8; word++) {
+ if (longest > 1) {
+ // compress contiguous zeros - to produce "::"
+ if (parts[word] === 0 && word >= zstart && word < zstart + longest) {
+ if (word === zstart) {
+ str += ":";
+ if (zstart === 0) str += ":"; //leading zeros case
+ }
+ continue;
+ }
+ }
+ // converts 16-bit words from big-endian to little-endian before converting to hex string
+ str += Number(_ntohs(parts[word] & 0xffff)).toString(16);
+ str += word < 7 ? ":" : "";
+ }
+ return str;
+ };
+
+ var readSockaddr = (sa, salen) => {
+ // family / port offsets are common to both sockaddr_in and sockaddr_in6
+ var family = HEAP16[sa >> 1];
+ var port = _ntohs(HEAPU16[(sa + 2) >> 1]);
+ var addr;
+
+ switch (family) {
+ case 2:
+ if (salen !== 16) {
+ return { errno: 28 };
+ }
+ addr = HEAP32[(sa + 4) >> 2];
+ addr = inetNtop4(addr);
+ break;
+ case 10:
+ if (salen !== 28) {
+ return { errno: 28 };
+ }
+ addr = [
+ HEAP32[(sa + 8) >> 2],
+ HEAP32[(sa + 12) >> 2],
+ HEAP32[(sa + 16) >> 2],
+ HEAP32[(sa + 20) >> 2],
+ ];
+ addr = inetNtop6(addr);
+ break;
+ default:
+ return { errno: 5 };
+ }
+
+ return { family: family, addr: addr, port: port };
+ };
+
+ var getSocketAddress = (addrp, addrlen) => {
+ var info = readSockaddr(addrp, addrlen);
+ if (info.errno) throw new FS.ErrnoError(info.errno);
+ info.addr = DNS.lookup_addr(info.addr) || info.addr;
+ return info;
+ };
+ function ___syscall_bind(fd, addr, addrlen, d1, d2, d3) {
+ try {
+ var sock = getSocketFromFD(fd);
+ var info = getSocketAddress(addr, addrlen);
+ sock.sock_ops.bind(sock, info.addr, info.port);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_chdir(path) {
+ try {
+ path = SYSCALLS.getStr(path);
+ FS.chdir(path);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_chmod(path, mode) {
+ try {
+ path = SYSCALLS.getStr(path);
+ FS.chmod(path, mode);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_connect(fd, addr, addrlen, d1, d2, d3) {
+ try {
+ var sock = getSocketFromFD(fd);
+ var info = getSocketAddress(addr, addrlen);
+ sock.sock_ops.connect(sock, info.addr, info.port);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_dup(fd) {
+ try {
+ var old = SYSCALLS.getStreamFromFD(fd);
+ return FS.dupStream(old).fd;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_faccessat(dirfd, path, amode, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ assert(flags === 0 || flags == 512);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ if (amode & ~7) {
+ // need a valid mode
+ return -28;
+ }
+ var lookup = FS.lookupPath(path, { follow: true });
+ var node = lookup.node;
+ if (!node) {
+ return -44;
+ }
+ var perms = "";
+ if (amode & 4) perms += "r";
+ if (amode & 2) perms += "w";
+ if (amode & 1) perms += "x";
+ if (
+ perms /* otherwise, they've just passed F_OK */ &&
+ FS.nodePermissions(node, perms)
+ ) {
+ return -2;
+ }
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_fchownat(dirfd, path, owner, group, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ var nofollow = flags & 256;
+ flags = flags & ~256;
+ assert(flags === 0);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ (nofollow ? FS.lchown : FS.chown)(path, owner, group);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ /** @suppress {duplicate } */
+ var syscallGetVarargI = () => {
+ assert(SYSCALLS.varargs != undefined);
+ // the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number.
+ var ret = HEAP32[+SYSCALLS.varargs >> 2];
+ SYSCALLS.varargs += 4;
+ return ret;
+ };
+ var syscallGetVarargP = syscallGetVarargI;
+
+ function ___syscall_fcntl64(fd, cmd, varargs) {
+ SYSCALLS.varargs = varargs;
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ switch (cmd) {
+ case 0: {
+ var arg = syscallGetVarargI();
+ if (arg < 0) {
+ return -28;
+ }
+ while (FS.streams[arg]) {
+ arg++;
+ }
+ var newStream;
+ newStream = FS.dupStream(stream, arg);
+ return newStream.fd;
+ }
+ case 1:
+ case 2:
+ return 0; // FD_CLOEXEC makes no sense for a single process.
+ case 3:
+ return stream.flags;
+ case 4: {
+ var arg = syscallGetVarargI();
+ stream.flags |= arg;
+ return 0;
+ }
+ case 12: {
+ var arg = syscallGetVarargP();
+ var offset = 0;
+ // We're always unlocked.
+ HEAP16[(arg + offset) >> 1] = 2;
+ return 0;
+ }
+ case 13:
+ case 14:
+ return 0; // Pretend that the locking is successful.
+ }
+ return -28;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_fdatasync(fd) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ return 0; // we can't do anything synchronously; the in-memory FS is already synced to
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_fstat64(fd, buf) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ return SYSCALLS.doStat(FS.stat, stream.path, buf);
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var convertI32PairToI53Checked = (lo, hi) => {
+ assert(lo == lo >>> 0 || lo == (lo | 0)); // lo should either be a i32 or a u32
+ assert(hi === (hi | 0)); // hi should be a i32
+ return (hi + 0x200000) >>> 0 < 0x400001 - !!lo
+ ? (lo >>> 0) + hi * 4294967296
+ : NaN;
+ };
+ function ___syscall_ftruncate64(fd, length_low, length_high) {
+ var length = convertI32PairToI53Checked(length_low, length_high);
+
+ try {
+ if (isNaN(length)) return 61;
+ FS.ftruncate(fd, length);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var stringToUTF8 = (str, outPtr, maxBytesToWrite) => {
+ assert(
+ typeof maxBytesToWrite == "number",
+ "stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!",
+ );
+ return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
+ };
+ function ___syscall_getcwd(buf, size) {
+ try {
+ if (size === 0) return -28;
+ var cwd = FS.cwd();
+ var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1;
+ if (size < cwdLengthInBytes) return -68;
+ stringToUTF8(cwd, buf, size);
+ return cwdLengthInBytes;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_getdents64(fd, dirp, count) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ stream.getdents ||= FS.readdir(stream.path);
+
+ var struct_size = 280;
+ var pos = 0;
+ var off = FS.llseek(stream, 0, 1);
+
+ var startIdx = Math.floor(off / struct_size);
+ var endIdx = Math.min(
+ stream.getdents.length,
+ startIdx + Math.floor(count / struct_size),
+ );
+ for (var idx = startIdx; idx < endIdx; idx++) {
+ var id;
+ var type;
+ var name = stream.getdents[idx];
+ if (name === ".") {
+ id = stream.node.id;
+ type = 4; // DT_DIR
+ } else if (name === "..") {
+ var lookup = FS.lookupPath(stream.path, { parent: true });
+ id = lookup.node.id;
+ type = 4; // DT_DIR
+ } else {
+ var child;
+ try {
+ child = FS.lookupNode(stream.node, name);
+ } catch (e) {
+ // If the entry is not a directory, file, or symlink, nodefs
+ // lookupNode will raise EINVAL. Skip these and continue.
+ if (e?.errno === 28) {
+ continue;
+ }
+ throw e;
+ }
+ id = child.id;
+ type = FS.isChrdev(child.mode)
+ ? 2
+ : // DT_CHR, character device.
+ FS.isDir(child.mode)
+ ? 4
+ : // DT_DIR, directory.
+ FS.isLink(child.mode)
+ ? 10
+ : // DT_LNK, symbolic link.
+ 8; // DT_REG, regular file.
+ }
+ assert(id);
+ (tempI64 = [
+ id >>> 0,
+ ((tempDouble = id),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(dirp + pos) >> 2] = tempI64[0]),
+ (HEAP32[(dirp + pos + 4) >> 2] = tempI64[1]);
+ (tempI64 = [
+ ((idx + 1) * struct_size) >>> 0,
+ ((tempDouble = (idx + 1) * struct_size),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]),
+ (HEAP32[(dirp + pos + 12) >> 2] = tempI64[1]);
+ HEAP16[(dirp + pos + 16) >> 1] = 280;
+ HEAP8[dirp + pos + 18] = type;
+ stringToUTF8(name, dirp + pos + 19, 256);
+ pos += struct_size;
+ }
+ FS.llseek(stream, idx * struct_size, 0);
+ return pos;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_getpeername(fd, addr, addrlen, d1, d2, d3) {
+ try {
+ var sock = getSocketFromFD(fd);
+ if (!sock.daddr) {
+ return -53; // The socket is not connected.
+ }
+ var errno = writeSockaddr(
+ addr,
+ sock.family,
+ DNS.lookup_name(sock.daddr),
+ sock.dport,
+ addrlen,
+ );
+ assert(!errno);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_getsockname(fd, addr, addrlen, d1, d2, d3) {
+ try {
+ var sock = getSocketFromFD(fd);
+ // TODO: sock.saddr should never be undefined, see TODO in websocket_sock_ops.getname
+ var errno = writeSockaddr(
+ addr,
+ sock.family,
+ DNS.lookup_name(sock.saddr || "0.0.0.0"),
+ sock.sport,
+ addrlen,
+ );
+ assert(!errno);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_getsockopt(fd, level, optname, optval, optlen, d1) {
+ try {
+ var sock = getSocketFromFD(fd);
+ // Minimal getsockopt aimed at resolving https://github.com/emscripten-core/emscripten/issues/2211
+ // so only supports SOL_SOCKET with SO_ERROR.
+ if (level === 1) {
+ if (optname === 4) {
+ HEAP32[optval >> 2] = sock.error;
+ HEAP32[optlen >> 2] = 4;
+ sock.error = null; // Clear the error (The SO_ERROR option obtains and then clears this field).
+ return 0;
+ }
+ }
+ return -50; // The option is unknown at the level indicated.
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_ioctl(fd, op, varargs) {
+ SYSCALLS.varargs = varargs;
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ switch (op) {
+ case 21509: {
+ if (!stream.tty) return -59;
+ return 0;
+ }
+ case 21505: {
+ if (!stream.tty) return -59;
+ if (stream.tty.ops.ioctl_tcgets) {
+ var termios = stream.tty.ops.ioctl_tcgets(stream);
+ var argp = syscallGetVarargP();
+ HEAP32[argp >> 2] = termios.c_iflag || 0;
+ HEAP32[(argp + 4) >> 2] = termios.c_oflag || 0;
+ HEAP32[(argp + 8) >> 2] = termios.c_cflag || 0;
+ HEAP32[(argp + 12) >> 2] = termios.c_lflag || 0;
+ for (var i = 0; i < 32; i++) {
+ HEAP8[argp + i + 17] = termios.c_cc[i] || 0;
+ }
+ return 0;
+ }
+ return 0;
+ }
+ case 21510:
+ case 21511:
+ case 21512: {
+ if (!stream.tty) return -59;
+ return 0; // no-op, not actually adjusting terminal settings
+ }
+ case 21506:
+ case 21507:
+ case 21508: {
+ if (!stream.tty) return -59;
+ if (stream.tty.ops.ioctl_tcsets) {
+ var argp = syscallGetVarargP();
+ var c_iflag = HEAP32[argp >> 2];
+ var c_oflag = HEAP32[(argp + 4) >> 2];
+ var c_cflag = HEAP32[(argp + 8) >> 2];
+ var c_lflag = HEAP32[(argp + 12) >> 2];
+ var c_cc = [];
+ for (var i = 0; i < 32; i++) {
+ c_cc.push(HEAP8[argp + i + 17]);
+ }
+ return stream.tty.ops.ioctl_tcsets(stream.tty, op, {
+ c_iflag,
+ c_oflag,
+ c_cflag,
+ c_lflag,
+ c_cc,
+ });
+ }
+ return 0; // no-op, not actually adjusting terminal settings
+ }
+ case 21519: {
+ if (!stream.tty) return -59;
+ var argp = syscallGetVarargP();
+ HEAP32[argp >> 2] = 0;
+ return 0;
+ }
+ case 21520: {
+ if (!stream.tty) return -59;
+ return -28; // not supported
+ }
+ case 21531: {
+ var argp = syscallGetVarargP();
+ return FS.ioctl(stream, op, argp);
+ }
+ case 21523: {
+ // TODO: in theory we should write to the winsize struct that gets
+ // passed in, but for now musl doesn't read anything on it
+ if (!stream.tty) return -59;
+ if (stream.tty.ops.ioctl_tiocgwinsz) {
+ var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty);
+ var argp = syscallGetVarargP();
+ HEAP16[argp >> 1] = winsize[0];
+ HEAP16[(argp + 2) >> 1] = winsize[1];
+ }
+ return 0;
+ }
+ case 21524: {
+ // TODO: technically, this ioctl call should change the window size.
+ // but, since emscripten doesn't have any concept of a terminal window
+ // yet, we'll just silently throw it away as we do TIOCGWINSZ
+ if (!stream.tty) return -59;
+ return 0;
+ }
+ case 21515: {
+ if (!stream.tty) return -59;
+ return 0;
+ }
+ default:
+ return -28; // not supported
+ }
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_listen(fd, backlog) {
+ try {
+ var sock = getSocketFromFD(fd);
+ sock.sock_ops.listen(sock, backlog);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_lstat64(path, buf) {
+ try {
+ path = SYSCALLS.getStr(path);
+ return SYSCALLS.doStat(FS.lstat, path, buf);
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_mkdirat(dirfd, path, mode) {
+ try {
+ path = SYSCALLS.getStr(path);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ FS.mkdir(path, mode, 0);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_newfstatat(dirfd, path, buf, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ var nofollow = flags & 256;
+ var allowEmpty = flags & 4096;
+ flags = flags & ~6400;
+ assert(!flags, `unknown flags in __syscall_newfstatat: ${flags}`);
+ path = SYSCALLS.calculateAt(dirfd, path, allowEmpty);
+ return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf);
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_openat(dirfd, path, flags, varargs) {
+ SYSCALLS.varargs = varargs;
+ try {
+ path = SYSCALLS.getStr(path);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ var mode = varargs ? syscallGetVarargI() : 0;
+ return FS.open(path, flags, mode).fd;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var PIPEFS = {
+ BUCKET_BUFFER_SIZE: 8192,
+ mount(mount) {
+ // Do not pollute the real root directory or its child nodes with pipes
+ // Looks like it is OK to create another pseudo-root node not linked to the FS.root hierarchy this way
+ return FS.createNode(null, "/", 16384 | 0o777, 0);
+ },
+ createPipe() {
+ var pipe = {
+ buckets: [],
+ // refcnt 2 because pipe has a read end and a write end. We need to be
+ // able to read from the read end after write end is closed.
+ refcnt: 2,
+ };
+
+ pipe.buckets.push({
+ buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),
+ offset: 0,
+ roffset: 0,
+ });
+
+ var rName = PIPEFS.nextname();
+ var wName = PIPEFS.nextname();
+ var rNode = FS.createNode(PIPEFS.root, rName, 4096, 0);
+ var wNode = FS.createNode(PIPEFS.root, wName, 4096, 0);
+
+ rNode.pipe = pipe;
+ wNode.pipe = pipe;
+
+ var readableStream = FS.createStream({
+ path: rName,
+ node: rNode,
+ flags: 0,
+ seekable: false,
+ stream_ops: PIPEFS.stream_ops,
+ });
+ rNode.stream = readableStream;
+
+ var writableStream = FS.createStream({
+ path: wName,
+ node: wNode,
+ flags: 1,
+ seekable: false,
+ stream_ops: PIPEFS.stream_ops,
+ });
+ wNode.stream = writableStream;
+
+ return {
+ readable_fd: readableStream.fd,
+ writable_fd: writableStream.fd,
+ };
+ },
+ stream_ops: {
+ poll(stream) {
+ var pipe = stream.node.pipe;
+
+ if ((stream.flags & 2097155) === 1) {
+ return 256 | 4;
+ }
+ if (pipe.buckets.length > 0) {
+ for (var i = 0; i < pipe.buckets.length; i++) {
+ var bucket = pipe.buckets[i];
+ if (bucket.offset - bucket.roffset > 0) {
+ return 64 | 1;
+ }
+ }
+ }
+
+ return 0;
+ },
+ ioctl(stream, request, varargs) {
+ return 28;
+ },
+ fsync(stream) {
+ return 28;
+ },
+ read(stream, buffer, offset, length, position /* ignored */) {
+ var pipe = stream.node.pipe;
+ var currentLength = 0;
+
+ for (var i = 0; i < pipe.buckets.length; i++) {
+ var bucket = pipe.buckets[i];
+ currentLength += bucket.offset - bucket.roffset;
+ }
+
+ assert(buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer));
+ var data = buffer.subarray(offset, offset + length);
+
+ if (length <= 0) {
+ return 0;
+ }
+ if (currentLength == 0) {
+ // Behave as if the read end is always non-blocking
+ throw new FS.ErrnoError(6);
+ }
+ var toRead = Math.min(currentLength, length);
+
+ var totalRead = toRead;
+ var toRemove = 0;
+
+ for (var i = 0; i < pipe.buckets.length; i++) {
+ var currBucket = pipe.buckets[i];
+ var bucketSize = currBucket.offset - currBucket.roffset;
+
+ if (toRead <= bucketSize) {
+ var tmpSlice = currBucket.buffer.subarray(
+ currBucket.roffset,
+ currBucket.offset,
+ );
+ if (toRead < bucketSize) {
+ tmpSlice = tmpSlice.subarray(0, toRead);
+ currBucket.roffset += toRead;
+ } else {
+ toRemove++;
+ }
+ data.set(tmpSlice);
+ break;
+ } else {
+ var tmpSlice = currBucket.buffer.subarray(
+ currBucket.roffset,
+ currBucket.offset,
+ );
+ data.set(tmpSlice);
+ data = data.subarray(tmpSlice.byteLength);
+ toRead -= tmpSlice.byteLength;
+ toRemove++;
+ }
+ }
+
+ if (toRemove && toRemove == pipe.buckets.length) {
+ // Do not generate excessive garbage in use cases such as
+ // write several bytes, read everything, write several bytes, read everything...
+ toRemove--;
+ pipe.buckets[toRemove].offset = 0;
+ pipe.buckets[toRemove].roffset = 0;
+ }
+
+ pipe.buckets.splice(0, toRemove);
+
+ return totalRead;
+ },
+ write(stream, buffer, offset, length, position /* ignored */) {
+ var pipe = stream.node.pipe;
+
+ assert(buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer));
+ var data = buffer.subarray(offset, offset + length);
+
+ var dataLen = data.byteLength;
+ if (dataLen <= 0) {
+ return 0;
+ }
+
+ var currBucket = null;
+
+ if (pipe.buckets.length == 0) {
+ currBucket = {
+ buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),
+ offset: 0,
+ roffset: 0,
+ };
+ pipe.buckets.push(currBucket);
+ } else {
+ currBucket = pipe.buckets[pipe.buckets.length - 1];
+ }
+
+ assert(currBucket.offset <= PIPEFS.BUCKET_BUFFER_SIZE);
+
+ var freeBytesInCurrBuffer =
+ PIPEFS.BUCKET_BUFFER_SIZE - currBucket.offset;
+ if (freeBytesInCurrBuffer >= dataLen) {
+ currBucket.buffer.set(data, currBucket.offset);
+ currBucket.offset += dataLen;
+ return dataLen;
+ } else if (freeBytesInCurrBuffer > 0) {
+ currBucket.buffer.set(
+ data.subarray(0, freeBytesInCurrBuffer),
+ currBucket.offset,
+ );
+ currBucket.offset += freeBytesInCurrBuffer;
+ data = data.subarray(freeBytesInCurrBuffer, data.byteLength);
+ }
+
+ var numBuckets = (data.byteLength / PIPEFS.BUCKET_BUFFER_SIZE) | 0;
+ var remElements = data.byteLength % PIPEFS.BUCKET_BUFFER_SIZE;
+
+ for (var i = 0; i < numBuckets; i++) {
+ var newBucket = {
+ buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),
+ offset: PIPEFS.BUCKET_BUFFER_SIZE,
+ roffset: 0,
+ };
+ pipe.buckets.push(newBucket);
+ newBucket.buffer.set(data.subarray(0, PIPEFS.BUCKET_BUFFER_SIZE));
+ data = data.subarray(PIPEFS.BUCKET_BUFFER_SIZE, data.byteLength);
+ }
+
+ if (remElements > 0) {
+ var newBucket = {
+ buffer: new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),
+ offset: data.byteLength,
+ roffset: 0,
+ };
+ pipe.buckets.push(newBucket);
+ newBucket.buffer.set(data);
+ }
+
+ return dataLen;
+ },
+ close(stream) {
+ var pipe = stream.node.pipe;
+ pipe.refcnt--;
+ if (pipe.refcnt === 0) {
+ pipe.buckets = null;
+ }
+ },
+ },
+ nextname() {
+ if (!PIPEFS.nextname.current) {
+ PIPEFS.nextname.current = 0;
+ }
+ return "pipe[" + PIPEFS.nextname.current++ + "]";
+ },
+ };
+ function ___syscall_pipe(fdPtr) {
+ try {
+ if (fdPtr == 0) {
+ throw new FS.ErrnoError(21);
+ }
+
+ var res = PIPEFS.createPipe();
+
+ HEAP32[fdPtr >> 2] = res.readable_fd;
+ HEAP32[(fdPtr + 4) >> 2] = res.writable_fd;
+
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_poll(fds, nfds, timeout) {
+ try {
+ var nonzero = 0;
+ for (var i = 0; i < nfds; i++) {
+ var pollfd = fds + 8 * i;
+ var fd = HEAP32[pollfd >> 2];
+ var events = HEAP16[(pollfd + 4) >> 1];
+ var mask = 32;
+ var stream = FS.getStream(fd);
+ if (stream) {
+ mask = SYSCALLS.DEFAULT_POLLMASK;
+ if (stream.stream_ops.poll) {
+ mask = stream.stream_ops.poll(stream, -1);
+ }
+ }
+ mask &= events | 8 | 16;
+ if (mask) nonzero++;
+ HEAP16[(pollfd + 6) >> 1] = mask;
+ }
+ return nonzero;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_readlinkat(dirfd, path, buf, bufsize) {
+ try {
+ path = SYSCALLS.getStr(path);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ if (bufsize <= 0) return -28;
+ var ret = FS.readlink(path);
+
+ var len = Math.min(bufsize, lengthBytesUTF8(ret));
+ var endChar = HEAP8[buf + len];
+ stringToUTF8(ret, buf, bufsize + 1);
+ // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!)
+ // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write.
+ HEAP8[buf + len] = endChar;
+ return len;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_recvfrom(fd, buf, len, flags, addr, addrlen) {
+ try {
+ var sock = getSocketFromFD(fd);
+ var msg = sock.sock_ops.recvmsg(sock, len);
+ if (!msg) return 0; // socket is closed
+ if (addr) {
+ var errno = writeSockaddr(
+ addr,
+ sock.family,
+ DNS.lookup_name(msg.addr),
+ msg.port,
+ addrlen,
+ );
+ assert(!errno);
+ }
+ HEAPU8.set(msg.buffer, buf);
+ return msg.buffer.byteLength;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) {
+ try {
+ oldpath = SYSCALLS.getStr(oldpath);
+ newpath = SYSCALLS.getStr(newpath);
+ oldpath = SYSCALLS.calculateAt(olddirfd, oldpath);
+ newpath = SYSCALLS.calculateAt(newdirfd, newpath);
+ FS.rename(oldpath, newpath);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_rmdir(path) {
+ try {
+ path = SYSCALLS.getStr(path);
+ FS.rmdir(path);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_sendto(fd, message, length, flags, addr, addr_len) {
+ try {
+ var sock = getSocketFromFD(fd);
+ if (!addr) {
+ // send, no address provided
+ return FS.write(sock.stream, HEAP8, message, length);
+ }
+ var dest = getSocketAddress(addr, addr_len);
+ // sendto an address
+ return sock.sock_ops.sendmsg(
+ sock,
+ HEAP8,
+ message,
+ length,
+ dest.addr,
+ dest.port,
+ );
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_socket(domain, type, protocol) {
+ try {
+ var sock = SOCKFS.createSocket(domain, type, protocol);
+ assert(sock.stream.fd < 64); // XXX ? select() assumes socket fd values are in 0..63
+ return sock.stream.fd;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_stat64(path, buf) {
+ try {
+ path = SYSCALLS.getStr(path);
+ return SYSCALLS.doStat(FS.stat, path, buf);
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_statfs64(path, size, buf) {
+ try {
+ assert(size === 64);
+ var stats = FS.statfs(SYSCALLS.getStr(path));
+ HEAP32[(buf + 4) >> 2] = stats.bsize;
+ HEAP32[(buf + 40) >> 2] = stats.bsize;
+ HEAP32[(buf + 8) >> 2] = stats.blocks;
+ HEAP32[(buf + 12) >> 2] = stats.bfree;
+ HEAP32[(buf + 16) >> 2] = stats.bavail;
+ HEAP32[(buf + 20) >> 2] = stats.files;
+ HEAP32[(buf + 24) >> 2] = stats.ffree;
+ HEAP32[(buf + 28) >> 2] = stats.fsid;
+ HEAP32[(buf + 44) >> 2] = stats.flags; // ST_NOSUID
+ HEAP32[(buf + 36) >> 2] = stats.namelen;
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_symlinkat(target, dirfd, linkpath) {
+ try {
+ target = SYSCALLS.getStr(target);
+ linkpath = SYSCALLS.getStr(linkpath);
+ linkpath = SYSCALLS.calculateAt(dirfd, linkpath);
+ FS.symlink(target, linkpath);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function ___syscall_unlinkat(dirfd, path, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ path = SYSCALLS.calculateAt(dirfd, path);
+ if (flags === 0) {
+ FS.unlink(path);
+ } else if (flags === 512) {
+ FS.rmdir(path);
+ } else {
+ abort("Invalid flags passed to unlinkat");
+ }
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var readI53FromI64 = (ptr) => {
+ return HEAPU32[ptr >> 2] + HEAP32[(ptr + 4) >> 2] * 4294967296;
+ };
+
+ function ___syscall_utimensat(dirfd, path, times, flags) {
+ try {
+ path = SYSCALLS.getStr(path);
+ assert(flags === 0);
+ path = SYSCALLS.calculateAt(dirfd, path, true);
+ var now = Date.now(),
+ atime,
+ mtime;
+ if (!times) {
+ atime = now;
+ mtime = now;
+ } else {
+ var seconds = readI53FromI64(times);
+ var nanoseconds = HEAP32[(times + 8) >> 2];
+ if (nanoseconds == 1073741823) {
+ atime = now;
+ } else if (nanoseconds == 1073741822) {
+ atime = null;
+ } else {
+ atime = seconds * 1000 + nanoseconds / (1000 * 1000);
+ }
+ times += 16;
+ seconds = readI53FromI64(times);
+ nanoseconds = HEAP32[(times + 8) >> 2];
+ if (nanoseconds == 1073741823) {
+ mtime = now;
+ } else if (nanoseconds == 1073741822) {
+ mtime = null;
+ } else {
+ mtime = seconds * 1000 + nanoseconds / (1000 * 1000);
+ }
+ }
+ // null here means UTIME_OMIT was passed. If both were set to UTIME_OMIT then
+ // we can skip the call completely.
+ if ((mtime ?? atime) !== null) {
+ FS.utime(path, atime, mtime);
+ }
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var __abort_js = () => abort("native code called abort()");
+
+ var __emscripten_lookup_name = (name) => {
+ // uint32_t _emscripten_lookup_name(const char *name);
+ var nameString = UTF8ToString(name);
+ return inetPton4(DNS.lookup_name(nameString));
+ };
+
+ var __emscripten_memcpy_js = (dest, src, num) =>
+ HEAPU8.copyWithin(dest, src, src + num);
+
+ var runtimeKeepaliveCounter = 0;
+ var __emscripten_runtime_keepalive_clear = () => {
+ noExitRuntime = false;
+ runtimeKeepaliveCounter = 0;
+ };
+
+ var __emscripten_throw_longjmp = () => {
+ throw Infinity;
+ };
+
+ function __gmtime_js(time_low, time_high, tmPtr) {
+ var time = convertI32PairToI53Checked(time_low, time_high);
+
+ var date = new Date(time * 1000);
+ HEAP32[tmPtr >> 2] = date.getUTCSeconds();
+ HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes();
+ HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours();
+ HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate();
+ HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth();
+ HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900;
+ HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay();
+ var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);
+ var yday = ((date.getTime() - start) / (1000 * 60 * 60 * 24)) | 0;
+ HEAP32[(tmPtr + 28) >> 2] = yday;
+ }
+
+ var isLeapYear = (year) =>
+ year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
+
+ var MONTH_DAYS_LEAP_CUMULATIVE = [
+ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335,
+ ];
+
+ var MONTH_DAYS_REGULAR_CUMULATIVE = [
+ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
+ ];
+ var ydayFromDate = (date) => {
+ var leap = isLeapYear(date.getFullYear());
+ var monthDaysCumulative = leap
+ ? MONTH_DAYS_LEAP_CUMULATIVE
+ : MONTH_DAYS_REGULAR_CUMULATIVE;
+ var yday = monthDaysCumulative[date.getMonth()] + date.getDate() - 1; // -1 since it's days since Jan 1
+
+ return yday;
+ };
+
+ function __localtime_js(time_low, time_high, tmPtr) {
+ var time = convertI32PairToI53Checked(time_low, time_high);
+
+ var date = new Date(time * 1000);
+ HEAP32[tmPtr >> 2] = date.getSeconds();
+ HEAP32[(tmPtr + 4) >> 2] = date.getMinutes();
+ HEAP32[(tmPtr + 8) >> 2] = date.getHours();
+ HEAP32[(tmPtr + 12) >> 2] = date.getDate();
+ HEAP32[(tmPtr + 16) >> 2] = date.getMonth();
+ HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900;
+ HEAP32[(tmPtr + 24) >> 2] = date.getDay();
+
+ var yday = ydayFromDate(date) | 0;
+ HEAP32[(tmPtr + 28) >> 2] = yday;
+ HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60);
+
+ // Attention: DST is in December in South, and some regions don't have DST at all.
+ var start = new Date(date.getFullYear(), 0, 1);
+ var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset();
+ var winterOffset = start.getTimezoneOffset();
+ var dst =
+ (summerOffset != winterOffset &&
+ date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0;
+ HEAP32[(tmPtr + 32) >> 2] = dst;
+ }
+
+ /** @suppress {duplicate } */
+ var setTempRet0 = (val) => __emscripten_tempret_set(val);
+ var _setTempRet0 = setTempRet0;
+
+ var __mktime_js = function (tmPtr) {
+ var ret = (() => {
+ var date = new Date(
+ HEAP32[(tmPtr + 20) >> 2] + 1900,
+ HEAP32[(tmPtr + 16) >> 2],
+ HEAP32[(tmPtr + 12) >> 2],
+ HEAP32[(tmPtr + 8) >> 2],
+ HEAP32[(tmPtr + 4) >> 2],
+ HEAP32[tmPtr >> 2],
+ 0,
+ );
+
+ // There's an ambiguous hour when the time goes back; the tm_isdst field is
+ // used to disambiguate it. Date() basically guesses, so we fix it up if it
+ // guessed wrong, or fill in tm_isdst with the guess if it's -1.
+ var dst = HEAP32[(tmPtr + 32) >> 2];
+ var guessedOffset = date.getTimezoneOffset();
+ var start = new Date(date.getFullYear(), 0, 1);
+ var summerOffset = new Date(
+ date.getFullYear(),
+ 6,
+ 1,
+ ).getTimezoneOffset();
+ var winterOffset = start.getTimezoneOffset();
+ var dstOffset = Math.min(winterOffset, summerOffset); // DST is in December in South
+ if (dst < 0) {
+ // Attention: some regions don't have DST at all.
+ HEAP32[(tmPtr + 32) >> 2] = Number(
+ summerOffset != winterOffset && dstOffset == guessedOffset,
+ );
+ } else if (dst > 0 != (dstOffset == guessedOffset)) {
+ var nonDstOffset = Math.max(winterOffset, summerOffset);
+ var trueOffset = dst > 0 ? dstOffset : nonDstOffset;
+ // Don't try setMinutes(date.getMinutes() + ...) -- it's messed up.
+ date.setTime(date.getTime() + (trueOffset - guessedOffset) * 60000);
+ }
+
+ HEAP32[(tmPtr + 24) >> 2] = date.getDay();
+ var yday = ydayFromDate(date) | 0;
+ HEAP32[(tmPtr + 28) >> 2] = yday;
+ // To match expected behavior, update fields from date
+ HEAP32[tmPtr >> 2] = date.getSeconds();
+ HEAP32[(tmPtr + 4) >> 2] = date.getMinutes();
+ HEAP32[(tmPtr + 8) >> 2] = date.getHours();
+ HEAP32[(tmPtr + 12) >> 2] = date.getDate();
+ HEAP32[(tmPtr + 16) >> 2] = date.getMonth();
+ HEAP32[(tmPtr + 20) >> 2] = date.getYear();
+
+ var timeMs = date.getTime();
+ if (isNaN(timeMs)) {
+ return -1;
+ }
+ // Return time in microseconds
+ return timeMs / 1000;
+ })();
+ return (
+ setTempRet0(
+ ((tempDouble = ret),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ),
+ ret >>> 0
+ );
+ };
+
+ function __mmap_js(
+ len,
+ prot,
+ flags,
+ fd,
+ offset_low,
+ offset_high,
+ allocated,
+ addr,
+ ) {
+ var offset = convertI32PairToI53Checked(offset_low, offset_high);
+
+ try {
+ if (isNaN(offset)) return 61;
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ var res = FS.mmap(stream, len, offset, prot, flags);
+ var ptr = res.ptr;
+ HEAP32[allocated >> 2] = res.allocated;
+ HEAPU32[addr >> 2] = ptr;
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ function __munmap_js(addr, len, prot, flags, fd, offset_low, offset_high) {
+ var offset = convertI32PairToI53Checked(offset_low, offset_high);
+
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ if (prot & 2) {
+ SYSCALLS.doMsync(addr, stream, len, flags, offset);
+ }
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return -e.errno;
+ }
+ }
+
+ var timers = {};
+
+ var handleException = (e) => {
+ // Certain exception types we do not treat as errors since they are used for
+ // internal control flow.
+ // 1. ExitStatus, which is thrown by exit()
+ // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others
+ // that wish to return to JS event loop.
+ if (e instanceof ExitStatus || e == "unwind") {
+ return EXITSTATUS;
+ }
+ checkStackCookie();
+ if (e instanceof WebAssembly.RuntimeError) {
+ if (_emscripten_stack_get_current() <= 0) {
+ err(
+ "Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)",
+ );
+ }
+ }
+ quit_(1, e);
+ };
+
+ var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0;
+ var _proc_exit = (code) => {
+ EXITSTATUS = code;
+ if (!keepRuntimeAlive()) {
+ Module["onExit"]?.(code);
+ ABORT = true;
+ }
+ quit_(code, new ExitStatus(code));
+ };
+
+ /** @suppress {duplicate } */
+ /** @param {boolean|number=} implicit */
+ var exitJS = (status, implicit) => {
+ EXITSTATUS = status;
+
+ checkUnflushedContent();
+
+ // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down
+ if (keepRuntimeAlive() && !implicit) {
+ var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`;
+ readyPromiseReject(msg);
+ err(msg);
+ }
+
+ _proc_exit(status);
+ };
+ var _exit = exitJS;
+
+ var maybeExit = () => {
+ if (!keepRuntimeAlive()) {
+ try {
+ _exit(EXITSTATUS);
+ } catch (e) {
+ handleException(e);
+ }
+ }
+ };
+ var callUserCallback = (func) => {
+ if (ABORT) {
+ err(
+ "user callback triggered after runtime exited or application aborted. Ignoring.",
+ );
+ return;
+ }
+ try {
+ func();
+ maybeExit();
+ } catch (e) {
+ handleException(e);
+ }
+ };
+
+ var _emscripten_get_now = () => performance.now();
+ var __setitimer_js = (which, timeout_ms) => {
+ // First, clear any existing timer.
+ if (timers[which]) {
+ clearTimeout(timers[which].id);
+ delete timers[which];
+ }
+
+ // A timeout of zero simply cancels the current timeout so we have nothing
+ // more to do.
+ if (!timeout_ms) return 0;
+
+ var id = setTimeout(() => {
+ assert(which in timers);
+ delete timers[which];
+ callUserCallback(() =>
+ __emscripten_timeout(which, _emscripten_get_now()),
+ );
+ }, timeout_ms);
+ timers[which] = { id, timeout_ms };
+ return 0;
+ };
+
+ var __tzset_js = (timezone, daylight, std_name, dst_name) => {
+ // TODO: Use (malleable) environment variables instead of system settings.
+ var currentYear = new Date().getFullYear();
+ var winter = new Date(currentYear, 0, 1);
+ var summer = new Date(currentYear, 6, 1);
+ var winterOffset = winter.getTimezoneOffset();
+ var summerOffset = summer.getTimezoneOffset();
+
+ // Local standard timezone offset. Local standard time is not adjusted for
+ // daylight savings. This code uses the fact that getTimezoneOffset returns
+ // a greater value during Standard Time versus Daylight Saving Time (DST).
+ // Thus it determines the expected output during Standard Time, and it
+ // compares whether the output of the given date the same (Standard) or less
+ // (DST).
+ var stdTimezoneOffset = Math.max(winterOffset, summerOffset);
+
+ // timezone is specified as seconds west of UTC ("The external variable
+ // `timezone` shall be set to the difference, in seconds, between
+ // Coordinated Universal Time (UTC) and local standard time."), the same
+ // as returned by stdTimezoneOffset.
+ // See http://pubs.opengroup.org/onlinepubs/009695399/functions/tzset.html
+ HEAPU32[timezone >> 2] = stdTimezoneOffset * 60;
+
+ HEAP32[daylight >> 2] = Number(winterOffset != summerOffset);
+
+ var extractZone = (timezoneOffset) => {
+ // Why inverse sign?
+ // Read here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
+ var sign = timezoneOffset >= 0 ? "-" : "+";
+
+ var absOffset = Math.abs(timezoneOffset);
+ var hours = String(Math.floor(absOffset / 60)).padStart(2, "0");
+ var minutes = String(absOffset % 60).padStart(2, "0");
+
+ return `UTC${sign}${hours}${minutes}`;
+ };
+
+ var winterName = extractZone(winterOffset);
+ var summerName = extractZone(summerOffset);
+ assert(winterName);
+ assert(summerName);
+ assert(
+ lengthBytesUTF8(winterName) <= 16,
+ `timezone name truncated to fit in TZNAME_MAX (${winterName})`,
+ );
+ assert(
+ lengthBytesUTF8(summerName) <= 16,
+ `timezone name truncated to fit in TZNAME_MAX (${summerName})`,
+ );
+ if (summerOffset < winterOffset) {
+ // Northern hemisphere
+ stringToUTF8(winterName, std_name, 17);
+ stringToUTF8(summerName, dst_name, 17);
+ } else {
+ stringToUTF8(winterName, dst_name, 17);
+ stringToUTF8(summerName, std_name, 17);
+ }
+ };
+
+ var _emscripten_date_now = () => Date.now();
+
+ var nowIsMonotonic = 1;
+
+ var checkWasiClock = (clock_id) => clock_id >= 0 && clock_id <= 3;
+
+ function _clock_time_get(
+ clk_id,
+ ignored_precision_low,
+ ignored_precision_high,
+ ptime,
+ ) {
+ var ignored_precision = convertI32PairToI53Checked(
+ ignored_precision_low,
+ ignored_precision_high,
+ );
+
+ if (!checkWasiClock(clk_id)) {
+ return 28;
+ }
+ var now;
+ // all wasi clocks but realtime are monotonic
+ if (clk_id === 0) {
+ now = _emscripten_date_now();
+ } else if (nowIsMonotonic) {
+ now = _emscripten_get_now();
+ } else {
+ return 52;
+ }
+ // "now" is in ms, and wasi times are in ns.
+ var nsec = Math.round(now * 1000 * 1000);
+ (tempI64 = [
+ nsec >>> 0,
+ ((tempDouble = nsec),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[ptime >> 2] = tempI64[0]),
+ (HEAP32[(ptime + 4) >> 2] = tempI64[1]);
+ return 0;
+ }
+
+ var _emscripten_err = (str) => err(UTF8ToString(str));
+
+ var getHeapMax = () => HEAPU8.length;
+ var _emscripten_get_heap_max = () => getHeapMax();
+
+ var abortOnCannotGrowMemory = (requestedSize) => {
+ abort(
+ `Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ${HEAP8.length}, (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0`,
+ );
+ };
+ var _emscripten_resize_heap = (requestedSize) => {
+ var oldSize = HEAPU8.length;
+ // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
+ requestedSize >>>= 0;
+ abortOnCannotGrowMemory(requestedSize);
+ };
+
+ var ENV = {};
+
+ var getExecutableName = () => thisProgram || "./this.program";
+ var getEnvStrings = () => {
+ if (!getEnvStrings.strings) {
+ // Default values.
+ // Browser language detection #8751
+ var lang =
+ (
+ (typeof navigator == "object" &&
+ navigator.languages &&
+ navigator.languages[0]) ||
+ "C"
+ ).replace("-", "_") + ".UTF-8";
+ var env = {
+ USER: "web_user",
+ LOGNAME: "web_user",
+ PATH: "/",
+ PWD: "/",
+ HOME: "/home/web_user",
+ LANG: lang,
+ _: getExecutableName(),
+ };
+ // Apply the user-provided values, if any.
+ for (var x in ENV) {
+ // x is a key in ENV; if ENV[x] is undefined, that means it was
+ // explicitly set to be so. We allow user code to do that to
+ // force variables with default values to remain unset.
+ if (ENV[x] === undefined) delete env[x];
+ else env[x] = ENV[x];
+ }
+ var strings = [];
+ for (var x in env) {
+ strings.push(`${x}=${env[x]}`);
+ }
+ getEnvStrings.strings = strings;
+ }
+ return getEnvStrings.strings;
+ };
+
+ var stringToAscii = (str, buffer) => {
+ for (var i = 0; i < str.length; ++i) {
+ assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff));
+ HEAP8[buffer++] = str.charCodeAt(i);
+ }
+ // Null-terminate the string
+ HEAP8[buffer] = 0;
+ };
+ var _environ_get = (__environ, environ_buf) => {
+ var bufSize = 0;
+ getEnvStrings().forEach((string, i) => {
+ var ptr = environ_buf + bufSize;
+ HEAPU32[(__environ + i * 4) >> 2] = ptr;
+ stringToAscii(string, ptr);
+ bufSize += string.length + 1;
+ });
+ return 0;
+ };
+
+ var _environ_sizes_get = (penviron_count, penviron_buf_size) => {
+ var strings = getEnvStrings();
+ HEAPU32[penviron_count >> 2] = strings.length;
+ var bufSize = 0;
+ strings.forEach((string) => (bufSize += string.length + 1));
+ HEAPU32[penviron_buf_size >> 2] = bufSize;
+ return 0;
+ };
+
+ function _fd_close(fd) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ FS.close(stream);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ function _fd_fdstat_get(fd, pbuf) {
+ try {
+ var rightsBase = 0;
+ var rightsInheriting = 0;
+ var flags = 0;
+ {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ // All character devices are terminals (other things a Linux system would
+ // assume is a character device, like the mouse, we have special APIs for).
+ var type = stream.tty
+ ? 2
+ : FS.isDir(stream.mode)
+ ? 3
+ : FS.isLink(stream.mode)
+ ? 7
+ : 4;
+ }
+ HEAP8[pbuf] = type;
+ HEAP16[(pbuf + 2) >> 1] = flags;
+ (tempI64 = [
+ rightsBase >>> 0,
+ ((tempDouble = rightsBase),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(pbuf + 8) >> 2] = tempI64[0]),
+ (HEAP32[(pbuf + 12) >> 2] = tempI64[1]);
+ (tempI64 = [
+ rightsInheriting >>> 0,
+ ((tempDouble = rightsInheriting),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[(pbuf + 16) >> 2] = tempI64[0]),
+ (HEAP32[(pbuf + 20) >> 2] = tempI64[1]);
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ /** @param {number=} offset */
+ var doReadv = (stream, iov, iovcnt, offset) => {
+ var ret = 0;
+ for (var i = 0; i < iovcnt; i++) {
+ var ptr = HEAPU32[iov >> 2];
+ var len = HEAPU32[(iov + 4) >> 2];
+ iov += 8;
+ var curr = FS.read(stream, HEAP8, ptr, len, offset);
+ if (curr < 0) return -1;
+ ret += curr;
+ if (curr < len) break; // nothing more to read
+ if (typeof offset != "undefined") {
+ offset += curr;
+ }
+ }
+ return ret;
+ };
+
+ function _fd_read(fd, iov, iovcnt, pnum) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ var num = doReadv(stream, iov, iovcnt);
+ HEAPU32[pnum >> 2] = num;
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
+ var offset = convertI32PairToI53Checked(offset_low, offset_high);
+
+ try {
+ if (isNaN(offset)) return 61;
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ FS.llseek(stream, offset, whence);
+ (tempI64 = [
+ stream.position >>> 0,
+ ((tempDouble = stream.position),
+ +Math.abs(tempDouble) >= 1.0
+ ? tempDouble > 0.0
+ ? +Math.floor(tempDouble / 4294967296.0) >>> 0
+ : ~~+Math.ceil(
+ (tempDouble - +(~~tempDouble >>> 0)) / 4294967296.0,
+ ) >>> 0
+ : 0),
+ ]),
+ (HEAP32[newOffset >> 2] = tempI64[0]),
+ (HEAP32[(newOffset + 4) >> 2] = tempI64[1]);
+ if (stream.getdents && offset === 0 && whence === 0)
+ stream.getdents = null; // reset readdir state
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ function _fd_sync(fd) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ if (stream.stream_ops?.fsync) {
+ return stream.stream_ops.fsync(stream);
+ }
+ return 0; // we can't do anything synchronously; the in-memory FS is already synced to
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ /** @param {number=} offset */
+ var doWritev = (stream, iov, iovcnt, offset) => {
+ var ret = 0;
+ for (var i = 0; i < iovcnt; i++) {
+ var ptr = HEAPU32[iov >> 2];
+ var len = HEAPU32[(iov + 4) >> 2];
+ iov += 8;
+ var curr = FS.write(stream, HEAP8, ptr, len, offset);
+ if (curr < 0) return -1;
+ ret += curr;
+ if (curr < len) {
+ // No more space to write.
+ break;
+ }
+ if (typeof offset != "undefined") {
+ offset += curr;
+ }
+ }
+ return ret;
+ };
+
+ function _fd_write(fd, iov, iovcnt, pnum) {
+ try {
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ var num = doWritev(stream, iov, iovcnt);
+ HEAPU32[pnum >> 2] = num;
+ return 0;
+ } catch (e) {
+ if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e;
+ return e.errno;
+ }
+ }
+
+ var _getaddrinfo = (node, service, hint, out) => {
+ // Note getaddrinfo currently only returns a single addrinfo with ai_next defaulting to NULL. When NULL
+ // hints are specified or ai_family set to AF_UNSPEC or ai_socktype or ai_protocol set to 0 then we
+ // really should provide a linked list of suitable addrinfo values.
+ var addrs = [];
+ var canon = null;
+ var addr = 0;
+ var port = 0;
+ var flags = 0;
+ var family = 0;
+ var type = 0;
+ var proto = 0;
+ var ai, last;
+
+ function allocaddrinfo(family, type, proto, canon, addr, port) {
+ var sa, salen, ai;
+ var errno;
+
+ salen = family === 10 ? 28 : 16;
+ addr = family === 10 ? inetNtop6(addr) : inetNtop4(addr);
+ sa = _malloc(salen);
+ errno = writeSockaddr(sa, family, addr, port);
+ assert(!errno);
+
+ ai = _malloc(32);
+ HEAP32[(ai + 4) >> 2] = family;
+ HEAP32[(ai + 8) >> 2] = type;
+ HEAP32[(ai + 12) >> 2] = proto;
+ HEAPU32[(ai + 24) >> 2] = canon;
+ HEAPU32[(ai + 20) >> 2] = sa;
+ if (family === 10) {
+ HEAP32[(ai + 16) >> 2] = 28;
+ } else {
+ HEAP32[(ai + 16) >> 2] = 16;
+ }
+ HEAP32[(ai + 28) >> 2] = 0;
+
+ return ai;
+ }
+
+ if (hint) {
+ flags = HEAP32[hint >> 2];
+ family = HEAP32[(hint + 4) >> 2];
+ type = HEAP32[(hint + 8) >> 2];
+ proto = HEAP32[(hint + 12) >> 2];
+ }
+ if (type && !proto) {
+ proto = type === 2 ? 17 : 6;
+ }
+ if (!type && proto) {
+ type = proto === 17 ? 2 : 1;
+ }
+
+ // If type or proto are set to zero in hints we should really be returning multiple addrinfo values, but for
+ // now default to a TCP STREAM socket so we can at least return a sensible addrinfo given NULL hints.
+ if (proto === 0) {
+ proto = 6;
+ }
+ if (type === 0) {
+ type = 1;
+ }
+
+ if (!node && !service) {
+ return -2;
+ }
+ if (flags & ~(1 | 2 | 4 | 1024 | 8 | 16 | 32)) {
+ return -1;
+ }
+ if (hint !== 0 && HEAP32[hint >> 2] & 2 && !node) {
+ return -1;
+ }
+ if (flags & 32) {
+ // TODO
+ return -2;
+ }
+ if (type !== 0 && type !== 1 && type !== 2) {
+ return -7;
+ }
+ if (family !== 0 && family !== 2 && family !== 10) {
+ return -6;
+ }
+
+ if (service) {
+ service = UTF8ToString(service);
+ port = parseInt(service, 10);
+
+ if (isNaN(port)) {
+ if (flags & 1024) {
+ return -2;
+ }
+ // TODO support resolving well-known service names from:
+ // http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt
+ return -8;
+ }
+ }
+
+ if (!node) {
+ if (family === 0) {
+ family = 2;
+ }
+ if ((flags & 1) === 0) {
+ if (family === 2) {
+ addr = _htonl(2130706433);
+ } else {
+ addr = [0, 0, 0, _htonl(1)];
+ }
+ }
+ ai = allocaddrinfo(family, type, proto, null, addr, port);
+ HEAPU32[out >> 2] = ai;
+ return 0;
+ }
+
+ //
+ // try as a numeric address
+ //
+ node = UTF8ToString(node);
+ addr = inetPton4(node);
+ if (addr !== null) {
+ // incoming node is a valid ipv4 address
+ if (family === 0 || family === 2) {
+ family = 2;
+ } else if (family === 10 && flags & 8) {
+ addr = [0, 0, _htonl(0xffff), addr];
+ family = 10;
+ } else {
+ return -2;
+ }
+ } else {
+ addr = inetPton6(node);
+ if (addr !== null) {
+ // incoming node is a valid ipv6 address
+ if (family === 0 || family === 10) {
+ family = 10;
+ } else {
+ return -2;
+ }
+ }
+ }
+ if (addr != null) {
+ ai = allocaddrinfo(family, type, proto, node, addr, port);
+ HEAPU32[out >> 2] = ai;
+ return 0;
+ }
+ if (flags & 4) {
+ return -2;
+ }
+
+ //
+ // try as a hostname
+ //
+ // resolve the hostname to a temporary fake address
+ node = DNS.lookup_name(node);
+ addr = inetPton4(node);
+ if (family === 0) {
+ family = 2;
+ } else if (family === 10) {
+ addr = [0, 0, _htonl(0xffff), addr];
+ }
+ ai = allocaddrinfo(family, type, proto, null, addr, port);
+ HEAPU32[out >> 2] = ai;
+ return 0;
+ };
+
+ /** @type {function(...*):?} */
+ function _getcontext() {
+ abort("missing function: getcontext");
+ }
+ _getcontext.stub = true;
+
+ /** @type {function(...*):?} */
+ function _getdtablesize() {
+ abort("missing function: getdtablesize");
+ }
+ _getdtablesize.stub = true;
+
+ var _getnameinfo = (sa, salen, node, nodelen, serv, servlen, flags) => {
+ var info = readSockaddr(sa, salen);
+ if (info.errno) {
+ return -6;
+ }
+ var port = info.port;
+ var addr = info.addr;
+
+ var overflowed = false;
+
+ if (node && nodelen) {
+ var lookup;
+ if (flags & 1 || !(lookup = DNS.lookup_addr(addr))) {
+ if (flags & 8) {
+ return -2;
+ }
+ } else {
+ addr = lookup;
+ }
+ var numBytesWrittenExclNull = stringToUTF8(addr, node, nodelen);
+
+ if (numBytesWrittenExclNull + 1 >= nodelen) {
+ overflowed = true;
+ }
+ }
+
+ if (serv && servlen) {
+ port = "" + port;
+ var numBytesWrittenExclNull = stringToUTF8(port, serv, servlen);
+
+ if (numBytesWrittenExclNull + 1 >= servlen) {
+ overflowed = true;
+ }
+ }
+
+ if (overflowed) {
+ // Note: even when we overflow, getnameinfo() is specced to write out the truncated results.
+ return -12;
+ }
+
+ return 0;
+ };
+
+ var Protocols = {
+ list: [],
+ map: {},
+ };
+
+ var _setprotoent = (stayopen) => {
+ // void setprotoent(int stayopen);
+
+ // Allocate and populate a protoent structure given a name, protocol number and array of aliases
+ function allocprotoent(name, proto, aliases) {
+ // write name into buffer
+ var nameBuf = _malloc(name.length + 1);
+ stringToAscii(name, nameBuf);
+
+ // write aliases into buffer
+ var j = 0;
+ var length = aliases.length;
+ var aliasListBuf = _malloc((length + 1) * 4); // Use length + 1 so we have space for the terminating NULL ptr.
+
+ for (var i = 0; i < length; i++, j += 4) {
+ var alias = aliases[i];
+ var aliasBuf = _malloc(alias.length + 1);
+ stringToAscii(alias, aliasBuf);
+ HEAPU32[(aliasListBuf + j) >> 2] = aliasBuf;
+ }
+ HEAPU32[(aliasListBuf + j) >> 2] = 0; // Terminating NULL pointer.
+
+ // generate protoent
+ var pe = _malloc(12);
+ HEAPU32[pe >> 2] = nameBuf;
+ HEAPU32[(pe + 4) >> 2] = aliasListBuf;
+ HEAP32[(pe + 8) >> 2] = proto;
+ return pe;
+ }
+
+ // Populate the protocol 'database'. The entries are limited to tcp and udp, though it is fairly trivial
+ // to add extra entries from /etc/protocols if desired - though not sure if that'd actually be useful.
+ var list = Protocols.list;
+ var map = Protocols.map;
+ if (list.length === 0) {
+ var entry = allocprotoent("tcp", 6, ["TCP"]);
+ list.push(entry);
+ map["tcp"] = map["6"] = entry;
+ entry = allocprotoent("udp", 17, ["UDP"]);
+ list.push(entry);
+ map["udp"] = map["17"] = entry;
+ }
+
+ _setprotoent.index = 0;
+ };
+
+ var _getprotobyname = (name) => {
+ // struct protoent *getprotobyname(const char *);
+ name = UTF8ToString(name);
+ _setprotoent(true);
+ var result = Protocols.map[name];
+ return result;
+ };
+
+ var _getprotobynumber = (number) => {
+ // struct protoent *getprotobynumber(int proto);
+ _setprotoent(true);
+ var result = Protocols.map[number];
+ return result;
+ };
+
+ /** @type {function(...*):?} */
+ function _makecontext() {
+ abort("missing function: makecontext");
+ }
+ _makecontext.stub = true;
+
+ /** @type {function(...*):?} */
+ function _posix_spawnp() {
+ abort("missing function: posix_spawnp");
+ }
+ _posix_spawnp.stub = true;
+
+ var arraySum = (array, index) => {
+ var sum = 0;
+ for (var i = 0; i <= index; sum += array[i++]) {
+ // no-op
+ }
+ return sum;
+ };
+
+ var MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+ var MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+ var addDays = (date, days) => {
+ var newDate = new Date(date.getTime());
+ while (days > 0) {
+ var leap = isLeapYear(newDate.getFullYear());
+ var currentMonth = newDate.getMonth();
+ var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[
+ currentMonth
+ ];
+
+ if (days > daysInCurrentMonth - newDate.getDate()) {
+ // we spill over to next month
+ days -= daysInCurrentMonth - newDate.getDate() + 1;
+ newDate.setDate(1);
+ if (currentMonth < 11) {
+ newDate.setMonth(currentMonth + 1);
+ } else {
+ newDate.setMonth(0);
+ newDate.setFullYear(newDate.getFullYear() + 1);
+ }
+ } else {
+ // we stay in current month
+ newDate.setDate(newDate.getDate() + days);
+ return newDate;
+ }
+ }
+
+ return newDate;
+ };
+
+ var _strptime = (buf, format, tm) => {
+ // char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tm);
+ // http://pubs.opengroup.org/onlinepubs/009695399/functions/strptime.html
+ var pattern = UTF8ToString(format);
+
+ // escape special characters
+ // TODO: not sure we really need to escape all of these in JS regexps
+ var SPECIAL_CHARS = "\\!@#$^&*()+=-[]/{}|:<>?,.";
+ for (var i = 0, ii = SPECIAL_CHARS.length; i < ii; ++i) {
+ pattern = pattern.replace(
+ new RegExp("\\" + SPECIAL_CHARS[i], "g"),
+ "\\" + SPECIAL_CHARS[i],
+ );
+ }
+
+ // reduce number of matchers
+ var EQUIVALENT_MATCHERS = {
+ A: "%a",
+ B: "%b",
+ c: "%a %b %d %H:%M:%S %Y",
+ D: "%m\\/%d\\/%y",
+ e: "%d",
+ F: "%Y-%m-%d",
+ h: "%b",
+ R: "%H\\:%M",
+ r: "%I\\:%M\\:%S\\s%p",
+ T: "%H\\:%M\\:%S",
+ x: "%m\\/%d\\/(?:%y|%Y)",
+ X: "%H\\:%M\\:%S",
+ };
+ // TODO: take care of locale
+
+ var DATE_PATTERNS = {
+ /* weekday name */ a: "(?:Sun(?:day)?)|(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)",
+ /* month name */ b: "(?:Jan(?:uary)?)|(?:Feb(?:ruary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|May|(?:Jun(?:e)?)|(?:Jul(?:y)?)|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)",
+ /* century */ C: "\\d\\d",
+ /* day of month */ d: "0[1-9]|[1-9](?!\\d)|1\\d|2\\d|30|31",
+ /* hour (24hr) */ H: "\\d(?!\\d)|[0,1]\\d|20|21|22|23",
+ /* hour (12hr) */ I: "\\d(?!\\d)|0\\d|10|11|12",
+ /* day of year */ j: "00[1-9]|0?[1-9](?!\\d)|0?[1-9]\\d(?!\\d)|[1,2]\\d\\d|3[0-6]\\d",
+ /* month */ m: "0[1-9]|[1-9](?!\\d)|10|11|12",
+ /* minutes */ M: "0\\d|\\d(?!\\d)|[1-5]\\d",
+ /* whitespace */ n: " ",
+ /* AM/PM */ p: "AM|am|PM|pm|A\\.M\\.|a\\.m\\.|P\\.M\\.|p\\.m\\.",
+ /* seconds */ S: "0\\d|\\d(?!\\d)|[1-5]\\d|60",
+ /* week number */ U: "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53",
+ /* week number */ W: "0\\d|\\d(?!\\d)|[1-4]\\d|50|51|52|53",
+ /* weekday number */ w: "[0-6]",
+ /* 2-digit year */ y: "\\d\\d",
+ /* 4-digit year */ Y: "\\d\\d\\d\\d",
+ /* whitespace */ t: " ",
+ /* time zone */ z: "Z|(?:[\\+\\-]\\d\\d:?(?:\\d\\d)?)",
+ };
+
+ var MONTH_NUMBERS = {
+ JAN: 0,
+ FEB: 1,
+ MAR: 2,
+ APR: 3,
+ MAY: 4,
+ JUN: 5,
+ JUL: 6,
+ AUG: 7,
+ SEP: 8,
+ OCT: 9,
+ NOV: 10,
+ DEC: 11,
+ };
+ var DAY_NUMBERS_SUN_FIRST = {
+ SUN: 0,
+ MON: 1,
+ TUE: 2,
+ WED: 3,
+ THU: 4,
+ FRI: 5,
+ SAT: 6,
+ };
+ var DAY_NUMBERS_MON_FIRST = {
+ MON: 0,
+ TUE: 1,
+ WED: 2,
+ THU: 3,
+ FRI: 4,
+ SAT: 5,
+ SUN: 6,
+ };
+
+ var capture = [];
+ var pattern_out = pattern
+ .replace(/%(.)/g, (m, c) => EQUIVALENT_MATCHERS[c] || m)
+ .replace(/%(.)/g, (_, c) => {
+ let pat = DATE_PATTERNS[c];
+ if (pat) {
+ capture.push(c);
+ return `(${pat})`;
+ } else {
+ return c;
+ }
+ })
+ .replace(
+ // any number of space or tab characters match zero or more spaces
+ /\s+/g,
+ "\\s*",
+ );
+
+ var matches = new RegExp("^" + pattern_out, "i").exec(UTF8ToString(buf));
+
+ function initDate() {
+ function fixup(value, min, max) {
+ return typeof value != "number" || isNaN(value)
+ ? min
+ : value >= min
+ ? value <= max
+ ? value
+ : max
+ : min;
+ }
+ return {
+ year: fixup(HEAP32[(tm + 20) >> 2] + 1900, 1970, 9999),
+ month: fixup(HEAP32[(tm + 16) >> 2], 0, 11),
+ day: fixup(HEAP32[(tm + 12) >> 2], 1, 31),
+ hour: fixup(HEAP32[(tm + 8) >> 2], 0, 23),
+ min: fixup(HEAP32[(tm + 4) >> 2], 0, 59),
+ sec: fixup(HEAP32[tm >> 2], 0, 59),
+ gmtoff: 0,
+ };
+ }
+
+ if (matches) {
+ var date = initDate();
+ var value;
+
+ var getMatch = (symbol) => {
+ var pos = capture.indexOf(symbol);
+ // check if symbol appears in regexp
+ if (pos >= 0) {
+ // return matched value or null (falsy!) for non-matches
+ return matches[pos + 1];
+ }
+ return;
+ };
+
+ // seconds
+ if ((value = getMatch("S"))) {
+ date.sec = jstoi_q(value);
+ }
+
+ // minutes
+ if ((value = getMatch("M"))) {
+ date.min = jstoi_q(value);
+ }
+
+ // hours
+ if ((value = getMatch("H"))) {
+ // 24h clock
+ date.hour = jstoi_q(value);
+ } else if ((value = getMatch("I"))) {
+ // AM/PM clock
+ var hour = jstoi_q(value);
+ if ((value = getMatch("p"))) {
+ hour += value.toUpperCase()[0] === "P" ? 12 : 0;
+ }
+ date.hour = hour;
+ }
+
+ // year
+ if ((value = getMatch("Y"))) {
+ // parse from four-digit year
+ date.year = jstoi_q(value);
+ } else if ((value = getMatch("y"))) {
+ // parse from two-digit year...
+ var year = jstoi_q(value);
+ if ((value = getMatch("C"))) {
+ // ...and century
+ year += jstoi_q(value) * 100;
+ } else {
+ // ...and rule-of-thumb
+ year += year < 69 ? 2000 : 1900;
+ }
+ date.year = year;
+ }
+
+ // month
+ if ((value = getMatch("m"))) {
+ // parse from month number
+ date.month = jstoi_q(value) - 1;
+ } else if ((value = getMatch("b"))) {
+ // parse from month name
+ date.month = MONTH_NUMBERS[value.substring(0, 3).toUpperCase()] || 0;
+ // TODO: derive month from day in year+year, week number+day of week+year
+ }
+
+ // day
+ if ((value = getMatch("d"))) {
+ // get day of month directly
+ date.day = jstoi_q(value);
+ } else if ((value = getMatch("j"))) {
+ // get day of month from day of year ...
+ var day = jstoi_q(value);
+ var leapYear = isLeapYear(date.year);
+ for (var month = 0; month < 12; ++month) {
+ var daysUntilMonth = arraySum(
+ leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR,
+ month - 1,
+ );
+ if (
+ day <=
+ daysUntilMonth +
+ (leapYear ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[month]
+ ) {
+ date.day = day - daysUntilMonth;
+ }
+ }
+ } else if ((value = getMatch("a"))) {
+ // get day of month from weekday ...
+ var weekDay = value.substring(0, 3).toUpperCase();
+ if ((value = getMatch("U"))) {
+ // ... and week number (Sunday being first day of week)
+ // Week number of the year (Sunday as the first day of the week) as a decimal number [00,53].
+ // All days in a new year preceding the first Sunday are considered to be in week 0.
+ var weekDayNumber = DAY_NUMBERS_SUN_FIRST[weekDay];
+ var weekNumber = jstoi_q(value);
+
+ // January 1st
+ var janFirst = new Date(date.year, 0, 1);
+ var endDate;
+ if (janFirst.getDay() === 0) {
+ // Jan 1st is a Sunday, and, hence in the 1st CW
+ endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1));
+ } else {
+ // Jan 1st is not a Sunday, and, hence still in the 0th CW
+ endDate = addDays(
+ janFirst,
+ 7 - janFirst.getDay() + weekDayNumber + 7 * (weekNumber - 1),
+ );
+ }
+ date.day = endDate.getDate();
+ date.month = endDate.getMonth();
+ } else if ((value = getMatch("W"))) {
+ // ... and week number (Monday being first day of week)
+ // Week number of the year (Monday as the first day of the week) as a decimal number [00,53].
+ // All days in a new year preceding the first Monday are considered to be in week 0.
+ var weekDayNumber = DAY_NUMBERS_MON_FIRST[weekDay];
+ var weekNumber = jstoi_q(value);
+
+ // January 1st
+ var janFirst = new Date(date.year, 0, 1);
+ var endDate;
+ if (janFirst.getDay() === 1) {
+ // Jan 1st is a Monday, and, hence in the 1st CW
+ endDate = addDays(janFirst, weekDayNumber + 7 * (weekNumber - 1));
+ } else {
+ // Jan 1st is not a Monday, and, hence still in the 0th CW
+ endDate = addDays(
+ janFirst,
+ 7 -
+ janFirst.getDay() +
+ 1 +
+ weekDayNumber +
+ 7 * (weekNumber - 1),
+ );
+ }
+
+ date.day = endDate.getDate();
+ date.month = endDate.getMonth();
+ }
+ }
+
+ // time zone
+ if ((value = getMatch("z"))) {
+ // GMT offset as either 'Z' or +-HH:MM or +-HH or +-HHMM
+ if (value.toLowerCase() === "z") {
+ date.gmtoff = 0;
+ } else {
+ var match = value.match(/^((?:\-|\+)\d\d):?(\d\d)?/);
+ date.gmtoff = match[1] * 3600;
+ if (match[2]) {
+ date.gmtoff += date.gmtoff > 0 ? match[2] * 60 : -match[2] * 60;
+ }
+ }
+ }
+
+ /*
+ tm_sec int seconds after the minute 0-61*
+ tm_min int minutes after the hour 0-59
+ tm_hour int hours since midnight 0-23
+ tm_mday int day of the month 1-31
+ tm_mon int months since January 0-11
+ tm_year int years since 1900
+ tm_wday int days since Sunday 0-6
+ tm_yday int days since January 1 0-365
+ tm_isdst int Daylight Saving Time flag
+ tm_gmtoff long offset from GMT (seconds)
+ */
+
+ var fullDate = new Date(
+ date.year,
+ date.month,
+ date.day,
+ date.hour,
+ date.min,
+ date.sec,
+ 0,
+ );
+ HEAP32[tm >> 2] = fullDate.getSeconds();
+ HEAP32[(tm + 4) >> 2] = fullDate.getMinutes();
+ HEAP32[(tm + 8) >> 2] = fullDate.getHours();
+ HEAP32[(tm + 12) >> 2] = fullDate.getDate();
+ HEAP32[(tm + 16) >> 2] = fullDate.getMonth();
+ HEAP32[(tm + 20) >> 2] = fullDate.getFullYear() - 1900;
+ HEAP32[(tm + 24) >> 2] = fullDate.getDay();
+ HEAP32[(tm + 28) >> 2] =
+ arraySum(
+ isLeapYear(fullDate.getFullYear())
+ ? MONTH_DAYS_LEAP
+ : MONTH_DAYS_REGULAR,
+ fullDate.getMonth() - 1,
+ ) +
+ fullDate.getDate() -
+ 1;
+ HEAP32[(tm + 32) >> 2] = 0;
+ HEAP32[(tm + 36) >> 2] = date.gmtoff;
+
+ // we need to convert the matched sequence into an integer array to take care of UTF-8 characters > 0x7F
+ // TODO: not sure that intArrayFromString handles all unicode characters correctly
+ return buf + intArrayFromString(matches[0]).length - 1;
+ }
+
+ return 0;
+ };
+
+ /** @type {function(...*):?} */
+ function _swapcontext() {
+ abort("missing function: swapcontext");
+ }
+ _swapcontext.stub = true;
+
+ var getCFunc = (ident) => {
+ var func = Module["_" + ident]; // closure exported function
+ assert(
+ func,
+ "Cannot call unknown function " + ident + ", make sure it is exported",
+ );
+ return func;
+ };
+
+ var writeArrayToMemory = (array, buffer) => {
+ assert(
+ array.length >= 0,
+ "writeArrayToMemory array must have a length (should be an array or typed array)",
+ );
+ HEAP8.set(array, buffer);
+ };
+
+ var stackAlloc = (sz) => __emscripten_stack_alloc(sz);
+ var stringToUTF8OnStack = (str) => {
+ var size = lengthBytesUTF8(str) + 1;
+ var ret = stackAlloc(size);
+ stringToUTF8(str, ret, size);
+ return ret;
+ };
+
+ /**
+ * @param {string|null=} returnType
+ * @param {Array=} argTypes
+ * @param {Arguments|Array=} args
+ * @param {Object=} opts
+ */
+ var ccall = (ident, returnType, argTypes, args, opts) => {
+ // For fast lookup of conversion functions
+ var toC = {
+ string: (str) => {
+ var ret = 0;
+ if (str !== null && str !== undefined && str !== 0) {
+ // null string
+ ret = stringToUTF8OnStack(str);
+ }
+ return ret;
+ },
+ array: (arr) => {
+ var ret = stackAlloc(arr.length);
+ writeArrayToMemory(arr, ret);
+ return ret;
+ },
+ };
+
+ function convertReturnValue(ret) {
+ if (returnType === "string") {
+ return UTF8ToString(ret);
+ }
+ if (returnType === "boolean") return Boolean(ret);
+ return ret;
+ }
+
+ var func = getCFunc(ident);
+ var cArgs = [];
+ var stack = 0;
+ assert(returnType !== "array", 'Return type should not be "array".');
+ if (args) {
+ for (var i = 0; i < args.length; i++) {
+ var converter = toC[argTypes[i]];
+ if (converter) {
+ if (stack === 0) stack = stackSave();
+ cArgs[i] = converter(args[i]);
+ } else {
+ cArgs[i] = args[i];
+ }
+ }
+ }
+ var ret = func(...cArgs);
+ function onDone(ret) {
+ if (stack !== 0) stackRestore(stack);
+ return convertReturnValue(ret);
+ }
+
+ ret = onDone(ret);
+ return ret;
+ };
+
+ FS.createPreloadedFile = FS_createPreloadedFile;
+ FS.staticInit();
+ // Set module methods based on EXPORTED_RUNTIME_METHODS
+ function checkIncomingModuleAPI() {
+ ignoredModuleProp("fetchSettings");
+ }
+ var wasmImports = {
+ /** @export */
+ __assert_fail: ___assert_fail,
+ /** @export */
+ __call_sighandler: ___call_sighandler,
+ /** @export */
+ __syscall__newselect: ___syscall__newselect,
+ /** @export */
+ __syscall_accept4: ___syscall_accept4,
+ /** @export */
+ __syscall_bind: ___syscall_bind,
+ /** @export */
+ __syscall_chdir: ___syscall_chdir,
+ /** @export */
+ __syscall_chmod: ___syscall_chmod,
+ /** @export */
+ __syscall_connect: ___syscall_connect,
+ /** @export */
+ __syscall_dup: ___syscall_dup,
+ /** @export */
+ __syscall_faccessat: ___syscall_faccessat,
+ /** @export */
+ __syscall_fchownat: ___syscall_fchownat,
+ /** @export */
+ __syscall_fcntl64: ___syscall_fcntl64,
+ /** @export */
+ __syscall_fdatasync: ___syscall_fdatasync,
+ /** @export */
+ __syscall_fstat64: ___syscall_fstat64,
+ /** @export */
+ __syscall_ftruncate64: ___syscall_ftruncate64,
+ /** @export */
+ __syscall_getcwd: ___syscall_getcwd,
+ /** @export */
+ __syscall_getdents64: ___syscall_getdents64,
+ /** @export */
+ __syscall_getpeername: ___syscall_getpeername,
+ /** @export */
+ __syscall_getsockname: ___syscall_getsockname,
+ /** @export */
+ __syscall_getsockopt: ___syscall_getsockopt,
+ /** @export */
+ __syscall_ioctl: ___syscall_ioctl,
+ /** @export */
+ __syscall_listen: ___syscall_listen,
+ /** @export */
+ __syscall_lstat64: ___syscall_lstat64,
+ /** @export */
+ __syscall_mkdirat: ___syscall_mkdirat,
+ /** @export */
+ __syscall_newfstatat: ___syscall_newfstatat,
+ /** @export */
+ __syscall_openat: ___syscall_openat,
+ /** @export */
+ __syscall_pipe: ___syscall_pipe,
+ /** @export */
+ __syscall_poll: ___syscall_poll,
+ /** @export */
+ __syscall_readlinkat: ___syscall_readlinkat,
+ /** @export */
+ __syscall_recvfrom: ___syscall_recvfrom,
+ /** @export */
+ __syscall_renameat: ___syscall_renameat,
+ /** @export */
+ __syscall_rmdir: ___syscall_rmdir,
+ /** @export */
+ __syscall_sendto: ___syscall_sendto,
+ /** @export */
+ __syscall_socket: ___syscall_socket,
+ /** @export */
+ __syscall_stat64: ___syscall_stat64,
+ /** @export */
+ __syscall_statfs64: ___syscall_statfs64,
+ /** @export */
+ __syscall_symlinkat: ___syscall_symlinkat,
+ /** @export */
+ __syscall_unlinkat: ___syscall_unlinkat,
+ /** @export */
+ __syscall_utimensat: ___syscall_utimensat,
+ /** @export */
+ _abort_js: __abort_js,
+ /** @export */
+ _emscripten_lookup_name: __emscripten_lookup_name,
+ /** @export */
+ _emscripten_memcpy_js: __emscripten_memcpy_js,
+ /** @export */
+ _emscripten_runtime_keepalive_clear: __emscripten_runtime_keepalive_clear,
+ /** @export */
+ _emscripten_throw_longjmp: __emscripten_throw_longjmp,
+ /** @export */
+ _gmtime_js: __gmtime_js,
+ /** @export */
+ _localtime_js: __localtime_js,
+ /** @export */
+ _mktime_js: __mktime_js,
+ /** @export */
+ _mmap_js: __mmap_js,
+ /** @export */
+ _munmap_js: __munmap_js,
+ /** @export */
+ _setitimer_js: __setitimer_js,
+ /** @export */
+ _tzset_js: __tzset_js,
+ /** @export */
+ clock_time_get: _clock_time_get,
+ /** @export */
+ emscripten_date_now: _emscripten_date_now,
+ /** @export */
+ emscripten_err: _emscripten_err,
+ /** @export */
+ emscripten_get_heap_max: _emscripten_get_heap_max,
+ /** @export */
+ emscripten_get_now: _emscripten_get_now,
+ /** @export */
+ emscripten_resize_heap: _emscripten_resize_heap,
+ /** @export */
+ environ_get: _environ_get,
+ /** @export */
+ environ_sizes_get: _environ_sizes_get,
+ /** @export */
+ exit: _exit,
+ /** @export */
+ fd_close: _fd_close,
+ /** @export */
+ fd_fdstat_get: _fd_fdstat_get,
+ /** @export */
+ fd_read: _fd_read,
+ /** @export */
+ fd_seek: _fd_seek,
+ /** @export */
+ fd_sync: _fd_sync,
+ /** @export */
+ fd_write: _fd_write,
+ /** @export */
+ getaddrinfo: _getaddrinfo,
+ /** @export */
+ getcontext: _getcontext,
+ /** @export */
+ getdtablesize: _getdtablesize,
+ /** @export */
+ getnameinfo: _getnameinfo,
+ /** @export */
+ getprotobyname: _getprotobyname,
+ /** @export */
+ getprotobynumber: _getprotobynumber,
+ /** @export */
+ invoke_i,
+ /** @export */
+ invoke_ii,
+ /** @export */
+ invoke_iii,
+ /** @export */
+ invoke_iiii,
+ /** @export */
+ invoke_iiiii,
+ /** @export */
+ invoke_iiiiii,
+ /** @export */
+ invoke_iiiiiii,
+ /** @export */
+ invoke_iiiiiiiiii,
+ /** @export */
+ invoke_v,
+ /** @export */
+ invoke_vi,
+ /** @export */
+ invoke_vii,
+ /** @export */
+ invoke_viidii,
+ /** @export */
+ invoke_viii,
+ /** @export */
+ invoke_viiii,
+ /** @export */
+ invoke_viiiii,
+ /** @export */
+ makecontext: _makecontext,
+ /** @export */
+ posix_spawnp: _posix_spawnp,
+ /** @export */
+ proc_exit: _proc_exit,
+ /** @export */
+ strptime: _strptime,
+ /** @export */
+ swapcontext: _swapcontext,
+ };
+ var wasmExports;
+ createWasm();
+ var ___wasm_call_ctors = createExportWrapper("__wasm_call_ctors", 0);
+ var _php_wasm_run = (Module["_php_wasm_run"] = createExportWrapper(
+ "php_wasm_run",
+ 1,
+ ));
+ var _fflush = createExportWrapper("fflush", 1);
+ var _malloc = createExportWrapper("malloc", 1);
+ var _strerror = createExportWrapper("strerror", 1);
+ var _htons = createExportWrapper("htons", 1);
+ var _ntohs = createExportWrapper("ntohs", 1);
+ var _htonl = createExportWrapper("htonl", 1);
+ var _emscripten_builtin_memalign = createExportWrapper(
+ "emscripten_builtin_memalign",
+ 2,
+ );
+ var __emscripten_timeout = createExportWrapper("_emscripten_timeout", 2);
+ var _setThrew = createExportWrapper("setThrew", 2);
+ var __emscripten_tempret_set = createExportWrapper(
+ "_emscripten_tempret_set",
+ 1,
+ );
+ var _emscripten_stack_init = () =>
+ (_emscripten_stack_init = wasmExports["emscripten_stack_init"])();
+ var _emscripten_stack_get_free = () =>
+ (_emscripten_stack_get_free = wasmExports["emscripten_stack_get_free"])();
+ var _emscripten_stack_get_base = () =>
+ (_emscripten_stack_get_base = wasmExports["emscripten_stack_get_base"])();
+ var _emscripten_stack_get_end = () =>
+ (_emscripten_stack_get_end = wasmExports["emscripten_stack_get_end"])();
+ var __emscripten_stack_restore = (a0) =>
+ (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(
+ a0,
+ );
+ var __emscripten_stack_alloc = (a0) =>
+ (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0);
+ var _emscripten_stack_get_current = () =>
+ (_emscripten_stack_get_current =
+ wasmExports["emscripten_stack_get_current"])();
+ var dynCall_jiji = (Module["dynCall_jiji"] = createExportWrapper(
+ "dynCall_jiji",
+ 5,
+ ));
+
+ function invoke_iii(index, a1, a2) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiiii(index, a1, a2, a3, a4) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3, a4);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_v(index) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)();
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_ii(index, a1) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_viii(index, a1, a2, a3) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2, a3);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_vii(index, a1, a2) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_vi(index, a1) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_i(index) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)();
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiiiiii(index, a1, a2, a3, a4, a5, a6) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3, a4, a5, a6);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiii(index, a1, a2, a3) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_viiii(index, a1, a2, a3, a4) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2, a3, a4);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_viiiii(index, a1, a2, a3, a4, a5) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2, a3, a4, a5);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiiiii(index, a1, a2, a3, a4, a5) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3, a4, a5);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_iiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
+ var sp = stackSave();
+ try {
+ return getWasmTableEntry(index)(a1, a2, a3, a4, a5, a6, a7, a8, a9);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ function invoke_viidii(index, a1, a2, a3, a4, a5) {
+ var sp = stackSave();
+ try {
+ getWasmTableEntry(index)(a1, a2, a3, a4, a5);
+ } catch (e) {
+ stackRestore(sp);
+ if (e !== e + 0) throw e;
+ _setThrew(1, 0);
+ }
+ }
+
+ // include: postamble.js
+ // === Auto-generated postamble setup entry stuff ===
+
+ Module["ccall"] = ccall;
+ var missingLibrarySymbols = [
+ "writeI53ToI64",
+ "writeI53ToI64Clamped",
+ "writeI53ToI64Signaling",
+ "writeI53ToU64Clamped",
+ "writeI53ToU64Signaling",
+ "readI53FromU64",
+ "convertI32PairToI53",
+ "convertU32PairToI53",
+ "getTempRet0",
+ "growMemory",
+ "emscriptenLog",
+ "readEmAsmArgs",
+ "listenOnce",
+ "autoResumeAudioContext",
+ "dynCallLegacy",
+ "getDynCaller",
+ "dynCall",
+ "runtimeKeepalivePush",
+ "runtimeKeepalivePop",
+ "asmjsMangle",
+ "HandleAllocator",
+ "getNativeTypeSize",
+ "STACK_SIZE",
+ "STACK_ALIGN",
+ "POINTER_SIZE",
+ "ASSERTIONS",
+ "cwrap",
+ "uleb128Encode",
+ "sigToWasmTypes",
+ "generateFuncType",
+ "convertJsFunctionToWasm",
+ "getEmptyTableSlot",
+ "updateTableMap",
+ "getFunctionAddress",
+ "addFunction",
+ "removeFunction",
+ "reallyNegative",
+ "unSign",
+ "strLen",
+ "reSign",
+ "formatString",
+ "intArrayToString",
+ "AsciiToString",
+ "UTF16ToString",
+ "stringToUTF16",
+ "lengthBytesUTF16",
+ "UTF32ToString",
+ "stringToUTF32",
+ "lengthBytesUTF32",
+ "stringToNewUTF8",
+ "registerKeyEventCallback",
+ "maybeCStringToJsString",
+ "findEventTarget",
+ "getBoundingClientRect",
+ "fillMouseEventData",
+ "registerMouseEventCallback",
+ "registerWheelEventCallback",
+ "registerUiEventCallback",
+ "registerFocusEventCallback",
+ "fillDeviceOrientationEventData",
+ "registerDeviceOrientationEventCallback",
+ "fillDeviceMotionEventData",
+ "registerDeviceMotionEventCallback",
+ "screenOrientation",
+ "fillOrientationChangeEventData",
+ "registerOrientationChangeEventCallback",
+ "fillFullscreenChangeEventData",
+ "registerFullscreenChangeEventCallback",
+ "JSEvents_requestFullscreen",
+ "JSEvents_resizeCanvasForFullscreen",
+ "registerRestoreOldStyle",
+ "hideEverythingExceptGivenElement",
+ "restoreHiddenElements",
+ "setLetterbox",
+ "softFullscreenResizeWebGLRenderTarget",
+ "doRequestFullscreen",
+ "fillPointerlockChangeEventData",
+ "registerPointerlockChangeEventCallback",
+ "registerPointerlockErrorEventCallback",
+ "requestPointerLock",
+ "fillVisibilityChangeEventData",
+ "registerVisibilityChangeEventCallback",
+ "registerTouchEventCallback",
+ "fillGamepadEventData",
+ "registerGamepadEventCallback",
+ "registerBeforeUnloadEventCallback",
+ "fillBatteryEventData",
+ "battery",
+ "registerBatteryEventCallback",
+ "setCanvasElementSize",
+ "getCanvasElementSize",
+ "jsStackTrace",
+ "getCallstack",
+ "convertPCtoSourceLocation",
+ "wasiRightsToMuslOFlags",
+ "wasiOFlagsToMuslOFlags",
+ "safeSetTimeout",
+ "setImmediateWrapped",
+ "safeRequestAnimationFrame",
+ "clearImmediateWrapped",
+ "polyfillSetImmediate",
+ "registerPostMainLoop",
+ "registerPreMainLoop",
+ "getPromise",
+ "makePromise",
+ "idsToPromises",
+ "makePromiseCallback",
+ "ExceptionInfo",
+ "findMatchingCatch",
+ "Browser_asyncPrepareDataCounter",
+ "FS_unlink",
+ "FS_mkdirTree",
+ "_setNetworkCallback",
+ "heapObjectForWebGLType",
+ "toTypedArrayIndex",
+ "webgl_enable_ANGLE_instanced_arrays",
+ "webgl_enable_OES_vertex_array_object",
+ "webgl_enable_WEBGL_draw_buffers",
+ "webgl_enable_WEBGL_multi_draw",
+ "webgl_enable_EXT_polygon_offset_clamp",
+ "webgl_enable_EXT_clip_control",
+ "webgl_enable_WEBGL_polygon_mode",
+ "emscriptenWebGLGet",
+ "computeUnpackAlignedImageSize",
+ "colorChannelsInGlTextureFormat",
+ "emscriptenWebGLGetTexPixelData",
+ "emscriptenWebGLGetUniform",
+ "webglGetUniformLocation",
+ "webglPrepareUniformLocationsBeforeFirstUse",
+ "webglGetLeftBracePos",
+ "emscriptenWebGLGetVertexAttrib",
+ "__glGetActiveAttribOrUniform",
+ "writeGLArray",
+ "registerWebGlEventCallback",
+ "runAndAbortIfError",
+ "ALLOC_NORMAL",
+ "ALLOC_STACK",
+ "allocate",
+ "writeStringToMemory",
+ "writeAsciiToMemory",
+ "setErrNo",
+ "demangle",
+ "stackTrace",
+ ];
+ missingLibrarySymbols.forEach(missingLibrarySymbol);
+
+ var unexportedSymbols = [
+ "run",
+ "addOnPreRun",
+ "addOnInit",
+ "addOnPreMain",
+ "addOnExit",
+ "addOnPostRun",
+ "addRunDependency",
+ "removeRunDependency",
+ "out",
+ "err",
+ "callMain",
+ "abort",
+ "wasmMemory",
+ "wasmExports",
+ "writeStackCookie",
+ "checkStackCookie",
+ "readI53FromI64",
+ "convertI32PairToI53Checked",
+ "stackSave",
+ "stackRestore",
+ "stackAlloc",
+ "setTempRet0",
+ "ptrToString",
+ "zeroMemory",
+ "exitJS",
+ "getHeapMax",
+ "abortOnCannotGrowMemory",
+ "ENV",
+ "ERRNO_CODES",
+ "strError",
+ "inetPton4",
+ "inetNtop4",
+ "inetPton6",
+ "inetNtop6",
+ "readSockaddr",
+ "writeSockaddr",
+ "DNS",
+ "Protocols",
+ "Sockets",
+ "timers",
+ "warnOnce",
+ "readEmAsmArgsArray",
+ "jstoi_q",
+ "jstoi_s",
+ "getExecutableName",
+ "handleException",
+ "keepRuntimeAlive",
+ "callUserCallback",
+ "maybeExit",
+ "asyncLoad",
+ "alignMemory",
+ "mmapAlloc",
+ "wasmTable",
+ "noExitRuntime",
+ "getCFunc",
+ "freeTableIndexes",
+ "functionsInTableMap",
+ "setValue",
+ "getValue",
+ "PATH",
+ "PATH_FS",
+ "UTF8Decoder",
+ "UTF8ArrayToString",
+ "UTF8ToString",
+ "stringToUTF8Array",
+ "stringToUTF8",
+ "lengthBytesUTF8",
+ "intArrayFromString",
+ "stringToAscii",
+ "UTF16Decoder",
+ "stringToUTF8OnStack",
+ "writeArrayToMemory",
+ "JSEvents",
+ "specialHTMLTargets",
+ "findCanvasEventTarget",
+ "currentFullscreenStrategy",
+ "restoreOldWindowedStyle",
+ "UNWIND_CACHE",
+ "ExitStatus",
+ "getEnvStrings",
+ "checkWasiClock",
+ "doReadv",
+ "doWritev",
+ "initRandomFill",
+ "randomFill",
+ "promiseMap",
+ "uncaughtExceptionCount",
+ "exceptionLast",
+ "exceptionCaught",
+ "Browser",
+ "getPreloadedImageData__data",
+ "wget",
+ "MONTH_DAYS_REGULAR",
+ "MONTH_DAYS_LEAP",
+ "MONTH_DAYS_REGULAR_CUMULATIVE",
+ "MONTH_DAYS_LEAP_CUMULATIVE",
+ "isLeapYear",
+ "ydayFromDate",
+ "arraySum",
+ "addDays",
+ "SYSCALLS",
+ "getSocketFromFD",
+ "getSocketAddress",
+ "preloadPlugins",
+ "FS_createPreloadedFile",
+ "FS_modeStringToFlags",
+ "FS_getMode",
+ "FS_stdin_getChar_buffer",
+ "FS_stdin_getChar",
+ "FS_createPath",
+ "FS_createDevice",
+ "FS_readFile",
+ "FS",
+ "FS_createDataFile",
+ "FS_createLazyFile",
+ "MEMFS",
+ "TTY",
+ "PIPEFS",
+ "SOCKFS",
+ "tempFixedLengthArray",
+ "miniTempWebGLFloatBuffers",
+ "miniTempWebGLIntBuffers",
+ "GL",
+ "AL",
+ "GLUT",
+ "EGL",
+ "GLEW",
+ "IDBStore",
+ "SDL",
+ "SDL_gfx",
+ "allocateUTF8",
+ "allocateUTF8OnStack",
+ "print",
+ "printErr",
+ ];
+ unexportedSymbols.forEach(unexportedRuntimeSymbol);
+
+ var calledRun;
+
+ dependenciesFulfilled = function runCaller() {
+ // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
+ if (!calledRun) run();
+ if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
+ };
+
+ function stackCheckInit() {
+ // This is normally called automatically during __wasm_call_ctors but need to
+ // get these values before even running any of the ctors so we call it redundantly
+ // here.
+ _emscripten_stack_init();
+ // TODO(sbc): Move writeStackCookie to native to to avoid this.
+ writeStackCookie();
+ }
+
+ function run() {
+ if (runDependencies > 0) {
+ return;
+ }
+
+ stackCheckInit();
+
+ preRun();
+
+ // a preRun added a dependency, run will be called later
+ if (runDependencies > 0) {
+ return;
+ }
+
+ function doRun() {
+ // run may have just been called through dependencies being fulfilled just in this very frame,
+ // or while the async setStatus time below was happening
+ if (calledRun) return;
+ calledRun = true;
+ Module["calledRun"] = true;
+
+ if (ABORT) return;
+
+ initRuntime();
+
+ readyPromiseResolve(Module);
+ Module["onRuntimeInitialized"]?.();
+
+ assert(
+ !Module["_main"],
+ 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]',
+ );
+
+ postRun();
+ }
+
+ if (Module["setStatus"]) {
+ Module["setStatus"]("Running...");
+ setTimeout(() => {
+ setTimeout(() => Module["setStatus"](""), 1);
+ doRun();
+ }, 1);
+ } else {
+ doRun();
+ }
+ checkStackCookie();
+ }
+
+ function checkUnflushedContent() {
+ // Compiler settings do not allow exiting the runtime, so flushing
+ // the streams is not possible. but in ASSERTIONS mode we check
+ // if there was something to flush, and if so tell the user they
+ // should request that the runtime be exitable.
+ // Normally we would not even include flush() at all, but in ASSERTIONS
+ // builds we do so just for this check, and here we see if there is any
+ // content to flush, that is, we check if there would have been
+ // something a non-ASSERTIONS build would have not seen.
+ // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0
+ // mode (which has its own special function for this; otherwise, all
+ // the code is inside libc)
+ var oldOut = out;
+ var oldErr = err;
+ var has = false;
+ out = err = (x) => {
+ has = true;
+ };
+ try {
+ // it doesn't matter if it fails
+ _fflush(0);
+ // also flush in the JS FS layer
+ ["stdout", "stderr"].forEach((name) => {
+ var info = FS.analyzePath("/dev/" + name);
+ if (!info) return;
+ var stream = info.object;
+ var rdev = stream.rdev;
+ var tty = TTY.ttys[rdev];
+ if (tty?.output?.length) {
+ has = true;
+ }
+ });
+ } catch (e) {}
+ out = oldOut;
+ err = oldErr;
+ if (has) {
+ warnOnce(
+ "stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.",
+ );
+ }
+ }
+
+ if (Module["preInit"]) {
+ if (typeof Module["preInit"] == "function")
+ Module["preInit"] = [Module["preInit"]];
+ while (Module["preInit"].length > 0) {
+ Module["preInit"].pop()();
+ }
+ }
+
+ run();
+
+ // end include: postamble.js
+
+ // include: postamble_modularize.js
+ // In MODULARIZE mode we wrap the generated code in a factory function
+ // and return either the Module itself, or a promise of the module.
+ //
+ // We assign to the `moduleRtn` global here and configure closure to see
+ // this as and extern so it won't get minified.
+
+ moduleRtn = readyPromise;
+
+ // Assertion for attempting to access module properties on the incoming
+ // moduleArg. In the past we used this object as the prototype of the module
+ // and assigned properties to it, but now we return a distinct object. This
+ // keeps the instance private until it is ready (i.e the promise has been
+ // resolved).
+ for (const prop of Object.keys(Module)) {
+ if (!(prop in moduleArg)) {
+ Object.defineProperty(moduleArg, prop, {
+ configurable: true,
+ get() {
+ abort(
+ `Access to module property ('${prop}') is no longer possible via the module constructor argument; Instead, use the result of the module constructor.`,
+ );
+ },
+ });
+ }
+ }
+ // end include: postamble_modularize.js
+
+ return moduleRtn;
+ };
+})();
+export default Module;
diff --git a/src/quiz.ts b/src/quiz.ts
new file mode 100644
index 0000000..43e9f49
--- /dev/null
+++ b/src/quiz.ts
@@ -0,0 +1,10 @@
+export type Quiz = {
+ label: string;
+ func: string;
+ message: string;
+};
+
+export type QuizGroup = {
+ label: string;
+ quizzes: Quiz[];
+};
diff --git a/src/quiz_data.ts b/src/quiz_data.ts
new file mode 100644
index 0000000..3c6f6dd
--- /dev/null
+++ b/src/quiz_data.ts
@@ -0,0 +1,74 @@
+import { QuizGroup } from "./quiz";
+
+export const QUIZ_GROUPS: QuizGroup[] = [
+ {
+ label: "チュートリアル",
+ quizzes: [
+ {
+ label: "Q1",
+ func: "abs",
+ message: "トークン1文字目「#」",
+ },
+ ],
+ },
+ {
+ label: "かんたん",
+ quizzes: [
+ {
+ label: "Q2",
+ func: "strlen",
+ message: "トークン2文字目「W」",
+ },
+ {
+ label: "Q3",
+ func: "gettype",
+ message: "トークン3文字目「E」",
+ },
+ {
+ label: "Q4",
+ func: "count",
+ message: "トークン4文字目「❤」",
+ },
+ ],
+ },
+ {
+ label: "ふつう",
+ quizzes: [
+ {
+ label: "Q5",
+ func: "md5",
+ message: "トークン5文字目「P」",
+ },
+ {
+ label: "Q6",
+ func: "strtoupper",
+ message: "トークン6文字目「H」",
+ },
+ {
+ label: "Q7",
+ func: "array_keys",
+ message: "トークン7文字目「P」。トークンはこれでおわり",
+ },
+ ],
+ },
+ {
+ label: "むずかしい",
+ quizzes: [
+ {
+ label: "Q8",
+ func: "str_rot13",
+ message: "すごい!",
+ },
+ {
+ label: "Q9",
+ func: "metaphone",
+ message: "すごい!",
+ },
+ {
+ label: "Q10",
+ func: "array_change_key_case",
+ message: "すごい!",
+ },
+ ],
+ },
+];
diff --git a/src/styles.css b/src/styles.css
new file mode 100644
index 0000000..b5d845e
--- /dev/null
+++ b/src/styles.css
@@ -0,0 +1,73 @@
+body {
+ margin: 0;
+ padding: 0;
+ font-size: 14px;
+ background-color: #ee0;
+}
+
+table#layout {
+ width: 800px;
+ margin: 0 auto;
+ border: 4px solid #000;
+}
+
+#layout td {
+ border: 2px solid #00e;
+ padding: 10px;
+ vertical-align: top;
+}
+
+#header {
+ text-align: center;
+ font-weight: bold;
+ font-size: 32px;
+ background-color: #e0e;
+ color: #fff;
+}
+
+#sidebar {
+ width: 200px;
+ background-color: #ec0;
+}
+
+#sidebar .hidden {
+ color: #ec0;
+}
+
+#content {
+ background-color: #ee0;
+}
+
+code {
+ background-color: #eee;
+ padding: 2px 4px;
+}
+
+input[type="text"] {
+ width: 180px;
+ background-color: #eee;
+ border: 1px solid #000;
+ padding: 2px 4px;
+}
+
+.marquee {
+ overflow: hidden;
+ white-space: nowrap;
+ box-sizing: border-box;
+ width: 300px;
+}
+
+.marquee span {
+ display: inline-block;
+ padding-left: 100%;
+ animation: marquee-scroll 10s linear infinite;
+}
+
+@keyframes marquee-scroll {
+ 0% {
+ transform: translateX(0);
+ }
+ 100% {
+ transform: translateX(-100%);
+ }
+}
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+/// <reference types="vite/client" />
diff --git a/tools/compile-php-to-wasm.sh b/tools/compile-php-to-wasm.sh
new file mode 100755
index 0000000..60806e7
--- /dev/null
+++ b/tools/compile-php-to-wasm.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+set -eux
+
+cd wasm
+docker build -t phperkaigi2025-tokens-php-wasm .
+docker create --name phperkaigi2025-tokens-php-wasm-tmp-container phperkaigi2025-tokens-php-wasm
+docker cp phperkaigi2025-tokens-php-wasm-tmp-container:/src/php-wasm.js ../src/php-wasm-bridge.js
+docker cp phperkaigi2025-tokens-php-wasm-tmp-container:/src/php-wasm.wasm ../public/php-wasm.wasm
+docker rm phperkaigi2025-tokens-php-wasm-tmp-container
diff --git a/tsconfig.app.json b/tsconfig.app.json
new file mode 100644
index 0000000..20d4981
--- /dev/null
+++ b/tsconfig.app.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2021",
+ "useDefineForClassFields": true,
+ "lib": ["ES2021", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["src"]
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..fb12418
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..0cea7db
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..30e3579
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,10 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+
+// https://vite.dev/config/
+export default defineConfig({
+ build: {
+ outDir: "docs",
+ },
+ plugins: [react()],
+});
diff --git a/wasm/Dockerfile b/wasm/Dockerfile
new file mode 100644
index 0000000..270026e
--- /dev/null
+++ b/wasm/Dockerfile
@@ -0,0 +1,66 @@
+FROM emscripten/emsdk:3.1.74
+
+RUN git clone --depth=1 --branch=php-8.4.2 https://github.com/php/php-src
+
+RUN apt-get update && \
+ apt-get install -y --no-install-recommends \
+ autoconf \
+ bison \
+ pkg-config \
+ re2c \
+ && \
+ :
+
+# Define ZEND_MM_ERROR=0 for suppressing munmap() errors.
+RUN cd php-src && \
+ ./buildconf --force && \
+ emconfigure ./configure \
+ --disable-all \
+ --disable-mbregex \
+ --disable-fiber-asm \
+ --disable-cli \
+ --disable-cgi \
+ --disable-phpdbg \
+ --enable-embed=static \
+ --enable-mbstring \
+ --without-iconv \
+ --without-libxml \
+ --without-pcre-jit \
+ --without-pdo-sqlite \
+ --without-sqlite3 \
+ && \
+ EMCC_CFLAGS='-s ERROR_ON_UNDEFINED_SYMBOLS=0 -D ZEND_MM_ERROR=0' emmake make -j$(nproc) && \
+ mv libs/libphp.a .. && \
+ make clean && \
+ git clean -fd && \
+ :
+
+COPY php-wasm.c /src/
+
+RUN cd php-src && \
+ emcc \
+ -c \
+ -o php-wasm.o \
+ -I . \
+ -I TSRM \
+ -I Zend \
+ -I main \
+ ../php-wasm.c \
+ && \
+ mv php-wasm.o .. && \
+ make clean && \
+ git clean -fd && \
+ :
+
+RUN emcc \
+ -s ENVIRONMENT=web \
+ -s ERROR_ON_UNDEFINED_SYMBOLS=0 \
+ -s EXPORTED_RUNTIME_METHODS='["ccall"]' \
+ -s EXPORT_ES6=1 \
+ -s INITIAL_MEMORY=16777216 \
+ -s INVOKE_RUN=0 \
+ -s MODULARIZE=1 \
+ -o php-wasm.js \
+ php-wasm.o \
+ libphp.a \
+ ;
diff --git a/wasm/php-wasm.c b/wasm/php-wasm.c
new file mode 100644
index 0000000..9c71ca1
--- /dev/null
+++ b/wasm/php-wasm.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <emscripten.h>
+#include <Zend/zend_execute.h>
+#include <sapi/embed/php_embed.h>
+
+int EMSCRIPTEN_KEEPALIVE php_wasm_run(const char* code) {
+ zend_result result;
+
+ int argc = 1;
+ char* argv[] = { "php.wasm", NULL };
+
+ PHP_EMBED_START_BLOCK(argc, argv);
+
+ result = zend_eval_string_ex(code, NULL, "php.wasm code", 1);
+
+ PHP_EMBED_END_BLOCK();
+
+ fflush(stdout);
+ fflush(stderr);
+
+ return result == SUCCESS ? 0 : 1;
+}