diff --git a/www/js/lib/libzim-asm.js b/www/js/lib/libzim-asm.js new file mode 100644 index 00000000..09b19e6e --- /dev/null +++ b/www/js/lib/libzim-asm.js @@ -0,0 +1,170 @@ + +var k;k||(k=typeof Module !== 'undefined' ? Module : {}); +self.addEventListener("message",function(ja){var Ib=performance.now(),V=ja.data.action,Jc=ja.data.path,ka=ja.ports[0];console.debug("WebWorker called with action="+V);if("getEntryByPath"===V){var Jb=ja.data.H,la=k[V](Jc);if(la){var kb={};if(Jb||!la.Ea()){kb=la.getItem(Jb);var Kb=performance.now(),Kc=kb.getData(),Lb=performance.now(),Mb=Kc.jd(),Nb=performance.now(),Lc=new Uint8Array(Mb),Ob=performance.now();ka.postMessage({content:Lc,Ac:kb.ld(),Ea:la.Ea()});var Pb=performance.now();console.debug("content length = "+ +Mb.length+" read in "+Math.round(Pb-Ib)+" ms ("+Math.round(Kb-Ib)+" ms to find the entry, "+Math.round(Lb-Kb)+" ms for getData, "+Math.round(Nb-Lb)+" ms for getContent, "+Math.round(Ob-Nb)+" ms for array copying, "+Math.round(Pb-Ob)+" ms for postMessage)")}else ka.postMessage({content:new Uint8Array,Ea:!0,xd:la.md().M()})}else ka.postMessage({content:new Uint8Array,Ac:"unknown",Ea:!1})}else if("search"===V){var Ja=k[V](ja.data.text,ja.data.vd||50);console.debug("Found nb results = "+Ja.size(),Ja); +for(var Qb=[],lb=0;lb=Ya.length&&(Ya.length=a+1),Ya[a]=b=cc.get(a));return b}var Da=[],Za=0;function X(a){this.ra=a;this.m=a-24;this.Yc=function(b){E[this.m+4>> +2]=b};this.T=function(){return E[this.m+4>>2]};this.Ec=function(b){E[this.m+8>>2]=b};this.rc=function(){return E[this.m+8>>2]};this.Oc=function(){v[this.m>>2]=0};this.ob=function(b){M[this.m+12>>0]=b?1:0};this.wc=function(){return 0!=M[this.m+12>>0]};this.Ja=function(b){M[this.m+13>>0]=b?1:0};this.Hb=function(){return 0!=M[this.m+13>>0]};this.Y=function(b,c){this.ja(0);this.Yc(b);this.Ec(c);this.Oc();this.ob(!1);this.Ja(!1)};this.Lb=function(){v[this.m>>2]+=1};this.Mc=function(){var b=v[this.m>>2]; +v[this.m>>2]=b-1;return 1===b};this.ja=function(b){E[this.m+16>>2]=b};this.vc=function(){return E[this.m+16>>2]};this.xc=function(){if(hc(this.T()))return E[this.ra>>2];var b=this.vc();return 0!==b?b:this.ra}}function ic(a){return U((new X(a)).m)}function jc(a){if(a.Mc()&&!a.Hb()){var b=a.rc();b&&C(b)(a.ra);ic(a.ra)}}var ea=0;function kc(){var a=Da.pop();a||Q("no exception to throw");var b=a.ra;a.Hb()||(Da.push(a),a.Ja(!0),a.ob(!1),Za++);ea=b;throw b;}var y={$a:a=>"/"===a.charAt(0),Rc:a=>/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1), +gb:(a,b)=>{for(var c=0,d=a.length-1;0<=d;d--){var f=a[d];"."===f?a.splice(d,1):".."===f?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c;c--)a.unshift("..");return a},normalize:a=>{var b=y.$a(a),c="/"===a.substr(-1);(a=y.gb(a.split("/").filter(d=>!!d),!b).join("/"))||b||(a=".");a&&c&&(a+="/");return(b?"/":"")+a},dirname:a=>{var b=y.Rc(a);a=b[0];b=b[1];if(!a&&!b)return".";b&&(b=b.substr(0,b.length-1));return a+b},basename:a=>{if("/"===a)return"/";a=y.normalize(a);a=a.replace(/\/$/,"");var b= +a.lastIndexOf("/");return-1===b?a:a.substr(b+1)},join:function(){var a=Array.prototype.slice.call(arguments,0);return y.normalize(a.join("/"))},aa:(a,b)=>y.normalize(a+"/"+b)};function Wc(){if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues){var a=new Uint8Array(1);return function(){crypto.getRandomValues(a);return a[0]}}if(ya)try{var b=require("crypto");return function(){return b.randomBytes(1)[0]}}catch(c){}return function(){Q("randomDevice")}}var Y={resolve:function(){for(var a= +"",b=!1,c=arguments.length-1;-1<=c&&!b;c--){b=0<=c?arguments[c]:e.cwd();if("string"!=typeof b)throw new TypeError("Arguments to path.resolve must be strings");if(!b)return"";a=b+"/"+a;b=y.$a(b)}a=y.gb(a.split("/").filter(d=>!!d),!b).join("/");return(b?"/":"")+a||"."},relative:(a,b)=>{function c(h){for(var l=0;lp?[]:h.slice(l,p-l+1)}a=Y.resolve(a).substr(1);b=Y.resolve(b).substr(1);a=c(a.split("/"));b=c(b.split("/"));for(var d= +Math.min(a.length,b.length),f=d,g=0;g=b||(b=Math.max(b,c*(1048576>c?2:1.125)>>>0),0!=c&&(b=Math.max(b,256)),c=a.j,a.j=new Uint8Array(b),0=a.node.u)return 0;a=Math.min(a.node.u-f,d);if(8b)throw new e.g(28);return b},qa:function(a,b,c){w.Cb(a.node,b+c);a.node.u=Math.max(a.node.u,b+c)},la:function(a,b,c,d,f){if(!e.isFile(a.node.mode))throw new e.g(43);a=a.node.j;if(f&2||a.buffer!== +ua){if(0=a.node.size)return 0;a=a.node.j.slice(f,f+d);d=H.kb.readAsArrayBuffer(a);b.set(new Uint8Array(d),c);return a.size},write:function(){throw new e.g(29);},J:function(a,b,c){1===c?b+=a.position:2===c&&e.isFile(a.node.mode)&&(b+=a.node.size);if(0>b)throw new e.g(28);return b}}},e={root:null,wa:[], +Ab:{},streams:[],Cc:1,O:null,yb:"/",Za:!1,Mb:!0,g:null,Va:{},mc:null,La:0,s:(a,b={})=>{a=Y.resolve(e.cwd(),a);if(!a)return{path:"",node:null};b=Object.assign({Ua:!0,lb:0},b);if(8!!h),!1);for(var c=e.root,d="/",f=0;f{for(var b;;){if(e.Fa(a))return a=a.v.Ob,b?"/"!==a[a.length-1]?a+"/"+b:a+b:a;b=b?a.name+"/"+b:a.name;a=a.parent}},Ya:(a,b)=>{for(var c=0,d=0;d>>0)%e.O.length},Jb:a=>{var b=e.Ya(a.parent.id,a.name);a.da=e.O[b];e.O[b]=a},Kb:a=>{var b=e.Ya(a.parent.id,a.name);if(e.O[b]===a)e.O[b]=a.da;else for(b=e.O[b];b;){if(b.da===a){b.da=a.da;break}b=b.da}},U:(a,b)=>{var c=e.yc(a);if(c)throw new e.g(c,a);for(c= +e.O[e.Ya(a.id,b)];c;c=c.da){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return e.lookup(a,b)},createNode:(a,b,c,d)=>{a=new e.Tb(a,b,c,d);e.Jb(a);return a},Ta:a=>{e.Kb(a)},Fa:a=>a===a.parent,$:a=>!!a.va,isFile:a=>32768===(a&61440),D:a=>16384===(a&61440),ua:a=>40960===(a&61440),Ca:a=>8192===(a&61440),tc:a=>24576===(a&61440),isFIFO:a=>4096===(a&61440),isSocket:a=>49152===(a&49152),nc:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},Bc:a=>{var b=e.nc[a];if("undefined"==typeof b)throw Error("Unknown file open mode: "+ +a);return b},Db:a=>{var b=["r","w","rw"][a&3];a&512&&(b+="w");return b},ea:(a,b)=>{if(e.Mb)return 0;if(!b.includes("r")||a.mode&292){if(b.includes("w")&&!(a.mode&146)||b.includes("x")&&!(a.mode&73))return 2}else return 2;return 0},yc:a=>{var b=e.ea(a,"x");return b?b:a.i.lookup?0:2},fb:(a,b)=>{try{return e.U(a,b),20}catch(c){}return e.ea(a,"wx")},Ha:(a,b,c)=>{try{var d=e.U(a,b)}catch(f){return f.A}if(a=e.ea(a,"wx"))return a;if(c){if(!e.D(d.mode))return 54;if(e.Fa(d)||e.M(d)===e.cwd())return 10}else if(e.D(d.mode))return 31; +return 0},zc:(a,b)=>a?e.ua(a.mode)?32:e.D(a.mode)&&("r"!==e.Db(b)||b&512)?31:e.ea(a,e.Db(b)):44,Ub:4096,Dc:(a=0,b=e.Ub)=>{for(;a<=b;a++)if(!e.streams[a])return a;throw new e.g(33);},W:a=>e.streams[a],xb:(a,b,c)=>{e.Pa||(e.Pa=function(){this.Ka={}},e.Pa.prototype={object:{get:function(){return this.node},set:function(d){this.node=d}},flags:{get:function(){return this.Ka.flags},set:function(d){this.Ka.flags=d}},position:{get hd(){return this.Ka.position},set:function(d){this.Ka.position=d}}});a=Object.assign(new e.Pa, +a);b=e.Dc(b,c);a.fd=b;return e.streams[b]=a},$b:a=>{e.streams[a]=null},Zb:{open:a=>{a.l=e.pc(a.node.rdev).l;a.l.open&&a.l.open(a)},J:()=>{throw new e.g(70);}},eb:a=>a>>8,rd:a=>a&255,ba:(a,b)=>a<<8|b,nb:(a,b)=>{e.Ab[a]={l:b}},pc:a=>e.Ab[a],Fb:a=>{var b=[];for(a=[a];a.length;){var c=a.pop();b.push(c);a.push.apply(a,c.wa)}return b},Rb:(a,b)=>{function c(h){e.La--;return b(h)}function d(h){if(h){if(!d.lc)return d.lc=!0,c(h)}else++g>=f.length&&c(null)}"function"==typeof a&&(b=a,a=!1);e.La++;1{if(!h.type.Rb)return d(null);h.type.Rb(h,a,d)})},v:(a,b,c)=>{var d="/"===c,f=!c;if(d&&e.root)throw new e.g(10);if(!d&&!f){var g=e.s(c,{Ua:!1});c=g.path;g=g.node;if(e.$(g))throw new e.g(10);if(!e.D(g.mode))throw new e.g(54);}b={type:a,hb:b,Ob:c,wa:[]};a=a.v(b);a.v=b;b.root=a;d?e.root=a:g&&(g.va=b,g.v&&g.v.wa.push(b));return a},Bd:a=>{a=e.s(a,{Ua:!1});if(!e.$(a.node))throw new e.g(28); +a=a.node;var b=a.va,c=e.Fb(b);Object.keys(e.O).forEach(d=>{for(d=e.O[d];d;){var f=d.da;c.includes(d.v)&&e.Ta(d);d=f}});a.va=null;a.v.wa.splice(a.v.wa.indexOf(b),1)},lookup:(a,b)=>a.i.lookup(a,b),N:(a,b,c)=>{var d=e.s(a,{parent:!0}).node;a=y.basename(a);if(!a||"."===a||".."===a)throw new e.g(28);var f=e.fb(d,a);if(f)throw new e.g(f);if(!d.i.N)throw new e.g(63);return d.i.N(d,a,b,c)},create:(a,b)=>e.N(a,(void 0!==b?b:438)&4095|32768,0),mkdir:(a,b)=>e.N(a,(void 0!==b?b:511)&1023|16384,0),sd:(a,b)=>{a= +a.split("/");for(var c="",d=0;d{"undefined"==typeof c&&(c=b,b=438);return e.N(a,b|8192,c)},symlink:(a,b)=>{if(!Y.resolve(a))throw new e.g(44);var c=e.s(b,{parent:!0}).node;if(!c)throw new e.g(44);b=y.basename(b);var d=e.fb(c,b);if(d)throw new e.g(d);if(!c.i.symlink)throw new e.g(63);return c.i.symlink(c,b,a)},rename:(a,b)=>{var c=y.dirname(a),d=y.dirname(b),f=y.basename(a),g=y.basename(b);var h=e.s(a,{parent:!0}); +var l=h.node;h=e.s(b,{parent:!0});h=h.node;if(!l||!h)throw new e.g(44);if(l.v!==h.v)throw new e.g(75);var p=e.U(l,f);a=Y.relative(a,d);if("."!==a.charAt(0))throw new e.g(28);a=Y.relative(b,c);if("."!==a.charAt(0))throw new e.g(55);try{var n=e.U(h,g)}catch(q){}if(p!==n){b=e.D(p.mode);if(f=e.Ha(l,f,b))throw new e.g(f);if(f=n?e.Ha(h,g,b):e.fb(h,g))throw new e.g(f);if(!l.i.rename)throw new e.g(63);if(e.$(p)||n&&e.$(n))throw new e.g(10);if(h!==l&&(f=e.ea(l,"w")))throw new e.g(f);e.Kb(p);try{l.i.rename(p, +h,g)}catch(q){throw q;}finally{e.Jb(p)}}},rmdir:a=>{var b=e.s(a,{parent:!0}).node;a=y.basename(a);var c=e.U(b,a),d=e.Ha(b,a,!0);if(d)throw new e.g(d);if(!b.i.rmdir)throw new e.g(63);if(e.$(c))throw new e.g(10);b.i.rmdir(b,a);e.Ta(c)},readdir:a=>{a=e.s(a,{H:!0}).node;if(!a.i.readdir)throw new e.g(54);return a.i.readdir(a)},unlink:a=>{var b=e.s(a,{parent:!0}).node;if(!b)throw new e.g(44);a=y.basename(a);var c=e.U(b,a),d=e.Ha(b,a,!1);if(d)throw new e.g(d);if(!b.i.unlink)throw new e.g(63);if(e.$(c))throw new e.g(10); +b.i.unlink(b,a);e.Ta(c)},readlink:a=>{a=e.s(a).node;if(!a)throw new e.g(44);if(!a.i.readlink)throw new e.g(28);return Y.resolve(e.M(a.parent),a.i.readlink(a))},stat:(a,b)=>{a=e.s(a,{H:!b}).node;if(!a)throw new e.g(44);if(!a.i.I)throw new e.g(63);return a.i.I(a)},lstat:a=>e.stat(a,!0),chmod:(a,b,c)=>{a="string"==typeof a?e.s(a,{H:!c}).node:a;if(!a.i.C)throw new e.g(63);a.i.C(a,{mode:b&4095|a.mode&-4096,timestamp:Date.now()})},lchmod:(a,b)=>{e.chmod(a,b,!0)},fchmod:(a,b)=>{a=e.W(a);if(!a)throw new e.g(8); +e.chmod(a.node,b)},chown:(a,b,c,d)=>{a="string"==typeof a?e.s(a,{H:!d}).node:a;if(!a.i.C)throw new e.g(63);a.i.C(a,{timestamp:Date.now()})},lchown:(a,b,c)=>{e.chown(a,b,c,!0)},fchown:(a,b,c)=>{a=e.W(a);if(!a)throw new e.g(8);e.chown(a.node,b,c)},truncate:(a,b)=>{if(0>b)throw new e.g(28);a="string"==typeof a?e.s(a,{H:!0}).node:a;if(!a.i.C)throw new e.g(63);if(e.D(a.mode))throw new e.g(31);if(!e.isFile(a.mode))throw new e.g(28);var c=e.ea(a,"w");if(c)throw new e.g(c);a.i.C(a,{size:b,timestamp:Date.now()})}, +ed:(a,b)=>{a=e.W(a);if(!a)throw new e.g(8);if(0===(a.flags&2097155))throw new e.g(28);e.truncate(a.node,b)},Cd:(a,b,c)=>{a=e.s(a,{H:!0}).node;a.i.C(a,{timestamp:Math.max(b,c)})},open:(a,b,c)=>{if(""===a)throw new e.g(44);b="string"==typeof b?e.Bc(b):b;c=b&64?("undefined"==typeof c?438:c)&4095|32768:0;if("object"==typeof a)var d=a;else{a=y.normalize(a);try{d=e.s(a,{H:!(b&131072)}).node}catch(g){}}var f=!1;if(b&64)if(d){if(b&128)throw new e.g(20);}else d=e.N(a,c,0),f=!0;if(!d)throw new e.g(44);e.Ca(d.mode)&& +(b&=-513);if(b&65536&&!e.D(d.mode))throw new e.g(54);if(!f&&(c=e.zc(d,b)))throw new e.g(c);b&512&&!f&&e.truncate(d,0);b&=-131713;d=e.xb({node:d,path:e.M(d),flags:b,seekable:!0,position:0,l:d.l,Zc:[],error:!1});d.l.open&&d.l.open(d);!k.logReadFiles||b&1||(e.jb||(e.jb={}),a in e.jb||(e.jb[a]=1));return d},close:a=>{if(e.ta(a))throw new e.g(8);a.Xa&&(a.Xa=null);try{a.l.close&&a.l.close(a)}catch(b){throw b;}finally{e.$b(a.fd)}a.fd=null},ta:a=>null===a.fd,J:(a,b,c)=>{if(e.ta(a))throw new e.g(8);if(!a.seekable|| +!a.l.J)throw new e.g(70);if(0!=c&&1!=c&&2!=c)throw new e.g(28);a.position=a.l.J(a,b,c);a.Zc=[];return a.position},read:(a,b,c,d,f)=>{if(0>d||0>f)throw new e.g(28);if(e.ta(a))throw new e.g(8);if(1===(a.flags&2097155))throw new e.g(8);if(e.D(a.node.mode))throw new e.g(31);if(!a.l.read)throw new e.g(28);var g="undefined"!=typeof f;if(!g)f=a.position;else if(!a.seekable)throw new e.g(70);b=a.l.read(a,b,c,d,f);g||(a.position+=b);return b},write:(a,b,c,d,f,g)=>{if(0>d||0>f)throw new e.g(28);if(e.ta(a))throw new e.g(8); +if(0===(a.flags&2097155))throw new e.g(8);if(e.D(a.node.mode))throw new e.g(31);if(!a.l.write)throw new e.g(28);a.seekable&&a.flags&1024&&e.J(a,0,2);var h="undefined"!=typeof f;if(!h)f=a.position;else if(!a.seekable)throw new e.g(70);b=a.l.write(a,b,c,d,f,g);h||(a.position+=b);return b},qa:(a,b,c)=>{if(e.ta(a))throw new e.g(8);if(0>b||0>=c)throw new e.g(28);if(0===(a.flags&2097155))throw new e.g(8);if(!e.isFile(a.node.mode)&&!e.D(a.node.mode))throw new e.g(43);if(!a.l.qa)throw new e.g(138);a.l.qa(a, +b,c)},la:(a,b,c,d,f)=>{if(0!==(d&2)&&0===(f&2)&&2!==(a.flags&2097155))throw new e.g(2);if(1===(a.flags&2097155))throw new e.g(2);if(!a.l.la)throw new e.g(43);return a.l.la(a,b,c,d,f)},ma:(a,b,c,d,f)=>a&&a.l.ma?a.l.ma(a,b,c,d,f):0,td:()=>0,Nb:(a,b,c)=>{if(!a.l.Nb)throw new e.g(59);return a.l.Nb(a,b,c)},readFile:(a,b={})=>{b.flags=b.flags||0;b.encoding=b.encoding||"binary";if("utf8"!==b.encoding&&"binary"!==b.encoding)throw Error('Invalid encoding type "'+b.encoding+'"');var c,d=e.open(a,b.flags);a= +e.stat(a).size;var f=new Uint8Array(a);e.read(d,f,0,a,0);"utf8"===b.encoding?c=ta(f,0):"binary"===b.encoding&&(c=f);e.close(d);return c},writeFile:(a,b,c={})=>{c.flags=c.flags||577;a=e.open(a,c.flags,c.mode);if("string"==typeof b){var d=new Uint8Array(Ua(b)+1);b=Ta(b,d,0,d.length);e.write(a,d,0,b,void 0,c.Yb)}else if(ArrayBuffer.isView(b))e.write(a,b,0,b.byteLength,void 0,c.Yb);else throw Error("Unsupported data type");e.close(a)},cwd:()=>e.yb,chdir:a=>{a=e.s(a,{H:!0});if(null===a.node)throw new e.g(44); +if(!e.D(a.node.mode))throw new e.g(54);var b=e.ea(a.node,"x");if(b)throw new e.g(b);e.yb=a.path},cc:()=>{e.mkdir("/tmp");e.mkdir("/home");e.mkdir("/home/web_user")},bc:()=>{e.mkdir("/dev");e.nb(e.ba(1,3),{read:()=>0,write:(b,c,d,f)=>f});e.Ia("/dev/null",e.ba(1,3));fa.register(e.ba(5,0),fa.ic);fa.register(e.ba(6,0),fa.hc);e.Ia("/dev/tty",e.ba(5,0));e.Ia("/dev/tty1",e.ba(6,0));var a=Wc();e.V("/dev","random",a);e.V("/dev","urandom",a);e.mkdir("/dev/shm");e.mkdir("/dev/shm/tmp")},ec:()=>{e.mkdir("/proc"); +var a=e.mkdir("/proc/self");e.mkdir("/proc/self/fd");e.v({v:()=>{var b=e.createNode(a,"fd",16895,73);b.i={lookup:(c,d)=>{var f=e.W(+d);if(!f)throw new e.g(8);c={parent:null,v:{Ob:"fake"},i:{readlink:()=>f.path}};return c.parent=c}};return b}},{},"/proc/self/fd")},fc:()=>{k.stdin?e.V("/dev","stdin",k.stdin):e.symlink("/dev/tty","/dev/stdin");k.stdout?e.V("/dev","stdout",null,k.stdout):e.symlink("/dev/tty","/dev/stdout");k.stderr?e.V("/dev","stderr",null,k.stderr):e.symlink("/dev/tty1","/dev/stderr"); +e.open("/dev/stdin",0);e.open("/dev/stdout",1);e.open("/dev/stderr",1)},Bb:()=>{e.g||(e.g=function(a,b){this.node=b;this.Pc=function(c){this.A=c};this.Pc(a);this.message="FS error"},e.g.prototype=Error(),e.g.prototype.constructor=e.g,[44].forEach(a=>{e.Va[a]=new e.g(a);e.Va[a].stack=""}))},Sc:()=>{e.Bb();e.O=Array(4096);e.v(w,{},"/");e.cc();e.bc();e.ec();e.mc={MEMFS:w,WORKERFS:H}},Y:(a,b,c)=>{e.Y.Za=!0;e.Bb();k.stdin=a||k.stdin;k.stdout=b||k.stdout;k.stderr=c||k.stderr;e.fc()}, +wd:()=>{e.Y.Za=!1;for(var a=0;a{var c=0;a&&(c|=365);b&&(c|=146);return c},dd:(a,b)=>{a=e.Qa(a,b);return a.exists?a.object:null},Qa:(a,b)=>{try{var c=e.s(a,{H:!b});a=c.path}catch(f){}var d={Fa:!1,exists:!1,error:0,name:null,path:null,object:null,Fc:!1,Hc:null,Gc:null};try{c=e.s(a,{parent:!0}),d.Fc=!0,d.Hc=c.path,d.Gc=c.node,d.name=y.basename(a),c=e.s(a,{H:!b}),d.exists=!0,d.path=c.path,d.object=c.node,d.name=c.node.name,d.Fa="/"=== +c.path}catch(f){d.error=f.A}return d},bd:(a,b)=>{a="string"==typeof a?a:e.M(a);for(b=b.split("/").reverse();b.length;){var c=b.pop();if(c){var d=y.aa(a,c);try{e.mkdir(d)}catch(f){}a=d}}return d},dc:(a,b,c,d,f)=>{a=y.aa("string"==typeof a?a:e.M(a),b);return e.create(a,e.Wa(d,f))},wb:(a,b,c,d,f,g)=>{var h=b;a&&(a="string"==typeof a?a:e.M(a),h=b?y.aa(a,b):a);a=e.Wa(d,f);h=e.create(h,a);if(c){if("string"==typeof c){b=Array(c.length);d=0;for(f=c.length;d{a=y.aa("string"==typeof a?a:e.M(a),b);b=e.Wa(!!c,!!d);e.V.eb||(e.V.eb=64);var f=e.ba(e.V.eb++,0);e.nb(f,{open:g=>{g.seekable=!1},close:()=>{d&&d.buffer&&d.buffer.length&&d(10)},read:(g,h,l,p)=>{for(var n=0,q=0;q{for(var n= +0;n{if(a.ab||a.uc||a.link||a.j)return!0;if("undefined"!=typeof XMLHttpRequest)throw 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.");if(Pa)try{a.j=$a(Pa(a.url),!0),a.u=a.j.length}catch(b){throw new e.g(29);}else throw Error("Cannot load without read() or XMLHttpRequest."); +},ad:(a,b,c,d,f)=>{function g(){this.cb=!1;this.T=[]}g.prototype.get=function(n){if(!(n>this.length-1||0>n)){var q=n%this.chunkSize;return this.Ib(n/this.chunkSize|0)[q]}};g.prototype.ja=function(n){this.Ib=n};g.prototype.ub=function(){var n=new XMLHttpRequest;n.open("HEAD",c,!1);n.send(null);if(!(200<=n.status&&300>n.status||304===n.status))throw Error("Couldn't load "+c+". Status: "+n.status);var q=Number(n.getResponseHeader("Content-length")),t,u=(t=n.getResponseHeader("Accept-Ranges"))&&"bytes"=== +t;n=(t=n.getResponseHeader("Content-Encoding"))&&"gzip"===t;var m=1048576;u||(m=q);var r=this;r.ja(x=>{var B=x*m,I=(x+1)*m-1;I=Math.min(I,q-1);if("undefined"==typeof r.T[x]){var ha=r.T;if(B>I)throw Error("invalid range ("+B+", "+I+") or no bytes requested!");if(I>q-1)throw Error("only "+q+" bytes available! programmer error!");var L=new XMLHttpRequest;L.open("GET",c,!1);q!==m&&L.setRequestHeader("Range","bytes="+B+"-"+I);L.responseType="arraybuffer";L.overrideMimeType&&L.overrideMimeType("text/plain; charset=x-user-defined"); +L.send(null);if(!(200<=L.status&&300>L.status||304===L.status))throw Error("Couldn't load "+c+". Status: "+L.status);B=void 0!==L.response?new Uint8Array(L.response||[]):$a(L.responseText||"",!0);ha[x]=B}if("undefined"==typeof r.T[x])throw Error("doXHR failed!");return r.T[x]});if(n||!q)m=q=1,m=q=this.Ib(0).length,Aa("LazyFiles on gzip forces download of the whole file when length is accessed");this.Wb=q;this.Vb=m;this.cb=!0};if("undefined"!=typeof XMLHttpRequest){if(!ba)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"; +var h=new g;Object.defineProperties(h,{length:{get:function(){this.cb||this.ub();return this.Wb}},chunkSize:{get:function(){this.cb||this.ub();return this.Vb}}});h={ab:!1,j:h}}else h={ab:!1,url:c};var l=e.dc(a,b,h,d,f);h.j?l.j=h.j:h.url&&(l.j=null,l.url=h.url);Object.defineProperties(l,{u:{get:function(){return this.j.length}}});var p={};Object.keys(l.l).forEach(n=>{var q=l.l[n];p[n]=function(){e.Eb(l);return q.apply(null,arguments)}});p.read=(n,q,t,u,m)=>{e.Eb(l);n=n.node.j;if(m>=n.length)return 0; +u=Math.min(n.length-m,u);if(n.slice)for(var r=0;r{function q(m){function r(x){n&&n();l||e.wb(a,b,x,d,f,p);g&&g();Ca(u)}Yc.nd(m,t,r,()=>{h&&h();Ca(u)})||r(m)}var t=b?Y.resolve(y.aa(a,b)):a,u="cp "+t;Wa(u);"string"==typeof c?Xc(c,m=>q(m),h):q(c)},indexedDB:()=>window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB,rb:()=>"EM_FS_"+window.location.pathname,sb:20,oa:"FILE_DATA", +yd:(a,b,c)=>{b=b||(()=>{});c=c||(()=>{});var d=e.indexedDB();try{var f=d.open(e.rb(),e.sb)}catch(g){return c(g)}f.onupgradeneeded=()=>{Aa("creating db");f.result.createObjectStore(e.oa)};f.onsuccess=()=>{var g=f.result.transaction([e.oa],"readwrite"),h=g.objectStore(e.oa),l=0,p=0,n=a.length;a.forEach(q=>{q=h.put(e.Qa(q).object.j,q);q.onsuccess=()=>{l++;l+p==n&&(0==p?b():c())};q.onerror=()=>{p++;l+p==n&&(0==p?b():c())}});g.onerror=c};f.onerror=c},qd:(a,b,c)=>{b=b||(()=>{});c=c||(()=>{});var d=e.indexedDB(); +try{var f=d.open(e.rb(),e.sb)}catch(g){return c(g)}f.onupgradeneeded=c;f.onsuccess=()=>{var g=f.result;try{var h=g.transaction([e.oa],"readonly")}catch(t){c(t);return}var l=h.objectStore(e.oa),p=0,n=0,q=a.length;a.forEach(t=>{var u=l.get(t);u.onsuccess=()=>{e.Qa(t).exists&&e.unlink(t);e.wb(y.dirname(t),y.basename(t),u.result,!0,!0,!0);p++;p+n==q&&(0==n?b():c())};u.onerror=()=>{n++;p+n==q&&(0==n?b():c())}});h.onerror=c};f.onerror=c}},A={$c:5,Sa:function(a,b,c){if(y.$a(b))return b;if(-100===a)a=e.cwd(); +else{a=e.W(a);if(!a)throw new e.g(8);a=a.path}if(0==b.length){if(!c)throw new e.g(44);return a}return y.aa(a,b)},Ba:function(a,b,c){try{var d=a(b)}catch(f){if(f&&f.node&&y.normalize(b)!==y.normalize(e.M(f.node)))return-54;throw f;}v[c>>2]=d.dev;v[c+4>>2]=0;v[c+8>>2]=d.ino;v[c+12>>2]=d.mode;v[c+16>>2]=d.nlink;v[c+20>>2]=d.uid;v[c+24>>2]=d.gid;v[c+28>>2]=d.rdev;v[c+32>>2]=0;W=[d.size>>>0,(J=d.size,1<=+Math.abs(J)?0>>0:~~+Math.ceil((J-+(~~J>>>0))/ +4294967296)>>>0:0)];v[c+40>>2]=W[0];v[c+44>>2]=W[1];v[c+48>>2]=4096;v[c+52>>2]=d.blocks;v[c+56>>2]=d.atime.getTime()/1E3|0;v[c+60>>2]=0;v[c+64>>2]=d.mtime.getTime()/1E3|0;v[c+68>>2]=0;v[c+72>>2]=d.ctime.getTime()/1E3|0;v[c+76>>2]=0;W=[d.ino>>>0,(J=d.ino,1<=+Math.abs(J)?0>>0:~~+Math.ceil((J-+(~~J>>>0))/4294967296)>>>0:0)];v[c+80>>2]=W[0];v[c+84>>2]=W[1];return 0},jc:function(a,b,c,d,f){a=K.slice(a,a+c);e.ma(b,a,f,c,d)},za:void 0,get:function(){A.za+= +4;return v[A.za-4>>2]},sa:function(a){return na(a)},X:function(a){a=e.W(a);if(!a)throw new e.g(8);return a}};function sb(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+a);}}var mc=void 0;function P(a){for(var b="";K[a];)b+=mc[K[a++]];return b}var va={},qa={},ab={};function tb(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}function ub(a,b){a=tb(a);return(new Function("body", +"return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function vb(a,b){var c=ub(b,function(d){this.name=b;this.message=d;d=Error(d).stack;void 0!==d&&(this.stack=this.toString()+"\n"+d.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(a.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c}var wa=void 0;function z(a){throw new wa(a);}var nc=void 0;function bb(a){throw new nc(a); +}function xa(a,b,c){function d(l){l=c(l);l.length!==a.length&&bb("Mismatched type converter count");for(var p=0;p{qa.hasOwnProperty(l)?f[p]=qa[l]:(g.push(l),va.hasOwnProperty(l)||(va[l]=[]),va[l].push(()=>{f[p]=qa[l];++h;h===g.length&&d(f)}))});0===g.length&&d(f)}function Z(a,b,c={}){if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");var d= +b.name;a||z('type "'+d+'" must have a positive integer typeid pointer');if(qa.hasOwnProperty(a)){if(c.sc)return;z("Cannot register type '"+d+"' twice")}qa[a]=b;delete ab[a];va.hasOwnProperty(a)&&(b=va[a],delete va[a],b.forEach(f=>f()))}function wb(a){z(a.h.B.o.name+" instance already deleted")}var xb=!1;function oc(){}function pc(a){--a.count.value;0===a.count.value&&(a.G?a.K.fa(a.G):a.B.o.fa(a.m))}function qc(a,b,c){if(b===c)return a;if(void 0===c.L)return null;a=qc(a,b,c.L);return null===a?null: +c.kc(a)}var rc={},Ea=[];function yb(){for(;Ea.length;){var a=Ea.pop();a.h.ia=!1;a["delete"]()}}var Fa=void 0,Ga={};function Zc(a,b){for(void 0===b&&z("ptr should not be undefined");a.L;)b=a.ya(b),a=a.L;return Ga[b]}function cb(a,b){b.B&&b.m||bb("makeClassHandle requires ptr and ptrType");!!b.K!==!!b.G&&bb("Both smartPtrType and smartPtr must be specified");b.count={value:1};return Ha(Object.create(a,{h:{value:b}}))}function Ha(a){if("undefined"===typeof FinalizationRegistry)return Ha=b=>b,a;xb=new FinalizationRegistry(b=> +{pc(b.h)});Ha=b=>{var c=b.h;c.G&&xb.register(b,{h:c},b);return b};oc=b=>xb.unregister(b);return Ha(a)}function ia(){}function sc(a,b,c){if(void 0===a[b].F){var d=a[b];a[b]=function(){a[b].F.hasOwnProperty(arguments.length)||z("Function '"+c+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+a[b].F+")!");return a[b].F[arguments.length].apply(this,arguments)};a[b].F=[];a[b].F[d.Aa]=d}}function tc(a,b,c){k.hasOwnProperty(a)?((void 0===c||void 0!==k[a].F&&void 0!== +k[a].F[c])&&z("Cannot register public name '"+a+"' twice"),sc(k,a,a),k.hasOwnProperty(c)&&z("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),k[a].F[c]=b):(k[a]=b,void 0!==c&&(k[a].ud=c))}function $c(a,b,c,d,f,g,h,l){this.name=a;this.constructor=b;this.ka=c;this.fa=d;this.L=f;this.oc=g;this.ya=h;this.kc=l;this.Jc=[]}function zb(a,b,c){for(;b!==c;)b.ya||z("Expected null or instance of "+c.name+", got an instance of "+b.name),a=b.ya(a),b=b.L;return a}function ad(a, +b){if(null===b)return this.bb&&z("null is not a valid "+this.name),0;b.h||z('Cannot pass "'+Ab(b)+'" as a '+this.name);b.h.m||z("Cannot pass deleted object as a pointer of type "+this.name);return zb(b.h.m,b.h.B.o,this.o)}function bd(a,b){if(null===b){this.bb&&z("null is not a valid "+this.name);if(this.Ga){var c=this.Kc();null!==a&&a.push(this.fa,c);return c}return 0}b.h||z('Cannot pass "'+Ab(b)+'" as a '+this.name);b.h.m||z("Cannot pass deleted object as a pointer of type "+this.name);!this.Da&& +b.h.B.Da&&z("Cannot convert argument of type "+(b.h.K?b.h.K.name:b.h.B.name)+" to parameter type "+this.name);c=zb(b.h.m,b.h.B.o,this.o);if(this.Ga)switch(void 0===b.h.G&&z("Passing raw pointer to smart pointer is illegal"),this.Qc){case 0:b.h.K===this?c=b.h.G:z("Cannot convert argument of type "+(b.h.K?b.h.K.name:b.h.B.name)+" to parameter type "+this.name);break;case 1:c=b.h.G;break;case 2:if(b.h.K===this)c=b.h.G;else{var d=b.clone();c=this.Lc(c,db.qb(function(){d["delete"]()}));null!==a&&a.push(this.fa, +c)}break;default:z("Unsupporting sharing policy")}return c}function cd(a,b){if(null===b)return this.bb&&z("null is not a valid "+this.name),0;b.h||z('Cannot pass "'+Ab(b)+'" as a '+this.name);b.h.m||z("Cannot pass deleted object as a pointer of type "+this.name);b.h.B.Da&&z("Cannot convert argument of type "+b.h.B.name+" to parameter type "+this.name);return zb(b.h.m,b.h.B.o,this.o)}function eb(a){return this.fromWireType(E[a>>2])}function aa(a,b,c,d,f,g,h,l,p,n,q){this.name=a;this.o=b;this.bb=c; +this.Da=d;this.Ga=f;this.Ic=g;this.Qc=h;this.Pb=l;this.Kc=p;this.Lc=n;this.fa=q;f||void 0!==b.L?this.toWireType=bd:(this.toWireType=d?ad:cd,this.S=null)}function uc(a,b,c){k.hasOwnProperty(a)||bb("Replacing nonexistant public symbol");void 0!==k[a].F&&void 0!==c?k[a].F[c]=b:(k[a]=b,k[a].Aa=c)}function dd(a,b){var c=[];return function(){c.length=0;Object.assign(c,arguments);if(a.includes("j")){var d=k["dynCall_"+a];d=c&&c.length?d.apply(null,[b].concat(c)):d.call(null,b)}else d=C(b).apply(null,c); +return d}}function ra(a,b){a=P(a);var c=a.includes("j")?dd(a,b):C(b);"function"!=typeof c&&z("unknown function pointer with signature "+a+": "+b);return c}var vc=void 0;function wc(a){a=xc(a);var b=P(a);U(a);return b}function fb(a,b){function c(g){f[g]||qa[g]||(ab[g]?ab[g].forEach(c):(d.push(g),f[g]=!0))}var d=[],f={};b.forEach(c);throw new vc(a+": "+d.map(wc).join([", "]));}function Bb(a,b){for(var c=[],d=0;d>2)+d]);return c}function ed(a){for(;a.length;){var b=a.pop();a.pop()(b)}} +function fd(a,b){if(!(a instanceof Function))throw new TypeError("new_ called with constructor type "+typeof a+" which is not a function");var c=ub(a.name||"unknownFunctionName",function(){});c.prototype=a.prototype;c=new c;a=a.apply(c,b);return a instanceof Object?a:c}function Cb(a,b,c,d,f){var g=b.length;2>g&&z("argTypes array size mismatch! Must at least get return value and 'this' types!");var h=null!==b[1]&&null!==c,l=!1;for(c=1;c{a||z("Cannot use deleted val. handle = "+a);return R[a].value},qb:a=>{switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=Db.length?Db.pop():R.length;R[b]={mb:1,value:a};return b}}};function Ab(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"=== +b||"function"===b?a.toString():""+a}function gd(a,b){switch(b){case 2:return function(c){return this.fromWireType(Zb[c>>2])};case 3:return function(c){return this.fromWireType($b[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function hd(a,b,c){switch(b){case 0:return c?function(d){return M[d]}:function(d){return K[d]};case 1:return c?function(d){return oa[d>>1]}:function(d){return Va[d>>1]};case 2:return c?function(d){return v[d>>2]}:function(d){return E[d>>2]};default:throw new TypeError("Unknown integer type: "+ +a);}}var Eb={};function Ia(){if(!Ia.Qb){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:La||"./this.program"},b;for(b in Eb)void 0===Eb[b]?delete a[b]:a[b]=Eb[b];var c=[];for(b in a)c.push(b+"="+a[b]);Ia.Qb=c}return Ia.Qb}function zc(a,b,c,d){for(var f=0,g=0;g>2],l=E[b+4>>2];b+=8;h=e.read(a,M,h,l,d);if(0>h)return-1;f+=h;if(h>>0<4194305-!!a?(a>>>0)+4294967296*b:NaN}function Ac(a,b,c,d){for(var f=0,g=0;g>2],l=E[b+4>>2];b+=8;h=e.write(a,M,h,l,d);if(0>h)return-1;f+=h}return f}function gb(a){return 0===a%4&&(0!==a%100||0===a%400)}var Bc=[31,29,31,30,31,30,31,31,30,31,30,31],Cc=[31,28,31,30,31,30,31,31,30,31,30,31];function jd(a,b,c,d){function f(m,r,x){for(m="number"==typeof m?m.toString():m||"";m.lengthI?-1:0x-m.getDate())r-=x-m.getDate()+1,m.setDate(1),11>B?m.setMonth(B+1):(m.setMonth(0),m.setFullYear(m.getFullYear()+1));else{m.setDate(m.getDate()+r);break}}B=new Date(m.getFullYear()+1,0,4);r=l(new Date(m.getFullYear(),0,4));B=l(B);return 0>=h(r,m)?0>=h(B,m)?m.getFullYear()+1:m.getFullYear():m.getFullYear()-1}var n=v[d+40>>2];d={Vc:v[d>>2],Uc:v[d+4>>2],Ma:v[d+8>>2],pb:v[d+12>>2], +Na:v[d+16>>2],ha:v[d+20>>2],R:v[d+24>>2],ga:v[d+28>>2],Ad:v[d+32>>2],Tc:v[d+36>>2],Wc:n?na(n):""};c=na(c);n={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var q in n)c=c.replace(new RegExp(q, +"g"),n[q]);var t="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),u="January February March April May June July August September October November December".split(" ");n={"%a":function(m){return t[m.R].substring(0,3)},"%A":function(m){return t[m.R]},"%b":function(m){return u[m.Na].substring(0,3)},"%B":function(m){return u[m.Na]},"%C":function(m){return g((m.ha+1900)/100|0,2)},"%d":function(m){return g(m.pb,2)},"%e":function(m){return f(m.pb,2," ")},"%g":function(m){return p(m).toString().substring(2)}, +"%G":function(m){return p(m)},"%H":function(m){return g(m.Ma,2)},"%I":function(m){m=m.Ma;0==m?m=12:12m.Ma?"AM":"PM"},"%S":function(m){return g(m.Vc,2)},"%t":function(){return"\t"},"%u":function(m){return m.R||7},"%U":function(m){return g(Math.floor((m.ga+ +7-m.R)/7),2)},"%V":function(m){var r=Math.floor((m.ga+7-(m.R+6)%7)/7);2>=(m.R+371-m.ga-2)%7&&r++;if(r)53==r&&(x=(m.R+371-m.ga)%7,4==x||3==x&&gb(m.ha)||(r=1));else{r=52;var x=(m.R+7-m.ga-1)%7;(4==x||5==x&&gb(m.ha%400-1))&&r++}return g(r,2)},"%w":function(m){return m.R},"%W":function(m){return g(Math.floor((m.ga+7-(m.R+6)%7)/7),2)},"%y":function(m){return(m.ha+1900).toString().substring(2)},"%Y":function(m){return m.ha+1900},"%z":function(m){m=m.Tc;var r=0<=m;m=Math.abs(m)/60;return(r?"+":"-")+String("0000"+ +(m/60*100+m%60)).slice(-4)},"%Z":function(m){return m.Wc},"%%":function(){return"%"}};c=c.replace(/%%/g,"\x00\x00");for(q in n)c.includes(q)&&(c=c.replace(new RegExp(q,"g"),n[q](d)));c=c.replace(/\0\0/g,"%");q=$a(c,!1);if(q.length>b)return 0;M.set(q,a);return q.length-1}var Dc=function(a,b,c,d){a||(a=this);this.parent=a;this.v=a.v;this.va=null;this.id=e.Cc++;this.name=b;this.mode=c;this.i={};this.l={};this.rdev=d};Object.defineProperties(Dc.prototype,{read:{get:function(){return 365===(this.mode& +365)},set:function(a){a?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146===(this.mode&146)},set:function(a){a?this.mode|=146:this.mode&=-147}},uc:{get:function(){return e.D(this.mode)}},ab:{get:function(){return e.Ca(this.mode)}}});e.Tb=Dc;e.Sc();var Yc;(function(){for(var a=Array(256),b=0;256>b;++b)a[b]=String.fromCharCode(b);mc=a})();wa=k.BindingError=vb(Error,"BindingError");nc=k.InternalError=vb(Error,"InternalError");ia.prototype.isAliasOf=function(a){if(!(this instanceof ia&& +a instanceof ia))return!1;var b=this.h.B.o,c=this.h.m,d=a.h.B.o;for(a=a.h.m;b.L;)c=b.ya(c),b=b.L;for(;d.L;)a=d.ya(a),d=d.L;return b===d&&c===a};ia.prototype.clone=function(){this.h.m||wb(this);if(this.h.xa)return this.h.count.value+=1,this;var a=Ha,b=Object,c=b.create,d=Object.getPrototypeOf(this),f=this.h;a=a(c.call(b,d,{h:{value:{count:f.count,ia:f.ia,xa:f.xa,m:f.m,B:f.B,G:f.G,K:f.K}}}));a.h.count.value+=1;a.h.ia=!1;return a};ia.prototype["delete"]=function(){this.h.m||wb(this);this.h.ia&&!this.h.xa&& +z("Object already scheduled for deletion");oc(this);pc(this.h);this.h.xa||(this.h.G=void 0,this.h.m=void 0)};ia.prototype.isDeleted=function(){return!this.h.m};ia.prototype.deleteLater=function(){this.h.m||wb(this);this.h.ia&&!this.h.xa&&z("Object already scheduled for deletion");Ea.push(this);1===Ea.length&&Fa&&Fa(yb);this.h.ia=!0;return this};k.getInheritedInstanceCount=function(){return Object.keys(Ga).length};k.getLiveInheritedInstances=function(){var a=[],b;for(b in Ga)Ga.hasOwnProperty(b)&& +a.push(Ga[b]);return a};k.flushPendingDeletes=yb;k.setDelayFunction=function(a){Fa=a;Ea.length&&Fa&&Fa(yb)};aa.prototype.qc=function(a){this.Pb&&(a=this.Pb(a));return a};aa.prototype.zb=function(a){this.fa&&this.fa(a)};aa.prototype.argPackAdvance=8;aa.prototype.readValueFromPointer=eb;aa.prototype.deleteObject=function(a){if(null!==a)a["delete"]()};aa.prototype.fromWireType=function(a){function b(){return this.Ga?cb(this.o.ka,{B:this.Ic,m:c,K:this,G:a}):cb(this.o.ka,{B:this,m:a})}var c=this.qc(a); +if(!c)return this.zb(a),null;var d=Zc(this.o,c);if(void 0!==d){if(0===d.h.count.value)return d.h.m=c,d.h.G=a,d.clone();d=d.clone();this.zb(a);return d}d=this.o.oc(c);d=rc[d];if(!d)return b.call(this);d=this.Da?d.ac:d.pointerType;var f=qc(c,this.o,d.o);return null===f?b.call(this):this.Ga?cb(d.o.ka,{B:d,m:f,K:this,G:a}):cb(d.o.ka,{B:d,m:f})};vc=k.UnboundTypeError=vb(Error,"UnboundTypeError");k.count_emval_handles=function(){for(var a=0,b=5;bf?-28:e.xb(d,f).fd;case 1:case 2:return 0;case 3:return d.flags;case 4:return f=A.get(),d.flags|= +f,0;case 5:return f=A.get(),oa[f+0>>1]=2,0;case 6:case 7:return 0;case 16:case 8:return-28;case 9:return v[Ec()>>2]=28,-1;default:return-28}}catch(g){if("undefined"==typeof e||!(g instanceof e.g))throw g;return-g.A}},__syscall_fstat64:function(a,b){try{var c=A.X(a);return A.Ba(e.stat,c.path,b)}catch(d){if("undefined"==typeof e||!(d instanceof e.g))throw d;return-d.A}},__syscall_lstat64:function(a,b){try{return a=A.sa(a),A.Ba(e.lstat,a,b)}catch(c){if("undefined"==typeof e||!(c instanceof e.g))throw c; +return-c.A}},__syscall_newfstatat:function(a,b,c,d){try{b=A.sa(b);var f=d&256;b=A.Sa(a,b,d&4096);return A.Ba(f?e.lstat:e.stat,b,c)}catch(g){if("undefined"==typeof e||!(g instanceof e.g))throw g;return-g.A}},__syscall_openat:function(a,b,c,d){A.za=d;try{b=A.sa(b);b=A.Sa(a,b);var f=d?A.get():0;return e.open(b,c,f).fd}catch(g){if("undefined"==typeof e||!(g instanceof e.g))throw g;return-g.A}},__syscall_stat64:function(a,b){try{return a=A.sa(a),A.Ba(e.stat,a,b)}catch(c){if("undefined"==typeof e||!(c instanceof +e.g))throw c;return-c.A}},__syscall_unlinkat:function(a,b,c){try{return b=A.sa(b),b=A.Sa(a,b),0===c?e.unlink(b):512===c?e.rmdir(b):Q("Invalid flags passed to unlinkat"),0}catch(d){if("undefined"==typeof e||!(d instanceof e.g))throw d;return-d.A}},_embind_register_bigint:function(){},_embind_register_bool:function(a,b,c,d,f){var g=sb(c);b=P(b);Z(a,{name:b,fromWireType:function(h){return!!h},toWireType:function(h,l){return l?d:f},argPackAdvance:8,readValueFromPointer:function(h){if(1===c)var l=M;else if(2=== +c)l=oa;else if(4===c)l=v;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(l[h>>g])},S:null})},_embind_register_class:function(a,b,c,d,f,g,h,l,p,n,q,t,u){q=P(q);g=ra(f,g);l&&(l=ra(h,l));n&&(n=ra(p,n));u=ra(t,u);var m=tb(q);tc(m,function(){fb("Cannot construct "+q+" due to unbound types",[d])});xa([a,b,c],d?[d]:[],function(r){r=r[0];if(d){var x=r.o;var B=x.ka}else B=ia.prototype;r=ub(m,function(){if(Object.getPrototypeOf(this)!==I)throw new wa("Use 'new' to construct "+ +q);if(void 0===ha.Z)throw new wa(q+" has no accessible constructor");var Fc=ha.Z[arguments.length];if(void 0===Fc)throw new wa("Tried to invoke ctor of "+q+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(ha.Z).toString()+") parameters instead!");return Fc.apply(this,arguments)});var I=Object.create(B,{constructor:{value:r}});r.prototype=I;var ha=new $c(q,r,I,u,x,g,l,n);x=new aa(q,ha,!0,!1,!1);B=new aa(q+"*",ha,!1,!1,!1);var L=new aa(q+" const*",ha,!1,!0,!1);rc[a]= +{pointerType:B,ac:L};uc(m,r);return[x,B,L]})},_embind_register_class_constructor:function(a,b,c,d,f,g){0{fb("Cannot construct "+ +l.name+" due to unbound types",h)};xa([],h,function(n){n.splice(1,0,null);l.o.Z[b-1]=Cb(p,n,null,f,g);return[]});return[]})},_embind_register_class_function:function(a,b,c,d,f,g,h,l){var p=Bb(c,d);b=P(b);g=ra(f,g);xa([],[a],function(n){function q(){fb("Cannot call "+t+" due to unbound types",p)}n=n[0];var t=n.name+"."+b;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);l&&n.o.Jc.push(b);var u=n.o.ka,m=u[b];void 0===m||void 0===m.F&&m.className!==n.name&&m.Aa===c-2?(q.Aa=c-2,q.className=n.name,u[b]=q): +(sc(u,b,t),u[b].F[c-2]=q);xa([],p,function(r){r=Cb(t,r,n,g,h);void 0===u[b].F?(r.Aa=c-2,u[b]=r):u[b].F[c-2]=r;return[]});return[]})},_embind_register_emval:function(a,b){b=P(b);Z(a,{name:b,fromWireType:function(c){var d=db.Xc(c);yc(c);return d},toWireType:function(c,d){return db.qb(d)},argPackAdvance:8,readValueFromPointer:eb,S:null})},_embind_register_float:function(a,b,c){c=sb(c);b=P(b);Z(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,f){return f},argPackAdvance:8,readValueFromPointer:gd(b, +c),S:null})},_embind_register_function:function(a,b,c,d,f,g){var h=Bb(b,c);a=P(a);f=ra(d,f);tc(a,function(){fb("Cannot call "+a+" due to unbound types",h)},b-1);xa([],h,function(l){l=[l[0],null].concat(l.slice(1));uc(a,Cb(a,l,null,f,g),b-1);return[]})},_embind_register_integer:function(a,b,c,d,f){b=P(b);-1===f&&(f=4294967295);f=sb(c);var g=l=>l;if(0===d){var h=32-8*c;g=l=>l<>>h}c=b.includes("unsigned")?function(l,p){return p>>>0}:function(l,p){return p};Z(a,{name:b,fromWireType:g,toWireType:c, +argPackAdvance:8,readValueFromPointer:hd(b,f,0!==d),S:null})},_embind_register_memory_view:function(a,b,c){function d(g){g>>=2;var h=E;return new f(ua,h[g+1],h[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=P(c);Z(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{sc:!0})},_embind_register_std_string:function(a,b){b=P(b);var c="std::string"===b;Z(a,{name:b,fromWireType:function(d){var f=E[d>>2];if(c)for(var g=d+4,h=0;h<= +f;++h){var l=d+4+h;if(h==f||0==K[l]){g=na(g,l-g);if(void 0===p)var p=g;else p+=String.fromCharCode(0),p+=g;g=l+1}}else{p=Array(f);for(h=0;hUa(f):()=>f.length)(),l=hb(4+h+1);E[l>>2]=h;if(c&&g)Ta(f, +K,l+4,h+1);else if(g)for(g=0;gVa;var l=1}else 4===b&&(d=Rc,f=Sc,g=Tc,h=()=>E,l=2);Z(a,{name:c,fromWireType:function(p){for(var n=E[p>>2],q=h(),t,u=p+4,m=0;m<= +n;++m){var r=p+4+m*b;if(m==n||0==q[r>>l])u=d(u,r-u),void 0===t?t=u:(t+=String.fromCharCode(0),t+=u),u=r+b}U(p);return t},toWireType:function(p,n){"string"!=typeof n&&z("Cannot pass non-string to C++ string type "+c);var q=g(n),t=hb(4+q+b);E[t>>2]=q>>l;f(n,t+4,q+b);null!==p&&p.push(U,t);return t},argPackAdvance:8,readValueFromPointer:eb,S:function(p){U(p)}})},_embind_register_void:function(a,b){b=P(b);Z(a,{od:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},_emval_decref:yc, +_emval_incref:function(a){4>2]=l.Xb;return p}catch(n){if("undefined"==typeof e||!(n instanceof e.g))throw n;return-n.A}},_munmap_js:function(a,b,c,d,f,g){try{var h=e.W(f);h&&c&2&&A.jc(a,h,b,d,g)}catch(l){if("undefined"==typeof e||!(l instanceof +e.g))throw l;return-l.A}},abort:function(){Q("")},emscripten_memcpy_big:function(a,b,c){K.copyWithin(a,b,b+c)},emscripten_resize_heap:function(a){var b=K.length;a>>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);var f=Math;d=Math.max(a,d);f=f.min.call(f,2147483648,d+(65536-d%65536)%65536);a:{try{ma.grow(f-ua.byteLength+65535>>>16);ac(ma.buffer);var g=1;break a}catch(h){}g=void 0}if(g)return!0}return!1},environ_get:function(a,b){var c=0;Ia().forEach(function(d, +f){var g=b+c;f=E[a+4*f>>2]=g;for(g=0;g>0]=d.charCodeAt(g);M[f>>0]=0;c+=d.length+1});return 0},environ_sizes_get:function(a,b){var c=Ia();E[a>>2]=c.length;var d=0;c.forEach(function(f){d+=f.length+1});E[b>>2]=d;return 0},fd_close:function(a){try{var b=A.X(a);e.close(b);return 0}catch(c){if("undefined"==typeof e||!(c instanceof e.g))throw c;return c.A}},fd_pread:function(a,b,c,d,f,g){try{var h=Fb(d,f);if(isNaN(h))return 61;var l=A.X(a),p=zc(l,b,c,h);v[g>>2]=p;return 0}catch(n){if("undefined"== +typeof e||!(n instanceof e.g))throw n;return n.A}},fd_pwrite:function(a,b,c,d,f,g){try{var h=Fb(d,f);if(isNaN(h))return 61;var l=A.X(a),p=Ac(l,b,c,h);v[g>>2]=p;return 0}catch(n){if("undefined"==typeof e||!(n instanceof e.g))throw n;return n.A}},fd_read:function(a,b,c,d){try{var f=A.X(a),g=zc(f,b,c);v[d>>2]=g;return 0}catch(h){if("undefined"==typeof e||!(h instanceof e.g))throw h;return h.A}},fd_seek:function(a,b,c,d,f){try{var g=Fb(b,c);if(isNaN(g))return 61;var h=A.X(a);e.J(h,g,d);W=[h.position>>> +0,(J=h.position,1<=+Math.abs(J)?0>>0:~~+Math.ceil((J-+(~~J>>>0))/4294967296)>>>0:0)];v[f>>2]=W[0];v[f+4>>2]=W[1];h.Xa&&0===g&&0===d&&(h.Xa=null);return 0}catch(l){if("undefined"==typeof e||!(l instanceof e.g))throw l;return l.A}},fd_write:function(a,b,c,d){try{var f=A.X(a),g=Ac(f,b,c);E[d>>2]=g;return 0}catch(h){if("undefined"==typeof e||!(h instanceof e.g))throw h;return h.A}},getTempRet0:()=>Wb,invoke_diii:kd,invoke_fiii:ld,invoke_i:md,invoke_ii:nd, +invoke_iii:od,invoke_iiii:pd,invoke_iiiii:qd,invoke_iiiiii:rd,invoke_iiiiiii:sd,invoke_iiiiiiii:td,invoke_iiiiiiiiiii:ud,invoke_iiiiiiiiiiii:vd,invoke_iiiiiiiiiiiii:wd,invoke_iiiiij:xd,invoke_jiiii:yd,invoke_v:zd,invoke_vi:Ad,invoke_vii:Bd,invoke_viii:Cd,invoke_viiii:Dd,invoke_viiiiiii:Ed,invoke_viiiiiiiiii:Fd,invoke_viiiiiiiiiiiiiii:Gd,llvm_eh_typeid_for:function(a){return a},memory:ma,setTempRet0:N,strftime_l:function(a,b,c,d){return jd(a,b,c,d)}};(function(){function a(f){k.asm=f.exports;Hd(); +cc=k.asm.__indirect_function_table;ec.unshift(k.asm.__wasm_call_ctors);Ca("wasm-instantiate")}function b(f){a(f.instance)}function c(f){return Vc().then(function(g){return ca.instantiate(g,d)}).then(function(g){return g}).then(f,function(g){T("failed to asynchronously prepare wasm: "+g);Q(g)})}var d={env:ob,wasi_snapshot_preview1:ob};Wa("wasm-instantiate");if(k.instantiateWasm)try{return k.instantiateWasm(d,a)}catch(f){return T("Module.instantiateWasm callback failed with error: "+f),!1}(function(){return sa|| +"function"!=typeof ca.instantiateStreaming||rb(O)||O.startsWith("file://")||"function"!=typeof fetch?c(b):fetch(O,{credentials:"same-origin"}).then(function(f){return ca.instantiateStreaming(f,d).then(b,function(g){T("wasm streaming compile failed: "+g);T("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})();k.___wasm_call_ctors=function(){return(k.___wasm_call_ctors=k.asm.__wasm_call_ctors).apply(null,arguments)};k._main=function(){return(k._main=k.asm.main).apply(null,arguments)}; +var hb=k._malloc=function(){return(hb=k._malloc=k.asm.malloc).apply(null,arguments)},Ec=k.___errno_location=function(){return(Ec=k.___errno_location=k.asm.__errno_location).apply(null,arguments)},U=k._free=function(){return(U=k._free=k.asm.free).apply(null,arguments)},xc=k.___getTypeName=function(){return(xc=k.___getTypeName=k.asm.__getTypeName).apply(null,arguments)};k.___embind_register_native_and_builtin_types=function(){return(k.___embind_register_native_and_builtin_types=k.asm.__embind_register_native_and_builtin_types).apply(null, +arguments)};k.___dl_seterr=function(){return(k.___dl_seterr=k.asm.__dl_seterr).apply(null,arguments)};var lc=k._emscripten_builtin_memalign=function(){return(lc=k._emscripten_builtin_memalign=k.asm.emscripten_builtin_memalign).apply(null,arguments)},D=k._setThrew=function(){return(D=k._setThrew=k.asm.setThrew).apply(null,arguments)},F=k.stackSave=function(){return(F=k.stackSave=k.asm.stackSave).apply(null,arguments)},G=k.stackRestore=function(){return(G=k.stackRestore=k.asm.stackRestore).apply(null, +arguments)},Gb=k.stackAlloc=function(){return(Gb=k.stackAlloc=k.asm.stackAlloc).apply(null,arguments)};k.___cxa_demangle=function(){return(k.___cxa_demangle=k.asm.__cxa_demangle).apply(null,arguments)};var ib=k.___cxa_can_catch=function(){return(ib=k.___cxa_can_catch=k.asm.__cxa_can_catch).apply(null,arguments)},hc=k.___cxa_is_pointer_type=function(){return(hc=k.___cxa_is_pointer_type=k.asm.__cxa_is_pointer_type).apply(null,arguments)};k.dynCall_ji=function(){return(k.dynCall_ji=k.asm.dynCall_ji).apply(null, +arguments)};k.dynCall_viijj=function(){return(k.dynCall_viijj=k.asm.dynCall_viijj).apply(null,arguments)};k.dynCall_iij=function(){return(k.dynCall_iij=k.asm.dynCall_iij).apply(null,arguments)};k.dynCall_iijj=function(){return(k.dynCall_iijj=k.asm.dynCall_iijj).apply(null,arguments)};k.dynCall_viij=function(){return(k.dynCall_viij=k.asm.dynCall_viij).apply(null,arguments)};k.dynCall_ij=function(){return(k.dynCall_ij=k.asm.dynCall_ij).apply(null,arguments)};k.dynCall_iiiji=function(){return(k.dynCall_iiiji= +k.asm.dynCall_iiiji).apply(null,arguments)};k.dynCall_iiiij=function(){return(k.dynCall_iiiij=k.asm.dynCall_iiiij).apply(null,arguments)};k.dynCall_vij=function(){return(k.dynCall_vij=k.asm.dynCall_vij).apply(null,arguments)};k.dynCall_jiji=function(){return(k.dynCall_jiji=k.asm.dynCall_jiji).apply(null,arguments)};var Gc=k.dynCall_iiiiij=function(){return(Gc=k.dynCall_iiiiij=k.asm.dynCall_iiiiij).apply(null,arguments)};k.dynCall_viijii=function(){return(k.dynCall_viijii=k.asm.dynCall_viijii).apply(null, +arguments)};var Hc=k.dynCall_jiiii=function(){return(Hc=k.dynCall_jiiii=k.asm.dynCall_jiiii).apply(null,arguments)};k.dynCall_iiiiijj=function(){return(k.dynCall_iiiiijj=k.asm.dynCall_iiiiijj).apply(null,arguments)};k.dynCall_iiiiiijj=function(){return(k.dynCall_iiiiiijj=k.asm.dynCall_iiiiiijj).apply(null,arguments)};function od(a,b,c){var d=F();try{return C(a)(b,c)}catch(f){G(d);if(f!==f+0)throw f;D(1,0)}}function nd(a,b){var c=F();try{return C(a)(b)}catch(d){G(c);if(d!==d+0)throw d;D(1,0)}}function Cd(a, +b,c,d){var f=F();try{C(a)(b,c,d)}catch(g){G(f);if(g!==g+0)throw g;D(1,0)}}function pd(a,b,c,d){var f=F();try{return C(a)(b,c,d)}catch(g){G(f);if(g!==g+0)throw g;D(1,0)}}function zd(a){var b=F();try{C(a)()}catch(c){G(b);if(c!==c+0)throw c;D(1,0)}}function Dd(a,b,c,d,f){var g=F();try{C(a)(b,c,d,f)}catch(h){G(g);if(h!==h+0)throw h;D(1,0)}}function Bd(a,b,c){var d=F();try{C(a)(b,c)}catch(f){G(d);if(f!==f+0)throw f;D(1,0)}}function sd(a,b,c,d,f,g,h){var l=F();try{return C(a)(b,c,d,f,g,h)}catch(p){G(l); +if(p!==p+0)throw p;D(1,0)}}function Ad(a,b){var c=F();try{C(a)(b)}catch(d){G(c);if(d!==d+0)throw d;D(1,0)}}function md(a){var b=F();try{return C(a)()}catch(c){G(b);if(c!==c+0)throw c;D(1,0)}}function rd(a,b,c,d,f,g){var h=F();try{return C(a)(b,c,d,f,g)}catch(l){G(h);if(l!==l+0)throw l;D(1,0)}}function td(a,b,c,d,f,g,h,l){var p=F();try{return C(a)(b,c,d,f,g,h,l)}catch(n){G(p);if(n!==n+0)throw n;D(1,0)}}function ud(a,b,c,d,f,g,h,l,p,n,q){var t=F();try{return C(a)(b,c,d,f,g,h,l,p,n,q)}catch(u){G(t); +if(u!==u+0)throw u;D(1,0)}}function qd(a,b,c,d,f){var g=F();try{return C(a)(b,c,d,f)}catch(h){G(g);if(h!==h+0)throw h;D(1,0)}}function wd(a,b,c,d,f,g,h,l,p,n,q,t,u){var m=F();try{return C(a)(b,c,d,f,g,h,l,p,n,q,t,u)}catch(r){G(m);if(r!==r+0)throw r;D(1,0)}}function ld(a,b,c,d){var f=F();try{return C(a)(b,c,d)}catch(g){G(f);if(g!==g+0)throw g;D(1,0)}}function kd(a,b,c,d){var f=F();try{return C(a)(b,c,d)}catch(g){G(f);if(g!==g+0)throw g;D(1,0)}}function Ed(a,b,c,d,f,g,h,l){var p=F();try{C(a)(b,c,d, +f,g,h,l)}catch(n){G(p);if(n!==n+0)throw n;D(1,0)}}function vd(a,b,c,d,f,g,h,l,p,n,q,t){var u=F();try{return C(a)(b,c,d,f,g,h,l,p,n,q,t)}catch(m){G(u);if(m!==m+0)throw m;D(1,0)}}function Fd(a,b,c,d,f,g,h,l,p,n,q){var t=F();try{C(a)(b,c,d,f,g,h,l,p,n,q)}catch(u){G(t);if(u!==u+0)throw u;D(1,0)}}function Gd(a,b,c,d,f,g,h,l,p,n,q,t,u,m,r,x){var B=F();try{C(a)(b,c,d,f,g,h,l,p,n,q,t,u,m,r,x)}catch(I){G(B);if(I!==I+0)throw I;D(1,0)}}function xd(a,b,c,d,f,g,h){var l=F();try{return Gc(a,b,c,d,f,g,h)}catch(p){G(l); +if(p!==p+0)throw p;D(1,0)}}function yd(a,b,c,d,f){var g=F();try{return Hc(a,b,c,d,f)}catch(h){G(g);if(h!==h+0)throw h;D(1,0)}}k.print=Aa;k.printErr=T;k.ALLOC_NORMAL=0;k.ALLOC_STACK=1;function Hd(){if(da)if(rb(da)||(da=Tb(da)),ya||Nc){var a=Qa(da);K.set(a,1024)}else{Wa("memory initializer");var b=d=>{d.byteLength&&(d=new Uint8Array(d));K.set(d,1024);k.memoryInitializerRequest&&delete k.memoryInitializerRequest.response;Ca("memory initializer")},c=()=>{za(da,b,function(){throw Error("could not load memory initializer "+ +da);})};k.memoryInitializerRequest?(a=()=>{var d=k.memoryInitializerRequest,f=d.response;200!==d.status&&0!==d.status?(console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+d.status+", retrying "+da),c()):b(f)},k.memoryInitializerRequest.response?setTimeout(a,0):k.memoryInitializerRequest.addEventListener("load",a)):c()}}var jb;function Ra(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}Ba=function b(){jb||Hb();jb|| +(Ba=b)};function Id(b){var c=k._main;b=b||[];b.unshift(La);var d=b.length,f=Gb(4*(d+1)),g=f>>2;b.forEach(p=>{var n=v,q=g++,t=Ua(p)+1,u=Gb(t);Ta(p,M,u,t);n[q]=u});v[g]=0;try{var h=c(d,f);Jd(h,!0);return h}catch(p){if(p instanceof Ra||"unwind"==p)var l=Sa;else Ma(1,p),l=void 0;return l}finally{}}function Hb(b){function c(){if(!jb&&(jb=!0,k.calledRun=!0,!pb)){k.noFSInit||e.Y.Za||e.Y();e.Mb=!1;fa.Y();Xa(ec);Xa(Uc);if(k.onRuntimeInitialized)k.onRuntimeInitialized();Ic&&Id(b);if(k.postRun)for("function"== +typeof k.postRun&&(k.postRun=[k.postRun]);k.postRun.length;)fc.unshift(k.postRun.shift());Xa(fc)}}b=b||mb;if(!(0 .zim) - var baseZimFileName = files[0].name.replace(/\.zim..$/, '.zim'); - Module = {}; - Module["onRuntimeInitialized"] = function() { - console.debug("runtime initialized"); - Module.loadArchive("/work/" + baseZimFileName); - outgoingMessagePort.postMessage("runtime initialized"); - }; - Module["arguments"] = []; - for (let i = 0; i < files.length; i++) { - Module["arguments"].push("/work/" + files[i].name); - } - Module["preRun"] = function() { - FS.mkdir("/work"); - FS.mount(WORKERFS, { - files: files - }, "/work"); - }; - console.debug("baseZimFileName = " + baseZimFileName); - console.debug('Module["arguments"] = ' + Module["arguments"]) - - - -// 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; -}; - -// Determine the runtime environment we are in. You can customize this by -// setting the ENVIRONMENT setting at compile time (see settings.js). - -// Attempt to auto-detect the environment -var ENVIRONMENT_IS_WEB = typeof window == 'object'; -var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; -// N.b. Electron.js environment is simultaneously a NODE-environment, but -// also a web environment. -var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; -var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - -// `/` 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 read_, - readAsync, - readBinary, - setWindowTitle; - -// Normally we don't log exceptions but instead let them bubble out the top -// level where the embedding environment (e.g. the browser) can handle -// them. -// However under v8 and node we sometimes exit the process direcly in which case -// its up to use us to log the exception before exiting. -// If we fix https://github.com/emscripten-core/emscripten/issues/15080 -// this may no longer be needed under node. -function logExceptionOnExit(e) { - if (e instanceof ExitStatus) return; - let toLog = e; - err('exiting due to exception: ' + toLog); -} - -var fs; -var nodePath; -var requireNodeFS; - -if (ENVIRONMENT_IS_NODE) { - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = require('path').dirname(scriptDirectory) + '/'; - } else { - scriptDirectory = __dirname + '/'; - } - -// include: node_shell_read.js - - -requireNodeFS = () => { - // Use nodePath as the indicator for these not being initialized, - // since in some environments a global fs may have already been - // created. - if (!nodePath) { - fs = require('fs'); - nodePath = require('path'); - } -}; - -read_ = function shell_read(filename, binary) { - requireNodeFS(); - filename = nodePath['normalize'](filename); - return fs.readFileSync(filename, binary ? undefined : 'utf8'); -}; - -readBinary = (filename) => { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - return ret; -}; - -readAsync = (filename, onload, onerror) => { - requireNodeFS(); - filename = nodePath['normalize'](filename); - fs.readFile(filename, function(err, data) { - if (err) onerror(err); - else onload(data.buffer); - }); -}; - -// end include: node_shell_read.js - if (process['argv'].length > 1) { - thisProgram = process['argv'][1].replace(/\\/g, '/'); - } - - arguments_ = process['argv'].slice(2); - - if (typeof module != 'undefined') { - module['exports'] = Module; - } - - process['on']('uncaughtException', function(ex) { - // suppress ExitStatus exceptions from showing an error - if (!(ex instanceof ExitStatus)) { - throw ex; - } - }); - - // Without this older versions of node (< v15) will log unhandled rejections - // but return 0, which is not normally the desired behaviour. This is - // not be needed with node v15 and about because it is now the default - // behaviour: - // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode - process['on']('unhandledRejection', function(reason) { throw reason; }); - - quit_ = (status, toThrow) => { - if (keepRuntimeAlive()) { - process['exitCode'] = status; - throw toThrow; - } - logExceptionOnExit(toThrow); - process['exit'](status); - }; - - Module['inspect'] = function () { return '[Emscripten Module object]'; }; - -} else - -// 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. -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; - } - // 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.indexOf('blob:') !== 0) { - scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); - } else { - scriptDirectory = ''; - } - - // Differentiate the Web Worker from the Node Worker case, as reading must - // be done differently. - { -// include: web_or_worker_shell_read.js - - - read_ = (url) => { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.send(null); - return xhr.responseText; - } - - if (ENVIRONMENT_IS_WORKER) { - readBinary = (url) => { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.responseType = 'arraybuffer'; - xhr.send(null); - return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); - }; - } - - readAsync = (url, onload, onerror) => { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.onload = () => { - if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 - onload(xhr.response); - return; - } - onerror(); - }; - xhr.onerror = onerror; - xhr.send(null); - } - -// end include: web_or_worker_shell_read.js - } - - setWindowTitle = (title) => document.title = title; -} else -{ -} - -var out = Module['print'] || console.log.bind(console); -var err = Module['printErr'] || console.warn.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 e.g. in memoryInitializerRequest, which is a large typed array. -moduleOverrides = null; - -// 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']; - -if (Module['thisProgram']) thisProgram = Module['thisProgram']; - -if (Module['quit']) quit_ = Module['quit']; - -// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message - - - - -var STACK_ALIGN = 16; -var POINTER_SIZE = 4; - -function getNativeTypeSize(type) { - switch (type) { - case 'i1': case 'i8': case 'u8': return 1; - case 'i16': case 'u16': return 2; - case 'i32': case 'u32': return 4; - case 'i64': case 'u64': return 8; - case 'float': return 4; - case 'double': return 8; - default: { - if (type[type.length - 1] === '*') { - return POINTER_SIZE; - } else if (type[0] === 'i') { - const bits = Number(type.substr(1)); - assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); - return bits / 8; - } else { - return 0; - } - } - } -} - -function warnOnce(text) { - if (!warnOnce.shown) warnOnce.shown = {}; - if (!warnOnce.shown[text]) { - warnOnce.shown[text] = 1; - err(text); - } -} - -// include: runtime_functions.js - - -// This gives correct answers for everything less than 2^{14} = 16384 -// I hope nobody is contemplating functions with 16384 arguments... -function uleb128Encode(n) { - if (n < 128) { - return [n]; - } - return [(n % 128) | 128, n >> 7]; -} - -// Wraps a JS function as a wasm function with a given signature. -function convertJsFunctionToWasm(func, sig) { - - // If the type reflection proposal is available, use the new - // "WebAssembly.Function" constructor. - // Otherwise, construct a minimal wasm module importing the JS function and - // re-exporting it. - if (typeof WebAssembly.Function == "function") { - var typeNames = { - 'i': 'i32', - 'j': 'i64', - 'f': 'f32', - 'd': 'f64', - 'p': 'i32', - }; - var type = { - parameters: [], - results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] - }; - for (var i = 1; i < sig.length; ++i) { - type.parameters.push(typeNames[sig[i]]); - } - return new WebAssembly.Function(type, func); - } - - // The module is static, with the exception of the type section, which is - // generated based on the signature passed in. - var typeSection = [ - 0x01, // count: 1 - 0x60, // form: func - ]; - var sigRet = sig.slice(0, 1); - var sigParam = sig.slice(1); - var typeCodes = { - 'i': 0x7f, // i32 - 'p': 0x7f, // i32 - 'j': 0x7e, // i64 - 'f': 0x7d, // f32 - 'd': 0x7c, // f64 - }; - - // Parameters, length + signatures - typeSection = typeSection.concat(uleb128Encode(sigParam.length)); - for (var i = 0; i < sigParam.length; ++i) { - typeSection.push(typeCodes[sigParam[i]]); - } - - // Return values, length + signatures - // With no multi-return in MVP, either 0 (void) or 1 (anything else) - if (sigRet == 'v') { - typeSection.push(0x00); - } else { - typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); - } - - // Write the section code and overall length of the type section into the - // section header - typeSection = [0x01 /* Type section code */].concat( - uleb128Encode(typeSection.length), - typeSection - ); - - // Rest of the module is static - var bytes = new Uint8Array([ - 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") - 0x01, 0x00, 0x00, 0x00, // version: 1 - ].concat(typeSection, [ - 0x02, 0x07, // import section - // (import "e" "f" (func 0 (type 0))) - 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, - 0x07, 0x05, // export section - // (export "f" (func 0 (type 0))) - 0x01, 0x01, 0x66, 0x00, 0x00, - ])); - - // We can compile this wasm module synchronously because it is very small. - // This accepts an import (at "e.f"), that it reroutes to an export (at "f") - var module = new WebAssembly.Module(bytes); - var instance = new WebAssembly.Instance(module, { - 'e': { - 'f': func - } - }); - var wrappedFunc = instance.exports['f']; - return wrappedFunc; -} - -var freeTableIndexes = []; - -// Weak map of functions in the table to their indexes, created on first use. -var functionsInTableMap; - -function getEmptyTableSlot() { - // Reuse a free index if there is one, otherwise grow. - if (freeTableIndexes.length) { - return freeTableIndexes.pop(); - } - // Grow the table - try { - wasmTable.grow(1); - } catch (err) { - if (!(err instanceof RangeError)) { - throw err; - } - throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; - } - return wasmTable.length - 1; -} - -function updateTableMap(offset, count) { - for (var i = offset; i < offset + count; i++) { - var item = getWasmTableEntry(i); - // Ignore null values. - if (item) { - functionsInTableMap.set(item, i); - } - } -} - -/** - * Add a function to the table. - * 'sig' parameter is required if the function being added is a JS function. - * @param {string=} sig - */ -function addFunction(func, sig) { - - // Check if the function is already in the table, to ensure each function - // gets a unique index. First, create the map if this is the first use. - if (!functionsInTableMap) { - functionsInTableMap = new WeakMap(); - updateTableMap(0, wasmTable.length); - } - if (functionsInTableMap.has(func)) { - return functionsInTableMap.get(func); - } - - // It's not in the table, add it now. - - var ret = getEmptyTableSlot(); - - // Set the new value. - try { - // Attempting to call this with JS function will cause of table.set() to fail - setWasmTableEntry(ret, func); - } catch (err) { - if (!(err instanceof TypeError)) { - throw err; - } - var wrapped = convertJsFunctionToWasm(func, sig); - setWasmTableEntry(ret, wrapped); - } - - functionsInTableMap.set(func, ret); - - return ret; -} - -function removeFunction(index) { - functionsInTableMap.delete(getWasmTableEntry(index)); - freeTableIndexes.push(index); -} - -// end include: runtime_functions.js -// include: runtime_debug.js - - -// end include: runtime_debug.js -var tempRet0 = 0; -var setTempRet0 = (value) => { tempRet0 = value; }; -var getTempRet0 = () => tempRet0; - - - -// === 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; -if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; -var noExitRuntime = Module['noExitRuntime'] || true; - -if (typeof WebAssembly != 'object') { - abort('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; - -/** @type {function(*, string=)} */ -function assert(condition, text) { - if (!condition) { - // This build was created without ASSERTIONS defined. `assert()` should not - // ever be called in this configuration but in case there are callers in - // the wild leave this simple abort() implemenation here for now. - abort(text); - } -} - -// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) -function getCFunc(ident) { - var func = Module['_' + ident]; // closure exported function - return func; -} - -// C calling interface. -/** @param {string|null=} returnType - @param {Array=} argTypes - @param {Arguments|Array=} args - @param {Object=} opts */ -function ccall(ident, returnType, argTypes, args, opts) { - // For fast lookup of conversion functions - var toC = { - 'string': function(str) { - var ret = 0; - if (str !== null && str !== undefined && str !== 0) { // null string - // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' - var len = (str.length << 2) + 1; - ret = stackAlloc(len); - stringToUTF8(str, ret, len); - } - return ret; - }, - 'array': function(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; - 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.apply(null, cArgs); - function onDone(ret) { - if (stack !== 0) stackRestore(stack); - return convertReturnValue(ret); - } - - ret = onDone(ret); - return ret; -} - -/** @param {string=} returnType - @param {Array=} argTypes - @param {Object=} opts */ -function cwrap(ident, returnType, argTypes, opts) { - argTypes = argTypes || []; - // When the function takes numbers and returns a number, we can just return - // the original function - var numericArgs = argTypes.every(function(type){ return type === 'number'}); - var numericRet = returnType !== 'string'; - if (numericRet && numericArgs && !opts) { - return getCFunc(ident); - } - return function() { - return ccall(ident, returnType, argTypes, arguments, opts); - } -} - -// include: runtime_legacy.js - - -var ALLOC_NORMAL = 0; // Tries to use _malloc() -var ALLOC_STACK = 1; // Lives for the duration of the current function call - -/** - * allocate(): This function is no longer used by emscripten but is kept around to avoid - * breaking external users. - * You should normally not use allocate(), and instead allocate - * memory using _malloc()/stackAlloc(), initialize it with - * setValue(), and so forth. - * @param {(Uint8Array|Array)} slab: An array of data. - * @param {number=} allocator : How to allocate memory, see ALLOC_* - */ -function allocate(slab, allocator) { - var ret; - - if (allocator == ALLOC_STACK) { - ret = stackAlloc(slab.length); - } else { - ret = _malloc(slab.length); - } - - if (!slab.subarray && !slab.slice) { - slab = new Uint8Array(slab); - } - HEAPU8.set(slab, ret); - return ret; -} - -// end include: runtime_legacy.js -// include: runtime_strings.js - - -// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. - -var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; - -// Given a pointer 'ptr' 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} - */ -function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) { - 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 means Infinity) - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } else { - 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 { - 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. -// 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 -// style or the other. -/** - * @param {number} ptr - * @param {number=} maxBytesToRead - * @return {string} - */ -function UTF8ToString(ptr, maxBytesToRead) { - return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; -} - -// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', -// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. -// outIdx: The starting offset in the array to begin the copying. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. -// This count should include the null terminator, -// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. -// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { - if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. - 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; - 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; -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. -// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF8(str, outPtr, maxBytesToWrite) { - return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. -function 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 u = str.charCodeAt(i); // possibly a lead surrogate - if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); - if (u <= 0x7F) ++len; - else if (u <= 0x7FF) len += 2; - else if (u <= 0xFFFF) len += 3; - else len += 4; - } - return len; -} - -// end include: runtime_strings.js -// include: runtime_strings_extra.js - - -// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. - -// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -function AsciiToString(ptr) { - var str = ''; - while (1) { - var ch = HEAPU8[((ptr++)>>0)]; - if (!ch) return str; - str += String.fromCharCode(ch); - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. - -function stringToAscii(str, outPtr) { - return writeAsciiToMemory(str, outPtr, false); -} - -// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns -// a copy of that string as a Javascript String object. - -var UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined; - -function UTF16ToString(ptr, maxBytesToRead) { - var endPtr = ptr; - // 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. - var idx = endPtr >> 1; - var maxIdx = idx + maxBytesToRead / 2; - // If maxBytesToRead is not passed explicitly, it will be undefined, and this - // will always evaluate to true. This saves on code size. - while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; - endPtr = idx << 1; - - if (endPtr - ptr > 32 && UTF16Decoder) { - return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); - } else { - var str = ''; - - // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition - // will always evaluate to true. The loop is then terminated on the first null char. - for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { - var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; - if (codeUnit == 0) break; - // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. - str += String.fromCharCode(codeUnit); - } - - return str; - } -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. -// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. -// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF16(str, outPtr, maxBytesToWrite) { - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 2) return 0; - maxBytesToWrite -= 2; // Null terminator. - var startPtr = outPtr; - var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; - for (var i = 0; i < numCharsToWrite; ++i) { - // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - HEAP16[((outPtr)>>1)] = codeUnit; - outPtr += 2; - } - // Null-terminate the pointer to the HEAP. - HEAP16[((outPtr)>>1)] = 0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF16(str) { - return str.length*2; -} - -function UTF32ToString(ptr, maxBytesToRead) { - var i = 0; - - var str = ''; - // If maxBytesToRead is not passed explicitly, it will be undefined, and this - // will always evaluate to true. This saves on code size. - while (!(i >= maxBytesToRead / 4)) { - var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; - if (utf32 == 0) break; - ++i; - // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - if (utf32 >= 0x10000) { - var ch = utf32 - 0x10000; - str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); - } else { - str += String.fromCharCode(utf32); - } - } - return str; -} - -// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', -// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. -// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. -// Parameters: -// str: the Javascript string to copy. -// outPtr: Byte address in Emscripten HEAP where to write the string to. -// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null -// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. -// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. -// Returns the number of bytes written, EXCLUDING the null terminator. - -function stringToUTF32(str, outPtr, maxBytesToWrite) { - // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 4) return 0; - var startPtr = outPtr; - var endPtr = startPtr + maxBytesToWrite - 4; - 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! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); // possibly a lead surrogate - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { - var trailSurrogate = str.charCodeAt(++i); - codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); - } - HEAP32[((outPtr)>>2)] = codeUnit; - outPtr += 4; - if (outPtr + 4 > endPtr) break; - } - // Null-terminate the pointer to the HEAP. - HEAP32[((outPtr)>>2)] = 0; - return outPtr - startPtr; -} - -// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. - -function lengthBytesUTF32(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! We must decode the string to UTF-32 to the heap. - // See http://unicode.org/faq/utf_bom.html#utf16-3 - var codeUnit = str.charCodeAt(i); - if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. - len += 4; - } - - return len; -} - -// Allocate heap space for a JS string, and write it there. -// It is the responsibility of the caller to free() that memory. -function allocateUTF8(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = _malloc(size); - if (ret) stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Allocate stack space for a JS string, and write it there. -function allocateUTF8OnStack(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = stackAlloc(size); - stringToUTF8Array(str, HEAP8, ret, size); - return ret; -} - -// Deprecated: This function should not be called because it is unsafe and does not provide -// a maximum length limit of how many bytes it is allowed to write. Prefer calling the -// function stringToUTF8Array() instead, which takes in a maximum length that can be used -// to be secure from out of bounds writes. -/** @deprecated - @param {boolean=} dontAddNull */ -function writeStringToMemory(string, buffer, dontAddNull) { - warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); - - var /** @type {number} */ lastChar, /** @type {number} */ end; - if (dontAddNull) { - // stringToUTF8Array always appends null. If we don't want to do that, remember the - // character that existed at the location where the null will be placed, and restore - // that after the write (below). - end = buffer + lengthBytesUTF8(string); - lastChar = HEAP8[end]; - } - stringToUTF8(string, buffer, Infinity); - if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. -} - -function writeArrayToMemory(array, buffer) { - HEAP8.set(array, buffer); -} - -/** @param {boolean=} dontAddNull */ -function writeAsciiToMemory(str, buffer, dontAddNull) { - for (var i = 0; i < str.length; ++i) { - HEAP8[((buffer++)>>0)] = str.charCodeAt(i); - } - // Null-terminate the pointer to the HEAP. - if (!dontAddNull) HEAP8[((buffer)>>0)] = 0; -} - -// end include: runtime_strings_extra.js -// Memory management - -var HEAP, -/** @type {!ArrayBuffer} */ - buffer, -/** @type {!Int8Array} */ - HEAP8, -/** @type {!Uint8Array} */ - HEAPU8, -/** @type {!Int16Array} */ - HEAP16, -/** @type {!Uint16Array} */ - HEAPU16, -/** @type {!Int32Array} */ - HEAP32, -/** @type {!Uint32Array} */ - HEAPU32, -/** @type {!Float32Array} */ - HEAPF32, -/** @type {!Float64Array} */ - HEAPF64; - -function updateGlobalBufferAndViews(buf) { - buffer = buf; - Module['HEAP8'] = HEAP8 = new Int8Array(buf); - Module['HEAP16'] = HEAP16 = new Int16Array(buf); - Module['HEAP32'] = HEAP32 = new Int32Array(buf); - Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); - Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); - Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); - Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); - Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); -} - -var TOTAL_STACK = 5242880; - -var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 83886080; - -// include: runtime_init_table.js -// In regular non-RELOCATABLE mode the table is exported -// from the wasm module and this will be assigned once -// the exports are available. -var wasmTable; - -// end include: runtime_init_table.js -// include: runtime_stack_check.js - - -// end include: runtime_stack_check.js -// include: runtime_assertions.js - - -// end include: runtime_assertions.js -var __ATPRERUN__ = []; // functions called before the runtime is initialized -var __ATINIT__ = []; // functions called during startup -var __ATMAIN__ = []; // functions called when main() is to be run -var __ATEXIT__ = []; // functions called during shutdown -var __ATPOSTRUN__ = []; // functions called after the main() is called - -var runtimeInitialized = false; - -function keepRuntimeAlive() { - return noExitRuntime; -} - -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() { - runtimeInitialized = true; - - -if (!Module["noFSInit"] && !FS.init.initialized) - FS.init(); -FS.ignorePermissions = false; - -TTY.init(); - callRuntimeCallbacks(__ATINIT__); -} - -function preMain() { - - callRuntimeCallbacks(__ATMAIN__); -} - -function postRun() { - - 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 addOnPreMain(cb) { - __ATMAIN__.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 - -// 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 runDependencyWatcher = null; -var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled - -function getUniqueRunDependency(id) { - return id; -} - -function addRunDependency(id) { - runDependencies++; - - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - -} - -function removeRunDependency(id) { - runDependencies--; - - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - - 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) { - { - if (Module['onAbort']) { - 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; - EXITSTATUS = 1; - - what += '. Build with -sASSERTIONS for more info.'; - - // 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 - // defintion 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); - - // 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; -} - -// {{MEM_INITIALIZER}} - -// 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. -function isDataURI(filename) { - // Prefix of data URIs emitted by SINGLE_FILE and related options. - return filename.startsWith(dataURIPrefix); -} - -// Indicates whether filename is delivered via file protocol (as opposed to http/https) -function isFileURI(filename) { - return filename.startsWith('file://'); -} - -// end include: URIUtils.js -var wasmBinaryFile; - wasmBinaryFile = 'libzim-wasm.wasm'; - if (!isDataURI(wasmBinaryFile)) { - wasmBinaryFile = locateFile(wasmBinaryFile); - } - -function getBinary(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - if (readBinary) { - return readBinary(file); - } else { - throw "both async and sync fetching of the wasm failed"; - } - } - catch (err) { - abort(err); - } -} - -function getBinaryPromise() { - // If we don't have the binary yet, try to to load it asynchronously. - // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. - // See https://github.com/github/fetch/pull/92#issuecomment-140665932 - // Cordova or Electron apps are typically loaded from a file:// url. - // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. - if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { - if (typeof fetch == 'function' - && !isFileURI(wasmBinaryFile) - ) { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { - if (!response['ok']) { - throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; - } - return response['arrayBuffer'](); - }).catch(function () { - return getBinary(wasmBinaryFile); - }); - } - else { - if (readAsync) { - // fetch is not available or url is file => try XHR (readAsync uses XHR internally) - return new Promise(function(resolve, reject) { - readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject) - }); - } - } - } - - // Otherwise, getBinary should be able to get it synchronously - return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); }); -} - -// Create the wasm instance. -// Receives the wasm imports, returns the exports. -function createWasm() { - // prepare imports - var info = { - 'env': asmLibraryArg, - 'wasi_snapshot_preview1': asmLibraryArg, - }; - // 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) { - var exports = instance.exports; - - Module['asm'] = exports; - - wasmMemory = Module['asm']['memory']; - updateGlobalBufferAndViews(wasmMemory.buffer); - - wasmTable = Module['asm']['__indirect_function_table']; - - addOnInit(Module['asm']['__wasm_call_ctors']); - - removeRunDependency('wasm-instantiate'); - - } - // we can't run yet (except in a pthread, where we have a custom sync instantiator) - addRunDependency('wasm-instantiate'); - - // Prefer streaming instantiation if available. - 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 - // 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 USE_PTHREADS-enabled path. - receiveInstance(result['instance']); - } - - function instantiateArrayBuffer(receiver) { - return getBinaryPromise().then(function(binary) { - return WebAssembly.instantiate(binary, info); - }).then(function (instance) { - return instance; - }).then(receiver, function(reason) { - err('failed to asynchronously prepare wasm: ' + reason); - - abort(reason); - }); - } - - function instantiateAsync() { - if (!wasmBinary && - typeof WebAssembly.instantiateStreaming == 'function' && - !isDataURI(wasmBinaryFile) && - // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. - !isFileURI(wasmBinaryFile) && - typeof fetch == 'function') { - return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { - // Suppress closure warning here since the upstream definition for - // instantiateStreaming only allows Promise rather than - // an actual Response. - // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. - /** @suppress {checkTypes} */ - var result = WebAssembly.instantiateStreaming(response, info); - - return result.then( - receiveInstantiationResult, - function(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'); - return instantiateArrayBuffer(receiveInstantiationResult); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiationResult); - } - } - - // 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 { - var exports = Module['instantiateWasm'](info, receiveInstance); - return exports; - } catch(e) { - err('Module.instantiateWasm callback failed with error: ' + e); - return false; - } - } - - instantiateAsync(); - return {}; // no exports yet; we'll fill them in later -} - -// Globals used by JS i64 conversions (see makeSetValue) -var tempDouble; -var tempI64; - -// === Body === - -var ASM_CONSTS = { - -}; - - - - - - - function callRuntimeCallbacks(callbacks) { - while (callbacks.length > 0) { - var callback = callbacks.shift(); - if (typeof callback == 'function') { - callback(Module); // Pass the module as the first argument. - continue; - } - var func = callback.func; - if (typeof func == 'number') { - if (callback.arg === undefined) { - // Run the wasm function ptr with signature 'v'. If no function - // with such signature was exported, this call does not need - // to be emitted (and would confuse Closure) - getWasmTableEntry(func)(); - } else { - // If any function with signature 'vi' was exported, run - // the callback with that signature. - getWasmTableEntry(func)(callback.arg); - } - } else { - func(callback.arg === undefined ? null : callback.arg); - } - } - } - - function withStackSave(f) { - var stack = stackSave(); - var ret = f(); - stackRestore(stack); - return ret; - } - function demangle(func) { - // If demangle has failed before, stop demangling any further function names - // This avoids an infinite recursion with malloc()->abort()->stackTrace()->demangle()->malloc()->... - demangle.recursionGuard = (demangle.recursionGuard|0)+1; - if (demangle.recursionGuard > 1) return func; - var __cxa_demangle_func = Module['___cxa_demangle'] || Module['__cxa_demangle']; - assert(__cxa_demangle_func); - return withStackSave(function() { - try { - var s = func; - if (s.startsWith('__Z')) - s = s.substr(1); - var len = lengthBytesUTF8(s)+1; - var buf = stackAlloc(len); - stringToUTF8(s, buf, len); - var status = stackAlloc(4); - var ret = __cxa_demangle_func(buf, 0, 0, status); - if (HEAP32[((status)>>2)] === 0 && ret) { - return UTF8ToString(ret); - } - // otherwise, libcxxabi failed - } catch(e) { - } finally { - _free(ret); - if (demangle.recursionGuard < 2) --demangle.recursionGuard; - } - // failure when using libcxxabi, don't demangle - return func; - }); - } - - function demangleAll(text) { - var regex = - /\b_Z[\w\d_]+/g; - return text.replace(regex, - function(x) { - var y = demangle(x); - return x === y ? x : (y + ' [' + x + ']'); - }); - } - - - /** - * @param {number} ptr - * @param {string} type - */ - function getValue(ptr, type = 'i8') { - if (type.endsWith('*')) type = 'i32'; - switch (type) { - case 'i1': return HEAP8[((ptr)>>0)]; - case 'i8': return HEAP8[((ptr)>>0)]; - case 'i16': return HEAP16[((ptr)>>1)]; - case 'i32': return HEAP32[((ptr)>>2)]; - case 'i64': return HEAP32[((ptr)>>2)]; - case 'float': return HEAPF32[((ptr)>>2)]; - case 'double': return Number(HEAPF64[((ptr)>>3)]); - default: abort('invalid type for getValue: ' + type); - } - return null; - } - - var wasmTableMirror = []; - function getWasmTableEntry(funcPtr) { - var func = wasmTableMirror[funcPtr]; - if (!func) { - if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; - wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); - } - return func; - } - - function 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; - } - quit_(1, e); - } - - function jsStackTrace() { - var error = new Error(); - if (!error.stack) { - // IE10+ special cases: It does have callstack info, but it is only - // populated if an Error object is thrown, so try that as a special-case. - try { - throw new Error(); - } catch(e) { - error = e; - } - if (!error.stack) { - return '(no stack trace available)'; - } - } - return error.stack.toString(); - } - - - /** - * @param {number} ptr - * @param {number} value - * @param {string} type - */ - function setValue(ptr, value, type = 'i8') { - if (type.endsWith('*')) type = 'i32'; - switch (type) { - case 'i1': HEAP8[((ptr)>>0)] = value; break; - case 'i8': HEAP8[((ptr)>>0)] = value; break; - case 'i16': HEAP16[((ptr)>>1)] = value; break; - case 'i32': HEAP32[((ptr)>>2)] = value; break; - case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break; - case 'float': HEAPF32[((ptr)>>2)] = value; break; - case 'double': HEAPF64[((ptr)>>3)] = value; break; - default: abort('invalid type for setValue: ' + type); - } - } - - function setWasmTableEntry(idx, func) { - wasmTable.set(idx, func); - // With ABORT_ON_WASM_EXCEPTIONS wasmTable.get is overriden to return wrapped - // functions so we need to call it here to retrieve the potential wrapper correctly - // instead of just storing 'func' directly into wasmTableMirror - wasmTableMirror[idx] = wasmTable.get(idx); - } - - function stackTrace() { - var js = jsStackTrace(); - if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); - return demangleAll(js); - } - - function ___assert_fail(condition, filename, line, func) { - abort('Assertion failed: ' + UTF8ToString(condition) + ', at: ' + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); - } - - function ___call_sighandler(fp, sig) { - getWasmTableEntry(fp)(sig); - } - - function ___cxa_allocate_exception(size) { - // Thrown object is prepended by exception metadata block - return _malloc(size + 24) + 24; - } - - var exceptionCaught = []; - - function exception_addRef(info) { - info.add_ref(); - } - - var uncaughtExceptionCount = 0; - function ___cxa_begin_catch(ptr) { - var info = new ExceptionInfo(ptr); - if (!info.get_caught()) { - info.set_caught(true); - uncaughtExceptionCount--; - } - info.set_rethrown(false); - exceptionCaught.push(info); - exception_addRef(info); - return info.get_exception_ptr(); - } - - /** @constructor */ - function ExceptionInfo(excPtr) { - this.excPtr = excPtr; - this.ptr = excPtr - 24; - - this.set_type = function(type) { - HEAPU32[(((this.ptr)+(4))>>2)] = type; - }; - - this.get_type = function() { - return HEAPU32[(((this.ptr)+(4))>>2)]; - }; - - this.set_destructor = function(destructor) { - HEAPU32[(((this.ptr)+(8))>>2)] = destructor; - }; - - this.get_destructor = function() { - return HEAPU32[(((this.ptr)+(8))>>2)]; - }; - - this.set_refcount = function(refcount) { - HEAP32[((this.ptr)>>2)] = refcount; - }; - - this.set_caught = function (caught) { - caught = caught ? 1 : 0; - HEAP8[(((this.ptr)+(12))>>0)] = caught; - }; - - this.get_caught = function () { - return HEAP8[(((this.ptr)+(12))>>0)] != 0; - }; - - this.set_rethrown = function (rethrown) { - rethrown = rethrown ? 1 : 0; - HEAP8[(((this.ptr)+(13))>>0)] = rethrown; - }; - - this.get_rethrown = function () { - return HEAP8[(((this.ptr)+(13))>>0)] != 0; - }; - - // Initialize native structure fields. Should be called once after allocated. - this.init = function(type, destructor) { - this.set_adjusted_ptr(0); - this.set_type(type); - this.set_destructor(destructor); - this.set_refcount(0); - this.set_caught(false); - this.set_rethrown(false); - } - - this.add_ref = function() { - var value = HEAP32[((this.ptr)>>2)]; - HEAP32[((this.ptr)>>2)] = value + 1; - }; - - // Returns true if last reference released. - this.release_ref = function() { - var prev = HEAP32[((this.ptr)>>2)]; - HEAP32[((this.ptr)>>2)] = prev - 1; - return prev === 1; - }; - - this.set_adjusted_ptr = function(adjustedPtr) { - HEAPU32[(((this.ptr)+(16))>>2)] = adjustedPtr; - }; - - this.get_adjusted_ptr = function() { - return HEAPU32[(((this.ptr)+(16))>>2)]; - }; - - // Get pointer which is expected to be received by catch clause in C++ code. It may be adjusted - // when the pointer is casted to some of the exception object base classes (e.g. when virtual - // inheritance is used). When a pointer is thrown this method should return the thrown pointer - // itself. - this.get_exception_ptr = function() { - // Work around a fastcomp bug, this code is still included for some reason in a build without - // exceptions support. - var isPointer = ___cxa_is_pointer_type(this.get_type()); - if (isPointer) { - return HEAPU32[((this.excPtr)>>2)]; - } - var adjusted = this.get_adjusted_ptr(); - if (adjusted !== 0) return adjusted; - return this.excPtr; - }; - } - function ___cxa_free_exception(ptr) { - return _free(new ExceptionInfo(ptr).ptr); - } - function exception_decRef(info) { - // A rethrown exception can reach refcount 0; it must not be discarded - // Its next handler will clear the rethrown flag and addRef it, prior to - // final decRef and destruction here - if (info.release_ref() && !info.get_rethrown()) { - var destructor = info.get_destructor(); - if (destructor) { - // In Wasm, destructors return 'this' as in ARM - getWasmTableEntry(destructor)(info.excPtr); - } - ___cxa_free_exception(info.excPtr); - } - } - function ___cxa_decrement_exception_refcount(ptr) { - if (!ptr) return; - exception_decRef(new ExceptionInfo(ptr)); - } - - var exceptionLast = 0; - function ___cxa_end_catch() { - // Clear state flag. - _setThrew(0); - // Call destructor if one is registered then clear it. - var info = exceptionCaught.pop(); - - exception_decRef(info); - exceptionLast = 0; // XXX in decRef? - } - - function ___resumeException(ptr) { - if (!exceptionLast) { exceptionLast = ptr; } - throw ptr; - } - function ___cxa_find_matching_catch_2() { - var thrown = exceptionLast; - if (!thrown) { - // just pass through the null ptr - setTempRet0(0); - return 0; - } - var info = new ExceptionInfo(thrown); - info.set_adjusted_ptr(thrown); - var thrownType = info.get_type(); - if (!thrownType) { - // just pass through the thrown ptr - setTempRet0(0); - return thrown; - } - var typeArray = Array.prototype.slice.call(arguments); - - // can_catch receives a **, add indirection - // The different catch blocks are denoted by different types. - // Due to inheritance, those types may not precisely match the - // type of the thrown object. Find one which matches, and - // return the type of the catch block which should be called. - for (var i = 0; i < typeArray.length; i++) { - var caughtType = typeArray[i]; - if (caughtType === 0 || caughtType === thrownType) { - // Catch all clause matched or exactly the same type is caught - break; - } - var adjusted_ptr_addr = info.ptr + 16; - if (___cxa_can_catch(caughtType, thrownType, adjusted_ptr_addr)) { - setTempRet0(caughtType); - return thrown; - } - } - setTempRet0(thrownType); - return thrown; - } - - function ___cxa_find_matching_catch_3() { - var thrown = exceptionLast; - if (!thrown) { - // just pass through the null ptr - setTempRet0(0); - return 0; - } - var info = new ExceptionInfo(thrown); - info.set_adjusted_ptr(thrown); - var thrownType = info.get_type(); - if (!thrownType) { - // just pass through the thrown ptr - setTempRet0(0); - return thrown; - } - var typeArray = Array.prototype.slice.call(arguments); - - // can_catch receives a **, add indirection - // The different catch blocks are denoted by different types. - // Due to inheritance, those types may not precisely match the - // type of the thrown object. Find one which matches, and - // return the type of the catch block which should be called. - for (var i = 0; i < typeArray.length; i++) { - var caughtType = typeArray[i]; - if (caughtType === 0 || caughtType === thrownType) { - // Catch all clause matched or exactly the same type is caught - break; - } - var adjusted_ptr_addr = info.ptr + 16; - if (___cxa_can_catch(caughtType, thrownType, adjusted_ptr_addr)) { - setTempRet0(caughtType); - return thrown; - } - } - setTempRet0(thrownType); - return thrown; - } - - function ___cxa_find_matching_catch_4() { - var thrown = exceptionLast; - if (!thrown) { - // just pass through the null ptr - setTempRet0(0); - return 0; - } - var info = new ExceptionInfo(thrown); - info.set_adjusted_ptr(thrown); - var thrownType = info.get_type(); - if (!thrownType) { - // just pass through the thrown ptr - setTempRet0(0); - return thrown; - } - var typeArray = Array.prototype.slice.call(arguments); - - // can_catch receives a **, add indirection - // The different catch blocks are denoted by different types. - // Due to inheritance, those types may not precisely match the - // type of the thrown object. Find one which matches, and - // return the type of the catch block which should be called. - for (var i = 0; i < typeArray.length; i++) { - var caughtType = typeArray[i]; - if (caughtType === 0 || caughtType === thrownType) { - // Catch all clause matched or exactly the same type is caught - break; - } - var adjusted_ptr_addr = info.ptr + 16; - if (___cxa_can_catch(caughtType, thrownType, adjusted_ptr_addr)) { - setTempRet0(caughtType); - return thrown; - } - } - setTempRet0(thrownType); - return thrown; - } - - - function ___cxa_increment_exception_refcount(ptr) { - if (!ptr) return; - exception_addRef(new ExceptionInfo(ptr)); - } - - function ___cxa_rethrow() { - var info = exceptionCaught.pop(); - if (!info) { - abort('no exception to throw'); - } - var ptr = info.excPtr; - if (!info.get_rethrown()) { - // Only pop if the corresponding push was through rethrow_primary_exception - exceptionCaught.push(info); - info.set_rethrown(true); - info.set_caught(false); - uncaughtExceptionCount++; - } - exceptionLast = ptr; - throw ptr; - } - - function ___cxa_rethrow_primary_exception(ptr) { - if (!ptr) return; - var info = new ExceptionInfo(ptr); - exceptionCaught.push(info); - info.set_rethrown(true); - ___cxa_rethrow(); - } - - function ___cxa_throw(ptr, type, destructor) { - var info = new ExceptionInfo(ptr); - // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. - info.init(type, destructor); - exceptionLast = ptr; - uncaughtExceptionCount++; - throw ptr; - } - - function ___cxa_uncaught_exceptions() { - return uncaughtExceptionCount; - } - - - 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:function() { - var paths = Array.prototype.slice.call(arguments, 0); - return PATH.normalize(paths.join('/')); - },join2:(l, r) => { - return PATH.normalize(l + '/' + r); - }}; - - function getRandomDevice() { - if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') { - // for modern web browsers - var randomBuffer = new Uint8Array(1); - return function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; - } else - if (ENVIRONMENT_IS_NODE) { - // for nodejs with or without crypto support included - try { - var crypto_module = require('crypto'); - // nodejs has crypto support - return function() { return crypto_module['randomBytes'](1)[0]; }; - } catch (e) { - // nodejs doesn't have crypto support - } - } - // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 - return function() { abort("randomDevice"); }; - } - - var PATH_FS = {resolve:function() { - var resolvedPath = '', - resolvedAbsolute = false; - for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { - var path = (i >= 0) ? arguments[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 TTY = {ttys:[],init:function () { - // 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:function() { - // 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:function(dev, ops) { - TTY.ttys[dev] = { input: [], output: [], ops: ops }; - FS.registerDevice(dev, TTY.stream_ops); - },stream_ops:{open:function(stream) { - var tty = TTY.ttys[stream.node.rdev]; - if (!tty) { - throw new FS.ErrnoError(43); - } - stream.tty = tty; - stream.seekable = false; - },close:function(stream) { - // flush any pending line data - stream.tty.ops.flush(stream.tty); - },flush:function(stream) { - stream.tty.ops.flush(stream.tty); - },read:function(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.timestamp = Date.now(); - } - return bytesRead; - },write:function(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.timestamp = Date.now(); - } - return i; - }},default_tty_ops:{get_char:function(tty) { - if (!tty.input.length) { - var result = null; - if (ENVIRONMENT_IS_NODE) { - // we will read data by chunks of BUFSIZE - var BUFSIZE = 256; - var buf = Buffer.alloc(BUFSIZE); - var bytesRead = 0; - - try { - bytesRead = fs.readSync(process.stdin.fd, buf, 0, BUFSIZE, -1); - } catch(e) { - // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, - // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. - if (e.toString().includes('EOF')) bytesRead = 0; - else throw e; - } - - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString('utf-8'); - } else { - result = null; - } - } else - if (typeof window != 'undefined' && - typeof window.prompt == 'function') { - // Browser. - result = window.prompt('Input: '); // returns null on cancel - if (result !== null) { - result += '\n'; - } - } else if (typeof readline == 'function') { - // Command line. - result = readline(); - if (result !== null) { - result += '\n'; - } - } - if (!result) { - return null; - } - tty.input = intArrayFromString(result, true); - } - return tty.input.shift(); - },put_char:function(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. - } - },flush:function(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - }},default_tty1_ops:{put_char:function(tty, val) { - if (val === null || val === 10) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) tty.output.push(val); - } - },flush:function(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - }}}; - - function zeroMemory(address, size) { - HEAPU8.fill(0, address, address + size); - } - - function alignMemory(size, alignment) { - return Math.ceil(size / alignment) * alignment; - } - function mmapAlloc(size) { - size = alignMemory(size, 65536); - var ptr = _emscripten_builtin_memalign(65536, size); - if (!ptr) return 0; - zeroMemory(ptr, size); - return ptr; - } - var MEMFS = {ops_table:null,mount:function(mount) { - return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); - },createNode:function(parent, name, mode, dev) { - if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { - // no supported - throw new FS.ErrnoError(63); - } - if (!MEMFS.ops_table) { - 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.timestamp = Date.now(); - // add the new node to the parent - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - },getFileDataAsTypedArray:function(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:function(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:function(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:function(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.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - // 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:function(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - if (attr.size !== undefined) { - MEMFS.resizeFileStorage(node, attr.size); - } - },lookup:function(parent, name) { - throw FS.genericErrors[44]; - },mknod:function(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - },rename:function(old_node, new_dir, new_name) { - // if we're overwriting a directory at new_name, make sure it's empty. - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) { - } - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - // do the internal rewiring - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now() - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - old_node.parent = new_dir; - },unlink:function(parent, name) { - delete parent.contents[name]; - parent.timestamp = Date.now(); - },rmdir:function(parent, name) { - var node = FS.lookupNode(parent, name); - for (var i in node.contents) { - throw new FS.ErrnoError(55); - } - delete parent.contents[name]; - parent.timestamp = Date.now(); - },readdir:function(node) { - var entries = ['.', '..']; - for (var key in node.contents) { - if (!node.contents.hasOwnProperty(key)) { - continue; - } - entries.push(key); - } - return entries; - },symlink:function(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); - node.link = oldpath; - return node; - },readlink:function(node) { - if (!FS.isLink(node.mode)) { - throw new FS.ErrnoError(28); - } - return node.link; - }},stream_ops:{read:function(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); - 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:function(stream, buffer, offset, length, position, canOwn) { - // If the buffer is located in main memory (HEAP), and if - // memory can grow, we can't hold on to references of the - // memory buffer, as they may get invalidated. That means we - // need to do copy its contents. - if (buffer.buffer === HEAP8.buffer) { - canOwn = false; - } - - if (!length) return 0; - var node = stream.node; - node.timestamp = Date.now(); - - if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? - if (canOwn) { - 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:function(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:function(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); - },mmap:function(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.buffer === 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 { - // 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); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { ptr: ptr, allocated: allocated }; - },msync:function(stream, buffer, offset, length, mmapFlags) { - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (mmapFlags & 2) { - // MAP_PRIVATE calls need not to be synced back to underlying fs - return 0; - } - - var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); - // should we check if bytesWritten and length are the same? - return 0; - }}}; - - /** @param {boolean=} noRunDep */ - function asyncLoad(url, onload, onerror, noRunDep) { - var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : ''; - readAsync(url, function(arrayBuffer) { - assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); - onload(new Uint8Array(arrayBuffer)); - if (dep) removeRunDependency(dep); - }, function(event) { - if (onerror) { - onerror(); - } else { - throw 'Loading data file "' + url + '" failed.'; - } - }); - if (dep) addRunDependency(dep); - } - - var WORKERFS = {DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function (mount) { - assert(ENVIRONMENT_IS_WORKER); - if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync(); - var root = WORKERFS.createNode(null, '/', WORKERFS.DIR_MODE, 0); - var createdParents = {}; - function ensureParent(path) { - // return the parent node, creating subdirs as necessary - var parts = path.split('/'); - var parent = root; - for (var i = 0; i < parts.length-1; i++) { - var curr = parts.slice(0, i+1).join('/'); - // Issue 4254: Using curr as a node name will prevent the node - // from being found in FS.nameTable when FS.open is called on - // a path which holds a child of this node, - // given that all FS functions assume node names - // are just their corresponding parts within their given path, - // rather than incremental aggregates which include their parent's - // directories. - if (!createdParents[curr]) { - createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0); - } - parent = createdParents[curr]; - } - return parent; - } - function base(path) { - var parts = path.split('/'); - return parts[parts.length-1]; - } - // We also accept FileList here, by using Array.prototype - Array.prototype.forEach.call(mount.opts["files"] || [], function(file) { - WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate); - }); - (mount.opts["blobs"] || []).forEach(function(obj) { - WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]); - }); - (mount.opts["packages"] || []).forEach(function(pack) { - pack['metadata'].files.forEach(function(file) { - var name = file.filename.substr(1); // remove initial slash - WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack['blob'].slice(file.start, file.end)); - }); - }); - return root; - },createNode:function (parent, name, mode, dev, contents, mtime) { - var node = FS.createNode(parent, name, mode); - node.mode = mode; - node.node_ops = WORKERFS.node_ops; - node.stream_ops = WORKERFS.stream_ops; - node.timestamp = (mtime || new Date).getTime(); - assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE); - if (mode === WORKERFS.FILE_MODE) { - node.size = contents.size; - node.contents = contents; - } else { - node.size = 4096; - node.contents = {}; - } - if (parent) { - parent.contents[name] = node; - } - return node; - },node_ops:{getattr:function(node) { - return { - dev: 1, - ino: node.id, - mode: node.mode, - nlink: 1, - uid: 0, - gid: 0, - rdev: undefined, - size: node.size, - atime: new Date(node.timestamp), - mtime: new Date(node.timestamp), - ctime: new Date(node.timestamp), - blksize: 4096, - blocks: Math.ceil(node.size / 4096), - }; - },setattr:function(node, attr) { - if (attr.mode !== undefined) { - node.mode = attr.mode; - } - if (attr.timestamp !== undefined) { - node.timestamp = attr.timestamp; - } - },lookup:function(parent, name) { - throw new FS.ErrnoError(44); - },mknod:function (parent, name, mode, dev) { - throw new FS.ErrnoError(63); - },rename:function (oldNode, newDir, newName) { - throw new FS.ErrnoError(63); - },unlink:function(parent, name) { - throw new FS.ErrnoError(63); - },rmdir:function(parent, name) { - throw new FS.ErrnoError(63); - },readdir:function(node) { - var entries = ['.', '..']; - for (var key in node.contents) { - if (!node.contents.hasOwnProperty(key)) { - continue; - } - entries.push(key); - } - return entries; - },symlink:function(parent, newName, oldPath) { - throw new FS.ErrnoError(63); - },readlink:function(node) { - throw new FS.ErrnoError(63); - }},stream_ops:{read:function (stream, buffer, offset, length, position) { - if (position >= stream.node.size) return 0; - var chunk = stream.node.contents.slice(position, position + length); - var ab = WORKERFS.reader.readAsArrayBuffer(chunk); - buffer.set(new Uint8Array(ab), offset); - return chunk.size; - },write:function (stream, buffer, offset, length, position) { - throw new FS.ErrnoError(29); - },llseek:function (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.size; - } - } - if (position < 0) { - throw new FS.ErrnoError(28); - } - return position; - }}}; - var FS = {root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path, opts = {}) => { - path = PATH_FS.resolve(FS.cwd(), path); - - if (!path) return { path: '', node: null }; - - var defaults = { - follow_mount: true, - recurse_count: 0 - }; - opts = Object.assign(defaults, opts) - - if (opts.recurse_count > 8) { // max recursive lookup of 8 - throw new FS.ErrnoError(32); - } - - // split the path - var parts = PATH.normalizeArray(path.split('/').filter((p) => !!p), false); - - // 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; - } - - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - - // jump to the mount's root node if this is a mountpoint - if (FS.isMountpoint(current)) { - if (!islast || (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 (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - - var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count + 1 }); - current = lookup.node; - - if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). - throw new FS.ErrnoError(32); - } - } - } - } - - return { path: current_path, node: current }; - },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, parent); - } - 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) => { - 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; - },flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:(str) => { - var flags = FS.flagModes[str]; - if (typeof flags == 'undefined') { - throw new Error('Unknown file open mode: ' + str); - } - return flags; - },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) => { - var errCode = FS.nodePermissions(dir, 'x'); - if (errCode) return errCode; - if (!dir.node_ops.lookup) return 2; - return 0; - },mayCreate:(dir, name) => { - 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:(fd_start = 0, fd_end = FS.MAX_OPEN_FDS) => { - for (var fd = fd_start; fd <= fd_end; fd++) { - if (!FS.streams[fd]) { - return fd; - } - } - throw new FS.ErrnoError(33); - },getStream:(fd) => FS.streams[fd],createStream:(stream, fd_start, fd_end) => { - if (!FS.FSStream) { - FS.FSStream = /** @constructor */ function() { - this.shared = { }; - }; - FS.FSStream.prototype = { - object: { - get: function() { return this.node; }, - set: function(val) { this.node = val; } - }, - isRead: { - get: function() { return (this.flags & 2097155) !== 1; } - }, - isWrite: { - get: function() { return (this.flags & 2097155) !== 0; } - }, - isAppend: { - get: function() { return (this.flags & 1024); } - }, - flags: { - get: function() { return this.shared.flags; }, - set: function(val) { this.shared.flags = val; }, - }, - position : { - get function() { return this.shared.position; }, - set: function(val) { this.shared.position = val; }, - }, - }; - } - // clone it, so we can return an instance of FSStream - stream = Object.assign(new FS.FSStream(), stream); - var fd = FS.nextfd(fd_start, fd_end); - stream.fd = fd; - FS.streams[fd] = stream; - return stream; - },closeStream:(fd) => { - FS.streams[fd] = null; - },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 - if (stream.stream_ops.open) { - 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.apply(check, 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) { - 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) => { - 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: type, - opts: opts, - mountpoint: 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); - 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); - },create:(path, mode) => { - mode = mode !== undefined ? mode : 438 /* 0666 */; - mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - },mkdir:(path, mode) => { - mode = mode !== undefined ? mode : 511 /* 0777 */; - 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 = 438 /* 0666 */; - } - 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 existant 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); - } 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 PATH_FS.resolve(FS.getPath(link.parent), 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), - timestamp: Date.now() - }); - },lchmod:(path, mode) => { - FS.chmod(path, mode, true); - },fchmod:(fd, mode) => { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - 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.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - 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.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - 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, { - timestamp: Math.max(atime, mtime) - }); - },open:(path, flags, mode) => { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags == 'string' ? FS.modeStringToFlags(flags) : flags; - mode = typeof mode == 'undefined' ? 438 /* 0666 */ : mode; - if ((flags & 64)) { - mode = (mode & 4095) | 32768; - } else { - mode = 0; - } - var node; - if (typeof path == 'object') { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { - follow: !(flags & 131072) - }); - node = lookup.node; - } catch (e) { - // ignore - } - } - // 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: node, - path: FS.getPath(node), // we want the absolute path to the node - flags: 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 (!FS.readFiles) FS.readFiles = {}; - 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) => { - 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) => { - 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); - } - return stream.stream_ops.mmap(stream, length, position, prot, flags); - },msync:(stream, buffer, offset, length, mmapFlags) => { - if (!stream || !stream.stream_ops.msync) { - return 0; - } - return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); - },munmap:(stream) => 0,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, 0); - } 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, - }); - 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 - var random_device = getRandomDevice(); - FS.createDevice('/dev', 'random', random_device); - FS.createDevice('/dev', 'urandom', random_device); - // 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', 16384 | 511 /* 0777 */, 73); - node.node_ops = { - lookup: (parent, name) => { - var fd = +name; - var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError(8); - var ret = { - parent: null, - mount: { mountpoint: 'fake' }, - node_ops: { readlink: () => stream.path }, - }; - ret.parent = ret; // make it look like a simple root node - return ret; - } - }; - return node; - } - }, {}, '/proc/self/fd'); - },createStandardStreams:() => { - // 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 (Module['stdin']) { - FS.createDevice('/dev', 'stdin', Module['stdin']); - } else { - FS.symlink('/dev/tty', '/dev/stdin'); - } - if (Module['stdout']) { - FS.createDevice('/dev', 'stdout', null, Module['stdout']); - } else { - FS.symlink('/dev/tty', '/dev/stdout'); - } - if (Module['stderr']) { - FS.createDevice('/dev', 'stderr', null, Module['stderr']); - } 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); - },ensureErrnoError:() => { - if (FS.ErrnoError) return; - FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { - this.node = node; - this.setErrno = /** @this{Object} */ function(errno) { - this.errno = errno; - }; - this.setErrno(errno); - this.message = 'FS error'; - - }; - FS.ErrnoError.prototype = new Error(); - FS.ErrnoError.prototype.constructor = FS.ErrnoError; - // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) - [44].forEach((code) => { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ''; - }); - },staticInit:() => { - FS.ensureErrnoError(); - - FS.nameTable = new Array(4096); - - FS.mount(MEMFS, {}, '/'); - - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - - FS.filesystems = { - 'MEMFS': MEMFS, - 'WORKERFS': WORKERFS, - }; - },init:(input, output, error) => { - FS.init.initialized = true; - - FS.ensureErrnoError(); - - // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here - Module['stdin'] = input || Module['stdin']; - Module['stdout'] = output || Module['stdout']; - Module['stderr'] = error || Module['stderr']; - - FS.createStandardStreams(); - },quit:() => { - FS.init.initialized = false; - // force-flush all streams, so we get musl std streams printed out - // 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); - } - },getMode:(canRead, canWrite) => { - var mode = 0; - if (canRead) mode |= 292 | 73; - if (canWrite) mode |= 146; - return mode; - },findObject:(path, dontResolveLastLink) => { - var ret = FS.analyzePath(path, dontResolveLastLink); - if (ret.exists) { - return ret.object; - } else { - return null; - } - },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); - } - return node; - },createDevice:(parent, name, input, output) => { - var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); - var mode = FS.getMode(!!input, !!output); - if (!FS.createDevice.major) 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 && output.buffer && 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.timestamp = 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.timestamp = 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 if (read_) { - // Command-line. - try { - // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as - // read() will try to parse UTF8. - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error('Cannot load without read() or XMLHttpRequest.'); - } - },createLazyFile:(parent, name, url, canRead, canWrite) => { - // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. - /** @constructor */ - function LazyUint8Array() { - this.lengthKnown = false; - this.chunks = []; // Loaded chunks. Index is the chunk number - } - LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_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]; - }; - LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { - this.getter = getter; - }; - LazyUint8Array.prototype.cacheLength = function LazyUint8Array_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} */(xhr.response || [])); - } else { - 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; - }; - 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(); - Object.defineProperties(lazyArray, { - length: { - get: /** @this{Object} */ function() { - if (!this.lengthKnown) { - this.cacheLength(); - } - return this._length; - } - }, - chunkSize: { - get: /** @this{Object} */ function() { - if (!this.lengthKnown) { - this.cacheLength(); - } - return this._chunkSize; - } - } - }); - - 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: /** @this {FSNode} */ 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] = function forceLoadLazyFile() { - FS.forceLoadFile(node); - return fn.apply(null, arguments); - }; - }); - // use a custom read function - stream_ops.read = (stream, buffer, offset, length, position) => { - FS.forceLoadFile(node); - var contents = stream.node.contents; - if (position >= contents.length) - return 0; - var size = Math.min(contents.length - position, length); - 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; - }; - node.stream_ops = stream_ops; - return node; - },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) { - if (preFinish) preFinish(); - if (!dontCreateFile) { - FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); - } - if (onload) onload(); - removeRunDependency(dep); - } - if (Browser.handledByPreloadPlugin(byteArray, fullname, finish, () => { - if (onerror) onerror(); - removeRunDependency(dep); - })) { - return; - } - finish(byteArray); - } - addRunDependency(dep); - if (typeof url == 'string') { - asyncLoad(url, (byteArray) => processData(byteArray), onerror); - } else { - processData(url); - } - },indexedDB:() => { - return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; - },DB_NAME:() => { - return 'EM_FS_' + window.location.pathname; - },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths, onload, onerror) => { - onload = onload || (() => {}); - onerror = onerror || (() => {}); - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = () => { - out('creating db'); - var db = openRequest.result; - db.createObjectStore(FS.DB_STORE_NAME); - }; - openRequest.onsuccess = () => { - var db = openRequest.result; - var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) onload(); else onerror(); - } - paths.forEach((path) => { - var putRequest = files.put(FS.analyzePath(path).object.contents, path); - putRequest.onsuccess = () => { ok++; if (ok + fail == total) finish() }; - putRequest.onerror = () => { fail++; if (ok + fail == total) finish() }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - },loadFilesFromDB:(paths, onload, onerror) => { - onload = onload || (() => {}); - onerror = onerror || (() => {}); - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = onerror; // no database to load from - openRequest.onsuccess = () => { - var db = openRequest.result; - try { - var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); - } catch(e) { - onerror(e); - return; - } - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) onload(); else onerror(); - } - paths.forEach((path) => { - var getRequest = files.get(path); - getRequest.onsuccess = () => { - if (FS.analyzePath(path).exists) { - FS.unlink(path); - } - FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); - ok++; - if (ok + fail == total) finish(); - }; - getRequest.onerror = () => { fail++; if (ok + fail == total) finish() }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - }}; - var SYSCALLS = {DEFAULT_POLLMASK:5,calculateAt:function(dirfd, path, allowEmpty) { - if (PATH.isAbs(path)) { - return path; - } - // relative path - var dir; - if (dirfd === -100) { - dir = FS.cwd(); - } else { - var dirstream = FS.getStream(dirfd); - if (!dirstream) throw new FS.ErrnoError(8); - dir = dirstream.path; - } - if (path.length == 0) { - if (!allowEmpty) { - throw new FS.ErrnoError(44);; - } - return dir; - } - return PATH.join2(dir, path); - },doStat:function(func, path, buf) { - try { - var stat = func(path); - } catch (e) { - if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { - // an error occurred while trying to look up the path; we should just report ENOTDIR - return -54; - } - throw e; - } - HEAP32[((buf)>>2)] = stat.dev; - HEAP32[(((buf)+(4))>>2)] = 0; - HEAP32[(((buf)+(8))>>2)] = stat.ino; - HEAP32[(((buf)+(12))>>2)] = stat.mode; - HEAP32[(((buf)+(16))>>2)] = stat.nlink; - HEAP32[(((buf)+(20))>>2)] = stat.uid; - HEAP32[(((buf)+(24))>>2)] = stat.gid; - HEAP32[(((buf)+(28))>>2)] = stat.rdev; - HEAP32[(((buf)+(32))>>2)] = 0; - (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(40))>>2)] = tempI64[0],HEAP32[(((buf)+(44))>>2)] = tempI64[1]); - HEAP32[(((buf)+(48))>>2)] = 4096; - HEAP32[(((buf)+(52))>>2)] = stat.blocks; - HEAP32[(((buf)+(56))>>2)] = (stat.atime.getTime() / 1000)|0; - HEAP32[(((buf)+(60))>>2)] = 0; - HEAP32[(((buf)+(64))>>2)] = (stat.mtime.getTime() / 1000)|0; - HEAP32[(((buf)+(68))>>2)] = 0; - HEAP32[(((buf)+(72))>>2)] = (stat.ctime.getTime() / 1000)|0; - HEAP32[(((buf)+(76))>>2)] = 0; - (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(80))>>2)] = tempI64[0],HEAP32[(((buf)+(84))>>2)] = tempI64[1]); - return 0; - },doMsync:function(addr, stream, len, flags, offset) { - var buffer = HEAPU8.slice(addr, addr + len); - FS.msync(stream, buffer, offset, len, flags); - },varargs:undefined,get:function() { - SYSCALLS.varargs += 4; - var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; - return ret; - },getStr:function(ptr) { - var ret = UTF8ToString(ptr); - return ret; - },getStreamFromFD:function(fd) { - var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError(8); - return stream; - }}; - function ___syscall_fadvise64(fd, offset, len, advice) { - return 0; // your advice is important to us (but we can't use it) - } - - function setErrNo(value) { - HEAP32[((___errno_location())>>2)] = value; - return value; - } - function ___syscall_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: { - var arg = SYSCALLS.get(); - if (arg < 0) { - return -28; - } - var newStream; - newStream = FS.createStream(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 = SYSCALLS.get(); - stream.flags |= arg; - return 0; - } - case 5: - /* case 5: Currently in musl F_GETLK64 has same value as F_GETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ { - - var arg = SYSCALLS.get(); - var offset = 0; - // We're always unlocked. - HEAP16[(((arg)+(offset))>>1)] = 2; - return 0; - } - case 6: - case 7: - /* case 6: Currently in musl F_SETLK64 has same value as F_SETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ - /* case 7: Currently in musl F_SETLKW64 has same value as F_SETLKW, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ - - - return 0; // Pretend that the locking is successful. - case 16: - case 8: - return -28; // These are for sockets. We don't have them fully implemented yet. - case 9: - // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fcntl() returns that, and we set errno ourselves. - setErrNo(28); - return -1; - default: { - return -28; - } - } - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.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 instanceof FS.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 instanceof FS.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 & (~4352); - path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); - return SYSCALLS.doStat(nofollow ? FS.lstat : FS.stat, path, buf); - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.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 ? SYSCALLS.get() : 0; - return FS.open(path, flags, mode).fd; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.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 instanceof FS.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 instanceof FS.ErrnoError)) throw e; - return -e.errno; - } - } - - function __embind_register_bigint(primitiveType, name, size, minRange, maxRange) {} - - function getShiftFromSize(size) { - switch (size) { - case 1: return 0; - case 2: return 1; - case 4: return 2; - case 8: return 3; - default: - throw new TypeError('Unknown type size: ' + size); - } - } - - function embind_init_charCodes() { - var codes = new Array(256); - for (var i = 0; i < 256; ++i) { - codes[i] = String.fromCharCode(i); - } - embind_charCodes = codes; - } - var embind_charCodes = undefined; - function readLatin1String(ptr) { - var ret = ""; - var c = ptr; - while (HEAPU8[c]) { - ret += embind_charCodes[HEAPU8[c++]]; - } - return ret; - } - - var awaitingDependencies = {}; - - var registeredTypes = {}; - - var typeDependencies = {}; - - var char_0 = 48; - - var char_9 = 57; - function makeLegalFunctionName(name) { - if (undefined === name) { - return '_unknown'; - } - name = name.replace(/[^a-zA-Z0-9_]/g, '$'); - var f = name.charCodeAt(0); - if (f >= char_0 && f <= char_9) { - return '_' + name; - } - return name; - } - function createNamedFunction(name, body) { - name = makeLegalFunctionName(name); - /*jshint evil:true*/ - return new Function( - "body", - "return function " + name + "() {\n" + - " \"use strict\";" + - " return body.apply(this, arguments);\n" + - "};\n" - )(body); - } - function extendError(baseErrorType, errorName) { - var errorClass = createNamedFunction(errorName, function(message) { - this.name = errorName; - this.message = message; - - var stack = (new Error(message)).stack; - if (stack !== undefined) { - this.stack = this.toString() + '\n' + - stack.replace(/^Error(:[^\n]*)?\n/, ''); - } - }); - errorClass.prototype = Object.create(baseErrorType.prototype); - errorClass.prototype.constructor = errorClass; - errorClass.prototype.toString = function() { - if (this.message === undefined) { - return this.name; - } else { - return this.name + ': ' + this.message; - } - }; - - return errorClass; - } - var BindingError = undefined; - function throwBindingError(message) { - throw new BindingError(message); - } - - var InternalError = undefined; - function throwInternalError(message) { - throw new InternalError(message); - } - function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) { - myTypes.forEach(function(type) { - typeDependencies[type] = dependentTypes; - }); - - function onComplete(typeConverters) { - var myTypeConverters = getTypeConverters(typeConverters); - if (myTypeConverters.length !== myTypes.length) { - throwInternalError('Mismatched type converter count'); - } - for (var i = 0; i < myTypes.length; ++i) { - registerType(myTypes[i], myTypeConverters[i]); - } - } - - var typeConverters = new Array(dependentTypes.length); - var unregisteredTypes = []; - var registered = 0; - dependentTypes.forEach((dt, i) => { - if (registeredTypes.hasOwnProperty(dt)) { - typeConverters[i] = registeredTypes[dt]; - } else { - unregisteredTypes.push(dt); - if (!awaitingDependencies.hasOwnProperty(dt)) { - awaitingDependencies[dt] = []; - } - awaitingDependencies[dt].push(() => { - typeConverters[i] = registeredTypes[dt]; - ++registered; - if (registered === unregisteredTypes.length) { - onComplete(typeConverters); - } - }); - } - }); - if (0 === unregisteredTypes.length) { - onComplete(typeConverters); - } - } - /** @param {Object=} options */ - function registerType(rawType, registeredInstance, options = {}) { - if (!('argPackAdvance' in registeredInstance)) { - throw new TypeError('registerType registeredInstance requires argPackAdvance'); - } - - var name = registeredInstance.name; - if (!rawType) { - throwBindingError('type "' + name + '" must have a positive integer typeid pointer'); - } - if (registeredTypes.hasOwnProperty(rawType)) { - if (options.ignoreDuplicateRegistrations) { - return; - } else { - throwBindingError("Cannot register type '" + name + "' twice"); - } - } - - registeredTypes[rawType] = registeredInstance; - delete typeDependencies[rawType]; - - if (awaitingDependencies.hasOwnProperty(rawType)) { - var callbacks = awaitingDependencies[rawType]; - delete awaitingDependencies[rawType]; - callbacks.forEach((cb) => cb()); - } - } - function __embind_register_bool(rawType, name, size, trueValue, falseValue) { - var shift = getShiftFromSize(size); - - name = readLatin1String(name); - registerType(rawType, { - name: name, - 'fromWireType': function(wt) { - // ambiguous emscripten ABI: sometimes return values are - // true or false, and sometimes integers (0 or 1) - return !!wt; - }, - 'toWireType': function(destructors, o) { - return o ? trueValue : falseValue; - }, - 'argPackAdvance': 8, - 'readValueFromPointer': function(pointer) { - // TODO: if heap is fixed (like in asm.js) this could be executed outside - var heap; - if (size === 1) { - heap = HEAP8; - } else if (size === 2) { - heap = HEAP16; - } else if (size === 4) { - heap = HEAP32; - } else { - throw new TypeError("Unknown boolean type size: " + name); - } - return this['fromWireType'](heap[pointer >> shift]); - }, - destructorFunction: null, // This type does not need a destructor - }); - } - - function ClassHandle_isAliasOf(other) { - if (!(this instanceof ClassHandle)) { - return false; - } - if (!(other instanceof ClassHandle)) { - return false; - } - - var leftClass = this.$$.ptrType.registeredClass; - var left = this.$$.ptr; - var rightClass = other.$$.ptrType.registeredClass; - var right = other.$$.ptr; - - while (leftClass.baseClass) { - left = leftClass.upcast(left); - leftClass = leftClass.baseClass; - } - - while (rightClass.baseClass) { - right = rightClass.upcast(right); - rightClass = rightClass.baseClass; - } - - return leftClass === rightClass && left === right; - } - - function shallowCopyInternalPointer(o) { - return { - count: o.count, - deleteScheduled: o.deleteScheduled, - preservePointerOnDelete: o.preservePointerOnDelete, - ptr: o.ptr, - ptrType: o.ptrType, - smartPtr: o.smartPtr, - smartPtrType: o.smartPtrType, - }; - } - - function throwInstanceAlreadyDeleted(obj) { - function getInstanceTypeName(handle) { - return handle.$$.ptrType.registeredClass.name; - } - throwBindingError(getInstanceTypeName(obj) + ' instance already deleted'); - } - - var finalizationRegistry = false; - - function detachFinalizer(handle) {} - - function runDestructor($$) { - if ($$.smartPtr) { - $$.smartPtrType.rawDestructor($$.smartPtr); - } else { - $$.ptrType.registeredClass.rawDestructor($$.ptr); - } - } - function releaseClassHandle($$) { - $$.count.value -= 1; - var toDelete = 0 === $$.count.value; - if (toDelete) { - runDestructor($$); - } - } - - function downcastPointer(ptr, ptrClass, desiredClass) { - if (ptrClass === desiredClass) { - return ptr; - } - if (undefined === desiredClass.baseClass) { - return null; // no conversion - } - - var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass); - if (rv === null) { - return null; - } - return desiredClass.downcast(rv); - } - - var registeredPointers = {}; - - function getInheritedInstanceCount() { - return Object.keys(registeredInstances).length; - } - - function getLiveInheritedInstances() { - var rv = []; - for (var k in registeredInstances) { - if (registeredInstances.hasOwnProperty(k)) { - rv.push(registeredInstances[k]); - } - } - return rv; - } - - var deletionQueue = []; - function flushPendingDeletes() { - while (deletionQueue.length) { - var obj = deletionQueue.pop(); - obj.$$.deleteScheduled = false; - obj['delete'](); - } - } - - var delayFunction = undefined; - function setDelayFunction(fn) { - delayFunction = fn; - if (deletionQueue.length && delayFunction) { - delayFunction(flushPendingDeletes); - } - } - function init_embind() { - Module['getInheritedInstanceCount'] = getInheritedInstanceCount; - Module['getLiveInheritedInstances'] = getLiveInheritedInstances; - Module['flushPendingDeletes'] = flushPendingDeletes; - Module['setDelayFunction'] = setDelayFunction; - } - var registeredInstances = {}; - - function getBasestPointer(class_, ptr) { - if (ptr === undefined) { - throwBindingError('ptr should not be undefined'); - } - while (class_.baseClass) { - ptr = class_.upcast(ptr); - class_ = class_.baseClass; - } - return ptr; - } - function getInheritedInstance(class_, ptr) { - ptr = getBasestPointer(class_, ptr); - return registeredInstances[ptr]; - } - - function makeClassHandle(prototype, record) { - if (!record.ptrType || !record.ptr) { - throwInternalError('makeClassHandle requires ptr and ptrType'); - } - var hasSmartPtrType = !!record.smartPtrType; - var hasSmartPtr = !!record.smartPtr; - if (hasSmartPtrType !== hasSmartPtr) { - throwInternalError('Both smartPtrType and smartPtr must be specified'); - } - record.count = { value: 1 }; - return attachFinalizer(Object.create(prototype, { - $$: { - value: record, - }, - })); - } - function RegisteredPointer_fromWireType(ptr) { - // ptr is a raw pointer (or a raw smartpointer) - - // rawPointer is a maybe-null raw pointer - var rawPointer = this.getPointee(ptr); - if (!rawPointer) { - this.destructor(ptr); - return null; - } - - var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer); - if (undefined !== registeredInstance) { - // JS object has been neutered, time to repopulate it - if (0 === registeredInstance.$$.count.value) { - registeredInstance.$$.ptr = rawPointer; - registeredInstance.$$.smartPtr = ptr; - return registeredInstance['clone'](); - } else { - // else, just increment reference count on existing object - // it already has a reference to the smart pointer - var rv = registeredInstance['clone'](); - this.destructor(ptr); - return rv; - } - } - - function makeDefaultHandle() { - if (this.isSmartPointer) { - return makeClassHandle(this.registeredClass.instancePrototype, { - ptrType: this.pointeeType, - ptr: rawPointer, - smartPtrType: this, - smartPtr: ptr, - }); - } else { - return makeClassHandle(this.registeredClass.instancePrototype, { - ptrType: this, - ptr: ptr, - }); - } - } - - var actualType = this.registeredClass.getActualType(rawPointer); - var registeredPointerRecord = registeredPointers[actualType]; - if (!registeredPointerRecord) { - return makeDefaultHandle.call(this); - } - - var toType; - if (this.isConst) { - toType = registeredPointerRecord.constPointerType; - } else { - toType = registeredPointerRecord.pointerType; - } - var dp = downcastPointer( - rawPointer, - this.registeredClass, - toType.registeredClass); - if (dp === null) { - return makeDefaultHandle.call(this); - } - if (this.isSmartPointer) { - return makeClassHandle(toType.registeredClass.instancePrototype, { - ptrType: toType, - ptr: dp, - smartPtrType: this, - smartPtr: ptr, - }); - } else { - return makeClassHandle(toType.registeredClass.instancePrototype, { - ptrType: toType, - ptr: dp, - }); - } - } - function attachFinalizer(handle) { - if ('undefined' === typeof FinalizationRegistry) { - attachFinalizer = (handle) => handle; - return handle; - } - // If the running environment has a FinalizationRegistry (see - // https://github.com/tc39/proposal-weakrefs), then attach finalizers - // for class handles. We check for the presence of FinalizationRegistry - // at run-time, not build-time. - finalizationRegistry = new FinalizationRegistry((info) => { - releaseClassHandle(info.$$); - }); - attachFinalizer = (handle) => { - var $$ = handle.$$; - var hasSmartPtr = !!$$.smartPtr; - if (hasSmartPtr) { - // We should not call the destructor on raw pointers in case other code expects the pointee to live - var info = { $$: $$ }; - finalizationRegistry.register(handle, info, handle); - } - return handle; - }; - detachFinalizer = (handle) => finalizationRegistry.unregister(handle); - return attachFinalizer(handle); - } - function ClassHandle_clone() { - if (!this.$$.ptr) { - throwInstanceAlreadyDeleted(this); - } - - if (this.$$.preservePointerOnDelete) { - this.$$.count.value += 1; - return this; - } else { - var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), { - $$: { - value: shallowCopyInternalPointer(this.$$), - } - })); - - clone.$$.count.value += 1; - clone.$$.deleteScheduled = false; - return clone; - } - } - - function ClassHandle_delete() { - if (!this.$$.ptr) { - throwInstanceAlreadyDeleted(this); - } - - if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { - throwBindingError('Object already scheduled for deletion'); - } - - detachFinalizer(this); - releaseClassHandle(this.$$); - - if (!this.$$.preservePointerOnDelete) { - this.$$.smartPtr = undefined; - this.$$.ptr = undefined; - } - } - - function ClassHandle_isDeleted() { - return !this.$$.ptr; - } - - function ClassHandle_deleteLater() { - if (!this.$$.ptr) { - throwInstanceAlreadyDeleted(this); - } - if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { - throwBindingError('Object already scheduled for deletion'); - } - deletionQueue.push(this); - if (deletionQueue.length === 1 && delayFunction) { - delayFunction(flushPendingDeletes); - } - this.$$.deleteScheduled = true; - return this; - } - function init_ClassHandle() { - ClassHandle.prototype['isAliasOf'] = ClassHandle_isAliasOf; - ClassHandle.prototype['clone'] = ClassHandle_clone; - ClassHandle.prototype['delete'] = ClassHandle_delete; - ClassHandle.prototype['isDeleted'] = ClassHandle_isDeleted; - ClassHandle.prototype['deleteLater'] = ClassHandle_deleteLater; - } - function ClassHandle() { - } - - function ensureOverloadTable(proto, methodName, humanName) { - if (undefined === proto[methodName].overloadTable) { - var prevFunc = proto[methodName]; - // Inject an overload resolver function that routes to the appropriate overload based on the number of arguments. - proto[methodName] = function() { - // TODO This check can be removed in -O3 level "unsafe" optimizations. - if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) { - throwBindingError("Function '" + humanName + "' called with an invalid number of arguments (" + arguments.length + ") - expects one of (" + proto[methodName].overloadTable + ")!"); - } - return proto[methodName].overloadTable[arguments.length].apply(this, arguments); - }; - // Move the previous function into the overload table. - proto[methodName].overloadTable = []; - proto[methodName].overloadTable[prevFunc.argCount] = prevFunc; - } - } - /** @param {number=} numArguments */ - function exposePublicSymbol(name, value, numArguments) { - if (Module.hasOwnProperty(name)) { - if (undefined === numArguments || (undefined !== Module[name].overloadTable && undefined !== Module[name].overloadTable[numArguments])) { - throwBindingError("Cannot register public name '" + name + "' twice"); - } - - // We are exposing a function with the same name as an existing function. Create an overload table and a function selector - // that routes between the two. - ensureOverloadTable(Module, name, name); - if (Module.hasOwnProperty(numArguments)) { - throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + numArguments + ")!"); - } - // Add the new function into the overload table. - Module[name].overloadTable[numArguments] = value; - } - else { - Module[name] = value; - if (undefined !== numArguments) { - Module[name].numArguments = numArguments; - } - } - } - - /** @constructor */ - function RegisteredClass(name, - constructor, - instancePrototype, - rawDestructor, - baseClass, - getActualType, - upcast, - downcast) { - this.name = name; - this.constructor = constructor; - this.instancePrototype = instancePrototype; - this.rawDestructor = rawDestructor; - this.baseClass = baseClass; - this.getActualType = getActualType; - this.upcast = upcast; - this.downcast = downcast; - this.pureVirtualFunctions = []; - } - - function upcastPointer(ptr, ptrClass, desiredClass) { - while (ptrClass !== desiredClass) { - if (!ptrClass.upcast) { - throwBindingError("Expected null or instance of " + desiredClass.name + ", got an instance of " + ptrClass.name); - } - ptr = ptrClass.upcast(ptr); - ptrClass = ptrClass.baseClass; - } - return ptr; - } - function constNoSmartPtrRawPointerToWireType(destructors, handle) { - if (handle === null) { - if (this.isReference) { - throwBindingError('null is not a valid ' + this.name); - } - return 0; - } - - if (!handle.$$) { - throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); - } - if (!handle.$$.ptr) { - throwBindingError('Cannot pass deleted object as a pointer of type ' + this.name); - } - var handleClass = handle.$$.ptrType.registeredClass; - var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); - return ptr; - } - - function genericPointerToWireType(destructors, handle) { - var ptr; - if (handle === null) { - if (this.isReference) { - throwBindingError('null is not a valid ' + this.name); - } - - if (this.isSmartPointer) { - ptr = this.rawConstructor(); - if (destructors !== null) { - destructors.push(this.rawDestructor, ptr); - } - return ptr; - } else { - return 0; - } - } - - if (!handle.$$) { - throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); - } - if (!handle.$$.ptr) { - throwBindingError('Cannot pass deleted object as a pointer of type ' + this.name); - } - if (!this.isConst && handle.$$.ptrType.isConst) { - throwBindingError('Cannot convert argument of type ' + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + ' to parameter type ' + this.name); - } - var handleClass = handle.$$.ptrType.registeredClass; - ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); - - if (this.isSmartPointer) { - // TODO: this is not strictly true - // We could support BY_EMVAL conversions from raw pointers to smart pointers - // because the smart pointer can hold a reference to the handle - if (undefined === handle.$$.smartPtr) { - throwBindingError('Passing raw pointer to smart pointer is illegal'); - } - - switch (this.sharingPolicy) { - case 0: // NONE - // no upcasting - if (handle.$$.smartPtrType === this) { - ptr = handle.$$.smartPtr; - } else { - throwBindingError('Cannot convert argument of type ' + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + ' to parameter type ' + this.name); - } - break; - - case 1: // INTRUSIVE - ptr = handle.$$.smartPtr; - break; - - case 2: // BY_EMVAL - if (handle.$$.smartPtrType === this) { - ptr = handle.$$.smartPtr; - } else { - var clonedHandle = handle['clone'](); - ptr = this.rawShare( - ptr, - Emval.toHandle(function() { - clonedHandle['delete'](); - }) - ); - if (destructors !== null) { - destructors.push(this.rawDestructor, ptr); - } - } - break; - - default: - throwBindingError('Unsupporting sharing policy'); - } - } - return ptr; - } - - function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) { - if (handle === null) { - if (this.isReference) { - throwBindingError('null is not a valid ' + this.name); - } - return 0; - } - - if (!handle.$$) { - throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); - } - if (!handle.$$.ptr) { - throwBindingError('Cannot pass deleted object as a pointer of type ' + this.name); - } - if (handle.$$.ptrType.isConst) { - throwBindingError('Cannot convert argument of type ' + handle.$$.ptrType.name + ' to parameter type ' + this.name); - } - var handleClass = handle.$$.ptrType.registeredClass; - var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); - return ptr; - } - - function simpleReadValueFromPointer(pointer) { - return this['fromWireType'](HEAPU32[pointer >> 2]); - } - - function RegisteredPointer_getPointee(ptr) { - if (this.rawGetPointee) { - ptr = this.rawGetPointee(ptr); - } - return ptr; - } - - function RegisteredPointer_destructor(ptr) { - if (this.rawDestructor) { - this.rawDestructor(ptr); - } - } - - function RegisteredPointer_deleteObject(handle) { - if (handle !== null) { - handle['delete'](); - } - } - function init_RegisteredPointer() { - RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee; - RegisteredPointer.prototype.destructor = RegisteredPointer_destructor; - RegisteredPointer.prototype['argPackAdvance'] = 8; - RegisteredPointer.prototype['readValueFromPointer'] = simpleReadValueFromPointer; - RegisteredPointer.prototype['deleteObject'] = RegisteredPointer_deleteObject; - RegisteredPointer.prototype['fromWireType'] = RegisteredPointer_fromWireType; - } - /** @constructor - @param {*=} pointeeType, - @param {*=} sharingPolicy, - @param {*=} rawGetPointee, - @param {*=} rawConstructor, - @param {*=} rawShare, - @param {*=} rawDestructor, - */ - function RegisteredPointer( - name, - registeredClass, - isReference, - isConst, - - // smart pointer properties - isSmartPointer, - pointeeType, - sharingPolicy, - rawGetPointee, - rawConstructor, - rawShare, - rawDestructor - ) { - this.name = name; - this.registeredClass = registeredClass; - this.isReference = isReference; - this.isConst = isConst; - - // smart pointer properties - this.isSmartPointer = isSmartPointer; - this.pointeeType = pointeeType; - this.sharingPolicy = sharingPolicy; - this.rawGetPointee = rawGetPointee; - this.rawConstructor = rawConstructor; - this.rawShare = rawShare; - this.rawDestructor = rawDestructor; - - if (!isSmartPointer && registeredClass.baseClass === undefined) { - if (isConst) { - this['toWireType'] = constNoSmartPtrRawPointerToWireType; - this.destructorFunction = null; - } else { - this['toWireType'] = nonConstNoSmartPtrRawPointerToWireType; - this.destructorFunction = null; - } - } else { - this['toWireType'] = genericPointerToWireType; - // Here we must leave this.destructorFunction undefined, since whether genericPointerToWireType returns - // a pointer that needs to be freed up is runtime-dependent, and cannot be evaluated at registration time. - // TODO: Create an alternative mechanism that allows removing the use of var destructors = []; array in - // craftInvokerFunction altogether. - } - } - - /** @param {number=} numArguments */ - function replacePublicSymbol(name, value, numArguments) { - if (!Module.hasOwnProperty(name)) { - throwInternalError('Replacing nonexistant public symbol'); - } - // If there's an overload table for this symbol, replace the symbol in the overload table instead. - if (undefined !== Module[name].overloadTable && undefined !== numArguments) { - Module[name].overloadTable[numArguments] = value; - } - else { - Module[name] = value; - Module[name].argCount = numArguments; - } - } - - function dynCallLegacy(sig, ptr, args) { - var f = Module["dynCall_" + sig]; - return args && args.length ? f.apply(null, [ptr].concat(args)) : f.call(null, ptr); - } - /** @param {Object=} args */ - function dynCall(sig, ptr, args) { - // Without WASM_BIGINT support we cannot directly call function with i64 as - // part of thier signature, so we rely the dynCall functions generated by - // wasm-emscripten-finalize - if (sig.includes('j')) { - return dynCallLegacy(sig, ptr, args); - } - return getWasmTableEntry(ptr).apply(null, args) - } - function getDynCaller(sig, ptr) { - var argCache = []; - return function() { - argCache.length = 0; - Object.assign(argCache, arguments); - return dynCall(sig, ptr, argCache); - }; - } - function embind__requireFunction(signature, rawFunction) { - signature = readLatin1String(signature); - - function makeDynCaller() { - if (signature.includes('j')) { - return getDynCaller(signature, rawFunction); - } - return getWasmTableEntry(rawFunction); - } - - var fp = makeDynCaller(); - if (typeof fp != "function") { - throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction); - } - return fp; - } - - var UnboundTypeError = undefined; - - function getTypeName(type) { - var ptr = ___getTypeName(type); - var rv = readLatin1String(ptr); - _free(ptr); - return rv; - } - function throwUnboundTypeError(message, types) { - var unboundTypes = []; - var seen = {}; - function visit(type) { - if (seen[type]) { - return; - } - if (registeredTypes[type]) { - return; - } - if (typeDependencies[type]) { - typeDependencies[type].forEach(visit); - return; - } - unboundTypes.push(type); - seen[type] = true; - } - types.forEach(visit); - - throw new UnboundTypeError(message + ': ' + unboundTypes.map(getTypeName).join([', '])); - } - function __embind_register_class(rawType, - rawPointerType, - rawConstPointerType, - baseClassRawType, - getActualTypeSignature, - getActualType, - upcastSignature, - upcast, - downcastSignature, - downcast, - name, - destructorSignature, - rawDestructor) { - name = readLatin1String(name); - getActualType = embind__requireFunction(getActualTypeSignature, getActualType); - if (upcast) { - upcast = embind__requireFunction(upcastSignature, upcast); - } - if (downcast) { - downcast = embind__requireFunction(downcastSignature, downcast); - } - rawDestructor = embind__requireFunction(destructorSignature, rawDestructor); - var legalFunctionName = makeLegalFunctionName(name); - - exposePublicSymbol(legalFunctionName, function() { - // this code cannot run if baseClassRawType is zero - throwUnboundTypeError('Cannot construct ' + name + ' due to unbound types', [baseClassRawType]); - }); - - whenDependentTypesAreResolved( - [rawType, rawPointerType, rawConstPointerType], - baseClassRawType ? [baseClassRawType] : [], - function(base) { - base = base[0]; - - var baseClass; - var basePrototype; - if (baseClassRawType) { - baseClass = base.registeredClass; - basePrototype = baseClass.instancePrototype; - } else { - basePrototype = ClassHandle.prototype; - } - - var constructor = createNamedFunction(legalFunctionName, function() { - if (Object.getPrototypeOf(this) !== instancePrototype) { - throw new BindingError("Use 'new' to construct " + name); - } - if (undefined === registeredClass.constructor_body) { - throw new BindingError(name + " has no accessible constructor"); - } - var body = registeredClass.constructor_body[arguments.length]; - if (undefined === body) { - throw new BindingError("Tried to invoke ctor of " + name + " with invalid number of parameters (" + arguments.length + ") - expected (" + Object.keys(registeredClass.constructor_body).toString() + ") parameters instead!"); - } - return body.apply(this, arguments); - }); - - var instancePrototype = Object.create(basePrototype, { - constructor: { value: constructor }, - }); - - constructor.prototype = instancePrototype; - - var registeredClass = new RegisteredClass(name, - constructor, - instancePrototype, - rawDestructor, - baseClass, - getActualType, - upcast, - downcast); - - var referenceConverter = new RegisteredPointer(name, - registeredClass, - true, - false, - false); - - var pointerConverter = new RegisteredPointer(name + '*', - registeredClass, - false, - false, - false); - - var constPointerConverter = new RegisteredPointer(name + ' const*', - registeredClass, - false, - true, - false); - - registeredPointers[rawType] = { - pointerType: pointerConverter, - constPointerType: constPointerConverter - }; - - replacePublicSymbol(legalFunctionName, constructor); - - return [referenceConverter, pointerConverter, constPointerConverter]; - } - ); - } - - function heap32VectorToArray(count, firstElement) { - var array = []; - for (var i = 0; i < count; i++) { - array.push(HEAP32[(firstElement >> 2) + i]); - } - return array; - } - - function runDestructors(destructors) { - while (destructors.length) { - var ptr = destructors.pop(); - var del = destructors.pop(); - del(ptr); - } - } - function __embind_register_class_constructor( - rawClassType, - argCount, - rawArgTypesAddr, - invokerSignature, - invoker, - rawConstructor - ) { - assert(argCount > 0); - var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); - invoker = embind__requireFunction(invokerSignature, invoker); - var args = [rawConstructor]; - var destructors = []; - - whenDependentTypesAreResolved([], [rawClassType], function(classType) { - classType = classType[0]; - var humanName = 'constructor ' + classType.name; - - if (undefined === classType.registeredClass.constructor_body) { - classType.registeredClass.constructor_body = []; - } - if (undefined !== classType.registeredClass.constructor_body[argCount - 1]) { - throw new BindingError("Cannot register multiple constructors with identical number of parameters (" + (argCount-1) + ") for class '" + classType.name + "'! Overload resolution is currently only performed using the parameter count, not actual type info!"); - } - classType.registeredClass.constructor_body[argCount - 1] = () => { - throwUnboundTypeError('Cannot construct ' + classType.name + ' due to unbound types', rawArgTypes); - }; - - whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) { - // Insert empty slot for context type (argTypes[1]). - argTypes.splice(1, 0, null); - classType.registeredClass.constructor_body[argCount - 1] = craftInvokerFunction(humanName, argTypes, null, invoker, rawConstructor); - return []; - }); - return []; - }); - } - - function new_(constructor, argumentList) { - if (!(constructor instanceof Function)) { - throw new TypeError('new_ called with constructor type ' + typeof(constructor) + " which is not a function"); - } - /* - * Previously, the following line was just: - * function dummy() {}; - * Unfortunately, Chrome was preserving 'dummy' as the object's name, even - * though at creation, the 'dummy' has the correct constructor name. Thus, - * objects created with IMVU.new would show up in the debugger as 'dummy', - * which isn't very helpful. Using IMVU.createNamedFunction addresses the - * issue. Doublely-unfortunately, there's no way to write a test for this - * behavior. -NRD 2013.02.22 - */ - var dummy = createNamedFunction(constructor.name || 'unknownFunctionName', function(){}); - dummy.prototype = constructor.prototype; - var obj = new dummy; - - var r = constructor.apply(obj, argumentList); - return (r instanceof Object) ? r : obj; - } - function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) { - // humanName: a human-readable string name for the function to be generated. - // argTypes: An array that contains the embind type objects for all types in the function signature. - // argTypes[0] is the type object for the function return value. - // argTypes[1] is the type object for function this object/class type, or null if not crafting an invoker for a class method. - // argTypes[2...] are the actual function parameters. - // classType: The embind type object for the class to be bound, or null if this is not a method of a class. - // cppInvokerFunc: JS Function object to the C++-side function that interops into C++ code. - // cppTargetFunc: Function pointer (an integer to FUNCTION_TABLE) to the target C++ function the cppInvokerFunc will end up calling. - var argCount = argTypes.length; - - if (argCount < 2) { - throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!"); - } - - var isClassMethodFunc = (argTypes[1] !== null && classType !== null); - - // Free functions with signature "void function()" do not need an invoker that marshalls between wire types. - // TODO: This omits argument count check - enable only at -O3 or similar. - // if (ENABLE_UNSAFE_OPTS && argCount == 2 && argTypes[0].name == "void" && !isClassMethodFunc) { - // return FUNCTION_TABLE[fn]; - // } - - // Determine if we need to use a dynamic stack to store the destructors for the function parameters. - // TODO: Remove this completely once all function invokers are being dynamically generated. - var needsDestructorStack = false; - - for (var i = 1; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here. - if (argTypes[i] !== null && argTypes[i].destructorFunction === undefined) { // The type does not define a destructor function - must use dynamic stack - needsDestructorStack = true; - break; - } - } - - var returns = (argTypes[0].name !== "void"); - - var argsList = ""; - var argsListWired = ""; - for (var i = 0; i < argCount - 2; ++i) { - argsList += (i!==0?", ":"")+"arg"+i; - argsListWired += (i!==0?", ":"")+"arg"+i+"Wired"; - } - - var invokerFnBody = - "return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n" + - "if (arguments.length !== "+(argCount - 2)+") {\n" + - "throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount - 2)+" args!');\n" + - "}\n"; - - if (needsDestructorStack) { - invokerFnBody += "var destructors = [];\n"; - } - - var dtorStack = needsDestructorStack ? "destructors" : "null"; - var args1 = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"]; - var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]]; - - if (isClassMethodFunc) { - invokerFnBody += "var thisWired = classParam.toWireType("+dtorStack+", this);\n"; - } - - for (var i = 0; i < argCount - 2; ++i) { - invokerFnBody += "var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n"; - args1.push("argType"+i); - args2.push(argTypes[i+2]); - } - - if (isClassMethodFunc) { - argsListWired = "thisWired" + (argsListWired.length > 0 ? ", " : "") + argsListWired; - } - - invokerFnBody += - (returns?"var rv = ":"") + "invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n"; - - if (needsDestructorStack) { - invokerFnBody += "runDestructors(destructors);\n"; - } else { - for (var i = isClassMethodFunc?1:2; i < argTypes.length; ++i) { // Skip return value at index 0 - it's not deleted here. Also skip class type if not a method. - var paramName = (i === 1 ? "thisWired" : ("arg"+(i - 2)+"Wired")); - if (argTypes[i].destructorFunction !== null) { - invokerFnBody += paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n"; - args1.push(paramName+"_dtor"); - args2.push(argTypes[i].destructorFunction); - } - } - } - - if (returns) { - invokerFnBody += "var ret = retType.fromWireType(rv);\n" + - "return ret;\n"; - } else { - } - - invokerFnBody += "}\n"; - - args1.push(invokerFnBody); - - var invokerFunction = new_(Function, args1).apply(null, args2); - return invokerFunction; - } - function __embind_register_class_function(rawClassType, - methodName, - argCount, - rawArgTypesAddr, // [ReturnType, ThisType, Args...] - invokerSignature, - rawInvoker, - context, - isPureVirtual) { - var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); - methodName = readLatin1String(methodName); - rawInvoker = embind__requireFunction(invokerSignature, rawInvoker); - - whenDependentTypesAreResolved([], [rawClassType], function(classType) { - classType = classType[0]; - var humanName = classType.name + '.' + methodName; - - if (methodName.startsWith("@@")) { - methodName = Symbol[methodName.substring(2)]; - } - - if (isPureVirtual) { - classType.registeredClass.pureVirtualFunctions.push(methodName); - } - - function unboundTypesHandler() { - throwUnboundTypeError('Cannot call ' + humanName + ' due to unbound types', rawArgTypes); - } - - var proto = classType.registeredClass.instancePrototype; - var method = proto[methodName]; - if (undefined === method || (undefined === method.overloadTable && method.className !== classType.name && method.argCount === argCount - 2)) { - // This is the first overload to be registered, OR we are replacing a - // function in the base class with a function in the derived class. - unboundTypesHandler.argCount = argCount - 2; - unboundTypesHandler.className = classType.name; - proto[methodName] = unboundTypesHandler; - } else { - // There was an existing function with the same name registered. Set up - // a function overload routing table. - ensureOverloadTable(proto, methodName, humanName); - proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler; - } - - whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) { - var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context); - - // Replace the initial unbound-handler-stub function with the appropriate member function, now that all types - // are resolved. If multiple overloads are registered for this function, the function goes into an overload table. - if (undefined === proto[methodName].overloadTable) { - // Set argCount in case an overload is registered later - memberFunction.argCount = argCount - 2; - proto[methodName] = memberFunction; - } else { - proto[methodName].overloadTable[argCount - 2] = memberFunction; - } - - return []; - }); - return []; - }); - } - - var emval_free_list = []; - - var emval_handle_array = [{},{value:undefined},{value:null},{value:true},{value:false}]; - function __emval_decref(handle) { - if (handle > 4 && 0 === --emval_handle_array[handle].refcount) { - emval_handle_array[handle] = undefined; - emval_free_list.push(handle); - } - } - - function count_emval_handles() { - var count = 0; - for (var i = 5; i < emval_handle_array.length; ++i) { - if (emval_handle_array[i] !== undefined) { - ++count; - } - } - return count; - } - - function get_first_emval() { - for (var i = 5; i < emval_handle_array.length; ++i) { - if (emval_handle_array[i] !== undefined) { - return emval_handle_array[i]; - } - } - return null; - } - function init_emval() { - Module['count_emval_handles'] = count_emval_handles; - Module['get_first_emval'] = get_first_emval; - } - var Emval = {toValue:(handle) => { - if (!handle) { - throwBindingError('Cannot use deleted val. handle = ' + handle); - } - return emval_handle_array[handle].value; - },toHandle:(value) => { - switch (value) { - case undefined: return 1; - case null: return 2; - case true: return 3; - case false: return 4; - default:{ - var handle = emval_free_list.length ? - emval_free_list.pop() : - emval_handle_array.length; - - emval_handle_array[handle] = {refcount: 1, value: value}; - return handle; - } - } - }}; - function __embind_register_emval(rawType, name) { - name = readLatin1String(name); - registerType(rawType, { - name: name, - 'fromWireType': function(handle) { - var rv = Emval.toValue(handle); - __emval_decref(handle); - return rv; - }, - 'toWireType': function(destructors, value) { - return Emval.toHandle(value); - }, - 'argPackAdvance': 8, - 'readValueFromPointer': simpleReadValueFromPointer, - destructorFunction: null, // This type does not need a destructor - - // TODO: do we need a deleteObject here? write a test where - // emval is passed into JS via an interface - }); - } - - function _embind_repr(v) { - if (v === null) { - return 'null'; - } - var t = typeof v; - if (t === 'object' || t === 'array' || t === 'function') { - return v.toString(); - } else { - return '' + v; - } - } - - function floatReadValueFromPointer(name, shift) { - switch (shift) { - case 2: return function(pointer) { - return this['fromWireType'](HEAPF32[pointer >> 2]); - }; - case 3: return function(pointer) { - return this['fromWireType'](HEAPF64[pointer >> 3]); - }; - default: - throw new TypeError("Unknown float type: " + name); - } - } - function __embind_register_float(rawType, name, size) { - var shift = getShiftFromSize(size); - name = readLatin1String(name); - registerType(rawType, { - name: name, - 'fromWireType': function(value) { - return value; - }, - 'toWireType': function(destructors, value) { - // The VM will perform JS to Wasm value conversion, according to the spec: - // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue - return value; - }, - 'argPackAdvance': 8, - 'readValueFromPointer': floatReadValueFromPointer(name, shift), - destructorFunction: null, // This type does not need a destructor - }); - } - - function __embind_register_function(name, argCount, rawArgTypesAddr, signature, rawInvoker, fn) { - var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr); - name = readLatin1String(name); - - rawInvoker = embind__requireFunction(signature, rawInvoker); - - exposePublicSymbol(name, function() { - throwUnboundTypeError('Cannot call ' + name + ' due to unbound types', argTypes); - }, argCount - 1); - - whenDependentTypesAreResolved([], argTypes, function(argTypes) { - var invokerArgsArray = [argTypes[0] /* return value */, null /* no class 'this'*/].concat(argTypes.slice(1) /* actual params */); - replacePublicSymbol(name, craftInvokerFunction(name, invokerArgsArray, null /* no class 'this'*/, rawInvoker, fn), argCount - 1); - return []; - }); - } - - function integerReadValueFromPointer(name, shift, signed) { - // integers are quite common, so generate very specialized functions - switch (shift) { - case 0: return signed ? - function readS8FromPointer(pointer) { return HEAP8[pointer]; } : - function readU8FromPointer(pointer) { return HEAPU8[pointer]; }; - case 1: return signed ? - function readS16FromPointer(pointer) { return HEAP16[pointer >> 1]; } : - function readU16FromPointer(pointer) { return HEAPU16[pointer >> 1]; }; - case 2: return signed ? - function readS32FromPointer(pointer) { return HEAP32[pointer >> 2]; } : - function readU32FromPointer(pointer) { return HEAPU32[pointer >> 2]; }; - default: - throw new TypeError("Unknown integer type: " + name); - } - } - function __embind_register_integer(primitiveType, name, size, minRange, maxRange) { - name = readLatin1String(name); - if (maxRange === -1) { // LLVM doesn't have signed and unsigned 32-bit types, so u32 literals come out as 'i32 -1'. Always treat those as max u32. - maxRange = 4294967295; - } - - var shift = getShiftFromSize(size); - - var fromWireType = (value) => value; - - if (minRange === 0) { - var bitshift = 32 - 8*size; - fromWireType = (value) => (value << bitshift) >>> bitshift; - } - - var isUnsignedType = (name.includes('unsigned')); - var checkAssertions = (value, toTypeName) => { - } - var toWireType; - if (isUnsignedType) { - toWireType = function(destructors, value) { - checkAssertions(value, this.name); - return value >>> 0; - } - } else { - toWireType = function(destructors, value) { - checkAssertions(value, this.name); - // The VM will perform JS to Wasm value conversion, according to the spec: - // https://www.w3.org/TR/wasm-js-api-1/#towebassemblyvalue - return value; - } - } - registerType(primitiveType, { - name: name, - 'fromWireType': fromWireType, - 'toWireType': toWireType, - 'argPackAdvance': 8, - 'readValueFromPointer': integerReadValueFromPointer(name, shift, minRange !== 0), - destructorFunction: null, // This type does not need a destructor - }); - } - - function __embind_register_memory_view(rawType, dataTypeIndex, name) { - var typeMapping = [ - Int8Array, - Uint8Array, - Int16Array, - Uint16Array, - Int32Array, - Uint32Array, - Float32Array, - Float64Array, - ]; - - var TA = typeMapping[dataTypeIndex]; - - function decodeMemoryView(handle) { - handle = handle >> 2; - var heap = HEAPU32; - var size = heap[handle]; // in elements - var data = heap[handle + 1]; // byte offset into emscripten heap - return new TA(buffer, data, size); - } - - name = readLatin1String(name); - registerType(rawType, { - name: name, - 'fromWireType': decodeMemoryView, - 'argPackAdvance': 8, - 'readValueFromPointer': decodeMemoryView, - }, { - ignoreDuplicateRegistrations: true, - }); - } - - function __embind_register_std_string(rawType, name) { - name = readLatin1String(name); - var stdStringIsUTF8 - //process only std::string bindings with UTF8 support, in contrast to e.g. std::basic_string - = (name === "std::string"); - - registerType(rawType, { - name: name, - 'fromWireType': function(value) { - var length = HEAPU32[value >> 2]; - - var str; - if (stdStringIsUTF8) { - var decodeStartPtr = value + 4; - // Looping here to support possible embedded '0' bytes - for (var i = 0; i <= length; ++i) { - var currentBytePtr = value + 4 + i; - if (i == length || HEAPU8[currentBytePtr] == 0) { - var maxRead = currentBytePtr - decodeStartPtr; - var stringSegment = UTF8ToString(decodeStartPtr, maxRead); - if (str === undefined) { - str = stringSegment; - } else { - str += String.fromCharCode(0); - str += stringSegment; - } - decodeStartPtr = currentBytePtr + 1; - } - } - } else { - var a = new Array(length); - for (var i = 0; i < length; ++i) { - a[i] = String.fromCharCode(HEAPU8[value + 4 + i]); - } - str = a.join(''); - } - - _free(value); - - return str; - }, - 'toWireType': function(destructors, value) { - if (value instanceof ArrayBuffer) { - value = new Uint8Array(value); - } - - var getLength; - var valueIsOfTypeString = (typeof value == 'string'); - - if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) { - throwBindingError('Cannot pass non-string to std::string'); - } - if (stdStringIsUTF8 && valueIsOfTypeString) { - getLength = () => lengthBytesUTF8(value); - } else { - getLength = () => value.length; - } - - // assumes 4-byte alignment - var length = getLength(); - var ptr = _malloc(4 + length + 1); - HEAPU32[ptr >> 2] = length; - if (stdStringIsUTF8 && valueIsOfTypeString) { - stringToUTF8(value, ptr + 4, length + 1); - } else { - if (valueIsOfTypeString) { - for (var i = 0; i < length; ++i) { - var charCode = value.charCodeAt(i); - if (charCode > 255) { - _free(ptr); - throwBindingError('String has UTF-16 code units that do not fit in 8 bits'); - } - HEAPU8[ptr + 4 + i] = charCode; - } - } else { - for (var i = 0; i < length; ++i) { - HEAPU8[ptr + 4 + i] = value[i]; - } - } - } - - if (destructors !== null) { - destructors.push(_free, ptr); - } - return ptr; - }, - 'argPackAdvance': 8, - 'readValueFromPointer': simpleReadValueFromPointer, - destructorFunction: function(ptr) { _free(ptr); }, - }); - } - - function __embind_register_std_wstring(rawType, charSize, name) { - name = readLatin1String(name); - var decodeString, encodeString, getHeap, lengthBytesUTF, shift; - if (charSize === 2) { - decodeString = UTF16ToString; - encodeString = stringToUTF16; - lengthBytesUTF = lengthBytesUTF16; - getHeap = () => HEAPU16; - shift = 1; - } else if (charSize === 4) { - decodeString = UTF32ToString; - encodeString = stringToUTF32; - lengthBytesUTF = lengthBytesUTF32; - getHeap = () => HEAPU32; - shift = 2; - } - registerType(rawType, { - name: name, - 'fromWireType': function(value) { - // Code mostly taken from _embind_register_std_string fromWireType - var length = HEAPU32[value >> 2]; - var HEAP = getHeap(); - var str; - - var decodeStartPtr = value + 4; - // Looping here to support possible embedded '0' bytes - for (var i = 0; i <= length; ++i) { - var currentBytePtr = value + 4 + i * charSize; - if (i == length || HEAP[currentBytePtr >> shift] == 0) { - var maxReadBytes = currentBytePtr - decodeStartPtr; - var stringSegment = decodeString(decodeStartPtr, maxReadBytes); - if (str === undefined) { - str = stringSegment; - } else { - str += String.fromCharCode(0); - str += stringSegment; - } - decodeStartPtr = currentBytePtr + charSize; - } - } - - _free(value); - - return str; - }, - 'toWireType': function(destructors, value) { - if (!(typeof value == 'string')) { - throwBindingError('Cannot pass non-string to C++ string type ' + name); - } - - // assumes 4-byte alignment - var length = lengthBytesUTF(value); - var ptr = _malloc(4 + length + charSize); - HEAPU32[ptr >> 2] = length >> shift; - - encodeString(value, ptr + 4, length + charSize); - - if (destructors !== null) { - destructors.push(_free, ptr); - } - return ptr; - }, - 'argPackAdvance': 8, - 'readValueFromPointer': simpleReadValueFromPointer, - destructorFunction: function(ptr) { _free(ptr); }, - }); - } - - function __embind_register_void(rawType, name) { - name = readLatin1String(name); - registerType(rawType, { - isVoid: true, // void return values can be optimized out sometimes - name: name, - 'argPackAdvance': 0, - 'fromWireType': function() { - return undefined; - }, - 'toWireType': function(destructors, o) { - // TODO: assert if anything else is given? - return undefined; - }, - }); - } - - - function __emval_incref(handle) { - if (handle > 4) { - emval_handle_array[handle].refcount += 1; - } - } - - function requireRegisteredType(rawType, humanName) { - var impl = registeredTypes[rawType]; - if (undefined === impl) { - throwBindingError(humanName + " has unknown type " + getTypeName(rawType)); - } - return impl; - } - function __emval_take_value(type, argv) { - type = requireRegisteredType(type, '_emval_take_value'); - var v = type['readValueFromPointer'](argv); - return Emval.toHandle(v); - } - - function __mmap_js(len, prot, flags, fd, off, allocated) { - try { - - var stream = FS.getStream(fd); - if (!stream) return -8; - var res = FS.mmap(stream, len, off, prot, flags); - var ptr = res.ptr; - HEAP32[((allocated)>>2)] = res.allocated; - return ptr; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return -e.errno; - } - } - - function __munmap_js(addr, len, prot, flags, fd, offset) { - try { - - var stream = FS.getStream(fd); - if (stream) { - if (prot & 2) { - SYSCALLS.doMsync(addr, stream, len, flags, offset); - } - FS.munmap(stream); - } - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return -e.errno; - } - } - - function _abort() { - abort(''); - } - - function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.copyWithin(dest, src, src + num); - } - - function getHeapMax() { - // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate - // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side - // for any code that deals with heap sizes, which would require special - // casing all heap size related code to treat 0 specially. - return 2147483648; - } - - function emscripten_realloc_buffer(size) { - try { - // round size grow request up to wasm page size (fixed 64KB per spec) - wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size - updateGlobalBufferAndViews(wasmMemory.buffer); - return 1 /*success*/; - } catch(e) { - } - // implicit 0 return to save code size (caller will cast "undefined" into 0 - // anyhow) - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = HEAPU8.length; - requestedSize = requestedSize >>> 0; - // With multithreaded builds, races can happen (another thread might increase the size - // in between), so return a failure, and let the caller retry. - - // Memory resize rules: - // 1. Always increase heap size to at least the requested size, rounded up - // to next page multiple. - // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap - // geometrically: increase the heap size according to - // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most - // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). - // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap - // linearly: increase the heap size by at least - // MEMORY_GROWTH_LINEAR_STEP bytes. - // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by - // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest - // 4. If we were unable to allocate as much memory, it may be due to - // over-eager decision to excessively reserve due to (3) above. - // Hence if an allocation fails, cut down on the amount of excess - // growth, in an attempt to succeed to perform a smaller allocation. - - // A limit is set for how much we can grow. We should not exceed that - // (the wasm binary specifies it, so if we tried, we'd fail anyhow). - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - - let alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; - - // Loop through potential heap size increases. If we attempt a too eager - // reservation that fails, cut down on the attempted size and reserve a - // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) - for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { - var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth - // but limit overreserving (default to capping at +96MB overgrowth at most) - overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); - - var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - - var replacement = emscripten_realloc_buffer(newSize); - if (replacement) { - - return true; - } - } - return false; - } - - var ENV = {}; - - function getExecutableName() { - return thisProgram || './this.program'; - } - function 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; - } - function _environ_get(__environ, environ_buf) { - var bufSize = 0; - getEnvStrings().forEach(function(string, i) { - var ptr = environ_buf + bufSize; - HEAPU32[(((__environ)+(i*4))>>2)] = ptr; - writeAsciiToMemory(string, ptr); - bufSize += string.length + 1; - }); - return 0; - } - - function _environ_sizes_get(penviron_count, penviron_buf_size) { - var strings = getEnvStrings(); - HEAPU32[((penviron_count)>>2)] = strings.length; - var bufSize = 0; - strings.forEach(function(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 instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - /** @param {number=} offset */ - function 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 - } - return ret; - } - - function convertI32PairToI53Checked(lo, hi) { - return ((hi + 0x200000) >>> 0 < 0x400001 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; - } - function _fd_pread(fd, iov, iovcnt, offset_low, offset_high, pnum) { - try { - - var offset = convertI32PairToI53Checked(offset_low, offset_high); if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd) - var num = doReadv(stream, iov, iovcnt, offset); - HEAP32[((pnum)>>2)] = num; - return 0; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - /** @param {number=} offset */ - function 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; - } - return ret; - } - function _fd_pwrite(fd, iov, iovcnt, offset_low, offset_high, pnum) { - try { - - var offset = convertI32PairToI53Checked(offset_low, offset_high); if (isNaN(offset)) return 61; - var stream = SYSCALLS.getStreamFromFD(fd) - var num = doWritev(stream, iov, iovcnt, offset); - HEAP32[((pnum)>>2)] = num; - return 0; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _fd_read(fd, iov, iovcnt, pnum) { - try { - - var stream = SYSCALLS.getStreamFromFD(fd); - var num = doReadv(stream, iov, iovcnt); - HEAP32[((pnum)>>2)] = num; - return 0; - } catch (e) { - if (typeof FS == 'undefined' || !(e instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - try { - - var offset = convertI32PairToI53Checked(offset_low, offset_high); 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.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|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 instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - 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 instanceof FS.ErrnoError)) throw e; - return e.errno; - } - } - - function _getTempRet0() { - return getTempRet0(); - } - - function _llvm_eh_typeid_for(type) { - return type; - } - - function _setTempRet0(val) { - setTempRet0(val); - } - - function __isLeapYear(year) { - return year%4 === 0 && (year%100 !== 0 || year%400 === 0); - } - - function __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]; - function __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; - } - function _strftime(s, maxsize, format, tm) { - // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr); - // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html - - var tm_zone = HEAP32[(((tm)+(40))>>2)]; - - var date = { - tm_sec: HEAP32[((tm)>>2)], - tm_min: HEAP32[(((tm)+(4))>>2)], - tm_hour: HEAP32[(((tm)+(8))>>2)], - tm_mday: HEAP32[(((tm)+(12))>>2)], - tm_mon: HEAP32[(((tm)+(16))>>2)], - tm_year: HEAP32[(((tm)+(20))>>2)], - tm_wday: HEAP32[(((tm)+(24))>>2)], - tm_yday: HEAP32[(((tm)+(28))>>2)], - tm_isdst: HEAP32[(((tm)+(32))>>2)], - tm_gmtoff: HEAP32[(((tm)+(36))>>2)], - tm_zone: tm_zone ? UTF8ToString(tm_zone) : '' - }; - - var pattern = UTF8ToString(format); - - // expand format - var EXPANSION_RULES_1 = { - '%c': '%a %b %d %H:%M:%S %Y', // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug 3 14:02:01 2013 - '%D': '%m/%d/%y', // Equivalent to %m / %d / %y - '%F': '%Y-%m-%d', // Equivalent to %Y - %m - %d - '%h': '%b', // Equivalent to %b - '%r': '%I:%M:%S %p', // Replaced by the time in a.m. and p.m. notation - '%R': '%H:%M', // Replaced by the time in 24-hour notation - '%T': '%H:%M:%S', // Replaced by the time - '%x': '%m/%d/%y', // Replaced by the locale's appropriate date representation - '%X': '%H:%M:%S', // Replaced by the locale's appropriate time representation - // Modified Conversion Specifiers - '%Ec': '%c', // Replaced by the locale's alternative appropriate date and time representation. - '%EC': '%C', // Replaced by the name of the base year (period) in the locale's alternative representation. - '%Ex': '%m/%d/%y', // Replaced by the locale's alternative date representation. - '%EX': '%H:%M:%S', // Replaced by the locale's alternative time representation. - '%Ey': '%y', // Replaced by the offset from %EC (year only) in the locale's alternative representation. - '%EY': '%Y', // Replaced by the full alternative year representation. - '%Od': '%d', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading zeros if there is any alternative symbol for zero; otherwise, with leading characters. - '%Oe': '%e', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading characters. - '%OH': '%H', // Replaced by the hour (24-hour clock) using the locale's alternative numeric symbols. - '%OI': '%I', // Replaced by the hour (12-hour clock) using the locale's alternative numeric symbols. - '%Om': '%m', // Replaced by the month using the locale's alternative numeric symbols. - '%OM': '%M', // Replaced by the minutes using the locale's alternative numeric symbols. - '%OS': '%S', // Replaced by the seconds using the locale's alternative numeric symbols. - '%Ou': '%u', // Replaced by the weekday as a number in the locale's alternative representation (Monday=1). - '%OU': '%U', // Replaced by the week number of the year (Sunday as the first day of the week, rules corresponding to %U ) using the locale's alternative numeric symbols. - '%OV': '%V', // Replaced by the week number of the year (Monday as the first day of the week, rules corresponding to %V ) using the locale's alternative numeric symbols. - '%Ow': '%w', // Replaced by the number of the weekday (Sunday=0) using the locale's alternative numeric symbols. - '%OW': '%W', // Replaced by the week number of the year (Monday as the first day of the week) using the locale's alternative numeric symbols. - '%Oy': '%y', // Replaced by the year (offset from %C ) using the locale's alternative numeric symbols. - }; - for (var rule in EXPANSION_RULES_1) { - pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]); - } - - var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; - var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; - - function leadingSomething(value, digits, character) { - var str = typeof value == 'number' ? value.toString() : (value || ''); - while (str.length < digits) { - str = character[0]+str; - } - return str; - } - - function leadingNulls(value, digits) { - return leadingSomething(value, digits, '0'); - } - - function compareByDay(date1, date2) { - function sgn(value) { - return value < 0 ? -1 : (value > 0 ? 1 : 0); - } - - var compare; - if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) { - if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) { - compare = sgn(date1.getDate()-date2.getDate()); - } - } - return compare; - } - - function getFirstWeekStartDate(janFourth) { - switch (janFourth.getDay()) { - case 0: // Sunday - return new Date(janFourth.getFullYear()-1, 11, 29); - case 1: // Monday - return janFourth; - case 2: // Tuesday - return new Date(janFourth.getFullYear(), 0, 3); - case 3: // Wednesday - return new Date(janFourth.getFullYear(), 0, 2); - case 4: // Thursday - return new Date(janFourth.getFullYear(), 0, 1); - case 5: // Friday - return new Date(janFourth.getFullYear()-1, 11, 31); - case 6: // Saturday - return new Date(janFourth.getFullYear()-1, 11, 30); - } - } - - function getWeekBasedYear(date) { - var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); - - var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); - var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4); - - var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); - var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); - - if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { - // this date is after the start of the first week of this year - if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { - return thisDate.getFullYear()+1; - } else { - return thisDate.getFullYear(); - } - } else { - return thisDate.getFullYear()-1; - } - } - - var EXPANSION_RULES_2 = { - '%a': function(date) { - return WEEKDAYS[date.tm_wday].substring(0,3); - }, - '%A': function(date) { - return WEEKDAYS[date.tm_wday]; - }, - '%b': function(date) { - return MONTHS[date.tm_mon].substring(0,3); - }, - '%B': function(date) { - return MONTHS[date.tm_mon]; - }, - '%C': function(date) { - var year = date.tm_year+1900; - return leadingNulls((year/100)|0,2); - }, - '%d': function(date) { - return leadingNulls(date.tm_mday, 2); - }, - '%e': function(date) { - return leadingSomething(date.tm_mday, 2, ' '); - }, - '%g': function(date) { - // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. - // In this system, weeks begin on a Monday and week 1 of the year is the week that includes - // January 4th, which is also the week that includes the first Thursday of the year, and - // is also the first week that contains at least four days in the year. - // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of - // the last week of the preceding year; thus, for Saturday 2nd January 1999, - // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, - // or 31st is a Monday, it and any following days are part of week 1 of the following year. - // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01. - - return getWeekBasedYear(date).toString().substring(2); - }, - '%G': function(date) { - return getWeekBasedYear(date); - }, - '%H': function(date) { - return leadingNulls(date.tm_hour, 2); - }, - '%I': function(date) { - var twelveHour = date.tm_hour; - if (twelveHour == 0) twelveHour = 12; - else if (twelveHour > 12) twelveHour -= 12; - return leadingNulls(twelveHour, 2); - }, - '%j': function(date) { - // Day of the year (001-366) - return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3); - }, - '%m': function(date) { - return leadingNulls(date.tm_mon+1, 2); - }, - '%M': function(date) { - return leadingNulls(date.tm_min, 2); - }, - '%n': function() { - return '\n'; - }, - '%p': function(date) { - if (date.tm_hour >= 0 && date.tm_hour < 12) { - return 'AM'; - } else { - return 'PM'; - } - }, - '%S': function(date) { - return leadingNulls(date.tm_sec, 2); - }, - '%t': function() { - return '\t'; - }, - '%u': function(date) { - return date.tm_wday || 7; - }, - '%U': function(date) { - var days = date.tm_yday + 7 - date.tm_wday; - return leadingNulls(Math.floor(days / 7), 2); - }, - '%V': function(date) { - // Replaced by the week number of the year (Monday as the first day of the week) - // as a decimal number [01,53]. If the week containing 1 January has four - // or more days in the new year, then it is considered week 1. - // Otherwise, it is the last week of the previous year, and the next week is week 1. - // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] - var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7 ) / 7); - // If 1 Jan is just 1-3 days past Monday, the previous week - // is also in this year. - if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { - val++; - } - if (!val) { - val = 52; - // If 31 December of prev year a Thursday, or Friday of a - // leap year, then the prev year has 53 weeks. - var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; - if (dec31 == 4 || (dec31 == 5 && __isLeapYear(date.tm_year%400-1))) { - val++; - } - } else if (val == 53) { - // If 1 January is not a Thursday, and not a Wednesday of a - // leap year, then this year has only 52 weeks. - var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; - if (jan1 != 4 && (jan1 != 3 || !__isLeapYear(date.tm_year))) - val = 1; - } - return leadingNulls(val, 2); - }, - '%w': function(date) { - return date.tm_wday; - }, - '%W': function(date) { - var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); - return leadingNulls(Math.floor(days / 7), 2); - }, - '%y': function(date) { - // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year] - return (date.tm_year+1900).toString().substring(2); - }, - '%Y': function(date) { - // Replaced by the year as a decimal number (for example, 1997). [ tm_year] - return date.tm_year+1900; - }, - '%z': function(date) { - // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ). - // For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich). - var off = date.tm_gmtoff; - var ahead = off >= 0; - off = Math.abs(off) / 60; - // convert from minutes into hhmm format (which means 60 minutes = 100 units) - off = (off / 60)*100 + (off % 60); - return (ahead ? '+' : '-') + String("0000" + off).slice(-4); - }, - '%Z': function(date) { - return date.tm_zone; - }, - '%%': function() { - return '%'; - } - }; - - // Replace %% with a pair of NULLs (which cannot occur in a C string), then - // re-inject them after processing. - pattern = pattern.replace(/%%/g, '\0\0') - for (var rule in EXPANSION_RULES_2) { - if (pattern.includes(rule)) { - pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date)); - } - } - pattern = pattern.replace(/\0\0/g, '%') - - var bytes = intArrayFromString(pattern, false); - if (bytes.length > maxsize) { - return 0; - } - - writeArrayToMemory(bytes, s); - return bytes.length-1; - } - function _strftime_l(s, maxsize, format, tm) { - return _strftime(s, maxsize, format, tm); // no locale support yet - } - - var FSNode = /** @constructor */ function(parent, name, mode, rdev) { - if (!parent) { - parent = this; // root node sets parent to itself - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - }; - var readMode = 292/*292*/ | 73/*73*/; - var writeMode = 146/*146*/; - Object.defineProperties(FSNode.prototype, { - read: { - get: /** @this{FSNode} */function() { - return (this.mode & readMode) === readMode; - }, - set: /** @this{FSNode} */function(val) { - val ? this.mode |= readMode : this.mode &= ~readMode; - } - }, - write: { - get: /** @this{FSNode} */function() { - return (this.mode & writeMode) === writeMode; - }, - set: /** @this{FSNode} */function(val) { - val ? this.mode |= writeMode : this.mode &= ~writeMode; - } - }, - isFolder: { - get: /** @this{FSNode} */function() { - return FS.isDir(this.mode); - } - }, - isDevice: { - get: /** @this{FSNode} */function() { - return FS.isChrdev(this.mode); - } - } - }); - FS.FSNode = FSNode; - FS.staticInit();; -embind_init_charCodes(); -BindingError = Module['BindingError'] = extendError(Error, 'BindingError');; -InternalError = Module['InternalError'] = extendError(Error, 'InternalError');; -init_ClassHandle(); -init_embind();; -init_RegisteredPointer(); -UnboundTypeError = Module['UnboundTypeError'] = extendError(Error, 'UnboundTypeError');; -init_emval();; -var ASSERTIONS = false; - - - -/** @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; -} - -function intArrayToString(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - var chr = array[i]; - if (chr > 0xFF) { - if (ASSERTIONS) { - assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); - } - chr &= 0xFF; - } - ret.push(String.fromCharCode(chr)); - } - return ret.join(''); -} - - -var asmLibraryArg = { - "__assert_fail": ___assert_fail, - "__call_sighandler": ___call_sighandler, - "__cxa_allocate_exception": ___cxa_allocate_exception, - "__cxa_begin_catch": ___cxa_begin_catch, - "__cxa_decrement_exception_refcount": ___cxa_decrement_exception_refcount, - "__cxa_end_catch": ___cxa_end_catch, - "__cxa_find_matching_catch_2": ___cxa_find_matching_catch_2, - "__cxa_find_matching_catch_3": ___cxa_find_matching_catch_3, - "__cxa_find_matching_catch_4": ___cxa_find_matching_catch_4, - "__cxa_free_exception": ___cxa_free_exception, - "__cxa_increment_exception_refcount": ___cxa_increment_exception_refcount, - "__cxa_rethrow": ___cxa_rethrow, - "__cxa_rethrow_primary_exception": ___cxa_rethrow_primary_exception, - "__cxa_throw": ___cxa_throw, - "__cxa_uncaught_exceptions": ___cxa_uncaught_exceptions, - "__resumeException": ___resumeException, - "__syscall_fadvise64": ___syscall_fadvise64, - "__syscall_fcntl64": ___syscall_fcntl64, - "__syscall_fstat64": ___syscall_fstat64, - "__syscall_lstat64": ___syscall_lstat64, - "__syscall_newfstatat": ___syscall_newfstatat, - "__syscall_openat": ___syscall_openat, - "__syscall_stat64": ___syscall_stat64, - "__syscall_unlinkat": ___syscall_unlinkat, - "_embind_register_bigint": __embind_register_bigint, - "_embind_register_bool": __embind_register_bool, - "_embind_register_class": __embind_register_class, - "_embind_register_class_constructor": __embind_register_class_constructor, - "_embind_register_class_function": __embind_register_class_function, - "_embind_register_emval": __embind_register_emval, - "_embind_register_float": __embind_register_float, - "_embind_register_function": __embind_register_function, - "_embind_register_integer": __embind_register_integer, - "_embind_register_memory_view": __embind_register_memory_view, - "_embind_register_std_string": __embind_register_std_string, - "_embind_register_std_wstring": __embind_register_std_wstring, - "_embind_register_void": __embind_register_void, - "_emval_decref": __emval_decref, - "_emval_incref": __emval_incref, - "_emval_take_value": __emval_take_value, - "_mmap_js": __mmap_js, - "_munmap_js": __munmap_js, - "abort": _abort, - "emscripten_memcpy_big": _emscripten_memcpy_big, - "emscripten_resize_heap": _emscripten_resize_heap, - "environ_get": _environ_get, - "environ_sizes_get": _environ_sizes_get, - "fd_close": _fd_close, - "fd_pread": _fd_pread, - "fd_pwrite": _fd_pwrite, - "fd_read": _fd_read, - "fd_seek": _fd_seek, - "fd_write": _fd_write, - "getTempRet0": _getTempRet0, - "invoke_diii": invoke_diii, - "invoke_fiii": invoke_fiii, - "invoke_i": invoke_i, - "invoke_ii": invoke_ii, - "invoke_iii": invoke_iii, - "invoke_iiii": invoke_iiii, - "invoke_iiiii": invoke_iiiii, - "invoke_iiiiii": invoke_iiiiii, - "invoke_iiiiiii": invoke_iiiiiii, - "invoke_iiiiiiii": invoke_iiiiiiii, - "invoke_iiiiiiiiiii": invoke_iiiiiiiiiii, - "invoke_iiiiiiiiiiii": invoke_iiiiiiiiiiii, - "invoke_iiiiiiiiiiiii": invoke_iiiiiiiiiiiii, - "invoke_iiiiij": invoke_iiiiij, - "invoke_jiiii": invoke_jiiii, - "invoke_v": invoke_v, - "invoke_vi": invoke_vi, - "invoke_vii": invoke_vii, - "invoke_viii": invoke_viii, - "invoke_viiii": invoke_viiii, - "invoke_viiiiiii": invoke_viiiiiii, - "invoke_viiiiiiiiii": invoke_viiiiiiiiii, - "invoke_viiiiiiiiiiiiiii": invoke_viiiiiiiiiiiiiii, - "llvm_eh_typeid_for": _llvm_eh_typeid_for, - "setTempRet0": _setTempRet0, - "strftime_l": _strftime_l -}; -var asm = createWasm(); -/** @type {function(...*):?} */ -var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { - return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["__wasm_call_ctors"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _main = Module["_main"] = function() { - return (_main = Module["_main"] = Module["asm"]["main"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _malloc = Module["_malloc"] = function() { - return (_malloc = Module["_malloc"] = Module["asm"]["malloc"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var ___errno_location = Module["___errno_location"] = function() { - return (___errno_location = Module["___errno_location"] = Module["asm"]["__errno_location"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _free = Module["_free"] = function() { - return (_free = Module["_free"] = Module["asm"]["free"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var ___getTypeName = Module["___getTypeName"] = function() { - return (___getTypeName = Module["___getTypeName"] = Module["asm"]["__getTypeName"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var ___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = function() { - return (___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = Module["asm"]["__embind_register_native_and_builtin_types"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var ___dl_seterr = Module["___dl_seterr"] = function() { - return (___dl_seterr = Module["___dl_seterr"] = Module["asm"]["__dl_seterr"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _emscripten_builtin_memalign = Module["_emscripten_builtin_memalign"] = function() { - return (_emscripten_builtin_memalign = Module["_emscripten_builtin_memalign"] = Module["asm"]["emscripten_builtin_memalign"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var _setThrew = Module["_setThrew"] = function() { - return (_setThrew = Module["_setThrew"] = Module["asm"]["setThrew"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var stackSave = Module["stackSave"] = function() { - return (stackSave = Module["stackSave"] = Module["asm"]["stackSave"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var stackRestore = Module["stackRestore"] = function() { - return (stackRestore = Module["stackRestore"] = Module["asm"]["stackRestore"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var stackAlloc = Module["stackAlloc"] = function() { - return (stackAlloc = Module["stackAlloc"] = Module["asm"]["stackAlloc"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var ___cxa_demangle = Module["___cxa_demangle"] = function() { - return (___cxa_demangle = Module["___cxa_demangle"] = Module["asm"]["__cxa_demangle"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var ___cxa_can_catch = Module["___cxa_can_catch"] = function() { - return (___cxa_can_catch = Module["___cxa_can_catch"] = Module["asm"]["__cxa_can_catch"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var ___cxa_is_pointer_type = Module["___cxa_is_pointer_type"] = function() { - return (___cxa_is_pointer_type = Module["___cxa_is_pointer_type"] = Module["asm"]["__cxa_is_pointer_type"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_ji = Module["dynCall_ji"] = function() { - return (dynCall_ji = Module["dynCall_ji"] = Module["asm"]["dynCall_ji"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_viijj = Module["dynCall_viijj"] = function() { - return (dynCall_viijj = Module["dynCall_viijj"] = Module["asm"]["dynCall_viijj"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_iij = Module["dynCall_iij"] = function() { - return (dynCall_iij = Module["dynCall_iij"] = Module["asm"]["dynCall_iij"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_iijj = Module["dynCall_iijj"] = function() { - return (dynCall_iijj = Module["dynCall_iijj"] = Module["asm"]["dynCall_iijj"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_viij = Module["dynCall_viij"] = function() { - return (dynCall_viij = Module["dynCall_viij"] = Module["asm"]["dynCall_viij"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_ij = Module["dynCall_ij"] = function() { - return (dynCall_ij = Module["dynCall_ij"] = Module["asm"]["dynCall_ij"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_iiiji = Module["dynCall_iiiji"] = function() { - return (dynCall_iiiji = Module["dynCall_iiiji"] = Module["asm"]["dynCall_iiiji"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_iiiij = Module["dynCall_iiiij"] = function() { - return (dynCall_iiiij = Module["dynCall_iiiij"] = Module["asm"]["dynCall_iiiij"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_vij = Module["dynCall_vij"] = function() { - return (dynCall_vij = Module["dynCall_vij"] = Module["asm"]["dynCall_vij"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_jiji = Module["dynCall_jiji"] = function() { - return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["dynCall_jiji"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_iiiiij = Module["dynCall_iiiiij"] = function() { - return (dynCall_iiiiij = Module["dynCall_iiiiij"] = Module["asm"]["dynCall_iiiiij"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_viijii = Module["dynCall_viijii"] = function() { - return (dynCall_viijii = Module["dynCall_viijii"] = Module["asm"]["dynCall_viijii"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_jiiii = Module["dynCall_jiiii"] = function() { - return (dynCall_jiiii = Module["dynCall_jiiii"] = Module["asm"]["dynCall_jiiii"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = function() { - return (dynCall_iiiiijj = Module["dynCall_iiiiijj"] = Module["asm"]["dynCall_iiiiijj"]).apply(null, arguments); -}; - -/** @type {function(...*):?} */ -var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = function() { - return (dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = Module["asm"]["dynCall_iiiiiijj"]).apply(null, arguments); -}; - - -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_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_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_v(index) { - var sp = stackSave(); - try { - getWasmTableEntry(index)(); - } 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_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_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_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_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_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7) { - var sp = stackSave(); - try { - return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7); - } catch(e) { - stackRestore(sp); - if (e !== e+0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { - var sp = stackSave(); - try { - return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); - } 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_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) { - var sp = stackSave(); - try { - return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12); - } catch(e) { - stackRestore(sp); - if (e !== e+0) throw e; - _setThrew(1, 0); - } -} - -function invoke_fiii(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_diii(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_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7) { - var sp = stackSave(); - try { - getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7); - } catch(e) { - stackRestore(sp); - if (e !== e+0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { - var sp = stackSave(); - try { - return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); - } catch(e) { - stackRestore(sp); - if (e !== e+0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { - var sp = stackSave(); - try { - getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); - } catch(e) { - stackRestore(sp); - if (e !== e+0) throw e; - _setThrew(1, 0); - } -} - -function invoke_viiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) { - var sp = stackSave(); - try { - getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15); - } catch(e) { - stackRestore(sp); - if (e !== e+0) throw e; - _setThrew(1, 0); - } -} - -function invoke_iiiiij(index,a1,a2,a3,a4,a5,a6) { - var sp = stackSave(); - try { - return dynCall_iiiiij(index,a1,a2,a3,a4,a5,a6); - } catch(e) { - stackRestore(sp); - if (e !== e+0) throw e; - _setThrew(1, 0); - } -} - -function invoke_jiiii(index,a1,a2,a3,a4) { - var sp = stackSave(); - try { - return dynCall_jiiii(index,a1,a2,a3,a4); - } catch(e) { - stackRestore(sp); - if (e !== e+0) throw e; - _setThrew(1, 0); - } -} - - - - -// === Auto-generated postamble setup entry stuff === - -Module["print"] = out; -Module["printErr"] = err; -Module["ALLOC_NORMAL"] = ALLOC_NORMAL; -Module["ALLOC_STACK"] = ALLOC_STACK; - -var calledRun; - -/** - * @constructor - * @this {ExitStatus} - */ -function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; -} - -var calledMain = false; - -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 callMain(args) { - - var entryFunction = Module['_main']; - - args = args || []; - args.unshift(thisProgram); - - var argc = args.length; - var argv = stackAlloc((argc + 1) * 4); - var argv_ptr = argv >> 2; - args.forEach((arg) => { - HEAP32[argv_ptr++] = allocateUTF8OnStack(arg); - }); - HEAP32[argv_ptr] = 0; - - try { - - var ret = entryFunction(argc, argv); - - // In PROXY_TO_PTHREAD builds, we should never exit the runtime below, as - // execution is asynchronously handed off to a pthread. - // if we're not running an evented main loop, it's time to exit - exit(ret, /* implicit = */ true); - return ret; - } - catch (e) { - return handleException(e); - } finally { - calledMain = true; - - } -} - -/** @type {function(Array=)} */ -function run(args) { - args = args || arguments_; - - if (runDependencies > 0) { - return; - } - - 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(); - - preMain(); - - if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); - - if (shouldRunNow) callMain(args); - - postRun(); - } - - if (Module['setStatus']) { - Module['setStatus']('Running...'); - setTimeout(function() { - setTimeout(function() { - Module['setStatus'](''); - }, 1); - doRun(); - }, 1); - } else - { - doRun(); - } -} -Module['run'] = run; - -/** @param {boolean|number=} implicit */ -function exit(status, implicit) { - EXITSTATUS = status; - - procExit(status); -} - -function procExit(code) { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - if (Module['onExit']) Module['onExit'](code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); -} - -if (Module['preInit']) { - if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; - while (Module['preInit'].length > 0) { - Module['preInit'].pop()(); - } -} - -// shouldRunNow refers to calling main(), not run(). -var shouldRunNow = true; - -if (Module['noInitialRun']) shouldRunNow = false; - -run(); - - - - - - } - else { - console.error("Invalid action : " + action); - outgoingMessagePort.postMessage("invalid action"); - } -},false); - +var k;k||(k=typeof Module !== 'undefined' ? Module : {}); +self.addEventListener("message",function(fa){var Db=performance.now(),V=fa.data.action,Fc=fa.data.path,ha=fa.ports[0];console.debug("WebWorker called with action="+V);if("getEntryByPath"===V){var Eb=fa.data.H,ia=k[V](Fc);if(ia){var fb={};if(Eb||!ia.Ea()){fb=ia.getItem(Eb);var Fb=performance.now(),Gc=fb.getData(),Gb=performance.now(),Hb=Gc.jd(),Ib=performance.now(),Hc=new Uint8Array(Hb),Jb=performance.now();ha.postMessage({content:Hc,Ac:fb.ld(),Ea:ia.Ea()});var Kb=performance.now();console.debug("content length = "+ +Hb.length+" read in "+Math.round(Kb-Db)+" ms ("+Math.round(Fb-Db)+" ms to find the entry, "+Math.round(Gb-Fb)+" ms for getData, "+Math.round(Ib-Gb)+" ms for getContent, "+Math.round(Jb-Ib)+" ms for array copying, "+Math.round(Kb-Jb)+" ms for postMessage)")}else ha.postMessage({content:new Uint8Array,Ea:!0,xd:ia.md().M()})}else ha.postMessage({content:new Uint8Array,Ac:"unknown",Ea:!1})}else if("search"===V){var Ca=k[V](fa.data.text,fa.data.vd||50);console.debug("Found nb results = "+Ca.size(),Ca); +for(var Lb=[],gb=0;gb=Ta.length&&(Ta.length=a+1),Ta[a]=b=Xb.get(a));return b}var wa=[],Ua=0;function X(a){this.ra= +a;this.m=a-24;this.Yc=function(b){E[this.m+4>>2]=b};this.T=function(){return E[this.m+4>>2]};this.Ec=function(b){E[this.m+8>>2]=b};this.rc=function(){return E[this.m+8>>2]};this.Oc=function(){v[this.m>>2]=0};this.ob=function(b){M[this.m+12>>0]=b?1:0};this.wc=function(){return 0!=M[this.m+12>>0]};this.Ja=function(b){M[this.m+13>>0]=b?1:0};this.Hb=function(){return 0!=M[this.m+13>>0]};this.Y=function(b,c){this.ja(0);this.Yc(b);this.Ec(c);this.Oc();this.ob(!1);this.Ja(!1)};this.Lb=function(){v[this.m>> +2]+=1};this.Mc=function(){var b=v[this.m>>2];v[this.m>>2]=b-1;return 1===b};this.ja=function(b){E[this.m+16>>2]=b};this.vc=function(){return E[this.m+16>>2]};this.xc=function(){if(cc(this.T()))return E[this.ra>>2];var b=this.vc();return 0!==b?b:this.ra}}function dc(a){return U((new X(a)).m)}function ec(a){if(a.Mc()&&!a.Hb()){var b=a.rc();b&&C(b)(a.ra);dc(a.ra)}}var ba=0;function fc(){var a=wa.pop();a||Q("no exception to throw");var b=a.ra;a.Hb()||(wa.push(a),a.Ja(!0),a.ob(!1),Ua++);ba=b;throw b;} +var y={$a:a=>"/"===a.charAt(0),Rc:a=>/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1),gb:(a,b)=>{for(var c=0,d=a.length-1;0<=d;d--){var f=a[d];"."===f?a.splice(d,1):".."===f?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c;c--)a.unshift("..");return a},normalize:a=>{var b=y.$a(a),c="/"===a.substr(-1);(a=y.gb(a.split("/").filter(d=>!!d),!b).join("/"))||b||(a=".");a&&c&&(a+="/");return(b?"/":"")+a},dirname:a=>{var b=y.Rc(a);a=b[0];b=b[1];if(!a&&!b)return".";b&& +(b=b.substr(0,b.length-1));return a+b},basename:a=>{if("/"===a)return"/";a=y.normalize(a);a=a.replace(/\/$/,"");var b=a.lastIndexOf("/");return-1===b?a:a.substr(b+1)},join:function(){var a=Array.prototype.slice.call(arguments,0);return y.normalize(a.join("/"))},aa:(a,b)=>y.normalize(a+"/"+b)};function Tc(){if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues){var a=new Uint8Array(1);return function(){crypto.getRandomValues(a);return a[0]}}if(ib)try{var b=require("crypto");return function(){return b.randomBytes(1)[0]}}catch(c){}return function(){Q("randomDevice")}} +var Y={resolve:function(){for(var a="",b=!1,c=arguments.length-1;-1<=c&&!b;c--){b=0<=c?arguments[c]:e.cwd();if("string"!=typeof b)throw new TypeError("Arguments to path.resolve must be strings");if(!b)return"";a=b+"/"+a;b=y.$a(b)}a=y.gb(a.split("/").filter(d=>!!d),!b).join("/");return(b?"/":"")+a||"."},relative:(a,b)=>{function c(h){for(var l=0;lp?[]:h.slice(l,p-l+1)}a=Y.resolve(a).substr(1);b=Y.resolve(b).substr(1);a=c(a.split("/")); +b=c(b.split("/"));for(var d=Math.min(a.length,b.length),f=d,g=0;g=b||(b=Math.max(b,c*(1048576>c?2:1.125)>>>0),0!=c&&(b=Math.max(b,256)),c=a.j,a.j=new Uint8Array(b),0=a.node.u)return 0;a=Math.min(a.node.u-f,d);if(8b)throw new e.g(28);return b},qa:function(a,b,c){w.Cb(a.node,b+c);a.node.u=Math.max(a.node.u,b+c)},la:function(a,b,c,d,f){if(!e.isFile(a.node.mode))throw new e.g(43);a=a.node.j;if(f&2||a.buffer!== +Qa){if(0=a.node.size)return 0;a=a.node.j.slice(f,f+d);d=H.kb.readAsArrayBuffer(a);b.set(new Uint8Array(d),c);return a.size},write:function(){throw new e.g(29);},J:function(a,b,c){1===c?b+=a.position:2===c&&e.isFile(a.node.mode)&&(b+=a.node.size);if(0>b)throw new e.g(28);return b}}},e={root:null,wa:[], +Ab:{},streams:[],Cc:1,O:null,yb:"/",Za:!1,Mb:!0,g:null,Va:{},mc:null,La:0,s:(a,b={})=>{a=Y.resolve(e.cwd(),a);if(!a)return{path:"",node:null};b=Object.assign({Ua:!0,lb:0},b);if(8!!h),!1);for(var c=e.root,d="/",f=0;f{for(var b;;){if(e.Fa(a))return a=a.v.Ob,b?"/"!==a[a.length-1]?a+"/"+b:a+b:a;b=b?a.name+"/"+b:a.name;a=a.parent}},Ya:(a,b)=>{for(var c=0,d=0;d>>0)%e.O.length},Jb:a=>{var b=e.Ya(a.parent.id,a.name);a.da=e.O[b];e.O[b]=a},Kb:a=>{var b=e.Ya(a.parent.id,a.name);if(e.O[b]===a)e.O[b]=a.da;else for(b=e.O[b];b;){if(b.da===a){b.da=a.da;break}b=b.da}},U:(a,b)=>{var c=e.yc(a);if(c)throw new e.g(c,a);for(c= +e.O[e.Ya(a.id,b)];c;c=c.da){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return e.lookup(a,b)},createNode:(a,b,c,d)=>{a=new e.Tb(a,b,c,d);e.Jb(a);return a},Ta:a=>{e.Kb(a)},Fa:a=>a===a.parent,$:a=>!!a.va,isFile:a=>32768===(a&61440),D:a=>16384===(a&61440),ua:a=>40960===(a&61440),Ca:a=>8192===(a&61440),tc:a=>24576===(a&61440),isFIFO:a=>4096===(a&61440),isSocket:a=>49152===(a&49152),nc:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},Bc:a=>{var b=e.nc[a];if("undefined"==typeof b)throw Error("Unknown file open mode: "+ +a);return b},Db:a=>{var b=["r","w","rw"][a&3];a&512&&(b+="w");return b},ea:(a,b)=>{if(e.Mb)return 0;if(!b.includes("r")||a.mode&292){if(b.includes("w")&&!(a.mode&146)||b.includes("x")&&!(a.mode&73))return 2}else return 2;return 0},yc:a=>{var b=e.ea(a,"x");return b?b:a.i.lookup?0:2},fb:(a,b)=>{try{return e.U(a,b),20}catch(c){}return e.ea(a,"wx")},Ha:(a,b,c)=>{try{var d=e.U(a,b)}catch(f){return f.A}if(a=e.ea(a,"wx"))return a;if(c){if(!e.D(d.mode))return 54;if(e.Fa(d)||e.M(d)===e.cwd())return 10}else if(e.D(d.mode))return 31; +return 0},zc:(a,b)=>a?e.ua(a.mode)?32:e.D(a.mode)&&("r"!==e.Db(b)||b&512)?31:e.ea(a,e.Db(b)):44,Ub:4096,Dc:(a=0,b=e.Ub)=>{for(;a<=b;a++)if(!e.streams[a])return a;throw new e.g(33);},W:a=>e.streams[a],xb:(a,b,c)=>{e.Pa||(e.Pa=function(){this.Ka={}},e.Pa.prototype={object:{get:function(){return this.node},set:function(d){this.node=d}},flags:{get:function(){return this.Ka.flags},set:function(d){this.Ka.flags=d}},position:{get hd(){return this.Ka.position},set:function(d){this.Ka.position=d}}});a=Object.assign(new e.Pa, +a);b=e.Dc(b,c);a.fd=b;return e.streams[b]=a},$b:a=>{e.streams[a]=null},Zb:{open:a=>{a.l=e.pc(a.node.rdev).l;a.l.open&&a.l.open(a)},J:()=>{throw new e.g(70);}},eb:a=>a>>8,rd:a=>a&255,ba:(a,b)=>a<<8|b,nb:(a,b)=>{e.Ab[a]={l:b}},pc:a=>e.Ab[a],Fb:a=>{var b=[];for(a=[a];a.length;){var c=a.pop();b.push(c);a.push.apply(a,c.wa)}return b},Rb:(a,b)=>{function c(h){e.La--;return b(h)}function d(h){if(h){if(!d.lc)return d.lc=!0,c(h)}else++g>=f.length&&c(null)}"function"==typeof a&&(b=a,a=!1);e.La++;1{if(!h.type.Rb)return d(null);h.type.Rb(h,a,d)})},v:(a,b,c)=>{var d="/"===c,f=!c;if(d&&e.root)throw new e.g(10);if(!d&&!f){var g=e.s(c,{Ua:!1});c=g.path;g=g.node;if(e.$(g))throw new e.g(10);if(!e.D(g.mode))throw new e.g(54);}b={type:a,hb:b,Ob:c,wa:[]};a=a.v(b);a.v=b;b.root=a;d?e.root=a:g&&(g.va=b,g.v&&g.v.wa.push(b));return a},Bd:a=>{a=e.s(a,{Ua:!1});if(!e.$(a.node))throw new e.g(28); +a=a.node;var b=a.va,c=e.Fb(b);Object.keys(e.O).forEach(d=>{for(d=e.O[d];d;){var f=d.da;c.includes(d.v)&&e.Ta(d);d=f}});a.va=null;a.v.wa.splice(a.v.wa.indexOf(b),1)},lookup:(a,b)=>a.i.lookup(a,b),N:(a,b,c)=>{var d=e.s(a,{parent:!0}).node;a=y.basename(a);if(!a||"."===a||".."===a)throw new e.g(28);var f=e.fb(d,a);if(f)throw new e.g(f);if(!d.i.N)throw new e.g(63);return d.i.N(d,a,b,c)},create:(a,b)=>e.N(a,(void 0!==b?b:438)&4095|32768,0),mkdir:(a,b)=>e.N(a,(void 0!==b?b:511)&1023|16384,0),sd:(a,b)=>{a= +a.split("/");for(var c="",d=0;d{"undefined"==typeof c&&(c=b,b=438);return e.N(a,b|8192,c)},symlink:(a,b)=>{if(!Y.resolve(a))throw new e.g(44);var c=e.s(b,{parent:!0}).node;if(!c)throw new e.g(44);b=y.basename(b);var d=e.fb(c,b);if(d)throw new e.g(d);if(!c.i.symlink)throw new e.g(63);return c.i.symlink(c,b,a)},rename:(a,b)=>{var c=y.dirname(a),d=y.dirname(b),f=y.basename(a),g=y.basename(b);var h=e.s(a,{parent:!0}); +var l=h.node;h=e.s(b,{parent:!0});h=h.node;if(!l||!h)throw new e.g(44);if(l.v!==h.v)throw new e.g(75);var p=e.U(l,f);a=Y.relative(a,d);if("."!==a.charAt(0))throw new e.g(28);a=Y.relative(b,c);if("."!==a.charAt(0))throw new e.g(55);try{var n=e.U(h,g)}catch(q){}if(p!==n){b=e.D(p.mode);if(f=e.Ha(l,f,b))throw new e.g(f);if(f=n?e.Ha(h,g,b):e.fb(h,g))throw new e.g(f);if(!l.i.rename)throw new e.g(63);if(e.$(p)||n&&e.$(n))throw new e.g(10);if(h!==l&&(f=e.ea(l,"w")))throw new e.g(f);e.Kb(p);try{l.i.rename(p, +h,g)}catch(q){throw q;}finally{e.Jb(p)}}},rmdir:a=>{var b=e.s(a,{parent:!0}).node;a=y.basename(a);var c=e.U(b,a),d=e.Ha(b,a,!0);if(d)throw new e.g(d);if(!b.i.rmdir)throw new e.g(63);if(e.$(c))throw new e.g(10);b.i.rmdir(b,a);e.Ta(c)},readdir:a=>{a=e.s(a,{H:!0}).node;if(!a.i.readdir)throw new e.g(54);return a.i.readdir(a)},unlink:a=>{var b=e.s(a,{parent:!0}).node;if(!b)throw new e.g(44);a=y.basename(a);var c=e.U(b,a),d=e.Ha(b,a,!1);if(d)throw new e.g(d);if(!b.i.unlink)throw new e.g(63);if(e.$(c))throw new e.g(10); +b.i.unlink(b,a);e.Ta(c)},readlink:a=>{a=e.s(a).node;if(!a)throw new e.g(44);if(!a.i.readlink)throw new e.g(28);return Y.resolve(e.M(a.parent),a.i.readlink(a))},stat:(a,b)=>{a=e.s(a,{H:!b}).node;if(!a)throw new e.g(44);if(!a.i.I)throw new e.g(63);return a.i.I(a)},lstat:a=>e.stat(a,!0),chmod:(a,b,c)=>{a="string"==typeof a?e.s(a,{H:!c}).node:a;if(!a.i.C)throw new e.g(63);a.i.C(a,{mode:b&4095|a.mode&-4096,timestamp:Date.now()})},lchmod:(a,b)=>{e.chmod(a,b,!0)},fchmod:(a,b)=>{a=e.W(a);if(!a)throw new e.g(8); +e.chmod(a.node,b)},chown:(a,b,c,d)=>{a="string"==typeof a?e.s(a,{H:!d}).node:a;if(!a.i.C)throw new e.g(63);a.i.C(a,{timestamp:Date.now()})},lchown:(a,b,c)=>{e.chown(a,b,c,!0)},fchown:(a,b,c)=>{a=e.W(a);if(!a)throw new e.g(8);e.chown(a.node,b,c)},truncate:(a,b)=>{if(0>b)throw new e.g(28);a="string"==typeof a?e.s(a,{H:!0}).node:a;if(!a.i.C)throw new e.g(63);if(e.D(a.mode))throw new e.g(31);if(!e.isFile(a.mode))throw new e.g(28);var c=e.ea(a,"w");if(c)throw new e.g(c);a.i.C(a,{size:b,timestamp:Date.now()})}, +ed:(a,b)=>{a=e.W(a);if(!a)throw new e.g(8);if(0===(a.flags&2097155))throw new e.g(28);e.truncate(a.node,b)},Cd:(a,b,c)=>{a=e.s(a,{H:!0}).node;a.i.C(a,{timestamp:Math.max(b,c)})},open:(a,b,c)=>{if(""===a)throw new e.g(44);b="string"==typeof b?e.Bc(b):b;c=b&64?("undefined"==typeof c?438:c)&4095|32768:0;if("object"==typeof a)var d=a;else{a=y.normalize(a);try{d=e.s(a,{H:!(b&131072)}).node}catch(g){}}var f=!1;if(b&64)if(d){if(b&128)throw new e.g(20);}else d=e.N(a,c,0),f=!0;if(!d)throw new e.g(44);e.Ca(d.mode)&& +(b&=-513);if(b&65536&&!e.D(d.mode))throw new e.g(54);if(!f&&(c=e.zc(d,b)))throw new e.g(c);b&512&&!f&&e.truncate(d,0);b&=-131713;d=e.xb({node:d,path:e.M(d),flags:b,seekable:!0,position:0,l:d.l,Zc:[],error:!1});d.l.open&&d.l.open(d);!k.logReadFiles||b&1||(e.jb||(e.jb={}),a in e.jb||(e.jb[a]=1));return d},close:a=>{if(e.ta(a))throw new e.g(8);a.Xa&&(a.Xa=null);try{a.l.close&&a.l.close(a)}catch(b){throw b;}finally{e.$b(a.fd)}a.fd=null},ta:a=>null===a.fd,J:(a,b,c)=>{if(e.ta(a))throw new e.g(8);if(!a.seekable|| +!a.l.J)throw new e.g(70);if(0!=c&&1!=c&&2!=c)throw new e.g(28);a.position=a.l.J(a,b,c);a.Zc=[];return a.position},read:(a,b,c,d,f)=>{if(0>d||0>f)throw new e.g(28);if(e.ta(a))throw new e.g(8);if(1===(a.flags&2097155))throw new e.g(8);if(e.D(a.node.mode))throw new e.g(31);if(!a.l.read)throw new e.g(28);var g="undefined"!=typeof f;if(!g)f=a.position;else if(!a.seekable)throw new e.g(70);b=a.l.read(a,b,c,d,f);g||(a.position+=b);return b},write:(a,b,c,d,f,g)=>{if(0>d||0>f)throw new e.g(28);if(e.ta(a))throw new e.g(8); +if(0===(a.flags&2097155))throw new e.g(8);if(e.D(a.node.mode))throw new e.g(31);if(!a.l.write)throw new e.g(28);a.seekable&&a.flags&1024&&e.J(a,0,2);var h="undefined"!=typeof f;if(!h)f=a.position;else if(!a.seekable)throw new e.g(70);b=a.l.write(a,b,c,d,f,g);h||(a.position+=b);return b},qa:(a,b,c)=>{if(e.ta(a))throw new e.g(8);if(0>b||0>=c)throw new e.g(28);if(0===(a.flags&2097155))throw new e.g(8);if(!e.isFile(a.node.mode)&&!e.D(a.node.mode))throw new e.g(43);if(!a.l.qa)throw new e.g(138);a.l.qa(a, +b,c)},la:(a,b,c,d,f)=>{if(0!==(d&2)&&0===(f&2)&&2!==(a.flags&2097155))throw new e.g(2);if(1===(a.flags&2097155))throw new e.g(2);if(!a.l.la)throw new e.g(43);return a.l.la(a,b,c,d,f)},ma:(a,b,c,d,f)=>a&&a.l.ma?a.l.ma(a,b,c,d,f):0,td:()=>0,Nb:(a,b,c)=>{if(!a.l.Nb)throw new e.g(59);return a.l.Nb(a,b,c)},readFile:(a,b={})=>{b.flags=b.flags||0;b.encoding=b.encoding||"binary";if("utf8"!==b.encoding&&"binary"!==b.encoding)throw Error('Invalid encoding type "'+b.encoding+'"');var c,d=e.open(a,b.flags);a= +e.stat(a).size;var f=new Uint8Array(a);e.read(d,f,0,a,0);"utf8"===b.encoding?c=pa(f,0):"binary"===b.encoding&&(c=f);e.close(d);return c},writeFile:(a,b,c={})=>{c.flags=c.flags||577;a=e.open(a,c.flags,c.mode);if("string"==typeof b){var d=new Uint8Array(Oa(b)+1);b=Na(b,d,0,d.length);e.write(a,d,0,b,void 0,c.Yb)}else if(ArrayBuffer.isView(b))e.write(a,b,0,b.byteLength,void 0,c.Yb);else throw Error("Unsupported data type");e.close(a)},cwd:()=>e.yb,chdir:a=>{a=e.s(a,{H:!0});if(null===a.node)throw new e.g(44); +if(!e.D(a.node.mode))throw new e.g(54);var b=e.ea(a.node,"x");if(b)throw new e.g(b);e.yb=a.path},cc:()=>{e.mkdir("/tmp");e.mkdir("/home");e.mkdir("/home/web_user")},bc:()=>{e.mkdir("/dev");e.nb(e.ba(1,3),{read:()=>0,write:(b,c,d,f)=>f});e.Ia("/dev/null",e.ba(1,3));ca.register(e.ba(5,0),ca.ic);ca.register(e.ba(6,0),ca.hc);e.Ia("/dev/tty",e.ba(5,0));e.Ia("/dev/tty1",e.ba(6,0));var a=Tc();e.V("/dev","random",a);e.V("/dev","urandom",a);e.mkdir("/dev/shm");e.mkdir("/dev/shm/tmp")},ec:()=>{e.mkdir("/proc"); +var a=e.mkdir("/proc/self");e.mkdir("/proc/self/fd");e.v({v:()=>{var b=e.createNode(a,"fd",16895,73);b.i={lookup:(c,d)=>{var f=e.W(+d);if(!f)throw new e.g(8);c={parent:null,v:{Ob:"fake"},i:{readlink:()=>f.path}};return c.parent=c}};return b}},{},"/proc/self/fd")},fc:()=>{k.stdin?e.V("/dev","stdin",k.stdin):e.symlink("/dev/tty","/dev/stdin");k.stdout?e.V("/dev","stdout",null,k.stdout):e.symlink("/dev/tty","/dev/stdout");k.stderr?e.V("/dev","stderr",null,k.stderr):e.symlink("/dev/tty1","/dev/stderr"); +e.open("/dev/stdin",0);e.open("/dev/stdout",1);e.open("/dev/stderr",1)},Bb:()=>{e.g||(e.g=function(a,b){this.node=b;this.Pc=function(c){this.A=c};this.Pc(a);this.message="FS error"},e.g.prototype=Error(),e.g.prototype.constructor=e.g,[44].forEach(a=>{e.Va[a]=new e.g(a);e.Va[a].stack=""}))},Sc:()=>{e.Bb();e.O=Array(4096);e.v(w,{},"/");e.cc();e.bc();e.ec();e.mc={MEMFS:w,WORKERFS:H}},Y:(a,b,c)=>{e.Y.Za=!0;e.Bb();k.stdin=a||k.stdin;k.stdout=b||k.stdout;k.stderr=c||k.stderr;e.fc()}, +wd:()=>{e.Y.Za=!1;for(var a=0;a{var c=0;a&&(c|=365);b&&(c|=146);return c},dd:(a,b)=>{a=e.Qa(a,b);return a.exists?a.object:null},Qa:(a,b)=>{try{var c=e.s(a,{H:!b});a=c.path}catch(f){}var d={Fa:!1,exists:!1,error:0,name:null,path:null,object:null,Fc:!1,Hc:null,Gc:null};try{c=e.s(a,{parent:!0}),d.Fc=!0,d.Hc=c.path,d.Gc=c.node,d.name=y.basename(a),c=e.s(a,{H:!b}),d.exists=!0,d.path=c.path,d.object=c.node,d.name=c.node.name,d.Fa="/"=== +c.path}catch(f){d.error=f.A}return d},bd:(a,b)=>{a="string"==typeof a?a:e.M(a);for(b=b.split("/").reverse();b.length;){var c=b.pop();if(c){var d=y.aa(a,c);try{e.mkdir(d)}catch(f){}a=d}}return d},dc:(a,b,c,d,f)=>{a=y.aa("string"==typeof a?a:e.M(a),b);return e.create(a,e.Wa(d,f))},wb:(a,b,c,d,f,g)=>{var h=b;a&&(a="string"==typeof a?a:e.M(a),h=b?y.aa(a,b):a);a=e.Wa(d,f);h=e.create(h,a);if(c){if("string"==typeof c){b=Array(c.length);d=0;for(f=c.length;d{a=y.aa("string"==typeof a?a:e.M(a),b);b=e.Wa(!!c,!!d);e.V.eb||(e.V.eb=64);var f=e.ba(e.V.eb++,0);e.nb(f,{open:g=>{g.seekable=!1},close:()=>{d&&d.buffer&&d.buffer.length&&d(10)},read:(g,h,l,p)=>{for(var n=0,q=0;q{for(var n= +0;n{if(a.ab||a.uc||a.link||a.j)return!0;if("undefined"!=typeof XMLHttpRequest)throw 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.");if(Ia)try{a.j=Va(Ia(a.url),!0),a.u=a.j.length}catch(b){throw new e.g(29);}else throw Error("Cannot load without read() or XMLHttpRequest."); +},ad:(a,b,c,d,f)=>{function g(){this.cb=!1;this.T=[]}g.prototype.get=function(n){if(!(n>this.length-1||0>n)){var q=n%this.chunkSize;return this.Ib(n/this.chunkSize|0)[q]}};g.prototype.ja=function(n){this.Ib=n};g.prototype.ub=function(){var n=new XMLHttpRequest;n.open("HEAD",c,!1);n.send(null);if(!(200<=n.status&&300>n.status||304===n.status))throw Error("Couldn't load "+c+". Status: "+n.status);var q=Number(n.getResponseHeader("Content-length")),t,u=(t=n.getResponseHeader("Accept-Ranges"))&&"bytes"=== +t;n=(t=n.getResponseHeader("Content-Encoding"))&&"gzip"===t;var m=1048576;u||(m=q);var r=this;r.ja(x=>{var B=x*m,I=(x+1)*m-1;I=Math.min(I,q-1);if("undefined"==typeof r.T[x]){var da=r.T;if(B>I)throw Error("invalid range ("+B+", "+I+") or no bytes requested!");if(I>q-1)throw Error("only "+q+" bytes available! programmer error!");var K=new XMLHttpRequest;K.open("GET",c,!1);q!==m&&K.setRequestHeader("Range","bytes="+B+"-"+I);K.responseType="arraybuffer";K.overrideMimeType&&K.overrideMimeType("text/plain; charset=x-user-defined"); +K.send(null);if(!(200<=K.status&&300>K.status||304===K.status))throw Error("Couldn't load "+c+". Status: "+K.status);B=void 0!==K.response?new Uint8Array(K.response||[]):Va(K.responseText||"",!0);da[x]=B}if("undefined"==typeof r.T[x])throw Error("doXHR failed!");return r.T[x]});if(n||!q)m=q=1,m=q=this.Ib(0).length,ta("LazyFiles on gzip forces download of the whole file when length is accessed");this.Wb=q;this.Vb=m;this.cb=!0};if("undefined"!=typeof XMLHttpRequest){if(!ja)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"; +var h=new g;Object.defineProperties(h,{length:{get:function(){this.cb||this.ub();return this.Wb}},chunkSize:{get:function(){this.cb||this.ub();return this.Vb}}});h={ab:!1,j:h}}else h={ab:!1,url:c};var l=e.dc(a,b,h,d,f);h.j?l.j=h.j:h.url&&(l.j=null,l.url=h.url);Object.defineProperties(l,{u:{get:function(){return this.j.length}}});var p={};Object.keys(l.l).forEach(n=>{var q=l.l[n];p[n]=function(){e.Eb(l);return q.apply(null,arguments)}});p.read=(n,q,t,u,m)=>{e.Eb(l);n=n.node.j;if(m>=n.length)return 0; +u=Math.min(n.length-m,u);if(n.slice)for(var r=0;r{function q(m){function r(x){n&&n();l||e.wb(a,b,x,d,f,p);g&&g();Ra(u)}Vc.nd(m,t,r,()=>{h&&h();Ra(u)})||r(m)}var t=b?Y.resolve(y.aa(a,b)):a,u="cp "+t;mb(u);"string"==typeof c?Uc(c,m=>q(m),h):q(c)},indexedDB:()=>window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB,rb:()=>"EM_FS_"+window.location.pathname,sb:20,oa:"FILE_DATA", +yd:(a,b,c)=>{b=b||(()=>{});c=c||(()=>{});var d=e.indexedDB();try{var f=d.open(e.rb(),e.sb)}catch(g){return c(g)}f.onupgradeneeded=()=>{ta("creating db");f.result.createObjectStore(e.oa)};f.onsuccess=()=>{var g=f.result.transaction([e.oa],"readwrite"),h=g.objectStore(e.oa),l=0,p=0,n=a.length;a.forEach(q=>{q=h.put(e.Qa(q).object.j,q);q.onsuccess=()=>{l++;l+p==n&&(0==p?b():c())};q.onerror=()=>{p++;l+p==n&&(0==p?b():c())}});g.onerror=c};f.onerror=c},qd:(a,b,c)=>{b=b||(()=>{});c=c||(()=>{});var d=e.indexedDB(); +try{var f=d.open(e.rb(),e.sb)}catch(g){return c(g)}f.onupgradeneeded=c;f.onsuccess=()=>{var g=f.result;try{var h=g.transaction([e.oa],"readonly")}catch(t){c(t);return}var l=h.objectStore(e.oa),p=0,n=0,q=a.length;a.forEach(t=>{var u=l.get(t);u.onsuccess=()=>{e.Qa(t).exists&&e.unlink(t);e.wb(y.dirname(t),y.basename(t),u.result,!0,!0,!0);p++;p+n==q&&(0==n?b():c())};u.onerror=()=>{n++;p+n==q&&(0==n?b():c())}});h.onerror=c};f.onerror=c}},A={$c:5,Sa:function(a,b,c){if(y.$a(b))return b;if(-100===a)a=e.cwd(); +else{a=e.W(a);if(!a)throw new e.g(8);a=a.path}if(0==b.length){if(!c)throw new e.g(44);return a}return y.aa(a,b)},Ba:function(a,b,c){try{var d=a(b)}catch(f){if(f&&f.node&&y.normalize(b)!==y.normalize(e.M(f.node)))return-54;throw f;}v[c>>2]=d.dev;v[c+4>>2]=0;v[c+8>>2]=d.ino;v[c+12>>2]=d.mode;v[c+16>>2]=d.nlink;v[c+20>>2]=d.uid;v[c+24>>2]=d.gid;v[c+28>>2]=d.rdev;v[c+32>>2]=0;W=[d.size>>>0,(J=d.size,1<=+Math.abs(J)?0>>0:~~+Math.ceil((J-+(~~J>>>0))/ +4294967296)>>>0:0)];v[c+40>>2]=W[0];v[c+44>>2]=W[1];v[c+48>>2]=4096;v[c+52>>2]=d.blocks;v[c+56>>2]=d.atime.getTime()/1E3|0;v[c+60>>2]=0;v[c+64>>2]=d.mtime.getTime()/1E3|0;v[c+68>>2]=0;v[c+72>>2]=d.ctime.getTime()/1E3|0;v[c+76>>2]=0;W=[d.ino>>>0,(J=d.ino,1<=+Math.abs(J)?0>>0:~~+Math.ceil((J-+(~~J>>>0))/4294967296)>>>0:0)];v[c+80>>2]=W[0];v[c+84>>2]=W[1];return 0},jc:function(a,b,c,d,f){a=L.slice(a,a+c);e.ma(b,a,f,c,d)},za:void 0,get:function(){A.za+= +4;return v[A.za-4>>2]},sa:function(a){return ka(a)},X:function(a){a=e.W(a);if(!a)throw new e.g(8);return a}};function nb(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+a);}}var hc=void 0;function P(a){for(var b="";L[a];)b+=hc[L[a++]];return b}var qa={},na={},Wa={};function ob(a){if(void 0===a)return"_unknown";a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?"_"+a:a}function pb(a,b){a=ob(a);return(new Function("body", +"return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function qb(a,b){var c=pb(b,function(d){this.name=b;this.message=d;d=Error(d).stack;void 0!==d&&(this.stack=this.toString()+"\n"+d.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(a.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c}var ra=void 0;function z(a){throw new ra(a);}var ic=void 0;function Xa(a){throw new ic(a); +}function sa(a,b,c){function d(l){l=c(l);l.length!==a.length&&Xa("Mismatched type converter count");for(var p=0;p{na.hasOwnProperty(l)?f[p]=na[l]:(g.push(l),qa.hasOwnProperty(l)||(qa[l]=[]),qa[l].push(()=>{f[p]=na[l];++h;h===g.length&&d(f)}))});0===g.length&&d(f)}function Z(a,b,c={}){if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");var d= +b.name;a||z('type "'+d+'" must have a positive integer typeid pointer');if(na.hasOwnProperty(a)){if(c.sc)return;z("Cannot register type '"+d+"' twice")}na[a]=b;delete Wa[a];qa.hasOwnProperty(a)&&(b=qa[a],delete qa[a],b.forEach(f=>f()))}function rb(a){z(a.h.B.o.name+" instance already deleted")}var sb=!1;function jc(){}function kc(a){--a.count.value;0===a.count.value&&(a.G?a.K.fa(a.G):a.B.o.fa(a.m))}function lc(a,b,c){if(b===c)return a;if(void 0===c.L)return null;a=lc(a,b,c.L);return null===a?null: +c.kc(a)}var mc={},xa=[];function tb(){for(;xa.length;){var a=xa.pop();a.h.ia=!1;a["delete"]()}}var ya=void 0,za={};function Wc(a,b){for(void 0===b&&z("ptr should not be undefined");a.L;)b=a.ya(b),a=a.L;return za[b]}function Ya(a,b){b.B&&b.m||Xa("makeClassHandle requires ptr and ptrType");!!b.K!==!!b.G&&Xa("Both smartPtrType and smartPtr must be specified");b.count={value:1};return Aa(Object.create(a,{h:{value:b}}))}function Aa(a){if("undefined"===typeof FinalizationRegistry)return Aa=b=>b,a;sb=new FinalizationRegistry(b=> +{kc(b.h)});Aa=b=>{var c=b.h;c.G&&sb.register(b,{h:c},b);return b};jc=b=>sb.unregister(b);return Aa(a)}function ea(){}function nc(a,b,c){if(void 0===a[b].F){var d=a[b];a[b]=function(){a[b].F.hasOwnProperty(arguments.length)||z("Function '"+c+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+a[b].F+")!");return a[b].F[arguments.length].apply(this,arguments)};a[b].F=[];a[b].F[d.Aa]=d}}function oc(a,b,c){k.hasOwnProperty(a)?((void 0===c||void 0!==k[a].F&&void 0!== +k[a].F[c])&&z("Cannot register public name '"+a+"' twice"),nc(k,a,a),k.hasOwnProperty(c)&&z("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),k[a].F[c]=b):(k[a]=b,void 0!==c&&(k[a].ud=c))}function Xc(a,b,c,d,f,g,h,l){this.name=a;this.constructor=b;this.ka=c;this.fa=d;this.L=f;this.oc=g;this.ya=h;this.kc=l;this.Jc=[]}function ub(a,b,c){for(;b!==c;)b.ya||z("Expected null or instance of "+c.name+", got an instance of "+b.name),a=b.ya(a),b=b.L;return a}function Yc(a, +b){if(null===b)return this.bb&&z("null is not a valid "+this.name),0;b.h||z('Cannot pass "'+vb(b)+'" as a '+this.name);b.h.m||z("Cannot pass deleted object as a pointer of type "+this.name);return ub(b.h.m,b.h.B.o,this.o)}function Zc(a,b){if(null===b){this.bb&&z("null is not a valid "+this.name);if(this.Ga){var c=this.Kc();null!==a&&a.push(this.fa,c);return c}return 0}b.h||z('Cannot pass "'+vb(b)+'" as a '+this.name);b.h.m||z("Cannot pass deleted object as a pointer of type "+this.name);!this.Da&& +b.h.B.Da&&z("Cannot convert argument of type "+(b.h.K?b.h.K.name:b.h.B.name)+" to parameter type "+this.name);c=ub(b.h.m,b.h.B.o,this.o);if(this.Ga)switch(void 0===b.h.G&&z("Passing raw pointer to smart pointer is illegal"),this.Qc){case 0:b.h.K===this?c=b.h.G:z("Cannot convert argument of type "+(b.h.K?b.h.K.name:b.h.B.name)+" to parameter type "+this.name);break;case 1:c=b.h.G;break;case 2:if(b.h.K===this)c=b.h.G;else{var d=b.clone();c=this.Lc(c,Za.qb(function(){d["delete"]()}));null!==a&&a.push(this.fa, +c)}break;default:z("Unsupporting sharing policy")}return c}function $c(a,b){if(null===b)return this.bb&&z("null is not a valid "+this.name),0;b.h||z('Cannot pass "'+vb(b)+'" as a '+this.name);b.h.m||z("Cannot pass deleted object as a pointer of type "+this.name);b.h.B.Da&&z("Cannot convert argument of type "+b.h.B.name+" to parameter type "+this.name);return ub(b.h.m,b.h.B.o,this.o)}function $a(a){return this.fromWireType(E[a>>2])}function aa(a,b,c,d,f,g,h,l,p,n,q){this.name=a;this.o=b;this.bb=c; +this.Da=d;this.Ga=f;this.Ic=g;this.Qc=h;this.Pb=l;this.Kc=p;this.Lc=n;this.fa=q;f||void 0!==b.L?this.toWireType=Zc:(this.toWireType=d?Yc:$c,this.S=null)}function pc(a,b,c){k.hasOwnProperty(a)||Xa("Replacing nonexistant public symbol");void 0!==k[a].F&&void 0!==c?k[a].F[c]=b:(k[a]=b,k[a].Aa=c)}function ad(a,b){var c=[];return function(){c.length=0;Object.assign(c,arguments);if(a.includes("j")){var d=k["dynCall_"+a];d=c&&c.length?d.apply(null,[b].concat(c)):d.call(null,b)}else d=C(b).apply(null,c); +return d}}function oa(a,b){a=P(a);var c=a.includes("j")?ad(a,b):C(b);"function"!=typeof c&&z("unknown function pointer with signature "+a+": "+b);return c}var qc=void 0;function rc(a){a=sc(a);var b=P(a);U(a);return b}function ab(a,b){function c(g){f[g]||na[g]||(Wa[g]?Wa[g].forEach(c):(d.push(g),f[g]=!0))}var d=[],f={};b.forEach(c);throw new qc(a+": "+d.map(rc).join([", "]));}function wb(a,b){for(var c=[],d=0;d>2)+d]);return c}function bd(a){for(;a.length;){var b=a.pop();a.pop()(b)}} +function cd(a,b){if(!(a instanceof Function))throw new TypeError("new_ called with constructor type "+typeof a+" which is not a function");var c=pb(a.name||"unknownFunctionName",function(){});c.prototype=a.prototype;c=new c;a=a.apply(c,b);return a instanceof Object?a:c}function xb(a,b,c,d,f){var g=b.length;2>g&&z("argTypes array size mismatch! Must at least get return value and 'this' types!");var h=null!==b[1]&&null!==c,l=!1;for(c=1;c{a||z("Cannot use deleted val. handle = "+a);return R[a].value},qb:a=>{switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=yb.length?yb.pop():R.length;R[b]={mb:1,value:a};return b}}};function vb(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"=== +b||"function"===b?a.toString():""+a}function dd(a,b){switch(b){case 2:return function(c){return this.fromWireType(Ub[c>>2])};case 3:return function(c){return this.fromWireType(Vb[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function ed(a,b,c){switch(b){case 0:return c?function(d){return M[d]}:function(d){return L[d]};case 1:return c?function(d){return la[d>>1]}:function(d){return Pa[d>>1]};case 2:return c?function(d){return v[d>>2]}:function(d){return E[d>>2]};default:throw new TypeError("Unknown integer type: "+ +a);}}var zb={};function Ba(){if(!Ba.Qb){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:Ea||"./this.program"},b;for(b in zb)void 0===zb[b]?delete a[b]:a[b]=zb[b];var c=[];for(b in a)c.push(b+"="+a[b]);Ba.Qb=c}return Ba.Qb}function uc(a,b,c,d){for(var f=0,g=0;g>2],l=E[b+4>>2];b+=8;h=e.read(a,M,h,l,d);if(0>h)return-1;f+=h;if(h>>0<4194305-!!a?(a>>>0)+4294967296*b:NaN}function vc(a,b,c,d){for(var f=0,g=0;g>2],l=E[b+4>>2];b+=8;h=e.write(a,M,h,l,d);if(0>h)return-1;f+=h}return f}function bb(a){return 0===a%4&&(0!==a%100||0===a%400)}var wc=[31,29,31,30,31,30,31,31,30,31,30,31],xc=[31,28,31,30,31,30,31,31,30,31,30,31];function fd(a,b,c,d){function f(m,r,x){for(m="number"==typeof m?m.toString():m||"";m.lengthI?-1:0x-m.getDate())r-=x-m.getDate()+1,m.setDate(1),11>B?m.setMonth(B+1):(m.setMonth(0),m.setFullYear(m.getFullYear()+1));else{m.setDate(m.getDate()+r);break}}B=new Date(m.getFullYear()+1,0,4);r=l(new Date(m.getFullYear(),0,4));B=l(B);return 0>=h(r,m)?0>=h(B,m)?m.getFullYear()+1:m.getFullYear():m.getFullYear()-1}var n=v[d+40>>2];d={Vc:v[d>>2],Uc:v[d+4>>2],Ma:v[d+8>>2],pb:v[d+12>>2], +Na:v[d+16>>2],ha:v[d+20>>2],R:v[d+24>>2],ga:v[d+28>>2],Ad:v[d+32>>2],Tc:v[d+36>>2],Wc:n?ka(n):""};c=ka(c);n={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var q in n)c=c.replace(new RegExp(q, +"g"),n[q]);var t="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),u="January February March April May June July August September October November December".split(" ");n={"%a":function(m){return t[m.R].substring(0,3)},"%A":function(m){return t[m.R]},"%b":function(m){return u[m.Na].substring(0,3)},"%B":function(m){return u[m.Na]},"%C":function(m){return g((m.ha+1900)/100|0,2)},"%d":function(m){return g(m.pb,2)},"%e":function(m){return f(m.pb,2," ")},"%g":function(m){return p(m).toString().substring(2)}, +"%G":function(m){return p(m)},"%H":function(m){return g(m.Ma,2)},"%I":function(m){m=m.Ma;0==m?m=12:12m.Ma?"AM":"PM"},"%S":function(m){return g(m.Vc,2)},"%t":function(){return"\t"},"%u":function(m){return m.R||7},"%U":function(m){return g(Math.floor((m.ga+ +7-m.R)/7),2)},"%V":function(m){var r=Math.floor((m.ga+7-(m.R+6)%7)/7);2>=(m.R+371-m.ga-2)%7&&r++;if(r)53==r&&(x=(m.R+371-m.ga)%7,4==x||3==x&&bb(m.ha)||(r=1));else{r=52;var x=(m.R+7-m.ga-1)%7;(4==x||5==x&&bb(m.ha%400-1))&&r++}return g(r,2)},"%w":function(m){return m.R},"%W":function(m){return g(Math.floor((m.ga+7-(m.R+6)%7)/7),2)},"%y":function(m){return(m.ha+1900).toString().substring(2)},"%Y":function(m){return m.ha+1900},"%z":function(m){m=m.Tc;var r=0<=m;m=Math.abs(m)/60;return(r?"+":"-")+String("0000"+ +(m/60*100+m%60)).slice(-4)},"%Z":function(m){return m.Wc},"%%":function(){return"%"}};c=c.replace(/%%/g,"\x00\x00");for(q in n)c.includes(q)&&(c=c.replace(new RegExp(q,"g"),n[q](d)));c=c.replace(/\0\0/g,"%");q=Va(c,!1);if(q.length>b)return 0;M.set(q,a);return q.length-1}var yc=function(a,b,c,d){a||(a=this);this.parent=a;this.v=a.v;this.va=null;this.id=e.Cc++;this.name=b;this.mode=c;this.i={};this.l={};this.rdev=d};Object.defineProperties(yc.prototype,{read:{get:function(){return 365===(this.mode& +365)},set:function(a){a?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146===(this.mode&146)},set:function(a){a?this.mode|=146:this.mode&=-147}},uc:{get:function(){return e.D(this.mode)}},ab:{get:function(){return e.Ca(this.mode)}}});e.Tb=yc;e.Sc();var Vc;(function(){for(var a=Array(256),b=0;256>b;++b)a[b]=String.fromCharCode(b);hc=a})();ra=k.BindingError=qb(Error,"BindingError");ic=k.InternalError=qb(Error,"InternalError");ea.prototype.isAliasOf=function(a){if(!(this instanceof ea&& +a instanceof ea))return!1;var b=this.h.B.o,c=this.h.m,d=a.h.B.o;for(a=a.h.m;b.L;)c=b.ya(c),b=b.L;for(;d.L;)a=d.ya(a),d=d.L;return b===d&&c===a};ea.prototype.clone=function(){this.h.m||rb(this);if(this.h.xa)return this.h.count.value+=1,this;var a=Aa,b=Object,c=b.create,d=Object.getPrototypeOf(this),f=this.h;a=a(c.call(b,d,{h:{value:{count:f.count,ia:f.ia,xa:f.xa,m:f.m,B:f.B,G:f.G,K:f.K}}}));a.h.count.value+=1;a.h.ia=!1;return a};ea.prototype["delete"]=function(){this.h.m||rb(this);this.h.ia&&!this.h.xa&& +z("Object already scheduled for deletion");jc(this);kc(this.h);this.h.xa||(this.h.G=void 0,this.h.m=void 0)};ea.prototype.isDeleted=function(){return!this.h.m};ea.prototype.deleteLater=function(){this.h.m||rb(this);this.h.ia&&!this.h.xa&&z("Object already scheduled for deletion");xa.push(this);1===xa.length&&ya&&ya(tb);this.h.ia=!0;return this};k.getInheritedInstanceCount=function(){return Object.keys(za).length};k.getLiveInheritedInstances=function(){var a=[],b;for(b in za)za.hasOwnProperty(b)&& +a.push(za[b]);return a};k.flushPendingDeletes=tb;k.setDelayFunction=function(a){ya=a;xa.length&&ya&&ya(tb)};aa.prototype.qc=function(a){this.Pb&&(a=this.Pb(a));return a};aa.prototype.zb=function(a){this.fa&&this.fa(a)};aa.prototype.argPackAdvance=8;aa.prototype.readValueFromPointer=$a;aa.prototype.deleteObject=function(a){if(null!==a)a["delete"]()};aa.prototype.fromWireType=function(a){function b(){return this.Ga?Ya(this.o.ka,{B:this.Ic,m:c,K:this,G:a}):Ya(this.o.ka,{B:this,m:a})}var c=this.qc(a); +if(!c)return this.zb(a),null;var d=Wc(this.o,c);if(void 0!==d){if(0===d.h.count.value)return d.h.m=c,d.h.G=a,d.clone();d=d.clone();this.zb(a);return d}d=this.o.oc(c);d=mc[d];if(!d)return b.call(this);d=this.Da?d.ac:d.pointerType;var f=lc(c,this.o,d.o);return null===f?b.call(this):this.Ga?Ya(d.o.ka,{B:d,m:f,K:this,G:a}):Ya(d.o.ka,{B:d,m:f})};qc=k.UnboundTypeError=qb(Error,"UnboundTypeError");k.count_emval_handles=function(){for(var a=0,b=5;bf?-28:e.xb(d,f).fd;case 1:case 2:return 0;case 3:return d.flags;case 4:return f=A.get(),d.flags|= +f,0;case 5:return f=A.get(),la[f+0>>1]=2,0;case 6:case 7:return 0;case 16:case 8:return-28;case 9:return v[zc()>>2]=28,-1;default:return-28}}catch(g){if("undefined"==typeof e||!(g instanceof e.g))throw g;return-g.A}},__syscall_fstat64:function(a,b){try{var c=A.X(a);return A.Ba(e.stat,c.path,b)}catch(d){if("undefined"==typeof e||!(d instanceof e.g))throw d;return-d.A}},__syscall_lstat64:function(a,b){try{return a=A.sa(a),A.Ba(e.lstat,a,b)}catch(c){if("undefined"==typeof e||!(c instanceof e.g))throw c; +return-c.A}},__syscall_newfstatat:function(a,b,c,d){try{b=A.sa(b);var f=d&256;b=A.Sa(a,b,d&4096);return A.Ba(f?e.lstat:e.stat,b,c)}catch(g){if("undefined"==typeof e||!(g instanceof e.g))throw g;return-g.A}},__syscall_openat:function(a,b,c,d){A.za=d;try{b=A.sa(b);b=A.Sa(a,b);var f=d?A.get():0;return e.open(b,c,f).fd}catch(g){if("undefined"==typeof e||!(g instanceof e.g))throw g;return-g.A}},__syscall_stat64:function(a,b){try{return a=A.sa(a),A.Ba(e.stat,a,b)}catch(c){if("undefined"==typeof e||!(c instanceof +e.g))throw c;return-c.A}},__syscall_unlinkat:function(a,b,c){try{return b=A.sa(b),b=A.Sa(a,b),0===c?e.unlink(b):512===c?e.rmdir(b):Q("Invalid flags passed to unlinkat"),0}catch(d){if("undefined"==typeof e||!(d instanceof e.g))throw d;return-d.A}},_embind_register_bigint:function(){},_embind_register_bool:function(a,b,c,d,f){var g=nb(c);b=P(b);Z(a,{name:b,fromWireType:function(h){return!!h},toWireType:function(h,l){return l?d:f},argPackAdvance:8,readValueFromPointer:function(h){if(1===c)var l=M;else if(2=== +c)l=la;else if(4===c)l=v;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(l[h>>g])},S:null})},_embind_register_class:function(a,b,c,d,f,g,h,l,p,n,q,t,u){q=P(q);g=oa(f,g);l&&(l=oa(h,l));n&&(n=oa(p,n));u=oa(t,u);var m=ob(q);oc(m,function(){ab("Cannot construct "+q+" due to unbound types",[d])});sa([a,b,c],d?[d]:[],function(r){r=r[0];if(d){var x=r.o;var B=x.ka}else B=ea.prototype;r=pb(m,function(){if(Object.getPrototypeOf(this)!==I)throw new ra("Use 'new' to construct "+ +q);if(void 0===da.Z)throw new ra(q+" has no accessible constructor");var Ac=da.Z[arguments.length];if(void 0===Ac)throw new ra("Tried to invoke ctor of "+q+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(da.Z).toString()+") parameters instead!");return Ac.apply(this,arguments)});var I=Object.create(B,{constructor:{value:r}});r.prototype=I;var da=new Xc(q,r,I,u,x,g,l,n);x=new aa(q,da,!0,!1,!1);B=new aa(q+"*",da,!1,!1,!1);var K=new aa(q+" const*",da,!1,!0,!1);mc[a]= +{pointerType:B,ac:K};pc(m,r);return[x,B,K]})},_embind_register_class_constructor:function(a,b,c,d,f,g){0{ab("Cannot construct "+ +l.name+" due to unbound types",h)};sa([],h,function(n){n.splice(1,0,null);l.o.Z[b-1]=xb(p,n,null,f,g);return[]});return[]})},_embind_register_class_function:function(a,b,c,d,f,g,h,l){var p=wb(c,d);b=P(b);g=oa(f,g);sa([],[a],function(n){function q(){ab("Cannot call "+t+" due to unbound types",p)}n=n[0];var t=n.name+"."+b;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);l&&n.o.Jc.push(b);var u=n.o.ka,m=u[b];void 0===m||void 0===m.F&&m.className!==n.name&&m.Aa===c-2?(q.Aa=c-2,q.className=n.name,u[b]=q): +(nc(u,b,t),u[b].F[c-2]=q);sa([],p,function(r){r=xb(t,r,n,g,h);void 0===u[b].F?(r.Aa=c-2,u[b]=r):u[b].F[c-2]=r;return[]});return[]})},_embind_register_emval:function(a,b){b=P(b);Z(a,{name:b,fromWireType:function(c){var d=Za.Xc(c);tc(c);return d},toWireType:function(c,d){return Za.qb(d)},argPackAdvance:8,readValueFromPointer:$a,S:null})},_embind_register_float:function(a,b,c){c=nb(c);b=P(b);Z(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,f){return f},argPackAdvance:8,readValueFromPointer:dd(b, +c),S:null})},_embind_register_function:function(a,b,c,d,f,g){var h=wb(b,c);a=P(a);f=oa(d,f);oc(a,function(){ab("Cannot call "+a+" due to unbound types",h)},b-1);sa([],h,function(l){l=[l[0],null].concat(l.slice(1));pc(a,xb(a,l,null,f,g),b-1);return[]})},_embind_register_integer:function(a,b,c,d,f){b=P(b);-1===f&&(f=4294967295);f=nb(c);var g=l=>l;if(0===d){var h=32-8*c;g=l=>l<>>h}c=b.includes("unsigned")?function(l,p){return p>>>0}:function(l,p){return p};Z(a,{name:b,fromWireType:g,toWireType:c, +argPackAdvance:8,readValueFromPointer:ed(b,f,0!==d),S:null})},_embind_register_memory_view:function(a,b,c){function d(g){g>>=2;var h=E;return new f(Qa,h[g+1],h[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=P(c);Z(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{sc:!0})},_embind_register_std_string:function(a,b){b=P(b);var c="std::string"===b;Z(a,{name:b,fromWireType:function(d){var f=E[d>>2];if(c)for(var g=d+4,h=0;h<= +f;++h){var l=d+4+h;if(h==f||0==L[l]){g=ka(g,l-g);if(void 0===p)var p=g;else p+=String.fromCharCode(0),p+=g;g=l+1}}else{p=Array(f);for(h=0;hOa(f):()=>f.length)(),l=cb(4+h+1);E[l>>2]=h;if(c&&g)Na(f, +L,l+4,h+1);else if(g)for(g=0;gPa;var l=1}else 4===b&&(d=Oc,f=Pc,g=Qc,h=()=>E,l=2);Z(a,{name:c,fromWireType:function(p){for(var n=E[p>>2],q=h(),t,u=p+4,m=0;m<= +n;++m){var r=p+4+m*b;if(m==n||0==q[r>>l])u=d(u,r-u),void 0===t?t=u:(t+=String.fromCharCode(0),t+=u),u=r+b}U(p);return t},toWireType:function(p,n){"string"!=typeof n&&z("Cannot pass non-string to C++ string type "+c);var q=g(n),t=cb(4+q+b);E[t>>2]=q>>l;f(n,t+4,q+b);null!==p&&p.push(U,t);return t},argPackAdvance:8,readValueFromPointer:$a,S:function(p){U(p)}})},_embind_register_void:function(a,b){b=P(b);Z(a,{od:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},_emval_decref:tc, +_emval_incref:function(a){4>2]=l.Xb;return p}catch(n){if("undefined"==typeof e||!(n instanceof e.g))throw n;return-n.A}},_munmap_js:function(a,b,c,d,f,g){try{var h=e.W(f);h&&c&2&&A.jc(a,h,b,d,g)}catch(l){if("undefined"==typeof e||!(l instanceof +e.g))throw l;return-l.A}},abort:function(){Q("")},emscripten_memcpy_big:function(a,b,c){L.copyWithin(a,b,b+c)},emscripten_resize_heap:function(a){var b=L.length;a>>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);var f=Math;d=Math.max(a,d);f=f.min.call(f,2147483648,d+(65536-d%65536)%65536);a:{try{La.grow(f-Qa.byteLength+65535>>>16);Wb(La.buffer);var g=1;break a}catch(h){}g=void 0}if(g)return!0}return!1},environ_get:function(a,b){var c=0;Ba().forEach(function(d, +f){var g=b+c;f=E[a+4*f>>2]=g;for(g=0;g>0]=d.charCodeAt(g);M[f>>0]=0;c+=d.length+1});return 0},environ_sizes_get:function(a,b){var c=Ba();E[a>>2]=c.length;var d=0;c.forEach(function(f){d+=f.length+1});E[b>>2]=d;return 0},fd_close:function(a){try{var b=A.X(a);e.close(b);return 0}catch(c){if("undefined"==typeof e||!(c instanceof e.g))throw c;return c.A}},fd_pread:function(a,b,c,d,f,g){try{var h=Ab(d,f);if(isNaN(h))return 61;var l=A.X(a),p=uc(l,b,c,h);v[g>>2]=p;return 0}catch(n){if("undefined"== +typeof e||!(n instanceof e.g))throw n;return n.A}},fd_pwrite:function(a,b,c,d,f,g){try{var h=Ab(d,f);if(isNaN(h))return 61;var l=A.X(a),p=vc(l,b,c,h);v[g>>2]=p;return 0}catch(n){if("undefined"==typeof e||!(n instanceof e.g))throw n;return n.A}},fd_read:function(a,b,c,d){try{var f=A.X(a),g=uc(f,b,c);v[d>>2]=g;return 0}catch(h){if("undefined"==typeof e||!(h instanceof e.g))throw h;return h.A}},fd_seek:function(a,b,c,d,f){try{var g=Ab(b,c);if(isNaN(g))return 61;var h=A.X(a);e.J(h,g,d);W=[h.position>>> +0,(J=h.position,1<=+Math.abs(J)?0>>0:~~+Math.ceil((J-+(~~J>>>0))/4294967296)>>>0:0)];v[f>>2]=W[0];v[f+4>>2]=W[1];h.Xa&&0===g&&0===d&&(h.Xa=null);return 0}catch(l){if("undefined"==typeof e||!(l instanceof e.g))throw l;return l.A}},fd_write:function(a,b,c,d){try{var f=A.X(a),g=vc(f,b,c);E[d>>2]=g;return 0}catch(h){if("undefined"==typeof e||!(h instanceof e.g))throw h;return h.A}},getTempRet0:function(){return Kc()},invoke_diii:gd,invoke_fiii:hd, +invoke_i:jd,invoke_ii:kd,invoke_iii:ld,invoke_iiii:md,invoke_iiiii:nd,invoke_iiiiii:od,invoke_iiiiiii:pd,invoke_iiiiiiii:qd,invoke_iiiiiiiiiii:rd,invoke_iiiiiiiiiiii:sd,invoke_iiiiiiiiiiiii:td,invoke_iiiiij:ud,invoke_jiiii:vd,invoke_v:wd,invoke_vi:xd,invoke_vii:yd,invoke_viii:zd,invoke_viiii:Ad,invoke_viiiiiii:Bd,invoke_viiiiiiiiii:Cd,invoke_viiiiiiiiiiiiiii:Dd,llvm_eh_typeid_for:function(a){return a},setTempRet0:function(a){N(a)},strftime_l:function(a,b,c,d){return fd(a,b,c,d)}};(function(){function a(f){k.asm= +f.exports;La=k.asm.memory;Wb(La.buffer);Xb=k.asm.__indirect_function_table;Zb.unshift(k.asm.__wasm_call_ctors);Ra("wasm-instantiate")}function b(f){a(f.instance)}function c(f){return Sc().then(function(g){return WebAssembly.instantiate(g,d)}).then(function(g){return g}).then(f,function(g){T("failed to asynchronously prepare wasm: "+g);Q(g)})}var d={env:Bc,wasi_snapshot_preview1:Bc};mb("wasm-instantiate");if(k.instantiateWasm)try{return k.instantiateWasm(d,a)}catch(f){return T("Module.instantiateWasm callback failed with error: "+ +f),!1}(function(){return ua||"function"!=typeof WebAssembly.instantiateStreaming||ac(O)||O.startsWith("file://")||"function"!=typeof fetch?c(b):fetch(O,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,d).then(b,function(g){T("wasm streaming compile failed: "+g);T("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})();k.___wasm_call_ctors=function(){return(k.___wasm_call_ctors=k.asm.__wasm_call_ctors).apply(null,arguments)};k._main=function(){return(k._main= +k.asm.main).apply(null,arguments)};var cb=k._malloc=function(){return(cb=k._malloc=k.asm.malloc).apply(null,arguments)},zc=k.___errno_location=function(){return(zc=k.___errno_location=k.asm.__errno_location).apply(null,arguments)},U=k._free=function(){return(U=k._free=k.asm.free).apply(null,arguments)},sc=k.___getTypeName=function(){return(sc=k.___getTypeName=k.asm.__getTypeName).apply(null,arguments)};k.___embind_register_native_and_builtin_types=function(){return(k.___embind_register_native_and_builtin_types= +k.asm.__embind_register_native_and_builtin_types).apply(null,arguments)};k.___dl_seterr=function(){return(k.___dl_seterr=k.asm.__dl_seterr).apply(null,arguments)};var gc=k._emscripten_builtin_memalign=function(){return(gc=k._emscripten_builtin_memalign=k.asm.emscripten_builtin_memalign).apply(null,arguments)},D=k._setThrew=function(){return(D=k._setThrew=k.asm.setThrew).apply(null,arguments)},F=k.stackSave=function(){return(F=k.stackSave=k.asm.stackSave).apply(null,arguments)},G=k.stackRestore=function(){return(G= +k.stackRestore=k.asm.stackRestore).apply(null,arguments)},Bb=k.stackAlloc=function(){return(Bb=k.stackAlloc=k.asm.stackAlloc).apply(null,arguments)};k.___cxa_demangle=function(){return(k.___cxa_demangle=k.asm.__cxa_demangle).apply(null,arguments)};var db=k.___cxa_can_catch=function(){return(db=k.___cxa_can_catch=k.asm.__cxa_can_catch).apply(null,arguments)},cc=k.___cxa_is_pointer_type=function(){return(cc=k.___cxa_is_pointer_type=k.asm.__cxa_is_pointer_type).apply(null,arguments)};k.dynCall_ji=function(){return(k.dynCall_ji= +k.asm.dynCall_ji).apply(null,arguments)};k.dynCall_viijj=function(){return(k.dynCall_viijj=k.asm.dynCall_viijj).apply(null,arguments)};k.dynCall_iij=function(){return(k.dynCall_iij=k.asm.dynCall_iij).apply(null,arguments)};k.dynCall_iijj=function(){return(k.dynCall_iijj=k.asm.dynCall_iijj).apply(null,arguments)};k.dynCall_viij=function(){return(k.dynCall_viij=k.asm.dynCall_viij).apply(null,arguments)};k.dynCall_ij=function(){return(k.dynCall_ij=k.asm.dynCall_ij).apply(null,arguments)};k.dynCall_iiiji= +function(){return(k.dynCall_iiiji=k.asm.dynCall_iiiji).apply(null,arguments)};k.dynCall_iiiij=function(){return(k.dynCall_iiiij=k.asm.dynCall_iiiij).apply(null,arguments)};k.dynCall_vij=function(){return(k.dynCall_vij=k.asm.dynCall_vij).apply(null,arguments)};k.dynCall_jiji=function(){return(k.dynCall_jiji=k.asm.dynCall_jiji).apply(null,arguments)};var Cc=k.dynCall_iiiiij=function(){return(Cc=k.dynCall_iiiiij=k.asm.dynCall_iiiiij).apply(null,arguments)};k.dynCall_viijii=function(){return(k.dynCall_viijii= +k.asm.dynCall_viijii).apply(null,arguments)};var Dc=k.dynCall_jiiii=function(){return(Dc=k.dynCall_jiiii=k.asm.dynCall_jiiii).apply(null,arguments)};k.dynCall_iiiiijj=function(){return(k.dynCall_iiiiijj=k.asm.dynCall_iiiiijj).apply(null,arguments)};k.dynCall_iiiiiijj=function(){return(k.dynCall_iiiiiijj=k.asm.dynCall_iiiiiijj).apply(null,arguments)};function ld(a,b,c){var d=F();try{return C(a)(b,c)}catch(f){G(d);if(f!==f+0)throw f;D(1,0)}}function kd(a,b){var c=F();try{return C(a)(b)}catch(d){G(c); +if(d!==d+0)throw d;D(1,0)}}function zd(a,b,c,d){var f=F();try{C(a)(b,c,d)}catch(g){G(f);if(g!==g+0)throw g;D(1,0)}}function md(a,b,c,d){var f=F();try{return C(a)(b,c,d)}catch(g){G(f);if(g!==g+0)throw g;D(1,0)}}function wd(a){var b=F();try{C(a)()}catch(c){G(b);if(c!==c+0)throw c;D(1,0)}}function Ad(a,b,c,d,f){var g=F();try{C(a)(b,c,d,f)}catch(h){G(g);if(h!==h+0)throw h;D(1,0)}}function yd(a,b,c){var d=F();try{C(a)(b,c)}catch(f){G(d);if(f!==f+0)throw f;D(1,0)}}function pd(a,b,c,d,f,g,h){var l=F();try{return C(a)(b, +c,d,f,g,h)}catch(p){G(l);if(p!==p+0)throw p;D(1,0)}}function xd(a,b){var c=F();try{C(a)(b)}catch(d){G(c);if(d!==d+0)throw d;D(1,0)}}function jd(a){var b=F();try{return C(a)()}catch(c){G(b);if(c!==c+0)throw c;D(1,0)}}function od(a,b,c,d,f,g){var h=F();try{return C(a)(b,c,d,f,g)}catch(l){G(h);if(l!==l+0)throw l;D(1,0)}}function qd(a,b,c,d,f,g,h,l){var p=F();try{return C(a)(b,c,d,f,g,h,l)}catch(n){G(p);if(n!==n+0)throw n;D(1,0)}}function rd(a,b,c,d,f,g,h,l,p,n,q){var t=F();try{return C(a)(b,c,d,f,g, +h,l,p,n,q)}catch(u){G(t);if(u!==u+0)throw u;D(1,0)}}function nd(a,b,c,d,f){var g=F();try{return C(a)(b,c,d,f)}catch(h){G(g);if(h!==h+0)throw h;D(1,0)}}function td(a,b,c,d,f,g,h,l,p,n,q,t,u){var m=F();try{return C(a)(b,c,d,f,g,h,l,p,n,q,t,u)}catch(r){G(m);if(r!==r+0)throw r;D(1,0)}}function hd(a,b,c,d){var f=F();try{return C(a)(b,c,d)}catch(g){G(f);if(g!==g+0)throw g;D(1,0)}}function gd(a,b,c,d){var f=F();try{return C(a)(b,c,d)}catch(g){G(f);if(g!==g+0)throw g;D(1,0)}}function Bd(a,b,c,d,f,g,h,l){var p= +F();try{C(a)(b,c,d,f,g,h,l)}catch(n){G(p);if(n!==n+0)throw n;D(1,0)}}function sd(a,b,c,d,f,g,h,l,p,n,q,t){var u=F();try{return C(a)(b,c,d,f,g,h,l,p,n,q,t)}catch(m){G(u);if(m!==m+0)throw m;D(1,0)}}function Cd(a,b,c,d,f,g,h,l,p,n,q){var t=F();try{C(a)(b,c,d,f,g,h,l,p,n,q)}catch(u){G(t);if(u!==u+0)throw u;D(1,0)}}function Dd(a,b,c,d,f,g,h,l,p,n,q,t,u,m,r,x){var B=F();try{C(a)(b,c,d,f,g,h,l,p,n,q,t,u,m,r,x)}catch(I){G(B);if(I!==I+0)throw I;D(1,0)}}function ud(a,b,c,d,f,g,h){var l=F();try{return Cc(a, +b,c,d,f,g,h)}catch(p){G(l);if(p!==p+0)throw p;D(1,0)}}function vd(a,b,c,d,f){var g=F();try{return Dc(a,b,c,d,f)}catch(h){G(g);if(h!==h+0)throw h;D(1,0)}}k.print=ta;k.printErr=T;k.ALLOC_NORMAL=0;k.ALLOC_STACK=1;var eb;function Ka(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}va=function b(){eb||Cb();eb||(va=b)};function Ed(b){var c=k._main;b=b||[];b.unshift(Ea);var d=b.length,f=Bb(4*(d+1)),g=f>>2;b.forEach(p=>{var n=v,q=g++,t=Oa(p)+1,u=Bb(t);Na(p,M,u,t); +n[q]=u});v[g]=0;try{var h=c(d,f);Fd(h,!0);return h}catch(p){if(p instanceof Ka||"unwind"==p)var l=Ma;else Fa(1,p),l=void 0;return l}finally{}}function Cb(b){function c(){if(!eb&&(eb=!0,k.calledRun=!0,!kb)){k.noFSInit||e.Y.Za||e.Y();e.Mb=!1;ca.Y();Sa(Zb);Sa(Rc);if(k.onRuntimeInitialized)k.onRuntimeInitialized();Ec&&Ed(b);if(k.postRun)for("function"==typeof k.postRun&&(k.postRun=[k.postRun]);k.postRun.length;)$b.unshift(k.postRun.shift());Sa($b)}}b=b||hb;if(!(0