From 36d2c0b48f44acf9d1ecdbaba5f7ea4c5636815b Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Tue, 15 Sep 2026 16:10:52 +0300 Subject: [PATCH] repetition woks --- ...rker-AHwpujSZ.js => db-worker-DFFhVJkA.js} | 2 +- dist/assets/index-Ban37OPN.js | 111 ++++++++++ ...{index-u8F3m7-8.css => index-DkBF5-AQ.css} | 2 +- dist/assets/index-Dqxd5Tgf.js | 59 ------ dist/index.html | 4 +- src/db-types.ts | 186 ++++++++++++++++- src/db-worker.ts | 2 +- src/deck-page.ts | 171 ++++++++++++++++ src/decks-page.ts | 110 ++++------ src/main.ts | 25 ++- src/review-page.ts | 191 ++++++++++++++++++ src/style.css | 182 +++++++++++++++++ src/sync-page.ts | 42 +--- src/sync.ts | 1 - src/token.ts | 2 +- 15 files changed, 905 insertions(+), 185 deletions(-) rename dist/assets/{db-worker-AHwpujSZ.js => db-worker-DFFhVJkA.js} (99%) create mode 100644 dist/assets/index-Ban37OPN.js rename dist/assets/{index-u8F3m7-8.css => index-DkBF5-AQ.css} (73%) delete mode 100644 dist/assets/index-Dqxd5Tgf.js create mode 100644 src/deck-page.ts create mode 100644 src/review-page.ts diff --git a/dist/assets/db-worker-AHwpujSZ.js b/dist/assets/db-worker-DFFhVJkA.js similarity index 99% rename from dist/assets/db-worker-AHwpujSZ.js rename to dist/assets/db-worker-DFFhVJkA.js index 650d626..5538eff 100644 --- a/dist/assets/db-worker-AHwpujSZ.js +++ b/dist/assets/db-worker-DFFhVJkA.js @@ -1,3 +1,3 @@ var ft=(()=>{var qe=import.meta.url;return function(oe={}){var fe,i=oe,ye,be,Oe=new Promise((e,t)=>{ye=e,be=t}),Xe=typeof window=="object",Ce=typeof importScripts=="function";typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";const Pe=globalThis.sqlite3InitModuleState||Object.assign(Object.create(null),{debugModule:()=>{}});delete globalThis.sqlite3InitModuleState,Pe.debugModule("globalThis.location =",globalThis.location);var He=Object.assign({},i),re="./this.program",me="";function Ie(e){return i.locateFile?i.locateFile(e,me):me+e}var De,je;(Xe||Ce)&&(Ce?me=self.location.href:typeof document<"u"&&document.currentScript&&(me=document.currentScript.src),qe&&(me=qe),me.startsWith("blob:")?me="":me=me.substr(0,me.replace(/[?#].*/,"").lastIndexOf("/")+1),Ce&&(je=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),De=e=>fetch(e,{credentials:"same-origin"}).then(t=>t.ok?t.arrayBuffer():Promise.reject(new Error(t.status+" : "+t.url))));var Ve=i.print||console.log.bind(console),Le=i.printErr||console.error.bind(console);Object.assign(i,He),He=null,i.arguments&&i.arguments,i.thisProgram&&(re=i.thisProgram);var Ye=i.wasmBinary,Re,dt=!1,xe,Be,Ge,ue,Ee,ke;function pt(){var e=Re.buffer;i.HEAP8=xe=new Int8Array(e),i.HEAP16=Ge=new Int16Array(e),i.HEAPU8=Be=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAP32=ue=new Int32Array(e),i.HEAPU32=Ee=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e),i.HEAP64=ke=new BigInt64Array(e),i.HEAPU64=new BigUint64Array(e)}if(i.wasmMemory)Re=i.wasmMemory;else{var Pt=i.INITIAL_MEMORY||16777216;Re=new WebAssembly.Memory({initial:Pt/65536,maximum:32768})}pt();var ht=[],mt=[],gt=[];function Lt(){var e=i.preRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Rt)),ot(ht)}function Ct(){!i.noFSInit&&!a.initialized&&a.init(),a.ignorePermissions=!1,ot(mt)}function Dt(){var e=i.postRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Mt)),ot(gt)}function Rt(e){ht.unshift(e)}function Nt(e){mt.unshift(e)}function Mt(e){gt.unshift(e)}var Ne=0,$e=null;function tr(e){return e}function rt(e){Ne++,i.monitorRunDependencies?.(Ne)}function Ze(e){if(Ne--,i.monitorRunDependencies?.(Ne),Ne==0&&$e){var t=$e;$e=null,t()}}function st(e){i.onAbort?.(e),e="Aborted("+e+")",Le(e),dt=!0,e+=". Build with -sASSERTIONS for more info.";var t=new WebAssembly.RuntimeError(e);throw be(t),t}var jt="data:application/octet-stream;base64,",qt=e=>e.startsWith(jt);function Bt(){if(i.locateFile){var e="sqlite3.wasm";return qt(e)?e:Ie(e)}return new URL("/assets/sqlite3-DBpDb1lf.wasm",import.meta.url).href}var it;function bt(e){if(e==it&&Ye)return new Uint8Array(Ye);if(je)return je(e);throw"both async and sync fetching of the wasm failed"}function Ut(e){return Ye?Promise.resolve().then(()=>bt(e)):De(e).then(t=>new Uint8Array(t),()=>bt(e))}function yt(e,t,n){return Ut(e).then(r=>WebAssembly.instantiate(r,t)).then(n,r=>{Le(`failed to asynchronously prepare wasm: ${r}`),st(r)})}function zt(e,t,n,r){return!e&&typeof WebAssembly.instantiateStreaming=="function"&&!qt(t)&&typeof fetch=="function"?fetch(t,{credentials:"same-origin"}).then(s=>{var o=WebAssembly.instantiateStreaming(s,n);return o.then(r,function(p){return Le(`wasm streaming compile failed: ${p}`),Le("falling back to ArrayBuffer instantiation"),yt(t,n,r)})}):yt(t,n,r)}function Wt(){return{env:It,wasi_snapshot_preview1:It}}function Qt(){var e=Wt();function t(r,s){return h=r.exports,Nt(h.__wasm_call_ctors),Ze(),h}rt();function n(r){t(r.instance)}if(i.instantiateWasm)try{return i.instantiateWasm(e,t)}catch(r){Le(`Module.instantiateWasm callback failed with error: ${r}`),be(r)}return it??=Bt(),zt(Ye,it,e,n).catch(be),{}}var ot=e=>{e.forEach(t=>t(i))};i.noExitRuntime;var de={isAbs:e=>e.charAt(0)==="/",splitPath:e=>{var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return t.exec(e).slice(1)},normalizeArray:(e,t)=>{for(var n=0,r=e.length-1;r>=0;r--){var s=e[r];s==="."?e.splice(r,1):s===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n;n--)e.unshift("..");return e},normalize:e=>{var t=de.isAbs(e),n=e.substr(-1)==="/";return e=de.normalizeArray(e.split("/").filter(r=>!!r),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},dirname:e=>{var t=de.splitPath(e),n=t[0],r=t[1];return!n&&!r?".":(r&&(r=r.substr(0,r.length-1)),n+r)},basename:e=>{if(e==="/")return"/";e=de.normalize(e),e=e.replace(/\/$/,"");var t=e.lastIndexOf("/");return t===-1?e:e.substr(t+1)},join:(...e)=>de.normalize(e.join("/")),join2:(e,t)=>de.normalize(e+"/"+t)},Ht=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return e=>crypto.getRandomValues(e);st("initRandomDevice")},wt=e=>(wt=Ht())(e),Te={resolve:(...e)=>{for(var t="",n=!1,r=e.length-1;r>=-1&&!n;r--){var s=r>=0?e[r]:a.cwd();if(typeof s!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!s)return"";t=s+"/"+t,n=de.isAbs(s)}return t=de.normalizeArray(t.split("/").filter(o=>!!o),!n).join("/"),(n?"/":"")+t||"."},relative:(e,t)=>{e=Te.resolve(e).substr(1),t=Te.resolve(t).substr(1);function n(R){for(var z=0;z=0&&R[Q]==="";Q--);return z>Q?[]:R.slice(z,Q-z+1)}for(var r=n(e.split("/")),s=n(t.split("/")),o=Math.min(r.length,s.length),p=o,g=0;g{for(var r=t+n,s=t;e[s]&&!(s>=r);)++s;if(s-t>16&&e.buffer&&Et)return Et.decode(e.subarray(t,s));for(var o="";t>10,56320|R&1023)}}return o},lt=[],et=e=>{for(var t=0,n=0;n=55296&&r<=57343?(t+=4,++n):t+=3}return t},at=(e,t,n,r)=>{if(!(r>0))return 0;for(var s=n,o=n+r-1,p=0;p=55296&&g<=57343){var O=e.charCodeAt(++p);g=65536+((g&1023)<<10)|O&1023}if(g<=127){if(n>=o)break;t[n++]=g}else if(g<=2047){if(n+1>=o)break;t[n++]=192|g>>6,t[n++]=128|g&63}else if(g<=65535){if(n+2>=o)break;t[n++]=224|g>>12,t[n++]=128|g>>6&63,t[n++]=128|g&63}else{if(n+3>=o)break;t[n++]=240|g>>18,t[n++]=128|g>>12&63,t[n++]=128|g>>6&63,t[n++]=128|g&63}}return t[n]=0,n-s};function vt(e,t,n){var r=et(e)+1,s=new Array(r),o=at(e,s,0,s.length);return s.length=o,s}var Vt=()=>{if(!lt.length){var e=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(e=window.prompt("Input: "),e!==null&&(e+=` `)),!e)return null;lt=vt(e)}return lt.shift()},Me={ttys:[],init(){},shutdown(){},register(e,t){Me.ttys[e]={input:[],output:[],ops:t},a.registerDevice(e,Me.stream_ops)},stream_ops:{open(e){var t=Me.ttys[e.node.rdev];if(!t)throw new a.ErrnoError(43);e.tty=t,e.seekable=!1},close(e){e.tty.ops.fsync(e.tty)},fsync(e){e.tty.ops.fsync(e.tty)},read(e,t,n,r,s){if(!e.tty||!e.tty.ops.get_char)throw new a.ErrnoError(60);for(var o=0,p=0;p0&&(Ve(Ue(e.output)),e.output=[])},ioctl_tcgets(e){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(e,t,n){return 0},ioctl_tiocgwinsz(e){return[24,80]}},default_tty1_ops:{put_char(e,t){t===null||t===10?(Le(Ue(e.output)),e.output=[]):t!=0&&e.output.push(t)},fsync(e){e.output&&e.output.length>0&&(Le(Ue(e.output)),e.output=[])}}},Gt=(e,t)=>{Be.fill(0,e,e+t)},xt=(e,t)=>Math.ceil(e/t)*t,St=e=>{e=xt(e,65536);var t=kt(65536,e);return t&&Gt(t,e),t},le={ops_table:null,mount(e){return le.createNode(null,"/",16895,0)},createNode(e,t,n,r){if(a.isBlkdev(n)||a.isFIFO(n))throw new a.ErrnoError(63);le.ops_table||={dir:{node:{getattr:le.node_ops.getattr,setattr:le.node_ops.setattr,lookup:le.node_ops.lookup,mknod:le.node_ops.mknod,rename:le.node_ops.rename,unlink:le.node_ops.unlink,rmdir:le.node_ops.rmdir,readdir:le.node_ops.readdir,symlink:le.node_ops.symlink},stream:{llseek:le.stream_ops.llseek}},file:{node:{getattr:le.node_ops.getattr,setattr:le.node_ops.setattr},stream:{llseek:le.stream_ops.llseek,read:le.stream_ops.read,write:le.stream_ops.write,allocate:le.stream_ops.allocate,mmap:le.stream_ops.mmap,msync:le.stream_ops.msync}},link:{node:{getattr:le.node_ops.getattr,setattr:le.node_ops.setattr,readlink:le.node_ops.readlink},stream:{}},chrdev:{node:{getattr:le.node_ops.getattr,setattr:le.node_ops.setattr},stream:a.chrdev_stream_ops}};var s=a.createNode(e,t,n,r);return a.isDir(s.mode)?(s.node_ops=le.ops_table.dir.node,s.stream_ops=le.ops_table.dir.stream,s.contents={}):a.isFile(s.mode)?(s.node_ops=le.ops_table.file.node,s.stream_ops=le.ops_table.file.stream,s.usedBytes=0,s.contents=null):a.isLink(s.mode)?(s.node_ops=le.ops_table.link.node,s.stream_ops=le.ops_table.link.stream):a.isChrdev(s.mode)&&(s.node_ops=le.ops_table.chrdev.node,s.stream_ops=le.ops_table.chrdev.stream),s.timestamp=Date.now(),e&&(e.contents[t]=s,e.timestamp=s.timestamp),s},getFileDataAsTypedArray(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage(e,t){var n=e.contents?e.contents.length:0;if(!(n>=t)){var r=1024*1024;t=Math.max(t,n*(n>>0),n!=0&&(t=Math.max(t,256));var s=e.contents;e.contents=new Uint8Array(t),e.usedBytes>0&&e.contents.set(s.subarray(0,e.usedBytes),0)}},resizeFileStorage(e,t){if(e.usedBytes!=t)if(t==0)e.contents=null,e.usedBytes=0;else{var n=e.contents;e.contents=new Uint8Array(t),n&&e.contents.set(n.subarray(0,Math.min(t,e.usedBytes))),e.usedBytes=t}},node_ops:{getattr(e){var t={};return t.dev=a.isChrdev(e.mode)?e.id:1,t.ino=e.id,t.mode=e.mode,t.nlink=1,t.uid=0,t.gid=0,t.rdev=e.rdev,a.isDir(e.mode)?t.size=4096:a.isFile(e.mode)?t.size=e.usedBytes:a.isLink(e.mode)?t.size=e.link.length:t.size=0,t.atime=new Date(e.timestamp),t.mtime=new Date(e.timestamp),t.ctime=new Date(e.timestamp),t.blksize=4096,t.blocks=Math.ceil(t.size/t.blksize),t},setattr(e,t){t.mode!==void 0&&(e.mode=t.mode),t.timestamp!==void 0&&(e.timestamp=t.timestamp),t.size!==void 0&&le.resizeFileStorage(e,t.size)},lookup(e,t){throw a.genericErrors[44]},mknod(e,t,n,r){return le.createNode(e,t,n,r)},rename(e,t,n){if(a.isDir(e.mode)){var r;try{r=a.lookupNode(t,n)}catch{}if(r)for(var s in r.contents)throw new a.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=n,t.contents[n]=e,t.timestamp=e.parent.timestamp},unlink(e,t){delete e.contents[t],e.timestamp=Date.now()},rmdir(e,t){var n=a.lookupNode(e,t);for(var r in n.contents)throw new a.ErrnoError(55);delete e.contents[t],e.timestamp=Date.now()},readdir(e){var t=[".",".."];for(var n of Object.keys(e.contents))t.push(n);return t},symlink(e,t,n){var r=le.createNode(e,t,41471,0);return r.link=n,r},readlink(e){if(!a.isLink(e.mode))throw new a.ErrnoError(28);return e.link}},stream_ops:{read(e,t,n,r,s){var o=e.node.contents;if(s>=e.node.usedBytes)return 0;var p=Math.min(e.node.usedBytes-s,r);if(p>8&&o.subarray)t.set(o.subarray(s,s+p),n);else for(var g=0;g0||n+t{var s=`al ${e}`;De(e).then(o=>{t(new Uint8Array(o)),s&&Ze()},o=>{if(n)n();else throw`Loading data file "${e}" failed.`}),s&&rt()},Kt=(e,t,n,r,s,o)=>{a.createDataFile(e,t,n,r,s,o)},Jt=i.preloadPlugins||[],Xt=(e,t,n,r)=>{typeof Browser<"u"&&Browser.init();var s=!1;return Jt.forEach(o=>{s||o.canHandle(t)&&(o.handle(e,t,n,r),s=!0)}),s},Yt=(e,t,n,r,s,o,p,g,O,R)=>{var z=t?Te.resolve(de.join2(e,t)):e;function Q(T){function A(D){R?.(),g||Kt(e,t,D,r,s,O),o?.(),Ze()}Xt(T,z,A,()=>{p?.(),Ze()})||A(T)}rt(),typeof n=="string"?$t(n,Q,p):Q(n)},Zt=e=>{var t={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},n=t[e];if(typeof n>"u")throw new Error(`Unknown file open mode: ${e}`);return n},ct=(e,t)=>{var n=0;return e&&(n|=365),t&&(n|=146),n},a={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(e){this.name="ErrnoError",this.errno=e}},genericErrors:{},filesystems:null,syncFSRequests:0,readFiles:{},FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(e){this.node=e}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(e){this.shared.flags=e}get position(){return this.shared.position}set position(e){this.shared.position=e}},FSNode:class{constructor(e,t,n,r){e||(e=this),this.parent=e,this.mount=e.mount,this.mounted=null,this.id=a.nextInode++,this.name=t,this.mode=n,this.node_ops={},this.stream_ops={},this.rdev=r,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(e){e?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(e){e?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return a.isDir(this.mode)}get isDevice(){return a.isChrdev(this.mode)}},lookupPath(e,t={}){if(e=Te.resolve(e),!e)return{path:"",node:null};var n={follow_mount:!0,recurse_count:0};if(t=Object.assign(n,t),t.recurse_count>8)throw new a.ErrnoError(32);for(var r=e.split("/").filter(Q=>!!Q),s=a.root,o="/",p=0;p40)throw new a.ErrnoError(32)}}return{path:o,node:s}},getPath(e){for(var t;;){if(a.isRoot(e)){var n=e.mount.mountpoint;return t?n[n.length-1]!=="/"?`${n}/${t}`:n+t:n}t=t?`${e.name}/${t}`:e.name,e=e.parent}},hashName(e,t){for(var n=0,r=0;r>>0)%a.nameTable.length},hashAddNode(e){var t=a.hashName(e.parent.id,e.name);e.name_next=a.nameTable[t],a.nameTable[t]=e},hashRemoveNode(e){var t=a.hashName(e.parent.id,e.name);if(a.nameTable[t]===e)a.nameTable[t]=e.name_next;else for(var n=a.nameTable[t];n;){if(n.name_next===e){n.name_next=e.name_next;break}n=n.name_next}},lookupNode(e,t){var n=a.mayLookup(e);if(n)throw new a.ErrnoError(n);for(var r=a.hashName(e.id,t),s=a.nameTable[r];s;s=s.name_next){var o=s.name;if(s.parent.id===e.id&&o===t)return s}return a.lookup(e,t)},createNode(e,t,n,r){var s=new a.FSNode(e,t,n,r);return a.hashAddNode(s),s},destroyNode(e){a.hashRemoveNode(e)},isRoot(e){return e===e.parent},isMountpoint(e){return!!e.mounted},isFile(e){return(e&61440)===32768},isDir(e){return(e&61440)===16384},isLink(e){return(e&61440)===40960},isChrdev(e){return(e&61440)===8192},isBlkdev(e){return(e&61440)===24576},isFIFO(e){return(e&61440)===4096},isSocket(e){return(e&49152)===49152},flagsToPermissionString(e){var t=["r","w","rw"][e&3];return e&512&&(t+="w"),t},nodePermissions(e,t){return a.ignorePermissions?0:t.includes("r")&&!(e.mode&292)||t.includes("w")&&!(e.mode&146)||t.includes("x")&&!(e.mode&73)?2:0},mayLookup(e){if(!a.isDir(e.mode))return 54;var t=a.nodePermissions(e,"x");return t||(e.node_ops.lookup?0:2)},mayCreate(e,t){try{var n=a.lookupNode(e,t);return 20}catch{}return a.nodePermissions(e,"wx")},mayDelete(e,t,n){var r;try{r=a.lookupNode(e,t)}catch(o){return o.errno}var s=a.nodePermissions(e,"wx");if(s)return s;if(n){if(!a.isDir(r.mode))return 54;if(a.isRoot(r)||a.getPath(r)===a.cwd())return 10}else if(a.isDir(r.mode))return 31;return 0},mayOpen(e,t){return e?a.isLink(e.mode)?32:a.isDir(e.mode)&&(a.flagsToPermissionString(t)!=="r"||t&512)?31:a.nodePermissions(e,a.flagsToPermissionString(t)):44},MAX_OPEN_FDS:4096,nextfd(){for(var e=0;e<=a.MAX_OPEN_FDS;e++)if(!a.streams[e])return e;throw new a.ErrnoError(33)},getStreamChecked(e){var t=a.getStream(e);if(!t)throw new a.ErrnoError(8);return t},getStream:e=>a.streams[e],createStream(e,t=-1){return e=Object.assign(new a.FSStream,e),t==-1&&(t=a.nextfd()),e.fd=t,a.streams[t]=e,e},closeStream(e){a.streams[e]=null},dupStream(e,t=-1){var n=a.createStream(e,t);return n.stream_ops?.dup?.(n),n},chrdev_stream_ops:{open(e){var t=a.getDevice(e.node.rdev);e.stream_ops=t.stream_ops,e.stream_ops.open?.(e)},llseek(){throw new a.ErrnoError(70)}},major:e=>e>>8,minor:e=>e&255,makedev:(e,t)=>e<<8|t,registerDevice(e,t){a.devices[e]={stream_ops:t}},getDevice:e=>a.devices[e],getMounts(e){for(var t=[],n=[e];n.length;){var r=n.pop();t.push(r),n.push(...r.mounts)}return t},syncfs(e,t){typeof e=="function"&&(t=e,e=!1),a.syncFSRequests++,a.syncFSRequests>1&&Le(`warning: ${a.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var n=a.getMounts(a.root.mount),r=0;function s(p){return a.syncFSRequests--,t(p)}function o(p){if(p)return o.errored?void 0:(o.errored=!0,s(p));++r>=n.length&&s(null)}n.forEach(p=>{if(!p.type.syncfs)return o(null);p.type.syncfs(p,e,o)})},mount(e,t,n){var r=n==="/",s=!n,o;if(r&&a.root)throw new a.ErrnoError(10);if(!r&&!s){var p=a.lookupPath(n,{follow_mount:!1});if(n=p.path,o=p.node,a.isMountpoint(o))throw new a.ErrnoError(10);if(!a.isDir(o.mode))throw new a.ErrnoError(54)}var g={type:e,opts:t,mountpoint:n,mounts:[]},O=e.mount(g);return O.mount=g,g.root=O,r?a.root=O:o&&(o.mounted=g,o.mount&&o.mount.mounts.push(g)),O},unmount(e){var t=a.lookupPath(e,{follow_mount:!1});if(!a.isMountpoint(t.node))throw new a.ErrnoError(28);var n=t.node,r=n.mounted,s=a.getMounts(r);Object.keys(a.nameTable).forEach(p=>{for(var g=a.nameTable[p];g;){var O=g.name_next;s.includes(g.mount)&&a.destroyNode(g),g=O}}),n.mounted=null;var o=n.mount.mounts.indexOf(r);n.mount.mounts.splice(o,1)},lookup(e,t){return e.node_ops.lookup(e,t)},mknod(e,t,n){var r=a.lookupPath(e,{parent:!0}),s=r.node,o=de.basename(e);if(!o||o==="."||o==="..")throw new a.ErrnoError(28);var p=a.mayCreate(s,o);if(p)throw new a.ErrnoError(p);if(!s.node_ops.mknod)throw new a.ErrnoError(63);return s.node_ops.mknod(s,o,t,n)},create(e,t){return t=t!==void 0?t:438,t&=4095,t|=32768,a.mknod(e,t,0)},mkdir(e,t){return t=t!==void 0?t:511,t&=1023,t|=16384,a.mknod(e,t,0)},mkdirTree(e,t){for(var n=e.split("/"),r="",s=0;s"u"&&(n=t,t=438),t|=8192,a.mknod(e,t,n)},symlink(e,t){if(!Te.resolve(e))throw new a.ErrnoError(44);var n=a.lookupPath(t,{parent:!0}),r=n.node;if(!r)throw new a.ErrnoError(44);var s=de.basename(t),o=a.mayCreate(r,s);if(o)throw new a.ErrnoError(o);if(!r.node_ops.symlink)throw new a.ErrnoError(63);return r.node_ops.symlink(r,s,e)},rename(e,t){var n=de.dirname(e),r=de.dirname(t),s=de.basename(e),o=de.basename(t),p,g,O;if(p=a.lookupPath(e,{parent:!0}),g=p.node,p=a.lookupPath(t,{parent:!0}),O=p.node,!g||!O)throw new a.ErrnoError(44);if(g.mount!==O.mount)throw new a.ErrnoError(75);var R=a.lookupNode(g,s),z=Te.relative(e,r);if(z.charAt(0)!==".")throw new a.ErrnoError(28);if(z=Te.relative(t,n),z.charAt(0)!==".")throw new a.ErrnoError(55);var Q;try{Q=a.lookupNode(O,o)}catch{}if(R!==Q){var T=a.isDir(R.mode),A=a.mayDelete(g,s,T);if(A)throw new a.ErrnoError(A);if(A=Q?a.mayDelete(O,o,T):a.mayCreate(O,o),A)throw new a.ErrnoError(A);if(!g.node_ops.rename)throw new a.ErrnoError(63);if(a.isMountpoint(R)||Q&&a.isMountpoint(Q))throw new a.ErrnoError(10);if(O!==g&&(A=a.nodePermissions(g,"w"),A))throw new a.ErrnoError(A);a.hashRemoveNode(R);try{g.node_ops.rename(R,O,o),R.parent=O}catch(D){throw D}finally{a.hashAddNode(R)}}},rmdir(e){var t=a.lookupPath(e,{parent:!0}),n=t.node,r=de.basename(e),s=a.lookupNode(n,r),o=a.mayDelete(n,r,!0);if(o)throw new a.ErrnoError(o);if(!n.node_ops.rmdir)throw new a.ErrnoError(63);if(a.isMountpoint(s))throw new a.ErrnoError(10);n.node_ops.rmdir(n,r),a.destroyNode(s)},readdir(e){var t=a.lookupPath(e,{follow:!0}),n=t.node;if(!n.node_ops.readdir)throw new a.ErrnoError(54);return n.node_ops.readdir(n)},unlink(e){var t=a.lookupPath(e,{parent:!0}),n=t.node;if(!n)throw new a.ErrnoError(44);var r=de.basename(e),s=a.lookupNode(n,r),o=a.mayDelete(n,r,!1);if(o)throw new a.ErrnoError(o);if(!n.node_ops.unlink)throw new a.ErrnoError(63);if(a.isMountpoint(s))throw new a.ErrnoError(10);n.node_ops.unlink(n,r),a.destroyNode(s)},readlink(e){var t=a.lookupPath(e),n=t.node;if(!n)throw new a.ErrnoError(44);if(!n.node_ops.readlink)throw new a.ErrnoError(28);return Te.resolve(a.getPath(n.parent),n.node_ops.readlink(n))},stat(e,t){var n=a.lookupPath(e,{follow:!t}),r=n.node;if(!r)throw new a.ErrnoError(44);if(!r.node_ops.getattr)throw new a.ErrnoError(63);return r.node_ops.getattr(r)},lstat(e){return a.stat(e,!0)},chmod(e,t,n){var r;if(typeof e=="string"){var s=a.lookupPath(e,{follow:!n});r=s.node}else r=e;if(!r.node_ops.setattr)throw new a.ErrnoError(63);r.node_ops.setattr(r,{mode:t&4095|r.mode&-4096,timestamp:Date.now()})},lchmod(e,t){a.chmod(e,t,!0)},fchmod(e,t){var n=a.getStreamChecked(e);a.chmod(n.node,t)},chown(e,t,n,r){var s;if(typeof e=="string"){var o=a.lookupPath(e,{follow:!r});s=o.node}else s=e;if(!s.node_ops.setattr)throw new a.ErrnoError(63);s.node_ops.setattr(s,{timestamp:Date.now()})},lchown(e,t,n){a.chown(e,t,n,!0)},fchown(e,t,n){var r=a.getStreamChecked(e);a.chown(r.node,t,n)},truncate(e,t){if(t<0)throw new a.ErrnoError(28);var n;if(typeof e=="string"){var r=a.lookupPath(e,{follow:!0});n=r.node}else n=e;if(!n.node_ops.setattr)throw new a.ErrnoError(63);if(a.isDir(n.mode))throw new a.ErrnoError(31);if(!a.isFile(n.mode))throw new a.ErrnoError(28);var s=a.nodePermissions(n,"w");if(s)throw new a.ErrnoError(s);n.node_ops.setattr(n,{size:t,timestamp:Date.now()})},ftruncate(e,t){var n=a.getStreamChecked(e);if((n.flags&2097155)===0)throw new a.ErrnoError(28);a.truncate(n.node,t)},utime(e,t,n){var r=a.lookupPath(e,{follow:!0}),s=r.node;s.node_ops.setattr(s,{timestamp:Math.max(t,n)})},open(e,t,n){if(e==="")throw new a.ErrnoError(44);t=typeof t=="string"?Zt(t):t,t&64?(n=typeof n>"u"?438:n,n=n&4095|32768):n=0;var r;if(typeof e=="object")r=e;else{e=de.normalize(e);try{var s=a.lookupPath(e,{follow:!(t&131072)});r=s.node}catch{}}var o=!1;if(t&64)if(r){if(t&128)throw new a.ErrnoError(20)}else r=a.mknod(e,n,0),o=!0;if(!r)throw new a.ErrnoError(44);if(a.isChrdev(r.mode)&&(t&=-513),t&65536&&!a.isDir(r.mode))throw new a.ErrnoError(54);if(!o){var p=a.mayOpen(r,t);if(p)throw new a.ErrnoError(p)}t&512&&!o&&a.truncate(r,0),t&=-131713;var g=a.createStream({node:r,path:a.getPath(r),flags:t,seekable:!0,position:0,stream_ops:r.stream_ops,ungotten:[],error:!1});return g.stream_ops.open&&g.stream_ops.open(g),i.logReadFiles&&!(t&1)&&(e in a.readFiles||(a.readFiles[e]=1)),g},close(e){if(a.isClosed(e))throw new a.ErrnoError(8);e.getdents&&(e.getdents=null);try{e.stream_ops.close&&e.stream_ops.close(e)}catch(t){throw t}finally{a.closeStream(e.fd)}e.fd=null},isClosed(e){return e.fd===null},llseek(e,t,n){if(a.isClosed(e))throw new a.ErrnoError(8);if(!e.seekable||!e.stream_ops.llseek)throw new a.ErrnoError(70);if(n!=0&&n!=1&&n!=2)throw new a.ErrnoError(28);return e.position=e.stream_ops.llseek(e,t,n),e.ungotten=[],e.position},read(e,t,n,r,s){if(r<0||s<0)throw new a.ErrnoError(28);if(a.isClosed(e))throw new a.ErrnoError(8);if((e.flags&2097155)===1)throw new a.ErrnoError(8);if(a.isDir(e.node.mode))throw new a.ErrnoError(31);if(!e.stream_ops.read)throw new a.ErrnoError(28);var o=typeof s<"u";if(!o)s=e.position;else if(!e.seekable)throw new a.ErrnoError(70);var p=e.stream_ops.read(e,t,n,r,s);return o||(e.position+=p),p},write(e,t,n,r,s,o){if(r<0||s<0)throw new a.ErrnoError(28);if(a.isClosed(e))throw new a.ErrnoError(8);if((e.flags&2097155)===0)throw new a.ErrnoError(8);if(a.isDir(e.node.mode))throw new a.ErrnoError(31);if(!e.stream_ops.write)throw new a.ErrnoError(28);e.seekable&&e.flags&1024&&a.llseek(e,0,2);var p=typeof s<"u";if(!p)s=e.position;else if(!e.seekable)throw new a.ErrnoError(70);var g=e.stream_ops.write(e,t,n,r,s,o);return p||(e.position+=g),g},allocate(e,t,n){if(a.isClosed(e))throw new a.ErrnoError(8);if(t<0||n<=0)throw new a.ErrnoError(28);if((e.flags&2097155)===0)throw new a.ErrnoError(8);if(!a.isFile(e.node.mode)&&!a.isDir(e.node.mode))throw new a.ErrnoError(43);if(!e.stream_ops.allocate)throw new a.ErrnoError(138);e.stream_ops.allocate(e,t,n)},mmap(e,t,n,r,s){if((r&2)!==0&&(s&2)===0&&(e.flags&2097155)!==2)throw new a.ErrnoError(2);if((e.flags&2097155)===1)throw new a.ErrnoError(2);if(!e.stream_ops.mmap)throw new a.ErrnoError(43);if(!t)throw new a.ErrnoError(28);return e.stream_ops.mmap(e,t,n,r,s)},msync(e,t,n,r,s){return e.stream_ops.msync?e.stream_ops.msync(e,t,n,r,s):0},ioctl(e,t,n){if(!e.stream_ops.ioctl)throw new a.ErrnoError(59);return e.stream_ops.ioctl(e,t,n)},readFile(e,t={}){if(t.flags=t.flags||0,t.encoding=t.encoding||"binary",t.encoding!=="utf8"&&t.encoding!=="binary")throw new Error(`Invalid encoding type "${t.encoding}"`);var n,r=a.open(e,t.flags),s=a.stat(e),o=s.size,p=new Uint8Array(o);return a.read(r,p,0,o,0),t.encoding==="utf8"?n=Ue(p):t.encoding==="binary"&&(n=p),a.close(r),n},writeFile(e,t,n={}){n.flags=n.flags||577;var r=a.open(e,n.flags,n.mode);if(typeof t=="string"){var s=new Uint8Array(et(t)+1),o=at(t,s,0,s.length);a.write(r,s,0,o,void 0,n.canOwn)}else if(ArrayBuffer.isView(t))a.write(r,t,0,t.byteLength,void 0,n.canOwn);else throw new Error("Unsupported data type");a.close(r)},cwd:()=>a.currentPath,chdir(e){var t=a.lookupPath(e,{follow:!0});if(t.node===null)throw new a.ErrnoError(44);if(!a.isDir(t.node.mode))throw new a.ErrnoError(54);var n=a.nodePermissions(t.node,"x");if(n)throw new a.ErrnoError(n);a.currentPath=t.path},createDefaultDirectories(){a.mkdir("/tmp"),a.mkdir("/home"),a.mkdir("/home/web_user")},createDefaultDevices(){a.mkdir("/dev"),a.registerDevice(a.makedev(1,3),{read:()=>0,write:(r,s,o,p,g)=>p}),a.mkdev("/dev/null",a.makedev(1,3)),Me.register(a.makedev(5,0),Me.default_tty_ops),Me.register(a.makedev(6,0),Me.default_tty1_ops),a.mkdev("/dev/tty",a.makedev(5,0)),a.mkdev("/dev/tty1",a.makedev(6,0));var e=new Uint8Array(1024),t=0,n=()=>(t===0&&(t=wt(e).byteLength),e[--t]);a.createDevice("/dev","random",n),a.createDevice("/dev","urandom",n),a.mkdir("/dev/shm"),a.mkdir("/dev/shm/tmp")},createSpecialDirectories(){a.mkdir("/proc");var e=a.mkdir("/proc/self");a.mkdir("/proc/self/fd"),a.mount({mount(){var t=a.createNode(e,"fd",16895,73);return t.node_ops={lookup(n,r){var s=+r,o=a.getStreamChecked(s),p={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>o.path}};return p.parent=p,p}},t}},{},"/proc/self/fd")},createStandardStreams(e,t,n){e?a.createDevice("/dev","stdin",e):a.symlink("/dev/tty","/dev/stdin"),t?a.createDevice("/dev","stdout",null,t):a.symlink("/dev/tty","/dev/stdout"),n?a.createDevice("/dev","stderr",null,n):a.symlink("/dev/tty1","/dev/stderr"),a.open("/dev/stdin",0),a.open("/dev/stdout",1),a.open("/dev/stderr",1)},staticInit(){[44].forEach(e=>{a.genericErrors[e]=new a.ErrnoError(e),a.genericErrors[e].stack=""}),a.nameTable=new Array(4096),a.mount(le,{},"/"),a.createDefaultDirectories(),a.createDefaultDevices(),a.createSpecialDirectories(),a.filesystems={MEMFS:le}},init(e,t,n){a.initialized=!0,e??=i.stdin,t??=i.stdout,n??=i.stderr,a.createStandardStreams(e,t,n)},quit(){a.initialized=!1;for(var e=0;ethis.length-1||A<0)){var D=A%this.chunkSize,q=A/this.chunkSize|0;return this.getter(q)[D]}}setDataGetter(A){this.getter=A}cacheLength(){var A=new XMLHttpRequest;if(A.open("HEAD",n,!1),A.send(null),!(A.status>=200&&A.status<300||A.status===304))throw new Error("Couldn't load "+n+". Status: "+A.status);var D=Number(A.getResponseHeader("Content-length")),q,w=(q=A.getResponseHeader("Accept-Ranges"))&&q==="bytes",x=(q=A.getResponseHeader("Content-Encoding"))&&q==="gzip",N=1024*1024;w||(N=D);var P=(L,$)=>{if(L>$)throw new Error("invalid range ("+L+", "+$+") or no bytes requested!");if($>D-1)throw new Error("only "+D+" bytes available! programmer error!");var c=new XMLHttpRequest;if(c.open("GET",n,!1),D!==N&&c.setRequestHeader("Range","bytes="+L+"-"+$),c.responseType="arraybuffer",c.overrideMimeType&&c.overrideMimeType("text/plain; charset=x-user-defined"),c.send(null),!(c.status>=200&&c.status<300||c.status===304))throw new Error("Couldn't load "+n+". Status: "+c.status);return c.response!==void 0?new Uint8Array(c.response||[]):vt(c.responseText||"")},S=this;S.setDataGetter(L=>{var $=L*N,c=(L+1)*N-1;if(c=Math.min(c,D-1),typeof S.chunks[L]>"u"&&(S.chunks[L]=P($,c)),typeof S.chunks[L]>"u")throw new Error("doXHR failed!");return S.chunks[L]}),(x||!D)&&(N=D=1,D=this.getter(0).length,N=D,Ve("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=D,this._chunkSize=N,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){if(!Ce)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var p=new o,g={isDevice:!1,contents:p}}else var g={isDevice:!1,url:n};var O=a.createFile(e,t,g,r,s);g.contents?O.contents=g.contents:g.url&&(O.contents=null,O.url=g.url),Object.defineProperties(O,{usedBytes:{get:function(){return this.contents.length}}});var R={},z=Object.keys(O.stream_ops);z.forEach(T=>{var A=O.stream_ops[T];R[T]=(...D)=>(a.forceLoadFile(O),A(...D))});function Q(T,A,D,q,w){var x=T.node.contents;if(w>=x.length)return 0;var N=Math.min(x.length-w,q);if(x.slice)for(var P=0;P(a.forceLoadFile(O),Q(T,A,D,q,w)),R.mmap=(T,A,D,q,w)=>{a.forceLoadFile(O);var x=St(A);if(!x)throw new a.ErrnoError(48);return Q(T,xe,x,A,D),{ptr:x,allocated:!0}},O.stream_ops=R,O}},en=(e,t)=>e?Ue(Be,e,t):"",ce={DEFAULT_POLLMASK:5,calculateAt(e,t,n){if(de.isAbs(t))return t;var r;if(e===-100)r=a.cwd();else{var s=ce.getStreamFromFD(e);r=s.path}if(t.length==0){if(!n)throw new a.ErrnoError(44);return r}return de.join2(r,t)},doStat(e,t,n){var r=e(t);ue[n>>2]=r.dev,ue[n+4>>2]=r.mode,Ee[n+8>>2]=r.nlink,ue[n+12>>2]=r.uid,ue[n+16>>2]=r.gid,ue[n+20>>2]=r.rdev,ke[n+24>>3]=BigInt(r.size),ue[n+32>>2]=4096,ue[n+36>>2]=r.blocks;var s=r.atime.getTime(),o=r.mtime.getTime(),p=r.ctime.getTime();return ke[n+40>>3]=BigInt(Math.floor(s/1e3)),Ee[n+48>>2]=s%1e3*1e3*1e3,ke[n+56>>3]=BigInt(Math.floor(o/1e3)),Ee[n+64>>2]=o%1e3*1e3*1e3,ke[n+72>>3]=BigInt(Math.floor(p/1e3)),Ee[n+80>>2]=p%1e3*1e3*1e3,ke[n+88>>3]=BigInt(r.ino),0},doMsync(e,t,n,r,s){if(!a.isFile(t.node.mode))throw new a.ErrnoError(43);if(r&2)return 0;var o=Be.slice(e,e+n);a.msync(t,o,s,n,r)},getStreamFromFD(e){var t=a.getStreamChecked(e);return t},varargs:void 0,getStr(e){var t=en(e);return t}};function tn(e,t){try{return e=ce.getStr(e),a.chmod(e,t),0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function nn(e,t,n,r){try{if(t=ce.getStr(t),t=ce.calculateAt(e,t),n&-8)return-28;var s=a.lookupPath(t,{follow:!0}),o=s.node;if(!o)return-44;var p="";return n&4&&(p+="r"),n&2&&(p+="w"),n&1&&(p+="x"),p&&a.nodePermissions(o,p)?-2:0}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}function rn(e,t){try{return a.fchmod(e,t),0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function sn(e,t,n){try{return a.fchown(e,t,n),0}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}function tt(){var e=ue[+ce.varargs>>2];return ce.varargs+=4,e}var ze=tt;function on(e,t,n){ce.varargs=n;try{var r=ce.getStreamFromFD(e);switch(t){case 0:{var s=tt();if(s<0)return-28;for(;a.streams[s];)s++;var o;return o=a.dupStream(r,s),o.fd}case 1:case 2:return 0;case 3:return r.flags;case 4:{var s=tt();return r.flags|=s,0}case 12:{var s=ze(),p=0;return Ge[s+p>>1]=2,0}case 13:case 14:return 0}return-28}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}function ln(e,t){try{var n=ce.getStreamFromFD(e);return ce.doStat(a.stat,n.path,t)}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}var an=9007199254740992,cn=-9007199254740992,Ke=e=>ean?NaN:Number(e);function _n(e,t){t=Ke(t);try{return isNaN(t)?61:(a.ftruncate(e,t),0)}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}var We=(e,t,n)=>at(e,Be,t,n);function un(e,t){try{if(t===0)return-28;var n=a.cwd(),r=et(n)+1;return t"u"||s.name!=="ErrnoError")throw s;return-s.errno}}function fn(e,t,n){ce.varargs=n;try{var r=ce.getStreamFromFD(e);switch(t){case 21509:return r.tty?0:-59;case 21505:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tcgets){var s=r.tty.ops.ioctl_tcgets(r),o=ze();ue[o>>2]=s.c_iflag||0,ue[o+4>>2]=s.c_oflag||0,ue[o+8>>2]=s.c_cflag||0,ue[o+12>>2]=s.c_lflag||0;for(var p=0;p<32;p++)xe[o+p+17]=s.c_cc[p]||0;return 0}return 0}case 21510:case 21511:case 21512:return r.tty?0:-59;case 21506:case 21507:case 21508:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tcsets){for(var o=ze(),g=ue[o>>2],O=ue[o+4>>2],R=ue[o+8>>2],z=ue[o+12>>2],Q=[],p=0;p<32;p++)Q.push(xe[o+p+17]);return r.tty.ops.ioctl_tcsets(r.tty,t,{c_iflag:g,c_oflag:O,c_cflag:R,c_lflag:z,c_cc:Q})}return 0}case 21519:{if(!r.tty)return-59;var o=ze();return ue[o>>2]=0,0}case 21520:return r.tty?-28:-59;case 21531:{var o=ze();return a.ioctl(r,t,o)}case 21523:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tiocgwinsz){var T=r.tty.ops.ioctl_tiocgwinsz(r.tty),o=ze();Ge[o>>1]=T[0],Ge[o+2>>1]=T[1]}return 0}case 21524:return r.tty?0:-59;case 21515:return r.tty?0:-59;default:return-28}}catch(A){if(typeof a>"u"||A.name!=="ErrnoError")throw A;return-A.errno}}function dn(e,t){try{return e=ce.getStr(e),ce.doStat(a.lstat,e,t)}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function pn(e,t,n){try{return t=ce.getStr(t),t=ce.calculateAt(e,t),t=de.normalize(t),t[t.length-1]==="/"&&(t=t.substr(0,t.length-1)),a.mkdir(t,n,0),0}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}function hn(e,t,n,r){try{t=ce.getStr(t);var s=r&256,o=r&4096;return r=r&-6401,t=ce.calculateAt(e,t,o),ce.doStat(s?a.lstat:a.stat,t,n)}catch(p){if(typeof a>"u"||p.name!=="ErrnoError")throw p;return-p.errno}}function mn(e,t,n,r){ce.varargs=r;try{t=ce.getStr(t),t=ce.calculateAt(e,t);var s=r?tt():0;return a.open(t,n,s).fd}catch(o){if(typeof a>"u"||o.name!=="ErrnoError")throw o;return-o.errno}}function gn(e,t,n,r){try{if(t=ce.getStr(t),t=ce.calculateAt(e,t),r<=0)return-28;var s=a.readlink(t),o=Math.min(r,et(s)),p=xe[n+o];return We(s,n,r+1),xe[n+o]=p,o}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}function qn(e){try{return e=ce.getStr(e),a.rmdir(e),0}catch(t){if(typeof a>"u"||t.name!=="ErrnoError")throw t;return-t.errno}}function bn(e,t){try{return e=ce.getStr(e),ce.doStat(a.stat,e,t)}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return-n.errno}}function yn(e,t,n){try{return t=ce.getStr(t),t=ce.calculateAt(e,t),n===0?a.unlink(t):n===512?a.rmdir(t):st("Invalid flags passed to unlinkat"),0}catch(r){if(typeof a>"u"||r.name!=="ErrnoError")throw r;return-r.errno}}var At=e=>Ee[e>>2]+ue[e+4>>2]*4294967296;function wn(e,t,n,r){try{t=ce.getStr(t),t=ce.calculateAt(e,t,!0);var s=Date.now(),o,p;if(!n)o=s,p=s;else{var g=At(n),O=ue[n+8>>2];O==1073741823?o=s:O==1073741822?o=-1:o=g*1e3+O/1e6,n+=16,g=At(n),O=ue[n+8>>2],O==1073741823?p=s:O==1073741822?p=-1:p=g*1e3+O/1e6}return(p!=-1||o!=-1)&&a.utime(t,o,p),0}catch(R){if(typeof a>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var En=1,vn=()=>En,xn=e=>e%4===0&&(e%100!==0||e%400===0),Sn=[0,31,60,91,121,152,182,213,244,274,305,335],An=[0,31,59,90,120,151,181,212,243,273,304,334],In=e=>{var t=xn(e.getFullYear()),n=t?Sn:An,r=n[e.getMonth()]+e.getDate()-1;return r};function kn(e,t){e=Ke(e);var n=new Date(e*1e3);ue[t>>2]=n.getSeconds(),ue[t+4>>2]=n.getMinutes(),ue[t+8>>2]=n.getHours(),ue[t+12>>2]=n.getDate(),ue[t+16>>2]=n.getMonth(),ue[t+20>>2]=n.getFullYear()-1900,ue[t+24>>2]=n.getDay();var r=In(n)|0;ue[t+28>>2]=r,ue[t+36>>2]=-(n.getTimezoneOffset()*60);var s=new Date(n.getFullYear(),0,1),o=new Date(n.getFullYear(),6,1).getTimezoneOffset(),p=s.getTimezoneOffset(),g=(o!=p&&n.getTimezoneOffset()==Math.min(p,o))|0;ue[t+32>>2]=g}function Tn(e,t,n,r,s,o,p){s=Ke(s);try{if(isNaN(s))return 61;var g=ce.getStreamFromFD(r),O=a.mmap(g,e,s,t,n),R=O.ptr;return ue[o>>2]=O.allocated,Ee[p>>2]=R,0}catch(z){if(typeof a>"u"||z.name!=="ErrnoError")throw z;return-z.errno}}function Fn(e,t,n,r,s,o){o=Ke(o);try{var p=ce.getStreamFromFD(s);n&2&&ce.doMsync(e,p,t,r,o)}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return-g.errno}}var On=(e,t,n,r)=>{var s=new Date().getFullYear(),o=new Date(s,0,1),p=new Date(s,6,1),g=o.getTimezoneOffset(),O=p.getTimezoneOffset(),R=Math.max(g,O);Ee[e>>2]=R*60,ue[t>>2]=+(g!=O);var z=A=>{var D=A>=0?"-":"+",q=Math.abs(A),w=String(Math.floor(q/60)).padStart(2,"0"),x=String(q%60).padStart(2,"0");return`UTC${D}${w}${x}`},Q=z(g),T=z(O);ODate.now(),Ln=()=>performance.now(),Cn=()=>2147483648,Dn=e=>{var t=Re.buffer,n=(e-t.byteLength+65535)/65536|0;try{return Re.grow(n),pt(),1}catch{}},Rn=e=>{var t=Be.length;e>>>=0;var n=Cn();if(e>n)return!1;for(var r=1;r<=4;r*=2){var s=t*(1+.2/r);s=Math.min(s,e+100663296);var o=Math.min(n,xt(Math.max(e,s),65536)),p=Dn(o);if(p)return!0}return!1},_t={},Nn=()=>re||"./this.program",Je=()=>{if(!Je.strings){var e=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:e,_:Nn()};for(var n in _t)_t[n]===void 0?delete t[n]:t[n]=_t[n];var r=[];for(var n in t)r.push(`${n}=${t[n]}`);Je.strings=r}return Je.strings},Mn=(e,t)=>{for(var n=0;n{var n=0;return Je().forEach((r,s)=>{var o=t+n;Ee[e+s*4>>2]=o,Mn(r,o),n+=r.length+1}),0},Bn=(e,t)=>{var n=Je();Ee[e>>2]=n.length;var r=0;return n.forEach(s=>r+=s.length+1),Ee[t>>2]=r,0};function Un(e){try{var t=ce.getStreamFromFD(e);return a.close(t),0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return n.errno}}function zn(e,t){try{var n=0,r=0,s=0,o=ce.getStreamFromFD(e),p=o.tty?2:a.isDir(o.mode)?3:a.isLink(o.mode)?7:4;return xe[t]=p,Ge[t+2>>1]=s,ke[t+8>>3]=BigInt(n),ke[t+16>>3]=BigInt(r),0}catch(g){if(typeof a>"u"||g.name!=="ErrnoError")throw g;return g.errno}}var Wn=(e,t,n,r)=>{for(var s=0,o=0;o>2],g=Ee[t+4>>2];t+=8;var O=a.read(e,xe,p,g,r);if(O<0)return-1;if(s+=O,O>2]=o,0}catch(p){if(typeof a>"u"||p.name!=="ErrnoError")throw p;return p.errno}}function Hn(e,t,n,r){t=Ke(t);try{if(isNaN(t))return 61;var s=ce.getStreamFromFD(e);return a.llseek(s,t,n),ke[r>>3]=BigInt(s.position),s.getdents&&t===0&&n===0&&(s.getdents=null),0}catch(o){if(typeof a>"u"||o.name!=="ErrnoError")throw o;return o.errno}}function Vn(e){try{var t=ce.getStreamFromFD(e);return t.stream_ops?.fsync?t.stream_ops.fsync(t):0}catch(n){if(typeof a>"u"||n.name!=="ErrnoError")throw n;return n.errno}}var Gn=(e,t,n,r)=>{for(var s=0,o=0;o>2],g=Ee[t+4>>2];t+=8;var O=a.write(e,xe,p,g,r);if(O<0)return-1;if(s+=O,O>2]=o,0}catch(p){if(typeof a>"u"||p.name!=="ErrnoError")throw p;return p.errno}}a.createPreloadedFile=Yt,a.staticInit();var It={__syscall_chmod:tn,__syscall_faccessat:nn,__syscall_fchmod:rn,__syscall_fchown32:sn,__syscall_fcntl64:on,__syscall_fstat64:ln,__syscall_ftruncate64:_n,__syscall_getcwd:un,__syscall_ioctl:fn,__syscall_lstat64:dn,__syscall_mkdirat:pn,__syscall_newfstatat:hn,__syscall_openat:mn,__syscall_readlinkat:gn,__syscall_rmdir:qn,__syscall_stat64:bn,__syscall_unlinkat:yn,__syscall_utimensat:wn,_emscripten_get_now_is_monotonic:vn,_localtime_js:kn,_mmap_js:Tn,_munmap_js:Fn,_tzset_js:On,emscripten_date_now:Pn,emscripten_get_now:Ln,emscripten_resize_heap:Rn,environ_get:jn,environ_sizes_get:Bn,fd_close:Un,fd_fdstat_get:zn,fd_read:Qn,fd_seek:Hn,fd_sync:Vn,fd_write:$n,memory:Re},h=Qt();i._sqlite3_status64=(e,t,n,r)=>(i._sqlite3_status64=h.sqlite3_status64)(e,t,n,r),i._sqlite3_status=(e,t,n,r)=>(i._sqlite3_status=h.sqlite3_status)(e,t,n,r),i._sqlite3_db_status=(e,t,n,r,s)=>(i._sqlite3_db_status=h.sqlite3_db_status)(e,t,n,r,s),i._sqlite3_msize=e=>(i._sqlite3_msize=h.sqlite3_msize)(e),i._sqlite3_vfs_find=e=>(i._sqlite3_vfs_find=h.sqlite3_vfs_find)(e),i._sqlite3_initialize=()=>(i._sqlite3_initialize=h.sqlite3_initialize)(),i._sqlite3_malloc=e=>(i._sqlite3_malloc=h.sqlite3_malloc)(e),i._sqlite3_free=e=>(i._sqlite3_free=h.sqlite3_free)(e),i._sqlite3_vfs_register=(e,t)=>(i._sqlite3_vfs_register=h.sqlite3_vfs_register)(e,t),i._sqlite3_vfs_unregister=e=>(i._sqlite3_vfs_unregister=h.sqlite3_vfs_unregister)(e),i._sqlite3_malloc64=e=>(i._sqlite3_malloc64=h.sqlite3_malloc64)(e),i._sqlite3_realloc=(e,t)=>(i._sqlite3_realloc=h.sqlite3_realloc)(e,t),i._sqlite3_realloc64=(e,t)=>(i._sqlite3_realloc64=h.sqlite3_realloc64)(e,t),i._sqlite3_value_text=e=>(i._sqlite3_value_text=h.sqlite3_value_text)(e),i._sqlite3_randomness=(e,t)=>(i._sqlite3_randomness=h.sqlite3_randomness)(e,t),i._sqlite3_stricmp=(e,t)=>(i._sqlite3_stricmp=h.sqlite3_stricmp)(e,t),i._sqlite3_strnicmp=(e,t,n)=>(i._sqlite3_strnicmp=h.sqlite3_strnicmp)(e,t,n),i._sqlite3_uri_parameter=(e,t)=>(i._sqlite3_uri_parameter=h.sqlite3_uri_parameter)(e,t),i._sqlite3_uri_boolean=(e,t,n)=>(i._sqlite3_uri_boolean=h.sqlite3_uri_boolean)(e,t,n),i._sqlite3_serialize=(e,t,n,r)=>(i._sqlite3_serialize=h.sqlite3_serialize)(e,t,n,r),i._sqlite3_prepare_v2=(e,t,n,r,s)=>(i._sqlite3_prepare_v2=h.sqlite3_prepare_v2)(e,t,n,r,s),i._sqlite3_step=e=>(i._sqlite3_step=h.sqlite3_step)(e),i._sqlite3_column_int64=(e,t)=>(i._sqlite3_column_int64=h.sqlite3_column_int64)(e,t),i._sqlite3_reset=e=>(i._sqlite3_reset=h.sqlite3_reset)(e),i._sqlite3_exec=(e,t,n,r,s)=>(i._sqlite3_exec=h.sqlite3_exec)(e,t,n,r,s),i._sqlite3_column_int=(e,t)=>(i._sqlite3_column_int=h.sqlite3_column_int)(e,t),i._sqlite3_finalize=e=>(i._sqlite3_finalize=h.sqlite3_finalize)(e),i._sqlite3_file_control=(e,t,n,r)=>(i._sqlite3_file_control=h.sqlite3_file_control)(e,t,n,r),i._sqlite3_column_name=(e,t)=>(i._sqlite3_column_name=h.sqlite3_column_name)(e,t),i._sqlite3_column_text=(e,t)=>(i._sqlite3_column_text=h.sqlite3_column_text)(e,t),i._sqlite3_column_type=(e,t)=>(i._sqlite3_column_type=h.sqlite3_column_type)(e,t),i._sqlite3_errmsg=e=>(i._sqlite3_errmsg=h.sqlite3_errmsg)(e),i._sqlite3_deserialize=(e,t,n,r,s,o)=>(i._sqlite3_deserialize=h.sqlite3_deserialize)(e,t,n,r,s,o),i._sqlite3_clear_bindings=e=>(i._sqlite3_clear_bindings=h.sqlite3_clear_bindings)(e),i._sqlite3_value_blob=e=>(i._sqlite3_value_blob=h.sqlite3_value_blob)(e),i._sqlite3_value_bytes=e=>(i._sqlite3_value_bytes=h.sqlite3_value_bytes)(e),i._sqlite3_value_double=e=>(i._sqlite3_value_double=h.sqlite3_value_double)(e),i._sqlite3_value_int=e=>(i._sqlite3_value_int=h.sqlite3_value_int)(e),i._sqlite3_value_int64=e=>(i._sqlite3_value_int64=h.sqlite3_value_int64)(e),i._sqlite3_value_subtype=e=>(i._sqlite3_value_subtype=h.sqlite3_value_subtype)(e),i._sqlite3_value_pointer=(e,t)=>(i._sqlite3_value_pointer=h.sqlite3_value_pointer)(e,t),i._sqlite3_value_type=e=>(i._sqlite3_value_type=h.sqlite3_value_type)(e),i._sqlite3_value_nochange=e=>(i._sqlite3_value_nochange=h.sqlite3_value_nochange)(e),i._sqlite3_value_frombind=e=>(i._sqlite3_value_frombind=h.sqlite3_value_frombind)(e),i._sqlite3_value_dup=e=>(i._sqlite3_value_dup=h.sqlite3_value_dup)(e),i._sqlite3_value_free=e=>(i._sqlite3_value_free=h.sqlite3_value_free)(e),i._sqlite3_result_blob=(e,t,n,r)=>(i._sqlite3_result_blob=h.sqlite3_result_blob)(e,t,n,r),i._sqlite3_result_error_toobig=e=>(i._sqlite3_result_error_toobig=h.sqlite3_result_error_toobig)(e),i._sqlite3_result_error_nomem=e=>(i._sqlite3_result_error_nomem=h.sqlite3_result_error_nomem)(e),i._sqlite3_result_double=(e,t)=>(i._sqlite3_result_double=h.sqlite3_result_double)(e,t),i._sqlite3_result_error=(e,t,n)=>(i._sqlite3_result_error=h.sqlite3_result_error)(e,t,n),i._sqlite3_result_int=(e,t)=>(i._sqlite3_result_int=h.sqlite3_result_int)(e,t),i._sqlite3_result_int64=(e,t)=>(i._sqlite3_result_int64=h.sqlite3_result_int64)(e,t),i._sqlite3_result_null=e=>(i._sqlite3_result_null=h.sqlite3_result_null)(e),i._sqlite3_result_pointer=(e,t,n,r)=>(i._sqlite3_result_pointer=h.sqlite3_result_pointer)(e,t,n,r),i._sqlite3_result_subtype=(e,t)=>(i._sqlite3_result_subtype=h.sqlite3_result_subtype)(e,t),i._sqlite3_result_text=(e,t,n,r)=>(i._sqlite3_result_text=h.sqlite3_result_text)(e,t,n,r),i._sqlite3_result_zeroblob=(e,t)=>(i._sqlite3_result_zeroblob=h.sqlite3_result_zeroblob)(e,t),i._sqlite3_result_zeroblob64=(e,t)=>(i._sqlite3_result_zeroblob64=h.sqlite3_result_zeroblob64)(e,t),i._sqlite3_result_error_code=(e,t)=>(i._sqlite3_result_error_code=h.sqlite3_result_error_code)(e,t),i._sqlite3_user_data=e=>(i._sqlite3_user_data=h.sqlite3_user_data)(e),i._sqlite3_context_db_handle=e=>(i._sqlite3_context_db_handle=h.sqlite3_context_db_handle)(e),i._sqlite3_vtab_nochange=e=>(i._sqlite3_vtab_nochange=h.sqlite3_vtab_nochange)(e),i._sqlite3_vtab_in_first=(e,t)=>(i._sqlite3_vtab_in_first=h.sqlite3_vtab_in_first)(e,t),i._sqlite3_vtab_in_next=(e,t)=>(i._sqlite3_vtab_in_next=h.sqlite3_vtab_in_next)(e,t),i._sqlite3_aggregate_context=(e,t)=>(i._sqlite3_aggregate_context=h.sqlite3_aggregate_context)(e,t),i._sqlite3_get_auxdata=(e,t)=>(i._sqlite3_get_auxdata=h.sqlite3_get_auxdata)(e,t),i._sqlite3_set_auxdata=(e,t,n,r)=>(i._sqlite3_set_auxdata=h.sqlite3_set_auxdata)(e,t,n,r),i._sqlite3_column_count=e=>(i._sqlite3_column_count=h.sqlite3_column_count)(e),i._sqlite3_data_count=e=>(i._sqlite3_data_count=h.sqlite3_data_count)(e),i._sqlite3_column_blob=(e,t)=>(i._sqlite3_column_blob=h.sqlite3_column_blob)(e,t),i._sqlite3_column_bytes=(e,t)=>(i._sqlite3_column_bytes=h.sqlite3_column_bytes)(e,t),i._sqlite3_column_double=(e,t)=>(i._sqlite3_column_double=h.sqlite3_column_double)(e,t),i._sqlite3_column_value=(e,t)=>(i._sqlite3_column_value=h.sqlite3_column_value)(e,t),i._sqlite3_column_decltype=(e,t)=>(i._sqlite3_column_decltype=h.sqlite3_column_decltype)(e,t),i._sqlite3_bind_blob=(e,t,n,r,s)=>(i._sqlite3_bind_blob=h.sqlite3_bind_blob)(e,t,n,r,s),i._sqlite3_bind_double=(e,t,n)=>(i._sqlite3_bind_double=h.sqlite3_bind_double)(e,t,n),i._sqlite3_bind_int=(e,t,n)=>(i._sqlite3_bind_int=h.sqlite3_bind_int)(e,t,n),i._sqlite3_bind_int64=(e,t,n)=>(i._sqlite3_bind_int64=h.sqlite3_bind_int64)(e,t,n),i._sqlite3_bind_null=(e,t)=>(i._sqlite3_bind_null=h.sqlite3_bind_null)(e,t),i._sqlite3_bind_pointer=(e,t,n,r,s)=>(i._sqlite3_bind_pointer=h.sqlite3_bind_pointer)(e,t,n,r,s),i._sqlite3_bind_text=(e,t,n,r,s)=>(i._sqlite3_bind_text=h.sqlite3_bind_text)(e,t,n,r,s),i._sqlite3_bind_parameter_count=e=>(i._sqlite3_bind_parameter_count=h.sqlite3_bind_parameter_count)(e),i._sqlite3_bind_parameter_name=(e,t)=>(i._sqlite3_bind_parameter_name=h.sqlite3_bind_parameter_name)(e,t),i._sqlite3_bind_parameter_index=(e,t)=>(i._sqlite3_bind_parameter_index=h.sqlite3_bind_parameter_index)(e,t),i._sqlite3_db_handle=e=>(i._sqlite3_db_handle=h.sqlite3_db_handle)(e),i._sqlite3_stmt_readonly=e=>(i._sqlite3_stmt_readonly=h.sqlite3_stmt_readonly)(e),i._sqlite3_stmt_isexplain=e=>(i._sqlite3_stmt_isexplain=h.sqlite3_stmt_isexplain)(e),i._sqlite3_stmt_explain=(e,t)=>(i._sqlite3_stmt_explain=h.sqlite3_stmt_explain)(e,t),i._sqlite3_stmt_busy=e=>(i._sqlite3_stmt_busy=h.sqlite3_stmt_busy)(e),i._sqlite3_stmt_status=(e,t,n)=>(i._sqlite3_stmt_status=h.sqlite3_stmt_status)(e,t,n),i._sqlite3_sql=e=>(i._sqlite3_sql=h.sqlite3_sql)(e),i._sqlite3_expanded_sql=e=>(i._sqlite3_expanded_sql=h.sqlite3_expanded_sql)(e),i._sqlite3_preupdate_old=(e,t,n)=>(i._sqlite3_preupdate_old=h.sqlite3_preupdate_old)(e,t,n),i._sqlite3_preupdate_count=e=>(i._sqlite3_preupdate_count=h.sqlite3_preupdate_count)(e),i._sqlite3_preupdate_depth=e=>(i._sqlite3_preupdate_depth=h.sqlite3_preupdate_depth)(e),i._sqlite3_preupdate_blobwrite=e=>(i._sqlite3_preupdate_blobwrite=h.sqlite3_preupdate_blobwrite)(e),i._sqlite3_preupdate_new=(e,t,n)=>(i._sqlite3_preupdate_new=h.sqlite3_preupdate_new)(e,t,n),i._sqlite3_value_numeric_type=e=>(i._sqlite3_value_numeric_type=h.sqlite3_value_numeric_type)(e),i._sqlite3_set_authorizer=(e,t,n)=>(i._sqlite3_set_authorizer=h.sqlite3_set_authorizer)(e,t,n),i._sqlite3_strglob=(e,t)=>(i._sqlite3_strglob=h.sqlite3_strglob)(e,t),i._sqlite3_strlike=(e,t,n)=>(i._sqlite3_strlike=h.sqlite3_strlike)(e,t,n),i._sqlite3_auto_extension=e=>(i._sqlite3_auto_extension=h.sqlite3_auto_extension)(e),i._sqlite3_cancel_auto_extension=e=>(i._sqlite3_cancel_auto_extension=h.sqlite3_cancel_auto_extension)(e),i._sqlite3_reset_auto_extension=()=>(i._sqlite3_reset_auto_extension=h.sqlite3_reset_auto_extension)(),i._sqlite3_prepare_v3=(e,t,n,r,s,o)=>(i._sqlite3_prepare_v3=h.sqlite3_prepare_v3)(e,t,n,r,s,o),i._sqlite3_create_module=(e,t,n,r)=>(i._sqlite3_create_module=h.sqlite3_create_module)(e,t,n,r),i._sqlite3_create_module_v2=(e,t,n,r,s)=>(i._sqlite3_create_module_v2=h.sqlite3_create_module_v2)(e,t,n,r,s),i._sqlite3_drop_modules=(e,t)=>(i._sqlite3_drop_modules=h.sqlite3_drop_modules)(e,t),i._sqlite3_declare_vtab=(e,t)=>(i._sqlite3_declare_vtab=h.sqlite3_declare_vtab)(e,t),i._sqlite3_vtab_on_conflict=e=>(i._sqlite3_vtab_on_conflict=h.sqlite3_vtab_on_conflict)(e),i._sqlite3_vtab_collation=(e,t)=>(i._sqlite3_vtab_collation=h.sqlite3_vtab_collation)(e,t),i._sqlite3_vtab_in=(e,t,n)=>(i._sqlite3_vtab_in=h.sqlite3_vtab_in)(e,t,n),i._sqlite3_vtab_rhs_value=(e,t,n)=>(i._sqlite3_vtab_rhs_value=h.sqlite3_vtab_rhs_value)(e,t,n),i._sqlite3_vtab_distinct=e=>(i._sqlite3_vtab_distinct=h.sqlite3_vtab_distinct)(e),i._sqlite3_keyword_name=(e,t,n)=>(i._sqlite3_keyword_name=h.sqlite3_keyword_name)(e,t,n),i._sqlite3_keyword_count=()=>(i._sqlite3_keyword_count=h.sqlite3_keyword_count)(),i._sqlite3_keyword_check=(e,t)=>(i._sqlite3_keyword_check=h.sqlite3_keyword_check)(e,t),i._sqlite3_complete=e=>(i._sqlite3_complete=h.sqlite3_complete)(e),i._sqlite3_libversion=()=>(i._sqlite3_libversion=h.sqlite3_libversion)(),i._sqlite3_libversion_number=()=>(i._sqlite3_libversion_number=h.sqlite3_libversion_number)(),i._sqlite3_shutdown=()=>(i._sqlite3_shutdown=h.sqlite3_shutdown)(),i._sqlite3_last_insert_rowid=e=>(i._sqlite3_last_insert_rowid=h.sqlite3_last_insert_rowid)(e),i._sqlite3_set_last_insert_rowid=(e,t)=>(i._sqlite3_set_last_insert_rowid=h.sqlite3_set_last_insert_rowid)(e,t),i._sqlite3_changes64=e=>(i._sqlite3_changes64=h.sqlite3_changes64)(e),i._sqlite3_changes=e=>(i._sqlite3_changes=h.sqlite3_changes)(e),i._sqlite3_total_changes64=e=>(i._sqlite3_total_changes64=h.sqlite3_total_changes64)(e),i._sqlite3_total_changes=e=>(i._sqlite3_total_changes=h.sqlite3_total_changes)(e),i._sqlite3_txn_state=(e,t)=>(i._sqlite3_txn_state=h.sqlite3_txn_state)(e,t),i._sqlite3_close_v2=e=>(i._sqlite3_close_v2=h.sqlite3_close_v2)(e),i._sqlite3_busy_handler=(e,t,n)=>(i._sqlite3_busy_handler=h.sqlite3_busy_handler)(e,t,n),i._sqlite3_progress_handler=(e,t,n,r)=>(i._sqlite3_progress_handler=h.sqlite3_progress_handler)(e,t,n,r),i._sqlite3_busy_timeout=(e,t)=>(i._sqlite3_busy_timeout=h.sqlite3_busy_timeout)(e,t),i._sqlite3_interrupt=e=>(i._sqlite3_interrupt=h.sqlite3_interrupt)(e),i._sqlite3_is_interrupted=e=>(i._sqlite3_is_interrupted=h.sqlite3_is_interrupted)(e),i._sqlite3_create_function=(e,t,n,r,s,o,p,g)=>(i._sqlite3_create_function=h.sqlite3_create_function)(e,t,n,r,s,o,p,g),i._sqlite3_create_function_v2=(e,t,n,r,s,o,p,g,O)=>(i._sqlite3_create_function_v2=h.sqlite3_create_function_v2)(e,t,n,r,s,o,p,g,O),i._sqlite3_create_window_function=(e,t,n,r,s,o,p,g,O,R)=>(i._sqlite3_create_window_function=h.sqlite3_create_window_function)(e,t,n,r,s,o,p,g,O,R),i._sqlite3_overload_function=(e,t,n)=>(i._sqlite3_overload_function=h.sqlite3_overload_function)(e,t,n),i._sqlite3_trace_v2=(e,t,n,r)=>(i._sqlite3_trace_v2=h.sqlite3_trace_v2)(e,t,n,r),i._sqlite3_commit_hook=(e,t,n)=>(i._sqlite3_commit_hook=h.sqlite3_commit_hook)(e,t,n),i._sqlite3_update_hook=(e,t,n)=>(i._sqlite3_update_hook=h.sqlite3_update_hook)(e,t,n),i._sqlite3_rollback_hook=(e,t,n)=>(i._sqlite3_rollback_hook=h.sqlite3_rollback_hook)(e,t,n),i._sqlite3_preupdate_hook=(e,t,n)=>(i._sqlite3_preupdate_hook=h.sqlite3_preupdate_hook)(e,t,n),i._sqlite3_error_offset=e=>(i._sqlite3_error_offset=h.sqlite3_error_offset)(e),i._sqlite3_errcode=e=>(i._sqlite3_errcode=h.sqlite3_errcode)(e),i._sqlite3_extended_errcode=e=>(i._sqlite3_extended_errcode=h.sqlite3_extended_errcode)(e),i._sqlite3_errstr=e=>(i._sqlite3_errstr=h.sqlite3_errstr)(e),i._sqlite3_limit=(e,t,n)=>(i._sqlite3_limit=h.sqlite3_limit)(e,t,n),i._sqlite3_open=(e,t)=>(i._sqlite3_open=h.sqlite3_open)(e,t),i._sqlite3_open_v2=(e,t,n,r)=>(i._sqlite3_open_v2=h.sqlite3_open_v2)(e,t,n,r),i._sqlite3_create_collation=(e,t,n,r,s)=>(i._sqlite3_create_collation=h.sqlite3_create_collation)(e,t,n,r,s),i._sqlite3_create_collation_v2=(e,t,n,r,s,o)=>(i._sqlite3_create_collation_v2=h.sqlite3_create_collation_v2)(e,t,n,r,s,o),i._sqlite3_collation_needed=(e,t,n)=>(i._sqlite3_collation_needed=h.sqlite3_collation_needed)(e,t,n),i._sqlite3_get_autocommit=e=>(i._sqlite3_get_autocommit=h.sqlite3_get_autocommit)(e),i._sqlite3_table_column_metadata=(e,t,n,r,s,o,p,g,O)=>(i._sqlite3_table_column_metadata=h.sqlite3_table_column_metadata)(e,t,n,r,s,o,p,g,O),i._sqlite3_extended_result_codes=(e,t)=>(i._sqlite3_extended_result_codes=h.sqlite3_extended_result_codes)(e,t),i._sqlite3_uri_key=(e,t)=>(i._sqlite3_uri_key=h.sqlite3_uri_key)(e,t),i._sqlite3_uri_int64=(e,t,n)=>(i._sqlite3_uri_int64=h.sqlite3_uri_int64)(e,t,n),i._sqlite3_db_name=(e,t)=>(i._sqlite3_db_name=h.sqlite3_db_name)(e,t),i._sqlite3_db_filename=(e,t)=>(i._sqlite3_db_filename=h.sqlite3_db_filename)(e,t),i._sqlite3_db_readonly=(e,t)=>(i._sqlite3_db_readonly=h.sqlite3_db_readonly)(e,t),i._sqlite3_compileoption_used=e=>(i._sqlite3_compileoption_used=h.sqlite3_compileoption_used)(e),i._sqlite3_compileoption_get=e=>(i._sqlite3_compileoption_get=h.sqlite3_compileoption_get)(e),i._sqlite3session_diff=(e,t,n,r)=>(i._sqlite3session_diff=h.sqlite3session_diff)(e,t,n,r),i._sqlite3session_attach=(e,t)=>(i._sqlite3session_attach=h.sqlite3session_attach)(e,t),i._sqlite3session_create=(e,t,n)=>(i._sqlite3session_create=h.sqlite3session_create)(e,t,n),i._sqlite3session_delete=e=>(i._sqlite3session_delete=h.sqlite3session_delete)(e),i._sqlite3session_table_filter=(e,t,n)=>(i._sqlite3session_table_filter=h.sqlite3session_table_filter)(e,t,n),i._sqlite3session_changeset=(e,t,n)=>(i._sqlite3session_changeset=h.sqlite3session_changeset)(e,t,n),i._sqlite3session_changeset_strm=(e,t,n)=>(i._sqlite3session_changeset_strm=h.sqlite3session_changeset_strm)(e,t,n),i._sqlite3session_patchset_strm=(e,t,n)=>(i._sqlite3session_patchset_strm=h.sqlite3session_patchset_strm)(e,t,n),i._sqlite3session_patchset=(e,t,n)=>(i._sqlite3session_patchset=h.sqlite3session_patchset)(e,t,n),i._sqlite3session_enable=(e,t)=>(i._sqlite3session_enable=h.sqlite3session_enable)(e,t),i._sqlite3session_indirect=(e,t)=>(i._sqlite3session_indirect=h.sqlite3session_indirect)(e,t),i._sqlite3session_isempty=e=>(i._sqlite3session_isempty=h.sqlite3session_isempty)(e),i._sqlite3session_memory_used=e=>(i._sqlite3session_memory_used=h.sqlite3session_memory_used)(e),i._sqlite3session_object_config=(e,t,n)=>(i._sqlite3session_object_config=h.sqlite3session_object_config)(e,t,n),i._sqlite3session_changeset_size=e=>(i._sqlite3session_changeset_size=h.sqlite3session_changeset_size)(e),i._sqlite3changeset_start=(e,t,n)=>(i._sqlite3changeset_start=h.sqlite3changeset_start)(e,t,n),i._sqlite3changeset_start_v2=(e,t,n,r)=>(i._sqlite3changeset_start_v2=h.sqlite3changeset_start_v2)(e,t,n,r),i._sqlite3changeset_start_strm=(e,t,n)=>(i._sqlite3changeset_start_strm=h.sqlite3changeset_start_strm)(e,t,n),i._sqlite3changeset_start_v2_strm=(e,t,n,r)=>(i._sqlite3changeset_start_v2_strm=h.sqlite3changeset_start_v2_strm)(e,t,n,r),i._sqlite3changeset_next=e=>(i._sqlite3changeset_next=h.sqlite3changeset_next)(e),i._sqlite3changeset_op=(e,t,n,r,s)=>(i._sqlite3changeset_op=h.sqlite3changeset_op)(e,t,n,r,s),i._sqlite3changeset_pk=(e,t,n)=>(i._sqlite3changeset_pk=h.sqlite3changeset_pk)(e,t,n),i._sqlite3changeset_old=(e,t,n)=>(i._sqlite3changeset_old=h.sqlite3changeset_old)(e,t,n),i._sqlite3changeset_new=(e,t,n)=>(i._sqlite3changeset_new=h.sqlite3changeset_new)(e,t,n),i._sqlite3changeset_conflict=(e,t,n)=>(i._sqlite3changeset_conflict=h.sqlite3changeset_conflict)(e,t,n),i._sqlite3changeset_fk_conflicts=(e,t)=>(i._sqlite3changeset_fk_conflicts=h.sqlite3changeset_fk_conflicts)(e,t),i._sqlite3changeset_finalize=e=>(i._sqlite3changeset_finalize=h.sqlite3changeset_finalize)(e),i._sqlite3changeset_invert=(e,t,n,r)=>(i._sqlite3changeset_invert=h.sqlite3changeset_invert)(e,t,n,r),i._sqlite3changeset_invert_strm=(e,t,n,r)=>(i._sqlite3changeset_invert_strm=h.sqlite3changeset_invert_strm)(e,t,n,r),i._sqlite3changeset_apply_v2=(e,t,n,r,s,o,p,g,O)=>(i._sqlite3changeset_apply_v2=h.sqlite3changeset_apply_v2)(e,t,n,r,s,o,p,g,O),i._sqlite3changeset_apply=(e,t,n,r,s,o)=>(i._sqlite3changeset_apply=h.sqlite3changeset_apply)(e,t,n,r,s,o),i._sqlite3changeset_apply_v2_strm=(e,t,n,r,s,o,p,g,O)=>(i._sqlite3changeset_apply_v2_strm=h.sqlite3changeset_apply_v2_strm)(e,t,n,r,s,o,p,g,O),i._sqlite3changeset_apply_strm=(e,t,n,r,s,o)=>(i._sqlite3changeset_apply_strm=h.sqlite3changeset_apply_strm)(e,t,n,r,s,o),i._sqlite3changegroup_new=e=>(i._sqlite3changegroup_new=h.sqlite3changegroup_new)(e),i._sqlite3changegroup_add=(e,t,n)=>(i._sqlite3changegroup_add=h.sqlite3changegroup_add)(e,t,n),i._sqlite3changegroup_output=(e,t,n)=>(i._sqlite3changegroup_output=h.sqlite3changegroup_output)(e,t,n),i._sqlite3changegroup_add_strm=(e,t,n)=>(i._sqlite3changegroup_add_strm=h.sqlite3changegroup_add_strm)(e,t,n),i._sqlite3changegroup_output_strm=(e,t,n)=>(i._sqlite3changegroup_output_strm=h.sqlite3changegroup_output_strm)(e,t,n),i._sqlite3changegroup_delete=e=>(i._sqlite3changegroup_delete=h.sqlite3changegroup_delete)(e),i._sqlite3changeset_concat=(e,t,n,r,s,o)=>(i._sqlite3changeset_concat=h.sqlite3changeset_concat)(e,t,n,r,s,o),i._sqlite3changeset_concat_strm=(e,t,n,r,s,o)=>(i._sqlite3changeset_concat_strm=h.sqlite3changeset_concat_strm)(e,t,n,r,s,o),i._sqlite3session_config=(e,t)=>(i._sqlite3session_config=h.sqlite3session_config)(e,t),i._sqlite3_sourceid=()=>(i._sqlite3_sourceid=h.sqlite3_sourceid)(),i._sqlite3__wasm_pstack_ptr=()=>(i._sqlite3__wasm_pstack_ptr=h.sqlite3__wasm_pstack_ptr)(),i._sqlite3__wasm_pstack_restore=e=>(i._sqlite3__wasm_pstack_restore=h.sqlite3__wasm_pstack_restore)(e),i._sqlite3__wasm_pstack_alloc=e=>(i._sqlite3__wasm_pstack_alloc=h.sqlite3__wasm_pstack_alloc)(e),i._sqlite3__wasm_pstack_remaining=()=>(i._sqlite3__wasm_pstack_remaining=h.sqlite3__wasm_pstack_remaining)(),i._sqlite3__wasm_pstack_quota=()=>(i._sqlite3__wasm_pstack_quota=h.sqlite3__wasm_pstack_quota)(),i._sqlite3__wasm_db_error=(e,t,n)=>(i._sqlite3__wasm_db_error=h.sqlite3__wasm_db_error)(e,t,n),i._sqlite3__wasm_test_struct=e=>(i._sqlite3__wasm_test_struct=h.sqlite3__wasm_test_struct)(e),i._sqlite3__wasm_enum_json=()=>(i._sqlite3__wasm_enum_json=h.sqlite3__wasm_enum_json)(),i._sqlite3__wasm_vfs_unlink=(e,t)=>(i._sqlite3__wasm_vfs_unlink=h.sqlite3__wasm_vfs_unlink)(e,t),i._sqlite3__wasm_db_vfs=(e,t)=>(i._sqlite3__wasm_db_vfs=h.sqlite3__wasm_db_vfs)(e,t),i._sqlite3__wasm_db_reset=e=>(i._sqlite3__wasm_db_reset=h.sqlite3__wasm_db_reset)(e),i._sqlite3__wasm_db_export_chunked=(e,t)=>(i._sqlite3__wasm_db_export_chunked=h.sqlite3__wasm_db_export_chunked)(e,t),i._sqlite3__wasm_db_serialize=(e,t,n,r,s)=>(i._sqlite3__wasm_db_serialize=h.sqlite3__wasm_db_serialize)(e,t,n,r,s),i._sqlite3__wasm_vfs_create_file=(e,t,n,r)=>(i._sqlite3__wasm_vfs_create_file=h.sqlite3__wasm_vfs_create_file)(e,t,n,r),i._sqlite3__wasm_posix_create_file=(e,t,n)=>(i._sqlite3__wasm_posix_create_file=h.sqlite3__wasm_posix_create_file)(e,t,n),i._sqlite3__wasm_kvvfsMakeKeyOnPstack=(e,t)=>(i._sqlite3__wasm_kvvfsMakeKeyOnPstack=h.sqlite3__wasm_kvvfsMakeKeyOnPstack)(e,t),i._sqlite3__wasm_kvvfs_methods=()=>(i._sqlite3__wasm_kvvfs_methods=h.sqlite3__wasm_kvvfs_methods)(),i._sqlite3__wasm_vtab_config=(e,t,n)=>(i._sqlite3__wasm_vtab_config=h.sqlite3__wasm_vtab_config)(e,t,n),i._sqlite3__wasm_db_config_ip=(e,t,n,r)=>(i._sqlite3__wasm_db_config_ip=h.sqlite3__wasm_db_config_ip)(e,t,n,r),i._sqlite3__wasm_db_config_pii=(e,t,n,r,s)=>(i._sqlite3__wasm_db_config_pii=h.sqlite3__wasm_db_config_pii)(e,t,n,r,s),i._sqlite3__wasm_db_config_s=(e,t,n)=>(i._sqlite3__wasm_db_config_s=h.sqlite3__wasm_db_config_s)(e,t,n),i._sqlite3__wasm_config_i=(e,t)=>(i._sqlite3__wasm_config_i=h.sqlite3__wasm_config_i)(e,t),i._sqlite3__wasm_config_ii=(e,t,n)=>(i._sqlite3__wasm_config_ii=h.sqlite3__wasm_config_ii)(e,t,n),i._sqlite3__wasm_config_j=(e,t)=>(i._sqlite3__wasm_config_j=h.sqlite3__wasm_config_j)(e,t),i._sqlite3__wasm_qfmt_token=(e,t)=>(i._sqlite3__wasm_qfmt_token=h.sqlite3__wasm_qfmt_token)(e,t),i._sqlite3__wasm_init_wasmfs=e=>(i._sqlite3__wasm_init_wasmfs=h.sqlite3__wasm_init_wasmfs)(e),i._sqlite3__wasm_test_intptr=e=>(i._sqlite3__wasm_test_intptr=h.sqlite3__wasm_test_intptr)(e),i._sqlite3__wasm_test_voidptr=e=>(i._sqlite3__wasm_test_voidptr=h.sqlite3__wasm_test_voidptr)(e),i._sqlite3__wasm_test_int64_max=()=>(i._sqlite3__wasm_test_int64_max=h.sqlite3__wasm_test_int64_max)(),i._sqlite3__wasm_test_int64_min=()=>(i._sqlite3__wasm_test_int64_min=h.sqlite3__wasm_test_int64_min)(),i._sqlite3__wasm_test_int64_times2=e=>(i._sqlite3__wasm_test_int64_times2=h.sqlite3__wasm_test_int64_times2)(e),i._sqlite3__wasm_test_int64_minmax=(e,t)=>(i._sqlite3__wasm_test_int64_minmax=h.sqlite3__wasm_test_int64_minmax)(e,t),i._sqlite3__wasm_test_int64ptr=e=>(i._sqlite3__wasm_test_int64ptr=h.sqlite3__wasm_test_int64ptr)(e),i._sqlite3__wasm_test_stack_overflow=e=>(i._sqlite3__wasm_test_stack_overflow=h.sqlite3__wasm_test_stack_overflow)(e),i._sqlite3__wasm_test_str_hello=e=>(i._sqlite3__wasm_test_str_hello=h.sqlite3__wasm_test_str_hello)(e),i._sqlite3__wasm_SQLTester_strglob=(e,t)=>(i._sqlite3__wasm_SQLTester_strglob=h.sqlite3__wasm_SQLTester_strglob)(e,t),i._malloc=e=>(i._malloc=h.malloc)(e),i._free=e=>(i._free=h.free)(e),i._realloc=(e,t)=>(i._realloc=h.realloc)(e,t);var kt=(e,t)=>(kt=h.emscripten_builtin_memalign)(e,t);i.wasmMemory=Re;var nt,Tt;$e=function e(){nt||Ft(),nt||($e=e)};function Ft(){if(Ne>0||!Tt&&(Tt=1,Lt(),Ne>0))return;function e(){nt||(nt=1,i.calledRun=1,!dt&&(Ct(),ye(i),i.onRuntimeInitialized?.(),Dt()))}i.setStatus?(i.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>i.setStatus(""),1),e()},1)):e()}if(i.preInit)for(typeof i.preInit=="function"&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return Ft(),i.runSQLite3PostLoadInit=function(e){if(globalThis.sqlite3ApiBootstrap=function t(n=globalThis.sqlite3ApiConfig||t.defaultConfig){if(t.sqlite3)return(t.sqlite3.config||console).warn("sqlite3ApiBootstrap() called multiple times.","Config and external initializers are ignored on calls after the first."),t.sqlite3;const r=Object.assign(Object.create(null),{exports:void 0,memory:void 0,bigIntEnabled:typeof i<"u"&&i.HEAPU64?!0:!!globalThis.BigInt64Array,debug:console.debug.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),log:console.log.bind(console),wasmfsOpfsDir:"/opfs",useStdAlloc:!1},n||{});Object.assign(r,{allocExportName:r.useStdAlloc?"malloc":"sqlite3_malloc",deallocExportName:r.useStdAlloc?"free":"sqlite3_free",reallocExportName:r.useStdAlloc?"realloc":"sqlite3_realloc"},r),["exports","memory","wasmfsOpfsDir"].forEach(l=>{typeof r[l]=="function"&&(r[l]=r[l]())}),delete globalThis.sqlite3ApiConfig,delete t.defaultConfig;const s=Object.create(null),o=Object.create(null),p=l=>s.sqlite3_js_rc_str&&s.sqlite3_js_rc_str(l)||"Unknown result code #"+l,g=l=>typeof l=="number"&&l===(l|0);class O extends Error{constructor(..._){let u;if(_.length)if(g(_[0]))if(u=_[0],_.length===1)super(p(_[0]));else{const I=p(u);typeof _[1]=="object"?super(I,_[1]):(_[0]=I+":",super(_.join(" ")))}else _.length===2&&typeof _[1]=="object"?super(..._):super(_.join(" "));this.resultCode=u||s.SQLITE_ERROR,this.name="SQLite3Error"}}O.toss=(...l)=>{throw new O(...l)};const R=O.toss;r.wasmfsOpfsDir&&!/^\/[^/]+$/.test(r.wasmfsOpfsDir)&&R("config.wasmfsOpfsDir must be falsy or in the form '/dir-name'.");const z=l=>typeof l!="bigint"&&l===(l|0)&&l<=2147483647&&l>=-2147483648,Q=function l(_){return l._max||(l._max=BigInt("0x7fffffffffffffff"),l._min=~l._max),_>=l._min&&_<=l._max},T=l=>l>=-0x7fffffffn-1n&&l<=0x7fffffffn,A=function l(_){return l._min||(l._min=Number.MIN_SAFE_INTEGER,l._max=Number.MAX_SAFE_INTEGER),_>=l._min&&_<=l._max},D=l=>l&&l.constructor&&z(l.constructor.BYTES_PER_ELEMENT)?l:!1,q=typeof SharedArrayBuffer>"u"?function(){}:SharedArrayBuffer,w=l=>l.buffer instanceof q,x=(l,_,u)=>w(l)?l.slice(_,u):l.subarray(_,u),N=l=>l&&(l instanceof Uint8Array||l instanceof Int8Array||l instanceof ArrayBuffer),P=l=>l&&(l instanceof Uint8Array||l instanceof Int8Array||l instanceof ArrayBuffer),S=l=>N(l)||R("Value is not of a supported TypedArray type."),L=new TextDecoder("utf-8"),$=function(l,_,u){return L.decode(x(l,_,u))},c=function(l){return P(l)?$(l instanceof ArrayBuffer?new Uint8Array(l):l):Array.isArray(l)?l.join(""):(o.isPtr(l)&&(l=o.cstrToJs(l)),l)};class d extends Error{constructor(..._){_.length===2&&typeof _[1]=="object"?super(..._):_.length?super(_.join(" ")):super("Allocation failed."),this.resultCode=s.SQLITE_NOMEM,this.name="WasmAllocError"}}d.toss=(...l)=>{throw new d(...l)},Object.assign(s,{sqlite3_bind_blob:void 0,sqlite3_bind_text:void 0,sqlite3_create_function_v2:(l,_,u,I,U,ee,ne,se,ie)=>{},sqlite3_create_function:(l,_,u,I,U,ee,ne,se)=>{},sqlite3_create_window_function:(l,_,u,I,U,ee,ne,se,ie,j)=>{},sqlite3_prepare_v3:(l,_,u,I,U,ee)=>{},sqlite3_prepare_v2:(l,_,u,I,U)=>{},sqlite3_exec:(l,_,u,I,U)=>{},sqlite3_randomness:(l,_)=>{}});const y={affirmBindableTypedArray:S,flexibleString:c,bigIntFits32:T,bigIntFits64:Q,bigIntFitsDouble:A,isBindableTypedArray:N,isInt32:z,isSQLableTypedArray:P,isTypedArray:D,typedArrayToString:$,isUIThread:()=>globalThis.window===globalThis&&!!globalThis.document,isSharedTypedArray:w,toss:function(...l){throw new Error(l.join(" "))},toss3:R,typedArrayPart:x,affirmDbHeader:function(l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));const _="SQLite format 3";_.length>l.byteLength&&R("Input does not contain an SQLite3 database header.");for(let u=0;u<_.length;++u)_.charCodeAt(u)!==l[u]&&R("Input does not contain an SQLite3 database header.")},affirmIsDb:function(l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));const _=l.byteLength;(_<512||_%512!==0)&&R("Byte array size",_,"is invalid for an SQLite3 db."),y.affirmDbHeader(l)}};Object.assign(o,{ptrSizeof:r.wasmPtrSizeof||4,ptrIR:r.wasmPtrIR||"i32",bigIntEnabled:!!r.bigIntEnabled,exports:r.exports||R("Missing API config.exports (WASM module exports)."),memory:r.memory||r.exports.memory||R("API config object requires a WebAssembly.Memory object","in either config.exports.memory (exported)","or config.memory (imported)."),alloc:void 0,realloc:void 0,dealloc:void 0}),o.allocFromTypedArray=function(l){l instanceof ArrayBuffer&&(l=new Uint8Array(l)),S(l);const _=o.alloc(l.byteLength||1);return o.heapForSize(l.constructor).set(l.byteLength?l:[0],_),_};{const l=r.allocExportName,_=r.deallocExportName,u=r.reallocExportName;for(const I of[l,_,u])o.exports[I]instanceof Function||R("Missing required exports[",I,"] function.");o.alloc=function I(U){return I.impl(U)||d.toss("Failed to allocate",U," bytes.")},o.alloc.impl=o.exports[l],o.realloc=function I(U,ee){const ne=I.impl(U,ee);return ee?ne||d.toss("Failed to reallocate",ee," bytes."):0},o.realloc.impl=o.exports[u],o.dealloc=o.exports[_]}o.compileOptionUsed=function l(_){if(arguments.length){if(Array.isArray(_)){const u={};return _.forEach(I=>{u[I]=s.sqlite3_compileoption_used(I)}),u}else if(typeof _=="object")return Object.keys(_).forEach(u=>{_[u]=s.sqlite3_compileoption_used(u)}),_}else{if(l._result)return l._result;l._opt||(l._rx=/^([^=]+)=(.+)/,l._rxInt=/^-?\d+$/,l._opt=function(ne,se){const ie=l._rx.exec(ne);se[0]=ie?ie[1]:ne,se[1]=ie?l._rxInt.test(ie[2])?+ie[2]:ie[2]:!0});const u={},I=[0,0];let U=0,ee;for(;ee=s.sqlite3_compileoption_get(U++);)l._opt(ee,I),u[I[0]]=I[1];return l._result=u}return typeof _=="string"?!!s.sqlite3_compileoption_used(_):!1},o.pstack=Object.assign(Object.create(null),{restore:o.exports.sqlite3__wasm_pstack_restore,alloc:function(l){return typeof l=="string"&&!(l=o.sizeofIR(l))&&d.toss("Invalid value for pstack.alloc(",arguments[0],")"),o.exports.sqlite3__wasm_pstack_alloc(l)||d.toss("Could not allocate",l,"bytes from the pstack.")},allocChunks:function(l,_){typeof _=="string"&&!(_=o.sizeofIR(_))&&d.toss("Invalid size value for allocChunks(",arguments[1],")");const u=o.pstack.alloc(l*_),I=[];let U=0,ee=0;for(;Ul===1?o.pstack.alloc(_?8:o.ptrSizeof):o.pstack.allocChunks(l,_?8:o.ptrSizeof),call:function(l){const _=o.pstack.pointer;try{return l(m)}finally{o.pstack.restore(_)}}}),Object.defineProperties(o.pstack,{pointer:{configurable:!1,iterable:!0,writeable:!1,get:o.exports.sqlite3__wasm_pstack_ptr},quota:{configurable:!1,iterable:!0,writeable:!1,get:o.exports.sqlite3__wasm_pstack_quota},remaining:{configurable:!1,iterable:!0,writeable:!1,get:o.exports.sqlite3__wasm_pstack_remaining}}),s.sqlite3_randomness=(...l)=>{if(l.length===1&&y.isTypedArray(l[0])&&l[0].BYTES_PER_ELEMENT===1){const _=l[0];if(_.byteLength===0)return o.exports.sqlite3_randomness(0,0),_;const u=o.pstack.pointer;try{let I=_.byteLength,U=0;const ee=o.exports.sqlite3_randomness,ne=o.heap8u(),se=I<512?I:512,ie=o.pstack.alloc(se);do{const j=I>se?se:I;ee(j,ie),_.set(x(ne,ie,ie+j),U),I-=j,U+=j}while(I>0)}catch(I){console.error("Highly unexpected (and ignored!) exception in sqlite3_randomness():",I)}finally{o.pstack.restore(u)}return _}o.exports.sqlite3_randomness(...l)};let B;if(s.sqlite3_wasmfs_opfs_dir=function(){if(B!==void 0)return B;const l=r.wasmfsOpfsDir;if(!l||!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle)return B="";try{return l&&o.xCallWrapped("sqlite3__wasm_init_wasmfs","i32",["string"],l)===0?B=l:B=""}catch{return B=""}},s.sqlite3_wasmfs_filename_is_persistent=function(l){const _=s.sqlite3_wasmfs_opfs_dir();return _&&l?l.startsWith(_+"/"):!1},s.sqlite3_js_db_uses_vfs=function(l,_,u=0){try{const I=s.sqlite3_vfs_find(_);return I?l?I===s.sqlite3_js_db_vfs(l,u)?I:!1:I===s.sqlite3_vfs_find(0)?I:!1:!1}catch{return!1}},s.sqlite3_js_vfs_list=function(){const l=[];let _=s.sqlite3_vfs_find(0);for(;_;){const u=new s.sqlite3_vfs(_);l.push(o.cstrToJs(u.$zName)),_=u.$pNext,u.dispose()}return l},s.sqlite3_js_db_export=function(l,_=0){l=o.xWrap.testConvertArg("sqlite3*",l),l||R("Invalid sqlite3* argument."),o.bigIntEnabled||R("BigInt64 support is not enabled.");const u=o.scopedAllocPush();let I;try{const U=o.scopedAlloc(8+o.ptrSizeof),ee=U+8,ne=_?o.isPtr(_)?_:o.scopedAllocCString(""+_):0;let se=o.exports.sqlite3__wasm_db_serialize(l,ne,ee,U,0);se&&R("Database serialization failed with code",m.capi.sqlite3_js_rc_str(se)),I=o.peekPtr(ee);const ie=o.peek(U,"i64");return se=ie?o.heap8u().slice(I,I+Number(ie)):new Uint8Array,se}finally{I&&o.exports.sqlite3_free(I),o.scopedAllocPop(u)}},s.sqlite3_js_db_vfs=(l,_=0)=>y.sqlite3__wasm_db_vfs(l,_),s.sqlite3_js_aggregate_context=(l,_)=>s.sqlite3_aggregate_context(l,_)||(_?d.toss("Cannot allocate",_,"bytes for sqlite3_aggregate_context()"):0),s.sqlite3_js_posix_create_file=function(l,_,u){let I;_&&o.isPtr(_)?I=_:_ instanceof ArrayBuffer||_ instanceof Uint8Array?(I=o.allocFromTypedArray(_),(arguments.length<3||!y.isInt32(u)||u<0)&&(u=_.byteLength)):O.toss("Invalid 2nd argument for sqlite3_js_posix_create_file().");try{(!y.isInt32(u)||u<0)&&O.toss("Invalid 3rd argument for sqlite3_js_posix_create_file().");const U=y.sqlite3__wasm_posix_create_file(l,I,u);U&&O.toss("Creation of file failed with sqlite3 result code",s.sqlite3_js_rc_str(U))}finally{o.dealloc(I)}},s.sqlite3_js_vfs_create_file=function(l,_,u,I){r.warn("sqlite3_js_vfs_create_file() is deprecated and","should be avoided because it can lead to C-level crashes.","See its documentation for alternative options.");let U;u?(o.isPtr(u)?U=u:u instanceof ArrayBuffer&&(u=new Uint8Array(u)),u instanceof Uint8Array?(U=o.allocFromTypedArray(u),(arguments.length<4||!y.isInt32(I)||I<0)&&(I=u.byteLength)):O.toss("Invalid 3rd argument type for sqlite3_js_vfs_create_file().")):U=0,(!y.isInt32(I)||I<0)&&(o.dealloc(U),O.toss("Invalid 4th argument for sqlite3_js_vfs_create_file()."));try{const ee=y.sqlite3__wasm_vfs_create_file(l,_,U,I);ee&&O.toss("Creation of file failed with sqlite3 result code",s.sqlite3_js_rc_str(ee))}finally{o.dealloc(U)}},s.sqlite3_js_sql_to_string=l=>{if(typeof l=="string")return l;const _=c(v);return _===v?void 0:_},y.isUIThread()){const l=function(_){const u=Object.create(null);return u.prefix="kvvfs-"+_,u.stores=[],(_==="session"||_==="")&&u.stores.push(globalThis.sessionStorage),(_==="local"||_==="")&&u.stores.push(globalThis.localStorage),u};s.sqlite3_js_kvvfs_clear=function(_=""){let u=0;const I=l(_);return I.stores.forEach(U=>{const ee=[];let ne;for(ne=0;neU.removeItem(se)),u+=ee.length}),u},s.sqlite3_js_kvvfs_size=function(_=""){let u=0;const I=l(_);return I.stores.forEach(U=>{let ee;for(ee=0;eef(l,_,"sqlite3_preupdate_new"),s.sqlite3_preupdate_old_js=(l,_)=>f(l,_,"sqlite3_preupdate_old"),s.sqlite3changeset_new_js=(l,_)=>f(l,_,"sqlite3changeset_new"),s.sqlite3changeset_old_js=(l,_)=>f(l,_,"sqlite3changeset_old");const m={WasmAllocError:d,SQLite3Error:O,capi:s,util:y,wasm:o,config:r,version:Object.create(null),client:void 0,asyncPostInit:async function l(){if(l.isReady instanceof Promise)return l.isReady;let _=t.initializersAsync;delete t.initializersAsync;const u=async()=>(m.__isUnderTest||(delete m.util,delete m.StructBinder),m),I=ee=>{throw r.error("an async sqlite3 initializer failed:",ee),ee};if(!_||!_.length)return l.isReady=u().catch(I);_=_.map(ee=>ee instanceof Function?async ne=>ee(m):ee),_.push(u);let U=Promise.resolve(m);for(;_.length;)U=U.then(_.shift());return l.isReady=U.catch(I)},scriptInfo:void 0};try{t.initializers.forEach(l=>{l(m)})}catch(l){throw console.error("sqlite3 bootstrap initializer threw:",l),l}return delete t.initializers,t.sqlite3=m,m},globalThis.sqlite3ApiBootstrap.initializers=[],globalThis.sqlite3ApiBootstrap.initializersAsync=[],globalThis.sqlite3ApiBootstrap.defaultConfig=Object.create(null),globalThis.sqlite3ApiBootstrap.sqlite3=void 0,globalThis.WhWasmUtilInstaller=function(t){t.bigIntEnabled===void 0&&(t.bigIntEnabled=!!globalThis.BigInt64Array);const n=(...c)=>{throw new Error(c.join(" "))};t.exports||Object.defineProperty(t,"exports",{enumerable:!0,configurable:!0,get:()=>t.instance&&t.instance.exports});const r=t.pointerIR||"i32",s=t.ptrSizeof=r==="i32"?4:r==="i64"?8:n("Unhandled ptrSizeof:",r),o=Object.create(null);o.heapSize=0,o.memory=null,o.freeFuncIndexes=[],o.scopedAlloc=[],o.utf8Decoder=new TextDecoder,o.utf8Encoder=new TextEncoder("utf-8"),t.sizeofIR=c=>{switch(c){case"i8":return 1;case"i16":return 2;case"i32":case"f32":case"float":return 4;case"i64":case"f64":case"double":return 8;case"*":return s;default:return(""+c).endsWith("*")?s:void 0}};const p=function(){if(!o.memory)o.memory=t.memory instanceof WebAssembly.Memory?t.memory:t.exports.memory;else if(o.heapSize===o.memory.buffer.byteLength)return o;const c=o.memory.buffer;return o.HEAP8=new Int8Array(c),o.HEAP8U=new Uint8Array(c),o.HEAP16=new Int16Array(c),o.HEAP16U=new Uint16Array(c),o.HEAP32=new Int32Array(c),o.HEAP32U=new Uint32Array(c),t.bigIntEnabled&&(o.HEAP64=new BigInt64Array(c),o.HEAP64U=new BigUint64Array(c)),o.HEAP32F=new Float32Array(c),o.HEAP64F=new Float64Array(c),o.heapSize=c.byteLength,o};t.heap8=()=>p().HEAP8,t.heap8u=()=>p().HEAP8U,t.heap16=()=>p().HEAP16,t.heap16u=()=>p().HEAP16U,t.heap32=()=>p().HEAP32,t.heap32u=()=>p().HEAP32U,t.heapForSize=function(c,d=!0){const y=o.memory&&o.heapSize===o.memory.buffer.byteLength?o:p();switch(c){case Int8Array:return y.HEAP8;case Uint8Array:return y.HEAP8U;case Int16Array:return y.HEAP16;case Uint16Array:return y.HEAP16U;case Int32Array:return y.HEAP32;case Uint32Array:return y.HEAP32U;case 8:return d?y.HEAP8U:y.HEAP8;case 16:return d?y.HEAP16U:y.HEAP16;case 32:return d?y.HEAP32U:y.HEAP32;case 64:if(y.HEAP64)return d?y.HEAP64U:y.HEAP64;break;default:if(t.bigIntEnabled){if(c===globalThis.BigUint64Array)return y.HEAP64U;if(c===globalThis.BigInt64Array)return y.HEAP64;break}}n("Invalid heapForSize() size: expecting 8, 16, 32,","or (if BigInt is enabled) 64.")},t.functionTable=function(){return t.exports.__indirect_function_table},t.functionEntry=function(c){const d=t.functionTable();return c>7)},rxJSig:/^(\w)\((\w*)\)$/,sigParams:function(m){const l=c._.rxJSig.exec(m);return l?l[2]:m.substr(1)},letterType:m=>c._.sigTypes[m]||n("Invalid signature letter:",m),pushSigType:(m,l)=>m.push(c._.typeCodes[c._.letterType(l)])}),typeof d=="string"){const m=y;y=d,d=m}const B=c._.sigParams(y),f=[1,96];c._.uleb128Encode(f,"push",B.length);for(const m of B)c._.pushSigType(f,m);return y[0]==="v"?f.push(0):(f.push(1),c._.pushSigType(f,y[0])),c._.uleb128Encode(f,"unshift",f.length),f.unshift(0,97,115,109,1,0,0,0,1),f.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0),new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array(f)),{e:{f:d}}).exports.f};const g=function(d,y,B){if(B&&!o.scopedAlloc.length&&n("No scopedAllocPush() scope is active."),typeof d=="string"){const _=y;y=d,d=_}(typeof y!="string"||!(d instanceof Function))&&n("Invalid arguments: expecting (function,signature) or (signature,function).");const f=t.functionTable(),m=f.length;let l;for(;o.freeFuncIndexes.length&&(l=o.freeFuncIndexes.pop(),f.get(l));){l=null;continue}l||(l=m,f.grow(1));try{return f.set(l,d),B&&o.scopedAlloc[o.scopedAlloc.length-1].push(l),l}catch(_){if(!(_ instanceof TypeError))throw l===m&&o.freeFuncIndexes.push(m),_}try{const _=t.jsFuncToWasm(d,y);f.set(l,_),B&&o.scopedAlloc[o.scopedAlloc.length-1].push(l)}catch(_){throw l===m&&o.freeFuncIndexes.push(m),_}return l};t.installFunction=(c,d)=>g(c,d,!1),t.scopedInstallFunction=(c,d)=>g(c,d,!0),t.uninstallFunction=function(c){if(!c&&c!==0)return;const d=o.freeFuncIndexes,y=t.functionTable();d.push(c);const B=y.get(c);return y.set(c,null),B},t.peek=function(d,y="i8"){y.endsWith("*")&&(y=r);const B=o.memory&&o.heapSize===o.memory.buffer.byteLength?o:p(),f=Array.isArray(d)?[]:void 0;let m;do{switch(f&&(d=arguments[0].shift()),y){case"i1":case"i8":m=B.HEAP8[d>>0];break;case"i16":m=B.HEAP16[d>>1];break;case"i32":m=B.HEAP32[d>>2];break;case"float":case"f32":m=B.HEAP32F[d>>2];break;case"double":case"f64":m=Number(B.HEAP64F[d>>3]);break;case"i64":if(t.bigIntEnabled){m=BigInt(B.HEAP64[d>>3]);break}default:n("Invalid type for peek():",y)}f&&f.push(m)}while(f&&arguments[0].length);return f||m},t.poke=function(c,d,y="i8"){y.endsWith("*")&&(y=r);const B=o.memory&&o.heapSize===o.memory.buffer.byteLength?o:p();for(const f of Array.isArray(c)?c:[c])switch(y){case"i1":case"i8":B.HEAP8[f>>0]=d;continue;case"i16":B.HEAP16[f>>1]=d;continue;case"i32":B.HEAP32[f>>2]=d;continue;case"float":case"f32":B.HEAP32F[f>>2]=d;continue;case"double":case"f64":B.HEAP64F[f>>3]=d;continue;case"i64":if(B.HEAP64){B.HEAP64[f>>3]=BigInt(d);continue}default:n("Invalid type for poke(): "+y)}return this},t.peekPtr=(...c)=>t.peek(c.length===1?c[0]:c,r),t.pokePtr=(c,d=0)=>t.poke(c,d,r),t.peek8=(...c)=>t.peek(c.length===1?c[0]:c,"i8"),t.poke8=(c,d)=>t.poke(c,d,"i8"),t.peek16=(...c)=>t.peek(c.length===1?c[0]:c,"i16"),t.poke16=(c,d)=>t.poke(c,d,"i16"),t.peek32=(...c)=>t.peek(c.length===1?c[0]:c,"i32"),t.poke32=(c,d)=>t.poke(c,d,"i32"),t.peek64=(...c)=>t.peek(c.length===1?c[0]:c,"i64"),t.poke64=(c,d)=>t.poke(c,d,"i64"),t.peek32f=(...c)=>t.peek(c.length===1?c[0]:c,"f32"),t.poke32f=(c,d)=>t.poke(c,d,"f32"),t.peek64f=(...c)=>t.peek(c.length===1?c[0]:c,"f64"),t.poke64f=(c,d)=>t.poke(c,d,"f64"),t.getMemValue=t.peek,t.getPtrValue=t.peekPtr,t.setMemValue=t.poke,t.setPtrValue=t.pokePtr,t.isPtr32=c=>typeof c=="number"&&c===(c|0)&&c>=0,t.isPtr=t.isPtr32,t.cstrlen=function(c){if(!c||!t.isPtr(c))return null;const d=p().HEAP8U;let y=c;for(;d[y]!==0;++y);return y-c};const O=typeof SharedArrayBuffer>"u"?function(){}:SharedArrayBuffer,R=function(c,d,y){return o.utf8Decoder.decode(c.buffer instanceof O?c.slice(d,y):c.subarray(d,y))};t.cstrToJs=function(c){const d=t.cstrlen(c);return d?R(p().HEAP8U,c,c+d):d===null?d:""},t.jstrlen=function(c){if(typeof c!="string")return null;const d=c.length;let y=0;for(let B=0;B=55296&&f<=57343&&(f=65536+((f&1023)<<10)|c.charCodeAt(++B)&1023),f<=127?++y:f<=2047?y+=2:f<=65535?y+=3:y+=4}return y},t.jstrcpy=function(c,d,y=0,B=-1,f=!0){if((!d||!(d instanceof Int8Array)&&!(d instanceof Uint8Array))&&n("jstrcpy() target must be an Int8Array or Uint8Array."),B<0&&(B=d.length-y),!(B>0)||!(y>=0))return 0;let m=0,l=c.length;const _=y,u=y+B-(f?1:0);for(;m=55296&&I<=57343&&(I=65536+((I&1023)<<10)|c.charCodeAt(++m)&1023),I<=127){if(y>=u)break;d[y++]=I}else if(I<=2047){if(y+1>=u)break;d[y++]=192|I>>6,d[y++]=128|I&63}else if(I<=65535){if(y+2>=u)break;d[y++]=224|I>>12,d[y++]=128|I>>6&63,d[y++]=128|I&63}else{if(y+3>=u)break;d[y++]=240|I>>18,d[y++]=128|I>>12&63,d[y++]=128|I>>6&63,d[y++]=128|I&63}}return f&&(d[y++]=0),y-_},t.cstrncpy=function(c,d,y){if((!c||!d)&&n("cstrncpy() does not accept NULL strings."),y<0)y=t.cstrlen(strPtr)+1;else if(!(y>0))return 0;const B=t.heap8u();let f=0,m;for(;fo.utf8Encoder.encode(d?c+"\0":c);const z=(c,d)=>{(!(c.alloc instanceof Function)||!(c.dealloc instanceof Function))&&n("Object is missing alloc() and/or dealloc() function(s)","required by",d+"().")},Q=function(c,d,y,B){if(z(t,B),typeof c!="string")return null;{const f=o.utf8Encoder.encode(c),m=y(f.length+1),l=p().HEAP8U;return l.set(f,m),l[m+f.length]=0,d?[m,f.length]:m}};t.allocCString=(c,d=!1)=>Q(c,d,t.alloc,"allocCString()"),t.scopedAllocPush=function(){z(t,"scopedAllocPush");const c=[];return o.scopedAlloc.push(c),c},t.scopedAllocPop=function(c){z(t,"scopedAllocPop");const d=arguments.length?o.scopedAlloc.indexOf(c):o.scopedAlloc.length-1;d<0&&n("Invalid state object for scopedAllocPop()."),arguments.length===0&&(c=o.scopedAlloc[d]),o.scopedAlloc.splice(d,1);for(let y;y=c.pop();)t.functionEntry(y)?t.uninstallFunction(y):t.dealloc(y)},t.scopedAlloc=function(c){o.scopedAlloc.length||n("No scopedAllocPush() scope is active.");const d=t.alloc(c);return o.scopedAlloc[o.scopedAlloc.length-1].push(d),d},Object.defineProperty(t.scopedAlloc,"level",{configurable:!1,enumerable:!1,get:()=>o.scopedAlloc.length,set:()=>n("The 'active' property is read-only.")}),t.scopedAllocCString=(c,d=!1)=>Q(c,d,t.scopedAlloc,"scopedAllocCString()");const T=function(c,d){const y=t[c?"scopedAlloc":"alloc"]((d.length+1)*t.ptrSizeof);let B=0;return d.forEach(f=>{t.pokePtr(y+t.ptrSizeof*B++,t[c?"scopedAllocCString":"allocCString"](""+f))}),t.pokePtr(y+t.ptrSizeof*B,0),y};t.scopedAllocMainArgv=c=>T(!0,c),t.allocMainArgv=c=>T(!1,c),t.cArgvToJs=(c,d)=>{const y=[];for(let B=0;BA(c,d,"alloc"),t.scopedAllocPtr=(c=1,d=!0)=>A(c,d,"scopedAlloc"),t.xGet=function(c){return t.exports[c]||n("Cannot find exported symbol:",c)};const D=(c,d)=>n(c+"() requires",d,"argument(s).");t.xCall=function(c,...d){const y=c instanceof Function?c:t.xGet(c);return y instanceof Function||n("Exported symbol",c,"is not a function."),y.length!==d.length&&D(y===c?y.name:c,y.length),arguments.length===2&&Array.isArray(arguments[1])?y.apply(null,arguments[1]):y.apply(null,d)},o.xWrap=Object.create(null),o.xWrap.convert=Object.create(null),o.xWrap.convert.arg=new Map,o.xWrap.convert.result=new Map;const q=o.xWrap.convert.arg,w=o.xWrap.convert.result;t.bigIntEnabled&&q.set("i64",c=>BigInt(c));const x=r==="i32"?c=>c|0:c=>BigInt(c)|BigInt(0);q.set("i32",x).set("i16",c=>(c|0)&65535).set("i8",c=>(c|0)&255).set("f32",c=>Number(c).valueOf()).set("float",q.get("f32")).set("f64",q.get("f32")).set("double",q.get("f64")).set("int",q.get("i32")).set("null",c=>c).set(null,q.get("null")).set("**",x).set("*",x),w.set("*",x).set("pointer",x).set("number",c=>Number(c)).set("void",c=>{}).set("null",c=>c).set(null,w.get("null"));{const c=["i8","i16","i32","int","f32","float","f64","double"];t.bigIntEnabled&&c.push("i64");const d=q.get(r);for(const y of c)q.set(y+"*",d),w.set(y+"*",d),w.set(y,q.get(y)||n("Missing arg converter:",y))}const N=function(c){return typeof c=="string"?t.scopedAllocCString(c):c?x(c):null};q.set("string",N).set("utf8",N).set("pointer",N),w.set("string",c=>t.cstrToJs(c)).set("utf8",w.get("string")).set("string:dealloc",c=>{try{return c?t.cstrToJs(c):null}finally{t.dealloc(c)}}).set("utf8:dealloc",w.get("string:dealloc")).set("json",c=>JSON.parse(t.cstrToJs(c))).set("json:dealloc",c=>{try{return c?JSON.parse(t.cstrToJs(c)):null}finally{t.dealloc(c)}});const P=class{constructor(c){this.name=c.name||"unnamed adapter"}convertArg(c,d,y){n("AbstractArgAdapter must be subclassed.")}};q.FuncPtrAdapter=class Fe extends P{constructor(d){super(d),q.FuncPtrAdapter.warnOnUse&&console.warn("xArg.FuncPtrAdapter is an internal-only API","and is not intended to be invoked from","client-level code. Invoked with:",d),this.name=d.name||"unnamed",this.signature=d.signature,d.contextKey instanceof Function&&(this.contextKey=d.contextKey,d.bindScope||(d.bindScope="context")),this.bindScope=d.bindScope||n("FuncPtrAdapter options requires a bindScope (explicit or implied)."),Fe.bindScopes.indexOf(d.bindScope)<0&&n("Invalid options.bindScope ("+d.bindMod+") for FuncPtrAdapter. Expecting one of: ("+Fe.bindScopes.join(", ")+")"),this.isTransient=this.bindScope==="transient",this.isContext=this.bindScope==="context",this.isPermanent=this.bindScope==="permanent",this.singleton=this.bindScope==="singleton"?[]:void 0,this.callProxy=d.callProxy instanceof Function?d.callProxy:void 0}contextKey(d,y){return this}contextMap(d){const y=this.__cmap||(this.__cmap=new Map);let B=y.get(d);return B===void 0&&y.set(d,B=[]),B}convertArg(d,y,B){let f=this.singleton;if(!f&&this.isContext&&(f=this.contextMap(this.contextKey(y,B))),f&&f[0]===d)return f[1];if(d instanceof Function){this.callProxy&&(d=this.callProxy(d));const m=g(d,this.signature,this.isTransient);if(Fe.debugFuncInstall&&Fe.debugOut("FuncPtrAdapter installed",this,this.contextKey(y,B),"@"+m,d),f){if(f[1]){Fe.debugFuncInstall&&Fe.debugOut("FuncPtrAdapter uninstalling",this,this.contextKey(y,B),"@"+f[1],d);try{o.scopedAlloc[o.scopedAlloc.length-1].push(f[1])}catch{}}f[0]=d,f[1]=m}return m}else if(t.isPtr(d)||d===null||d===void 0){if(f&&f[1]&&f[1]!==d){Fe.debugFuncInstall&&Fe.debugOut("FuncPtrAdapter uninstalling",this,this.contextKey(y,B),"@"+f[1],d);try{o.scopedAlloc[o.scopedAlloc.length-1].push(f[1])}catch{}f[0]=f[1]=d|0}return d||0}else throw new TypeError("Invalid FuncPtrAdapter argument type. Expecting a function pointer or a "+(this.name?this.name+" ":"")+"function matching signature "+this.signature+".")}},q.FuncPtrAdapter.warnOnUse=!1,q.FuncPtrAdapter.debugFuncInstall=!1,q.FuncPtrAdapter.debugOut=console.debug.bind(console),q.FuncPtrAdapter.bindScopes=["transient","context","singleton","permanent"];const S=c=>q.get(c)||n("Argument adapter not found:",c),L=c=>w.get(c)||n("Result adapter not found:",c);o.xWrap.convertArg=(c,...d)=>S(c)(...d),o.xWrap.convertArgNoCheck=(c,...d)=>q.get(c)(...d),o.xWrap.convertResult=(c,d)=>c===null?d:c?L(c)(d):void 0,o.xWrap.convertResultNoCheck=(c,d)=>c===null?d:c?w.get(c)(d):void 0,t.xWrap=function(c,d,...y){arguments.length===3&&Array.isArray(arguments[2])&&(y=arguments[2]),t.isPtr(c)&&(c=t.functionEntry(c)||n("Function pointer not found in WASM function table."));const B=c instanceof Function,f=B?c:t.xGet(c);if(B&&(c=f.name||"unnamed function"),y.length!==f.length&&D(c,f.length),d===null&&f.length===0)return f;d!=null&&L(d);for(const l of y)l instanceof P?q.set(l,(..._)=>l.convertArg(..._)):S(l);const m=o.xWrap;return f.length===0?(...l)=>l.length?D(c,f.length):m.convertResult(d,f.call(null)):function(...l){l.length!==f.length&&D(c,f.length);const _=t.scopedAllocPush();try{let u=0;for(;ufetch(t.uri,{credentials:"same-origin"}),r=this,s=function(p){if(t.wasmUtilTarget){const g=(...R)=>{throw new Error(R.join(" "))},O=t.wasmUtilTarget;if(O.module=p.module,O.instance=p.instance,O.instance.exports.memory||(O.memory=t.imports&&t.imports.env&&t.imports.env.memory||g("Missing 'memory' object!")),!O.alloc&&p.instance.exports.malloc){const R=p.instance.exports;O.alloc=function(z){return R.malloc(z)||g("Allocation of",z,"bytes failed.")},O.dealloc=function(z){R.free(z)}}r(O)}return t.onload&&t.onload(p,t),p};return WebAssembly.instantiateStreaming?function(){return WebAssembly.instantiateStreaming(n(),t.imports||{}).then(s)}:function(){return n().then(g=>g.arrayBuffer()).then(g=>WebAssembly.instantiate(g,t.imports||{})).then(s)}}).bind(globalThis.WhWasmUtilInstaller),globalThis.Jaccwabyt=function t(n){const r=(...F)=>{throw new Error(F.join(" "))};!(n.heap instanceof WebAssembly.Memory)&&!(n.heap instanceof Function)&&r("config.heap must be WebAssembly.Memory instance or a function."),["alloc","dealloc"].forEach(function(F){n[F]instanceof Function||r("Config option '"+F+"' must be a function.")});const s=t,o=n.heap instanceof Function?n.heap:()=>new Uint8Array(n.heap.buffer),p=n.alloc,g=n.dealloc,O=n.log||console.log.bind(console),R=n.memberPrefix||"",z=n.memberSuffix||"",Q=n.bigIntEnabled===void 0?!!globalThis.BigInt64Array:!!n.bigIntEnabled,T=globalThis.BigInt,A=globalThis.BigInt64Array,D=n.ptrSizeof||4,q=n.ptrIR||"i32";s.debugFlags||(s.__makeDebugFlags=function(F=null){F&&F.__flags&&(F=F.__flags);const V=function K(X){return arguments.length===0?K.__flags:(X<0?(delete K.__flags.getter,delete K.__flags.setter,delete K.__flags.alloc,delete K.__flags.dealloc):(K.__flags.getter=(1&X)!==0,K.__flags.setter=(2&X)!==0,K.__flags.alloc=(4&X)!==0,K.__flags.dealloc=(8&X)!==0),K._flags)};return Object.defineProperty(V,"__flags",{iterable:!1,writable:!1,value:Object.create(F)}),F||V(0),V},s.debugFlags=s.__makeDebugFlags());const w=(function(){const F=new ArrayBuffer(2);return new DataView(F).setInt16(0,256,!0),new Int16Array(F)[0]===256})(),x=F=>F[1]==="(",N=F=>F==="P",P=F=>x(F)?"p":F[0],S=function(F){switch(P(F)){case"c":case"C":return"i8";case"i":return"i32";case"p":case"P":case"s":return q;case"j":return"i64";case"f":return"float";case"d":return"double"}r("Unhandled signature IR:",F)},L=A?()=>!0:()=>r("BigInt64Array is not available."),$=function(F){switch(P(F)){case"p":case"P":case"s":{switch(D){case 4:return"getInt32";case 8:return L()&&"getBigInt64"}break}case"i":return"getInt32";case"c":return"getInt8";case"C":return"getUint8";case"j":return L()&&"getBigInt64";case"f":return"getFloat32";case"d":return"getFloat64"}r("Unhandled DataView getter for signature:",F)},c=function(F){switch(P(F)){case"p":case"P":case"s":{switch(D){case 4:return"setInt32";case 8:return L()&&"setBigInt64"}break}case"i":return"setInt32";case"c":return"setInt8";case"C":return"setUint8";case"j":return L()&&"setBigInt64";case"f":return"setFloat32";case"d":return"setFloat64"}r("Unhandled DataView setter for signature:",F)},d=function(F){switch(P(F)){case"i":case"f":case"c":case"C":case"d":return Number;case"j":return L()&&T;case"p":case"P":case"s":switch(D){case 4:return Number;case 8:return L()&&T}break}r("Unhandled DataView set wrapper for signature:",F)},y=(F,V)=>F+"::"+V,B=function(F,V){return()=>r(y(F,V),"is read-only.")},f=new WeakMap,m="(pointer-is-external)",l=function(F,V,K){if(K||(K=f.get(V)),K){if(f.delete(V),Array.isArray(V.ondispose)){let X;for(;X=V.ondispose.shift();)try{X instanceof Function?X.call(V):X instanceof te?X.dispose():typeof X=="number"&&g(X)}catch(_e){console.warn("ondispose() for",F.structName,"@",K,"threw. NOT propagating it.",_e)}}else if(V.ondispose instanceof Function)try{V.ondispose()}catch(X){console.warn("ondispose() for",F.structName,"@",K,"threw. NOT propagating it.",X)}delete V.ondispose,F.debugFlags.__flags.dealloc&&O("debug.dealloc:",V[m]?"EXTERNAL":"",F.structName,"instance:",F.structInfo.sizeof,"bytes @"+K),V[m]||g(K)}},_=F=>({configurable:!1,writable:!1,iterable:!1,value:F}),u=function(F,V,K){let X=!K;K?Object.defineProperty(V,m,_(K)):(K=p(F.structInfo.sizeof),K||r("Allocation of",F.structName,"structure failed."));try{F.debugFlags.__flags.alloc&&O("debug.alloc:",X?"":"EXTERNAL",F.structName,"instance:",F.structInfo.sizeof,"bytes @"+K),X&&o().fill(0,K,K+F.structInfo.sizeof),f.set(V,K)}catch(_e){throw l(F,V,K),_e}},I=function(){const F=this.pointer;return F?new Uint8Array(o().slice(F,F+this.structInfo.sizeof)):null},ee=_(F=>R+F+z),ne=function(F,V,K=!0){let X=F.members[V];if(!X&&(R||z)){for(const _e of Object.values(F.members))if(_e.key===V){X=_e;break}!X&&K&&r(y(F.name,V),"is not a mapped struct member.")}return X},se=function F(V,K,X=!1){F._||(F._=ge=>ge.replace(/[^vipPsjrdcC]/g,"").replace(/[pPscC]/g,"i"));const _e=ne(V.structInfo,K,!0);return X?F._(_e.signature):_e.signature},ie={configurable:!1,enumerable:!1,get:function(){return f.get(this)},set:()=>r("Cannot assign the 'pointer' property of a struct.")},j=_(function(){const F=[];for(const V of Object.keys(this.structInfo.members))F.push(this.memberKey(V));return F}),b=new TextDecoder("utf-8"),k=new TextEncoder,W=typeof SharedArrayBuffer>"u"?function(){}:SharedArrayBuffer,H=function(F,V,K){return b.decode(F.buffer instanceof W?F.slice(V,K):F.subarray(V,K))},Z=function(F,V,K=!1){const X=ne(F.structInfo,V,K);return X&&X.signature.length===1&&X.signature[0]==="s"?X:!1},E=function(F){F.signature!=="s"&&r("Invalid member type signature for C-string value:",JSON.stringify(F))},C=function(V,K){const X=ne(V.structInfo,K,!0);E(X);const _e=V[X.key];if(!_e)return null;let ge=_e;const pe=o();for(;pe[ge]!==0;++ge);return _e===ge?"":H(pe,_e,ge)},M=function(F,...V){F.ondispose?Array.isArray(F.ondispose)||(F.ondispose=[F.ondispose]):F.ondispose=[],F.ondispose.push(...V)},J=function(F){const V=k.encode(F),K=p(V.length+1);K||r("Allocation error while duplicating string:",F);const X=o();return X.set(V,K),X[K+V.length]=0,K},G=function(F,V,K){const X=ne(F.structInfo,V,!0);E(X);const _e=J(K);return F[X.key]=_e,M(F,_e),F},te=function(V,K){arguments[2]!==_&&r("Do not call the StructType constructor","from client-level code."),Object.defineProperties(this,{structName:_(V),structInfo:_(K)})};te.prototype=Object.create(null,{dispose:_(function(){l(this.constructor,this)}),lookupMember:_(function(F,V=!0){return ne(this.structInfo,F,V)}),memberToJsString:_(function(F){return C(this,F)}),memberIsString:_(function(F,V=!0){return Z(this,F,V)}),memberKey:ee,memberKeys:j,memberSignature:_(function(F,V=!1){return se(this,F,V)}),memoryDump:_(I),pointer:ie,setMemberCString:_(function(F,V){return G(this,F,V)})}),Object.assign(te.prototype,{addOnDispose:function(...F){return M(this,...F),this}}),Object.defineProperties(te,{allocCString:_(J),isA:_(F=>F instanceof te),hasExternalPointer:_(F=>F instanceof te&&!!F[m]),memberKey:ee});const ae=F=>Number.isFinite(F)||F instanceof(T||Number),Y=function F(V,K,X){if(!F._){F._={getters:{},setters:{},sw:{}};const ve=["i","c","C","p","P","s","f","d","v()"];Q&&ve.push("j"),ve.forEach(function(Se){F._.getters[Se]=$(Se),F._.setters[Se]=c(Se),F._.sw[Se]=d(Se)});const Kn=/^[ipPsjfdcC]$/,Jn=/^[vipPsjfdcC]\([ipPsjfdcC]*\)$/;F.sigCheck=function(Se,Xn,Ot,ut){Object.prototype.hasOwnProperty.call(Se,Ot)&&r(Se.structName,"already has a property named",Ot+"."),Kn.test(ut)||Jn.test(ut)||r("Malformed signature for",y(Se.structName,Xn)+":",ut)}}const _e=V.memberKey(K);F.sigCheck(V.prototype,K,_e,X.signature),X.key=_e,X.name=K;const ge=P(X.signature),pe=y(V.prototype.structName,_e),he=V.prototype.debugFlags.__flags,Qe=Object.create(null);Qe.configurable=!1,Qe.enumerable=!1,Qe.get=function(){he.getter&&O("debug.getter:",F._.getters[ge],"for",S(ge),pe,"@",this.pointer,"+",X.offset,"sz",X.sizeof);let ve=new DataView(o().buffer,this.pointer+X.offset,X.sizeof)[F._.getters[ge]](0,w);return he.getter&&O("debug.getter:",pe,"result =",ve),ve},X.readOnly?Qe.set=B(V.prototype.structName,_e):Qe.set=function(ve){if(he.setter&&O("debug.setter:",F._.setters[ge],"for",S(ge),pe,"@",this.pointer,"+",X.offset,"sz",X.sizeof,ve),this.pointer||r("Cannot set struct property on disposed instance."),ve===null)ve=0;else for(;!ae(ve);){if(N(X.signature)&&ve instanceof te){ve=ve.pointer||0,he.setter&&O("debug.setter:",pe,"resolved to",ve);break}r("Invalid value for pointer-type",pe+".")}new DataView(o().buffer,this.pointer+X.offset,X.sizeof)[F._.setters[ge]](0,F._.sw[ge](ve),w)},Object.defineProperty(V.prototype,_e,Qe)},we=function F(V,K){arguments.length===1?(K=V,V=K.name):K.name||(K.name=V),V||r("Struct name is required.");let X=!1;Object.keys(K.members).forEach(pe=>{const he=K.members[pe];he.sizeof?he.sizeof===1?he.signature==="c"||he.signature==="C"||r("Unexpected sizeof==1 member",y(K.name,pe),"with signature",he.signature):(he.sizeof%4!==0&&(console.warn("Invalid struct member description =",he,"from",K),r(V,"member",pe,"sizeof is not aligned. sizeof="+he.sizeof)),he.offset%4!==0&&(console.warn("Invalid struct member description =",he,"from",K),r(V,"member",pe,"offset is not aligned. offset="+he.offset))):r(V,"member",pe,"is missing sizeof."),(!X||X.offsetpe instanceof ge),memberKey:ee,memberKeys:j,methodInfoForKey:_(function(pe){}),structInfo:_(K),structName:_(V)}),ge.prototype=new te(V,K,_),Object.defineProperties(ge.prototype,{debugFlags:_e,constructor:_(ge)}),Object.keys(K.members).forEach(pe=>Y(ge,pe,K.members[pe])),ge};return we.StructType=te,we.config=n,we.allocCString=J,we.debugFlags||(we.debugFlags=s.__makeDebugFlags(s.debugFlags)),we},globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=(...q)=>{throw new Error(q.join(" "))};t.SQLite3Error.toss;const r=t.capi,s=t.wasm,o=t.util;if(globalThis.WhWasmUtilInstaller(s),delete globalThis.WhWasmUtilInstaller,s.bindingSignatures=[["sqlite3_aggregate_context","void*","sqlite3_context*","int"],["sqlite3_bind_double","int","sqlite3_stmt*","int","f64"],["sqlite3_bind_int","int","sqlite3_stmt*","int","int"],["sqlite3_bind_null",void 0,"sqlite3_stmt*","int"],["sqlite3_bind_parameter_count","int","sqlite3_stmt*"],["sqlite3_bind_parameter_index","int","sqlite3_stmt*","string"],["sqlite3_bind_parameter_name","string","sqlite3_stmt*","int"],["sqlite3_bind_pointer","int","sqlite3_stmt*","int","*","string:static","*"],["sqlite3_busy_handler","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({signature:"i(pi)",contextKey:(q,w)=>q[0]}),"*"]],["sqlite3_busy_timeout","int","sqlite3*","int"],["sqlite3_changes","int","sqlite3*"],["sqlite3_clear_bindings","int","sqlite3_stmt*"],["sqlite3_collation_needed","int","sqlite3*","*","*"],["sqlite3_column_blob","*","sqlite3_stmt*","int"],["sqlite3_column_bytes","int","sqlite3_stmt*","int"],["sqlite3_column_count","int","sqlite3_stmt*"],["sqlite3_column_decltype","string","sqlite3_stmt*","int"],["sqlite3_column_double","f64","sqlite3_stmt*","int"],["sqlite3_column_int","int","sqlite3_stmt*","int"],["sqlite3_column_name","string","sqlite3_stmt*","int"],["sqlite3_column_text","string","sqlite3_stmt*","int"],["sqlite3_column_type","int","sqlite3_stmt*","int"],["sqlite3_column_value","sqlite3_value*","sqlite3_stmt*","int"],["sqlite3_commit_hook","void*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_commit_hook",signature:"i(p)",contextKey:q=>q[0]}),"*"]],["sqlite3_compileoption_get","string","int"],["sqlite3_compileoption_used","int","string"],["sqlite3_complete","int","string:flexible"],["sqlite3_context_db_handle","sqlite3*","sqlite3_context*"],["sqlite3_data_count","int","sqlite3_stmt*"],["sqlite3_db_filename","string","sqlite3*","string"],["sqlite3_db_handle","sqlite3*","sqlite3_stmt*"],["sqlite3_db_name","string","sqlite3*","int"],["sqlite3_db_readonly","int","sqlite3*","string"],["sqlite3_db_status","int","sqlite3*","int","*","*","int"],["sqlite3_errcode","int","sqlite3*"],["sqlite3_errmsg","string","sqlite3*"],["sqlite3_error_offset","int","sqlite3*"],["sqlite3_errstr","string","int"],["sqlite3_exec","int",["sqlite3*","string:flexible",new s.xWrap.FuncPtrAdapter({signature:"i(pipp)",bindScope:"transient",callProxy:q=>{let w;return(x,N,P,S)=>{try{const L=s.cArgvToJs(N,P);return w||(w=s.cArgvToJs(N,S)),q(L,w)|0}catch(L){return L.resultCode||r.SQLITE_ERROR}}}}),"*","**"]],["sqlite3_expanded_sql","string","sqlite3_stmt*"],["sqlite3_extended_errcode","int","sqlite3*"],["sqlite3_extended_result_codes","int","sqlite3*","int"],["sqlite3_file_control","int","sqlite3*","string","int","*"],["sqlite3_finalize","int","sqlite3_stmt*"],["sqlite3_free",void 0,"*"],["sqlite3_get_autocommit","int","sqlite3*"],["sqlite3_get_auxdata","*","sqlite3_context*","int"],["sqlite3_initialize",void 0],["sqlite3_interrupt",void 0,"sqlite3*"],["sqlite3_is_interrupted","int","sqlite3*"],["sqlite3_keyword_count","int"],["sqlite3_keyword_name","int",["int","**","*"]],["sqlite3_keyword_check","int",["string","int"]],["sqlite3_libversion","string"],["sqlite3_libversion_number","int"],["sqlite3_limit","int",["sqlite3*","int","int"]],["sqlite3_malloc","*","int"],["sqlite3_open","int","string","*"],["sqlite3_open_v2","int","string","*","int","string"],["sqlite3_realloc","*","*","int"],["sqlite3_reset","int","sqlite3_stmt*"],["sqlite3_result_blob",void 0,"sqlite3_context*","*","int","*"],["sqlite3_result_double",void 0,"sqlite3_context*","f64"],["sqlite3_result_error",void 0,"sqlite3_context*","string","int"],["sqlite3_result_error_code",void 0,"sqlite3_context*","int"],["sqlite3_result_error_nomem",void 0,"sqlite3_context*"],["sqlite3_result_error_toobig",void 0,"sqlite3_context*"],["sqlite3_result_int",void 0,"sqlite3_context*","int"],["sqlite3_result_null",void 0,"sqlite3_context*"],["sqlite3_result_pointer",void 0,"sqlite3_context*","*","string:static","*"],["sqlite3_result_subtype",void 0,"sqlite3_value*","int"],["sqlite3_result_text",void 0,"sqlite3_context*","string","int","*"],["sqlite3_result_zeroblob",void 0,"sqlite3_context*","int"],["sqlite3_rollback_hook","void*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_rollback_hook",signature:"v(p)",contextKey:q=>q[0]}),"*"]],["sqlite3_set_auxdata",void 0,["sqlite3_context*","int","*","*"]],["sqlite3_shutdown",void 0],["sqlite3_sourceid","string"],["sqlite3_sql","string","sqlite3_stmt*"],["sqlite3_status","int","int","*","*","int"],["sqlite3_step","int","sqlite3_stmt*"],["sqlite3_stmt_busy","int","sqlite3_stmt*"],["sqlite3_stmt_readonly","int","sqlite3_stmt*"],["sqlite3_stmt_status","int","sqlite3_stmt*","int","int"],["sqlite3_strglob","int","string","string"],["sqlite3_stricmp","int","string","string"],["sqlite3_strlike","int","string","string","int"],["sqlite3_strnicmp","int","string","string","int"],["sqlite3_table_column_metadata","int","sqlite3*","string","string","string","**","**","*","*","*"],["sqlite3_total_changes","int","sqlite3*"],["sqlite3_trace_v2","int",["sqlite3*","int",new s.xWrap.FuncPtrAdapter({name:"sqlite3_trace_v2::callback",signature:"i(ippp)",contextKey:(q,w)=>q[0]}),"*"]],["sqlite3_txn_state","int",["sqlite3*","string"]],["sqlite3_uri_boolean","int","sqlite3_filename","string","int"],["sqlite3_uri_key","string","sqlite3_filename","int"],["sqlite3_uri_parameter","string","sqlite3_filename","string"],["sqlite3_user_data","void*","sqlite3_context*"],["sqlite3_value_blob","*","sqlite3_value*"],["sqlite3_value_bytes","int","sqlite3_value*"],["sqlite3_value_double","f64","sqlite3_value*"],["sqlite3_value_dup","sqlite3_value*","sqlite3_value*"],["sqlite3_value_free",void 0,"sqlite3_value*"],["sqlite3_value_frombind","int","sqlite3_value*"],["sqlite3_value_int","int","sqlite3_value*"],["sqlite3_value_nochange","int","sqlite3_value*"],["sqlite3_value_numeric_type","int","sqlite3_value*"],["sqlite3_value_pointer","*","sqlite3_value*","string:static"],["sqlite3_value_subtype","int","sqlite3_value*"],["sqlite3_value_text","string","sqlite3_value*"],["sqlite3_value_type","int","sqlite3_value*"],["sqlite3_vfs_find","*","string"],["sqlite3_vfs_register","int","sqlite3_vfs*","int"],["sqlite3_vfs_unregister","int","sqlite3_vfs*"]],s.exports.sqlite3_progress_handler&&s.bindingSignatures.push(["sqlite3_progress_handler",void 0,["sqlite3*","int",new s.xWrap.FuncPtrAdapter({name:"xProgressHandler",signature:"i(p)",bindScope:"context",contextKey:(q,w)=>q[0]}),"*"]]),s.exports.sqlite3_stmt_explain&&s.bindingSignatures.push(["sqlite3_stmt_explain","int","sqlite3_stmt*","int"],["sqlite3_stmt_isexplain","int","sqlite3_stmt*"]),s.exports.sqlite3_set_authorizer&&s.bindingSignatures.push(["sqlite3_set_authorizer","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_set_authorizer::xAuth",signature:"i(pissss)",contextKey:(q,w)=>q[0],callProxy:q=>(w,x,N,P,S,L)=>{try{return N=N&&s.cstrToJs(N),P=P&&s.cstrToJs(P),S=S&&s.cstrToJs(S),L=L&&s.cstrToJs(L),q(w,x,N,P,S,L)||0}catch($){return $.resultCode||r.SQLITE_ERROR}}}),"*"]]),s.bindingSignatures.int64=[["sqlite3_bind_int64","int",["sqlite3_stmt*","int","i64"]],["sqlite3_changes64","i64",["sqlite3*"]],["sqlite3_column_int64","i64",["sqlite3_stmt*","int"]],["sqlite3_deserialize","int","sqlite3*","string","*","i64","i64","int"],["sqlite3_last_insert_rowid","i64",["sqlite3*"]],["sqlite3_malloc64","*","i64"],["sqlite3_msize","i64","*"],["sqlite3_overload_function","int",["sqlite3*","string","int"]],["sqlite3_realloc64","*","*","i64"],["sqlite3_result_int64",void 0,"*","i64"],["sqlite3_result_zeroblob64","int","*","i64"],["sqlite3_serialize","*","sqlite3*","string","*","int"],["sqlite3_set_last_insert_rowid",void 0,["sqlite3*","i64"]],["sqlite3_status64","int","int","*","*","int"],["sqlite3_total_changes64","i64",["sqlite3*"]],["sqlite3_update_hook","*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_update_hook",signature:"v(iippj)",contextKey:q=>q[0],callProxy:q=>(w,x,N,P,S)=>{q(w,x,s.cstrToJs(N),s.cstrToJs(P),S)}}),"*"]],["sqlite3_uri_int64","i64",["sqlite3_filename","string","i64"]],["sqlite3_value_int64","i64","sqlite3_value*"]],s.bigIntEnabled&&s.exports.sqlite3_declare_vtab&&s.bindingSignatures.int64.push(["sqlite3_create_module","int",["sqlite3*","string","sqlite3_module*","*"]],["sqlite3_create_module_v2","int",["sqlite3*","string","sqlite3_module*","*","*"]],["sqlite3_declare_vtab","int",["sqlite3*","string:flexible"]],["sqlite3_drop_modules","int",["sqlite3*","**"]],["sqlite3_vtab_collation","string","sqlite3_index_info*","int"],["sqlite3_vtab_distinct","int","sqlite3_index_info*"],["sqlite3_vtab_in","int","sqlite3_index_info*","int","int"],["sqlite3_vtab_in_first","int","sqlite3_value*","**"],["sqlite3_vtab_in_next","int","sqlite3_value*","**"],["sqlite3_vtab_nochange","int","sqlite3_context*"],["sqlite3_vtab_on_conflict","int","sqlite3*"],["sqlite3_vtab_rhs_value","int","sqlite3_index_info*","int","**"]),s.bigIntEnabled&&s.exports.sqlite3_preupdate_hook&&s.bindingSignatures.int64.push(["sqlite3_preupdate_blobwrite","int","sqlite3*"],["sqlite3_preupdate_count","int","sqlite3*"],["sqlite3_preupdate_depth","int","sqlite3*"],["sqlite3_preupdate_hook","*",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"sqlite3_preupdate_hook",signature:"v(ppippjj)",contextKey:q=>q[0],callProxy:q=>(w,x,N,P,S,L,$)=>{q(w,x,N,s.cstrToJs(P),s.cstrToJs(S),L,$)}}),"*"]],["sqlite3_preupdate_new","int",["sqlite3*","int","**"]],["sqlite3_preupdate_old","int",["sqlite3*","int","**"]]),s.bigIntEnabled&&s.exports.sqlite3changegroup_add&&s.exports.sqlite3session_create&&s.exports.sqlite3_preupdate_hook){const q={signature:"i(ps)",callProxy:w=>(x,N)=>{try{return w(x,s.cstrToJs(N))|0}catch(P){return P.resultCode||r.SQLITE_ERROR}}};s.bindingSignatures.int64.push(["sqlite3changegroup_add","int",["sqlite3_changegroup*","int","void*"]],["sqlite3changegroup_add_strm","int",["sqlite3_changegroup*",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3changegroup_delete",void 0,["sqlite3_changegroup*"]],["sqlite3changegroup_new","int",["**"]],["sqlite3changegroup_output","int",["sqlite3_changegroup*","int*","**"]],["sqlite3changegroup_output_strm","int",["sqlite3_changegroup*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppi)",bindScope:"transient"}),"void*"]],["sqlite3changeset_apply","int",["sqlite3*","int","void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*"]],["sqlite3changeset_apply_strm","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*"]],["sqlite3changeset_apply_v2","int",["sqlite3*","int","void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*","**","int*","int"]],["sqlite3changeset_apply_v2_strm","int",["sqlite3*",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xFilter",bindScope:"transient",...q}),new s.xWrap.FuncPtrAdapter({name:"xConflict",signature:"i(pip)",bindScope:"transient"}),"void*","**","int*","int"]],["sqlite3changeset_concat","int",["int","void*","int","void*","int*","**"]],["sqlite3changeset_concat_strm","int",[new s.xWrap.FuncPtrAdapter({name:"xInputA",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xInputB",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppi)",bindScope:"transient"}),"void*"]],["sqlite3changeset_conflict","int",["sqlite3_changeset_iter*","int","**"]],["sqlite3changeset_finalize","int",["sqlite3_changeset_iter*"]],["sqlite3changeset_fk_conflicts","int",["sqlite3_changeset_iter*","int*"]],["sqlite3changeset_invert","int",["int","void*","int*","**"]],["sqlite3changeset_invert_strm","int",[new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppi)",bindScope:"transient"}),"void*"]],["sqlite3changeset_new","int",["sqlite3_changeset_iter*","int","**"]],["sqlite3changeset_next","int",["sqlite3_changeset_iter*"]],["sqlite3changeset_old","int",["sqlite3_changeset_iter*","int","**"]],["sqlite3changeset_op","int",["sqlite3_changeset_iter*","**","int*","int*","int*"]],["sqlite3changeset_pk","int",["sqlite3_changeset_iter*","**","int*"]],["sqlite3changeset_start","int",["**","int","*"]],["sqlite3changeset_start_strm","int",["**",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3changeset_start_v2","int",["**","int","*","int"]],["sqlite3changeset_start_v2_strm","int",["**",new s.xWrap.FuncPtrAdapter({name:"xInput",signature:"i(ppp)",bindScope:"transient"}),"void*","int"]],["sqlite3session_attach","int",["sqlite3_session*","string"]],["sqlite3session_changeset","int",["sqlite3_session*","int*","**"]],["sqlite3session_changeset_size","i64",["sqlite3_session*"]],["sqlite3session_changeset_strm","int",["sqlite3_session*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3session_config","int",["int","void*"]],["sqlite3session_create","int",["sqlite3*","string","**"]],["sqlite3session_diff","int",["sqlite3_session*","string","string","**"]],["sqlite3session_enable","int",["sqlite3_session*","int"]],["sqlite3session_indirect","int",["sqlite3_session*","int"]],["sqlite3session_isempty","int",["sqlite3_session*"]],["sqlite3session_memory_used","i64",["sqlite3_session*"]],["sqlite3session_object_config","int",["sqlite3_session*","int","void*"]],["sqlite3session_patchset","int",["sqlite3_session*","*","**"]],["sqlite3session_patchset_strm","int",["sqlite3_session*",new s.xWrap.FuncPtrAdapter({name:"xOutput",signature:"i(ppp)",bindScope:"transient"}),"void*"]],["sqlite3session_table_filter",void 0,["sqlite3_session*",new s.xWrap.FuncPtrAdapter({name:"xFilter",...q,contextKey:(w,x)=>w[0]}),"*"]])}s.bindingSignatures.wasmInternal=[["sqlite3__wasm_db_reset","int","sqlite3*"],["sqlite3__wasm_db_vfs","sqlite3_vfs*","sqlite3*","string"],["sqlite3__wasm_vfs_create_file","int","sqlite3_vfs*","string","*","int"],["sqlite3__wasm_posix_create_file","int","string","*","int"],["sqlite3__wasm_vfs_unlink","int","sqlite3_vfs*","string"],["sqlite3__wasm_qfmt_token","string:dealloc","string","int"]],t.StructBinder=globalThis.Jaccwabyt({heap:s.heap8u,alloc:s.alloc,dealloc:s.dealloc,bigIntEnabled:s.bigIntEnabled,memberPrefix:"$"}),delete globalThis.Jaccwabyt;{const q=s.xWrap.argAdapter("string");s.xWrap.argAdapter("string:flexible",S=>q(o.flexibleString(S))),s.xWrap.argAdapter("string:static",(function(S){return s.isPtr(S)?S:(S=""+S,this[S]||(this[S]=s.allocCString(S)))}).bind(Object.create(null)));const w=s.xWrap.argAdapter("*"),x=function(){};s.xWrap.argAdapter("sqlite3_filename",w)("sqlite3_context*",w)("sqlite3_value*",w)("void*",w)("sqlite3_changegroup*",w)("sqlite3_changeset_iter*",w)("sqlite3_session*",w)("sqlite3_stmt*",S=>w(S instanceof(t?.oo1?.Stmt||x)?S.pointer:S))("sqlite3*",S=>w(S instanceof(t?.oo1?.DB||x)?S.pointer:S))("sqlite3_vfs*",S=>typeof S=="string"?r.sqlite3_vfs_find(S)||t.SQLite3Error.toss(r.SQLITE_NOTFOUND,"Unknown sqlite3_vfs name:",S):w(S instanceof(r.sqlite3_vfs||x)?S.pointer:S)),s.exports.sqlite3_declare_vtab&&s.xWrap.argAdapter("sqlite3_index_info*",S=>w(S instanceof(r.sqlite3_index_info||x)?S.pointer:S))("sqlite3_module*",S=>w(S instanceof(r.sqlite3_module||x)?S.pointer:S));const N=s.xWrap.resultAdapter("*");s.xWrap.resultAdapter("sqlite3*",N)("sqlite3_context*",N)("sqlite3_stmt*",N)("sqlite3_value*",N)("sqlite3_vfs*",N)("void*",N),s.exports.sqlite3_step.length===0&&(s.xWrap.doArgcCheck=!1,t.config.warn("Disabling sqlite3.wasm.xWrap.doArgcCheck due to environmental quirks."));for(const S of s.bindingSignatures)r[S[0]]=s.xWrap.apply(null,S);for(const S of s.bindingSignatures.wasmInternal)o[S[0]]=s.xWrap.apply(null,S);const P=function(S){return()=>n(S+"() is unavailable due to lack","of BigInt support in this build.")};for(const S of s.bindingSignatures.int64)r[S[0]]=s.bigIntEnabled?s.xWrap.apply(null,S):P(S[0]);if(delete s.bindingSignatures,s.exports.sqlite3__wasm_db_error){const S=s.xWrap("sqlite3__wasm_db_error","int","sqlite3*","int","string");o.sqlite3__wasm_db_error=function(L,$,c){return $ instanceof t.WasmAllocError?($=r.SQLITE_NOMEM,c=0):$ instanceof Error&&(c=c||""+$,$=$.resultCode||r.SQLITE_ERROR),L?S(L,$,c):$}}else o.sqlite3__wasm_db_error=function(S,L,$){return console.warn("sqlite3__wasm_db_error() is not exported.",arguments),L}}{const q=s.xCall("sqlite3__wasm_enum_json");q||n("Maintenance required: increase sqlite3__wasm_enum_json()'s","static buffer size!"),s.ctype=JSON.parse(s.cstrToJs(q));const w=["access","authorizer","blobFinalizers","changeset","config","dataTypes","dbConfig","dbStatus","encodings","fcntl","flock","ioCap","limits","openFlags","prepareFlags","resultCodes","sqlite3Status","stmtStatus","syncFlags","trace","txnState","udfFlags","version"];s.bigIntEnabled&&w.push("serialize","session","vtab");for(const P of w)for(const S of Object.entries(s.ctype[P]))r[S[0]]=S[1];s.functionEntry(r.SQLITE_WASM_DEALLOC)||n("Internal error: cannot resolve exported function","entry SQLITE_WASM_DEALLOC (=="+r.SQLITE_WASM_DEALLOC+").");const x=Object.create(null);for(const P of["resultCodes"])for(const S of Object.entries(s.ctype[P]))x[S[1]]=S[0];r.sqlite3_js_rc_str=P=>x[P];const N=Object.assign(Object.create(null),{WasmTestStruct:!0,sqlite3_kvvfs_methods:!o.isUIThread(),sqlite3_index_info:!s.bigIntEnabled,sqlite3_index_constraint:!s.bigIntEnabled,sqlite3_index_orderby:!s.bigIntEnabled,sqlite3_index_constraint_usage:!s.bigIntEnabled});for(const P of s.ctype.structs)N[P.name]||(r[P.name]=t.StructBinder(P));if(r.sqlite3_index_info){for(const P of["sqlite3_index_constraint","sqlite3_index_orderby","sqlite3_index_constraint_usage"])r.sqlite3_index_info[P]=r[P],delete r[P];r.sqlite3_vtab_config=s.xWrap("sqlite3__wasm_vtab_config","int",["sqlite3*","int","int"])}}const p=(q,w,x)=>o.sqlite3__wasm_db_error(q,r.SQLITE_MISUSE,w+"() requires "+x+" argument"+(x===1?"":"s")+"."),g=q=>o.sqlite3__wasm_db_error(q,r.SQLITE_FORMAT,"SQLITE_UTF8 is the only supported encoding."),O=q=>s.xWrap.argAdapter("sqlite3*")(q),R=q=>s.isPtr(q)?s.cstrToJs(q):q,z=(function(q,w){q=O(q);let x=this.dbMap.get(q);if(w)!x&&w>0&&this.dbMap.set(q,x=Object.create(null));else return this.dbMap.delete(q),x;return x}).bind(Object.assign(Object.create(null),{dbMap:new Map}));z.addCollation=function(q,w){const x=z(q,1);x.collation||(x.collation=new Set),x.collation.add(R(w).toLowerCase())},z._addUDF=function(q,w,x,N){w=R(w).toLowerCase();let P=N.get(w);P||N.set(w,P=new Set),P.add(x<0?-1:x)},z.addFunction=function(q,w,x){const N=z(q,1);N.udf||(N.udf=new Map),this._addUDF(q,w,x,N.udf)},s.exports.sqlite3_create_window_function&&(z.addWindowFunc=function(q,w,x){const N=z(q,1);N.wudf||(N.wudf=new Map),this._addUDF(q,w,x,N.wudf)}),z.cleanup=function(q){q=O(q);const w=[q];for(const P of["sqlite3_busy_handler","sqlite3_commit_hook","sqlite3_preupdate_hook","sqlite3_progress_handler","sqlite3_rollback_hook","sqlite3_set_authorizer","sqlite3_trace_v2","sqlite3_update_hook"]){const S=s.exports[P];if(S){w.length=S.length;try{r[P](...w)}catch(L){t.config.warn("close-time call of",P+"(",w,") threw:",L)}}}const x=z(q,0);if(!x)return;if(x.collation){for(const P of x.collation)try{r.sqlite3_create_collation_v2(q,P,r.SQLITE_UTF8,0,0,0)}catch{}delete x.collation}let N;for(N=0;N<2;++N){const P=N?x.wudf:x.udf;if(!P)continue;const S=N?r.sqlite3_create_window_function:r.sqlite3_create_function_v2;for(const L of P){const $=L[0],c=L[1],d=[q,$,0,r.SQLITE_UTF8,0,0,0,0,0];N&&d.push(0);for(const y of c)try{d[2]=y,S.apply(null,d)}catch{}c.clear()}P.clear()}delete x.udf,delete x.wudf};{const q=s.xWrap("sqlite3_close_v2","int","sqlite3*");r.sqlite3_close_v2=function(w){if(arguments.length!==1)return p(w,"sqlite3_close_v2",1);if(w)try{z.cleanup(w)}catch{}return q(w)}}if(r.sqlite3session_create){const q=s.xWrap("sqlite3session_delete",void 0,["sqlite3_session*"]);r.sqlite3session_delete=function(w){if(arguments.length!==1)return p(pDb,"sqlite3session_delete",1);w&&r.sqlite3session_table_filter(w,0,0),q(w)}}{const q=(x,N)=>"argv["+N+"]:"+x[0]+":"+s.cstrToJs(x[1]).toLowerCase(),w=s.xWrap("sqlite3_create_collation_v2","int",["sqlite3*","string","int","*",new s.xWrap.FuncPtrAdapter({name:"xCompare",signature:"i(pipip)",contextKey:q}),new s.xWrap.FuncPtrAdapter({name:"xDestroy",signature:"v(p)",contextKey:q})]);r.sqlite3_create_collation_v2=function(x,N,P,S,L,$){if(arguments.length!==6)return p(x,"sqlite3_create_collation_v2",6);if((P&15)===0)P|=r.SQLITE_UTF8;else if(r.SQLITE_UTF8!==(P&15))return g(x);try{const c=w(x,N,P,S,L,$);return c===0&&L instanceof Function&&z.addCollation(x,N),c}catch(c){return o.sqlite3__wasm_db_error(x,c)}},r.sqlite3_create_collation=(x,N,P,S,L)=>arguments.length===5?r.sqlite3_create_collation_v2(x,N,P,S,L,0):p(x,"sqlite3_create_collation",5)}{const q=function(P,S){return P[0]+":"+(P[2]<0?-1:P[2])+":"+S+":"+s.cstrToJs(P[1]).toLowerCase()},w=Object.assign(Object.create(null),{xInverseAndStep:{signature:"v(pip)",contextKey:q,callProxy:P=>(S,L,$)=>{try{P(S,...r.sqlite3_values_to_js(L,$))}catch(c){r.sqlite3_result_error_js(S,c)}}},xFinalAndValue:{signature:"v(p)",contextKey:q,callProxy:P=>S=>{try{r.sqlite3_result_js(S,P(S))}catch(L){r.sqlite3_result_error_js(S,L)}}},xFunc:{signature:"v(pip)",contextKey:q,callProxy:P=>(S,L,$)=>{try{r.sqlite3_result_js(S,P(S,...r.sqlite3_values_to_js(L,$)))}catch(c){r.sqlite3_result_error_js(S,c)}}},xDestroy:{signature:"v(p)",contextKey:q,callProxy:P=>S=>{try{P(S)}catch(L){console.error("UDF xDestroy method threw:",L)}}}}),x=s.xWrap("sqlite3_create_function_v2","int",["sqlite3*","string","int","int","*",new s.xWrap.FuncPtrAdapter({name:"xFunc",...w.xFunc}),new s.xWrap.FuncPtrAdapter({name:"xStep",...w.xInverseAndStep}),new s.xWrap.FuncPtrAdapter({name:"xFinal",...w.xFinalAndValue}),new s.xWrap.FuncPtrAdapter({name:"xDestroy",...w.xDestroy})]),N=s.exports.sqlite3_create_window_function?s.xWrap("sqlite3_create_window_function","int",["sqlite3*","string","int","int","*",new s.xWrap.FuncPtrAdapter({name:"xStep",...w.xInverseAndStep}),new s.xWrap.FuncPtrAdapter({name:"xFinal",...w.xFinalAndValue}),new s.xWrap.FuncPtrAdapter({name:"xValue",...w.xFinalAndValue}),new s.xWrap.FuncPtrAdapter({name:"xInverse",...w.xInverseAndStep}),new s.xWrap.FuncPtrAdapter({name:"xDestroy",...w.xDestroy})]):void 0;r.sqlite3_create_function_v2=function P(S,L,$,c,d,y,B,f,m){if(P.length!==arguments.length)return p(S,"sqlite3_create_function_v2",P.length);if((c&15)===0)c|=r.SQLITE_UTF8;else if(r.SQLITE_UTF8!==(c&15))return g(S);try{const l=x(S,L,$,c,d,y,B,f,m);return l===0&&(y instanceof Function||B instanceof Function||f instanceof Function||m instanceof Function)&&z.addFunction(S,L,$),l}catch(l){return console.error("sqlite3_create_function_v2() setup threw:",l),o.sqlite3__wasm_db_error(S,l,"Creation of UDF threw: "+l)}},r.sqlite3_create_function=function P(S,L,$,c,d,y,B,f){return P.length===arguments.length?r.sqlite3_create_function_v2(S,L,$,c,d,y,B,f,0):p(S,"sqlite3_create_function",P.length)},N?r.sqlite3_create_window_function=function P(S,L,$,c,d,y,B,f,m,l){if(P.length!==arguments.length)return p(S,"sqlite3_create_window_function",P.length);if((c&15)===0)c|=r.SQLITE_UTF8;else if(r.SQLITE_UTF8!==(c&15))return g(S);try{const _=N(S,L,$,c,d,y,B,f,m,l);return _===0&&(y instanceof Function||B instanceof Function||f instanceof Function||m instanceof Function||l instanceof Function)&&z.addWindowFunc(S,L,$),_}catch(_){return console.error("sqlite3_create_window_function() setup threw:",_),o.sqlite3__wasm_db_error(S,_,"Creation of UDF threw: "+_)}}:delete r.sqlite3_create_window_function,r.sqlite3_create_function_v2.udfSetResult=r.sqlite3_create_function.udfSetResult=r.sqlite3_result_js,r.sqlite3_create_window_function&&(r.sqlite3_create_window_function.udfSetResult=r.sqlite3_result_js),r.sqlite3_create_function_v2.udfConvertArgs=r.sqlite3_create_function.udfConvertArgs=r.sqlite3_values_to_js,r.sqlite3_create_window_function&&(r.sqlite3_create_window_function.udfConvertArgs=r.sqlite3_values_to_js),r.sqlite3_create_function_v2.udfSetError=r.sqlite3_create_function.udfSetError=r.sqlite3_result_error_js,r.sqlite3_create_window_function&&(r.sqlite3_create_window_function.udfSetError=r.sqlite3_result_error_js)}{const q=(x,N)=>(typeof x=="string"?N=-1:o.isSQLableTypedArray(x)?(N=x.byteLength,x=o.typedArrayToString(x instanceof ArrayBuffer?new Uint8Array(x):x)):Array.isArray(x)&&(x=x.join(""),N=-1),[x,N]),w={basic:s.xWrap("sqlite3_prepare_v3","int",["sqlite3*","string","int","int","**","**"]),full:s.xWrap("sqlite3_prepare_v3","int",["sqlite3*","*","int","int","**","**"])};r.sqlite3_prepare_v3=function x(N,P,S,L,$,c){if(x.length!==arguments.length)return p(N,"sqlite3_prepare_v3",x.length);const[d,y]=q(P,S);switch(typeof d){case"string":return w.basic(N,d,y,L,$,null);case"number":return w.full(N,d,y,L,$,c);default:return o.sqlite3__wasm_db_error(N,r.SQLITE_MISUSE,"Invalid SQL argument type for sqlite3_prepare_v2/v3().")}},r.sqlite3_prepare_v2=function x(N,P,S,L,$){return x.length===arguments.length?r.sqlite3_prepare_v3(N,P,S,0,L,$):p(N,"sqlite3_prepare_v2",x.length)}}{const q=s.xWrap("sqlite3_bind_text","int",["sqlite3_stmt*","int","string","int","*"]),w=s.xWrap("sqlite3_bind_blob","int",["sqlite3_stmt*","int","*","int","*"]);r.sqlite3_bind_text=function x(N,P,S,L,$){if(x.length!==arguments.length)return p(r.sqlite3_db_handle(N),"sqlite3_bind_text",x.length);if(s.isPtr(S)||S===null)return q(N,P,S,L,$);S instanceof ArrayBuffer?S=new Uint8Array(S):Array.isArray(pMem)&&(S=pMem.join(""));let c,d;try{if(o.isSQLableTypedArray(S))c=s.allocFromTypedArray(S),d=S.byteLength;else if(typeof S=="string")[c,d]=s.allocCString(S);else return o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),r.SQLITE_MISUSE,"Invalid 3rd argument type for sqlite3_bind_text().");return q(N,P,c,d,r.SQLITE_WASM_DEALLOC)}catch(y){return s.dealloc(c),o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),y)}},r.sqlite3_bind_blob=function x(N,P,S,L,$){if(x.length!==arguments.length)return p(r.sqlite3_db_handle(N),"sqlite3_bind_blob",x.length);if(s.isPtr(S)||S===null)return w(N,P,S,L,$);S instanceof ArrayBuffer?S=new Uint8Array(S):Array.isArray(S)&&(S=S.join(""));let c,d;try{if(o.isBindableTypedArray(S))c=s.allocFromTypedArray(S),d=L>=0?L:S.byteLength;else if(typeof S=="string")[c,d]=s.allocCString(S);else return o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),r.SQLITE_MISUSE,"Invalid 3rd argument type for sqlite3_bind_blob().");return w(N,P,c,d,r.SQLITE_WASM_DEALLOC)}catch(y){return s.dealloc(c),o.sqlite3__wasm_db_error(r.sqlite3_db_handle(N),y)}}}r.sqlite3_config=function(q,...w){if(arguments.length<2)return r.SQLITE_MISUSE;switch(q){case r.SQLITE_CONFIG_COVERING_INDEX_SCAN:case r.SQLITE_CONFIG_MEMSTATUS:case r.SQLITE_CONFIG_SMALL_MALLOC:case r.SQLITE_CONFIG_SORTERREF_SIZE:case r.SQLITE_CONFIG_STMTJRNL_SPILL:case r.SQLITE_CONFIG_URI:return s.exports.sqlite3__wasm_config_i(q,w[0]);case r.SQLITE_CONFIG_LOOKASIDE:return s.exports.sqlite3__wasm_config_ii(q,w[0],w[1]);case r.SQLITE_CONFIG_MEMDB_MAXSIZE:return s.exports.sqlite3__wasm_config_j(q,w[0]);case r.SQLITE_CONFIG_GETMALLOC:case r.SQLITE_CONFIG_GETMUTEX:case r.SQLITE_CONFIG_GETPCACHE2:case r.SQLITE_CONFIG_GETPCACHE:case r.SQLITE_CONFIG_HEAP:case r.SQLITE_CONFIG_LOG:case r.SQLITE_CONFIG_MALLOC:case r.SQLITE_CONFIG_MMAP_SIZE:case r.SQLITE_CONFIG_MULTITHREAD:case r.SQLITE_CONFIG_MUTEX:case r.SQLITE_CONFIG_PAGECACHE:case r.SQLITE_CONFIG_PCACHE2:case r.SQLITE_CONFIG_PCACHE:case r.SQLITE_CONFIG_PCACHE_HDRSZ:case r.SQLITE_CONFIG_PMASZ:case r.SQLITE_CONFIG_SERIALIZED:case r.SQLITE_CONFIG_SINGLETHREAD:case r.SQLITE_CONFIG_SQLLOG:case r.SQLITE_CONFIG_WIN32_HEAPSIZE:default:return r.SQLITE_NOTFOUND}};{const q=new Set;r.sqlite3_auto_extension=function(w){if(w instanceof Function)w=s.installFunction("i(ppp)",w);else if(arguments.length!==1||!s.isPtr(w))return r.SQLITE_MISUSE;const x=s.exports.sqlite3_auto_extension(w);return w!==arguments[0]&&(x===0?q.add(w):s.uninstallFunction(w)),x},r.sqlite3_cancel_auto_extension=function(w){return!w||arguments.length!==1||!s.isPtr(w)?0:s.exports.sqlite3_cancel_auto_extension(w)},r.sqlite3_reset_auto_extension=function(){s.exports.sqlite3_reset_auto_extension();for(const w of q)s.uninstallFunction(w);q.clear()}}const Q=r.sqlite3_vfs_find("kvvfs");if(Q)if(o.isUIThread()){const q=new r.sqlite3_kvvfs_methods(s.exports.sqlite3__wasm_kvvfs_methods());delete r.sqlite3_kvvfs_methods;const w=s.exports.sqlite3__wasm_kvvfsMakeKeyOnPstack,x=s.pstack,N=S=>s.peek(S)===115?sessionStorage:localStorage,P={xRead:(S,L,$,c)=>{const d=x.pointer,y=s.scopedAllocPush();try{const B=w(S,L);if(!B)return-3;const f=s.cstrToJs(B),m=N(S).getItem(f);if(!m)return-1;const l=m.length;if(c<=0)return l;if(c===1)return s.poke($,0),l;const _=s.scopedAllocCString(m);return c>l+1&&(c=l+1),s.heap8u().copyWithin($,_,_+c-1),s.poke($+c-1,0),c-1}catch(B){return console.error("kvstorageRead()",B),-2}finally{x.restore(d),s.scopedAllocPop(y)}},xWrite:(S,L,$)=>{const c=x.pointer;try{const d=w(S,L);if(!d)return 1;const y=s.cstrToJs(d);return N(S).setItem(y,s.cstrToJs($)),0}catch(d){return console.error("kvstorageWrite()",d),r.SQLITE_IOERR}finally{x.restore(c)}},xDelete:(S,L)=>{const $=x.pointer;try{const c=w(S,L);return c?(N(S).removeItem(s.cstrToJs(c)),0):1}catch(c){return console.error("kvstorageDelete()",c),r.SQLITE_IOERR}finally{x.restore($)}}};for(const S of Object.keys(P))q[q.memberKey(S)]=s.installFunction(q.memberSignature(S),P[S])}else r.sqlite3_vfs_unregister(Q);s.xWrap.FuncPtrAdapter.warnOnUse=!0;const T=t.StructBinder,A=function q(w,x,N,P=q.installMethodArgcCheck){if(w instanceof T.StructType?!(N instanceof Function)&&!s.isPtr(N)&&n("Usage error: expecting a Function or WASM pointer to one."):n("Usage error: target object is-not-a StructType."),arguments.length===1)return(c,d)=>q(w,c,d,P);q.argcProxy||(q.argcProxy=function(c,d,y,B){return function(...f){return y.length!==arguments.length&&n("Argument mismatch for",c.structInfo.name+"::"+d+": Native signature is:",B),y.apply(this,f)}},q.removeFuncList=function(){this.ondispose.__removeFuncList&&(this.ondispose.__removeFuncList.forEach((c,d)=>{if(typeof c=="number")try{s.uninstallFunction(c)}catch{}}),delete this.ondispose.__removeFuncList)});const S=w.memberSignature(x);S.length<2&&n("Member",x,"does not have a function pointer signature:",S);const L=w.memberKey(x),$=P&&!s.isPtr(N)?q.argcProxy(w,L,N,S):N;if(s.isPtr($))$&&!s.functionEntry($)&&n("Pointer",$,"is not a WASM function table entry."),w[L]=$;else{const c=s.installFunction($,w.memberSignature(x,!0));w[L]=c,(!w.ondispose||!w.ondispose.__removeFuncList)&&(w.addOnDispose("ondispose.__removeFuncList handler",q.removeFuncList),w.ondispose.__removeFuncList=[]),w.ondispose.__removeFuncList.push(L,c)}return(c,d)=>q(w,c,d,P)};A.installMethodArgcCheck=!1;const D=function(q,w,x=A.installMethodArgcCheck){const N=new Map;for(const P of Object.keys(w)){const S=w[P],L=N.get(S);if(L){const $=q.memberKey(P);q[$]=q[q.memberKey(L)]}else A(q,P,S,x),N.set(S,P)}return q};T.StructType.prototype.installMethod=function(w,x,N=A.installMethodArgcCheck){return arguments.length<3&&w&&typeof w=="object"?D(this,...arguments):A(this,...arguments)},T.StructType.prototype.installMethods=function(q,w=A.installMethodArgcCheck){return D(this,q,w)}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){t.version={libVersion:"3.50.4",libVersionNumber:3050004,sourceId:"2025-07-30 19:33:53 4d8adfb30e03f9cf27f800a2c1ba3c48fb4ca1b08b0f5ed59a4d5ecbf45e20a3",downloadVersion:3500400}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=(...f)=>{throw new t.SQLite3Error(...f)},r=t.capi,s=t.wasm,o=t.util,p=new WeakMap,g=new WeakMap,O=(f,m,l)=>{const _=Object.getOwnPropertyDescriptor(f,m);return _?_.value:l},R=function(f,m){return m&&(f instanceof A&&(f=f.pointer),n(m,"sqlite3 result code",m+":",f?r.sqlite3_errmsg(f):r.sqlite3_errstr(m))),arguments[0]},z=s.installFunction("i(ippp)",(function(f,m,l,_){r.SQLITE_TRACE_STMT===f&&console.log("SQL TRACE #"+ ++this.counter+" via sqlite3@"+m+":",s.cstrToJs(_))}).bind({counter:0})),Q=Object.create(null),T=function f(...m){if(!f._name2vfs){f._name2vfs=Object.create(null);const j=typeof importScripts=="function"?b=>n("The VFS for",b,"is only available in the main window thread."):!1;f._name2vfs[":localStorage:"]={vfs:"kvvfs",filename:j||(()=>"local")},f._name2vfs[":sessionStorage:"]={vfs:"kvvfs",filename:j||(()=>"session")}}const l=f.normalizeArgs(...m);let _=l.filename,u=l.vfs,I=l.flags;(typeof _!="string"&&typeof _!="number"||typeof I!="string"||u&&typeof u!="string"&&typeof u!="number")&&(t.config.error("Invalid DB ctor args",l,arguments),n("Invalid arguments for DB constructor."));let U=typeof _=="number"?s.cstrToJs(_):_;const ee=f._name2vfs[U];ee&&(u=ee.vfs,_=U=ee.filename(U));let ne,se=0;I.indexOf("c")>=0&&(se|=r.SQLITE_OPEN_CREATE|r.SQLITE_OPEN_READWRITE),I.indexOf("w")>=0&&(se|=r.SQLITE_OPEN_READWRITE),se===0&&(se|=r.SQLITE_OPEN_READONLY),se|=r.SQLITE_OPEN_EXRESCODE;const ie=s.pstack.pointer;try{const j=s.pstack.allocPtr();let b=r.sqlite3_open_v2(_,j,se,u||0);ne=s.peekPtr(j),R(ne,b),r.sqlite3_extended_result_codes(ne,1),I.indexOf("t")>=0&&r.sqlite3_trace_v2(ne,r.SQLITE_TRACE_STMT,z,ne)}catch(j){throw ne&&r.sqlite3_close_v2(ne),j}finally{s.pstack.restore(ie)}this.filename=U,p.set(this,ne),g.set(this,Object.create(null));try{const j=r.sqlite3_js_db_vfs(ne)||n("Internal error: cannot get VFS for new db handle."),b=Q[j];b&&(b instanceof Function?b(this,t):R(ne,r.sqlite3_exec(ne,b,0,0,0)))}catch(j){throw this.close(),j}};T.setVfsPostOpenCallback=function(f,m){m instanceof Function||n("dbCtorHelper.setVfsPostOpenCallback() should not be used with a non-function argument.",arguments),Q[f]=m},T.normalizeArgs=function(f=":memory:",m="c",l=null){const _={};return arguments.length===1&&arguments[0]&&typeof arguments[0]=="object"?(Object.assign(_,arguments[0]),_.flags===void 0&&(_.flags="c"),_.vfs===void 0&&(_.vfs=null),_.filename===void 0&&(_.filename=":memory:")):(_.filename=f,_.flags=m,_.vfs=l),_};const A=function(...f){T.apply(this,f)};A.dbCtorHelper=T;const D={null:1,number:2,string:3,boolean:4,blob:5};D.undefined==D.null,s.bigIntEnabled&&(D.bigint=D.number);const q=function(){D!==arguments[2]&&n(r.SQLITE_MISUSE,"Do not call the Stmt constructor directly. Use DB.prepare()."),this.db=arguments[0],p.set(this,arguments[1]),this.parameterCount=r.sqlite3_bind_parameter_count(this.pointer)},w=function(f){return f.pointer||n("DB has been closed."),f},x=function(f,m){return(m!==(m|0)||m<0||m>=f.columnCount)&&n("Column index",m,"is out of range."),f},N=function(f,m){const l=Object.create(null);switch(l.opt=Object.create(null),m.length){case 1:typeof m[0]=="string"||o.isSQLableTypedArray(m[0])||Array.isArray(m[0])?l.sql=m[0]:m[0]&&typeof m[0]=="object"&&(l.opt=m[0],l.sql=l.opt.sql);break;case 2:l.sql=m[0],l.opt=m[1];break;default:n("Invalid argument count for exec().")}l.sql=o.flexibleString(l.sql),typeof l.sql!="string"&&n("Missing SQL argument or unsupported SQL value type.");const _=l.opt;switch(_.returnValue){case"resultRows":_.resultRows||(_.resultRows=[]),l.returnVal=()=>_.resultRows;break;case"saveSql":_.saveSql||(_.saveSql=[]),l.returnVal=()=>_.saveSql;break;case void 0:case"this":l.returnVal=()=>f;break;default:n("Invalid returnValue value:",_.returnValue)}if(!_.callback&&!_.returnValue&&_.rowMode!==void 0&&(_.resultRows||(_.resultRows=[]),l.returnVal=()=>_.resultRows),_.callback||_.resultRows)switch(_.rowMode===void 0?"array":_.rowMode){case"object":l.cbArg=(u,I)=>{I.columnNames||(I.columnNames=u.getColumnNames([]));const U=u.get([]),ee=Object.create(null);for(const ne in I.columnNames)ee[I.columnNames[ne]]=U[ne];return ee};break;case"array":l.cbArg=u=>u.get([]);break;case"stmt":Array.isArray(_.resultRows)&&n("exec(): invalid rowMode for a resultRows array: must","be one of 'array', 'object',","a result column number, or column name reference."),l.cbArg=u=>u;break;default:if(o.isInt32(_.rowMode)){l.cbArg=u=>u.get(_.rowMode);break}else if(typeof _.rowMode=="string"&&_.rowMode.length>1&&_.rowMode[0]==="$"){const u=_.rowMode.substr(1);l.cbArg=I=>{const U=I.get(Object.create(null))[u];return U===void 0?n(r.SQLITE_NOTFOUND,"exec(): unknown result column:",u):U};break}n("Invalid rowMode:",_.rowMode)}return l},P=(f,m,l,..._)=>{const u=f.prepare(m);try{const I=u.bind(l).step()?u.get(..._):void 0;return u.reset(),I}finally{u.finalize()}},S=(f,m,l,_)=>f.exec({sql:m,bind:l,rowMode:_,returnValue:"resultRows"});A.checkRc=(f,m)=>R(f,m),A.prototype={isOpen:function(){return!!this.pointer},affirmOpen:function(){return w(this)},close:function(){if(this.pointer){if(this.onclose&&this.onclose.before instanceof Function)try{this.onclose.before(this)}catch{}const f=this.pointer;if(Object.keys(g.get(this)).forEach((m,l)=>{if(l&&l.pointer)try{l.finalize()}catch{}}),p.delete(this),g.delete(this),r.sqlite3_close_v2(f),this.onclose&&this.onclose.after instanceof Function)try{this.onclose.after(this)}catch{}delete this.filename}},changes:function(f=!1,m=!1){const l=w(this).pointer;return f?m?r.sqlite3_total_changes64(l):r.sqlite3_total_changes(l):m?r.sqlite3_changes64(l):r.sqlite3_changes(l)},dbFilename:function(f="main"){return r.sqlite3_db_filename(w(this).pointer,f)},dbName:function(f=0){return r.sqlite3_db_name(w(this).pointer,f)},dbVfsName:function(f=0){let m;const l=r.sqlite3_js_db_vfs(w(this).pointer,f);if(l){const _=new r.sqlite3_vfs(l);try{m=s.cstrToJs(_.$zName)}finally{_.dispose()}}return m},prepare:function(f){w(this);const m=s.pstack.pointer;let l,_;try{l=s.pstack.alloc(8),A.checkRc(this,r.sqlite3_prepare_v2(this.pointer,f,-1,l,null)),_=s.peekPtr(l)}finally{s.pstack.restore(m)}_||n("Cannot prepare empty SQL.");const u=new q(this,_,D);return g.get(this)[_]=u,u},exec:function(){w(this);const f=N(this,arguments);if(!f.sql)return n("exec() requires an SQL string.");const m=f.opt,l=m.callback,_=Array.isArray(m.resultRows)?m.resultRows:void 0;let u,I=m.bind,U=!!(f.cbArg||m.columnNames||_);const ee=s.scopedAllocPush(),ne=Array.isArray(m.saveSql)?m.saveSql:void 0;try{const se=o.isSQLableTypedArray(f.sql);let ie=se?f.sql.byteLength:s.jstrlen(f.sql);const j=s.scopedAlloc(2*s.ptrSizeof+(ie+1)),b=j+s.ptrSizeof;let k=b+s.ptrSizeof;const W=k+ie;for(se?s.heap8().set(f.sql,k):s.jstrcpy(f.sql,s.heap8(),k,ie,!1),s.poke(k+ie,0);k&&s.peek(k,"i8");){s.pokePtr([j,b],0),A.checkRc(this,r.sqlite3_prepare_v3(this.pointer,k,ie,0,j,b));const H=s.peekPtr(j);if(k=s.peekPtr(b),ie=W-k,!!H){if(ne&&ne.push(r.sqlite3_sql(H).trim()),u=new q(this,H,D),I&&u.parameterCount&&(u.bind(I),I=null),U&&u.columnCount){let Z=Array.isArray(m.columnNames)?0:1;if(U=!1,f.cbArg||_){const E=Object.create(null);for(;u.step();u._lockedByExec=!1){Z++===0&&u.getColumnNames(E.columnNames=m.columnNames||[]),u._lockedByExec=!0;const C=f.cbArg(u,E);if(_&&_.push(C),l&&l.call(m,C,u)===!1)break}u._lockedByExec=!1}Z===0&&u.getColumnNames(m.columnNames)}else u.step();u.reset().finalize(),u=null}}}finally{s.scopedAllocPop(ee),u&&(delete u._lockedByExec,u.finalize())}return f.returnVal()},createFunction:function(m,l,_){const u=E=>E instanceof Function;switch(arguments.length){case 1:_=m,m=_.name,l=_.xFunc||0;break;case 2:u(l)||(_=l,l=_.xFunc||0);break}_||(_={}),typeof m!="string"&&n("Invalid arguments: missing function name.");let I=_.xStep||0,U=_.xFinal||0;const ee=_.xValue||0,ne=_.xInverse||0;let se;u(l)?(se=!1,(u(I)||u(U))&&n("Ambiguous arguments: scalar or aggregate?"),I=U=null):u(I)?(u(U)||n("Missing xFinal() callback for aggregate or window UDF."),l=null):u(U)?n("Missing xStep() callback for aggregate or window UDF."):n("Missing function-type properties."),se===!1?(u(ee)||u(ne))&&n("xValue and xInverse are not permitted for non-window UDFs."):u(ee)?(u(ne)||n("xInverse must be provided if xValue is."),se=!0):u(ne)&&n("xValue must be provided if xInverse is.");const ie=_.pApp;ie!=null&&(typeof ie!="number"||!o.isInt32(ie))&&n("Invalid value for pApp property. Must be a legal WASM pointer value.");const j=_.xDestroy||0;j&&!u(j)&&n("xDestroy property must be a function.");let b=0;O(_,"deterministic")&&(b|=r.SQLITE_DETERMINISTIC),O(_,"directOnly")&&(b|=r.SQLITE_DIRECTONLY),O(_,"innocuous")&&(b|=r.SQLITE_INNOCUOUS),m=m.toLowerCase();const k=l||I,W=O(_,"arity"),H=typeof W=="number"?W:k.length?k.length-1:0;let Z;return se?Z=r.sqlite3_create_window_function(this.pointer,m,H,r.SQLITE_UTF8|b,ie||0,I,U,ee,ne,j):Z=r.sqlite3_create_function_v2(this.pointer,m,H,r.SQLITE_UTF8|b,ie||0,l,I,U,j),A.checkRc(this,Z),this},selectValue:function(f,m,l){return P(this,f,m,0,l)},selectValues:function(f,m,l){const _=this.prepare(f),u=[];try{for(_.bind(m);_.step();)u.push(_.get(0,l));_.reset()}finally{_.finalize()}return u},selectArray:function(f,m){return P(this,f,m,[])},selectObject:function(f,m){return P(this,f,m,{})},selectArrays:function(f,m){return S(this,f,m,"array")},selectObjects:function(f,m){return S(this,f,m,"object")},openStatementCount:function(){return this.pointer?Object.keys(g.get(this)).length:0},transaction:function(f){let m="BEGIN";arguments.length>1&&(/[^a-zA-Z]/.test(arguments[0])&&n(r.SQLITE_MISUSE,"Invalid argument for BEGIN qualifier."),m+=" "+arguments[0],f=arguments[1]),w(this).exec(m);try{const l=f(this);return this.exec("COMMIT"),l}catch(l){throw this.exec("ROLLBACK"),l}},savepoint:function(f){w(this).exec("SAVEPOINT oo1");try{const m=f(this);return this.exec("RELEASE oo1"),m}catch(m){throw this.exec("ROLLBACK to SAVEPOINT oo1; RELEASE SAVEPOINT oo1"),m}},checkRc:function(f){return R(this,f)}};const L=function(f){return f.pointer||n("Stmt has been closed."),f},$=function(f){let m=D[f==null?"null":typeof f];switch(m){case D.boolean:case D.null:case D.number:case D.string:return m;case D.bigint:if(s.bigIntEnabled)return m;default:return o.isBindableTypedArray(f)?D.blob:void 0}},c=function(f){return $(f)||n("Unsupported bind() argument type:",typeof f)},d=function(f,m){const l=typeof m=="number"?m:r.sqlite3_bind_parameter_index(f.pointer,m);return l===0||!o.isInt32(l)?n("Invalid bind() parameter name: "+m):(l<1||l>f.parameterCount)&&n("Bind index",m,"is out of range."),l},y=function(f,m){return f._lockedByExec&&n("Operation is illegal when statement is locked:",m),f},B=function f(m,l,_,u){y(L(m),"bind()"),f._||(f._tooBigInt=U=>n("BigInt value is too big to store without precision loss:",U),f._={string:function(U,ee,ne,se){const[ie,j]=s.allocCString(ne,!0);return(se?r.sqlite3_bind_blob:r.sqlite3_bind_text)(U.pointer,ee,ie,j,r.SQLITE_WASM_DEALLOC)}}),c(u),l=d(m,l);let I=0;switch(u==null?D.null:_){case D.null:I=r.sqlite3_bind_null(m.pointer,l);break;case D.string:I=f._.string(m,l,u,!1);break;case D.number:{let U;o.isInt32(u)?U=r.sqlite3_bind_int:typeof u=="bigint"?o.bigIntFits64(u)?s.bigIntEnabled?U=r.sqlite3_bind_int64:o.bigIntFitsDouble(u)?(u=Number(u),U=r.sqlite3_bind_double):f._tooBigInt(u):f._tooBigInt(u):(u=Number(u),s.bigIntEnabled&&Number.isInteger(u)?U=r.sqlite3_bind_int64:U=r.sqlite3_bind_double),I=U(m.pointer,l,u);break}case D.boolean:I=r.sqlite3_bind_int(m.pointer,l,u?1:0);break;case D.blob:{if(typeof u=="string"){I=f._.string(m,l,u,!0);break}else u instanceof ArrayBuffer?u=new Uint8Array(u):o.isBindableTypedArray(u)||n("Binding a value as a blob requires","that it be a string, Uint8Array, Int8Array, or ArrayBuffer.");const U=s.alloc(u.byteLength||1);s.heap8().set(u.byteLength?u:[0],U),I=r.sqlite3_bind_blob(m.pointer,l,U,u.byteLength,r.SQLITE_WASM_DEALLOC);break}default:t.config.warn("Unsupported bind() argument type:",u),n("Unsupported bind() argument type: "+typeof u)}return I&&A.checkRc(m.db.pointer,I),m._mayGet=!1,m};q.prototype={finalize:function(){if(this.pointer){y(this,"finalize()");const f=r.sqlite3_finalize(this.pointer);return delete g.get(this.db)[this.pointer],p.delete(this),delete this._mayGet,delete this.parameterCount,delete this._lockedByExec,delete this.db,f}},clearBindings:function(){return y(L(this),"clearBindings()"),r.sqlite3_clear_bindings(this.pointer),this._mayGet=!1,this},reset:function(f){y(this,"reset()"),f&&this.clearBindings();const m=r.sqlite3_reset(L(this).pointer);return this._mayGet=!1,R(this.db,m),this},bind:function(){L(this);let f,m;switch(arguments.length){case 1:f=1,m=arguments[0];break;case 2:f=arguments[0],m=arguments[1];break;default:n("Invalid bind() arguments.")}return m===void 0?this:(this.parameterCount||n("This statement has no bindable parameters."),this._mayGet=!1,m===null?B(this,f,D.null,m):Array.isArray(m)?(arguments.length!==1&&n("When binding an array, an index argument is not permitted."),m.forEach((l,_)=>B(this,_+1,c(l),l)),this):(m instanceof ArrayBuffer&&(m=new Uint8Array(m)),typeof m=="object"&&!o.isBindableTypedArray(m)?(arguments.length!==1&&n("When binding an object, an index argument is not permitted."),Object.keys(m).forEach(l=>B(this,l,c(m[l]),m[l])),this):B(this,f,c(m),m)))},bindAsBlob:function(f,m){L(this),arguments.length===1&&(m=f,f=1);const l=c(m);return D.string!==l&&D.blob!==l&&D.null!==l&&n("Invalid value type for bindAsBlob()"),B(this,f,D.blob,m)},step:function(){y(this,"step()");const f=r.sqlite3_step(L(this).pointer);switch(f){case r.SQLITE_DONE:return this._mayGet=!1;case r.SQLITE_ROW:return this._mayGet=!0;default:this._mayGet=!1,t.config.warn("sqlite3_step() rc=",f,r.sqlite3_js_rc_str(f),"SQL =",r.sqlite3_sql(this.pointer)),A.checkRc(this.db.pointer,f)}},stepReset:function(){return this.step(),this.reset()},stepFinalize:function(){try{const f=this.step();return this.reset(),f}finally{try{this.finalize()}catch{}}},get:function(f,m){if(L(this)._mayGet||n("Stmt.step() has not (recently) returned true."),Array.isArray(f)){let l=0;const _=this.columnCount;for(;l<_;)f[l]=this.get(l++);return f}else if(f&&typeof f=="object"){let l=0;const _=this.columnCount;for(;l<_;)f[r.sqlite3_column_name(this.pointer,l)]=this.get(l++);return f}switch(x(this,f),m===void 0?r.sqlite3_column_type(this.pointer,f):m){case r.SQLITE_NULL:return null;case r.SQLITE_INTEGER:if(s.bigIntEnabled){const l=r.sqlite3_column_int64(this.pointer,f);return l>=Number.MIN_SAFE_INTEGER&&l<=Number.MAX_SAFE_INTEGER?Number(l).valueOf():l}else{const l=r.sqlite3_column_double(this.pointer,f);return(l>Number.MAX_SAFE_INTEGER||ln("The pointer property is read-only.")};Object.defineProperty(q.prototype,"pointer",f),Object.defineProperty(A.prototype,"pointer",f)}if(Object.defineProperty(q.prototype,"columnCount",{enumerable:!1,get:function(){return r.sqlite3_column_count(this.pointer)},set:()=>n("The columnCount property is read-only.")}),t.oo1={DB:A,Stmt:q},o.isUIThread()){t.oo1.JsStorageDb=function(m="session"){const l=T.normalizeArgs(...arguments);m=l.filename,m!=="session"&&m!=="local"&&n("JsStorageDb db name must be one of 'session' or 'local'."),l.vfs="kvvfs",T.call(this,l)};const f=t.oo1.JsStorageDb;f.prototype=Object.create(A.prototype),f.clearStorage=r.sqlite3_js_kvvfs_clear,f.prototype.clearStorage=function(){return f.clearStorage(w(this).filename)},f.storageSize=r.sqlite3_js_kvvfs_size,f.prototype.storageSize=function(){return f.storageSize(w(this).filename)}}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.util;t.initWorker1API=(function(){const r=(...T)=>{throw new Error(T.join(" "))};globalThis.WorkerGlobalScope instanceof Function||r("initWorker1API() must be run from a Worker thread.");const s=this.sqlite3||r("Missing this.sqlite3 object."),o=s.oo1.DB,p=function(T){let A=g.idMap.get(T);return A||(A="db#"+ ++g.idSeq+"@"+T.pointer,g.idMap.set(T,A),A)},g={dbList:[],idSeq:0,idMap:new WeakMap,xfer:[],open:function(T){const A=new o(T);return this.dbs[p(A)]=A,this.dbList.indexOf(A)<0&&this.dbList.push(A),A},close:function(T,A){if(T){delete this.dbs[p(T)];const D=T.filename,q=n.sqlite3__wasm_db_vfs(T.pointer,0);T.close();const w=this.dbList.indexOf(T);w>=0&&this.dbList.splice(w,1),A&&D&&q&&n.sqlite3__wasm_vfs_unlink(q,D)}},post:function(T,A){A&&A.length?(globalThis.postMessage(T,Array.from(A)),A.length=0):globalThis.postMessage(T)},dbs:Object.create(null),getDb:function(T,A=!0){return this.dbs[T]||(A?r("Unknown (or closed) DB ID:",T):void 0)}},O=function(T=g.dbList[0]){return T&&T.pointer?T:r("DB is not opened.")},R=function(T,A=!0){const D=g.getDb(T.dbId,!1)||g.dbList[0];return A?O(D):D},z=function(){return g.dbList[0]&&p(g.dbList[0])},Q={open:function(T){const A=Object.create(null),D=T.args||Object.create(null);D.simulateError&&r("Throwing because of simulateError flag.");const q=Object.create(null);A.vfs=D.vfs,A.filename=D.filename||"";const w=g.open(A);return q.filename=w.filename,q.persistent=!!s.capi.sqlite3_js_db_uses_vfs(w.pointer,"opfs"),q.dbId=p(w),q.vfs=w.dbVfsName(),q},close:function(T){const A=R(T,!1),D={filename:A&&A.filename};if(A){const q=T.args&&typeof T.args=="object"?!!T.args.unlink:!1;g.close(A,q)}return D},exec:function(T){const A=typeof T.args=="string"?{sql:T.args}:T.args||Object.create(null);A.rowMode==="stmt"?r("Invalid rowMode for 'exec': stmt mode","does not work in the Worker API."):A.sql||r("'exec' requires input SQL.");const D=R(T);(A.callback||Array.isArray(A.resultRows))&&(D._blobXfer=g.xfer);const q=A.callback;let w=0;const x=!!A.columnNames;typeof q=="string"&&(x||(A.columnNames=[]),A.callback=function(N,P){g.post({type:q,columnNames:A.columnNames,rowNumber:++w,row:N},g.xfer)});try{const N=A.countChanges?D.changes(!0,A.countChanges===64):void 0;D.exec(A),N!==void 0&&(A.changeCount=D.changes(!0,A.countChanges===64)-N);const P=A.lastInsertRowId?s.capi.sqlite3_last_insert_rowid(D):void 0;P!==void 0&&(A.lastInsertRowId=P),A.callback instanceof Function&&(A.callback=q,g.post({type:q,columnNames:A.columnNames,rowNumber:null,row:void 0}))}finally{delete D._blobXfer,A.callback&&(A.callback=q)}return A},"config-get":function(){const T=Object.create(null),A=s.config;return["bigIntEnabled"].forEach(function(D){Object.getOwnPropertyDescriptor(A,D)&&(T[D]=A[D])}),T.version=s.version,T.vfsList=s.capi.sqlite3_js_vfs_list(),T},export:function(T){const A=R(T),D={byteArray:s.capi.sqlite3_js_db_export(A.pointer),filename:A.filename,mimetype:"application/x-sqlite3"};return g.xfer.push(D.byteArray.buffer),D},toss:function(T){r("Testing worker exception")}};globalThis.onmessage=async function(T){T=T.data;let A,D=T.dbId,q=T.type;const w=performance.now();try{Q.hasOwnProperty(q)&&Q[q]instanceof Function?A=await Q[q](T):r("Unknown db worker message type:",T.type)}catch(x){q="error",A={operation:T.type,message:x.message,errorClass:x.name,input:T},x.stack&&(A.stack=typeof x.stack=="string"?x.stack.split(/\n\s*/):x.stack)}D||(D=A.dbId||z()),g.post({type:q,dbId:D,messageId:T.messageId,workerReceivedTime:w,workerRespondTime:performance.now(),departureTime:T.departureTime,result:A},g.xfer)},globalThis.postMessage({type:"sqlite3-api",result:"worker1-ready"})}).bind({sqlite3:t})}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.wasm,r=t.capi,s=t.util.toss3,o=Object.create(null);t.vfs=o,r.sqlite3_vfs.prototype.registerVfs=function(p=!1){this instanceof t.capi.sqlite3_vfs||s("Expecting a sqlite3_vfs-type argument.");const g=r.sqlite3_vfs_register(this,p?1:0);return g&&s("sqlite3_vfs_register(",this,") failed with rc",g),this.pointer!==r.sqlite3_vfs_find(this.$zName)&&s("BUG: sqlite3_vfs_find(vfs.$zName) failed for just-installed VFS",this),this},o.installVfs=function(p){let g=0;const O=["io","vfs"];for(const R of O){const z=p[R];z&&(++g,z.struct.installMethods(z.methods,!!z.applyArgcCheck),R==="vfs"&&(!z.struct.$zName&&typeof z.name=="string"&&z.struct.addOnDispose(z.struct.$zName=n.allocCString(z.name)),z.struct.registerVfs(!!z.asDefault)))}return g||s("Misuse: installVfs() options object requires at least","one of:",O),this}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){if(!t.wasm.exports.sqlite3_declare_vtab)return;const n=t.wasm,r=t.capi,s=t.util.toss3,o=Object.create(null);t.vtab=o;const p=r.sqlite3_index_info;p.prototype.nthConstraint=function(R,z=!1){if(R<0||R>=this.$nConstraint)return!1;const Q=this.$aConstraint+p.sqlite3_index_constraint.structInfo.sizeof*R;return z?Q:new p.sqlite3_index_constraint(Q)},p.prototype.nthConstraintUsage=function(R,z=!1){if(R<0||R>=this.$nConstraint)return!1;const Q=this.$aConstraintUsage+p.sqlite3_index_constraint_usage.structInfo.sizeof*R;return z?Q:new p.sqlite3_index_constraint_usage(Q)},p.prototype.nthOrderBy=function(R,z=!1){if(R<0||R>=this.$nOrderBy)return!1;const Q=this.$aOrderBy+p.sqlite3_index_orderby.structInfo.sizeof*R;return z?Q:new p.sqlite3_index_orderby(Q)};const g=function(R,z){return(function(Q,T=!1){if(arguments.length===0&&(Q=new z),Q instanceof z)return this.set(Q.pointer,Q),Q;n.isPtr(Q)||t.SQLite3Error.toss("Invalid argument to",R+"()");let A=this.get(Q);return T&&this.delete(Q),A}).bind(new Map)},O=function(R,z){const Q=g(R,z);return Object.assign(Object.create(null),{StructType:z,create:T=>{const A=Q();return n.pokePtr(T,A.pointer),A},get:T=>Q(T),unget:T=>Q(T,!0),dispose:T=>{const A=Q(T,!0);A&&A.dispose()}})};o.xVtab=O("xVtab",r.sqlite3_vtab),o.xCursor=O("xCursor",r.sqlite3_vtab_cursor),o.xIndexInfo=R=>new r.sqlite3_index_info(R),o.xError=function R(z,Q,T){if(R.errorReporter instanceof Function)try{R.errorReporter("sqlite3_module::"+z+"(): "+Q.message)}catch{}let A;return Q instanceof t.WasmAllocError?A=r.SQLITE_NOMEM:arguments.length>2?A=T:Q instanceof t.SQLite3Error&&(A=Q.resultCode),A||r.SQLITE_ERROR},o.xError.errorReporter=console.error.bind(console),o.xRowid=(R,z)=>n.poke(R,z,"i64"),o.setupModule=function(R){let z=!1;const Q=this instanceof r.sqlite3_module?this:R.struct||(z=new r.sqlite3_module);try{const T=R.methods||s("Missing 'methods' object.");for(const A of Object.entries({xConnect:"xCreate",xDisconnect:"xDestroy"})){const D=A[0],q=A[1];T[D]===!0?T[D]=T[q]:T[q]===!0&&(T[q]=T[D])}if(R.catchExceptions){const A=function(w,x){return["xConnect","xCreate"].indexOf(w)>=0?function(N,P,S,L,$,c){try{return x(...arguments)||0}catch(d){return d instanceof t.WasmAllocError||(n.dealloc(n.peekPtr(c)),n.pokePtr(c,n.allocCString(d.message))),o.xError(w,d)}}:function(...N){try{return x(...N)||0}catch(P){return o.xError(w,P)}}},D=["xCreate","xConnect","xBestIndex","xDisconnect","xDestroy","xOpen","xClose","xFilter","xNext","xEof","xColumn","xRowid","xUpdate","xBegin","xSync","xCommit","xRollback","xFindFunction","xRename","xSavepoint","xRelease","xRollbackTo","xShadowName"],q=Object.create(null);for(const w of D){const x=T[w];if(x instanceof Function)w==="xConnect"&&T.xCreate===x?q[w]=T.xCreate:w==="xCreate"&&T.xConnect===x?q[w]=T.xConnect:q[w]=A(w,x);else continue}Q.installMethods(q,!1)}else Q.installMethods(T,!!R.applyArgcCheck);if(Q.$iVersion===0){let A;typeof R.iVersion=="number"?A=R.iVersion:Q.$xShadowName?A=3:Q.$xSavePoint||Q.$xRelease||Q.$xRollbackTo?A=2:A=1,Q.$iVersion=A}}catch(T){throw z&&z.dispose(),T}return Q},r.sqlite3_module.prototype.setupModule=function(R){return o.setupModule.call(this,R)}}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=function r(s){if(!globalThis.SharedArrayBuffer||!globalThis.Atomics)return Promise.reject(new Error("Cannot install OPFS: Missing SharedArrayBuffer and/or Atomics. The server must emit the COOP/COEP response headers to enable those. See https://sqlite.org/wasm/doc/trunk/persistence.md#coop-coep"));if(typeof WorkerGlobalScope>"u")return Promise.reject(new Error("The OPFS sqlite3_vfs cannot run in the main thread because it requires Atomics.wait()."));if(!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle||!globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle||!navigator?.storage?.getDirectory)return Promise.reject(new Error("Missing required OPFS APIs."));(!s||typeof s!="object")&&(s=Object.create(null));const o=new URL(globalThis.location.href).searchParams;return o.has("opfs-disable")?Promise.resolve(t):(s.verbose===void 0&&(s.verbose=o.has("opfs-verbose")?+o.get("opfs-verbose")||2:1),s.sanityChecks===void 0&&(s.sanityChecks=o.has("opfs-sanity-check")),s.proxyUri===void 0&&(s.proxyUri=r.defaultProxyUri),typeof s.proxyUri=="function"&&(s.proxyUri=s.proxyUri()),new Promise(function(g,O){const R=[t.config.error,t.config.warn,t.config.log],z=(E,...C)=>{s.verbose>E&&R[E]("OPFS syncer:",...C)},Q=(...E)=>z(2,...E),T=(...E)=>z(1,...E),A=(...E)=>z(0,...E),D=t.util.toss,q=t.capi,w=t.util,x=t.wasm,N=q.sqlite3_vfs,P=q.sqlite3_file,S=q.sqlite3_io_methods,L=Object.create(null),$=()=>globalThis.FileSystemHandle&&globalThis.FileSystemDirectoryHandle&&globalThis.FileSystemFileHandle&&globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle&&navigator?.storage?.getDirectory;L.metrics={dump:function(){let E,C=0,M=0,J=0;for(E in u.opIds){const G=I[E];C+=G.count,M+=G.time,J+=G.wait,G.avgTime=G.count&&G.time?G.time/G.count:0,G.avgWait=G.count&&G.wait?G.wait/G.count:0}t.config.log(globalThis.location.href,"metrics for",globalThis.location.href,":",I,` -Total of`,C,"op(s) for",M,"ms (incl. "+J+" ms of waiting on the async side)"),t.config.log("Serialization metrics:",I.s11n),m.postMessage({type:"opfs-async-metrics"})},reset:function(){let E;const C=J=>J.count=J.time=J.wait=0;for(E in u.opIds)C(I[E]=Object.create(null));let M=I.s11n=Object.create(null);M=M.serialize=Object.create(null),M.count=M.time=0,M=I.s11n.deserialize=Object.create(null),M.count=M.time=0}};const c=new S,d=new N().addOnDispose(()=>c.dispose());let y;const B=E=>(y=!0,d.dispose(),O(E)),f=()=>(y=!1,g(t)),m=new Worker(new URL("/assets/sqlite3-opfs-async-proxy-B_ImRJXp.js",import.meta.url));setTimeout(()=>{y===void 0&&B(new Error("Timeout while waiting for OPFS async proxy worker."))},4e3),m._originalOnError=m.onerror,m.onerror=function(E){A("Error initializing OPFS asyncer:",E),B(new Error("Loading OPFS async Worker failed for unknown reasons."))};const l=q.sqlite3_vfs_find(null),_=l?new N(l):null;c.$iVersion=1,d.$iVersion=2,d.$szOsFile=q.sqlite3_file.structInfo.sizeof,d.$mxPathname=1024,d.$zName=x.allocCString("opfs"),d.$xDlOpen=d.$xDlError=d.$xDlSym=d.$xDlClose=null,d.addOnDispose("$zName",d.$zName,"cleanup default VFS wrapper",()=>_?_.dispose():null);const u=Object.create(null);u.verbose=s.verbose,u.littleEndian=(()=>{const E=new ArrayBuffer(2);return new DataView(E).setInt16(0,256,!0),new Int16Array(E)[0]===256})(),u.asyncIdleWaitTime=150,u.asyncS11nExceptions=1,u.fileBufferSize=1024*64,u.sabS11nOffset=u.fileBufferSize,u.sabS11nSize=d.$mxPathname*2,u.sabIO=new SharedArrayBuffer(u.fileBufferSize+u.sabS11nSize),u.opIds=Object.create(null);const I=Object.create(null);{let E=0;u.opIds.whichOp=E++,u.opIds.rc=E++,u.opIds.xAccess=E++,u.opIds.xClose=E++,u.opIds.xDelete=E++,u.opIds.xDeleteNoWait=E++,u.opIds.xFileSize=E++,u.opIds.xLock=E++,u.opIds.xOpen=E++,u.opIds.xRead=E++,u.opIds.xSleep=E++,u.opIds.xSync=E++,u.opIds.xTruncate=E++,u.opIds.xUnlock=E++,u.opIds.xWrite=E++,u.opIds.mkdir=E++,u.opIds["opfs-async-metrics"]=E++,u.opIds["opfs-async-shutdown"]=E++,u.opIds.retry=E++,u.sabOP=new SharedArrayBuffer(E*4),L.metrics.reset()}u.sq3Codes=Object.create(null),["SQLITE_ACCESS_EXISTS","SQLITE_ACCESS_READWRITE","SQLITE_BUSY","SQLITE_CANTOPEN","SQLITE_ERROR","SQLITE_IOERR","SQLITE_IOERR_ACCESS","SQLITE_IOERR_CLOSE","SQLITE_IOERR_DELETE","SQLITE_IOERR_FSYNC","SQLITE_IOERR_LOCK","SQLITE_IOERR_READ","SQLITE_IOERR_SHORT_READ","SQLITE_IOERR_TRUNCATE","SQLITE_IOERR_UNLOCK","SQLITE_IOERR_WRITE","SQLITE_LOCK_EXCLUSIVE","SQLITE_LOCK_NONE","SQLITE_LOCK_PENDING","SQLITE_LOCK_RESERVED","SQLITE_LOCK_SHARED","SQLITE_LOCKED","SQLITE_MISUSE","SQLITE_NOTFOUND","SQLITE_OPEN_CREATE","SQLITE_OPEN_DELETEONCLOSE","SQLITE_OPEN_MAIN_DB","SQLITE_OPEN_READONLY"].forEach(E=>{(u.sq3Codes[E]=q[E])===void 0&&D("Maintenance required: not found:",E)}),u.opfsFlags=Object.assign(Object.create(null),{OPFS_UNLOCK_ASAP:1,OPFS_UNLINK_BEFORE_OPEN:2,defaultUnlockAsap:!1});const U=(E,...C)=>{const M=u.opIds[E]||D("Invalid op ID:",E);u.s11n.serialize(...C),Atomics.store(u.sabOPView,u.opIds.rc,-1),Atomics.store(u.sabOPView,u.opIds.whichOp,M),Atomics.notify(u.sabOPView,u.opIds.whichOp);const J=performance.now();for(;Atomics.wait(u.sabOPView,u.opIds.rc,-1)!=="not-equal";);const G=Atomics.load(u.sabOPView,u.opIds.rc);if(I[E].wait+=performance.now()-J,G&&u.asyncS11nExceptions){const te=u.s11n.deserialize();te&&A(E+"() async error:",...te)}return G};L.debug={asyncShutdown:()=>{T("Shutting down OPFS async listener. The OPFS VFS will no longer work."),U("opfs-async-shutdown")},asyncRestart:()=>{T("Attempting to restart OPFS VFS async listener. Might work, might not."),m.postMessage({type:"opfs-async-restart"})}};const ee=()=>{if(u.s11n)return u.s11n;const E=new TextDecoder,C=new TextEncoder("utf-8"),M=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),J=new DataView(u.sabIO,u.sabS11nOffset,u.sabS11nSize);u.s11n=Object.create(null);const G=Object.create(null);G.number={id:1,size:8,getter:"getFloat64",setter:"setFloat64"},G.bigint={id:2,size:8,getter:"getBigInt64",setter:"setBigInt64"},G.boolean={id:3,size:4,getter:"getInt32",setter:"setInt32"},G.string={id:4};const te=Y=>G[typeof Y]||D("Maintenance required: this value type cannot be serialized.",Y),ae=Y=>{switch(Y){case G.number.id:return G.number;case G.bigint.id:return G.bigint;case G.boolean.id:return G.boolean;case G.string.id:return G.string;default:D("Invalid type ID:",Y)}};return u.s11n.deserialize=function(Y=!1){++I.s11n.deserialize.count;const we=performance.now(),F=M[0],V=F?[]:null;if(F){const K=[];let X=1,_e,ge,pe;for(_e=0;_e{ie.start=performance.now(),ie.op=E,++I[E].count},b=()=>I[ie.op].time+=performance.now()-ie.start,k={xCheckReservedLock:function(E,C){return x.poke(C,0,"i32"),0},xClose:function(E){j("xClose");let C=0;const M=se[E];return M&&(delete se[E],C=U("xClose",E),M.sq3File&&M.sq3File.dispose()),b(),C},xDeviceCharacteristics:function(E){return q.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN},xFileControl:function(E,C,M){return q.SQLITE_NOTFOUND},xFileSize:function(E,C){j("xFileSize");let M=U("xFileSize",E);if(M==0)try{const J=u.s11n.deserialize()[0];x.poke(C,J,"i64")}catch(J){A("Unexpected error reading xFileSize() result:",J),M=u.sq3Codes.SQLITE_IOERR}return b(),M},xLock:function(E,C){j("xLock");const M=se[E];let J=0;return M.lockType?M.lockType=C:(J=U("xLock",E,C),J===0&&(M.lockType=C)),b(),J},xRead:function(E,C,M,J){j("xRead");const G=se[E];let te;try{te=U("xRead",E,M,Number(J)),(te===0||q.SQLITE_IOERR_SHORT_READ===te)&&x.heap8u().set(G.sabView.subarray(0,M),C)}catch(ae){A("xRead(",arguments,") failed:",ae,G),te=q.SQLITE_IOERR_READ}return b(),te},xSync:function(E,C){j("xSync"),++I.xSync.count;const M=U("xSync",E,C);return b(),M},xTruncate:function(E,C){j("xTruncate");const M=U("xTruncate",E,Number(C));return b(),M},xUnlock:function(E,C){j("xUnlock");const M=se[E];let J=0;return q.SQLITE_LOCK_NONE===C&&M.lockType&&(J=U("xUnlock",E,C)),J===0&&(M.lockType=C),b(),J},xWrite:function(E,C,M,J){j("xWrite");const G=se[E];let te;try{G.sabView.set(x.heap8u().subarray(C,C+M)),te=U("xWrite",E,M,Number(J))}catch(ae){A("xWrite(",arguments,") failed:",ae,G),te=q.SQLITE_IOERR_WRITE}return b(),te}},W={xAccess:function(E,C,M,J){j("xAccess");const G=U("xAccess",x.cstrToJs(C));return x.poke(J,G?0:1,"i32"),b(),0},xCurrentTime:function(E,C){return x.poke(C,24405875e-1+new Date().getTime()/864e5,"double"),0},xCurrentTimeInt64:function(E,C){return x.poke(C,24405875e-1*864e5+new Date().getTime(),"i64"),0},xDelete:function(E,C,M){j("xDelete");const J=U("xDelete",x.cstrToJs(C),M,!1);return b(),J},xFullPathname:function(E,C,M,J){return x.cstrncpy(J,C,M)!!J):M},L.getDirForFilename=async function(C,M=!1){const J=L.getResolvedPath(C,!0),G=J.pop();let te=L.rootDirectory;for(const ae of J)ae&&(te=await te.getDirectoryHandle(ae,{create:!!M}));return[te,G]},L.mkdir=async function(E){try{return await L.getDirForFilename(E+"/filepart",!0),!0}catch{return!1}},L.entryExists=async function(E){try{const[C,M]=await L.getDirForFilename(E);return await C.getFileHandle(M),!0}catch{return!1}},L.randomFilename=ne,L.treeList=async function(){const E=async function M(J,G){G.name=J.name,G.dirs=[],G.files=[];for await(const te of J.values())if(te.kind==="directory"){const ae=Object.create(null);G.dirs.push(ae),await M(te,ae)}else G.files.push(te.name)},C=Object.create(null);return await E(L.rootDirectory,C),C},L.rmfr=async function(){const E=L.rootDirectory,C={recurse:!0};for await(const M of E.values())E.removeEntry(M.name,C)},L.unlink=async function(E,C=!1,M=!1){try{const[J,G]=await L.getDirForFilename(E,!1);return await J.removeEntry(G,{recursive:C}),!0}catch(J){if(M)throw new Error("unlink(",arguments[0],") failed: "+J.message,{cause:J});return!1}},L.traverse=async function(E){const C={recursive:!0,directory:L.rootDirectory};typeof E=="function"&&(E={callback:E}),E=Object.assign(C,E||{}),async function J(G,te){for await(const ae of G.values()){if(E.callback(ae,G,te)===!1)return!1;if(E.recursive&&ae.kind==="directory"&&await J(ae,te+1)===!1)break}}(E.directory,0)};const H=async function(E,C){const[M,J]=await L.getDirForFilename(E,!0);let te=await(await M.getFileHandle(J,{create:!0})).createSyncAccessHandle(),ae=0,Y,we=!1;try{for(te.truncate(0);(Y=await C())!==void 0;)Y instanceof ArrayBuffer&&(Y=new Uint8Array(Y)),ae===0&&Y.byteLength>=15&&(w.affirmDbHeader(Y),we=!0),te.write(Y,{at:ae}),ae+=Y.byteLength;if((ae<512||ae%512!==0)&&D("Input size",ae,"is not correct for an SQLite database."),!we){const F=new Uint8Array(20);te.read(F,{at:0}),w.affirmDbHeader(F)}return te.write(new Uint8Array([1,1]),{at:18}),ae}catch(F){throw await te.close(),te=void 0,await M.removeEntry(J).catch(()=>{}),F}finally{te&&await te.close()}};if(L.importDb=async function(E,C){if(C instanceof Function)return H(E,C);C instanceof ArrayBuffer&&(C=new Uint8Array(C)),w.affirmIsDb(C);const M=C.byteLength,[J,G]=await L.getDirForFilename(E,!0);let te,ae=0;try{return te=await(await J.getFileHandle(G,{create:!0})).createSyncAccessHandle(),te.truncate(0),ae=te.write(C,{at:0}),ae!=M&&D("Expected to write "+M+" bytes but wrote "+ae+"."),te.write(new Uint8Array([1,1]),{at:18}),ae}catch(Y){throw te&&(await te.close(),te=void 0),await J.removeEntry(G).catch(()=>{}),Y}finally{te&&await te.close()}},t.oo1){const E=function(...C){const M=t.oo1.DB.dbCtorHelper.normalizeArgs(...C);M.vfs=d.$zName,t.oo1.DB.dbCtorHelper.call(this,M)};E.prototype=Object.create(t.oo1.DB.prototype),t.oo1.OpfsDb=E,E.importDb=L.importDb,t.oo1.DB.dbCtorHelper.setVfsPostOpenCallback(d.pointer,function(C,M){M.capi.sqlite3_busy_timeout(C,1e4)})}const Z=function(){const E=x.scopedAllocPush(),C=new P;try{const M=C.pointer,J=q.SQLITE_OPEN_CREATE|q.SQLITE_OPEN_READWRITE|q.SQLITE_OPEN_MAIN_DB,G=x.scopedAlloc(8),te="/sanity/check/file"+ne(8),ae=x.scopedAllocCString(te);let Y;if(u.s11n.serialize("This is ä string."),Y=u.s11n.deserialize(),Q("deserialize() says:",Y),Y[0]!=="This is ä string."&&D("String d13n error."),W.xAccess(d.pointer,ae,0,G),Y=x.peek(G,"i32"),Q("xAccess(",te,") exists ?=",Y),Y=W.xOpen(d.pointer,ae,M,J,G),Q("open rc =",Y,"state.sabOPView[xOpen] =",u.sabOPView[u.opIds.xOpen]),Y!==0){A("open failed with code",Y);return}W.xAccess(d.pointer,ae,0,G),Y=x.peek(G,"i32"),Y||D("xAccess() failed to detect file."),Y=k.xSync(C.pointer,0),Y&&D("sync failed w/ rc",Y),Y=k.xTruncate(C.pointer,1024),Y&&D("truncate failed w/ rc",Y),x.poke(G,0,"i64"),Y=k.xFileSize(C.pointer,G),Y&&D("xFileSize failed w/ rc",Y),Q("xFileSize says:",x.peek(G,"i64")),Y=k.xWrite(C.pointer,ae,10,1),Y&&D("xWrite() failed!");const we=x.scopedAlloc(16);Y=k.xRead(C.pointer,we,6,2),x.poke(we+6,0);let F=x.cstrToJs(we);Q("xRead() got:",F),F!=="sanity"&&D("Unexpected xRead() value."),W.xSleep&&(Q("xSleep()ing before close()ing..."),W.xSleep(d.pointer,2e3),Q("waking up from xSleep()")),Y=k.xClose(M),Q("xClose rc =",Y,"sabOPView =",u.sabOPView),Q("Deleting file:",te),W.xDelete(d.pointer,ae,4660),W.xAccess(d.pointer,ae,0,G),Y=x.peek(G,"i32"),Y&&D("Expecting 0 from xAccess(",te,") after xDelete()."),T("End of OPFS sanity checks.")}finally{C.dispose(),x.scopedAllocPop(E)}};m.onmessage=function({data:E}){switch(E.type){case"opfs-unavailable":B(new Error(E.payload.join(" ")));break;case"opfs-async-loaded":m.postMessage({type:"opfs-async-init",args:u});break;case"opfs-async-inited":{if(y===!0)break;try{t.vfs.installVfs({io:{struct:c,methods:k},vfs:{struct:d,methods:W}}),u.sabOPView=new Int32Array(u.sabOP),u.sabFileBufView=new Uint8Array(u.sabIO,0,u.fileBufferSize),u.sabS11nView=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),ee(),s.sanityChecks&&(T("Running sanity checks because of opfs-sanity-check URL arg..."),Z()),$()?navigator.storage.getDirectory().then(C=>{m.onerror=m._originalOnError,delete m._originalOnError,t.opfs=L,L.rootDirectory=C,Q("End of OPFS sqlite3_vfs setup.",d),f()}).catch(B):f()}catch(C){A(C),B(C)}break}default:{const C="Unexpected message from the OPFS async worker: "+JSON.stringify(E);A(C),B(new Error(C));break}}}}))};n.defaultProxyUri="sqlite3-opfs-async-proxy.js",globalThis.sqlite3ApiBootstrap.initializersAsync.push(async r=>{try{let s=n.defaultProxyUri;return r.scriptInfo.sqlite3Dir&&(n.defaultProxyUri=r.scriptInfo.sqlite3Dir+s),n().catch(o=>{r.config.warn("Ignoring inability to install OPFS sqlite3_vfs:",o.message)})}catch(s){return r.config.error("installOpfsVfs() exception:",s),Promise.reject(s)}})}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.util.toss,r=t.util.toss3,s=Object.create(null),o=t.capi,p=t.util,g=t.wasm,O=4096,R=512,z=4,Q=8,T=R+z,A=R,D=T,q=O,w=o.SQLITE_OPEN_MAIN_DB|o.SQLITE_OPEN_MAIN_JOURNAL|o.SQLITE_OPEN_SUPER_JOURNAL|o.SQLITE_OPEN_WAL,x=o.SQLITE_OPEN_MEMORY,N=".opaque",P=()=>Math.random().toString(36).slice(2),S=new TextDecoder,L=new TextEncoder,$=Object.assign(Object.create(null),{name:"opfs-sahpool",directory:void 0,initialCapacity:6,clearOnInit:!1,verbosity:2,forceReinitIfPreviouslyFailed:!1}),c=[t.config.error,t.config.warn,t.config.log];t.config.log;const d=t.config.warn;t.config.error;const y=new Map,B=j=>y.get(j),f=(j,b)=>{b?y.set(j,b):y.delete(j)},m=new Map,l=j=>m.get(j),_=(j,b)=>{b?m.set(j,b):m.delete(j)},u={xCheckReservedLock:function(j,b){const k=l(j);return k.log("xCheckReservedLock"),k.storeErr(),g.poke32(b,1),0},xClose:function(j){const b=l(j);b.storeErr();const k=b.getOFileForS3File(j);if(k)try{b.log(`xClose ${k.path}`),b.mapS3FileToOFile(j,!1),k.sah.flush(),k.flags&o.SQLITE_OPEN_DELETEONCLOSE&&b.deletePath(k.path)}catch(W){return b.storeErr(W,o.SQLITE_IOERR)}return 0},xDeviceCharacteristics:function(j){return o.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN},xFileControl:function(j,b,k){return o.SQLITE_NOTFOUND},xFileSize:function(j,b){const k=l(j);k.log("xFileSize");const H=k.getOFileForS3File(j).sah.getSize()-q;return g.poke64(b,BigInt(H)),0},xLock:function(j,b){const k=l(j);k.log(`xLock ${b}`),k.storeErr();const W=k.getOFileForS3File(j);return W.lockType=b,0},xRead:function(j,b,k,W){const H=l(j);H.storeErr();const Z=H.getOFileForS3File(j);H.log(`xRead ${Z.path} ${k} @ ${W}`);try{const E=Z.sah.read(g.heap8u().subarray(b,b+k),{at:q+Number(W)});return Eb&&g.poke8(k+b-1,0)}catch{return o.SQLITE_NOMEM}finally{g.scopedAllocPop(Z)}}return H?H.sqlite3Rc||o.SQLITE_IOERR:0},xOpen:function(b,k,W,H,Z){const E=B(b);try{H&=~x,E.log(`xOpen ${g.cstrToJs(k)} ${H}`);const C=k&&g.peek8(k)?E.getPath(k):P();let M=E.getSAHForPath(C);!M&&H&o.SQLITE_OPEN_CREATE&&(E.getFileCount()f(b.pointer,0)),W&&(b.$xRandomness=W.$xRandomness,b.$xSleep=W.$xSleep,W.dispose()),!b.$xRandomness&&!U.xRandomness&&(U.xRandomness=function(H,Z,E){const C=g.heap8u();let M=0;for(;M0),t.vfs.installVfs({vfs:{struct:b,methods:U}}),b};class ne{vfsDir;#e;#o;#a;#r=new Map;#t=new Map;#s=new Set;#l=new Map;#n=new Uint8Array(T);#c;#i;#u;constructor(b=Object.create(null)){this.#u=b.verbosity??$.verbosity,this.vfsName=b.name||$.name,this.#i=ee(this.vfsName),f(this.#i.pointer,this),this.vfsDir=b.directory||"."+this.vfsName,this.#c=new DataView(this.#n.buffer,this.#n.byteOffset),this.isReady=this.reset(!!(b.clearOnInit??$.clearOnInit)).then(()=>{if(this.$error)throw this.$error;return this.getCapacity()?Promise.resolve(void 0):this.addCapacity(b.initialCapacity||$.initialCapacity)})}#_(b,...k){this.#u>b&&c[b](this.vfsName+":",...k)}log(...b){this.#_(2,...b)}warn(...b){this.#_(1,...b)}error(...b){this.#_(0,...b)}getVfs(){return this.#i}getCapacity(){return this.#r.size}getFileCount(){return this.#t.size}getFileNames(){const b=[];for(const k of this.#t.keys())b.push(k);return b}async addCapacity(b){for(let k=0;k{try{const Z=await H.createSyncAccessHandle();if(this.#r.set(Z,W),b)Z.truncate(q),this.setAssociatedPath(Z,"",0);else{const E=this.getAssociatedPath(Z);E?this.#t.set(E,Z):this.#s.add(Z)}}catch(Z){throw this.storeErr(Z),this.releaseAccessHandles(),Z}}))}getAssociatedPath(b){b.read(this.#n,{at:0});const k=this.#c.getUint32(A);if(this.#n[0]&&(k&o.SQLITE_OPEN_DELETEONCLOSE||(k&w)===0))return d(`Removing file with unexpected flags ${k.toString(16)}`,this.#n),this.setAssociatedPath(b,"",0),"";const W=new Uint32Array(Q/4);b.read(W,{at:D});const H=this.computeDigest(this.#n,k);if(W.every((Z,E)=>Z===H[E])){const Z=this.#n.findIndex(E=>E===0);return Z===0&&b.truncate(q),Z?S.decode(this.#n.subarray(0,Z)):""}else return d("Disassociating file with bad digest."),this.setAssociatedPath(b,"",0),""}setAssociatedPath(b,k,W){const H=L.encodeInto(k,this.#n);R<=H.written+1&&n("Path too long:",k),k&&W&&(W|=x),this.#n.fill(0,H.written,R),this.#c.setUint32(A,W);const Z=this.computeDigest(this.#n,W);b.write(this.#n,{at:0}),b.write(Z,{at:D}),b.flush(),k?(this.#t.set(k,b),this.#s.delete(b)):(b.truncate(q),this.#s.add(b))}computeDigest(b,k){if(k&x){let W=3735928559,H=1103547991;for(const Z of b)W=Math.imul(W^Z,2654435761),H=Math.imul(H^Z,104729);return new Uint32Array([W>>>0,H>>>0])}else return new Uint32Array([0,0])}async reset(b){await this.isReady;let k=await navigator.storage.getDirectory(),W;for(const H of this.vfsDir.split("/"))H&&(W=k,k=await k.getDirectoryHandle(H,{create:!0}));return this.#e=k,this.#a=W,this.#o=await this.#e.getDirectoryHandle(N,{create:!0}),this.releaseAccessHandles(),this.acquireAccessHandles(b)}getPath(b){return g.isPtr(b)&&(b=g.cstrToJs(b)),(b instanceof URL?b:new URL(b,"file://localhost/")).pathname}deletePath(b){const k=this.#t.get(b);return k&&(this.#t.delete(b),this.setAssociatedPath(k,"",0)),!!k}storeErr(b,k){return b&&(b.sqlite3Rc=k||o.SQLITE_IOERR,this.error(b)),this.$error=b,k}popErr(){const b=this.$error;return this.$error=void 0,b}nextAvailableSAH(){const[b]=this.#s.keys();return b}getOFileForS3File(b){return this.#l.get(b)}mapS3FileToOFile(b,k){k?(this.#l.set(b,k),_(b,this)):(this.#l.delete(b),_(b,!1))}hasFilename(b){return this.#t.has(b)}getSAHForPath(b){return this.#t.get(b)}async removeVfs(){if(!this.#i.pointer||!this.#o)return!1;o.sqlite3_vfs_unregister(this.#i.pointer),this.#i.dispose(),delete s[this.vfsName];try{this.releaseAccessHandles(),await this.#e.removeEntry(N,{recursive:!0}),this.#o=void 0,await this.#a.removeEntry(this.#e.name,{recursive:!0}),this.#e=this.#a=void 0}catch(b){t.config.error(this.vfsName,"removeVfs() failed with no recovery strategy:",b)}return!0}pauseVfs(){return this.#l.size>0&&t.SQLite3Error.toss(o.SQLITE_MISUSE,"Cannot pause VFS",this.vfsName,"because it has opened files."),this.#r.size>0&&(o.sqlite3_vfs_unregister(this.vfsName),this.releaseAccessHandles()),this}isPaused(){return this.#r.size===0}async unpauseVfs(){return this.#r.size===0?this.acquireAccessHandles(!1).then(()=>o.sqlite3_vfs_register(this.#i,0),this):this}exportFile(b){const k=this.#t.get(b)||n("File not found:",b),W=k.getSize()-q,H=new Uint8Array(W>0?W:0);if(W>0){const Z=k.read(H,{at:q});Z!=W&&n("Expected to read "+W+" bytes but read "+Z+".")}return H}async importDbChunked(b,k){const W=this.#t.get(b)||this.nextAvailableSAH()||n("No available handles to import to.");W.truncate(0);let H=0,Z,E=!1;try{for(;(Z=await k())!==void 0;)Z instanceof ArrayBuffer&&(Z=new Uint8Array(Z)),H===0&&Z.byteLength>=15&&(p.affirmDbHeader(Z),E=!0),W.write(Z,{at:q+H}),H+=Z.byteLength;if((H<512||H%512!==0)&&n("Input size",H,"is not correct for an SQLite database."),!E){const C=new Uint8Array(20);W.read(C,{at:0}),p.affirmDbHeader(C)}W.write(new Uint8Array([1,1]),{at:q+18})}catch(C){throw this.setAssociatedPath(W,"",0),C}return this.setAssociatedPath(W,b,o.SQLITE_OPEN_MAIN_DB),H}importDb(b,k){if(k instanceof ArrayBuffer)k=new Uint8Array(k);else if(k instanceof Function)return this.importDbChunked(b,k);const W=this.#t.get(b)||this.nextAvailableSAH()||n("No available handles to import to."),H=k.byteLength;(H<512||H%512!=0)&&n("Byte array size is invalid for an SQLite db.");const Z="SQLite format 3";for(let C=0;Cthis)}isPaused(){return this.#e.isPaused()}}const ie=async()=>{const j=await navigator.storage.getDirectory(),b=".opfs-sahpool-sync-check-"+P(),H=(await(await j.getFileHandle(b,{create:!0})).createSyncAccessHandle()).close();return await H,await j.removeEntry(b),H?.then&&n("The local OPFS API is too old for opfs-sahpool:","it has an async FileSystemSyncAccessHandle.close() method."),!0};t.installOpfsSAHPoolVfs=async function(j=Object.create(null)){j=Object.assign(Object.create(null),$,j||{});const b=j.name;if(j.$testThrowPhase1)throw j.$testThrowPhase1;if(s[b])try{return await s[b]}catch(k){if(j.forceReinitIfPreviouslyFailed)delete s[b];else throw k}return!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle||!globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle||!navigator?.storage?.getDirectory?s[b]=Promise.reject(new Error("Missing required OPFS APIs.")):s[b]=ie().then(async function(){if(j.$testThrowPhase2)throw j.$testThrowPhase2;const k=new ne(j);return k.isReady.then(async()=>{const W=new se(k);if(t.oo1){const H=t.oo1,Z=k.getVfs(),E=function(...C){const M=H.DB.dbCtorHelper.normalizeArgs(...C);M.vfs=Z.$zName,H.DB.dbCtorHelper.call(this,M)};E.prototype=Object.create(H.DB.prototype),W.OpfsSAHPoolDb=E}return k.log("VFS initialized."),W}).catch(async W=>{throw await k.removeVfs().catch(()=>{}),W})}).catch(k=>s[b]=Promise.reject(k))}}),typeof i<"u"){const t=Object.assign(Object.create(null),{exports:typeof h>"u"?i.asm:h,memory:i.wasmMemory},globalThis.sqlite3ApiConfig||{});globalThis.sqlite3ApiConfig=t;let n;try{n=globalThis.sqlite3ApiBootstrap()}catch(r){throw console.error("sqlite3ApiBootstrap() error:",r),r}finally{delete globalThis.sqlite3ApiBootstrap,delete globalThis.sqlite3ApiConfig}i.sqlite3=n}else console.warn("This is not running in an Emscripten module context, so","globalThis.sqlite3ApiBootstrap() is _not_ being called due to lack","of config info for the WASM environment.","It must be called manually.")},fe=Oe,fe}})();const Yn=(function(){const qe=ft;if(!qe)throw new Error("Expecting globalThis.sqlite3InitModule to be defined by the Emscripten build.");const oe=globalThis.sqlite3InitModuleState=Object.assign(Object.create(null),{moduleScript:globalThis?.document?.currentScript,isWorker:typeof WorkerGlobalScope<"u",location:globalThis.location,urlParams:globalThis?.location?.href?new URL(globalThis.location.href).searchParams:new URLSearchParams});if(oe.debugModule=oe.urlParams.has("sqlite3.debugModule")?(...fe)=>console.warn("sqlite3.debugModule:",...fe):()=>{},oe.urlParams.has("sqlite3.dir"))oe.sqlite3Dir=oe.urlParams.get("sqlite3.dir")+"/";else if(oe.moduleScript){const fe=oe.moduleScript.src.split("/");fe.pop(),oe.sqlite3Dir=fe.join("/")+"/"}if(globalThis.sqlite3InitModule=function fe(...i){return qe(...i).then(ye=>{ye.runSQLite3PostLoadInit(ye);const be=ye.sqlite3;be.scriptInfo=oe,fe.__isUnderTest&&(be.__isUnderTest=!0);const Oe=be.asyncPostInit;return delete be.asyncPostInit,Oe()}).catch(ye=>{throw console.error("Exception loading sqlite3 module:",ye),ye})},globalThis.sqlite3InitModule.ready=qe.ready,globalThis.sqlite3InitModuleState.moduleScript){const fe=globalThis.sqlite3InitModuleState;let i=fe.moduleScript.src.split("/");i.pop(),fe.scriptDir=i.join("/")+"/"}return oe.debugModule("sqlite3InitModuleState =",oe),globalThis.sqlite3InitModule})();ft=Yn;var Zn=ft;globalThis.sqlite3Worker1Promiser=function qe(oe=qe.defaultConfig){if(arguments.length===1&&typeof arguments[0]=="function"){const re=oe;oe=Object.assign(Object.create(null),qe.defaultConfig),oe.onready=re}else oe=Object.assign(Object.create(null),qe.defaultConfig,oe);const fe=Object.create(null),i=function(){},ye=oe.onerror||i,be=oe.debug||i,Oe=oe.generateMessageId?void 0:Object.create(null),Xe=oe.generateMessageId||function(re){return re.type+"#"+(Oe[re.type]=(Oe[re.type]||0)+1)},Ce=(...re)=>{throw new Error(re.join(" "))};oe.worker||(oe.worker=qe.defaultConfig.worker),typeof oe.worker=="function"&&(oe.worker=oe.worker());let Pe,He;return oe.worker.onmessage=function(re){re=re.data,be("worker1.onmessage",re);let me=fe[re.messageId];if(!me){if(re&&re.type==="sqlite3-api"&&re.result==="worker1-ready"){oe.onready&&oe.onready(He);return}if(me=fe[re.type],me&&me.onrow){me.onrow(re);return}oe.onunhandled?oe.onunhandled(arguments[0]):ye("sqlite3Worker1Promiser() unhandled worker message:",re);return}switch(delete fe[re.messageId],re.type){case"error":me.reject(re);return;case"open":Pe||(Pe=re.dbId);break;case"close":re.dbId===Pe&&(Pe=void 0);break}try{me.resolve(re)}catch(Ie){me.reject(Ie)}},He=function(){let re;arguments.length===1?re=arguments[0]:arguments.length===2?(re=Object.create(null),re.type=arguments[0],re.args=arguments[1],re.dbId=re.args.dbId):Ce("Invalid arguments for sqlite3Worker1Promiser()-created factory."),!re.dbId&&re.type!=="open"&&(re.dbId=Pe),re.messageId=Xe(re),re.departureTime=performance.now();const me=Object.create(null);me.message=re;let Ie;re.type==="exec"&&re.args&&(typeof re.args.callback=="function"?(Ie=re.messageId+":row",me.onrow=re.args.callback,re.args.callback=Ie,fe[Ie]=me):typeof re.args.callback=="string"&&Ce("exec callback may not be a string when using the Promise interface."));let De=new Promise(function(je,Ve){me.resolve=je,me.reject=Ve,fe[re.messageId]=me,be("Posting",re.type,"message to Worker dbId="+(Pe||"default")+":",re),oe.worker.postMessage(re)});return Ie&&(De=De.finally(()=>delete fe[Ie])),De}};globalThis.sqlite3Worker1Promiser.defaultConfig={worker:function(){return new Worker(new URL("/assets/sqlite3-worker1-bundler-friendly-CqPDHTTx.js",import.meta.url),{type:"module"})},onerror:(...qe)=>console.error("worker1 promiser error",...qe)};sqlite3Worker1Promiser.v2=(function(qe){let oe;typeof qe=="function"?(oe=qe,qe={}):typeof qe?.onready=="function"&&(oe=qe.onready,delete qe.onready);const fe=Object.create(null);qe=Object.assign(qe||Object.create(null),{onready:async function(ye){try{oe&&await oe(ye),fe.resolve(ye)}catch(be){fe.reject(be)}}});const i=new Promise(function(ye,be){fe.resolve=ye,fe.reject=be});try{this.original(qe)}catch(ye){fe.reject(ye)}return i}).bind({original:sqlite3Worker1Promiser});sqlite3Worker1Promiser.v2;const er="japanese_app.db";let Ae=null;self.onmessage=async qe=>{const{type:oe,id:fe,sql:i,params:ye}=qe.data;try{switch(oe){case"start":{if(Ae!=null){self.postMessage({type:"success",id:fe,data:null});return}const be=await Zn({print:console.log,printErr:console.error}),Oe="/"+er;Ae=new be.oo1.OpfsDb(Oe,"rwt"),Ae.exec("PRAGMA foreign_keys = ON;"),self.postMessage({type:"success",id:fe,data:null});break}case"query":{if(Ae===null)throw new Error("БД не инициализирована");const be=Ae.selectObjects(i,ye??[]);self.postMessage({type:"success",id:fe,data:be});break}case"command":{if(Ae===null)throw new Error("БД не инициализирована");Ae.exec(i,ye??[]),self.postMessage({type:"success",id:fe,data:null});break}case"close":{if(Ae===null)throw new Error("БД не инициализирована");Ae.close(),Ae=null,self.postMessage({type:"success",id:fe,data:null});break}}}catch(be){console.error(be),self.postMessage({type:"error",error:be?.message??String(be),id:fe})}}; +Total of`,C,"op(s) for",M,"ms (incl. "+J+" ms of waiting on the async side)"),t.config.log("Serialization metrics:",I.s11n),m.postMessage({type:"opfs-async-metrics"})},reset:function(){let E;const C=J=>J.count=J.time=J.wait=0;for(E in u.opIds)C(I[E]=Object.create(null));let M=I.s11n=Object.create(null);M=M.serialize=Object.create(null),M.count=M.time=0,M=I.s11n.deserialize=Object.create(null),M.count=M.time=0}};const c=new S,d=new N().addOnDispose(()=>c.dispose());let y;const B=E=>(y=!0,d.dispose(),O(E)),f=()=>(y=!1,g(t)),m=new Worker(new URL("/assets/sqlite3-opfs-async-proxy-B_ImRJXp.js",import.meta.url));setTimeout(()=>{y===void 0&&B(new Error("Timeout while waiting for OPFS async proxy worker."))},4e3),m._originalOnError=m.onerror,m.onerror=function(E){A("Error initializing OPFS asyncer:",E),B(new Error("Loading OPFS async Worker failed for unknown reasons."))};const l=q.sqlite3_vfs_find(null),_=l?new N(l):null;c.$iVersion=1,d.$iVersion=2,d.$szOsFile=q.sqlite3_file.structInfo.sizeof,d.$mxPathname=1024,d.$zName=x.allocCString("opfs"),d.$xDlOpen=d.$xDlError=d.$xDlSym=d.$xDlClose=null,d.addOnDispose("$zName",d.$zName,"cleanup default VFS wrapper",()=>_?_.dispose():null);const u=Object.create(null);u.verbose=s.verbose,u.littleEndian=(()=>{const E=new ArrayBuffer(2);return new DataView(E).setInt16(0,256,!0),new Int16Array(E)[0]===256})(),u.asyncIdleWaitTime=150,u.asyncS11nExceptions=1,u.fileBufferSize=1024*64,u.sabS11nOffset=u.fileBufferSize,u.sabS11nSize=d.$mxPathname*2,u.sabIO=new SharedArrayBuffer(u.fileBufferSize+u.sabS11nSize),u.opIds=Object.create(null);const I=Object.create(null);{let E=0;u.opIds.whichOp=E++,u.opIds.rc=E++,u.opIds.xAccess=E++,u.opIds.xClose=E++,u.opIds.xDelete=E++,u.opIds.xDeleteNoWait=E++,u.opIds.xFileSize=E++,u.opIds.xLock=E++,u.opIds.xOpen=E++,u.opIds.xRead=E++,u.opIds.xSleep=E++,u.opIds.xSync=E++,u.opIds.xTruncate=E++,u.opIds.xUnlock=E++,u.opIds.xWrite=E++,u.opIds.mkdir=E++,u.opIds["opfs-async-metrics"]=E++,u.opIds["opfs-async-shutdown"]=E++,u.opIds.retry=E++,u.sabOP=new SharedArrayBuffer(E*4),L.metrics.reset()}u.sq3Codes=Object.create(null),["SQLITE_ACCESS_EXISTS","SQLITE_ACCESS_READWRITE","SQLITE_BUSY","SQLITE_CANTOPEN","SQLITE_ERROR","SQLITE_IOERR","SQLITE_IOERR_ACCESS","SQLITE_IOERR_CLOSE","SQLITE_IOERR_DELETE","SQLITE_IOERR_FSYNC","SQLITE_IOERR_LOCK","SQLITE_IOERR_READ","SQLITE_IOERR_SHORT_READ","SQLITE_IOERR_TRUNCATE","SQLITE_IOERR_UNLOCK","SQLITE_IOERR_WRITE","SQLITE_LOCK_EXCLUSIVE","SQLITE_LOCK_NONE","SQLITE_LOCK_PENDING","SQLITE_LOCK_RESERVED","SQLITE_LOCK_SHARED","SQLITE_LOCKED","SQLITE_MISUSE","SQLITE_NOTFOUND","SQLITE_OPEN_CREATE","SQLITE_OPEN_DELETEONCLOSE","SQLITE_OPEN_MAIN_DB","SQLITE_OPEN_READONLY"].forEach(E=>{(u.sq3Codes[E]=q[E])===void 0&&D("Maintenance required: not found:",E)}),u.opfsFlags=Object.assign(Object.create(null),{OPFS_UNLOCK_ASAP:1,OPFS_UNLINK_BEFORE_OPEN:2,defaultUnlockAsap:!1});const U=(E,...C)=>{const M=u.opIds[E]||D("Invalid op ID:",E);u.s11n.serialize(...C),Atomics.store(u.sabOPView,u.opIds.rc,-1),Atomics.store(u.sabOPView,u.opIds.whichOp,M),Atomics.notify(u.sabOPView,u.opIds.whichOp);const J=performance.now();for(;Atomics.wait(u.sabOPView,u.opIds.rc,-1)!=="not-equal";);const G=Atomics.load(u.sabOPView,u.opIds.rc);if(I[E].wait+=performance.now()-J,G&&u.asyncS11nExceptions){const te=u.s11n.deserialize();te&&A(E+"() async error:",...te)}return G};L.debug={asyncShutdown:()=>{T("Shutting down OPFS async listener. The OPFS VFS will no longer work."),U("opfs-async-shutdown")},asyncRestart:()=>{T("Attempting to restart OPFS VFS async listener. Might work, might not."),m.postMessage({type:"opfs-async-restart"})}};const ee=()=>{if(u.s11n)return u.s11n;const E=new TextDecoder,C=new TextEncoder("utf-8"),M=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),J=new DataView(u.sabIO,u.sabS11nOffset,u.sabS11nSize);u.s11n=Object.create(null);const G=Object.create(null);G.number={id:1,size:8,getter:"getFloat64",setter:"setFloat64"},G.bigint={id:2,size:8,getter:"getBigInt64",setter:"setBigInt64"},G.boolean={id:3,size:4,getter:"getInt32",setter:"setInt32"},G.string={id:4};const te=Y=>G[typeof Y]||D("Maintenance required: this value type cannot be serialized.",Y),ae=Y=>{switch(Y){case G.number.id:return G.number;case G.bigint.id:return G.bigint;case G.boolean.id:return G.boolean;case G.string.id:return G.string;default:D("Invalid type ID:",Y)}};return u.s11n.deserialize=function(Y=!1){++I.s11n.deserialize.count;const we=performance.now(),F=M[0],V=F?[]:null;if(F){const K=[];let X=1,_e,ge,pe;for(_e=0;_e{ie.start=performance.now(),ie.op=E,++I[E].count},b=()=>I[ie.op].time+=performance.now()-ie.start,k={xCheckReservedLock:function(E,C){return x.poke(C,0,"i32"),0},xClose:function(E){j("xClose");let C=0;const M=se[E];return M&&(delete se[E],C=U("xClose",E),M.sq3File&&M.sq3File.dispose()),b(),C},xDeviceCharacteristics:function(E){return q.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN},xFileControl:function(E,C,M){return q.SQLITE_NOTFOUND},xFileSize:function(E,C){j("xFileSize");let M=U("xFileSize",E);if(M==0)try{const J=u.s11n.deserialize()[0];x.poke(C,J,"i64")}catch(J){A("Unexpected error reading xFileSize() result:",J),M=u.sq3Codes.SQLITE_IOERR}return b(),M},xLock:function(E,C){j("xLock");const M=se[E];let J=0;return M.lockType?M.lockType=C:(J=U("xLock",E,C),J===0&&(M.lockType=C)),b(),J},xRead:function(E,C,M,J){j("xRead");const G=se[E];let te;try{te=U("xRead",E,M,Number(J)),(te===0||q.SQLITE_IOERR_SHORT_READ===te)&&x.heap8u().set(G.sabView.subarray(0,M),C)}catch(ae){A("xRead(",arguments,") failed:",ae,G),te=q.SQLITE_IOERR_READ}return b(),te},xSync:function(E,C){j("xSync"),++I.xSync.count;const M=U("xSync",E,C);return b(),M},xTruncate:function(E,C){j("xTruncate");const M=U("xTruncate",E,Number(C));return b(),M},xUnlock:function(E,C){j("xUnlock");const M=se[E];let J=0;return q.SQLITE_LOCK_NONE===C&&M.lockType&&(J=U("xUnlock",E,C)),J===0&&(M.lockType=C),b(),J},xWrite:function(E,C,M,J){j("xWrite");const G=se[E];let te;try{G.sabView.set(x.heap8u().subarray(C,C+M)),te=U("xWrite",E,M,Number(J))}catch(ae){A("xWrite(",arguments,") failed:",ae,G),te=q.SQLITE_IOERR_WRITE}return b(),te}},W={xAccess:function(E,C,M,J){j("xAccess");const G=U("xAccess",x.cstrToJs(C));return x.poke(J,G?0:1,"i32"),b(),0},xCurrentTime:function(E,C){return x.poke(C,24405875e-1+new Date().getTime()/864e5,"double"),0},xCurrentTimeInt64:function(E,C){return x.poke(C,24405875e-1*864e5+new Date().getTime(),"i64"),0},xDelete:function(E,C,M){j("xDelete");const J=U("xDelete",x.cstrToJs(C),M,!1);return b(),J},xFullPathname:function(E,C,M,J){return x.cstrncpy(J,C,M)!!J):M},L.getDirForFilename=async function(C,M=!1){const J=L.getResolvedPath(C,!0),G=J.pop();let te=L.rootDirectory;for(const ae of J)ae&&(te=await te.getDirectoryHandle(ae,{create:!!M}));return[te,G]},L.mkdir=async function(E){try{return await L.getDirForFilename(E+"/filepart",!0),!0}catch{return!1}},L.entryExists=async function(E){try{const[C,M]=await L.getDirForFilename(E);return await C.getFileHandle(M),!0}catch{return!1}},L.randomFilename=ne,L.treeList=async function(){const E=async function M(J,G){G.name=J.name,G.dirs=[],G.files=[];for await(const te of J.values())if(te.kind==="directory"){const ae=Object.create(null);G.dirs.push(ae),await M(te,ae)}else G.files.push(te.name)},C=Object.create(null);return await E(L.rootDirectory,C),C},L.rmfr=async function(){const E=L.rootDirectory,C={recurse:!0};for await(const M of E.values())E.removeEntry(M.name,C)},L.unlink=async function(E,C=!1,M=!1){try{const[J,G]=await L.getDirForFilename(E,!1);return await J.removeEntry(G,{recursive:C}),!0}catch(J){if(M)throw new Error("unlink(",arguments[0],") failed: "+J.message,{cause:J});return!1}},L.traverse=async function(E){const C={recursive:!0,directory:L.rootDirectory};typeof E=="function"&&(E={callback:E}),E=Object.assign(C,E||{}),async function J(G,te){for await(const ae of G.values()){if(E.callback(ae,G,te)===!1)return!1;if(E.recursive&&ae.kind==="directory"&&await J(ae,te+1)===!1)break}}(E.directory,0)};const H=async function(E,C){const[M,J]=await L.getDirForFilename(E,!0);let te=await(await M.getFileHandle(J,{create:!0})).createSyncAccessHandle(),ae=0,Y,we=!1;try{for(te.truncate(0);(Y=await C())!==void 0;)Y instanceof ArrayBuffer&&(Y=new Uint8Array(Y)),ae===0&&Y.byteLength>=15&&(w.affirmDbHeader(Y),we=!0),te.write(Y,{at:ae}),ae+=Y.byteLength;if((ae<512||ae%512!==0)&&D("Input size",ae,"is not correct for an SQLite database."),!we){const F=new Uint8Array(20);te.read(F,{at:0}),w.affirmDbHeader(F)}return te.write(new Uint8Array([1,1]),{at:18}),ae}catch(F){throw await te.close(),te=void 0,await M.removeEntry(J).catch(()=>{}),F}finally{te&&await te.close()}};if(L.importDb=async function(E,C){if(C instanceof Function)return H(E,C);C instanceof ArrayBuffer&&(C=new Uint8Array(C)),w.affirmIsDb(C);const M=C.byteLength,[J,G]=await L.getDirForFilename(E,!0);let te,ae=0;try{return te=await(await J.getFileHandle(G,{create:!0})).createSyncAccessHandle(),te.truncate(0),ae=te.write(C,{at:0}),ae!=M&&D("Expected to write "+M+" bytes but wrote "+ae+"."),te.write(new Uint8Array([1,1]),{at:18}),ae}catch(Y){throw te&&(await te.close(),te=void 0),await J.removeEntry(G).catch(()=>{}),Y}finally{te&&await te.close()}},t.oo1){const E=function(...C){const M=t.oo1.DB.dbCtorHelper.normalizeArgs(...C);M.vfs=d.$zName,t.oo1.DB.dbCtorHelper.call(this,M)};E.prototype=Object.create(t.oo1.DB.prototype),t.oo1.OpfsDb=E,E.importDb=L.importDb,t.oo1.DB.dbCtorHelper.setVfsPostOpenCallback(d.pointer,function(C,M){M.capi.sqlite3_busy_timeout(C,1e4)})}const Z=function(){const E=x.scopedAllocPush(),C=new P;try{const M=C.pointer,J=q.SQLITE_OPEN_CREATE|q.SQLITE_OPEN_READWRITE|q.SQLITE_OPEN_MAIN_DB,G=x.scopedAlloc(8),te="/sanity/check/file"+ne(8),ae=x.scopedAllocCString(te);let Y;if(u.s11n.serialize("This is ä string."),Y=u.s11n.deserialize(),Q("deserialize() says:",Y),Y[0]!=="This is ä string."&&D("String d13n error."),W.xAccess(d.pointer,ae,0,G),Y=x.peek(G,"i32"),Q("xAccess(",te,") exists ?=",Y),Y=W.xOpen(d.pointer,ae,M,J,G),Q("open rc =",Y,"state.sabOPView[xOpen] =",u.sabOPView[u.opIds.xOpen]),Y!==0){A("open failed with code",Y);return}W.xAccess(d.pointer,ae,0,G),Y=x.peek(G,"i32"),Y||D("xAccess() failed to detect file."),Y=k.xSync(C.pointer,0),Y&&D("sync failed w/ rc",Y),Y=k.xTruncate(C.pointer,1024),Y&&D("truncate failed w/ rc",Y),x.poke(G,0,"i64"),Y=k.xFileSize(C.pointer,G),Y&&D("xFileSize failed w/ rc",Y),Q("xFileSize says:",x.peek(G,"i64")),Y=k.xWrite(C.pointer,ae,10,1),Y&&D("xWrite() failed!");const we=x.scopedAlloc(16);Y=k.xRead(C.pointer,we,6,2),x.poke(we+6,0);let F=x.cstrToJs(we);Q("xRead() got:",F),F!=="sanity"&&D("Unexpected xRead() value."),W.xSleep&&(Q("xSleep()ing before close()ing..."),W.xSleep(d.pointer,2e3),Q("waking up from xSleep()")),Y=k.xClose(M),Q("xClose rc =",Y,"sabOPView =",u.sabOPView),Q("Deleting file:",te),W.xDelete(d.pointer,ae,4660),W.xAccess(d.pointer,ae,0,G),Y=x.peek(G,"i32"),Y&&D("Expecting 0 from xAccess(",te,") after xDelete()."),T("End of OPFS sanity checks.")}finally{C.dispose(),x.scopedAllocPop(E)}};m.onmessage=function({data:E}){switch(E.type){case"opfs-unavailable":B(new Error(E.payload.join(" ")));break;case"opfs-async-loaded":m.postMessage({type:"opfs-async-init",args:u});break;case"opfs-async-inited":{if(y===!0)break;try{t.vfs.installVfs({io:{struct:c,methods:k},vfs:{struct:d,methods:W}}),u.sabOPView=new Int32Array(u.sabOP),u.sabFileBufView=new Uint8Array(u.sabIO,0,u.fileBufferSize),u.sabS11nView=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),ee(),s.sanityChecks&&(T("Running sanity checks because of opfs-sanity-check URL arg..."),Z()),$()?navigator.storage.getDirectory().then(C=>{m.onerror=m._originalOnError,delete m._originalOnError,t.opfs=L,L.rootDirectory=C,Q("End of OPFS sqlite3_vfs setup.",d),f()}).catch(B):f()}catch(C){A(C),B(C)}break}default:{const C="Unexpected message from the OPFS async worker: "+JSON.stringify(E);A(C),B(new Error(C));break}}}}))};n.defaultProxyUri="sqlite3-opfs-async-proxy.js",globalThis.sqlite3ApiBootstrap.initializersAsync.push(async r=>{try{let s=n.defaultProxyUri;return r.scriptInfo.sqlite3Dir&&(n.defaultProxyUri=r.scriptInfo.sqlite3Dir+s),n().catch(o=>{r.config.warn("Ignoring inability to install OPFS sqlite3_vfs:",o.message)})}catch(s){return r.config.error("installOpfsVfs() exception:",s),Promise.reject(s)}})}),globalThis.sqlite3ApiBootstrap.initializers.push(function(t){const n=t.util.toss,r=t.util.toss3,s=Object.create(null),o=t.capi,p=t.util,g=t.wasm,O=4096,R=512,z=4,Q=8,T=R+z,A=R,D=T,q=O,w=o.SQLITE_OPEN_MAIN_DB|o.SQLITE_OPEN_MAIN_JOURNAL|o.SQLITE_OPEN_SUPER_JOURNAL|o.SQLITE_OPEN_WAL,x=o.SQLITE_OPEN_MEMORY,N=".opaque",P=()=>Math.random().toString(36).slice(2),S=new TextDecoder,L=new TextEncoder,$=Object.assign(Object.create(null),{name:"opfs-sahpool",directory:void 0,initialCapacity:6,clearOnInit:!1,verbosity:2,forceReinitIfPreviouslyFailed:!1}),c=[t.config.error,t.config.warn,t.config.log];t.config.log;const d=t.config.warn;t.config.error;const y=new Map,B=j=>y.get(j),f=(j,b)=>{b?y.set(j,b):y.delete(j)},m=new Map,l=j=>m.get(j),_=(j,b)=>{b?m.set(j,b):m.delete(j)},u={xCheckReservedLock:function(j,b){const k=l(j);return k.log("xCheckReservedLock"),k.storeErr(),g.poke32(b,1),0},xClose:function(j){const b=l(j);b.storeErr();const k=b.getOFileForS3File(j);if(k)try{b.log(`xClose ${k.path}`),b.mapS3FileToOFile(j,!1),k.sah.flush(),k.flags&o.SQLITE_OPEN_DELETEONCLOSE&&b.deletePath(k.path)}catch(W){return b.storeErr(W,o.SQLITE_IOERR)}return 0},xDeviceCharacteristics:function(j){return o.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN},xFileControl:function(j,b,k){return o.SQLITE_NOTFOUND},xFileSize:function(j,b){const k=l(j);k.log("xFileSize");const H=k.getOFileForS3File(j).sah.getSize()-q;return g.poke64(b,BigInt(H)),0},xLock:function(j,b){const k=l(j);k.log(`xLock ${b}`),k.storeErr();const W=k.getOFileForS3File(j);return W.lockType=b,0},xRead:function(j,b,k,W){const H=l(j);H.storeErr();const Z=H.getOFileForS3File(j);H.log(`xRead ${Z.path} ${k} @ ${W}`);try{const E=Z.sah.read(g.heap8u().subarray(b,b+k),{at:q+Number(W)});return Eb&&g.poke8(k+b-1,0)}catch{return o.SQLITE_NOMEM}finally{g.scopedAllocPop(Z)}}return H?H.sqlite3Rc||o.SQLITE_IOERR:0},xOpen:function(b,k,W,H,Z){const E=B(b);try{H&=~x,E.log(`xOpen ${g.cstrToJs(k)} ${H}`);const C=k&&g.peek8(k)?E.getPath(k):P();let M=E.getSAHForPath(C);!M&&H&o.SQLITE_OPEN_CREATE&&(E.getFileCount()f(b.pointer,0)),W&&(b.$xRandomness=W.$xRandomness,b.$xSleep=W.$xSleep,W.dispose()),!b.$xRandomness&&!U.xRandomness&&(U.xRandomness=function(H,Z,E){const C=g.heap8u();let M=0;for(;M0),t.vfs.installVfs({vfs:{struct:b,methods:U}}),b};class ne{vfsDir;#e;#o;#a;#r=new Map;#t=new Map;#s=new Set;#l=new Map;#n=new Uint8Array(T);#c;#i;#u;constructor(b=Object.create(null)){this.#u=b.verbosity??$.verbosity,this.vfsName=b.name||$.name,this.#i=ee(this.vfsName),f(this.#i.pointer,this),this.vfsDir=b.directory||"."+this.vfsName,this.#c=new DataView(this.#n.buffer,this.#n.byteOffset),this.isReady=this.reset(!!(b.clearOnInit??$.clearOnInit)).then(()=>{if(this.$error)throw this.$error;return this.getCapacity()?Promise.resolve(void 0):this.addCapacity(b.initialCapacity||$.initialCapacity)})}#_(b,...k){this.#u>b&&c[b](this.vfsName+":",...k)}log(...b){this.#_(2,...b)}warn(...b){this.#_(1,...b)}error(...b){this.#_(0,...b)}getVfs(){return this.#i}getCapacity(){return this.#r.size}getFileCount(){return this.#t.size}getFileNames(){const b=[];for(const k of this.#t.keys())b.push(k);return b}async addCapacity(b){for(let k=0;k{try{const Z=await H.createSyncAccessHandle();if(this.#r.set(Z,W),b)Z.truncate(q),this.setAssociatedPath(Z,"",0);else{const E=this.getAssociatedPath(Z);E?this.#t.set(E,Z):this.#s.add(Z)}}catch(Z){throw this.storeErr(Z),this.releaseAccessHandles(),Z}}))}getAssociatedPath(b){b.read(this.#n,{at:0});const k=this.#c.getUint32(A);if(this.#n[0]&&(k&o.SQLITE_OPEN_DELETEONCLOSE||(k&w)===0))return d(`Removing file with unexpected flags ${k.toString(16)}`,this.#n),this.setAssociatedPath(b,"",0),"";const W=new Uint32Array(Q/4);b.read(W,{at:D});const H=this.computeDigest(this.#n,k);if(W.every((Z,E)=>Z===H[E])){const Z=this.#n.findIndex(E=>E===0);return Z===0&&b.truncate(q),Z?S.decode(this.#n.subarray(0,Z)):""}else return d("Disassociating file with bad digest."),this.setAssociatedPath(b,"",0),""}setAssociatedPath(b,k,W){const H=L.encodeInto(k,this.#n);R<=H.written+1&&n("Path too long:",k),k&&W&&(W|=x),this.#n.fill(0,H.written,R),this.#c.setUint32(A,W);const Z=this.computeDigest(this.#n,W);b.write(this.#n,{at:0}),b.write(Z,{at:D}),b.flush(),k?(this.#t.set(k,b),this.#s.delete(b)):(b.truncate(q),this.#s.add(b))}computeDigest(b,k){if(k&x){let W=3735928559,H=1103547991;for(const Z of b)W=Math.imul(W^Z,2654435761),H=Math.imul(H^Z,104729);return new Uint32Array([W>>>0,H>>>0])}else return new Uint32Array([0,0])}async reset(b){await this.isReady;let k=await navigator.storage.getDirectory(),W;for(const H of this.vfsDir.split("/"))H&&(W=k,k=await k.getDirectoryHandle(H,{create:!0}));return this.#e=k,this.#a=W,this.#o=await this.#e.getDirectoryHandle(N,{create:!0}),this.releaseAccessHandles(),this.acquireAccessHandles(b)}getPath(b){return g.isPtr(b)&&(b=g.cstrToJs(b)),(b instanceof URL?b:new URL(b,"file://localhost/")).pathname}deletePath(b){const k=this.#t.get(b);return k&&(this.#t.delete(b),this.setAssociatedPath(k,"",0)),!!k}storeErr(b,k){return b&&(b.sqlite3Rc=k||o.SQLITE_IOERR,this.error(b)),this.$error=b,k}popErr(){const b=this.$error;return this.$error=void 0,b}nextAvailableSAH(){const[b]=this.#s.keys();return b}getOFileForS3File(b){return this.#l.get(b)}mapS3FileToOFile(b,k){k?(this.#l.set(b,k),_(b,this)):(this.#l.delete(b),_(b,!1))}hasFilename(b){return this.#t.has(b)}getSAHForPath(b){return this.#t.get(b)}async removeVfs(){if(!this.#i.pointer||!this.#o)return!1;o.sqlite3_vfs_unregister(this.#i.pointer),this.#i.dispose(),delete s[this.vfsName];try{this.releaseAccessHandles(),await this.#e.removeEntry(N,{recursive:!0}),this.#o=void 0,await this.#a.removeEntry(this.#e.name,{recursive:!0}),this.#e=this.#a=void 0}catch(b){t.config.error(this.vfsName,"removeVfs() failed with no recovery strategy:",b)}return!0}pauseVfs(){return this.#l.size>0&&t.SQLite3Error.toss(o.SQLITE_MISUSE,"Cannot pause VFS",this.vfsName,"because it has opened files."),this.#r.size>0&&(o.sqlite3_vfs_unregister(this.vfsName),this.releaseAccessHandles()),this}isPaused(){return this.#r.size===0}async unpauseVfs(){return this.#r.size===0?this.acquireAccessHandles(!1).then(()=>o.sqlite3_vfs_register(this.#i,0),this):this}exportFile(b){const k=this.#t.get(b)||n("File not found:",b),W=k.getSize()-q,H=new Uint8Array(W>0?W:0);if(W>0){const Z=k.read(H,{at:q});Z!=W&&n("Expected to read "+W+" bytes but read "+Z+".")}return H}async importDbChunked(b,k){const W=this.#t.get(b)||this.nextAvailableSAH()||n("No available handles to import to.");W.truncate(0);let H=0,Z,E=!1;try{for(;(Z=await k())!==void 0;)Z instanceof ArrayBuffer&&(Z=new Uint8Array(Z)),H===0&&Z.byteLength>=15&&(p.affirmDbHeader(Z),E=!0),W.write(Z,{at:q+H}),H+=Z.byteLength;if((H<512||H%512!==0)&&n("Input size",H,"is not correct for an SQLite database."),!E){const C=new Uint8Array(20);W.read(C,{at:0}),p.affirmDbHeader(C)}W.write(new Uint8Array([1,1]),{at:q+18})}catch(C){throw this.setAssociatedPath(W,"",0),C}return this.setAssociatedPath(W,b,o.SQLITE_OPEN_MAIN_DB),H}importDb(b,k){if(k instanceof ArrayBuffer)k=new Uint8Array(k);else if(k instanceof Function)return this.importDbChunked(b,k);const W=this.#t.get(b)||this.nextAvailableSAH()||n("No available handles to import to."),H=k.byteLength;(H<512||H%512!=0)&&n("Byte array size is invalid for an SQLite db.");const Z="SQLite format 3";for(let C=0;Cthis)}isPaused(){return this.#e.isPaused()}}const ie=async()=>{const j=await navigator.storage.getDirectory(),b=".opfs-sahpool-sync-check-"+P(),H=(await(await j.getFileHandle(b,{create:!0})).createSyncAccessHandle()).close();return await H,await j.removeEntry(b),H?.then&&n("The local OPFS API is too old for opfs-sahpool:","it has an async FileSystemSyncAccessHandle.close() method."),!0};t.installOpfsSAHPoolVfs=async function(j=Object.create(null)){j=Object.assign(Object.create(null),$,j||{});const b=j.name;if(j.$testThrowPhase1)throw j.$testThrowPhase1;if(s[b])try{return await s[b]}catch(k){if(j.forceReinitIfPreviouslyFailed)delete s[b];else throw k}return!globalThis.FileSystemHandle||!globalThis.FileSystemDirectoryHandle||!globalThis.FileSystemFileHandle||!globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle||!navigator?.storage?.getDirectory?s[b]=Promise.reject(new Error("Missing required OPFS APIs.")):s[b]=ie().then(async function(){if(j.$testThrowPhase2)throw j.$testThrowPhase2;const k=new ne(j);return k.isReady.then(async()=>{const W=new se(k);if(t.oo1){const H=t.oo1,Z=k.getVfs(),E=function(...C){const M=H.DB.dbCtorHelper.normalizeArgs(...C);M.vfs=Z.$zName,H.DB.dbCtorHelper.call(this,M)};E.prototype=Object.create(H.DB.prototype),W.OpfsSAHPoolDb=E}return k.log("VFS initialized."),W}).catch(async W=>{throw await k.removeVfs().catch(()=>{}),W})}).catch(k=>s[b]=Promise.reject(k))}}),typeof i<"u"){const t=Object.assign(Object.create(null),{exports:typeof h>"u"?i.asm:h,memory:i.wasmMemory},globalThis.sqlite3ApiConfig||{});globalThis.sqlite3ApiConfig=t;let n;try{n=globalThis.sqlite3ApiBootstrap()}catch(r){throw console.error("sqlite3ApiBootstrap() error:",r),r}finally{delete globalThis.sqlite3ApiBootstrap,delete globalThis.sqlite3ApiConfig}i.sqlite3=n}else console.warn("This is not running in an Emscripten module context, so","globalThis.sqlite3ApiBootstrap() is _not_ being called due to lack","of config info for the WASM environment.","It must be called manually.")},fe=Oe,fe}})();const Yn=(function(){const qe=ft;if(!qe)throw new Error("Expecting globalThis.sqlite3InitModule to be defined by the Emscripten build.");const oe=globalThis.sqlite3InitModuleState=Object.assign(Object.create(null),{moduleScript:globalThis?.document?.currentScript,isWorker:typeof WorkerGlobalScope<"u",location:globalThis.location,urlParams:globalThis?.location?.href?new URL(globalThis.location.href).searchParams:new URLSearchParams});if(oe.debugModule=oe.urlParams.has("sqlite3.debugModule")?(...fe)=>console.warn("sqlite3.debugModule:",...fe):()=>{},oe.urlParams.has("sqlite3.dir"))oe.sqlite3Dir=oe.urlParams.get("sqlite3.dir")+"/";else if(oe.moduleScript){const fe=oe.moduleScript.src.split("/");fe.pop(),oe.sqlite3Dir=fe.join("/")+"/"}if(globalThis.sqlite3InitModule=function fe(...i){return qe(...i).then(ye=>{ye.runSQLite3PostLoadInit(ye);const be=ye.sqlite3;be.scriptInfo=oe,fe.__isUnderTest&&(be.__isUnderTest=!0);const Oe=be.asyncPostInit;return delete be.asyncPostInit,Oe()}).catch(ye=>{throw console.error("Exception loading sqlite3 module:",ye),ye})},globalThis.sqlite3InitModule.ready=qe.ready,globalThis.sqlite3InitModuleState.moduleScript){const fe=globalThis.sqlite3InitModuleState;let i=fe.moduleScript.src.split("/");i.pop(),fe.scriptDir=i.join("/")+"/"}return oe.debugModule("sqlite3InitModuleState =",oe),globalThis.sqlite3InitModule})();ft=Yn;var Zn=ft;globalThis.sqlite3Worker1Promiser=function qe(oe=qe.defaultConfig){if(arguments.length===1&&typeof arguments[0]=="function"){const re=oe;oe=Object.assign(Object.create(null),qe.defaultConfig),oe.onready=re}else oe=Object.assign(Object.create(null),qe.defaultConfig,oe);const fe=Object.create(null),i=function(){},ye=oe.onerror||i,be=oe.debug||i,Oe=oe.generateMessageId?void 0:Object.create(null),Xe=oe.generateMessageId||function(re){return re.type+"#"+(Oe[re.type]=(Oe[re.type]||0)+1)},Ce=(...re)=>{throw new Error(re.join(" "))};oe.worker||(oe.worker=qe.defaultConfig.worker),typeof oe.worker=="function"&&(oe.worker=oe.worker());let Pe,He;return oe.worker.onmessage=function(re){re=re.data,be("worker1.onmessage",re);let me=fe[re.messageId];if(!me){if(re&&re.type==="sqlite3-api"&&re.result==="worker1-ready"){oe.onready&&oe.onready(He);return}if(me=fe[re.type],me&&me.onrow){me.onrow(re);return}oe.onunhandled?oe.onunhandled(arguments[0]):ye("sqlite3Worker1Promiser() unhandled worker message:",re);return}switch(delete fe[re.messageId],re.type){case"error":me.reject(re);return;case"open":Pe||(Pe=re.dbId);break;case"close":re.dbId===Pe&&(Pe=void 0);break}try{me.resolve(re)}catch(Ie){me.reject(Ie)}},He=function(){let re;arguments.length===1?re=arguments[0]:arguments.length===2?(re=Object.create(null),re.type=arguments[0],re.args=arguments[1],re.dbId=re.args.dbId):Ce("Invalid arguments for sqlite3Worker1Promiser()-created factory."),!re.dbId&&re.type!=="open"&&(re.dbId=Pe),re.messageId=Xe(re),re.departureTime=performance.now();const me=Object.create(null);me.message=re;let Ie;re.type==="exec"&&re.args&&(typeof re.args.callback=="function"?(Ie=re.messageId+":row",me.onrow=re.args.callback,re.args.callback=Ie,fe[Ie]=me):typeof re.args.callback=="string"&&Ce("exec callback may not be a string when using the Promise interface."));let De=new Promise(function(je,Ve){me.resolve=je,me.reject=Ve,fe[re.messageId]=me,be("Posting",re.type,"message to Worker dbId="+(Pe||"default")+":",re),oe.worker.postMessage(re)});return Ie&&(De=De.finally(()=>delete fe[Ie])),De}};globalThis.sqlite3Worker1Promiser.defaultConfig={worker:function(){return new Worker(new URL("/assets/sqlite3-worker1-bundler-friendly-CqPDHTTx.js",import.meta.url),{type:"module"})},onerror:(...qe)=>console.error("worker1 promiser error",...qe)};sqlite3Worker1Promiser.v2=(function(qe){let oe;typeof qe=="function"?(oe=qe,qe={}):typeof qe?.onready=="function"&&(oe=qe.onready,delete qe.onready);const fe=Object.create(null);qe=Object.assign(qe||Object.create(null),{onready:async function(ye){try{oe&&await oe(ye),fe.resolve(ye)}catch(be){fe.reject(be)}}});const i=new Promise(function(ye,be){fe.resolve=ye,fe.reject=be});try{this.original(qe)}catch(ye){fe.reject(ye)}return i}).bind({original:sqlite3Worker1Promiser});sqlite3Worker1Promiser.v2;const er="japanese_app.db";let Ae=null;self.onmessage=async qe=>{const{type:oe,id:fe,sql:i,params:ye}=qe.data;try{switch(oe){case"start":{if(Ae!=null){self.postMessage({type:"success",id:fe,data:null});return}const be=await Zn({print:console.log,printErr:console.error}),Oe="/"+er;Ae=new be.oo1.OpfsDb(Oe,"rwt"),Ae.exec("PRAGMA foreign_keys = ON;"),self.postMessage({type:"success",id:fe,data:null});break}case"query":{if(Ae===null)throw new Error("БД не инициализирована");const be=Ae.selectObjects(i,ye??[]);self.postMessage({type:"success",id:fe,data:be});break}case"command":{if(Ae===null)throw new Error("БД не инициализирована");Ae.exec({sql:i,bind:ye??[]}),self.postMessage({type:"success",id:fe,data:null});break}case"close":{if(Ae===null)throw new Error("БД не инициализирована");Ae.close(),Ae=null,self.postMessage({type:"success",id:fe,data:null});break}}}catch(be){console.error(be),self.postMessage({type:"error",error:be?.message??String(be),id:fe})}}; diff --git a/dist/assets/index-Ban37OPN.js b/dist/assets/index-Ban37OPN.js new file mode 100644 index 0000000..6794e9b --- /dev/null +++ b/dist/assets/index-Ban37OPN.js @@ -0,0 +1,111 @@ +(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))o(s);new MutationObserver(s=>{for(const c of s)if(c.type==="childList")for(const u of c.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&o(u)}).observe(document,{childList:!0,subtree:!0});function a(s){const c={};return s.integrity&&(c.integrity=s.integrity),s.referrerPolicy&&(c.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?c.credentials="include":s.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function o(s){if(s.ep)return;s.ep=!0;const c=a(s);fetch(s.href,c)}})();const Se=new Worker(new URL("/assets/db-worker-DFFhVJkA.js",import.meta.url),{type:"module"});let dr=0,je=null;const We=new Map;function _n(){return je||(je=new Promise((e,n)=>{Se.onmessage=o=>{const s=o.data;if(s.type==="ready")return;const c=We.get(s.id);c&&(We.delete(s.id),s.type=="success"?c.resolve(s.data):c.reject(new Error(s.error??s.message??"Неизвестная ошибка Worker")))},Se.onerror=o=>{console.error("[SQLite Worker] Ошибка:",o),n(new Error("Ошибка Worker"))};const a=++dr;We.set(a,{resolve:e,reject:n}),Se.postMessage({type:"start",id:a})}),je)}function fr(e,n){return new Promise((a,o)=>{if(!Se){o(new Error("Worker не создан"));return}const s=++dr;We.set(s,{resolve:a,reject:o}),Se.postMessage({type:e,id:s,...n})})}async function pe(e,n){return await fr("query",{sql:e,params:n??[]})}async function Pn(e,n){await fr("command",{sql:e,params:n??[]})}function Sn(e){if(e==null)return[];const n=String(e).trim();return n?n.split(/[,\s;]+/).map(a=>a.trim()).filter(a=>a.length>0):[]}function Rn(e){const n=new Map;if(e==null)return n;const a=String(e);if(!a)return n;const o=a.split("");for(let s=0;s+10?`WHERE ${n.join(" AND ")}`:"",params:a}}async function In(e={}){const{clause:n,params:a}=hr(e),s=(await pe(`SELECT COUNT(*) as cnt FROM words ${n}`,a))[0]?.cnt;return typeof s=="number"?s:Number(s??0)}async function er(e={}){const{clause:n,params:a}=hr(e),o=Math.max(1,Math.min(e.limit??50,500)),s=Math.max(0,e.offset??0);return(await pe(`SELECT id, key, value, tags, more, group_id FROM words ${n} ORDER BY id LIMIT ? OFFSET ?`,[...a,o,s])).map(pr)}async function Jn(){return(await pe("SELECT id, name FROM word_groups ORDER BY id")).map(n=>({id:Number(n.id),name:String(n.name??"")}))}async function On(){return(await pe("SELECT id, name, forward, backward, filter FROM decks ORDER BY id")).map(n=>({id:Number(n.id),name:String(n.name??""),forward:String(n.forward??""),backward:String(n.backward??""),filter:String(n.filter??"")}))}async function Kn(e,n){return await Pn("UPDATE decks SET forward = ?, backward = ?, filter = ? WHERE id = ?",[n.forward,n.backward,n.filter,e]),Et(e)}async function Et(e){const a=(await pe("SELECT id, name, forward, backward, filter FROM decks WHERE id = ? LIMIT 1",[e]))[0];return a?{id:Number(a.id),name:String(a.name??""),forward:String(a.forward??""),backward:String(a.backward??""),filter:String(a.filter??"")}:null}async function Xn(){const e=await pe("SELECT deck_id, COUNT(*) as cnt FROM states WHERE deck_id IS NOT NULL GROUP BY deck_id"),n=new Map;for(const a of e){if(a.deck_id==null)continue;const o=a.cnt;n.set(Number(a.deck_id),typeof o=="number"?o:Number(o??0))}return n}async function zn(e){const a=(await pe("SELECT COUNT(DISTINCT word_id) as cnt FROM states WHERE deck_id = ?",[e]))[0]?.cnt;return typeof a=="number"?a:Number(a??0)}async function tr(e){const n=new Map,a=[...new Set(e.filter(s=>Number.isFinite(s)))];if(a.length===0)return n;const o=400;for(let s=0;s"?").join(","),g=await pe(`SELECT id, key, value, tags, more, group_id FROM words WHERE id IN (${u})`,c);for(const y of g.map(pr))n.set(y.id,y)}return n}function Dn(e,n){const a=new Map;a.set("key",e.key),a.set("value",e.value),a.set("tags",e.tagsList.join(", "));for(const o of n){const s=e.more.get(o.id)??"";if(s)for(const c of[o.identifier,o.name]){const u=c.trim().toLowerCase();!u||a.has(u)||a.set(u,s)}}return a}function rr(e,n){const a=[];for(const o of e.split(/\s+/)){const s=o.trim().toLowerCase();if(!s)continue;const c=(n.get(s)??"").trim();c&&a.push(c)}return a}async function nr(e,n){const o=(await pe("SELECT DISTINCT word_id as word_id FROM states WHERE deck_id = ?",[e])).map(s=>Number(s.word_id)).filter(s=>Number.isFinite(s));for(let s=o.length-1;s>0;s--){const c=Math.floor(Math.random()*(s+1));[o[s],o[c]]=[o[s],o[c]]}return o}async function gr(){return(await pe("SELECT id, name, identifier FROM custom_fields ORDER BY id")).map(n=>({id:Number(n.id),name:String(n.name??""),identifier:String(n.identifier??"")}))}const Ut="japanese_app.db";async function $t(){return navigator.storage.getDirectory()}async function Bn(e){e[18]=1,e[19]=1;const a=await(await $t()).getFileHandle(Ut,{create:!0}),o=a.createSyncAccessHandle;if(typeof o=="function")try{const c=await o.call(a);try{c.truncate(0),c.write(e,{at:0}),c.flush()}finally{c.close()}return}catch{}const s=await a.createWritable();try{await s.truncate(0);const c=new Uint8Array(e.length);c.set(e),await s.write(c)}finally{await s.close()}}async function Vn(){const e=await $t();let n;try{n=await e.getFileHandle(Ut)}catch{throw new Error("Локальная база не найдена — сначала скачай сохранение")}const a=await n.getFile();if(a.size===0)throw new Error("Локальная база пуста");return new Uint8Array(await a.arrayBuffer())}async function tt(){try{return(await(await(await $t()).getFileHandle(Ut)).getFile()).size>0}catch{return!1}}var Zn=ArrayBuffer,V=Uint8Array,Ae=Uint16Array,Yn=Int16Array,rt=Int32Array,gt=function(e,n,a){if(V.prototype.slice)return V.prototype.slice.call(e,n,a);(n==null||n<0)&&(n=0),(a==null||a>e.length)&&(a=e.length);var o=new V(a-n);return o.set(e.subarray(n,a)),o},Re=function(e,n,a,o){if(V.prototype.fill)return V.prototype.fill.call(e,n,a,o);for((a==null||a<0)&&(a=0),(o==null||o>e.length)&&(o=e.length);ae.length)&&(o=e.length);a2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],G=function(e,n,a){var o=new Error(n||jn[e]);if(o.code=e,Error.captureStackTrace&&Error.captureStackTrace(o,G),!a)throw o;return o},ar=function(e,n,a){for(var o=0,s=0;o>>0},An=function(e,n){var a=e[0]|e[1]<<8|e[2]<<16;if(a==3126568&&e[3]==253){var o=e[4],s=o>>5&1,c=o>>2&1,u=o&3,g=o>>6;o&8&&G(0);var y=6-s,m=u==3?4:u,C=ar(e,y,m);y+=m;var N=g?1<>3);$=T+(T>>3)*(e[5]&7)}$>2145386496&&G(1);var v=new V((n==1?E||$:n?0:$)+12);return v[0]=1,v[4]=4,v[8]=8,{b:y+N,y:0,l:0,d:C,w:n&&n!=1?n:v.subarray(12),e:$,o:new rt(v.buffer,0,3),u:E,c,m:Math.min(131072,$)}}else if((a>>4|e[3]<<20)==25481893)return Wn(e,4)+8;G(0)},Ee=function(e){for(var n=0;1<a&&G(3);for(var c=1<0;){var O=Ee(u+1),Q=o>>3,L=(1<>(o&7)&L,b=(1<b&&(U-=z)),E[++g]=--U,U==-1?(u+=U,M[--C]=g):u-=U,!U)do{var ee=o>>3;y=(e[ee]|e[ee+1]<<8)>>(o&7)&3,o+=2,g+=y}while(y==3)}(g>255||u)&&G(0);for(var D=0,re=(c>>1)+(c>>3)+3,Z=c-1,j=0;j<=g;++j){var _=E[j];if(_<1){$[j]=-_;continue}for(m=0;m<_;++m){M[D]=j;do D=D+re&Z;while(D>=C)}}for(D&&G(0),m=0;m>3,{b:s,s:M,n:S,t:T}]},ea=function(e,n){var a=0,o=-1,s=new V(292),c=e[n],u=s.subarray(0,256),g=s.subarray(256,268),y=new Ae(s.buffer,268);if(c<128){var m=Ie(e,n+1,6),C=m[0],N=m[1];n+=c;var E=C<<3,$=e[n];$||G(0);for(var T=0,v=0,M=N.b,S=M,O=(++n<<3)-8+Ee($);O-=M,!(O>3;if(T+=(e[Q]|e[Q+1]<<8)>>(O&7)&(1<>3,v+=(e[Q]|e[Q+1]<<8)>>(O&7)&(1<255&&G(0)}else{for(o=c-127;a>4,u[a+1]=L&15}++n}var U=0;for(a=0;a11&&G(0),U+=b&&1<0;--a){var j=y[a];Re(Z,a,j,y[a-1]=j+g[a]*(1<g&&N>3,$=(e[E]|e[E+1]<<8|e[E+2]<<16)>>(C&7);y=(y<>2,u=c<<1,g=c+u;Pe(e.subarray(o,o+=e[0]|e[1]<<8),n.subarray(0,c),a),Pe(e.subarray(o,o+=e[2]|e[3]<<8),n.subarray(c,u),a),Pe(e.subarray(o,o+=e[4]|e[5]<<8),n.subarray(u,g),a),Pe(e.subarray(o),n.subarray(g),a)},oa=function(e,n,a){var o,s=n.b,c=e[s],u=c>>1&3;n.l=c&1;var g=c>>3|e[s+1]<<5|e[s+2]<<13,y=(s+=3)+g;if(u==1)return s>=e.length?void 0:(n.b=s+1,a?(Re(a,e[s],n.y,n.y+=g),a):Re(new V(g),e[s]));if(!(y>e.length)){if(u==0)return n.b=y,a?(a.set(e.subarray(s,y),n.y),n.y+=g,a):gt(e,s,y);if(u==2){var m=e[s],C=m&3,N=m>>2&3,E=m>>4,$=0,T=0;C<2?N&1?E|=e[++s]<<4|(N&2&&e[++s]<<12):E=m>>3:(T=N,N<2?(E|=(e[++s]&63)<<4,$=e[s]>>6|e[++s]<<2):N==2?(E|=e[++s]<<4|(e[++s]&3)<<12,$=e[s]>>2|e[++s]<<6):(E|=e[++s]<<4|(e[++s]&63)<<12,$=e[s]>>6|e[++s]<<2|e[++s]<<10)),++s;var v=a?a.subarray(n.y,n.y+n.m):new V(n.m),M=v.length-E;if(C==0)v.set(e.subarray(s,s+=E),M);else if(C==1)Re(v,e[s++],M);else{var S=n.h;if(C==2){var O=ea(e,s);$+=s-(s=O[0]),n.h=S=O[1]}else S||G(0);(T?sa:Pe)(e.subarray(s,s+=$),v.subarray(M),S)}var Q=e[s++];if(Q){Q==255?Q=(e[s++]|e[s++]<<8)+32512:Q>127&&(Q=Q-128<<8|e[s++]);var L=e[s++];L&3&&G(0);for(var U=[ra,na,ta],b=2;b>-1;--b){var z=L>>(b<<1)+2&3;if(z==1){var B=new V([0,0,e[s++]]);U[b]={s:B.subarray(2,3),n:B.subarray(0,1),t:new Ae(B.buffer,0,1),b:0}}else z==2?(o=Ie(e,s,9-(b&1)),s=o[0],U[b]=o[1]):z==3&&(n.t||G(0),U[b]=n.t[b])}var ee=n.t=U,D=ee[0],re=ee[1],Z=ee[2],j=e[y-1];j||G(0);var _=(y<<3)-8+Ee(j)-Z.b,w=_>>3,x=0,q=(e[w]|e[w+1]<<8)>>(_&7)&(1<>3;var P=(e[w]|e[w+1]<<8)>>(_&7)&(1<>3;var R=(e[w]|e[w+1]<<8)>>(_&7)&(1<>3;var ve=1<>>(_&7)&ve-1);w=(_-=bt[$e])>>3;var se=ia[$e]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(_&7)&(1<>3;var ge=aa[he]+((e[w]|e[w+1]<<8|e[w+2]<<16)>>(_&7)&(1<>3,q=Z.t[q]+((e[w]|e[w+1]<<8)>>(_&7)&(1<>3,R=D.t[R]+((e[w]|e[w+1]<<8)>>(_&7)&(1<>3,P=re.t[P]+((e[w]|e[w+1]<<8)>>(_&7)&(1<3)n.o[2]=n.o[1],n.o[1]=n.o[0],n.o[0]=ne-=3;else{var Ue=ne-(ge!=0);Ue?(ne=Ue==3?n.o[0]-1:n.o[Ue],Ue>1&&(n.o[2]=n.o[1]),n.o[1]=n.o[0],n.o[0]=ne):ne=n.o[0]}for(var b=0;bse&&(ae=se);for(var b=0;b{throw t},o,s=console.log.bind(console),c=console.error.bind(console),u,g=!1,y,m=r=>r.startsWith("file://"),C=!1;function N(){return Ye.buffer}function E(){if(!B?.buffer?.resizable){var r=N();B=new Int8Array(r),Xe=new Int16Array(r),n.HEAPU8=q=new Uint8Array(r),Te=new Uint16Array(r),ze=new Int32Array(r),R=new Uint32Array(r),Rt=new Float32Array(r),It=new Float64Array(r),Mt=new BigInt64Array(r),Tt=new BigUint64Array(r)}}function $(){C=!0,He.A()}function T(r){r=`Aborted(${r})`,c(r),g=!0,r+=". Build with -sASSERTIONS for more info.",C&&Dt();var t=new WebAssembly.RuntimeError(r);throw t}var v;let M=()=>"";function S(r){if(r==v&&u)return new Uint8Array(u);throw"both async and sync fetching of the wasm failed"}async function O(r){if(!u)try{var t=await o(r);return new Uint8Array(t)}catch{}return S(r)}async function Q(r,t){try{var i=await O(r),l=await WebAssembly.instantiate(i,t);return l}catch(d){c(`failed to asynchronously prepare wasm: ${d}`),T(d)}}async function L(r,t,i){if(!r&&!m(t))try{var l=fetch(t,{credentials:"same-origin"}),d=await WebAssembly.instantiateStreaming(l,i);return d}catch(f){c(`wasm streaming compile failed: ${f}`),c("falling back to ArrayBuffer instantiation")}return Q(t,i)}function U(){var r={a:Ln};return r}async function b(){function r(f){return He=f.exports,Fn(He),E(),He}function t(f){return r(f.instance)}var i=U();v??=M();var l=await L(u,v,i),d=t(l);return d}class z{name="ExitStatus";constructor(t){this.message=`Program terminated with exit(${t})`,this.status=t}}var B,ee=()=>jt,D=r=>{var t=r.getArg(ee(),0);return Yt(t)},re=()=>Zt(),Z=r=>Bt(r),j=r=>Vt(r),_=globalThis.TextDecoder&&new TextDecoder,w=(r,t,i,l)=>{var d=t+i;if(l)return d;for(;r[t]&&!(t>=d);)++t;return t},x=(r,t=0,i,l)=>{var d=w(r,t,i,l);if(d-t>16&&r.buffer&&_)return _.decode(r.subarray(t,d));for(var f="";t>10,56320|H&1023)}}return f},q,P=(r,t,i)=>r?x(q,r,t,i):"",R,he=r=>{var t=re(),i=j(4),l=j(4);Gt(r,i,l);var d=R[i>>2],f=R[l>>2],p=P(d);fe(d);var h;return f&&(h=P(f),fe(f)),Z(t),[p,h]},le=r=>{var t=D(r);return he(t)},$e=r=>{var t=new WebAssembly.Exception(ee(),[r],{traceStack:!0});throw t.message=le(t),t},Ke=()=>T(""),ye={},xe=r=>{for(;r.length;){var t=r.pop(),i=r.pop();i(t)}};function ve(r){return this.fromWireType(R[r>>2])}var ne={},se={},ge={};class Ue extends Error{constructor(t){super(t),this.name="InternalError"}}var ue=r=>{throw new Ue(r)},ae=(r,t,i)=>{r.forEach(h=>ge[h]=t);function l(h){var k=i(h);k.length!==r.length&&ue("Mismatched type converter count");for(var H=0;H{d[h]=se[k],++p,p===f.length&&l(d)}));f.length===0&&l(d)},nt=r=>{var t=ye[r];delete ye[r];var i=t.rawConstructor,l=t.rawDestructor,d=t.fields,f=d.map(p=>p.getterReturnType).concat(d.map(p=>p.setterArgumentType));ae([r],f,p=>{var h={};for(var[k,H]of d.entries()){let F=p[k],K=H.getter,J=H.getterContext,X=p[k+d.length],W=H.setter,ie=H.setterContext;h[H.fieldName]={read:A=>F.fromWireType(K(J,A)),write:(A,Y)=>{var me=[];W(ie,A,X.toWireType(me,Y)),xe(me)},optional:F.optional}}return[{name:t.name,fromWireType:F=>{var K={};for(var J in h)K[J]=h[J].read(F);return l(F),K},toWireType:(F,K)=>{for(var J in h)if(!(J in K)&&!h[J].optional)throw new TypeError(`Missing field: "${J}"`);var X=i();for(J in h)h[J].write(X,K[J]);return F!==null&&F.push(l,X),X},readValueFromPointer:ve,destructorFunction:l}]})},te=r=>{for(var t="";;){var i=q[r++];if(!i)return t;t+=String.fromCharCode(i)}};class Me extends Error{constructor(t){super(t),this.name="BindingError"}}var I=r=>{throw new Me(r)};function Er(r,t,i={}){var l=t.name;if(r||I(`type "${l}" must have a positive integer typeid pointer`),se.hasOwnProperty(r)){if(i.ignoreDuplicateRegistrations)return;I(`Cannot register type '${l}' twice`)}if(se[r]=t,delete ge[r],ne.hasOwnProperty(r)){var d=ne[r];delete ne[r],d.forEach(f=>f())}}function de(r,t,i={}){return Er(r,t,i)}var Xe,Te,ze,Mt,Tt,Nt=(r,t,i)=>{switch(t){case 1:return i?l=>B[l]:l=>q[l];case 2:return i?l=>Xe[l>>1]:l=>Te[l>>1];case 4:return i?l=>ze[l>>2]:l=>R[l>>2];case 8:return i?l=>Mt[l>>3]:l=>Tt[l>>3];default:throw new TypeError(`invalid integer width (${t}): ${r}`)}},Ur=(r,t,i,l,d)=>{t=te(t);let f=l===0n,p=h=>h;if(f){let h=i*8;p=k=>BigInt.asUintN(h,k),d=p(d)}de(r,{name:t,fromWireType:p,toWireType:(h,k)=>(typeof k=="number"&&(k=BigInt(k)),k),readValueFromPointer:Nt(t,i,!f),destructorFunction:null})},$r=(r,t,i,l)=>{t=te(t),de(r,{name:t,fromWireType:function(d){return!!d},toWireType:function(d,f){return f?i:l},readValueFromPointer:function(d){return this.fromWireType(q[d])},destructorFunction:null})},xr=r=>({count:r.count,deleteScheduled:r.deleteScheduled,preservePointerOnDelete:r.preservePointerOnDelete,ptr:r.ptr,ptrType:r.ptrType,smartPtr:r.smartPtr,smartPtrType:r.smartPtrType}),at=r=>{function t(i){return i.$$.ptrType.registeredClass.name}I(t(r)+" instance already deleted")},it=!1,qt=r=>{},Mr=r=>{r.smartPtr?r.smartPtrType.rawDestructor(r.smartPtr):r.ptrType.registeredClass.rawDestructor(r.ptr)},Ht=r=>{r.count.value-=1;var t=r.count.value===0;t&&Mr(r)},Ne=r=>globalThis.FinalizationRegistry?(it=new FinalizationRegistry(t=>{Ht(t.$$)}),Ne=t=>{var i=t.$$,l=!!i.smartPtr;if(l){var d={$$:i};it.register(t,d,t)}return t},qt=t=>it.unregister(t),Ne(r)):(Ne=t=>t,r),Tr=()=>{let r=De.prototype;Object.assign(r,{isAliasOf(i){if(!(this instanceof De)||!(i instanceof De))return!1;var l=this.$$.ptrType.registeredClass,d=this.$$.ptr;i.$$=i.$$;for(var f=i.$$.ptrType.registeredClass,p=i.$$.ptr;l.baseClass;)d=l.upcast(d),l=l.baseClass;for(;f.baseClass;)p=f.upcast(p),f=f.baseClass;return l===f&&d===p},clone(){if(this.$$.ptr||at(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var i=Ne(Object.create(Object.getPrototypeOf(this),{$$:{value:xr(this.$$)}}));return i.$$.count.value+=1,i.$$.deleteScheduled=!1,i},delete(){this.$$.ptr||at(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&I("Object already scheduled for deletion"),qt(this),Ht(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||at(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&I("Object already scheduled for deletion"),this.$$.deleteScheduled=!0,this}});let t=Symbol.dispose;t&&(r[t]=r.delete)};function De(){}var Ft=(r,t)=>Object.defineProperty(t,"name",{value:r}),Lt={},st=(r,t,i)=>{if(r[t].overloadTable===void 0){var l=r[t];r[t]=function(...d){return r[t].overloadTable.hasOwnProperty(d.length)||I(`Function '${i}' called with an invalid number of arguments (${d.length}) - expects one of (${r[t].overloadTable})!`),r[t].overloadTable[d.length].apply(this,d)},r[t].overloadTable=[],r[t].overloadTable[l.argCount]=l}},Nr=(r,t,i)=>{n.hasOwnProperty(r)?(I(`Cannot register public name '${r}' twice`),st(n,r,r),n[r].overloadTable.hasOwnProperty(i)&&I(`Cannot register multiple overloads of a function with the same number of arguments (${i})!`),n[r].overloadTable[i]=t):(n[r]=t,n[r].argCount=i)},qr=48,Hr=57,Fr=r=>{r=r.replace(/[^a-zA-Z0-9_]/g,"$");var t=r.charCodeAt(0);return t>=qr&&t<=Hr?`_${r}`:r};function Lr(r,t,i,l,d,f,p,h){this.name=r,this.constructor=t,this.instancePrototype=i,this.rawDestructor=l,this.baseClass=d,this.getActualType=f,this.upcast=p,this.downcast=h,this.pureVirtualFunctions=[]}var ot=(r,t,i)=>{for(;t!==i;)t.upcast||I(`Expected null or instance of ${i.name}, got an instance of ${t.name}`),r=t.upcast(r),t=t.baseClass;return r},ct=r=>{if(r===null)return"null";var t=typeof r;return t==="object"||t==="array"||t==="function"?r.toString():""+r};function Qr(r,t){if(t===null)return this.isReference&&I(`null is not a valid ${this.name}`),0;t.$$||I(`Cannot pass "${ct(t)}" as a ${this.name}`),t.$$.ptr||I(`Cannot pass deleted object as a pointer of type ${this.name}`);var i=t.$$.ptrType.registeredClass,l=ot(t.$$.ptr,i,this.registeredClass);return l}function _r(r,t){var i;if(t===null)return this.isReference&&I(`null is not a valid ${this.name}`),this.isSmartPointer?(i=this.rawConstructor(),r!==null&&r.push(this.rawDestructor,i),i):0;(!t||!t.$$)&&I(`Cannot pass "${ct(t)}" as a ${this.name}`),t.$$.ptr||I(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&t.$$.ptrType.isConst&&I(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);var l=t.$$.ptrType.registeredClass;if(i=ot(t.$$.ptr,l,this.registeredClass),this.isSmartPointer)switch(t.$$.smartPtr===void 0&&I("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:t.$$.smartPtrType===this?i=t.$$.smartPtr:I(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:i=t.$$.smartPtr;break;case 2:if(t.$$.smartPtrType===this)i=t.$$.smartPtr;else{var d=t.clone();i=this.rawShare(i,dt.toHandle(()=>d.delete())),r!==null&&r.push(this.rawDestructor,i)}break;default:I("Unsupported sharing policy")}return i}function Pr(r,t){if(t===null)return this.isReference&&I(`null is not a valid ${this.name}`),0;t.$$||I(`Cannot pass "${ct(t)}" as a ${this.name}`),t.$$.ptr||I(`Cannot pass deleted object as a pointer of type ${this.name}`),t.$$.ptrType.isConst&&I(`Cannot convert argument of type ${t.$$.ptrType.name} to parameter type ${this.name}`);var i=t.$$.ptrType.registeredClass,l=ot(t.$$.ptr,i,this.registeredClass);return l}var Qt=(r,t,i)=>{if(t===i)return r;if(i.baseClass===void 0)return null;var l=Qt(r,t,i.baseClass);return l===null?null:i.downcast(l)},Sr={},Rr=(r,t)=>{for(t===void 0&&I("ptr should not be undefined");r.baseClass;)t=r.upcast(t),r=r.baseClass;return t},Ir=(r,t)=>(t=Rr(r,t),Sr[t]),Be=(r,t)=>{(!t.ptrType||!t.ptr)&&ue("makeClassHandle requires ptr and ptrType");var i=!!t.smartPtrType,l=!!t.smartPtr;return i!==l&&ue("Both smartPtrType and smartPtr must be specified"),t.count={value:1},Ne(Object.create(r,{$$:{value:t,writable:!0}}))};function Jr(r){var t=this.getPointee(r);if(!t)return this.destructor(r),null;var i=Ir(this.registeredClass,t);if(i!==void 0){if(i.$$.count.value===0)return i.$$.ptr=t,i.$$.smartPtr=r,i.clone();var l=i.clone();return this.destructor(r),l}function d(){return this.isSmartPointer?Be(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:t,smartPtrType:this,smartPtr:r}):Be(this.registeredClass.instancePrototype,{ptrType:this,ptr:r})}var f=this.registeredClass.getActualType(t),p=Lt[f];if(!p)return d.call(this);var h;this.isConst?h=p.constPointerType:h=p.pointerType;var k=Qt(t,this.registeredClass,h.registeredClass);return k===null?d.call(this):this.isSmartPointer?Be(h.registeredClass.instancePrototype,{ptrType:h,ptr:k,smartPtrType:this,smartPtr:r}):Be(h.registeredClass.instancePrototype,{ptrType:h,ptr:k})}var Or=()=>{Object.assign(Ve.prototype,{getPointee(r){return this.rawGetPointee&&(r=this.rawGetPointee(r)),r},destructor(r){this.rawDestructor?.(r)},readValueFromPointer:ve,fromWireType:Jr})};function Ve(r,t,i,l,d,f,p,h,k,H,F){this.name=r,this.registeredClass=t,this.isReference=i,this.isConst=l,this.isSmartPointer=d,this.pointeeType=f,this.sharingPolicy=p,this.rawGetPointee=h,this.rawConstructor=k,this.rawShare=H,this.rawDestructor=F,!d&&t.baseClass===void 0?l?(this.toWireType=Qr,this.destructorFunction=null):(this.toWireType=Pr,this.destructorFunction=null):this.toWireType=_r}var Kr=(r,t,i)=>{n.hasOwnProperty(r)||ue("Replacing nonexistent public symbol"),n[r].overloadTable!==void 0&&i!==void 0?n[r].overloadTable[i]=t:(n[r]=t,n[r].argCount=i)},Xr=r=>Wt.get(r),ce=(r,t,i=!1)=>{r=te(r);function l(){var f=Xr(t);return f}var d=l();return typeof d!="function"&&I(`unknown function pointer with signature ${r}: ${t}`),d};class zr extends Error{}var Dr=r=>{var t=Xt(r),i=te(t);return fe(t),i},Ze=(r,t)=>{var i=[],l={};function d(f){if(!l[f]&&!se[f]){if(ge[f]){ge[f].forEach(d);return}i.push(f),l[f]=!0}}throw t.forEach(d),new zr(`${r}: `+i.map(Dr).join([", "]))},Br=(r,t,i,l,d,f,p,h,k,H,F,K,J)=>{F=te(F),f=ce(d,f),h&&=ce(p,h),H&&=ce(k,H),J=ce(K,J);var X=Fr(F);Nr(X,function(){Ze(`Cannot construct ${F} due to unbound types`,[l])}),ae([r,t,i],l?[l]:[],W=>{W=W[0];var ie,A;l?(ie=W.registeredClass,A=ie.instancePrototype):A=De.prototype;var Y=Ft(F,function(...ht){if(Object.getPrototypeOf(this)!==me)throw new Me(`Use 'new' to construct ${F}`);if(oe.constructor_body===void 0)throw new Me(`${F} has no accessible constructor`);var At=oe.constructor_body[ht.length];if(At===void 0)throw new Me(`Tried to invoke ctor of ${F} with invalid number of parameters (${ht.length}) - expected (${Object.keys(oe.constructor_body).toString()}) parameters instead!`);return At.apply(this,ht)}),me=Object.create(A,{constructor:{value:Y}});Y.prototype=me;var oe=new Lr(F,Y,me,J,ie,f,h,H);oe.baseClass&&(oe.baseClass.__derivedClasses??=[],oe.baseClass.__derivedClasses.push(oe));var pt=new Ve(F,oe,!0,!1,!1),we=new Ve(F+"*",oe,!1,!1,!1),Ge=new Ve(F+" const*",oe,!1,!0,!1);return Lt[r]={pointerType:we,constPointerType:Ge},Kr(X,Y),[pt,we,Ge]})};function Vr(r){for(var t=1;t{for(var i=[],l=0;l>2]);return i},_t=r=>{r=r.trim();let t=r.indexOf("(");return t===-1?r:r.slice(0,t)},Zr=(r,t,i,l,d,f,p,h,k)=>{var H=ut(i,l);t=te(t),t=_t(t),f=ce(d,f,h),ae([],[r],F=>{F=F[0];var K=`${F.name}.${t}`;function J(){Ze(`Cannot call ${K} due to unbound types`,H)}t.startsWith("@@")&&(t=Symbol[t.substring(2)]);var X=F.registeredClass.constructor;return X[t]===void 0?(J.argCount=i-1,X[t]=J):(st(X,t,K),X[t].overloadTable[i-1]=J),ae([],H,W=>{var ie=[W[0],null].concat(W.slice(1)),A=lt(K,ie,null,f,p);if(X[t].overloadTable===void 0?(A.argCount=i-1,X[t]=A):X[t].overloadTable[i-1]=A,F.registeredClass.__derivedClasses)for(let Y of F.registeredClass.__derivedClasses)Y.constructor.hasOwnProperty(t)||(Y.constructor[t]=A);return[]}),[]})},Yr=(r,t,i,l,d,f)=>{var p=ut(t,i);d=ce(l,d),ae([],[r],h=>{h=h[0];var k=`constructor ${h.name}`;if(h.registeredClass.constructor_body===void 0&&(h.registeredClass.constructor_body=[]),h.registeredClass.constructor_body[t-1]!==void 0)throw new Me(`Cannot register multiple constructors with identical number of parameters (${t-1}) for class '${h.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return h.registeredClass.constructor_body[t-1]=()=>{Ze(`Cannot construct ${h.name} due to unbound types`,p)},ae([],p,H=>(H.splice(1,0,null),h.registeredClass.constructor_body[t-1]=lt(k,H,null,d,f),[])),[]})},Gr=(r,t,i,l,d,f,p,h,k,H)=>{var F=ut(i,l);t=te(t),t=_t(t),f=ce(d,f,k),ae([],[r],K=>{K=K[0];var J=`${K.name}.${t}`;t.startsWith("@@")&&(t=Symbol[t.substring(2)]),h&&K.registeredClass.pureVirtualFunctions.push(t);function X(){Ze(`Cannot call ${J} due to unbound types`,F)}var W=K.registeredClass.instancePrototype,ie=W[t];return ie===void 0||ie.overloadTable===void 0&&ie.className!==K.name&&ie.argCount===i-2?(X.argCount=i-2,X.className=K.name,W[t]=X):(st(W,t,J),W[t].overloadTable[i-2]=X),ae([],F,A=>{var Y=lt(J,A,K,f,p);return W[t].overloadTable===void 0?(Y.argCount=i-2,W[t]=Y):W[t].overloadTable[i-2]=Y,[]}),[]})},Pt=[],be=[0,1,,1,null,1,!0,1,!1,1],St=[],jr=r=>{if(r>9&&--be[r+1]===0){var t=be[r];be[r]=void 0;var i=St[r];i&&(St[r]=void 0,i(t)),Pt.push(r)}},dt={toValue:r=>(r||I(`Cannot use deleted val. handle = ${r}`),be[r]),toHandle:r=>{switch(r){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:{let t=Pt.pop()||be.length;return be[t]=r,be[t+1]=1,t}}}},Wr={name:"emscripten::val",fromWireType:r=>{var t=dt.toValue(r);return jr(r),t},toWireType:(r,t)=>dt.toHandle(t),readValueFromPointer:ve,destructorFunction:null},Ar=r=>de(r,Wr),Rt,It,en=(r,t)=>{switch(t){case 4:return function(i){return this.fromWireType(Rt[i>>2])};case 8:return function(i){return this.fromWireType(It[i>>3])};default:throw new TypeError(`invalid float width (${t}): ${r}`)}},tn=(r,t,i)=>{t=te(t),de(r,{name:t,fromWireType:l=>l,toWireType:(l,d)=>d,readValueFromPointer:en(t,i),destructorFunction:null})},rn=(r,t,i,l,d)=>{t=te(t);let f=l===0,p=k=>k;if(f){var h=32-8*i;p=k=>k<>>h,d=p(d)}de(r,{name:t,fromWireType:p,toWireType:(k,H)=>H,readValueFromPointer:Nt(t,i,l!==0),destructorFunction:null})},nn=(r,t,i)=>{var l=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array],d=l[t];function f(p){var h=R[p>>2],k=R[p+4>>2];return new d(B.buffer,k,h)}i=te(i),de(r,{name:i,fromWireType:f,readValueFromPointer:f},{ignoreDuplicateRegistrations:!0})},an=(r,t,i,l)=>{if(!(l>0))return 0;for(var d=i,f=i+l-1,p=0;p=f)break;t[i++]=h}else if(h<=2047){if(i+1>=f)break;t[i++]=192|h>>6,t[i++]=128|h&63}else if(h<=65535){if(i+2>=f)break;t[i++]=224|h>>12,t[i++]=128|h>>6&63,t[i++]=128|h&63}else{if(i+3>=f)break;t[i++]=240|h>>18,t[i++]=128|h>>12&63,t[i++]=128|h>>6&63,t[i++]=128|h&63,p++}}return t[i]=0,i-d},Jt=(r,t,i)=>an(r,q,t,i),Ot=r=>{for(var t=0,i=0;i=55296&&l<=57343?(t+=4,++i):t+=3}return t},sn=(r,t)=>{t=te(t),de(r,{name:t,fromWireType(i){var l=R[i>>2],d=i+4,f;return f=P(d,l,!0),fe(i),f},toWireType(i,l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));var d,f=typeof l=="string";f||ArrayBuffer.isView(l)&&l.BYTES_PER_ELEMENT==1||I("Cannot pass non-string to std::string"),f?d=Ot(l):d=l.length;var p=ft(4+d+1),h=p+4;return R[p>>2]=d,f?Jt(l,h,d+1):q.set(l,h),i!==null&&i.push(fe,p),p},readValueFromPointer:ve,destructorFunction(i){fe(i)}})},Kt=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,on=(r,t,i)=>{var l=r>>1,d=w(Te,l,t/2,i);if(d-l>16&&Kt)return Kt.decode(Te.subarray(l,d));for(var f="",p=l;p{if(i<2)return 0;i-=2;for(var l=t,d=i>1]=p,t+=2}return Xe[t>>1]=0,t-l},ln=r=>r.length*2,un=(r,t,i)=>{for(var l="",d=r>>2,f=0;!(f>=t/4);f++){var p=R[d+f];if(!p&&!i)break;l+=String.fromCodePoint(p)}return l},dn=(r,t,i=2147483647)=>{if(i<4)return 0;for(var l=t,d=l+i-4,f=0;f65535&&f++,ze[t>>2]=p,t+=4,t+4>d)break}return ze[t>>2]=0,t-l},fn=r=>{for(var t=0,i=0;i65535&&i++,t+=4}return t},pn=(r,t,i)=>{i=te(i);var l,d,f;t===2?(l=on,d=cn,f=ln):(l=un,d=dn,f=fn),de(r,{name:i,fromWireType:p=>{var h=R[p>>2],k=l(p+4,h*t,!0);return fe(p),k},toWireType:(p,h)=>{typeof h!="string"&&I(`Cannot pass non-string to C++ string type ${i}`);var k=f(h),H=ft(4+k+t);return R[H>>2]=k/t,d(h,H+4,k+t),p!==null&&p.push(fe,H),H},readValueFromPointer:ve,destructorFunction(p){fe(p)}})},hn=(r,t,i,l,d,f)=>{ye[r]={name:te(t),rawConstructor:ce(i,l),rawDestructor:ce(d,f),fields:[]}},gn=(r,t,i,l,d,f,p,h,k,H)=>{ye[r].fields.push({fieldName:te(t),getterReturnType:i,getter:ce(l,d),getterContext:f,setterArgumentType:p,setter:ce(h,k),setterContext:H})},wn=(r,t)=>{t=te(t),de(r,{isVoid:!0,name:t,fromWireType:()=>{},toWireType:(i,l)=>{}})},vn=()=>{},qe={},mn=r=>{if(r instanceof z||r=="unwind")return y;a(1,r)},yn=r=>{y=r,a(r,new z(r))},bn=r=>{if(!g)try{return r()}catch(t){mn(t)}},kn=()=>performance.now(),Cn=(r,t)=>{if(qe[r]&&(clearTimeout(qe[r].id),delete qe[r]),!t)return 0;var i=setTimeout(()=>{delete qe[r],bn(()=>zt(r,kn()))},t);return qe[r]={id:i,timeout_ms:t},0},En=()=>2147483648,Un=(r,t)=>Math.ceil(r/t)*t,$n=r=>{var t=Ye.buffer.byteLength,i=(r-t+65535)/65536|0;try{return Ye.grow(i),E(),1}catch{}},xn=r=>{var t=q.length;r>>>=0;var i=En();if(r>i)return!1;for(var l=1;l<=4;l*=2){var d=t*(1+.2/l);d=Math.min(d,r+100663296);var f=Math.min(i,Un(Math.max(r,d),65536)),p=$n(f);if(p)return!0}return!1},Mn=r=>52;function Tn(r,t,i,l){return 70}var Nn=[null,[],[]],qn=(r,t)=>{var i=Nn[r];!t||t===10?((r===1?s:c)(x(i)),i.length=0):i.push(t)},Hn=(r,t,i,l)=>{for(var d=0,f=0;f>2],h=R[t+4>>2];t+=8;for(var k=0;k>2]=d,0};Tr(),Or(),n.wasmBinary&&(u=n.wasmBinary),n.UTF8ToString=P,n.stringToUTF8=Jt,n.lengthBytesUTF8=Ot;var Xt,ft,fe,zt,Dt,Bt,Vt,Zt,Yt,Gt,jt,Ye,Wt;function Fn(r){Xt=r.B,ft=n._malloc=r.C,fe=n._free=r.D,zt=r.F,Dt=r.G,Bt=r.H,Vt=r.I,Zt=r.J,Yt=r.K,Gt=r.L,Ye=r.z,Wt=r.E,jt=r.M}var Ln={t:$e,x:Ke,f:nt,i:Ur,l:$r,o:Br,b:Zr,n:Yr,d:Gr,y:Ar,h:tn,c:rn,a:nn,k:sn,g:pn,j:hn,e:gn,m:wn,w:vn,p:Cn,u:xn,s:Mn,q:Tn,r:Hn,v:yn};async function Qn(){!g&&$()}var He;return He=await b(),await Qn(),n}var da=ua,fa=new Int8Array([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,90,63,64,65,66,-1,67,68,69,70,71,-1,72,73,52,53,54,55,56,57,58,59,60,61,74,75,76,77,78,79,80,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,81,-1,82,83,84,85,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,86,87,88,89,-1]);function pa(e){let n=new Uint8Array(170930),a=0,o=0,s=0,c=-1;for(let u=0,g=e.length;u127)continue;let m=fa[y];if(!(m<0))if(c<0)c=m;else{c+=m*91,o|=c<88?13:14;do n[a++]=o,o>>>=8,s-=8;while(s>7);c=-1}}return c>=0&&(n[a++]=(o|c<""})}function wa(){kt=void 0}var va=class{_module;constructor(e){this._module=e}malloc(e){let n=this._module._malloc(e);return{ptr:n,size:e,dispose:()=>this.free({ptr:n,size:e,dispose:()=>{}})}}free(e){this._module._free(e.ptr)}dataToHeap(e){let n=this.malloc(e.byteLength);return this._module.HEAPU8.set(e,n.ptr),n}heapView(e){return this._module.HEAPU8.subarray(e.ptr,e.ptr+e.size)}heapToUint8Array(e){return new Uint8Array([...this.heapView(e)])}lengthBytes(e){return this._module.lengthBytesUTF8(e)}stringToHeap(e){let n=this.lengthBytes(e)+1,a=this._module._malloc(n);return this._module.stringToUTF8(e,a,n),{ptr:a,size:n,dispose:()=>this.free({ptr:a,size:n,dispose:()=>{}})}}heapToString(e){return this._module.UTF8ToString(e.ptr,e.size)}hasFilesystem(){let e=this._module;return e.FS_createPath!==void 0&&e.FS_createDataFile!==void 0&&e.FS_preloadFile!==void 0&&e.FS_unlink!==void 0}createPath(e,n=!0,a=!0){return this._module.FS_createPath("/",e,n,a)}createDataFile(e,n,a=!0,o=!0,s=!0){return this._module.FS_createDataFile("/",e,n,a,o,s)}preloadFile(e,n,a=!0,o=!0,s=!1,c=!0,u=!1){return this._module.FS_preloadFile("/",e,n,a,o,s,c,u)}unlink(e){return this._module.FS_unlink(e)}},Fe,ma=4294967295;function Le(e,n){if(!Number.isInteger(e)||e<0||e>ma)throw new Error(`${n} length ${e} is outside the WASM32-safe range`)}function wt(e){if(e.length===0)return new Uint8Array(0);if(e.length===1)return e[0];let n=0;for(let s of e)n+=s.length;let a=new Uint8Array(n),o=0;for(let s of e)a.set(s,o),o+=s.length;return a}var ya=class vr{_mainModule;_zstdClass;_zstd;_compressionLevel;_decompressFrameCompleted=!1;_decompressRemaining=0;_decompressSawInput=!1;constructor(n){this._mainModule=new va(n),this._zstdClass=n.zstd,this._zstd=new this._zstdClass,this._compressionLevel=this._zstdClass.defaultCLevel()}static load(){return Fe||(Fe=ga().then(n=>new vr(n))),Fe}static unload(){wa(),Fe?.then(n=>{n?._zstd?.delete()}),Fe=void 0}copyHeap(n){return this._mainModule.heapView(n).slice()}mallocChecked(n,a){Le(n,a);let o=this._mainModule.malloc(n);if(!o.ptr)throw this._mainModule.free(o),new Error(`Failed to allocate ${n} bytes for ${a}`);return o}throwStreamError(n,a){throw new Error(`${n} failed: ${a.errorName||"unknown error"}`)}ensureStreamOk(n,a){a.error&&this.throwStreamError(n,a)}version(){return this._zstdClass.version()}reset(){let n=this._zstd.reset();this.ensureStreamOk("reset",n),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}resetCompression(n){n!==void 0&&(this._compressionLevel=n);let a=this._zstd.resetCompression(this._compressionLevel);this.ensureStreamOk("resetCompression",a)}resetDecompression(){let n=this._zstd.resetDecompression();this.ensureStreamOk("resetDecompression",n),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}setCompressionLevel(n){let a=this._zstd.setCompressionLevel(n);this.ensureStreamOk("setCompressionLevel",a),this._compressionLevel=n}compress(n,a=this.defaultCLevel()){Le(n.length,"compress input");let o=this._mainModule.dataToHeap(n);try{if(!o.ptr&&n.length>0)throw new Error("Failed to allocate compress input buffer");let s=this._zstdClass.compressBound(n.length),c=this.mallocChecked(s,"compress output");try{if(c.size=this._zstdClass.compress(c.ptr,s,o.ptr,o.size,a),this._zstdClass.isError(c.size))throw new Error(`compress failed: ${this._zstdClass.getErrorName(c.size)}`);return this.copyHeap(c)}finally{this._mainModule.free(c)}}finally{this._mainModule.free(o)}}compressChunk(n){if(Le(n.length,"compressChunk input"),n.length===0)return new Uint8Array(0);let a=this._mainModule.dataToHeap(n);try{if(!a.ptr)throw new Error("Failed to allocate compressChunk input buffer");let o=this._zstdClass.CStreamOutSize(),s=[],c=0;for(;c0&&(u.size=g.produced,s.push(this.copyHeap(u)))}finally{this._mainModule.free(u)}}return wt(s)}finally{this._mainModule.free(a)}}compressEnd(){let n=this._zstdClass.CStreamOutSize(),a=[],o=1;for(;o!==0;){let s=this.mallocChecked(n,"compressEnd output");try{let c=this._zstd.compressEnd(s.ptr,n);if(this.ensureStreamOk("compressEnd",c),c.produced===0&&c.remaining!==0)throw new Error("compressEnd failed: no progress while finishing stream");o=c.remaining,c.produced>0&&(s.size=c.produced,a.push(this.copyHeap(s)))}finally{this._mainModule.free(s)}}return wt(a)}frameContentSize(n){return this._zstdClass.getFrameContentSize(n.ptr,n.size)}decompress(n){Le(n.length,"decompress input");let a=this._mainModule.dataToHeap(n);try{if(!a.ptr&&n.length>0)throw new Error("Failed to allocate decompress input buffer");let o=this.frameContentSize(a);if(o.error)throw new Error(`Failed to get frame content size: ${o.errorName}`);let s=o.known;if(s){let c=this._zstdClass.findFrameCompressedSize(a.ptr,a.size);if(this._zstdClass.isError(c))throw new Error(`Failed to find frame compressed size: ${this._zstdClass.getErrorName(c)}`);c0?a.ptr+c:0,C=this._zstd.decompressChunk(g.ptr,o,m,y);if(this.ensureStreamOk("decompressChunk",C),C.consumed===0&&C.produced===0){if(y===0){C.remaining>0&&(this._decompressRemaining=C.remaining);break}throw new Error("decompressChunk failed: no progress while consuming input")}c+=C.consumed,u=C.produced===o&&C.remaining!==0,C.produced>0&&(g.size=C.produced,s.push(this.copyHeap(g))),C.remaining===0?(this._decompressFrameCompleted=!0,this._decompressRemaining=0):this._decompressRemaining=C.remaining}finally{this._mainModule.free(g)}}return wt(s)}finally{this._mainModule.free(a)}}decompressEnd(){if(!this._decompressSawInput)throw new Error("decompressEnd failed: empty compressed input is not a completed frame");if(!this._decompressFrameCompleted||this._decompressRemaining!==0)throw new Error("decompressEnd failed: truncated Zstandard input")}defaultCLevel(){return this._zstdClass.defaultCLevel()}minCLevel(){return this._zstdClass.minCLevel()}maxCLevel(){return this._zstdClass.maxCLevel()}};let vt=null;function ba(){return vt||(vt=ya.load()),vt}function ka(e){return e.length>=4&&e[0]===40&&e[1]===181&&e[2]===47&&e[3]===253}function Ct(e){const n="SQLite format 3\0";if(e.length/g,">").replace(/"/g,""").replace(/'/g,"'")}function sr(e,n,a){const o=e.tagsList[0]??"",s=e.tagsList.length>1?` +${e.tagsList.length-1}`:"",c=Ce(e.tagsList.join(", ")),u=o?`${Ce(o)}${s}`:"",g=e.more.size>0?'':"";return`
`+(a?mr(e,n):"")+"
"}function mr(e,n){const a=[...e.more.entries()].map(([o,s])=>{const c=n.get(o);return`
${c?Ce(c.name):`Поле #${o}`}
${Ce(s)}
`}).join("");return a?`
${a}
`:""}function Ea(e,n){e.innerHTML=` + +
+

📚 Слова

+
+ + +
+

+
База ещё не проверена.
+
+
+
+ `;const a=e.querySelector("#home-db-banner"),o=e.querySelector("#home-db-text"),s=e.querySelector("#home-db-go"),c=e.querySelector("#words-search"),u=e.querySelector("#words-group"),g=e.querySelector("#words-count"),y=e.querySelector("#words-status"),m=e.querySelector("#words-list"),C=e.querySelector("#words-more");function N(w,x){a.hidden=!1,o.textContent=w,s.hidden=!1}function E(){a.hidden=!0}s.addEventListener("click",()=>{document.querySelector('.drawer-btn[data-page="sync"]')?.click()});let $=!1,T=new Map,v=0,M=[],S=null,O=0,Q=!1,L=0,U=0;function b(){const w=u.value;if(w==="")return{search:c.value.trim(),groupId:null};const x=Number(w);return{search:c.value.trim(),groupId:Number.isFinite(x)?x:null}}function z(){C.hidden=!($&&M.lengthsr(w,T,w.id===S)).join(""),g.textContent=v>0?`Показано ${M.length} из ${v}`:"",z()}function ee(w){if(S===w){w!=null&&D(w),S=null;return}S!=null&&D(S),S=w,w!=null&&re(w)}function D(w){const x=m.querySelector(`.word-row-wrap[data-word-id="${w}"]`);if(!x)return;const q=x.querySelector(".word-row"),P=x.querySelector(".word-extra");q&&(q.classList.remove("open"),q.setAttribute("aria-expanded","false")),P&&(P.hidden=!0,P.innerHTML="")}function re(w){const x=M.find(he=>he.id===w),q=m.querySelector(`.word-row-wrap[data-word-id="${w}"]`);if(!x||!q)return;const P=q.querySelector(".word-row"),R=q.querySelector(".word-extra");P&&(P.classList.add("open"),P.setAttribute("aria-expanded","true")),R&&(R.hidden=!1,R.innerHTML=mr(x,T))}function Z(w){y.textContent=w,y.hidden=w===""}async function j(){if(!$||Q)return;Q=!0;const w=++L,x=b();C.disabled=!0,M.length===0&&Z("Загрузка слов…");try{const[q,P]=await Promise.all([In({search:x.search,groupId:x.groupId??void 0}),er({search:x.search,groupId:x.groupId??void 0,limit:ir,offset:0})]);if(w!==L)return;v=q,M=P,O=P.length,S!=null&&!M.some(R=>R.id===S)&&(S=null),B(),Z(P.length===0?"По этому запросу слов нет.":""),P.length===0&&v===0&&(g.textContent="Слов в базе пока нет.")}catch(q){if(w!==L)return;Z(`Не удалось загрузить слова: ${q instanceof Error?q.message:String(q)}`)}finally{w===L&&(Q=!1,C.disabled=!1,z())}}async function _(){if(!$||Q||M.length>=v)return;Q=!0;const w=++L,x=b();C.disabled=!0,C.textContent="Загрузка…";try{const q=await er({search:x.search,groupId:x.groupId??void 0,limit:ir,offset:O});if(w!==L)return;M=M.concat(q),O+=q.length,m.insertAdjacentHTML("beforeend",q.map(P=>sr(P,T,P.id===S)).join("")),g.textContent=`Показано ${M.length} из ${v}`,z()}catch(q){if(w!==L)return;Z(`Не удалось догрузить: ${q instanceof Error?q.message:String(q)}`)}finally{w===L&&(Q=!1,C.disabled=!1,z())}}c.addEventListener("input",()=>{window.clearTimeout(U),U=window.setTimeout(()=>{j()},300)}),c.addEventListener("keydown",w=>{w.key==="Enter"&&(window.clearTimeout(U),j())}),u.addEventListener("change",()=>{j()}),C.addEventListener("click",()=>{_()}),m.addEventListener("click",w=>{const x=w.target.closest(".word-row");if(!x||x.disabled)return;const q=Number(x.dataset.wordId);Number.isFinite(q)&&ee(S===q?null:q)}),(async()=>{if(!await tt()){N("Локальной базы нет — скачай сохранение."),Z("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),g.textContent="";return}try{const x=await Vn();if(!Ct(x)){N("Файл в OPFS не похож на SQLite — перекачай сохранение.",!0),Z("Файл в OPFS не похож на SQLite — перекачай сохранение.");return}E();try{const[P,R]=await Promise.all([Jn(),gr()]),he=P;T=new Map(R.map(le=>[le.id,le])),u.innerHTML=''+he.map(le=>``).join(""),$=!0,await j(),u.options[0].textContent=`Все группы (${v})`}catch(P){Z(`БД есть, но слова не прочитались: ${P instanceof Error?P.message:String(P)}`)}}catch(x){N(`Не удалось прочитать базу: ${x instanceof Error?x.message:String(x)}`)}})()}function or(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function Ua(e){const n=e%10,a=e%100;return n===1&&a!==11?"запись":n>=2&&n<=4&&(a<12||a>14)?"записи":"записей"}function $a(e,n){const a=or(e.name)||`Колода #${e.id}`;return`
`}function xa(e,n){e.innerHTML=` +
+

🗂️ Колоды

+

+
Проверка локальной базы…
+
+
+ `;const a=e.querySelector("#decks-count"),o=e.querySelector("#decks-status"),s=e.querySelector("#decks-list");function c(u){o.textContent=u,o.hidden=u===""}s.addEventListener("click",u=>{const g=u.target.closest("[data-act]");if(!g)return;const y=Number(g.dataset.deckId);Number.isFinite(y)&&(g.dataset.act==="review"?n.goReview(y):n.goDeck(y))}),(async()=>{if(!await tt()){c("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),a.textContent="";return}c("Загрузка колод…");try{const[g,y]=await Promise.all([On(),Xn()]);if(g.length===0){a.textContent="Колоды пока отсутствуют.",c(""),s.innerHTML="";return}a.textContent=`Всего: ${g.length}`,c(""),s.innerHTML=g.map(m=>$a(m,y.get(m.id)??0)).join("")}catch(g){c(`Не удалось загрузить колоды: ${g instanceof Error?g.message:String(g)}`)}})()}function Ma(e){return e?Ta(e):'—'}function Ta(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function mt(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function Na(e){const n=e%10,a=e%100;return n===1&&a!==11?"слово":n>=2&&n<=4&&(a<12||a>14)?"слова":"слов"}function qa(e,n,a){e.innerHTML=` + +
+

Колода…

+
Загрузка колоды…
+
+
+ `;const o=e.querySelector("#deck-back"),s=e.querySelector("#deck-title"),c=e.querySelector("#deck-status"),u=e.querySelector("#deck-body");o.addEventListener("click",()=>a.goDecks()),(async()=>{if(!await tt()){s.textContent="Колода недоступна",c.textContent="Нет локальной базы — скачай сохранение на странице «Синхронизация».";return}let y=null;try{y=await Et(n)}catch(U){s.textContent="Колода недоступна",c.textContent=`Не удалось загрузить колоду: ${U instanceof Error?U.message:String(U)}`;return}if(!y){s.textContent="Колода не найдена",c.textContent=`Колоды с id=${n} нет в локальной базе. Возможно, база обновилась — вернись к списку.`;return}const m=y;s.textContent=m.name||`Колода #${m.id}`,c.hidden=!0;let C=null;try{C=await zn(m.id)}catch(U){c.hidden=!1,c.textContent=`Данные колоды загружены, а количество слов — нет: ${U instanceof Error?U.message:String(U)}`}u.innerHTML=` +
+
id
${m.id}
+
name
${Ma(m.name)}
+
+
+ + + + + + +
+ +
+

+
+

📚 ${C==null?"Количество слов неизвестно":`${C} ${Na(C)}`}

+
+ +
+ `;const N=u.querySelector("#deck-form"),E=u.querySelector("#deck-forward"),$=u.querySelector("#deck-backward"),T=u.querySelector("#deck-filter"),v=u.querySelector("#deck-save"),M=u.querySelector("#deck-form-status");u.querySelector("#deck-review").addEventListener("click",()=>a.goReview(m.id));const O=()=>`${E.value} +${$.value} +${T.value}`;let Q=O();function L(){v.disabled=O()===Q||v.dataset.busy==="1"}for(const U of[E,$,T])U.addEventListener("input",L);L(),N.addEventListener("submit",U=>{U.preventDefault(),!v.disabled&&(v.dataset.busy="1",v.disabled=!0,v.textContent="Сохранение…",M.textContent="",(async()=>{try{const b=await Kn(m.id,{forward:E.value,backward:$.value,filter:T.value});if(!b){M.textContent="Колода пропала из базы — вернись к списку.";return}E.value=b.forward,$.value=b.backward,T.value=b.filter,Q=O(),M.textContent="✅ Сохранено в локальную базу."}catch(b){M.textContent=`Не удалось сохранить: ${b instanceof Error?b.message:String(b)}`}finally{delete v.dataset.busy,v.textContent="💾 Сохранить",L()}})())})})()}function Ha(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const Fa=[{label:"😞 Не получилось",cls:"grade-fail"},{label:"😟 Тяжело",cls:"grade-hard"},{label:"🙂 Хорошо",cls:"grade-good"},{label:"🤩 Легко",cls:"grade-easy"}];function La(e,n,a){e.innerHTML=` + +
+

Повторение…

+

+
Загрузка карточек…
+
+
+ `;const o=e.querySelector("#review-back"),s=e.querySelector("#review-title"),c=e.querySelector("#review-progress"),u=e.querySelector("#review-status"),g=e.querySelector("#review-body");o.addEventListener("click",()=>a.goDecks());function y(L){u.textContent=L,u.hidden=L===""}let m=[],C=new Map,N=[],E="",$="",T=0,v=!1;function M(L,U){return L.length===0?`
—
`:`
`+L.map(b=>`

${Ha(b)}

`).join("")+"
"}function S(){const L=C.get(m[T]);if(!L){g.innerHTML="",c.textContent="",y("Слово пропало из базы — пропускаю.");return}const U=Dn(L,N),b=rr(E,U),z=v?rr($,U):null;c.textContent=`Карточка ${T+1} из ${m.length}`,y("");const B=v?M(z??[],"review-back-side"):'

Тап — показать ответ

',ee=v?`
+ ${Fa.map(D=>``).join("")} +
`:"";g.innerHTML=` + + ${ee} + `,g.querySelector("#review-card").addEventListener("click",()=>{v||(v=!0,S())}),g.querySelectorAll(".review-grade").forEach(D=>{D.addEventListener("click",()=>{T+=1,v=!1,T>=m.length?O():S()})})}function O(){c.textContent=`Готово: ${m.length} из ${m.length}`,y(""),g.innerHTML=` +

Все карточки сессии просмотрены. Запись оценок — следующим шагом.

+
+ +
+ `,g.querySelector("#review-again").addEventListener("click",()=>{Q()})}async function Q(){if(y("Перемешиваю…"),g.innerHTML="",c.textContent="",m=await nr(n),T=0,v=!1,m.length===0){y("В колоде нет слов для повторения.");return}C=await tr(m),S()}(async()=>{if(!await tt()){s.textContent="Повторение недоступно",y("Нет локальной базы — скачай сохранение на странице «Синхронизация».");return}try{const[U,b]=await Promise.all([Et(n),gr()]);if(!U){s.textContent="Колода не найдена",y(`Колоды с id=${n} нет в локальной базе. Вернись к списку.`);return}if(N=b,E=U.forward,$=U.backward,s.textContent=U.name||`Колода #${U.id}`,m=await nr(U.id),m.length===0){c.textContent="",y("В колоде нет слов для повторения.");return}C=await tr(m),T=0,v=!1,S()}catch(U){s.textContent="Повторение недоступно",y(`Не удалось загрузить карточки: ${U instanceof Error?U.message:String(U)}`)}})()}const cr=24,Qa=/^[A-Za-z0-9]{24}$/,yr="japlearn_sync_token";function lr(e){return e.trim().replace(/\s+/g,"")}function Qe(e){return Qa.test(e)}function _a(){try{return localStorage.getItem(yr)??""}catch{return""}}function ur(e){try{localStorage.setItem(yr,e)}catch{}}const br="https://learning.micialware.ru";function Pa(e,n=br){return`${n.replace(/\/+$/,"")}/download/${encodeURIComponent(e)}`}async function Sa(e,n,a=br){const o=Pa(e,a);let s;try{s=await fetch(o,{method:"GET",...n})}catch(u){throw new Error(`Нет связи с сервером: ${u instanceof Error?u.message:String(u)}`)}if(!s.ok)throw s.status===404?new Error("Сохранение не найдено (404). Проверь токен."):new Error(`Сервер ответил ${s.status} ${s.statusText}`);const c=await s.arrayBuffer();if(c.byteLength===0)throw new Error("Сервер вернул пустой файл");return new Uint8Array(c)}function Ra(e){e.innerHTML=` +
+

📡 Синхронизация

+

Токен сохранения — 24 символа: латинские буквы и цифры.

+ + + +
+ + 0 / 24 +
+ +
+ +
+ +

Введите токен из 24 символов

+
+ `;const n=e.querySelector("#token-input"),a=e.querySelector("#token-error"),o=e.querySelector("#token-counter"),s=e.querySelector("#btn-download"),c=e.querySelector("#status");function u(E){c.textContent=E,console.log(`[JapLearn] ${E}`)}function g(){return lr(n.value)}function y(E){s.disabled=E||!Qe(g()),n.disabled=E}function m(){const E=g(),$=E.length;o.textContent=`${$} / ${cr}`;const T=Qe(E),v=$===0;n.classList.toggle("invalid",!v&&!T),n.setAttribute("aria-invalid",String(!v&&!T)),v?a.textContent="":$!==cr?a.textContent=`Нужно 24 символа, сейчас ${$}`:a.textContent=T?"":"Только латинские буквы и цифры",s.disabled=!T}async function C(){const E=g();if(Qe(E)){ur(E),y(!0),u("Скачивание сохранения...");try{const $=await Sa(E);u(`Скачано ${($.length/1024).toFixed(1)} КБ, распаковка...`);const T=await Ca($);u(`Распаковано ${(T.length/1024).toFixed(1)} КБ, сохранение в OPFS...`),await Bn(T),u(`Готово: база ${(T.length/1024).toFixed(1)} КБ сохранена локально (OPFS).`)}catch($){u(`Ошибка скачивания: ${$ instanceof Error?$.message:String($)}`)}finally{y(!1),m()}}}n.addEventListener("input",()=>{m()}),n.addEventListener("change",()=>{const E=g();n.value=E,Qe(E)&&(ur(E),u("Токен сохранён локально. Можно скачивать.")),m()}),s.addEventListener("click",()=>{C()});const N=_a();N&&(n.value=N),m(),Qe(lr(N))&&u("Токен восстановлен. Нажми «Скачать», чтобы получить базу.")}const Ia={home:"Главная",decks:"Колоды",deck:"Колода",review:"Повторение",sync:"Синхронизация"};function Je(e){const n=document.getElementById(e);if(!n)throw new Error(`[JapLearn] Не найден элемент #${e}`);return n}const kr=Je("burger-btn"),et=Je("drawer"),Cr=Je("drawer-overlay"),Ja=Je("page-title"),_e=Je("page");let xt=!1;function Oe(e){xt=e,et.classList.toggle("open",e),Cr.hidden=!e,kr.setAttribute("aria-expanded",String(e)),et.setAttribute("aria-hidden",String(!e)),document.body.classList.toggle("drawer-open",e)}function Oa(e){et.querySelectorAll(".drawer-btn").forEach(n=>{n.classList.toggle("active",n.dataset.page===e)})}function ke(e,n){Ja.textContent=Ia[e],Oa(e==="deck"||e==="review"?"decks":e),e==="home"?Ea(_e):e==="decks"?xa(_e,{goDeck:a=>ke("deck",a),goReview:a=>ke("review",a)}):e==="deck"?qa(_e,n??0,{goDecks:()=>ke("decks"),goReview:a=>ke("review",a)}):e==="review"?La(_e,n??0,{goDecks:()=>ke("decks")}):Ra(_e)}kr.addEventListener("click",()=>{Oe(!xt)});Cr.addEventListener("click",()=>{Oe(!1)});document.addEventListener("keydown",e=>{e.key==="Escape"&&xt&&Oe(!1)});et.querySelectorAll(".drawer-btn").forEach(e=>{e.addEventListener("click",()=>{const n=e.dataset.page;(n==="home"||n==="decks"||n==="sync")&&ke(n),Oe(!1)})});await _n();Oe(!1);ke("home");console.log("[JapLearn] crossOriginIsolated =",window.crossOriginIsolated); diff --git a/dist/assets/index-u8F3m7-8.css b/dist/assets/index-DkBF5-AQ.css similarity index 73% rename from dist/assets/index-u8F3m7-8.css rename to dist/assets/index-DkBF5-AQ.css index 9daad16..a10cdae 100644 --- a/dist/assets/index-u8F3m7-8.css +++ b/dist/assets/index-DkBF5-AQ.css @@ -1 +1 @@ -:root{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.5;color:#1e1b2e;background:#f4f1fa}*{box-sizing:border-box}body{margin:0;min-height:100dvh;display:flex;justify-content:center;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)}#app{width:100%;max-width:480px;padding:24px 16px 32px;display:flex;flex-direction:column;gap:16px}.app-header h1{margin:0;font-size:1.75rem;letter-spacing:.02em}.app-subtitle{margin:4px 0 0;color:#6d6390}.top-bar{display:flex;align-items:center;gap:12px}.burger-btn{width:44px;height:44px;border:2px solid #d9d2f0;border-radius:12px;background:#fff;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;touch-action:manipulation;flex:none}.burger-btn span{display:block;width:20px;height:2px;border-radius:2px;background:#4c446b}.burger-btn[aria-expanded=true]{border-color:#7c3aed}.top-bar-title h1{margin:0;font-size:1.4rem;line-height:1.2}.top-bar-title p{margin:0;font-size:.9rem;color:#6d6390}.top-bar-spacer{flex:1}.app-content{display:flex;flex-direction:column;gap:16px}.drawer-overlay{position:fixed;inset:0;background:#1e1b2e73;z-index:40}.drawer-overlay[hidden]{display:none}.drawer{position:fixed;top:0;left:0;bottom:0;width:min(300px,85vw);background:#fff;z-index:50;transform:translate(-105%);transition:transform .22s ease;display:flex;flex-direction:column;gap:8px;padding:20px 14px;box-shadow:8px 0 32px #1e1b2e2e}.drawer.open{transform:translate(0)}.drawer-header{padding:4px 8px 14px;border-bottom:1px solid #eee9fb;margin-bottom:8px}.drawer-logo{font-size:1.3rem;font-weight:800;color:#7c3aed}.drawer-subtitle{font-size:.9rem;color:#6d6390}.drawer-btn{border:none;background:transparent;text-align:left;font-size:1.05rem;font-weight:600;color:#1e1b2e;padding:13px 12px;border-radius:12px;cursor:pointer;touch-action:manipulation}.drawer-btn.active{background:#f1eafe;color:#6d28d9}.drawer-btn:active{background:#e9defc}body.drawer-open{overflow:hidden}.card{background:#fff;border-radius:16px;padding:20px 16px;box-shadow:0 8px 24px #7c3aed1f;display:flex;flex-direction:column;gap:12px}.card-title{margin:0;font-size:1.25rem}.card-hint{margin:0;color:#6d6390;font-size:.95rem}.field-label{font-weight:600;font-size:.95rem}.token-input{width:100%;padding:14px 12px;font-size:1.05rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.04em;border:2px solid #d9d2f0;border-radius:12px;outline:none}.token-input:focus{border-color:#7c3aed}.token-input.invalid{border-color:#dc2626;background:#fef2f2}.token-meta{display:flex;justify-content:space-between;align-items:baseline;gap:8px;min-height:1.4em}.token-error{color:#dc2626;font-size:.9rem}.token-counter{color:#6d6390;font-variant-numeric:tabular-nums;white-space:nowrap}.btn-row{display:flex;gap:12px}.btn{flex:1;padding:14px 12px;font-size:1rem;font-weight:600;border-radius:12px;border:2px solid #7c3aed;background:#fff;color:#7c3aed;cursor:pointer;touch-action:manipulation}.btn-primary{background:#7c3aed;color:#fff}.btn:disabled{opacity:.4;cursor:not-allowed}.btn:not(:disabled):active{transform:scale(.98)}.status-bar{margin:0;padding:10px 12px;border-radius:10px;background:#f4f1fa;color:#4c446b;font-size:.95rem;word-break:break-word}.status-bar[hidden]{display:none}.db-banner{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:10px;background:#fff7e6;color:#7a5b00;font-size:.85rem}.db-banner[hidden]{display:none}.db-banner-text{flex:1;min-width:0}.db-banner-link{flex:none;border:none;background:transparent;padding:4px;font:inherit;font-weight:700;color:#7c3aed;cursor:pointer;touch-action:manipulation}.db-banner-link[hidden]{display:none}.words-toolbar{display:flex;gap:8px}.words-search{flex:1;min-width:0;padding:12px;font-size:1rem;border:2px solid #d9d2f0;border-radius:12px;outline:none;background:#fff;color:inherit}.words-search:focus{border-color:#7c3aed}.words-group{flex:none;max-width:42%;padding:12px 8px;font-size:.95rem;font-weight:600;color:#4c446b;border:2px solid #d9d2f0;border-radius:12px;background:#fff;outline:none}.words-group:focus{border-color:#7c3aed}.words-list{display:flex;flex-direction:column}.word-row-wrap{border-bottom:1px solid #eee9fb}.word-row-wrap:last-child{border-bottom:none}.word-row{display:flex;align-items:baseline;gap:8px;width:100%;padding:11px 4px;border:none;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer;touch-action:manipulation;border-radius:8px}.word-row:disabled{cursor:default}.word-row:not(:disabled):active{background:#f4f1fa}.word-row.open{background:#f4f1fa}.word-main{flex:1;min-width:0;overflow-wrap:break-word}.word-key{font-weight:700}.word-sep{color:#6d6390}.word-value{color:#4c446b}.word-tag{flex:none;max-width:38%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.8rem;color:#6d6390;text-align:right}.word-dot{flex:none;width:6px;height:6px;border-radius:50%;background:#7c3aed;opacity:.55;align-self:center}.word-extra[hidden]{display:none}.word-extra-list{margin:0 0 10px;padding:10px 12px;background:#f4f1fa;border-radius:10px;display:flex;flex-direction:column;gap:8px}.word-extra-row dt{font-size:.8rem;font-weight:700;color:#6d6390}.word-extra-row dd{margin:2px 0 0;word-break:break-word}.empty-val{opacity:.5} +:root{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.5;color:#1e1b2e;background:#f4f1fa}*{box-sizing:border-box}body{margin:0;min-height:100dvh;display:flex;justify-content:center;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)}#app{width:100%;max-width:480px;padding:24px 16px 32px;display:flex;flex-direction:column;gap:16px}.app-header h1{margin:0;font-size:1.75rem;letter-spacing:.02em}.app-subtitle{margin:4px 0 0;color:#6d6390}.top-bar{display:flex;align-items:center;gap:12px}.burger-btn{width:44px;height:44px;border:2px solid #d9d2f0;border-radius:12px;background:#fff;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;touch-action:manipulation;flex:none}.burger-btn span{display:block;width:20px;height:2px;border-radius:2px;background:#4c446b}.burger-btn[aria-expanded=true]{border-color:#7c3aed}.top-bar-title h1{margin:0;font-size:1.4rem;line-height:1.2}.top-bar-title p{margin:0;font-size:.9rem;color:#6d6390}.top-bar-spacer{flex:1}.app-content{display:flex;flex-direction:column;gap:16px}.drawer-overlay{position:fixed;inset:0;background:#1e1b2e73;z-index:40}.drawer-overlay[hidden]{display:none}.drawer{position:fixed;top:0;left:0;bottom:0;width:min(300px,85vw);background:#fff;z-index:50;transform:translate(-105%);transition:transform .22s ease;display:flex;flex-direction:column;gap:8px;padding:20px 14px;box-shadow:8px 0 32px #1e1b2e2e}.drawer.open{transform:translate(0)}.drawer-header{padding:4px 8px 14px;border-bottom:1px solid #eee9fb;margin-bottom:8px}.drawer-logo{font-size:1.3rem;font-weight:800;color:#7c3aed}.drawer-subtitle{font-size:.9rem;color:#6d6390}.drawer-btn{border:none;background:transparent;text-align:left;font-size:1.05rem;font-weight:600;color:#1e1b2e;padding:13px 12px;border-radius:12px;cursor:pointer;touch-action:manipulation}.drawer-btn.active{background:#f1eafe;color:#6d28d9}.drawer-btn:active{background:#e9defc}body.drawer-open{overflow:hidden}.card{background:#fff;border-radius:16px;padding:20px 16px;box-shadow:0 8px 24px #7c3aed1f;display:flex;flex-direction:column;gap:12px}.card-title{margin:0;font-size:1.25rem}.card-hint{margin:0;color:#6d6390;font-size:.95rem}.field-label{font-weight:600;font-size:.95rem}.token-input{width:100%;padding:14px 12px;font-size:1.05rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.04em;border:2px solid #d9d2f0;border-radius:12px;outline:none}.token-input:focus{border-color:#7c3aed}.token-input.invalid{border-color:#dc2626;background:#fef2f2}.token-meta{display:flex;justify-content:space-between;align-items:baseline;gap:8px;min-height:1.4em}.token-error{color:#dc2626;font-size:.9rem}.token-counter{color:#6d6390;font-variant-numeric:tabular-nums;white-space:nowrap}.btn-row{display:flex;gap:12px}.btn{flex:1;padding:14px 12px;font-size:1rem;font-weight:600;border-radius:12px;border:2px solid #7c3aed;background:#fff;color:#7c3aed;cursor:pointer;touch-action:manipulation}.btn-primary{background:#7c3aed;color:#fff}.btn:disabled{opacity:.4;cursor:not-allowed}.btn:not(:disabled):active{transform:scale(.98)}.status-bar{margin:0;padding:10px 12px;border-radius:10px;background:#f4f1fa;color:#4c446b;font-size:.95rem;word-break:break-word}.status-bar[hidden]{display:none}.db-banner{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:10px;background:#fff7e6;color:#7a5b00;font-size:.85rem}.db-banner[hidden]{display:none}.db-banner-text{flex:1;min-width:0}.db-banner-link{flex:none;border:none;background:transparent;padding:4px;font:inherit;font-weight:700;color:#7c3aed;cursor:pointer;touch-action:manipulation}.db-banner-link[hidden]{display:none}.words-toolbar{display:flex;gap:8px}.words-search{flex:1;min-width:0;padding:12px;font-size:1rem;border:2px solid #d9d2f0;border-radius:12px;outline:none;background:#fff;color:inherit}.words-search:focus{border-color:#7c3aed}.words-group{flex:none;max-width:42%;padding:12px 8px;font-size:.95rem;font-weight:600;color:#4c446b;border:2px solid #d9d2f0;border-radius:12px;background:#fff;outline:none}.words-group:focus{border-color:#7c3aed}.words-list{display:flex;flex-direction:column}.word-row-wrap{border-bottom:1px solid #eee9fb}.word-row-wrap:last-child{border-bottom:none}.word-row{display:flex;align-items:baseline;gap:8px;width:100%;padding:11px 4px;border:none;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer;touch-action:manipulation;border-radius:8px}.word-row:disabled{cursor:default}.word-row:not(:disabled):active{background:#f4f1fa}.word-row.open{background:#f4f1fa}.word-main{flex:1;min-width:0;overflow-wrap:break-word}.word-key{font-weight:700}.word-sep{color:#6d6390}.word-value{color:#4c446b}.word-tag{flex:none;max-width:38%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.8rem;color:#6d6390;text-align:right}.word-dot{flex:none;width:6px;height:6px;border-radius:50%;background:#7c3aed;opacity:.55;align-self:center}.word-extra[hidden]{display:none}.word-extra-list{margin:0 0 10px;padding:10px 12px;background:#f4f1fa;border-radius:10px;display:flex;flex-direction:column;gap:8px}.word-extra-row dt{font-size:.8rem;font-weight:700;color:#6d6390}.word-extra-row dd{margin:2px 0 0;word-break:break-word}.empty-val{opacity:.5}button.word-row-wrap{border:none;border-bottom:1px solid #eee9fb}button.word-row-wrap:last-child{border-bottom:none}button.word-row-wrap:not(:disabled):hover{background:#f4f1fa}.btn-ghost{align-self:flex-start;flex:none;border:2px solid #d9d2f0;background:#fff;color:#4c446b;box-shadow:none}.btn-ghost:active{background:#f1eafe;border-color:#7c3aed}.deck-form{display:flex;flex-direction:column;gap:8px;margin-top:12px}.deck-form .field-label{margin-top:4px}.deck-form .btn-row{margin-top:8px}.deck-form .card-hint:empty{display:none}.deck-sub{margin:16px 0 8px;font-size:1rem;color:#4c446b}.deck-row{display:flex;align-items:stretch;gap:4px}.deck-name{flex:1;min-width:0}.deck-play{flex:none;align-self:center;width:44px;height:44px;border:2px solid #d9d2f0;border-radius:12px;background:#f1eafe;color:#6d28d9;font-size:1rem;cursor:pointer;touch-action:manipulation}.deck-play:active{background:#e9defc;border-color:#7c3aed}#review-body{display:flex;flex-direction:column;gap:12px;margin-top:12px}.review-card{display:block;width:100%;border:2px solid #d9d2f0;border-radius:14px;background:#fbfaff;padding:20px 16px;font:inherit;color:inherit;text-align:center;cursor:pointer;touch-action:manipulation}.review-card:active{border-color:#7c3aed}.review-side{display:flex;flex-direction:column;gap:8px}.review-line{margin:0;overflow-wrap:break-word}.review-front .review-line:first-child{font-size:1.5rem;font-weight:800}.review-hr{border:none;border-top:1px solid #eee9fb;margin:14px 0}.review-tap{margin:12px 0 0;font-size:.85rem;color:#6d6390}.review-grades{display:grid;grid-template-columns:1fr 1fr;gap:8px}.review-grade{margin:0}.grade-fail{background:#fee2e2;color:#991b1b;box-shadow:none}.grade-hard{background:#ffedd5;color:#9a3412;box-shadow:none}.grade-good{background:#dcfce7;color:#166534;box-shadow:none}.grade-easy{background:#dbeafe;color:#1e40af;box-shadow:none}.review-grade:active{filter:brightness(.95)} diff --git a/dist/assets/index-Dqxd5Tgf.js b/dist/assets/index-Dqxd5Tgf.js deleted file mode 100644 index 62abbe2..0000000 --- a/dist/assets/index-Dqxd5Tgf.js +++ /dev/null @@ -1,59 +0,0 @@ -(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const c of o)if(c.type==="childList")for(const h of c.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&s(h)}).observe(document,{childList:!0,subtree:!0});function i(o){const c={};return o.integrity&&(c.integrity=o.integrity),o.referrerPolicy&&(c.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?c.credentials="include":o.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function s(o){if(o.ep)return;o.ep=!0;const c=i(o);fetch(o.href,c)}})();const Pe=new Worker(new URL("/assets/db-worker-AHwpujSZ.js",import.meta.url),{type:"module"});let ir=0,Ge=null;const je=new Map;function Tn(){return Ge||(Ge=new Promise((t,n)=>{Pe.onmessage=s=>{const o=s.data;if(o.type==="ready")return;const c=je.get(o.id);c&&(je.delete(o.id),o.type=="success"?c.resolve(o.data):c.reject(new Error(o.error??o.message??"Неизвестная ошибка Worker")))},Pe.onerror=s=>{console.error("[SQLite Worker] Ошибка:",s),n(new Error("Ошибка Worker"))};const i=++ir;je.set(i,{resolve:t,reject:n}),Pe.postMessage({type:"start",id:i})}),Ge)}function Qn(t,n){return new Promise((i,s)=>{if(!Pe){s(new Error("Worker не создан"));return}const o=++ir;je.set(o,{resolve:i,reject:s}),Pe.postMessage({type:t,id:o,...n})})}async function Re(t,n){return await Qn("query",{sql:t,params:n??[]})}function Nn(t){if(t==null)return[];const n=String(t).trim();return n?n.split(/[,\s;]+/).map(i=>i.trim()).filter(i=>i.length>0):[]}function Fn(t){const n=new Map;if(t==null)return n;const i=String(t);if(!i)return n;const s=i.split("");for(let o=0;o+10?`WHERE ${n.join(" AND ")}`:"",params:i}}async function qn(t={}){const{clause:n,params:i}=or(t),o=(await Re(`SELECT COUNT(*) as cnt FROM words ${n}`,i))[0]?.cnt;return typeof o=="number"?o:Number(o??0)}async function At(t={}){const{clause:n,params:i}=or(t),s=Math.max(1,Math.min(t.limit??50,500)),o=Math.max(0,t.offset??0);return(await Re(`SELECT id, key, value, tags, more, group_id FROM words ${n} ORDER BY id LIMIT ? OFFSET ?`,[...i,s,o])).map(Hn)}async function Pn(){return(await Re("SELECT id, name FROM word_groups ORDER BY id")).map(n=>({id:Number(n.id),name:String(n.name??"")}))}async function Ln(){return(await Re("SELECT id, name, forward, backward, filter FROM decks ORDER BY id")).map(n=>({id:Number(n.id),name:String(n.name??""),forward:String(n.forward??""),backward:String(n.backward??""),filter:String(n.filter??"")}))}async function _n(){return(await Re("SELECT id, name, identifier FROM custom_fields ORDER BY id")).map(n=>({id:Number(n.id),name:String(n.name??""),identifier:String(n.identifier??"")}))}const kt="japanese_app.db";async function Et(){return navigator.storage.getDirectory()}async function Rn(t){t[18]=1,t[19]=1;const i=await(await Et()).getFileHandle(kt,{create:!0}),s=i.createSyncAccessHandle;if(typeof s=="function")try{const c=await s.call(i);try{c.truncate(0),c.write(t,{at:0}),c.flush()}finally{c.close()}return}catch{}const o=await i.createWritable();try{await o.truncate(0);const c=new Uint8Array(t.length);c.set(t),await o.write(c)}finally{await o.close()}}async function Sn(){const t=await Et();let n;try{n=await t.getFileHandle(kt)}catch{throw new Error("Локальная база не найдена — сначала скачай сохранение")}const i=await n.getFile();if(i.size===0)throw new Error("Локальная база пуста");return new Uint8Array(await i.arrayBuffer())}async function Le(){try{return(await(await(await Et()).getFileHandle(kt)).getFile()).size>0}catch{return!1}}var In=ArrayBuffer,z=Uint8Array,We=Uint16Array,Jn=Int16Array,tt=Int32Array,ht=function(t,n,i){if(z.prototype.slice)return z.prototype.slice.call(t,n,i);(n==null||n<0)&&(n=0),(i==null||i>t.length)&&(i=t.length);var s=new z(i-n);return s.set(t.subarray(n,i)),s},_e=function(t,n,i,s){if(z.prototype.fill)return z.prototype.fill.call(t,n,i,s);for((i==null||i<0)&&(i=0),(s==null||s>t.length)&&(s=t.length);it.length)&&(s=t.length);i2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],B=function(t,n,i){var s=new Error(n||On[t]);if(s.code=t,Error.captureStackTrace&&Error.captureStackTrace(s,B),!i)throw s;return s},er=function(t,n,i){for(var s=0,o=0;s>>0},zn=function(t,n){var i=t[0]|t[1]<<8|t[2]<<16;if(i==3126568&&t[3]==253){var s=t[4],o=s>>5&1,c=s>>2&1,h=s&3,w=s>>6;s&8&&B(0);var C=6-o,x=h==3?4:h,m=er(t,C,x);C+=x;var U=w?1<>3);y=Q+(Q>>3)*(t[5]&7)}y>2145386496&&B(1);var v=new z((n==1?E||y:n?0:y)+12);return v[0]=1,v[4]=4,v[8]=8,{b:C+U,y:0,l:0,d:m,w:n&&n!=1?n:v.subarray(12),e:y,o:new tt(v.buffer,0,3),u:E,c,m:Math.min(131072,y)}}else if((i>>4|t[3]<<20)==25481893)return Xn(t,4)+8;B(0)},Ce=function(t){for(var n=0;1<i&&B(3);for(var c=1<0;){var O=Ce(h+1),R=s>>3,Y=(1<>(s&7)&Y,M=(1<M&&(K-=X)),E[++w]=--K,K==-1?(h+=K,$[--m]=w):h-=K,!K)do{var ee=s>>3;C=(t[ee]|t[ee+1]<<8)>>(s&7)&3,s+=2,w+=C}while(C==3)}(w>255||h)&&B(0);for(var G=0,re=(c>>1)+(c>>3)+3,V=c-1,j=0;j<=w;++j){var H=E[j];if(H<1){y[j]=-H;continue}for(x=0;x=m)}}for(G&&B(0),x=0;x>3,{b:o,s:$,n:S,t:Q}]},Vn=function(t,n){var i=0,s=-1,o=new z(292),c=t[n],h=o.subarray(0,256),w=o.subarray(256,268),C=new We(o.buffer,268);if(c<128){var x=Se(t,n+1,6),m=x[0],U=x[1];n+=c;var E=m<<3,y=t[n];y||B(0);for(var Q=0,v=0,$=U.b,S=$,O=(++n<<3)-8+Ce(y);O-=$,!(O>3;if(Q+=(t[R]|t[R+1]<<8)>>(O&7)&(1<<$)-1,h[++s]=U.s[Q],O-=S,O>3,v+=(t[R]|t[R+1]<<8)>>(O&7)&(1<255&&B(0)}else{for(s=c-127;i>4,h[i+1]=Y&15}++n}var K=0;for(i=0;i11&&B(0),K+=M&&1<0;--i){var j=C[i];_e(V,i,j,C[i-1]=j+w[i]*(1<w&&U>3,y=(t[E]|t[E+1]<<8|t[E+2]<<16)>>(m&7);C=(C<>2,h=c<<1,w=c+h;qe(t.subarray(s,s+=t[0]|t[1]<<8),n.subarray(0,c),i),qe(t.subarray(s,s+=t[2]|t[3]<<8),n.subarray(c,h),i),qe(t.subarray(s,s+=t[4]|t[5]<<8),n.subarray(h,w),i),qe(t.subarray(s),n.subarray(w),i)},Wn=function(t,n,i){var s,o=n.b,c=t[o],h=c>>1&3;n.l=c&1;var w=c>>3|t[o+1]<<5|t[o+2]<<13,C=(o+=3)+w;if(h==1)return o>=t.length?void 0:(n.b=o+1,i?(_e(i,t[o],n.y,n.y+=w),i):_e(new z(w),t[o]));if(!(C>t.length)){if(h==0)return n.b=C,i?(i.set(t.subarray(o,C),n.y),n.y+=w,i):ht(t,o,C);if(h==2){var x=t[o],m=x&3,U=x>>2&3,E=x>>4,y=0,Q=0;m<2?U&1?E|=t[++o]<<4|(U&2&&t[++o]<<12):E=x>>3:(Q=U,U<2?(E|=(t[++o]&63)<<4,y=t[o]>>6|t[++o]<<2):U==2?(E|=t[++o]<<4|(t[++o]&3)<<12,y=t[o]>>2|t[++o]<<6):(E|=t[++o]<<4|(t[++o]&63)<<12,y=t[o]>>6|t[++o]<<2|t[++o]<<10)),++o;var v=i?i.subarray(n.y,n.y+n.m):new z(n.m),$=v.length-E;if(m==0)v.set(t.subarray(o,o+=E),$);else if(m==1)_e(v,t[o++],$);else{var S=n.h;if(m==2){var O=Vn(t,o);y+=o-(o=O[0]),n.h=S=O[1]}else S||B(0);(Q?jn:qe)(t.subarray(o,o+=y),v.subarray($),S)}var R=t[o++];if(R){R==255?R=(t[o++]|t[o++]<<8)+32512:R>127&&(R=R-128<<8|t[o++]);var Y=t[o++];Y&3&&B(0);for(var K=[Bn,Yn,Zn],M=2;M>-1;--M){var X=Y>>(M<<1)+2&3;if(X==1){var D=new z([0,0,t[o++]]);K[M]={s:D.subarray(2,3),n:D.subarray(0,1),t:new We(D.buffer,0,1),b:0}}else X==2?(s=Se(t,o,9-(M&1)),o=s[0],K[M]=s[1]):X==3&&(n.t||B(0),K[M]=n.t[M])}var ee=n.t=K,G=ee[0],re=ee[1],V=ee[2],j=t[C-1];j||B(0);var H=(C<<3)-8+Ce(j)-V.b,g=H>>3,k=0,T=(t[g]|t[g+1]<<8)>>(H&7)&(1<>3;var q=(t[g]|t[g+1]<<8)>>(H&7)&(1<>3;var P=(t[g]|t[g+1]<<8)>>(H&7)&(1<>3;var we=1<>>(H&7)&we-1);g=(H-=bt[Ee])>>3;var oe=Gn[Ee]+((t[g]|t[g+1]<<8|t[g+2]<<16)>>(H&7)&(1<>3;var he=Dn[fe]+((t[g]|t[g+1]<<8|t[g+2]<<16)>>(H&7)&(1<>3,T=V.t[T]+((t[g]|t[g+1]<<8)>>(H&7)&(1<>3,P=G.t[P]+((t[g]|t[g+1]<<8)>>(H&7)&(1<>3,q=re.t[q]+((t[g]|t[g+1]<<8)>>(H&7)&(1<3)n.o[2]=n.o[1],n.o[1]=n.o[0],n.o[0]=ne-=3;else{var ke=ne-(he!=0);ke?(ne=ke==3?n.o[0]-1:n.o[ke],ke>1&&(n.o[2]=n.o[1]),n.o[1]=n.o[0],n.o[0]=ne):ne=n.o[0]}for(var M=0;Moe&&(ae=oe);for(var M=0;M{throw e},s,o=console.log.bind(console),c=console.error.bind(console),h,w=!1,C,x=r=>r.startsWith("file://"),m=!1;function U(){return Ye.buffer}function E(){if(!D?.buffer?.resizable){var r=U();D=new Int8Array(r),Oe=new Int16Array(r),n.HEAPU8=T=new Uint8Array(r),$e=new Uint16Array(r),Xe=new Int32Array(r),P=new Uint32Array(r),Rt=new Float32Array(r),St=new Float64Array(r),Mt=new BigInt64Array(r),$t=new BigUint64Array(r)}}function y(){m=!0,Ne.A()}function Q(r){r=`Aborted(${r})`,c(r),w=!0,r+=". Build with -sASSERTIONS for more info.",m&&zt();var e=new WebAssembly.RuntimeError(r);throw e}var v;let $=()=>"";function S(r){if(r==v&&h)return new Uint8Array(h);throw"both async and sync fetching of the wasm failed"}async function O(r){if(!h)try{var e=await s(r);return new Uint8Array(e)}catch{}return S(r)}async function R(r,e){try{var a=await O(r),l=await WebAssembly.instantiate(a,e);return l}catch(u){c(`failed to asynchronously prepare wasm: ${u}`),Q(u)}}async function Y(r,e,a){if(!r&&!x(e))try{var l=fetch(e,{credentials:"same-origin"}),u=await WebAssembly.instantiateStreaming(l,a);return u}catch(d){c(`wasm streaming compile failed: ${d}`),c("falling back to ArrayBuffer instantiation")}return R(e,a)}function K(){var r={a:Mn};return r}async function M(){function r(d){return Ne=d.exports,xn(Ne),E(),Ne}function e(d){return r(d.instance)}var a=K();v??=$();var l=await Y(h,v,a),u=e(l);return u}class X{name="ExitStatus";constructor(e){this.message=`Program terminated with exit(${e})`,this.status=e}}var D,ee=()=>Gt,G=r=>{var e=r.getArg(ee(),0);return Yt(e)},re=()=>Bt(),V=r=>Vt(r),j=r=>Zt(r),H=globalThis.TextDecoder&&new TextDecoder,g=(r,e,a,l)=>{var u=e+a;if(l)return u;for(;r[e]&&!(e>=u);)++e;return e},k=(r,e=0,a,l)=>{var u=g(r,e,a,l);if(u-e>16&&r.buffer&&H)return H.decode(r.subarray(e,u));for(var d="";e>10,56320|N&1023)}}return d},T,q=(r,e,a)=>r?k(T,r,e,a):"",P,fe=r=>{var e=re(),a=j(4),l=j(4);Dt(r,a,l);var u=P[a>>2],d=P[l>>2],p=q(u);pe(u);var f;return d&&(f=q(d),pe(d)),V(e),[p,f]},ce=r=>{var e=G(r);return fe(e)},Ee=r=>{var e=new WebAssembly.Exception(ee(),[r],{traceStack:!0});throw e.message=ce(e),e},Ke=()=>Q(""),ve={},xe=r=>{for(;r.length;){var e=r.pop(),a=r.pop();a(e)}};function we(r){return this.fromWireType(P[r>>2])}var ne={},oe={},he={};class ke extends Error{constructor(e){super(e),this.name="InternalError"}}var ue=r=>{throw new ke(r)},ae=(r,e,a)=>{r.forEach(f=>he[f]=e);function l(f){var b=a(f);b.length!==r.length&&ue("Mismatched type converter count");for(var N=0;N{u[f]=oe[b],++p,p===d.length&&l(u)}));d.length===0&&l(u)},rt=r=>{var e=ve[r];delete ve[r];var a=e.rawConstructor,l=e.rawDestructor,u=e.fields,d=u.map(p=>p.getterReturnType).concat(u.map(p=>p.setterArgumentType));ae([r],d,p=>{var f={};for(var[b,N]of u.entries()){let F=p[b],I=N.getter,_=N.getterContext,J=p[b+u.length],W=N.setter,ie=N.setterContext;f[N.fieldName]={read:A=>F.fromWireType(I(_,A)),write:(A,Z)=>{var me=[];W(ie,A,J.toWireType(me,Z)),xe(me)},optional:F.optional}}return[{name:e.name,fromWireType:F=>{var I={};for(var _ in f)I[_]=f[_].read(F);return l(F),I},toWireType:(F,I)=>{for(var _ in f)if(!(_ in I)&&!f[_].optional)throw new TypeError(`Missing field: "${_}"`);var J=a();for(_ in f)f[_].write(J,I[_]);return F!==null&&F.push(l,J),J},readValueFromPointer:we,destructorFunction:l}]})},te=r=>{for(var e="";;){var a=T[r++];if(!a)return e;e+=String.fromCharCode(a)}};class Me extends Error{constructor(e){super(e),this.name="BindingError"}}var L=r=>{throw new Me(r)};function wr(r,e,a={}){var l=e.name;if(r||L(`type "${l}" must have a positive integer typeid pointer`),oe.hasOwnProperty(r)){if(a.ignoreDuplicateRegistrations)return;L(`Cannot register type '${l}' twice`)}if(oe[r]=e,delete he[r],ne.hasOwnProperty(r)){var u=ne[r];delete ne[r],u.forEach(d=>d())}}function de(r,e,a={}){return wr(r,e,a)}var Oe,$e,Xe,Mt,$t,Tt=(r,e,a)=>{switch(e){case 1:return a?l=>D[l]:l=>T[l];case 2:return a?l=>Oe[l>>1]:l=>$e[l>>1];case 4:return a?l=>Xe[l>>2]:l=>P[l>>2];case 8:return a?l=>Mt[l>>3]:l=>$t[l>>3];default:throw new TypeError(`invalid integer width (${e}): ${r}`)}},mr=(r,e,a,l,u)=>{e=te(e);let d=l===0n,p=f=>f;if(d){let f=a*8;p=b=>BigInt.asUintN(f,b),u=p(u)}de(r,{name:e,fromWireType:p,toWireType:(f,b)=>(typeof b=="number"&&(b=BigInt(b)),b),readValueFromPointer:Tt(e,a,!d),destructorFunction:null})},vr=(r,e,a,l)=>{e=te(e),de(r,{name:e,fromWireType:function(u){return!!u},toWireType:function(u,d){return d?a:l},readValueFromPointer:function(u){return this.fromWireType(T[u])},destructorFunction:null})},yr=r=>({count:r.count,deleteScheduled:r.deleteScheduled,preservePointerOnDelete:r.preservePointerOnDelete,ptr:r.ptr,ptrType:r.ptrType,smartPtr:r.smartPtr,smartPtrType:r.smartPtrType}),nt=r=>{function e(a){return a.$$.ptrType.registeredClass.name}L(e(r)+" instance already deleted")},at=!1,Qt=r=>{},br=r=>{r.smartPtr?r.smartPtrType.rawDestructor(r.smartPtr):r.ptrType.registeredClass.rawDestructor(r.ptr)},Nt=r=>{r.count.value-=1;var e=r.count.value===0;e&&br(r)},Te=r=>globalThis.FinalizationRegistry?(at=new FinalizationRegistry(e=>{Nt(e.$$)}),Te=e=>{var a=e.$$,l=!!a.smartPtr;if(l){var u={$$:a};at.register(e,u,e)}return e},Qt=e=>at.unregister(e),Te(r)):(Te=e=>e,r),Ur=()=>{let r=ze.prototype;Object.assign(r,{isAliasOf(a){if(!(this instanceof ze)||!(a instanceof ze))return!1;var l=this.$$.ptrType.registeredClass,u=this.$$.ptr;a.$$=a.$$;for(var d=a.$$.ptrType.registeredClass,p=a.$$.ptr;l.baseClass;)u=l.upcast(u),l=l.baseClass;for(;d.baseClass;)p=d.upcast(p),d=d.baseClass;return l===d&&u===p},clone(){if(this.$$.ptr||nt(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var a=Te(Object.create(Object.getPrototypeOf(this),{$$:{value:yr(this.$$)}}));return a.$$.count.value+=1,a.$$.deleteScheduled=!1,a},delete(){this.$$.ptr||nt(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&L("Object already scheduled for deletion"),Qt(this),Nt(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||nt(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&L("Object already scheduled for deletion"),this.$$.deleteScheduled=!0,this}});let e=Symbol.dispose;e&&(r[e]=r.delete)};function ze(){}var Ft=(r,e)=>Object.defineProperty(e,"name",{value:r}),Ht={},it=(r,e,a)=>{if(r[e].overloadTable===void 0){var l=r[e];r[e]=function(...u){return r[e].overloadTable.hasOwnProperty(u.length)||L(`Function '${a}' called with an invalid number of arguments (${u.length}) - expects one of (${r[e].overloadTable})!`),r[e].overloadTable[u.length].apply(this,u)},r[e].overloadTable=[],r[e].overloadTable[l.argCount]=l}},Cr=(r,e,a)=>{n.hasOwnProperty(r)?(L(`Cannot register public name '${r}' twice`),it(n,r,r),n[r].overloadTable.hasOwnProperty(a)&&L(`Cannot register multiple overloads of a function with the same number of arguments (${a})!`),n[r].overloadTable[a]=e):(n[r]=e,n[r].argCount=a)},kr=48,Er=57,xr=r=>{r=r.replace(/[^a-zA-Z0-9_]/g,"$");var e=r.charCodeAt(0);return e>=kr&&e<=Er?`_${r}`:r};function Mr(r,e,a,l,u,d,p,f){this.name=r,this.constructor=e,this.instancePrototype=a,this.rawDestructor=l,this.baseClass=u,this.getActualType=d,this.upcast=p,this.downcast=f,this.pureVirtualFunctions=[]}var ot=(r,e,a)=>{for(;e!==a;)e.upcast||L(`Expected null or instance of ${a.name}, got an instance of ${e.name}`),r=e.upcast(r),e=e.baseClass;return r},st=r=>{if(r===null)return"null";var e=typeof r;return e==="object"||e==="array"||e==="function"?r.toString():""+r};function $r(r,e){if(e===null)return this.isReference&&L(`null is not a valid ${this.name}`),0;e.$$||L(`Cannot pass "${st(e)}" as a ${this.name}`),e.$$.ptr||L(`Cannot pass deleted object as a pointer of type ${this.name}`);var a=e.$$.ptrType.registeredClass,l=ot(e.$$.ptr,a,this.registeredClass);return l}function Tr(r,e){var a;if(e===null)return this.isReference&&L(`null is not a valid ${this.name}`),this.isSmartPointer?(a=this.rawConstructor(),r!==null&&r.push(this.rawDestructor,a),a):0;(!e||!e.$$)&&L(`Cannot pass "${st(e)}" as a ${this.name}`),e.$$.ptr||L(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&e.$$.ptrType.isConst&&L(`Cannot convert argument of type ${e.$$.smartPtrType?e.$$.smartPtrType.name:e.$$.ptrType.name} to parameter type ${this.name}`);var l=e.$$.ptrType.registeredClass;if(a=ot(e.$$.ptr,l,this.registeredClass),this.isSmartPointer)switch(e.$$.smartPtr===void 0&&L("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:e.$$.smartPtrType===this?a=e.$$.smartPtr:L(`Cannot convert argument of type ${e.$$.smartPtrType?e.$$.smartPtrType.name:e.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:a=e.$$.smartPtr;break;case 2:if(e.$$.smartPtrType===this)a=e.$$.smartPtr;else{var u=e.clone();a=this.rawShare(a,ut.toHandle(()=>u.delete())),r!==null&&r.push(this.rawDestructor,a)}break;default:L("Unsupported sharing policy")}return a}function Qr(r,e){if(e===null)return this.isReference&&L(`null is not a valid ${this.name}`),0;e.$$||L(`Cannot pass "${st(e)}" as a ${this.name}`),e.$$.ptr||L(`Cannot pass deleted object as a pointer of type ${this.name}`),e.$$.ptrType.isConst&&L(`Cannot convert argument of type ${e.$$.ptrType.name} to parameter type ${this.name}`);var a=e.$$.ptrType.registeredClass,l=ot(e.$$.ptr,a,this.registeredClass);return l}var qt=(r,e,a)=>{if(e===a)return r;if(a.baseClass===void 0)return null;var l=qt(r,e,a.baseClass);return l===null?null:a.downcast(l)},Nr={},Fr=(r,e)=>{for(e===void 0&&L("ptr should not be undefined");r.baseClass;)e=r.upcast(e),r=r.baseClass;return e},Hr=(r,e)=>(e=Fr(r,e),Nr[e]),Ve=(r,e)=>{(!e.ptrType||!e.ptr)&&ue("makeClassHandle requires ptr and ptrType");var a=!!e.smartPtrType,l=!!e.smartPtr;return a!==l&&ue("Both smartPtrType and smartPtr must be specified"),e.count={value:1},Te(Object.create(r,{$$:{value:e,writable:!0}}))};function qr(r){var e=this.getPointee(r);if(!e)return this.destructor(r),null;var a=Hr(this.registeredClass,e);if(a!==void 0){if(a.$$.count.value===0)return a.$$.ptr=e,a.$$.smartPtr=r,a.clone();var l=a.clone();return this.destructor(r),l}function u(){return this.isSmartPointer?Ve(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:e,smartPtrType:this,smartPtr:r}):Ve(this.registeredClass.instancePrototype,{ptrType:this,ptr:r})}var d=this.registeredClass.getActualType(e),p=Ht[d];if(!p)return u.call(this);var f;this.isConst?f=p.constPointerType:f=p.pointerType;var b=qt(e,this.registeredClass,f.registeredClass);return b===null?u.call(this):this.isSmartPointer?Ve(f.registeredClass.instancePrototype,{ptrType:f,ptr:b,smartPtrType:this,smartPtr:r}):Ve(f.registeredClass.instancePrototype,{ptrType:f,ptr:b})}var Pr=()=>{Object.assign(Ze.prototype,{getPointee(r){return this.rawGetPointee&&(r=this.rawGetPointee(r)),r},destructor(r){this.rawDestructor?.(r)},readValueFromPointer:we,fromWireType:qr})};function Ze(r,e,a,l,u,d,p,f,b,N,F){this.name=r,this.registeredClass=e,this.isReference=a,this.isConst=l,this.isSmartPointer=u,this.pointeeType=d,this.sharingPolicy=p,this.rawGetPointee=f,this.rawConstructor=b,this.rawShare=N,this.rawDestructor=F,!u&&e.baseClass===void 0?l?(this.toWireType=$r,this.destructorFunction=null):(this.toWireType=Qr,this.destructorFunction=null):this.toWireType=Tr}var Lr=(r,e,a)=>{n.hasOwnProperty(r)||ue("Replacing nonexistent public symbol"),n[r].overloadTable!==void 0&&a!==void 0?n[r].overloadTable[a]=e:(n[r]=e,n[r].argCount=a)},_r=r=>jt.get(r),le=(r,e,a=!1)=>{r=te(r);function l(){var d=_r(e);return d}var u=l();return typeof u!="function"&&L(`unknown function pointer with signature ${r}: ${e}`),u};class Rr extends Error{}var Sr=r=>{var e=Ot(r),a=te(e);return pe(e),a},Be=(r,e)=>{var a=[],l={};function u(d){if(!l[d]&&!oe[d]){if(he[d]){he[d].forEach(u);return}a.push(d),l[d]=!0}}throw e.forEach(u),new Rr(`${r}: `+a.map(Sr).join([", "]))},Ir=(r,e,a,l,u,d,p,f,b,N,F,I,_)=>{F=te(F),d=le(u,d),f&&=le(p,f),N&&=le(b,N),_=le(I,_);var J=xr(F);Cr(J,function(){Be(`Cannot construct ${F} due to unbound types`,[l])}),ae([r,e,a],l?[l]:[],W=>{W=W[0];var ie,A;l?(ie=W.registeredClass,A=ie.instancePrototype):A=ze.prototype;var Z=Ft(F,function(...ft){if(Object.getPrototypeOf(this)!==me)throw new Me(`Use 'new' to construct ${F}`);if(se.constructor_body===void 0)throw new Me(`${F} has no accessible constructor`);var Wt=se.constructor_body[ft.length];if(Wt===void 0)throw new Me(`Tried to invoke ctor of ${F} with invalid number of parameters (${ft.length}) - expected (${Object.keys(se.constructor_body).toString()}) parameters instead!`);return Wt.apply(this,ft)}),me=Object.create(A,{constructor:{value:Z}});Z.prototype=me;var se=new Mr(F,Z,me,_,ie,d,f,N);se.baseClass&&(se.baseClass.__derivedClasses??=[],se.baseClass.__derivedClasses.push(se));var pt=new Ze(F,se,!0,!1,!1),ge=new Ze(F+"*",se,!1,!1,!1),De=new Ze(F+" const*",se,!1,!0,!1);return Ht[r]={pointerType:ge,constPointerType:De},Lr(J,Z),[pt,ge,De]})};function Jr(r){for(var e=1;e{for(var a=[],l=0;l>2]);return a},Pt=r=>{r=r.trim();let e=r.indexOf("(");return e===-1?r:r.slice(0,e)},Kr=(r,e,a,l,u,d,p,f,b)=>{var N=ct(a,l);e=te(e),e=Pt(e),d=le(u,d,f),ae([],[r],F=>{F=F[0];var I=`${F.name}.${e}`;function _(){Be(`Cannot call ${I} due to unbound types`,N)}e.startsWith("@@")&&(e=Symbol[e.substring(2)]);var J=F.registeredClass.constructor;return J[e]===void 0?(_.argCount=a-1,J[e]=_):(it(J,e,I),J[e].overloadTable[a-1]=_),ae([],N,W=>{var ie=[W[0],null].concat(W.slice(1)),A=lt(I,ie,null,d,p);if(J[e].overloadTable===void 0?(A.argCount=a-1,J[e]=A):J[e].overloadTable[a-1]=A,F.registeredClass.__derivedClasses)for(let Z of F.registeredClass.__derivedClasses)Z.constructor.hasOwnProperty(e)||(Z.constructor[e]=A);return[]}),[]})},Or=(r,e,a,l,u,d)=>{var p=ct(e,a);u=le(l,u),ae([],[r],f=>{f=f[0];var b=`constructor ${f.name}`;if(f.registeredClass.constructor_body===void 0&&(f.registeredClass.constructor_body=[]),f.registeredClass.constructor_body[e-1]!==void 0)throw new Me(`Cannot register multiple constructors with identical number of parameters (${e-1}) for class '${f.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return f.registeredClass.constructor_body[e-1]=()=>{Be(`Cannot construct ${f.name} due to unbound types`,p)},ae([],p,N=>(N.splice(1,0,null),f.registeredClass.constructor_body[e-1]=lt(b,N,null,u,d),[])),[]})},Xr=(r,e,a,l,u,d,p,f,b,N)=>{var F=ct(a,l);e=te(e),e=Pt(e),d=le(u,d,b),ae([],[r],I=>{I=I[0];var _=`${I.name}.${e}`;e.startsWith("@@")&&(e=Symbol[e.substring(2)]),f&&I.registeredClass.pureVirtualFunctions.push(e);function J(){Be(`Cannot call ${_} due to unbound types`,F)}var W=I.registeredClass.instancePrototype,ie=W[e];return ie===void 0||ie.overloadTable===void 0&&ie.className!==I.name&&ie.argCount===a-2?(J.argCount=a-2,J.className=I.name,W[e]=J):(it(W,e,_),W[e].overloadTable[a-2]=J),ae([],F,A=>{var Z=lt(_,A,I,d,p);return W[e].overloadTable===void 0?(Z.argCount=a-2,W[e]=Z):W[e].overloadTable[a-2]=Z,[]}),[]})},Lt=[],ye=[0,1,,1,null,1,!0,1,!1,1],_t=[],zr=r=>{if(r>9&&--ye[r+1]===0){var e=ye[r];ye[r]=void 0;var a=_t[r];a&&(_t[r]=void 0,a(e)),Lt.push(r)}},ut={toValue:r=>(r||L(`Cannot use deleted val. handle = ${r}`),ye[r]),toHandle:r=>{switch(r){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:{let e=Lt.pop()||ye.length;return ye[e]=r,ye[e+1]=1,e}}}},Vr={name:"emscripten::val",fromWireType:r=>{var e=ut.toValue(r);return zr(r),e},toWireType:(r,e)=>ut.toHandle(e),readValueFromPointer:we,destructorFunction:null},Zr=r=>de(r,Vr),Rt,St,Br=(r,e)=>{switch(e){case 4:return function(a){return this.fromWireType(Rt[a>>2])};case 8:return function(a){return this.fromWireType(St[a>>3])};default:throw new TypeError(`invalid float width (${e}): ${r}`)}},Yr=(r,e,a)=>{e=te(e),de(r,{name:e,fromWireType:l=>l,toWireType:(l,u)=>u,readValueFromPointer:Br(e,a),destructorFunction:null})},Dr=(r,e,a,l,u)=>{e=te(e);let d=l===0,p=b=>b;if(d){var f=32-8*a;p=b=>b<>>f,u=p(u)}de(r,{name:e,fromWireType:p,toWireType:(b,N)=>N,readValueFromPointer:Tt(e,a,l!==0),destructorFunction:null})},Gr=(r,e,a)=>{var l=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array],u=l[e];function d(p){var f=P[p>>2],b=P[p+4>>2];return new u(D.buffer,b,f)}a=te(a),de(r,{name:a,fromWireType:d,readValueFromPointer:d},{ignoreDuplicateRegistrations:!0})},jr=(r,e,a,l)=>{if(!(l>0))return 0;for(var u=a,d=a+l-1,p=0;p=d)break;e[a++]=f}else if(f<=2047){if(a+1>=d)break;e[a++]=192|f>>6,e[a++]=128|f&63}else if(f<=65535){if(a+2>=d)break;e[a++]=224|f>>12,e[a++]=128|f>>6&63,e[a++]=128|f&63}else{if(a+3>=d)break;e[a++]=240|f>>18,e[a++]=128|f>>12&63,e[a++]=128|f>>6&63,e[a++]=128|f&63,p++}}return e[a]=0,a-u},It=(r,e,a)=>jr(r,T,e,a),Jt=r=>{for(var e=0,a=0;a=55296&&l<=57343?(e+=4,++a):e+=3}return e},Wr=(r,e)=>{e=te(e),de(r,{name:e,fromWireType(a){var l=P[a>>2],u=a+4,d;return d=q(u,l,!0),pe(a),d},toWireType(a,l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));var u,d=typeof l=="string";d||ArrayBuffer.isView(l)&&l.BYTES_PER_ELEMENT==1||L("Cannot pass non-string to std::string"),d?u=Jt(l):u=l.length;var p=dt(4+u+1),f=p+4;return P[p>>2]=u,d?It(l,f,u+1):T.set(l,f),a!==null&&a.push(pe,p),p},readValueFromPointer:we,destructorFunction(a){pe(a)}})},Kt=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,Ar=(r,e,a)=>{var l=r>>1,u=g($e,l,e/2,a);if(u-l>16&&Kt)return Kt.decode($e.subarray(l,u));for(var d="",p=l;p{if(a<2)return 0;a-=2;for(var l=e,u=a>1]=p,e+=2}return Oe[e>>1]=0,e-l},tn=r=>r.length*2,rn=(r,e,a)=>{for(var l="",u=r>>2,d=0;!(d>=e/4);d++){var p=P[u+d];if(!p&&!a)break;l+=String.fromCodePoint(p)}return l},nn=(r,e,a=2147483647)=>{if(a<4)return 0;for(var l=e,u=l+a-4,d=0;d65535&&d++,Xe[e>>2]=p,e+=4,e+4>u)break}return Xe[e>>2]=0,e-l},an=r=>{for(var e=0,a=0;a65535&&a++,e+=4}return e},on=(r,e,a)=>{a=te(a);var l,u,d;e===2?(l=Ar,u=en,d=tn):(l=rn,u=nn,d=an),de(r,{name:a,fromWireType:p=>{var f=P[p>>2],b=l(p+4,f*e,!0);return pe(p),b},toWireType:(p,f)=>{typeof f!="string"&&L(`Cannot pass non-string to C++ string type ${a}`);var b=d(f),N=dt(4+b+e);return P[N>>2]=b/e,u(f,N+4,b+e),p!==null&&p.push(pe,N),N},readValueFromPointer:we,destructorFunction(p){pe(p)}})},sn=(r,e,a,l,u,d)=>{ve[r]={name:te(e),rawConstructor:le(a,l),rawDestructor:le(u,d),fields:[]}},ln=(r,e,a,l,u,d,p,f,b,N)=>{ve[r].fields.push({fieldName:te(e),getterReturnType:a,getter:le(l,u),getterContext:d,setterArgumentType:p,setter:le(f,b),setterContext:N})},cn=(r,e)=>{e=te(e),de(r,{isVoid:!0,name:e,fromWireType:()=>{},toWireType:(a,l)=>{}})},un=()=>{},Qe={},dn=r=>{if(r instanceof X||r=="unwind")return C;i(1,r)},pn=r=>{C=r,i(r,new X(r))},fn=r=>{if(!w)try{return r()}catch(e){dn(e)}},hn=()=>performance.now(),gn=(r,e)=>{if(Qe[r]&&(clearTimeout(Qe[r].id),delete Qe[r]),!e)return 0;var a=setTimeout(()=>{delete Qe[r],fn(()=>Xt(r,hn()))},e);return Qe[r]={id:a,timeout_ms:e},0},wn=()=>2147483648,mn=(r,e)=>Math.ceil(r/e)*e,vn=r=>{var e=Ye.buffer.byteLength,a=(r-e+65535)/65536|0;try{return Ye.grow(a),E(),1}catch{}},yn=r=>{var e=T.length;r>>>=0;var a=wn();if(r>a)return!1;for(var l=1;l<=4;l*=2){var u=e*(1+.2/l);u=Math.min(u,r+100663296);var d=Math.min(a,mn(Math.max(r,u),65536)),p=vn(d);if(p)return!0}return!1},bn=r=>52;function Un(r,e,a,l){return 70}var Cn=[null,[],[]],kn=(r,e)=>{var a=Cn[r];!e||e===10?((r===1?o:c)(k(a)),a.length=0):a.push(e)},En=(r,e,a,l)=>{for(var u=0,d=0;d>2],f=P[e+4>>2];e+=8;for(var b=0;b>2]=u,0};Ur(),Pr(),n.wasmBinary&&(h=n.wasmBinary),n.UTF8ToString=q,n.stringToUTF8=It,n.lengthBytesUTF8=Jt;var Ot,dt,pe,Xt,zt,Vt,Zt,Bt,Yt,Dt,Gt,Ye,jt;function xn(r){Ot=r.B,dt=n._malloc=r.C,pe=n._free=r.D,Xt=r.F,zt=r.G,Vt=r.H,Zt=r.I,Bt=r.J,Yt=r.K,Dt=r.L,Ye=r.z,jt=r.E,Gt=r.M}var Mn={t:Ee,x:Ke,f:rt,i:mr,l:vr,o:Ir,b:Kr,n:Or,d:Xr,y:Zr,h:Yr,c:Dr,a:Gr,k:Wr,g:on,j:sn,e:ln,m:cn,w:un,p:gn,u:yn,s:bn,q:Un,r:En,v:pn};async function $n(){!w&&y()}var Ne;return Ne=await M(),await $n(),n}var ra=ta,na=new Int8Array([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,90,63,64,65,66,-1,67,68,69,70,71,-1,72,73,52,53,54,55,56,57,58,59,60,61,74,75,76,77,78,79,80,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,81,-1,82,83,84,85,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,86,87,88,89,-1]);function aa(t){let n=new Uint8Array(170930),i=0,s=0,o=0,c=-1;for(let h=0,w=t.length;h127)continue;let x=na[C];if(!(x<0))if(c<0)c=x;else{c+=x*91,s|=c<88?13:14;do n[i++]=s,s>>>=8,o-=8;while(o>7);c=-1}}return c>=0&&(n[i++]=(s|c<""})}function sa(){Ut=void 0}var la=class{_module;constructor(t){this._module=t}malloc(t){let n=this._module._malloc(t);return{ptr:n,size:t,dispose:()=>this.free({ptr:n,size:t,dispose:()=>{}})}}free(t){this._module._free(t.ptr)}dataToHeap(t){let n=this.malloc(t.byteLength);return this._module.HEAPU8.set(t,n.ptr),n}heapView(t){return this._module.HEAPU8.subarray(t.ptr,t.ptr+t.size)}heapToUint8Array(t){return new Uint8Array([...this.heapView(t)])}lengthBytes(t){return this._module.lengthBytesUTF8(t)}stringToHeap(t){let n=this.lengthBytes(t)+1,i=this._module._malloc(n);return this._module.stringToUTF8(t,i,n),{ptr:i,size:n,dispose:()=>this.free({ptr:i,size:n,dispose:()=>{}})}}heapToString(t){return this._module.UTF8ToString(t.ptr,t.size)}hasFilesystem(){let t=this._module;return t.FS_createPath!==void 0&&t.FS_createDataFile!==void 0&&t.FS_preloadFile!==void 0&&t.FS_unlink!==void 0}createPath(t,n=!0,i=!0){return this._module.FS_createPath("/",t,n,i)}createDataFile(t,n,i=!0,s=!0,o=!0){return this._module.FS_createDataFile("/",t,n,i,s,o)}preloadFile(t,n,i=!0,s=!0,o=!1,c=!0,h=!1){return this._module.FS_preloadFile("/",t,n,i,s,o,c,h)}unlink(t){return this._module.FS_unlink(t)}},Fe,ca=4294967295;function He(t,n){if(!Number.isInteger(t)||t<0||t>ca)throw new Error(`${n} length ${t} is outside the WASM32-safe range`)}function gt(t){if(t.length===0)return new Uint8Array(0);if(t.length===1)return t[0];let n=0;for(let o of t)n+=o.length;let i=new Uint8Array(n),s=0;for(let o of t)i.set(o,s),s+=o.length;return i}var ua=class lr{_mainModule;_zstdClass;_zstd;_compressionLevel;_decompressFrameCompleted=!1;_decompressRemaining=0;_decompressSawInput=!1;constructor(n){this._mainModule=new la(n),this._zstdClass=n.zstd,this._zstd=new this._zstdClass,this._compressionLevel=this._zstdClass.defaultCLevel()}static load(){return Fe||(Fe=oa().then(n=>new lr(n))),Fe}static unload(){sa(),Fe?.then(n=>{n?._zstd?.delete()}),Fe=void 0}copyHeap(n){return this._mainModule.heapView(n).slice()}mallocChecked(n,i){He(n,i);let s=this._mainModule.malloc(n);if(!s.ptr)throw this._mainModule.free(s),new Error(`Failed to allocate ${n} bytes for ${i}`);return s}throwStreamError(n,i){throw new Error(`${n} failed: ${i.errorName||"unknown error"}`)}ensureStreamOk(n,i){i.error&&this.throwStreamError(n,i)}version(){return this._zstdClass.version()}reset(){let n=this._zstd.reset();this.ensureStreamOk("reset",n),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}resetCompression(n){n!==void 0&&(this._compressionLevel=n);let i=this._zstd.resetCompression(this._compressionLevel);this.ensureStreamOk("resetCompression",i)}resetDecompression(){let n=this._zstd.resetDecompression();this.ensureStreamOk("resetDecompression",n),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}setCompressionLevel(n){let i=this._zstd.setCompressionLevel(n);this.ensureStreamOk("setCompressionLevel",i),this._compressionLevel=n}compress(n,i=this.defaultCLevel()){He(n.length,"compress input");let s=this._mainModule.dataToHeap(n);try{if(!s.ptr&&n.length>0)throw new Error("Failed to allocate compress input buffer");let o=this._zstdClass.compressBound(n.length),c=this.mallocChecked(o,"compress output");try{if(c.size=this._zstdClass.compress(c.ptr,o,s.ptr,s.size,i),this._zstdClass.isError(c.size))throw new Error(`compress failed: ${this._zstdClass.getErrorName(c.size)}`);return this.copyHeap(c)}finally{this._mainModule.free(c)}}finally{this._mainModule.free(s)}}compressChunk(n){if(He(n.length,"compressChunk input"),n.length===0)return new Uint8Array(0);let i=this._mainModule.dataToHeap(n);try{if(!i.ptr)throw new Error("Failed to allocate compressChunk input buffer");let s=this._zstdClass.CStreamOutSize(),o=[],c=0;for(;c0&&(h.size=w.produced,o.push(this.copyHeap(h)))}finally{this._mainModule.free(h)}}return gt(o)}finally{this._mainModule.free(i)}}compressEnd(){let n=this._zstdClass.CStreamOutSize(),i=[],s=1;for(;s!==0;){let o=this.mallocChecked(n,"compressEnd output");try{let c=this._zstd.compressEnd(o.ptr,n);if(this.ensureStreamOk("compressEnd",c),c.produced===0&&c.remaining!==0)throw new Error("compressEnd failed: no progress while finishing stream");s=c.remaining,c.produced>0&&(o.size=c.produced,i.push(this.copyHeap(o)))}finally{this._mainModule.free(o)}}return gt(i)}frameContentSize(n){return this._zstdClass.getFrameContentSize(n.ptr,n.size)}decompress(n){He(n.length,"decompress input");let i=this._mainModule.dataToHeap(n);try{if(!i.ptr&&n.length>0)throw new Error("Failed to allocate decompress input buffer");let s=this.frameContentSize(i);if(s.error)throw new Error(`Failed to get frame content size: ${s.errorName}`);let o=s.known;if(o){let c=this._zstdClass.findFrameCompressedSize(i.ptr,i.size);if(this._zstdClass.isError(c))throw new Error(`Failed to find frame compressed size: ${this._zstdClass.getErrorName(c)}`);c0?i.ptr+c:0,m=this._zstd.decompressChunk(w.ptr,s,x,C);if(this.ensureStreamOk("decompressChunk",m),m.consumed===0&&m.produced===0){if(C===0){m.remaining>0&&(this._decompressRemaining=m.remaining);break}throw new Error("decompressChunk failed: no progress while consuming input")}c+=m.consumed,h=m.produced===s&&m.remaining!==0,m.produced>0&&(w.size=m.produced,o.push(this.copyHeap(w))),m.remaining===0?(this._decompressFrameCompleted=!0,this._decompressRemaining=0):this._decompressRemaining=m.remaining}finally{this._mainModule.free(w)}}return gt(o)}finally{this._mainModule.free(i)}}decompressEnd(){if(!this._decompressSawInput)throw new Error("decompressEnd failed: empty compressed input is not a completed frame");if(!this._decompressFrameCompleted||this._decompressRemaining!==0)throw new Error("decompressEnd failed: truncated Zstandard input")}defaultCLevel(){return this._zstdClass.defaultCLevel()}minCLevel(){return this._zstdClass.minCLevel()}maxCLevel(){return this._zstdClass.maxCLevel()}};let wt=null;function da(){return wt||(wt=ua.load()),wt}function pa(t){return t.length>=4&&t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253}function Ct(t){const n="SQLite format 3\0";if(t.length/g,">").replace(/"/g,""").replace(/'/g,"'")}function rr(t,n,i){const s=t.tagsList[0]??"",o=t.tagsList.length>1?` +${t.tagsList.length-1}`:"",c=Ue(t.tagsList.join(", ")),h=s?`${Ue(s)}${o}`:"",w=t.more.size>0?'':"";return`
`+(i?cr(t,n):"")+"
"}function cr(t,n){const i=[...t.more.entries()].map(([s,o])=>{const c=n.get(s);return`
${c?Ue(c.name):`Поле #${s}`}
${Ue(o)}
`}).join("");return i?`
${i}
`:""}function ha(t,n){t.innerHTML=` - -
-

📚 Слова

-
- - -
-

-
База ещё не проверена.
-
-
-
- `;const i=t.querySelector("#home-db-banner"),s=t.querySelector("#home-db-text"),o=t.querySelector("#home-db-go"),c=t.querySelector("#words-search"),h=t.querySelector("#words-group"),w=t.querySelector("#words-count"),C=t.querySelector("#words-status"),x=t.querySelector("#words-list"),m=t.querySelector("#words-more");function U(g,k){i.hidden=!1,s.textContent=g,o.hidden=!1}function E(){i.hidden=!0}o.addEventListener("click",()=>{document.querySelector('.drawer-btn[data-page="sync"]')?.click()});let y=!1,Q=new Map,v=0,$=[],S=null,O=0,R=!1,Y=0,K=0;function M(){const g=h.value;if(g==="")return{search:c.value.trim(),groupId:null};const k=Number(g);return{search:c.value.trim(),groupId:Number.isFinite(k)?k:null}}function X(){m.hidden=!(y&&$.lengthrr(g,Q,g.id===S)).join(""),w.textContent=v>0?`Показано ${$.length} из ${v}`:"",X()}function ee(g){if(S===g){g!=null&&G(g),S=null;return}S!=null&&G(S),S=g,g!=null&&re(g)}function G(g){const k=x.querySelector(`.word-row-wrap[data-word-id="${g}"]`);if(!k)return;const T=k.querySelector(".word-row"),q=k.querySelector(".word-extra");T&&(T.classList.remove("open"),T.setAttribute("aria-expanded","false")),q&&(q.hidden=!0,q.innerHTML="")}function re(g){const k=$.find(fe=>fe.id===g),T=x.querySelector(`.word-row-wrap[data-word-id="${g}"]`);if(!k||!T)return;const q=T.querySelector(".word-row"),P=T.querySelector(".word-extra");q&&(q.classList.add("open"),q.setAttribute("aria-expanded","true")),P&&(P.hidden=!1,P.innerHTML=cr(k,Q))}function V(g){C.textContent=g,C.hidden=g===""}async function j(){if(!y||R)return;R=!0;const g=++Y,k=M();m.disabled=!0,$.length===0&&V("Загрузка слов…");try{const[T,q]=await Promise.all([qn({search:k.search,groupId:k.groupId??void 0}),At({search:k.search,groupId:k.groupId??void 0,limit:tr,offset:0})]);if(g!==Y)return;v=T,$=q,O=q.length,S!=null&&!$.some(P=>P.id===S)&&(S=null),D(),V(q.length===0?"По этому запросу слов нет.":""),q.length===0&&v===0&&(w.textContent="Слов в базе пока нет.")}catch(T){if(g!==Y)return;V(`Не удалось загрузить слова: ${T instanceof Error?T.message:String(T)}`)}finally{g===Y&&(R=!1,m.disabled=!1,X())}}async function H(){if(!y||R||$.length>=v)return;R=!0;const g=++Y,k=M();m.disabled=!0,m.textContent="Загрузка…";try{const T=await At({search:k.search,groupId:k.groupId??void 0,limit:tr,offset:O});if(g!==Y)return;$=$.concat(T),O+=T.length,x.insertAdjacentHTML("beforeend",T.map(q=>rr(q,Q,q.id===S)).join("")),w.textContent=`Показано ${$.length} из ${v}`,X()}catch(T){if(g!==Y)return;V(`Не удалось догрузить: ${T instanceof Error?T.message:String(T)}`)}finally{g===Y&&(R=!1,m.disabled=!1,X())}}c.addEventListener("input",()=>{window.clearTimeout(K),K=window.setTimeout(()=>{j()},300)}),c.addEventListener("keydown",g=>{g.key==="Enter"&&(window.clearTimeout(K),j())}),h.addEventListener("change",()=>{j()}),m.addEventListener("click",()=>{H()}),x.addEventListener("click",g=>{const k=g.target.closest(".word-row");if(!k||k.disabled)return;const T=Number(k.dataset.wordId);Number.isFinite(T)&&ee(S===T?null:T)}),(async()=>{if(!await Le()){U("Локальной базы нет — скачай сохранение."),V("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),w.textContent="";return}try{const k=await Sn();if(!Ct(k)){U("Файл в OPFS не похож на SQLite — перекачай сохранение.",!0),V("Файл в OPFS не похож на SQLite — перекачай сохранение.");return}E();try{const[q,P]=await Promise.all([Pn(),_n()]),fe=q;Q=new Map(P.map(ce=>[ce.id,ce])),h.innerHTML=''+fe.map(ce=>``).join(""),y=!0,await j(),h.options[0].textContent=`Все группы (${v})`}catch(q){V(`БД есть, но слова не прочитались: ${q instanceof Error?q.message:String(q)}`)}}catch(k){U(`Не удалось прочитать базу: ${k instanceof Error?k.message:String(k)}`)}})()}function Ae(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function ga(t,n){const i=[t.forward,t.backward].filter(s=>s.trim().length>0).join(" → ");return`
`+(n?ur(t):"")+"
"}function ur(t){return`
${[["forward",t.forward],["backward",t.backward],["filter",t.filter]].map(([s,o])=>`
${Ae(s)}
${o?Ae(o):'—'}
`).join("")}
`}function wa(t){t.innerHTML=` -
-

🗂️ Колоды

-

-
Проверка локальной базы…
-
-
- `;const n=t.querySelector("#decks-count"),i=t.querySelector("#decks-status"),s=t.querySelector("#decks-list");let o=[],c=null;function h(m){i.textContent=m,i.hidden=m===""}function w(m){const U=s.querySelector(`.word-row-wrap[data-deck-id="${m}"]`);if(!U)return;const E=U.querySelector(".word-row"),y=U.querySelector(".word-extra");E&&(E.classList.remove("open"),E.setAttribute("aria-expanded","false")),y&&(y.hidden=!0,y.innerHTML="")}function C(m){const U=o.find(v=>v.id===m),E=s.querySelector(`.word-row-wrap[data-deck-id="${m}"]`);if(!U||!E)return;const y=E.querySelector(".word-row"),Q=E.querySelector(".word-extra");y&&(y.classList.add("open"),y.setAttribute("aria-expanded","true")),Q&&(Q.hidden=!1,Q.innerHTML=ur(U))}function x(m){if(c===m){m!=null&&w(m),c=null;return}c!=null&&w(c),c=m,m!=null&&C(m)}s.addEventListener("click",m=>{const U=m.target.closest(".word-row");if(!U)return;const E=Number(U.dataset.deckId);Number.isFinite(E)&&x(c===E?null:E)}),(async()=>{if(!await Le()){h("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),n.textContent="";return}h("Загрузка колод…");try{if(o=await Ln(),o.length===0){n.textContent="Колоды пока отсутствуют.",h(""),s.innerHTML="";return}n.textContent=`Всего: ${o.length}`,h(""),s.innerHTML=o.map(U=>ga(U,U.id===c)).join("")}catch(U){h(`Не удалось загрузить колоды: ${U instanceof Error?U.message:String(U)}`)}})()}const nr=24,ma=/^[A-Za-z0-9]{24}$/,dr="japlearn_sync_token";function ar(t){return t.trim().replace(/\s+/g,"")}function be(t){return ma.test(t)}function va(){try{return localStorage.getItem(dr)??""}catch{return""}}function mt(t){try{localStorage.setItem(dr,t)}catch{}}const pr="https://learning.micialware.ru";function ya(t,n=pr){return`${n.replace(/\/+$/,"")}/download/${encodeURIComponent(t)}`}async function ba(t,n,i=pr){const s=ya(t,i);let o;try{o=await fetch(s,{method:"GET",...n})}catch(h){throw new Error(`Нет связи с сервером: ${h instanceof Error?h.message:String(h)}`)}if(!o.ok)throw o.status===404?new Error("Сохранение не найдено (404). Проверь токен."):new Error(`Сервер ответил ${o.status} ${o.statusText}`);const c=await o.arrayBuffer();if(c.byteLength===0)throw new Error("Сервер вернул пустой файл");return new Uint8Array(c)}function Ua(t){t.innerHTML=` -
-

📡 Синхронизация

-

Токен сохранения — 24 символа: латинские буквы и цифры.

- - - -
- - 0 / 24 -
- -
- - -
- -

Введите токен из 24 символов

-
- `;const n=t.querySelector("#token-input"),i=t.querySelector("#token-error"),s=t.querySelector("#token-counter"),o=t.querySelector("#btn-download"),c=t.querySelector("#btn-upload"),h=t.querySelector("#status");function w(y){h.textContent=y,console.log(`[JapLearn] ${y}`)}function C(){return ar(n.value)}function x(y){o.disabled=y||!be(C()),c.disabled=!0,n.disabled=y,y||Le().then(Q=>{!n.disabled&&be(C())&&(c.disabled=!Q)})}function m(){const y=C(),Q=y.length;s.textContent=`${Q} / ${nr}`;const v=be(y),$=Q===0;n.classList.toggle("invalid",!$&&!v),n.setAttribute("aria-invalid",String(!$&&!v)),$?i.textContent="":Q!==nr?i.textContent=`Нужно 24 символа, сейчас ${Q}`:i.textContent=v?"":"Только латинские буквы и цифры",o.disabled=!v,v?Le().then(S=>{n.disabled||(c.disabled=!S)}):c.disabled=!0}async function U(){const y=C();if(be(y)){mt(y),x(!0),w("Скачивание сохранения...");try{const Q=await ba(y);w(`Скачано ${(Q.length/1024).toFixed(1)} КБ, распаковка...`);const v=await fa(Q);w(`Распаковано ${(v.length/1024).toFixed(1)} КБ, сохранение в OPFS...`),await Rn(v),w(`Готово: база ${(v.length/1024).toFixed(1)} КБ сохранена локально (OPFS).`)}catch(Q){w(`Ошибка скачивания: ${Q instanceof Error?Q.message:String(Q)}`)}finally{x(!1),m()}}}n.addEventListener("input",()=>{m()}),n.addEventListener("change",()=>{const y=C();n.value=y,be(y)&&(mt(y),w("Токен сохранён локально. Можно скачивать или выгружать.")),m()}),o.addEventListener("click",()=>{U()}),c.addEventListener("click",()=>{const y=C();be(y)&&(mt(y),w("Выгрузка — следующий шаг (POST /upload/stream/{id})."))});const E=va();E&&(n.value=E),m(),be(ar(E))&&Le().then(y=>{w(y?"Токен восстановлен, локальная база на месте.":"Токен восстановлен. Нажми «Скачать», чтобы получить базу."),m()})}const Ca={home:"Главная",decks:"Колоды",sync:"Синхронизация"};function Ie(t){const n=document.getElementById(t);if(!n)throw new Error(`[JapLearn] Не найден элемент #${t}`);return n}const fr=Ie("burger-btn"),et=Ie("drawer"),hr=Ie("drawer-overlay"),ka=Ie("page-title"),vt=Ie("page");let xt=!1;function Je(t){xt=t,et.classList.toggle("open",t),hr.hidden=!t,fr.setAttribute("aria-expanded",String(t)),et.setAttribute("aria-hidden",String(!t)),document.body.classList.toggle("drawer-open",t)}function Ea(t){et.querySelectorAll(".drawer-btn").forEach(n=>{n.classList.toggle("active",n.dataset.page===t)})}function gr(t){ka.textContent=Ca[t],Ea(t),t==="home"?ha(vt):t==="decks"?wa(vt):Ua(vt)}fr.addEventListener("click",()=>{Je(!xt)});hr.addEventListener("click",()=>{Je(!1)});document.addEventListener("keydown",t=>{t.key==="Escape"&&xt&&Je(!1)});et.querySelectorAll(".drawer-btn").forEach(t=>{t.addEventListener("click",()=>{const n=t.dataset.page;(n==="home"||n==="decks"||n==="sync")&&gr(n),Je(!1)})});await Tn();Je(!1);gr("home");console.log("[JapLearn] crossOriginIsolated =",window.crossOriginIsolated); diff --git a/dist/index.html b/dist/index.html index d79227d..6423296 100644 --- a/dist/index.html +++ b/dist/index.html @@ -5,8 +5,8 @@ JapLearn — интервальные повторения - - + +
diff --git a/src/db-types.ts b/src/db-types.ts index 1ca2e6b..f7c5c4e 100644 --- a/src/db-types.ts +++ b/src/db-types.ts @@ -7,7 +7,7 @@ // т.е. количество дней с 1970-01-01, без времени; // - states.fsrs_memory: сырое INTEGER-значение FSRS (не дата, не трогаем). -import { query } from "./sqlite-api.ts"; +import { command, query } from "./sqlite-api.ts"; export interface CustomField { id: number; @@ -177,6 +177,190 @@ export async function getDecks(): Promise { })); } +/** + * Обновляет редактируемые поля колоды (forward / backward / filter). + * whitelist колонок захардкожен — sql-инъекция через имя поля невозможна. + * Пустые строки разрешены: схема decks требует NOT NULL, но не запрещает ''. + */ +export async function updateDeckFields( + id: number, + patch: { forward: string; backward: string; filter: string }, +): Promise { + await command("UPDATE decks SET forward = ?, backward = ?, filter = ? WHERE id = ?", [ + patch.forward, + patch.backward, + patch.filter, + id, + ] as never[]); + return getDeck(id); +} + +/** Одна колода по id. null — нет такой строки. */ +export async function getDeck(id: number): Promise { + const rows = await query( + "SELECT id, name, forward, backward, filter FROM decks WHERE id = ? LIMIT 1", + [id] as never[], + ); + const r = (rows as Record[])[0]; + if (!r) return null; + return { + id: Number(r["id"]), + name: String(r["name"] ?? ""), + forward: String(r["forward"] ?? ""), + backward: String(r["backward"] ?? ""), + filter: String(r["filter"] ?? ""), + }; +} + +/** + * Сколько строк states привязано к каждой колоде (states.deck_id). + * Один запрос на весь список — кладёт counts.get(deckId) ?? 0 в строку колоды. + */ +export async function getDeckStateCounts(): Promise> { + const rows = await query( + "SELECT deck_id, COUNT(*) as cnt FROM states WHERE deck_id IS NOT NULL GROUP BY deck_id", + ); + const m = new Map(); + for (const r of rows as Record[]) { + if (r["deck_id"] == null) continue; + const cnt = r["cnt"]; + m.set(Number(r["deck_id"]), typeof cnt === "number" ? cnt : Number(cnt ?? 0)); + } + return m; +} + +/** Сколько states у одной колоды (для списка колод). */ +export async function getDeckStateCount(deckId: number): Promise { + const rows = await query("SELECT COUNT(*) as cnt FROM states WHERE deck_id = ?", [ + deckId, + ] as never[]); + const cnt = (rows[0] as Record | undefined)?.["cnt"]; + return typeof cnt === "number" ? cnt : Number(cnt ?? 0); +} + +/** + * Сколько уникальных слов связано с колодой (states.word_id при deck_id). + * Именно это показываем на странице колоды как «количество слов». + */ +export async function getDeckWordCount(deckId: number): Promise { + const rows = await query( + "SELECT COUNT(DISTINCT word_id) as cnt FROM states WHERE deck_id = ?", + [deckId] as never[], + ); + const cnt = (rows[0] as Record | undefined)?.["cnt"]; + return typeof cnt === "number" ? cnt : Number(cnt ?? 0); +} + +/** Все строки states одной колоды, свежие первыми. */ +export async function getDeckStates(deckId: number): Promise { + const rows = await query( + "SELECT id, word_id, deck_id, score, last_opened, fsrs_opened, fsrs_memory, fsrs_open_day FROM states WHERE deck_id = ? ORDER BY last_opened DESC, id DESC", + [deckId] as never[], + ); + return (rows as Record[]).map((r) => ({ + id: Number(r["id"]), + word_id: Number(r["word_id"]), + deck_id: r["deck_id"] == null ? null : Number(r["deck_id"]), + score: Number(r["score"] ?? 0), + last_opened: Number(r["last_opened"] ?? 0), + fsrs_opened: Number(r["fsrs_opened"] ?? 0), + fsrs_memory: Number(r["fsrs_memory"] ?? 0), + fsrs_open_day: Number(r["fsrs_open_day"] ?? 0), + })); +} + +/** + * Пакетная подгрузка слов по id (для страницы колоды: показать key/value рядом со states). + * Возвращает Map word_id -> Word, чтобы не делать N+1 запросов. + */ +export async function getWordsByIds(ids: number[]): Promise> { + const m = new Map(); + const uniq = [...new Set(ids.filter((n) => Number.isFinite(n)))]; + if (uniq.length === 0) return m; + // SQLite-плейсхолдеры строим чанками, чтобы не упереться в лимиты. + const CHUNK = 400; + for (let i = 0; i < uniq.length; i += CHUNK) { + const part = uniq.slice(i, i + CHUNK); + const holders = part.map(() => "?").join(","); + const rows = await query( + `SELECT id, key, value, tags, more, group_id FROM words WHERE id IN (${holders})`, + part as never[], + ); + for (const w of (rows as Record[]).map(mapRowToWord)) m.set(w.id, w); + } + return m; +} + +/** + * Значения «именованных» полей слова для шаблонов forward/backward. + * Ключи: встроенные key/value/tags + identifier и name каждого custom_fields (lowercase). + * Пустые значения пропускаем на этапе рендера. + */ +export function wordFieldValues( + word: Word, + fields: CustomField[], +): Map { + const m = new Map(); + m.set("key", word.key); + m.set("value", word.value); + m.set("tags", word.tagsList.join(", ")); + for (const f of fields) { + const v = word.more.get(f.id) ?? ""; + if (!v) continue; + // identifier — каноническое имя из десктопа (напр. "reading"). + // name тоже кладём — вдруг шаблон ссылается на отображаемое имя. + // Первое непустое побеждает: не затираем уже положенное. + for (const k of [f.identifier, f.name]) { + const key = k.trim().toLowerCase(); + if (!key || m.has(key)) continue; + m.set(key, v); + } + } + return m; +} + +/** + * Рендер стороны карточки: список имён полей через пробел ("reading value"). + * Неизвестные/пустые поля пропускаем. Возвращает непустые значения по порядку. + */ +export function renderCardSide( + template: string, + values: Map, +): string[] { + const out: string[] = []; + for (const tok of template.split(/\s+/)) { + const t = tok.trim().toLowerCase(); + if (!t) continue; + const v = (values.get(t) ?? "").trim(); + if (v) out.push(v); + } + return out; +} + +/** + * Случайная выборка word_id из states колоды без повторений (Fisher–Yates). + * Один запрос DISTINCT word_id, тасуем в памяти, режем до limit. + */ +export async function sampleDeckWordIds( + deckId: number, + limit?: number, +): Promise { + const rows = await query( + "SELECT DISTINCT word_id as word_id FROM states WHERE deck_id = ?", + [deckId] as never[], + ); + const ids = (rows as Record[]) + .map((r) => Number(r["word_id"])) + .filter((n) => Number.isFinite(n)); + // Тасование Фишера–Йетса: равномерная перестановка за O(n). + for (let i = ids.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [ids[i], ids[j]] = [ids[i]!, ids[j]!]; + } + if (limit != null && limit >= 0) return ids.slice(0, limit); + return ids; +} + export async function getCustomFields(): Promise { const rows = await query("SELECT id, name, identifier FROM custom_fields ORDER BY id"); return (rows as Record[]).map((r) => ({ diff --git a/src/db-worker.ts b/src/db-worker.ts index 79380b1..235d17c 100644 --- a/src/db-worker.ts +++ b/src/db-worker.ts @@ -36,7 +36,7 @@ self.onmessage = async (e) => { } case 'command': { if (db === null) throw new Error('БД не инициализирована'); - db.exec(sql, params ?? []); + db.exec({ sql, bind: params ?? [] }); self.postMessage({ type: 'success', id, data: null }); break; } diff --git a/src/deck-page.ts b/src/deck-page.ts new file mode 100644 index 0000000..a90580a --- /dev/null +++ b/src/deck-page.ts @@ -0,0 +1,171 @@ +// Страница одной колоды: данные строки decks + количество связанных слов. +// forward / backward / filter — редактируемые, сохраняются в локальную БД. +// Никакого списка states здесь нет. Навигация: «← Назад к колодам» в список. + +import { getDeck, getDeckWordCount, updateDeckFields } from './db-types.ts'; +import { hasDatabaseFile } from './opfs.ts'; + +export type DeckNav = { + goDecks: () => void; + goReview: (deckId: number) => void; +}; + +function fmtOrDash(s: string): string { + return s ? escapeHtml(s) : '—'; +} + +function escapeHtml(s: string): string { + return s + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +/** attribute-escape для подстановки текущих значений в value="...". */ +function escapeAttr(s: string): string { + return s + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +} + +function pluralWords(n: number): string { + const m10 = n % 10; + const m100 = n % 100; + if (m10 === 1 && m100 !== 11) return 'слово'; + if (m10 >= 2 && m10 <= 4 && (m100 < 12 || m100 > 14)) return 'слова'; + return 'слов'; +} + +export function renderDeckPage(root: HTMLElement, deckId: number, nav: DeckNav): void { + root.innerHTML = ` + +
+

Колода…

+
Загрузка колоды…
+
+
+ `; + + const backBtn = root.querySelector('#deck-back')!; + const titleEl = root.querySelector('#deck-title')!; + const statusEl = root.querySelector('#deck-status')!; + const bodyEl = root.querySelector('#deck-body')!; + + backBtn.addEventListener('click', () => nav.goDecks()); + + void (async () => { + const has = await hasDatabaseFile(); + if (!has) { + titleEl.textContent = 'Колода недоступна'; + statusEl.textContent = 'Нет локальной базы — скачай сохранение на странице «Синхронизация».'; + return; + } + let deck = null; + try { + deck = await getDeck(deckId); + } catch (err) { + titleEl.textContent = 'Колода недоступна'; + statusEl.textContent = `Не удалось загрузить колоду: ${err instanceof Error ? err.message : String(err)}`; + return; + } + if (!deck) { + titleEl.textContent = 'Колода не найдена'; + statusEl.textContent = `Колоды с id=${deckId} нет в локальной базе. Возможно, база обновилась — вернись к списку.`; + return; + } + const d = deck; + titleEl.textContent = d.name || `Колода #${d.id}`; + statusEl.hidden = true; + + let wordCount: number | null = null; + try { + wordCount = await getDeckWordCount(d.id); + } catch (err) { + statusEl.hidden = false; + statusEl.textContent = `Данные колоды загружены, а количество слов — нет: ${err instanceof Error ? err.message : String(err)}`; + } + + bodyEl.innerHTML = ` +
+
id
${d.id}
+
name
${fmtOrDash(d.name)}
+
+
+ + + + + + +
+ +
+

+
+

📚 ${wordCount == null ? 'Количество слов неизвестно' : `${wordCount} ${pluralWords(wordCount)}`}

+
+ +
+ `; + + const form = bodyEl.querySelector('#deck-form')!; + const forwardInput = bodyEl.querySelector('#deck-forward')!; + const backwardInput = bodyEl.querySelector('#deck-backward')!; + const filterInput = bodyEl.querySelector('#deck-filter')!; + const saveBtn = bodyEl.querySelector('#deck-save')!; + const formStatus = bodyEl.querySelector('#deck-form-status')!; + const reviewBtn = bodyEl.querySelector('#deck-review')!; + + reviewBtn.addEventListener('click', () => nav.goReview(d.id)); + + // Кнопка активна только при отличии от сохранённого. + const snapshot = (): string => + `${forwardInput.value}\n${backwardInput.value}\n${filterInput.value}`; + let savedSnapshot = snapshot(); + function refreshDirty(): void { + saveBtn.disabled = snapshot() === savedSnapshot || saveBtn.dataset.busy === '1'; + } + for (const el of [forwardInput, backwardInput, filterInput]) { + el.addEventListener('input', refreshDirty); + } + refreshDirty(); + + form.addEventListener('submit', (e) => { + e.preventDefault(); + if (saveBtn.disabled) return; + saveBtn.dataset.busy = '1'; + saveBtn.disabled = true; + saveBtn.textContent = 'Сохранение…'; + formStatus.textContent = ''; + void (async () => { + try { + const updated = await updateDeckFields(d.id, { + forward: forwardInput.value, + backward: backwardInput.value, + filter: filterInput.value, + }); + if (!updated) { + formStatus.textContent = 'Колода пропала из базы — вернись к списку.'; + return; + } + forwardInput.value = updated.forward; + backwardInput.value = updated.backward; + filterInput.value = updated.filter; + savedSnapshot = snapshot(); + formStatus.textContent = '✅ Сохранено в локальную базу.'; + } catch (err) { + formStatus.textContent = `Не удалось сохранить: ${err instanceof Error ? err.message : String(err)}`; + } finally { + delete saveBtn.dataset.busy; + saveBtn.textContent = '💾 Сохранить'; + refreshDirty(); + } + })(); + }); + })(); +} + diff --git a/src/decks-page.ts b/src/decks-page.ts index 8b4c488..ff43498 100644 --- a/src/decks-page.ts +++ b/src/decks-page.ts @@ -1,10 +1,15 @@ -// Страница «Колоды»: плоский список строк из таблицы decks 1:1. -// Никаких связей (states/history/words) здесь не додумываем — только колонки таблицы. +// Страница «Колоды»: плоский список — только название + количество states. +// Раскрытия по нажатию нет: тап переходит на страницу колоды, где все данные. -import { getDecks } from './db-types.ts'; +import { getDecks, getDeckStateCounts } from './db-types.ts'; import type { Deck } from './db-types.ts'; import { hasDatabaseFile } from './opfs.ts'; +export type DecksNav = { + goDeck: (deckId: number) => void; + goReview: (deckId: number) => void; +}; + function escapeHtml(s: string): string { return s .replace(/&/g, '&') @@ -14,34 +19,28 @@ function escapeHtml(s: string): string { .replace(/'/g, '''); } -// Одна колода — плоская строка: имя слева, направление справа. -function deckRowHtml(d: Deck, expanded: boolean): string { - const dir = [d.forward, d.backward].filter((s) => s.trim().length > 0).join(' → '); - return `
` - + `` - + `
` - + (expanded ? deckExtraHtml(d) : '') - + `
`; +function plural(n: number): string { + const m10 = n % 10; + const m100 = n % 100; + if (m10 === 1 && m100 !== 11) return 'запись'; + if (m10 >= 2 && m10 <= 4 && (m100 < 12 || m100 > 14)) return 'записи'; + return 'записей'; } -// Раскрытие — сырые поля строки decks (имена колонок как в dbschema.sql). -function deckExtraHtml(d: Deck): string { - const rows: Array<[string, string]> = [ - ['forward', d.forward], - ['backward', d.backward], - ['filter', d.filter], - ]; - const html = rows - .map(([k, v]) => `
${escapeHtml(k)}
${v ? escapeHtml(v) : '—'}
`) - .join(''); - return `
${html}
`; +// Одна колода — плоская строка: имя + количество слева, «▶» справа. +// Тап по имени — на страницу колоды, тап по «▶» — сразу в повторение. +function deckRowHtml(d: Deck, count: number): string { + const name = escapeHtml(d.name) || `Колода #${d.id}`; + return `
` + + `` + + `` + + `
`; } -export function renderDecksPage(root: HTMLElement): void { +export function renderDecksPage(root: HTMLElement, nav: DecksNav): void { root.innerHTML = `

🗂️ Колоды

@@ -55,62 +54,18 @@ export function renderDecksPage(root: HTMLElement): void { const statusEl = root.querySelector('#decks-status')!; const listEl = root.querySelector('#decks-list')!; - let decks: Deck[] = []; - let expandedId: number | null = null; - function setStatus(msg: string): void { statusEl.textContent = msg; statusEl.hidden = msg === ''; } - function collapseRow(id: number): void { - const wrap = listEl.querySelector(`.word-row-wrap[data-deck-id="${id}"]`); - if (!wrap) return; - const btn = wrap.querySelector('.word-row'); - const extra = wrap.querySelector('.word-extra'); - if (btn) { - btn.classList.remove('open'); - btn.setAttribute('aria-expanded', 'false'); - } - if (extra) { - extra.hidden = true; - extra.innerHTML = ''; - } - } - - function expandRow(id: number): void { - const d = decks.find((x) => x.id === id); - const wrap = listEl.querySelector(`.word-row-wrap[data-deck-id="${id}"]`); - if (!d || !wrap) return; - const btn = wrap.querySelector('.word-row'); - const extra = wrap.querySelector('.word-extra'); - if (btn) { - btn.classList.add('open'); - btn.setAttribute('aria-expanded', 'true'); - } - if (extra) { - extra.hidden = false; - extra.innerHTML = deckExtraHtml(d); - } - } - - function setExpanded(id: number | null): void { - if (expandedId === id) { - if (id != null) collapseRow(id); - expandedId = null; - return; - } - if (expandedId != null) collapseRow(expandedId); - expandedId = id; - if (id != null) expandRow(id); - } - listEl.addEventListener('click', (e) => { - const btn = (e.target as HTMLElement).closest('.word-row'); + const btn = (e.target as HTMLElement).closest('[data-act]'); if (!btn) return; const id = Number(btn.dataset.deckId); if (!Number.isFinite(id)) return; - setExpanded(expandedId === id ? null : id); + if (btn.dataset.act === 'review') nav.goReview(id); + else nav.goDeck(id); }); void (async () => { @@ -122,7 +77,7 @@ export function renderDecksPage(root: HTMLElement): void { } setStatus('Загрузка колод…'); try { - decks = await getDecks(); + const [decks, counts] = await Promise.all([getDecks(), getDeckStateCounts()]); if (decks.length === 0) { countEl.textContent = 'Колоды пока отсутствуют.'; setStatus(''); @@ -131,9 +86,12 @@ export function renderDecksPage(root: HTMLElement): void { } countEl.textContent = `Всего: ${decks.length}`; setStatus(''); - listEl.innerHTML = decks.map((d) => deckRowHtml(d, d.id === expandedId)).join(''); + listEl.innerHTML = decks + .map((d) => deckRowHtml(d, counts.get(d.id) ?? 0)) + .join(''); } catch (err) { setStatus(`Не удалось загрузить колоды: ${err instanceof Error ? err.message : String(err)}`); } })(); } + diff --git a/src/main.ts b/src/main.ts index f451105..68a02ff 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,16 +1,20 @@ import './style.css'; import { renderHomePage } from './home-page.ts'; import { renderDecksPage } from './decks-page.ts'; +import { renderDeckPage } from './deck-page.ts'; +import { renderReviewPage } from './review-page.ts'; import { renderSyncPage } from './sync-page.ts'; import { initWorker } from './sqlite-api.ts'; -// Каркас приложения: топ-бар + бургер-меню + страницы (Главная / Колоды / Синхронизация). +// Каркас приложения: топ-бар + бургер-меню + страницы (Главная / Колоды / Колода / Повторение / Синхронизация). -type Page = 'home' | 'decks' | 'sync'; +type Page = 'home' | 'decks' | 'deck' | 'review' | 'sync'; const PAGE_TITLES: Record = { home: 'Главная', decks: 'Колоды', + deck: 'Колода', + review: 'Повторение', sync: 'Синхронизация', }; @@ -43,13 +47,24 @@ function setActiveButton(page: Page): void { }); } -function renderPage(page: Page): void { +function renderPage(page: Page, deckId?: number): void { pageTitle.textContent = PAGE_TITLES[page]; - setActiveButton(page); + // Страницы колоды и повторения — подразделы «Колод»: в меню подсвечиваем «Колоды». + setActiveButton(page === 'deck' || page === 'review' ? 'decks' : page); if (page === 'home') { renderHomePage(pageRoot, {}); } else if (page === 'decks') { - renderDecksPage(pageRoot); + renderDecksPage(pageRoot, { + goDeck: (id) => renderPage('deck', id), + goReview: (id) => renderPage('review', id), + }); + } else if (page === 'deck') { + renderDeckPage(pageRoot, deckId ?? 0, { + goDecks: () => renderPage('decks'), + goReview: (id) => renderPage('review', id), + }); + } else if (page === 'review') { + renderReviewPage(pageRoot, deckId ?? 0, { goDecks: () => renderPage('decks') }); } else { renderSyncPage(pageRoot); } diff --git a/src/review-page.ts b/src/review-page.ts new file mode 100644 index 0000000..18ca2ea --- /dev/null +++ b/src/review-page.ts @@ -0,0 +1,191 @@ +// Страница повторения колоды: карточка за карточкой по случайной выборке. +// Лицевая сторона — поля из deck.forward, по тапу дорисовывается deck.backward. +// Внизу 4 кнопки самооценки: "не получилось" / "тяжело" / "хорошо" / "легко". +// Пока без записи ответов: только навигация по очереди (история — следующий шаг). + +import { + getCustomFields, + getDeck, + getWordsByIds, + renderCardSide, + sampleDeckWordIds, + wordFieldValues, +} from './db-types.ts'; +import type { CustomField, Word } from './db-types.ts'; +import { hasDatabaseFile } from './opfs.ts'; + +export type ReviewNav = { + goDecks: () => void; +}; + +function escapeHtml(s: string): string { + return s + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +const GRADES = [ + { label: '😞 Не получилось', cls: 'grade-fail' }, + { label: '😟 Тяжело', cls: 'grade-hard' }, + { label: '🙂 Хорошо', cls: 'grade-good' }, + { label: '🤩 Легко', cls: 'grade-easy' }, +] as const; + +export function renderReviewPage(root: HTMLElement, deckId: number, nav: ReviewNav): void { + root.innerHTML = ` + +
+

Повторение…

+

+
Загрузка карточек…
+
+
+ `; + + const backBtn = root.querySelector('#review-back')!; + const titleEl = root.querySelector('#review-title')!; + const progressEl = root.querySelector('#review-progress')!; + const statusEl = root.querySelector('#review-status')!; + const bodyEl = root.querySelector('#review-body')!; + + backBtn.addEventListener('click', () => nav.goDecks()); + + function setStatus(msg: string): void { + statusEl.textContent = msg; + statusEl.hidden = msg === ''; + } + + // Очередь сессии: перетасованные id без повторений + подгруженные слова. + let queue: number[] = []; + let words = new Map(); + let fields: CustomField[] = []; + let forwardTpl = ''; + let backwardTpl = ''; + let pos = 0; + let revealed = false; + + function sideHtml(values: string[], cls: string): string { + if (values.length === 0) { + return `
—
`; + } + return `
` + + values.map((v) => `

${escapeHtml(v)}

`).join('') + + `
`; + } + + + function paint(): void { + const w = words.get(queue[pos]!); + if (!w) { + bodyEl.innerHTML = ''; + progressEl.textContent = ''; + setStatus('Слово пропало из базы — пропускаю.'); + return; + } + const values = wordFieldValues(w, fields); + const front = renderCardSide(forwardTpl, values); + const back = revealed ? renderCardSide(backwardTpl, values) : null; + progressEl.textContent = `Карточка ${pos + 1} из ${queue.length}`; + setStatus(''); + const backHtml = !revealed + ? `

Тап — показать ответ

` + : sideHtml(back ?? [], 'review-back-side'); + // Оценки — только после открытия (вместе с backward), до этого лишь тап по карточке. + const gradesHtml = revealed + ? `
+ ${GRADES.map((g) => ``).join('')} +
` + : ''; + bodyEl.innerHTML = ` + + ${gradesHtml} + `; + bodyEl.querySelector('#review-card')!.addEventListener('click', () => { + if (!revealed) { + revealed = true; + paint(); + } + }); + bodyEl.querySelectorAll('.review-grade').forEach((btn) => { + btn.addEventListener('click', () => { + // Запись ответов (history/states) — следующим шагом, пока просто дальше. + pos += 1; + revealed = false; + if (pos >= queue.length) paintDone(); + else paint(); + }); + }); + } + + function paintDone(): void { + progressEl.textContent = `Готово: ${queue.length} из ${queue.length}`; + setStatus(''); + bodyEl.innerHTML = ` +

Все карточки сессии просмотрены. Запись оценок — следующим шагом.

+
+ +
+ `; + bodyEl.querySelector('#review-again')!.addEventListener('click', () => { + void reshuffle(); + }); + } + + async function reshuffle(): Promise { + setStatus('Перемешиваю…'); + bodyEl.innerHTML = ''; + progressEl.textContent = ''; + queue = await sampleDeckWordIds(deckId); + pos = 0; + revealed = false; + if (queue.length === 0) { + setStatus('В колоде нет слов для повторения.'); + return; + } + words = await getWordsByIds(queue); + paint(); + } + + void (async () => { + const has = await hasDatabaseFile(); + if (!has) { + titleEl.textContent = 'Повторение недоступно'; + setStatus('Нет локальной базы — скачай сохранение на странице «Синхронизация».'); + return; + } + try { + const [deck, customFields] = await Promise.all([getDeck(deckId), getCustomFields()]); + if (!deck) { + titleEl.textContent = 'Колода не найдена'; + setStatus(`Колоды с id=${deckId} нет в локальной базе. Вернись к списку.`); + return; + } + fields = customFields; + forwardTpl = deck.forward; + backwardTpl = deck.backward; + titleEl.textContent = deck.name || `Колода #${deck.id}`; + queue = await sampleDeckWordIds(deck.id); + if (queue.length === 0) { + progressEl.textContent = ''; + setStatus('В колоде нет слов для повторения.'); + return; + } + // Слова грузим одним батчем (чанки внутри getWordsByIds), очередь уже перемешана. + words = await getWordsByIds(queue); + pos = 0; + revealed = false; + paint(); + } catch (err) { + titleEl.textContent = 'Повторение недоступно'; + setStatus(`Не удалось загрузить карточки: ${err instanceof Error ? err.message : String(err)}`); + } + })(); +} diff --git a/src/style.css b/src/style.css index 45ec1cc..fc90bf0 100644 --- a/src/style.css +++ b/src/style.css @@ -477,3 +477,185 @@ body.drawer-open { .empty-val { opacity: 0.5; } + +/* Кнопка-строка колоды: div-обёртка + button в одном элементе. + .word-row сбрасывает border — возвращаем разделитель. */ +button.word-row-wrap { + border: none; + border-bottom: 1px solid #eee9fb; +} + +button.word-row-wrap:last-child { + border-bottom: none; +} + +button.word-row-wrap:not(:disabled):hover { + background: #f4f1fa; +} + +/* Призрачная кнопка «назад» + подзаголовок на странице колоды */ +.btn-ghost { + align-self: flex-start; + flex: none; + border: 2px solid #d9d2f0; + background: #fff; + color: #4c446b; + box-shadow: none; +} + +.btn-ghost:active { + background: #f1eafe; + border-color: #7c3aed; +} + +/* Форма редактирования колоды: инпуты + статус. id/name — только чтение. */ +.deck-form { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 12px; +} + +.deck-form .field-label { + margin-top: 4px; +} + +.deck-form .btn-row { + margin-top: 8px; +} + +.deck-form .card-hint:empty { + display: none; +} + +.deck-sub { + margin: 16px 0 8px; + font-size: 1rem; + color: #4c446b; +} + +/* Строка колоды: div-обёртка — name слева тянется, «▶» справа фиксирован. */ +.deck-row { + display: flex; + align-items: stretch; + gap: 4px; +} + +.deck-name { + flex: 1; + min-width: 0; +} + +.deck-play { + flex: none; + align-self: center; + width: 44px; + height: 44px; + border: 2px solid #d9d2f0; + border-radius: 12px; + background: #f1eafe; + color: #6d28d9; + font-size: 1rem; + cursor: pointer; + touch-action: manipulation; +} + +.deck-play:active { + background: #e9defc; + border-color: #7c3aed; +} + +/* --- Повторение: карточка + 4 кнопки оценок --- */ + +#review-body { + display: flex; + flex-direction: column; + gap: 12px; + margin-top: 12px; +} + +/* Карточка — вся кнопка: сначала только forward, по тапу дорисовывается backward. */ +.review-card { + display: block; + width: 100%; + border: 2px solid #d9d2f0; + border-radius: 14px; + background: #fbfaff; + padding: 20px 16px; + font: inherit; + color: inherit; + text-align: center; + cursor: pointer; + touch-action: manipulation; +} + +.review-card:active { + border-color: #7c3aed; +} + +.review-side { + display: flex; + flex-direction: column; + gap: 8px; +} + +.review-line { + margin: 0; + overflow-wrap: break-word; +} + +.review-front .review-line:first-child { + font-size: 1.5rem; + font-weight: 800; +} + +.review-hr { + border: none; + border-top: 1px solid #eee9fb; + margin: 14px 0; +} + +.review-tap { + margin: 12px 0 0; + font-size: 0.85rem; + color: #6d6390; +} + +.review-grades { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; +} + +.review-grade { + margin: 0; +} + +/* Оценки — плоские оттенки смысла, текст всегда тёмный для контраста. */ +.grade-fail { + background: #fee2e2; + color: #991b1b; + box-shadow: none; +} + +.grade-hard { + background: #ffedd5; + color: #9a3412; + box-shadow: none; +} + +.grade-good { + background: #dcfce7; + color: #166534; + box-shadow: none; +} + +.grade-easy { + background: #dbeafe; + color: #1e40af; + box-shadow: none; +} + +.review-grade:active { + filter: brightness(0.95); +} diff --git a/src/sync-page.ts b/src/sync-page.ts index b065646..fc4a2aa 100644 --- a/src/sync-page.ts +++ b/src/sync-page.ts @@ -1,6 +1,5 @@ -// Страница «Синхронизация»: токен + Скачать/Выгрузить. +// Страница «Синхронизация»: токен + Скачать. // Скачивание: GET /download/{id} -> zstd -> проверка SQLite -> запись в OPFS. -// Выгрузка: следующий шаг (POST /upload/stream/{id}). import { TOKEN_LENGTH, @@ -11,7 +10,7 @@ import { } from './token.ts'; import { fetchBackupBytes } from './sync.ts'; import { decompressBackup } from './zstd.ts'; -import { hasDatabaseFile, writeDatabaseFile } from './opfs.ts'; +import { writeDatabaseFile } from './opfs.ts'; export function renderSyncPage(root: HTMLElement): void { root.innerHTML = ` @@ -40,8 +39,7 @@ export function renderSyncPage(root: HTMLElement): void {
- - +

Введите токен из 24 символов

@@ -52,7 +50,6 @@ export function renderSyncPage(root: HTMLElement): void { const tokenError = root.querySelector('#token-error')!; const tokenCounter = root.querySelector('#token-counter')!; const btnDownload = root.querySelector('#btn-download')!; - const btnUpload = root.querySelector('#btn-upload')!; const statusEl = root.querySelector('#status')!; function setStatus(msg: string): void { @@ -66,15 +63,7 @@ export function renderSyncPage(root: HTMLElement): void { function setBusy(busy: boolean): void { btnDownload.disabled = busy || !isValidToken(currentToken()); - btnUpload.disabled = true; tokenInput.disabled = busy; - if (!busy) { - void hasDatabaseFile().then((has) => { - if (!tokenInput.disabled && isValidToken(currentToken())) { - btnUpload.disabled = !has; - } - }); - } } function refreshUI(): void { @@ -93,13 +82,6 @@ export function renderSyncPage(root: HTMLElement): void { tokenError.textContent = ok ? '' : 'Только латинские буквы и цифры'; } btnDownload.disabled = !ok; - if (ok) { - void hasDatabaseFile().then((has) => { - if (!tokenInput.disabled) btnUpload.disabled = !has; - }); - } else { - btnUpload.disabled = true; - } } async function handleDownload(): Promise { @@ -132,7 +114,7 @@ export function renderSyncPage(root: HTMLElement): void { tokenInput.value = token; if (isValidToken(token)) { saveToken(token); - setStatus('Токен сохранён локально. Можно скачивать или выгружать.'); + setStatus('Токен сохранён локально. Можно скачивать.'); } refreshUI(); }); @@ -141,26 +123,12 @@ export function renderSyncPage(root: HTMLElement): void { void handleDownload(); }); - btnUpload.addEventListener('click', () => { - const token = currentToken(); - if (!isValidToken(token)) return; - saveToken(token); - setStatus('Выгрузка — следующий шаг (POST /upload/stream/{id}).'); - }); - const saved = loadSavedToken(); if (saved) { tokenInput.value = saved; } refreshUI(); if (isValidToken(normalizeToken(saved))) { - void hasDatabaseFile().then((has) => { - setStatus( - has - ? 'Токен восстановлен, локальная база на месте.' - : 'Токен восстановлен. Нажми «Скачать», чтобы получить базу.', - ); - refreshUI(); - }); + setStatus('Токен восстановлен. Нажми «Скачать», чтобы получить базу.'); } } diff --git a/src/sync.ts b/src/sync.ts index 79fb1ac..0b09c3a 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -1,6 +1,5 @@ // Сеть: скачивание сохранения с бэкенда. // GET https://learning.micialware.ru/download/{id} -> zstd-сжатый .sqlite (бинарь). -// Выгрузка (POST /upload/stream/{id}) — в следующем шаге. export const API_BASE_URL = 'https://learning.micialware.ru'; diff --git a/src/token.ts b/src/token.ts index 2a46dbd..3a43616 100644 --- a/src/token.ts +++ b/src/token.ts @@ -1,5 +1,5 @@ // Токен сохранения: ровно 24 символа, только латиница и цифры. -// Это НЕ JWT — просто короткий идентификатор для download/upload .sqlite. +// Просто короткий идентификатор для download .sqlite. export const TOKEN_LENGTH = 24;