const e=new TextDecoder("utf-8"),t=new TextEncoder;class n{constructor(e,t){this.getUint8Memory=e,this.pointer=0,this.ptr=Number(t>>32n),this.size=Number(t%2n**32n),this.dataView=new DataView(this.getUint8Memory().buffer,this.ptr,this.size)}getByte(){const e=this.dataView.getUint8(this.pointer);return this.pointer+=1,e}setByte(e){this.dataView.setUint8(this.pointer,e),this.pointer+=1}getU16(){const e=this.dataView.getUint16(this.pointer);return this.pointer+=2,e}setU16(e){this.dataView.setUint16(this.pointer,e),this.pointer+=2}getU32(){const e=this.dataView.getUint32(this.pointer);return this.pointer+=4,e}setU32(e){this.dataView.setUint32(this.pointer,e),this.pointer+=4}getF64(){const e=this.dataView.getFloat64(this.pointer);return this.pointer+=8,e}setF64(e){this.dataView.setFloat64(this.pointer,e),this.pointer+=8}getBuffer(){const e=this.getU32(),t=this.getUint8Memory().subarray(this.ptr+this.pointer,this.ptr+this.pointer+e);return this.pointer+=e,t}setBuffer(e){const t=e.length;this.setU32(t);this.getUint8Memory().subarray(this.ptr+this.pointer,this.ptr+this.pointer+t).set(e),this.pointer+=t}getString(){return e.decode(this.getBuffer())}setString(e){const n=t.encode(e);this.setBuffer(n)}}const s=1,o=2,r=3,i=4,a=5,c=6,l=7,d=8,h=9,u=e=>JSON.parse(e),m=e=>{if(!0===e||!1===e||null==e)return 1;if("string"==typeof e)return 5+t.encode(e).length;if("number"==typeof e)return 9;if(e instanceof Uint8Array)return 5+e.length;if(Array.isArray(e)){let t=5;for(const n of e)t+=m(n);return t}if("object"==typeof e){let n=3;for(const[s,o]of Object.entries(e))n+=4+t.encode(s).length,n+=m(o);return n}throw new Error("jsJsonGetSize: Unknown type "+typeof e)},f=e=>{const t=e.getByte();if(t===s)return!0;if(t===o)return!1;if(t===r)return null;if(t!==i){if(t===a)return e.getString();if(t===c)return e.getF64();if(t===l){const t=e.getU32(),n=[];for(let s=0;s<t;s++)n.push(f(e));return n}if(t===d){const t=e.getU16(),n={};for(let s=0;s<t;s++){const t=e.getString(),s=f(e);n[t]=s}return n}if(t===h)return e.getBuffer().slice();throw new Error(`jsJsonDecodeItem: Unknown type id ${t}`)}},g=(e,t)=>{if(!0!==e)if(!1!==e)if(null!==e)if(void 0!==e){if("string"==typeof e)return t.setByte(a),void t.setString(e);if("number"==typeof e)return t.setByte(c),void t.setF64(e);if(e instanceof Uint8Array)return t.setByte(h),void t.setBuffer(e);if(!Array.isArray(e)){if("object"==typeof e){const n=Object.entries(e);t.setByte(d),t.setU16(n.length);for(const[e,s]of n)t.setString(e),g(s,t);return}throw new Error("saveJsJsonToBufferItem: Unknown type "+typeof e)}t.setByte(l),t.setU32(e.length);for(const n of e)g(n,t)}else t.setByte(i);else t.setByte(r);else t.setByte(o);else t.setByte(s)},p=new Map,w=async(e,t)=>{const s=await(async(e,t)=>{const n=await p.get(e);if(n)return{module:n,instance:await WebAssembly.instantiate(n,t)};if("function"==typeof WebAssembly.instantiateStreaming){const n=fetch(e);try{return await WebAssembly.instantiateStreaming(n,t)}catch(e){console.warn("`WebAssembly.instantiateStreaming` failed. This could happen if your server does not serve wasm with `application/wasm` MIME type, but check the original error too. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e)}}console.info("fetchModule by WebAssembly.instantiate");const s=await fetch(e),o=await s.arrayBuffer();return await WebAssembly.instantiate(o,t)})(e,t);let o=new Uint8Array(1);const r=()=>{if(s.instance.exports.memory instanceof WebAssembly.Memory)return o.buffer!==s.instance.exports.memory.buffer&&(o=new Uint8Array(s.instance.exports.memory.buffer)),o;throw Error("Missing memory")},i=s.instance.exports;return{exports:i,getUint8Memory:r,wasmCommand:e=>{const t=m(e),s=i.vertigo_export_alloc_block(t),o=new n(r,s);g(e,o);const a=i.vertigo_export_wasm_command(s);if(0n===a)return null;const c=new n(r,a),l=f(c);return i.vertigo_export_free_block(a),l}}};class v{constructor(){this.events=new Set}on(e){let t=!0;const n=n=>{t&&e(n)};return this.events.add(n),()=>{t=!1,this.events.delete(n)}}trigger(e){const t=Array.from(this.events.values());for(const n of t)try{n(e)}catch(e){console.error(e)}}}class y{constructor(){this.resolveFirst=null,this.resolve=e=>{const t=this.resolveFirst;this.resolveFirst=null,t?.(e)},this.isFulfilled=()=>null===this.resolveFirst,this.promise=new Promise(e=>{this.resolveFirst=e})}}const b=async(e,t)=>{console.info(`${e} wait ${t}ms`),await(async e=>new Promise(t=>{setTimeout(t,e)}))(t),console.info(`${e} go forth`)};class k{constructor(e){this.host=e,this.formatLog=e=>`Socket ${this.host} ==> ${e}`}}class E{constructor(e,t){this.eventMessage=new v,this.close=e,this.send=t}static connect(e,t,n){const s=new y,o=new y,r=new WebSocket(t);r.binaryType="arraybuffer";let i=!1;console.info(e.formatLog("starting ..."));const a=t=>{i||(console.info(e.formatLog("close")),i=!0,s.resolve(null),o.resolve({code:t?.code??1001,reason:t?.reason??""}),r.close())},c=new E(a,e=>{i||r.send(e)});setTimeout(()=>{s.isFulfilled()||(console.error(e.formatLog(`timeout (${n}ms)`)),a())},n);return r.addEventListener("open",()=>{console.info(e.formatLog("open")),s.resolve(c)}),r.addEventListener("error",t=>{i||console.error(e.formatLog("error"),t)}),r.addEventListener("close",a),r.addEventListener("message",e=>{if(i)return;const t=e.data;c.eventMessage.trigger("string"==typeof t?t:new Uint8Array(t))}),{close:a,socket:s.promise,done:o.promise}}static startSocket(e,t,n){let s=!0,o=()=>{};const r=new k(e);return(async()=>{for(;s;){const i=E.connect(r,e,t);o=i.close;const a=await i.socket;if(!s)return void console.info(r.formatLog("disconnect (3)"));let c;if(null===a)c=n({type:"close",code:1006,reason:"",connected:!1});else{n({type:"socket",socket:a}),a.eventMessage.on(e=>{n({type:"message",message:e})});const e=await i.done;if(c=n({type:"close",...e,connected:!0}),!s)return void console.info(r.formatLog("disconnect (1)"))}if("number"!=typeof c)return void console.info(r.formatLog("stop"));await b(r.formatLog("reconnect"),c)}console.info(r.formatLog("disconnect (2)"))})().catch(e=>{console.error(e)}),{dispose:()=>{s=!1,o()}}}}const C=e=>{try{return u(e)}catch{throw console.error("Failed to parse websocket message",e),Error(e)}},T=(e,t,n)=>e.wasmCommand({Websocket:{callback:t,message:n}});class x{constructor(e){this.websocket_register_callback=(e,t,n)=>{const s=()=>this.start(e,t,n);this.starts.set(t,s),s()},this.websocket_unregister_callback=e=>{const t=this.controllerList.get(e);void 0!==t?(t.dispose(),this.controllerList.delete(e),this.starts.delete(e)):console.error("Expected controller")},this.websocket_send_message=(e,t)=>{const n=this.socket.get(e);var s;void 0===n?console.error(`Missing socket connection for callback_id=${e}`):n.send(t instanceof Uint8Array?t:(s=t,JSON.stringify(s)))},this.getWasm=e,this.controllerList=new Map,this.socket=new Map,this.starts=new Map,window.addEventListener("pagehide",e=>{if(e.persisted)for(const e of this.controllerList.values())e.dispose()}),window.addEventListener("pageshow",e=>{if(e.persisted)for(const e of this.starts.values())e()})}start(e,t,n){const s=this.getWasm();this.controllerList.get(t)?.dispose();const o=E.startSocket(e,n,e=>{if(this.controllerList.get(t)===o){if("socket"===e.type)return this.socket.set(t,e.socket),void T(s,t,"Connected");if("message"===e.type){const n=e.message;return void T(s,t,{Message:{message:"string"==typeof n?C(n):n}})}return"close"===e.type?(this.socket.delete(t),T(s,t,{Disconnected:{code:e.code,reason:e.reason,connected:e.connected}})):(e=>{throw console.error(e),Error("unknown message")})(e)}});this.controllerList.set(t,o)}}const A=e=>{const t={};for(const{k:n,v:s}of e)t[n]=s;return t},_=e=>{if("None"!==e)return JSON.stringify(e.Data.data)},N=e=>0===e.length?null:u(e),M=(e,t)=>{if((e=>"text/plain"===e?.split(";")[0]?.trim().toLowerCase())(e))return{Text:t};try{return{Json:N(t)}}catch{return{Text:t}}},L=async(e,t,n)=>{const s=e(),o=e=>{s.wasmCommand({FetchExecResponse:{response:e,callback:t}})};try{const e=await fetch(n.url,{method:n.method,headers:A(n.headers),body:_(n.body)});o(await(async e=>{const t=e.status,n=e.headers.get("Content-Type");try{return{Ok:{status:t,response:M(n,await e.text())}}}catch(e){return{Err:{message:String(e)}}}})(e))}catch(e){console.error("fetch error (1)",e);o({Err:{message:new String(e).toString()}})}};class S{constructor(e){this.timerSet=(e,t,n)=>{switch(n){case"Interval":{const n=setInterval(()=>{this.getWasm().wasmCommand({TimerCall:{callback:e}})},t);this.data.set(e,{kind:"Interval",timerId:n});break}case"Timeout":{const n=setTimeout(()=>{this.getWasm().wasmCommand({TimerCall:{callback:e}})},t);this.data.set(e,{kind:"Timeout",timerId:n});break}}},this.timerClear=e=>{const t=this.data.get(e);if(void 0===t)throw Error("panic");switch(t.kind){case"Interval":clearInterval(t.timerId);break;case"Timeout":clearTimeout(t.timerId)}},this.getWasm=e,this.data=new Map}}class R{constructor(e){this.request=null,this.start=()=>{null===this.request&&(this.request=requestAnimationFrame(this.frame))},this.stop=()=>{null!==this.request&&(cancelAnimationFrame(this.request),this.request=null)},this.frame=e=>{this.request=requestAnimationFrame(this.frame),this.getWasm().wasmCommand({AnimationFrame:{time:e}})},this.getWasm=e}}class ${constructor(e,t,n,s,o){this.getWasm=e,this.get=n,this.pushValue=s,this.replaceValue=o,this.callback=new Map,this.trigger=()=>{for(const e of Array.from(this.callback.values()))e()},this.add=e=>{this.callback.set(e,()=>{this.getWasm().wasmCommand({LocationCall:{callback:e,value:this.get()}})})},this.remove=e=>{this.callback.delete(e)},this.push=e=>{this.get()!==e&&this.pushValue(e,this.trigger)},this.replace=e=>{this.get()!==e&&this.replaceValue(e,this.trigger)},window.addEventListener(t,this.trigger)}}class I{constructor(e,t){this.mountPoint=t,this.callback=(e,t,n)=>{switch(t){case"Add":return void this.locations[e].add(n);case"Remove":return void this.locations[e].remove(n)}},this.set=(e,t,n)=>{switch(t){case"Push":return void this.locations[e].push(n);case"Replace":return void this.locations[e].replace(n)}},this.get=e=>this.locations[e].get(),this.locations={Hash:new $(e,"hashchange",()=>decodeURIComponent(location.hash.slice(1)),(e,t)=>{location.hash=e,t()},e=>{history.replaceState(null,"",`#${e}`)}),History:new $(e,"popstate",()=>window.location.pathname+window.location.search+window.location.hash,(e,t)=>{window.history.pushState(null,"",e),t()},(e,t)=>{window.history.replaceState(null,"",e),t()})}}}class U{constructor(){this.get=e=>{for(const t of document.cookie.split(";")){if(""===t)continue;const n=t.trim().split("=");if(2!==n.length){console.warn(`Cookies.get: Incorrect number of cookieChunk => ${n.length} in ${t}`);continue}const s=n[0],o=n[1];if(void 0!==s&&void 0!==o){if(s===e)return decodeURIComponent(o)}else console.warn(`Cookies.get: Broken cookie part => ${t}`)}return""},this.getJson=e=>{const t=this.get(e);if(0!==t.length)try{return u(t)}catch(e){console.error("Error deserializing cookie",e)}return null},this.set=(e,t,n)=>{const s=encodeURIComponent(t),o=new Date;o.setTime(o.getTime()+1e3*n);const r="expires="+o.toUTCString();document.cookie=`${e}=${s};${r};path=/; samesite=Strict`},this.setJson=(e,t,n)=>{const s=JSON.stringify(t);this.set(e,s,n)}}}const B=(e,t)=>{const n=t-e+1;return e+Math.floor(Math.random()*n)},F=e=>void 0!==e.languages&&e.languages.length>0?[...e.languages]:e.language?[e.language]:[],W=e=>e.arrayBuffer().then(t=>({name:e.name,data:new Uint8Array(t)}));const O=(e,t,n)=>{Promise.all(e).then(e=>{const n=[];for(const t of e)n.push([t.name,Array.from(t.data)]);t([n])}).catch(e=>{console.error(n,e)})},H=(e,t)=>{t(void 0)},D=(e,t)=>{e.preventDefault(),t(void 0)},V=(e,t)=>{t(void 0)&&e.preventDefault()},P=(e,t,n)=>{if(null!==t&&"object"==typeof t&&!Array.isArray(t)&&("stop_propagation"in t&&!0===t.stop_propagation&&e.stopPropagation(),"prevent_default"in t&&!0===t.prevent_default&&e.preventDefault(),n&&"capture_pointer"in t&&!0===t.capture_pointer))try{n()}catch(e){console.warn("capture_pointer",e)}},J=(e,t)=>{const n=e.currentTarget;if(!(e instanceof PointerEvent&&n instanceof Element))throw Error("#pointer");const s=n.getBoundingClientRect();P(e,t([e.pointerId,e.pointerType,e.isPrimary,e.button,e.buttons,e.clientX-s.left,e.clientY-s.top,s.width,s.height,e.altKey,e.ctrlKey,e.shiftKey,e.metaKey]),()=>{n.setPointerCapture(e.pointerId)})},K=e=>(t,n)=>{const s=t.target;s instanceof HTMLInputElement||s instanceof HTMLTextAreaElement||e&&s instanceof HTMLSelectElement?n(s.value):console.warn("event input ignore",s)},z=(e,t)=>{if(e instanceof KeyboardEvent){return void(!0===t([e.key,e.code,e.altKey,e.ctrlKey,e.shiftKey,e.metaKey])&&(e.preventDefault(),e.stopPropagation()))}console.warn("keydown ignore",e)},q=["loadedmetadata","durationchange","timeupdate","progress","play","playing","pause","waiting","seeked","ended","volumechange","error"],G=e=>{const{buffered:t,currentTime:n}=e;for(let e=0;e<t.length;e++)if(t.start(e)<=n&&n<=t.end(e))return t.end(e);return n},j=(e,t,n)=>{n([t,e.currentTime,Number.isFinite(e.duration)?e.duration:null,e.paused,e.ended,e.muted,e.volume,G(e)])};let Y=[];const X=e=>{Y?.push(e)};"undefined"!=typeof window&&window.addEventListener("message",X);const Z={click:(e,t)=>{if(!(e instanceof MouseEvent))throw Error("#click");P(e,t([e.altKey,e.ctrlKey,e.shiftKey,e.metaKey]))},submit:D,input:K(!1),change:K(!0),blur:H,mousedown:V,mouseup:V,mouseenter:H,mouseleave:H,keydown:z,hook_keydown:z,drop:(e,t)=>{if(e.preventDefault(),e instanceof DragEvent)if(null===e.dataTransfer)console.error("dom -> drop -> dataTransfer null");else{const n=function(e){const t=[];for(let n=0;n<e.length;n++){const s=e[n];if(void 0===s)console.error("dom -> drop -> item - undefined");else{const e=s.getAsFile();null===e?console.error(`dom -> drop -> index:${n} -> It's not a file`):t.push(W(e))}}return t}(e.dataTransfer.items);n.length?O(n,t,"callback_drop -> promise.all -> "):console.error("No files to send")}else console.warn("event drop ignore",e)},load:D,change_file:(e,t)=>{const n=e.target;if(n instanceof HTMLInputElement&&null!==n.files&&n.files.length>0){const e=[];for(let t=0;t<n.files.length;t++){const s=n.files[t];void 0!==s&&e.push(W(s))}return e.length>0&&O(e,t,"changeFile ->"),void(n.value="")}console.warn("changeFile: not a file input or no files",n)},change_checked:(e,t)=>{const n=e.target;n instanceof HTMLInputElement?t(n.checked):console.warn("changeChecked: not an input",n)},wheel:(e,t)=>{const n=e.currentTarget;if(!(e instanceof WheelEvent&&n instanceof Element))throw Error("#wheel");const s=n.getBoundingClientRect();P(e,t([e.deltaX,e.deltaY,e.deltaZ,e.deltaMode,e.clientX-s.left,e.clientY-s.top,s.width,s.height,e.altKey,e.ctrlKey,e.shiftKey,e.metaKey]))},pointerdown:J,pointermove:J,pointerup:J,pointercancel:J},Q=e=>"change_file"===e||"change_checked"===e?"change":e;class ee{constructor(e){this.getWasm=e,this.callbacks=new Map,this.observers=new Map}add(e,t,n,s){if("intersect"===n)return void this.intersectAdd(e,t,s);const o=e=>this.wasmCallback(s,e),r=e=>{const t=Z[n];void 0!==t?t(e,o):console.error(`No support for the event ${n}`)};if(this.callbacks.has(s))console.error(`There was already a callback added with the callback_id=${s}`);else{if("media"===n){const n=e.get("callback_add",t);if(!(n instanceof HTMLMediaElement))throw Error(`on_media: expected id=${t} as HTMLMediaElement`);const r=e=>j(n,e.type,o);return this.callbacks.set(s,r),q.forEach(e=>n.addEventListener(e,r,!1)),void(null!==n.error?queueMicrotask(()=>j(n,"error",o)):n.readyState>=1&&queueMicrotask(()=>j(n,"loadedmetadata",o)))}if("message"===n){const n=e.get("callback_add",t);if(!(n instanceof HTMLIFrameElement))throw Error(`on_message: expected id=${t} as HTMLIFrameElement`);const r=e=>{e instanceof MessageEvent&&null!==e.source&&e.source===n.contentWindow&&((e,t)=>{let n;try{n=u(JSON.stringify(e.data)??"null")}catch{n=null}t([e.origin,n])})(e,o)};this.callbacks.set(s,r),window.addEventListener("message",r,!1);const i=[...Y??[]];return void(i.length>0&&queueMicrotask(()=>i.forEach(r)))}if(this.callbacks.set(s,r),"hook_keydown"===n)document.addEventListener("keydown",r,!1);else{e.get("callback_add",t).addEventListener(Q(n),r,"wheel"===n&&{passive:!1})}}}remove(e,t,n,s){if("intersect"===n)return void this.intersectRemove(s);const o=this.callbacks.get(s);if(this.callbacks.delete(s),void 0!==o)if("media"===n){const n=e.get("callback_remove",t);q.forEach(e=>n.removeEventListener(e,o))}else if("message"===n)window.removeEventListener("message",o);else if("hook_keydown"===n)document.removeEventListener("keydown",o);else{e.get("callback_remove",t).removeEventListener(Q(n),o)}else console.error(`The callback is missing with the id=${s}`)}forgetEarlyMessages(){null!==Y&&(window.removeEventListener("message",X),Y=null)}wasmCallback(e,t){return this.getWasm().wasmCommand({CallbackCall:{callback_id:e,value:t}})}intersectAdd(e,t,n){if(this.observers.has(n))return void console.error(`There was already an intersect observer added with the callback_id=${n}`);const s=e.getNode("callback_add",t),o=new IntersectionObserver(e=>{for(const t of e)this.wasmCallback(n,[t.isIntersecting,t.intersectionRatio,t.boundingClientRect.top,t.boundingClientRect.bottom,t.boundingClientRect.height])});o.observe(s),this.observers.set(n,o)}intersectRemove(e){const t=this.observers.get(e);this.observers.delete(e),void 0!==t?t.disconnect():console.error(`The intersect observer is missing with the id=${e}`)}}function te(e,t){e.addEventListener("click",n=>{const s=e.getAttribute("href");if(null===s||s.startsWith("#"))return;if(!((o=n)instanceof MouseEvent&&0===o.button)||o.ctrlKey||o.metaKey||o.shiftKey||o.altKey||e.hasAttribute("download")||!function(e){const t=e.getAttribute("target");return null===t||""===t||"_self"===t}(e))return;var o;const r=function(e,t,n){if(e.matches('[rel~="external" i]'))return null;let s;try{s=new URL(t,document.baseURI)}catch{return null}if(s.protocol!==window.location.protocol||s.host!==window.location.host)return null;const o=n.replace(/\/+$/,"");if(""!==o&&s.pathname!==o&&!s.pathname.startsWith(`${o}/`))return null;return s.pathname+s.search+s.hash}(e,s,t.mountPoint);null!==r&&(n.preventDefault(),t.set("History","Push",r),function(e){const t=e.indexOf("#"),n=-1===t?"":e.slice(t+1),s=oe(n);if(se=null,null!==s)return void s.scrollIntoView();window.scrollTo(0,0),""!==n&&"top"!==ie(n).toLowerCase()&&(se={path:e,fragment:n,until:Date.now()+ne,scrollY:window.scrollY})}(r))})}const ne=1e4;let se=null;function oe(e){return""===e?null:re(e)??re(ie(e))}function re(e){return document.getElementById(e)??Array.from(document.getElementsByName(e)).find(e=>"A"===e.tagName)??null}function ie(e){try{return decodeURIComponent(e)}catch{return e}}const ae=new Set(["animate","animateMotion","animateTransform","circle","clipPath","defs","desc","discard","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","hatch","hatchpath","image","line","linearGradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialGradient","rect","set","stop","svg","switch","symbol","text","textPath","tspan","use","view","svg:a","svg:title","svg:desc","svg:script","svg:style"]);class ce{constructor(e,t,n){this.depth=-1,this.matched=0,this.discarded=0,this.nodes=t,this.appLocation=n,this.virtualNodes=this.createVirtualNodes(e)}hydrate(){const e=this.virtualNodes.get(3),t=this.virtualNodes.get(2);e&&(this.hydrateNode(3,document.body),t&&this.hydrateNode(2,document.head));const n={rootFound:void 0!==e,matched:this.matched,...this.countHydratable(),total:this.virtualNodes.size,discarded:this.discarded};if(!e)return console.error("Hydration skipped: the first DOM batch carries no <body> (node id 3), so the server-rendered markup cannot be matched and will be replaced. The app flushed DOM changes before the root element was built - see `mount` in exports.rs.",n),this.publish(n),n;const s=0===n.hydratable?"100.00":(100*n.matched/n.hydratable).toFixed(2),o=`Hydration complete: ${n.matched}/${n.hydratable} matched (${s}%), ${n.discarded} server nodes discarded, ${n.skipped} markers skipped, ${n.total} vnodes in batch.`;return n.matched<n.hydratable||n.discarded>0?console.warn(o):console.log(o),this.publish(n),n}publish(e){try{window.__vertigo_hydration=e}catch(e){}}countHydratable(){let e=0,t=0;const n=new Set,s=(o,r)=>{if(n.has(o))return;n.add(o);const i=this.virtualNodes.get(o);if(r||(void 0===i||void 0===i.name&&!(e=>void 0!==e.value&&""!==e.value)(i)?t++:e++),i)for(const e of i.children)s(e,!1)};return s(3,!0),s(2,!0),{hydratable:e,skipped:t}}hydrateNode(e,t){const n=this.virtualNodes.get(e);if(!n)return;const s=Array.from(t.childNodes);let o=0;this.depth++;let r=!1;for(const e of n.children){const t=this.virtualNodes.get(e);if(t&&""!==t.value)if(r&&void 0!==t.value)this.matched++;else{r=!1;for(let n=o;n<s.length;n++){const i=s[n];if(!i)continue;let a=!1;if(t.name?a=this.checkElementMatch(i,t):void 0!==t.value&&(i.nodeType===Node.TEXT_NODE?(this.checkTextMatch(i,t),a=!0,r=!0):console.error(`Hydration ${this.depth}: Text node mismatch`,t,i)),a){this.removeSkippedNodes(s,o,n),this.claimNode(i,e),this.matched++,t.name&&this.hydrateNode(e,i),o=n+1;break}}}}this.removeSkippedNodes(s,o,s.length),this.depth--}checkElementMatch(e,t){let n=!1;const s=void 0===t.name?void 0:(o=t.name,ae.has(o)?o.replace("svg:",""):o.toUpperCase());var o;if(e.nodeType===Node.ELEMENT_NODE&&e.tagName===s){n=!0;const s=e,o=t.attributes;for(const e of s.getAttributeNames())o&&o.has(e)||s.removeAttribute(e);if(o)for(const[e,t]of o)s.getAttribute(e)!==t&&s.setAttribute(e,t)}return n}checkTextMatch(e,t){e.textContent?.replace("\n"," ").trim()!==t.value?.replace("\n"," ").trim()&&(e.textContent=t.value||"")}claimNode(e,t){var n,s;(e instanceof Element||e instanceof Comment||e instanceof Text)&&(this.nodes.claimNode(t,e),e instanceof Element&&(n=e,s=this.appLocation,"a"===n.tagName.toLowerCase()&&te(n,s)))}place(){for(const e of[...this.virtualNodes.values()].reverse()){const t=this.nodes.getAnyOption(e.id);if(!t)continue;const n=1===e.id;let s=t.firstChild;for(const o of e.children){const e=this.nodes.getAnyOption(o);e&&(e===s||n&&e.parentNode===t?s=e.nextSibling:t.insertBefore(e,s))}}}removeSkippedNodes(e,t,n){for(let s=t;s<n;s++){const t=e[s];t&&(0!==this.depth&&t.nodeType!==Node.TEXT_NODE&&(console.warn(`Hydration ${this.depth}: Removing node`,t),this.discarded++),t.remove())}}createVirtualNodes(e){const t=new Map,n=e=>{let n=t.get(e);return n||(n={id:e,children:[]},t.set(e,n)),n},s=new Map,o=e=>{const t=s.get(e);t&&(t.children.splice(t.children.indexOf(e),1),s.delete(e))},r=e=>{o(e),t.delete(e)};for(const i of e)if("CreateNode"in i){n(i.CreateNode.id).name=i.CreateNode.name}else if("CreateText"in i){n(i.CreateText.id).value=i.CreateText.value}else if("UpdateText"in i){n(i.UpdateText.id).value=i.UpdateText.value}else if("InsertBefore"in i){const e=n(i.InsertBefore.parent),t=e.children,r=i.InsertBefore.child,a=i.InsertBefore.ref_id;if(o(r),s.set(r,e),null===a)t.push(r);else{const e=t.length-1,n=t[e]===a?e:t.indexOf(a);-1!==n?t.splice(n,0,r):(console.warn(`Hydration: ref_id ${a} not found in parent ${i.InsertBefore.parent}`),t.push(r))}}else if("SetAttr"in i){const e=n(i.SetAttr.id);e.attributes||(e.attributes=new Map),e.attributes.set(i.SetAttr.name,i.SetAttr.value)}else"RemoveAttr"in i?t.get(i.RemoveAttr.id)?.attributes?.delete(i.RemoveAttr.name):"RemoveNode"in i?r(i.RemoveNode.id):"RemoveText"in i?r(i.RemoveText.id):"RemoveComment"in i&&r(i.RemoveComment.id);return t}}const le=1,de=2,he=3,ue=4,me=5,fe=6,ge=7,pe=8,we=9,ve=10,ye=11,be=12,ke=13,Ee=14;class Ce{constructor(e){this.bytes=e,this.at=0}isEmpty(){return this.at>=this.bytes.length}where(){return`offset ${this.at} of ${this.bytes.length}`}byte(){const e=this.bytes[this.at];if(void 0===e)throw new Error("dom command: buffer ended early");return this.at+=1,e}varint(){let e=0,t=1;for(;;){const n=this.byte();if(e+=(127&n)*t,!(128&n))return e;t*=128}}string(){return e.decode(this.bytesView())}bytesView(){const e=this.varint(),t=this.at+e;if(t>this.bytes.length)throw new Error("dom command: bytes run past the end of the buffer");const n=this.bytes.subarray(this.at,t);return this.at=t,n}name(e){const t=this.varint(),n=e[t];if(void 0===n)throw new Error(`dom command: name index ${t} is not in the dictionary`);return n}optionalId(){const e=this.varint();return 0===e?null:e}}const Te=e=>{const t=e.varint(),n=[];for(let s=0;s<t;s++)n.push(e.string());return n},xe=e=>e.varint(),Ae=e=>e.string(),_e=(e,t)=>e.name(t),Ne={[le]:["CreateNode",[["id",xe],["name",_e]]],[de]:["CreateText",[["id",xe],["value",Ae]]],[he]:["UpdateText",[["id",xe],["value",Ae]]],[ue]:["SetAttr",[["id",xe],["name",_e],["value",Ae]]],[me]:["RemoveAttr",[["id",xe],["name",_e]]],[fe]:["RemoveNode",[["id",xe]]],[ge]:["RemoveText",[["id",xe]]],[pe]:["InsertBefore",[["parent",xe],["child",xe],["ref_id",e=>e.optionalId()]]],[we]:["InsertCss",[["selector",e=>0===e.byte()?null:e.string()],["value",Ae]]],[ve]:["CreateComment",[["id",xe],["value",Ae]]],[ye]:["RemoveComment",[["id",xe]]],[be]:["CallbackAdd",[["id",xe],["event_name",Ae],["callback_id",xe]]],[ke]:["CallbackRemove",[["id",xe],["event_name",Ae],["callback_id",xe]]],[Ee]:["CanvasDraw",[["id",xe],["drawing",e=>e.bytesView().slice()]]]};class Me{constructor(){this.data=new Map,this.initNodes=[...this.getRootHead().childNodes,...this.getRootBody().childNodes],this.style=document.createElement("style")}getRootHtml(){return document.documentElement}getRootHead(){return document.head}getRootBody(){return document.body}set(e,t){1===e||2===e||3===e||this.data.set(e,t)}getAnyOption(e){return 1===e?this.getRootHtml():2===e?this.getRootHead():3===e?this.getRootBody():this.data.get(e)}getAny(e,t){const n=this.getAnyOption(t);if(void 0===n)throw Error(`${e} -> item not found=${t}`);return n}get(e,t){const n=this.getAnyOption(t);if(void 0===n)throw new Error(`${e}->get: Item id not found = ${t}`);return n}expect(e,t,n,s){const o=this.get(e,t);if(o instanceof n)return o;throw Error(`Expected id=${t} as ${s}`)}getNode(e,t){return this.expect(e,t,Element,"Element")}getText(e,t){return this.expect(e,t,Text,"Text")}delete(e,t){const n=this.getAnyOption(t);if(this.data.delete(t),void 0===n)throw new Error(`${e}->delete: Item id not found = ${t}`);return n}insertCss(e,t){if(null!==e){const n=document.createTextNode(`\n${e} { ${t} }`);this.style.appendChild(n)}else{const e=document.createTextNode(`\n${t}`);this.style.appendChild(e)}}removeInitNodes(){const e=this.initNodes;if(this.initNodes=null,null!==e)for(const t of e)t.remove()}insertBefore(e,t,n){const s=this.get("insert_before",e),o=this.getAny("insert_before child",t);if(null==n)s.insertBefore(o,null);else{const e=this.getAny("insert_before ref",n);s.insertBefore(o,e)}}addStyles(){const e=this.getRootHead();e.lastChild!==this.style&&e.appendChild(this.style)}hasInitNodes(){return null!==this.initNodes}claimNode(e,t){if(this.data.set(e,t),this.initNodes){const e=this.initNodes.indexOf(t);e>-1&&this.initNodes.splice(e,1)}}has(e){return 1===e||2===e||3===e||this.data.has(e)}}const Le=1,Se=2,Re=3,$e=4,Ie=5,Ue=6,Be=7,Fe=8,We=9,Oe=10,He=11,De=12,Ve=["butt","round","square"],Pe=["miter","round","bevel"];class Je{constructor(){this.drawings=new WeakMap,this.sizes=new WeakMap,this.unscaled=new WeakSet,this.drawn=new Set,this.observer=null}draw(e,t){if(!(e instanceof HTMLCanvasElement))throw new Error("draw: the element is not a canvas");const n=this.drawings.has(e);this.drawings.set(e,t.slice()),n||this.observe(e),this.drawn.add(e)}paintDrawn(){for(const e of this.drawn)this.repaint(e);this.drawn.clear()}forget(e){e instanceof HTMLCanvasElement&&this.drawings.has(e)&&(this.observer?.unobserve(e),this.drawings.delete(e),this.sizes.delete(e),this.unscaled.delete(e),this.drawn.delete(e))}observe(e){if("undefined"!=typeof ResizeObserver){null===this.observer&&(this.observer=new ResizeObserver(e=>{for(const t of e){const e=t.target;if(!(e instanceof HTMLCanvasElement))throw Error("#canvas");const n=window.devicePixelRatio||1;this.sizes.set(e,{width:Math.round(t.contentRect.width*n),height:Math.round(t.contentRect.height*n),ratio:n}),this.repaint(e)}}));try{this.observer.observe(e,{box:"device-pixel-content-box"})}catch{this.observer.observe(e)}}}repaint(e){const t=this.drawings.get(e);if(void 0!==t)try{this.paint(e,t)}catch(e){console.error(e)}}size(e){if(this.unscaled.has(e))return{width:e.width,height:e.height,ratio:1};const t=window.devicePixelRatio||1,n=this.sizes.get(e)??(e.isConnected?{width:Math.round(e.clientWidth*t),height:Math.round(e.clientHeight*t),ratio:t}:null);return null!==n&&n.width>0&&n.height>0?n:null}paint(t,n){let s=this.size(t);if(null===s)return;if(t.width!==s.width||t.height!==s.height){const[e,n]=[t.width,t.height],[o,r]=[t.clientWidth,t.clientHeight];t.width!==s.width&&(t.width=s.width),t.height!==s.height&&(t.height=s.height),1!==s.ratio&&t.clientWidth-o===s.width-e&&t.clientHeight-r===s.height-n&&(t.width=e,t.height=n,this.unscaled.add(t),s={width:e,height:n,ratio:1})}const o=t.getContext("2d");null!==o&&((t,n,s,o,r)=>{const i=new DataView(n.buffer,n.byteOffset,n.byteLength);let a=0;const c=()=>{const e=i.getFloat32(a,!0);return a+=4,e},l=()=>{const t=i.getUint16(a,!0),s=e.decode(n.subarray(a+2,a+2+t));return a+=2+t,s};t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,s,o),t.globalAlpha=1,t.fillStyle="#000",t.strokeStyle="#000",t.lineWidth=1,t.lineCap="butt",t.lineJoin="miter";let d=r;if(1===i.getUint8(a++)){const e=c(),n=c(),r=c(),i=c();d=Math.min(s/r,o/i),t.setTransform(d,0,0,d,(s-r*d)/2-e*d,(o-i*d)/2-n*d)}else t.setTransform(r,0,0,r,0,0);if(!(d>0&&isFinite(d)))return;const h=r/d,u=(e,n,s)=>{t.beginPath(),t.arc(e,n,Math.max(s,0),0,2*Math.PI)};for(;a<n.length;){const e=i.getUint8(a++);switch(e){case Le:t.fillStyle=l();break;case Se:t.strokeStyle=l();break;case Re:t.globalAlpha=c();break;case $e:t.lineWidth=c();break;case Ie:t.lineWidth=c()*h;break;case Ue:t.lineCap=Ve[i.getUint8(a++)]??"butt";break;case De:t.lineJoin=Pe[i.getUint8(a++)]??"miter";break;case Be:t.fillRect(c(),c(),c(),c());break;case Fe:u(c(),c(),c()),t.fill();break;case We:u(c(),c(),c()*h),t.fill();break;case Oe:u(c(),c(),c()),t.stroke();break;case He:{const e=i.getUint32(a,!0);a+=4,t.beginPath();for(let n=0;n<e;n++){const e=c(),s=c();0===n?t.moveTo(e,s):t.lineTo(e,s)}e>1&&t.stroke();break}default:throw new Error(`canvas: unknown operation ${e} at byte ${a-1}`)}}})(o,n,s.width,s.height,s.ratio)}}const Ke=(e,t)=>{console.error("bulk_update - item",t,e)},ze=(e,t)=>e.findIndex(e=>e.toLowerCase()===t);class qe{constructor(e,t,n){this.metadata=e,this.canvases=new Je,this.update=e=>{const t=this.nodes.hasInitNodes()&&this.metadata.getEnabledHydration()?((e,t,n)=>{const s=new ce(e,t,n);return{report:s.hydrate(),place:()=>s.place()}})((e=>{const t=new Ce(e),n=Te(t),s=[];for(;!t.isEmpty();){const e=t.byte(),o=Ne[e];if(void 0===o)throw new Error(`dom command: unknown tag ${e}`);const[r,i]=o,a={};for(const[e,s]of i)a[e]=s(t,n);s.push({[r]:a})}return s})(e),this.nodes,this.appLocation):null,n=t?.report.rootFound?t:null,s=new Ce(e),o=Te(s),r=ze(o,"autofocus"),i=ze(o,"a"),a=new Set;try{for(;!s.isEmpty();){const e=s.byte();switch(e){case le:{const e=s.varint(),t=s.varint();try{this.createNode(e,o[t]??"",t===i)}catch(e){Ke(e,"CreateNode")}break}case de:{const e=s.varint(),t=s.string();try{this.createText(e,t)}catch(e){Ke(e,"CreateText")}break}case he:{const e=s.varint(),t=s.string();try{this.updateText(e,t)}catch(e){Ke(e,"UpdateText")}break}case ue:{const e=s.varint(),t=s.varint(),n=s.string();t===r&&a.add(e);try{this.writeAttr("set_attribute",e,o[t]??"",n)}catch(e){Ke(e,"SetAttr")}break}case me:{const e=s.varint(),t=s.varint();try{this.writeAttr("remove_attribute",e,o[t]??"",null)}catch(e){Ke(e,"RemoveAttr")}break}case fe:{const e=s.varint();try{this.removeNode(e)}catch(e){Ke(e,"RemoveNode")}break}case ge:{const e=s.varint();try{this.removeText(e)}catch(e){Ke(e,"RemoveText")}break}case pe:{const e=s.varint(),t=s.varint(),o=s.optionalId();if(null===n)try{this.nodes.insertBefore(e,t,o)}catch(e){Ke(e,"InsertBefore")}break}case we:{const e=0===s.byte()?null:s.string(),t=s.string();try{this.nodes.insertCss(e,t)}catch(e){Ke(e,"InsertCss")}break}case ve:{const e=s.varint(),t=s.string();try{this.nodes.set(e,document.createComment(t))}catch(e){Ke(e,"CreateComment")}break}case ye:{const e=s.varint();try{this.nodes.delete("remove_comment",e).remove()}catch(e){Ke(e,"RemoveComment")}break}case be:{const e=s.varint(),t=s.string(),n=s.varint();try{this.callbacks.add(this.nodes,e,t,n)}catch(e){Ke(e,"CallbackAdd")}break}case ke:{const e=s.varint(),t=s.string(),n=s.varint();try{this.callbacks.remove(this.nodes,e,t,n)}catch(e){Ke(e,"CallbackRemove")}break}case Ee:{const e=s.varint(),t=s.bytesView();try{this.canvases.draw(this.nodes.getNode("canvas_draw",e),t)}catch(e){Ke(e,"CanvasDraw")}break}default:throw new Error(`bulk_update: unknown command tag ${e}`)}}}catch(e){console.error(`bulk_update - stream is unreadable at ${s.where()}, dropping the rest of the batch`,e)}n?.place(),a.size>0&&setTimeout(()=>{for(const e of a){const t=this.nodes.getAnyOption(e);t instanceof HTMLElement&&t.focus()}},0),this.nodes.removeInitNodes(),this.callbacks.forgetEarlyMessages(),this.nodes.addStyles(),this.canvases.paintDrawn(),function(){if(null===se)return;if(window.location.pathname+window.location.search+window.location.hash!==se.path||window.scrollY>se.scrollY||Date.now()>se.until)return void(se=null);se.scrollY=window.scrollY;const e=oe(se.fragment);null!==e&&(se=null,e.scrollIntoView())}()},this.appLocation=t,this.nodes=new Me,this.callbacks=new ee(n),document.addEventListener("dragover",e=>{e.preventDefault()})}createNode(e,t,n){if(1===e||2===e||3===e)return;if(this.nodes.has(e))return;const s=(e=>ae.has(e)?document.createElementNS("http://www.w3.org/2000/svg",e.replace("svg:","")):document.createElement(e))(t);this.nodes.set(e,s),n&&te(s,this.appLocation)}writeAttr(e,t,n,s){const o=this.nodes.getNode(e,t);if(null===s?o.removeAttribute(n):o.getAttribute(n)!==s&&o.setAttribute(n,s),"value"==n){const e=s??"";if(o instanceof HTMLInputElement)return void(o.value=e);if(o instanceof HTMLTextAreaElement)return o.value=e,void(o.defaultValue=e)}"checked"==n&&o instanceof HTMLInputElement&&(o.checked=null!==s)}removeNode(e){if(1===e||2===e||3===e)return;const t=this.nodes.delete("remove_node",e);this.canvases.forget(t),t.remove()}createText(e,t){if(this.nodes.has(e))return;const n=document.createTextNode(t);this.nodes.set(e,n)}removeText(e){this.nodes.delete("remove_node",e).remove()}updateText(e,t){this.nodes.getText("set_attribute",e).textContent=t}}const Ge={Debug:"debug",Info:"info",Log:"log",Warn:"warn",Error:"error"};class je{constructor(e,t){this.metadata=e,this.getWasm=t;const n=new I(t,e.getEnv("vertigo-mount-point")??"/");this.dom=new qe(e,n,t),this.websocket=new x(t),this.interval=new S(t),this.animationFrames=new R(t),this.location=n,this.cookie=new U}exec(e){const t=e;if("FetchCacheGet"===t)return{data:this.metadata.getFetchCache()};if("IsBrowser"===t)return{value:!0};if("GetDateNow"===t)return{value:Date.now()};if("TimezoneOffset"===t)return{value:(new Date).getTimezoneOffset()};if("Languages"===t)return{value:F(navigator)};if("HistoryBack"===t)return window.history.back(),null;if("AnimationFrameStart"===t)return this.animationFrames.start(),null;if("AnimationFrameStop"===t)return this.animationFrames.stop(),null;const n=t,[s,o]=Object.entries(n)[0]??[];switch(s){case"FetchExec":return L(this.getWasm,o.callback,o.request),null;case"WebsocketRegister":return this.websocket.websocket_register_callback(o.host,o.callback,o.connect_timeout),null;case"WebsocketSendMessage":return this.websocket.websocket_send_message(o.callback,o.message),null;case"WebsocketUnregister":return this.websocket.websocket_unregister_callback(o.callback),null;case"TimerSet":return this.interval.timerSet(o.callback,o.duration,o.kind),null;case"TimerClear":return this.interval.timerClear(o.callback),null;case"LocationGet":return{value:this.location.get(o.target)};case"LocationCallback":return this.location.callback(o.target,o.mode,o.callback),null;case"LocationSet":return this.location.set(o.target,o.mode,o.value),null;case"CookieGet":return{value:this.cookie.get(o.name)};case"CookieSet":return this.cookie.set(o.name,o.value,o.expires_in),null;case"CookieJsonGet":return{value:this.cookie.getJson(o.name)};case"CookieJsonSet":return this.cookie.setJson(o.name,o.value,o.expires_in),null;case"GetEnv":return{value:this.metadata.getEnv(o.name)};case"Log":return console[Ge[o.kind]](o.message,o.arg2,o.arg3,o.arg4),null;case"GetRandom":return{value:B(o.min,o.max)};case"JsApiCall":return this.executeJsApiCall(o.commands);case"DomBulkUpdate":return this.dom.update(o.commands),null;default:return console.info("exec_command: Arg",t),(()=>{throw Error("assert never")})()}}executeJsApiCall(e){let t=null;for(const n of e)if("Root"in n)if("window"===n.Root.name)t=window;else{if("document"!==n.Root.name)return console.error(`Unknown root: ${n.Root.name}`),null;t=document}else if("RootElement"in n){const e=n.RootElement.dom_id,s=this.dom.nodes.getAnyOption(e);if(void 0===s)return console.error(`Element not found: ${e}`),null;t=s}else if("Get"in n){if(null===t)return console.error("Get called on null"),null;t=t[n.Get.property]}else if("Set"in n){if(null===t)return console.error("Set called on null"),null;t[n.Set.property]=n.Set.value,t=void 0}else if("Call"in n){if(null===t)return console.error("Call called on null"),null;t=t[n.Call.method](...n.Call.args)}const n=e=>{if(null==e)return null;if("boolean"==typeof e)return e;if("string"==typeof e)return e;if("number"==typeof e)return e;if(e instanceof Uint8Array)return e.slice();if(Array.isArray(e))return e.map(e=>n(e));if((e=>{if(null===e)return!1;if("object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t})(e)){const t={};for(const s of Object.keys(e))t[s]=n(e[s]);return t}return null};return n(t)}}class Ye{constructor(){this.get=e=>this.metadata.getAttribute(e),this.getEnabledHydration=()=>"true"!==this.get("data-env-disable-hydration");const e=document.getElementById("v-metadata");if(null===e)throw Error("Expected v-metadata");this.metadata=e,e.remove()}getEnv(e){return this.get(`data-env-${e}`)}getFetchCache(){return this.get("data-fetch-cache")}}class Xe{constructor(e){this.wasm=e}vertigoEntryFunction(e,t){this.wasm.exports.vertigo_entry_function(e,t)}static async create(t){let s=null;const o=()=>{if(null===s)throw Error("Wasm is no initialized");return s},r=new Ye,i=new je(r,o);return window.$vertigoApi=i,s=await w(t,{mod:{panic_message:t=>{const n=Number(t%2n**32n),s=Number(t>>32n),r=o().getUint8Memory().subarray(s,s+n),i=e.decode(r);console.error("PANIC",i)},dom_access:e=>{if(0n===e)return console.error("dom_access - null pointer"),0n;const t=new n(()=>o().getUint8Memory(),e),s=f(t);o().exports.vertigo_export_free_block(e);const r=i.exec(s),a=m(r),c=o().exports.vertigo_export_alloc_block(a),l=new n(()=>o().getUint8Memory(),c);return g(r,l),c}}}),new Xe(s)}}const Ze=new Set,Qe=()=>{document.querySelectorAll("*[data-vertigo-run-wasm]").forEach(e=>{const t=e.getAttribute("data-vertigo-run-wasm");"string"==typeof t?(async e=>{if(Ze.has(e))return;if(Ze.size>0)return void console.error("Only one wasm module can be run",{moduleRun:Ze,wasm:e});Ze.add(e),console.info(`Wasm module: "${e}" -> start`);const t=await Xe.create(e);console.info(`Wasm module: "${e}" -> initialized`),t.vertigoEntryFunction(0,14),console.info(`Wasm module: "${e}" -> launched vertigoEntryFunction with version 0.14`)})(t):console.error("Run error",e)})};document.querySelectorAll("*[data-vertigo-run-wasm][data-vertigo-preload]").forEach(e=>{const t=e.getAttribute("data-vertigo-run-wasm");"string"==typeof t&&(e=>{if(p.has(e)||"function"!=typeof WebAssembly.compileStreaming)return;const t=WebAssembly.compileStreaming(fetch(e,{priority:"low"})).catch(e=>(console.warn("Preloading wasm failed, it will be fetched again once the page has loaded. Original error:\n",e),null));p.set(e,t)})(t)}),window.addEventListener("load",Qe),setTimeout(Qe,3e3);
//# sourceMappingURL=wasm_run.js.map