6 lines
70 KiB
JavaScript
6 lines
70 KiB
JavaScript
import{e as Ft,r as j,m as Ut,t as Bt,c as ne,i as ve,a as nt,b as us,d as ds,h as fs,f as hs,g as Vt,o as Gt,w as $e,n as Se,j as vs,k as me,l as h,p as f,q as re,s as e,u as A,v as x,F as Q,x as ee,y as I,z as Xe,A as q,B as ms,C as ce,D as Wt,E as ze,G as ke,H as gs,I as ot,J as dt,K as Ht,L as ps,M as xe,N as bs,O as ys}from"./style-D1Ozo1PL.js";/*!
|
|
* pinia v3.0.3
|
|
* (c) 2025 Eduardo San Martin Morote
|
|
* @license MIT
|
|
*/let Jt;const Ce=n=>Jt=n,Kt=Symbol();function et(n){return n&&typeof n=="object"&&Object.prototype.toString.call(n)==="[object Object]"&&typeof n.toJSON!="function"}var _e;(function(n){n.direct="direct",n.patchObject="patch object",n.patchFunction="patch function"})(_e||(_e={}));function _s(){const n=Ft(!0),a=n.run(()=>j({}));let t=[],s=[];const o=Ut({install(r){Ce(o),o._a=r,r.provide(Kt,o),r.config.globalProperties.$pinia=o,s.forEach(c=>t.push(c)),s=[]},use(r){return this._a?t.push(r):s.push(r),this},_p:t,_a:null,_e:n,_s:new Map,state:a});return o}const Yt=()=>{};function ft(n,a,t,s=Yt){n.push(a);const o=()=>{const r=n.indexOf(a);r>-1&&(n.splice(r,1),s())};return!t&&Vt()&&Gt(o),o}function he(n,...a){n.slice().forEach(t=>{t(...a)})}const ws=n=>n(),ht=Symbol(),Re=Symbol();function tt(n,a){n instanceof Map&&a instanceof Map?a.forEach((t,s)=>n.set(s,t)):n instanceof Set&&a instanceof Set&&a.forEach(n.add,n);for(const t in a){if(!a.hasOwnProperty(t))continue;const s=a[t],o=n[t];et(o)&&et(s)&&n.hasOwnProperty(t)&&!ve(s)&&!nt(s)?n[t]=tt(o,s):n[t]=s}return n}const zs=Symbol();function ks(n){return!et(n)||!Object.prototype.hasOwnProperty.call(n,zs)}const{assign:de}=Object;function xs(n){return!!(ve(n)&&n.effect)}function Ss(n,a,t,s){const{state:o,actions:r,getters:c}=a,u=t.state.value[n];let p;function g(){u||(t.state.value[n]=o?o():{});const d=vs(t.state.value[n]);return de(d,r,Object.keys(c||{}).reduce((y,w)=>(y[w]=Ut(ne(()=>{Ce(t);const _=t._s.get(n);return c[w].call(_,_)})),y),{}))}return p=Zt(n,g,a,t,s,!0),p}function Zt(n,a,t={},s,o,r){let c;const u=de({actions:{}},t),p={deep:!0};let g,d,y=[],w=[],_;const P=s.state.value[n];!r&&!P&&(s.state.value[n]={}),j({});let L;function S(N){let E;g=d=!1,typeof N=="function"?(N(s.state.value[n]),E={type:_e.patchFunction,storeId:n,events:_}):(tt(s.state.value[n],N),E={type:_e.patchObject,payload:N,storeId:n,events:_});const F=L=Symbol();Se().then(()=>{L===F&&(g=!0)}),d=!0,he(y,E,s.state.value[n])}const i=r?function(){const{state:E}=t,F=E?E():{};this.$patch(H=>{de(H,F)})}:Yt;function l(){c.stop(),y=[],w=[],s._s.delete(n)}const v=(N,E="")=>{if(ht in N)return N[Re]=E,N;const F=function(){Ce(s);const H=Array.from(arguments),oe=[],ue=[];function ge(U){oe.push(U)}function X(U){ue.push(U)}he(w,{args:H,name:F[Re],store:k,after:ge,onError:X});let se;try{se=N.apply(this&&this.$id===n?this:k,H)}catch(U){throw he(ue,U),U}return se instanceof Promise?se.then(U=>(he(oe,U),U)).catch(U=>(he(ue,U),Promise.reject(U))):(he(oe,se),se)};return F[ht]=!0,F[Re]=E,F},$={_p:s,$id:n,$onAction:ft.bind(null,w),$patch:S,$reset:i,$subscribe(N,E={}){const F=ft(y,N,E.detached,()=>H()),H=c.run(()=>$e(()=>s.state.value[n],oe=>{(E.flush==="sync"?d:g)&&N({storeId:n,type:_e.direct,events:_},oe)},de({},p,E)));return F},$dispose:l},k=hs($);s._s.set(n,k);const te=(s._a&&s._a.runWithContext||ws)(()=>s._e.run(()=>(c=Ft()).run(()=>a({action:v}))));for(const N in te){const E=te[N];if(ve(E)&&!xs(E)||nt(E))r||(P&&ks(E)&&(ve(E)?E.value=P[N]:tt(E,P[N])),s.state.value[n][N]=E);else if(typeof E=="function"){const F=v(E,N);te[N]=F,u.actions[N]=E}}return de(k,te),de(Bt(k),te),Object.defineProperty(k,"$state",{get:()=>s.state.value[n],set:N=>{S(E=>{de(E,N)})}}),s._p.forEach(N=>{de(k,c.run(()=>N({store:k,app:s._a,pinia:s,options:u})))}),P&&r&&t.hydrate&&t.hydrate(k.$state,P),g=!0,d=!0,k}/*! #__NO_SIDE_EFFECTS__ */function at(n,a,t){let s;const o=typeof a=="function";s=o?t:a;function r(c,u){const p=fs();return c=c||(p?ds(Kt,null):null),c&&Ce(c),c=Jt,c._s.has(n)||(o?Zt(n,a,s,c):Ss(n,s,c)),c._s.get(n)}return r.$id=n,r}function rt(n){const a=Bt(n),t={};for(const s in a){const o=a[s];o.effect?t[s]=ne({get:()=>n[s],set(r){n[s]=r}}):(ve(o)||nt(o))&&(t[s]=us(n,s))}return t}const vt="/api";class $s{async request(a,t={}){try{const s=await fetch(`${vt}${a}`,{headers:{"Content-Type":"application/json",...t.headers},...t}),o=await s.json();return s.ok?{data:o,status:s.status}:{error:o.detail||`HTTP ${s.status}`,status:s.status}}catch(s){return{error:s instanceof Error?s.message:"Network error",status:0}}}async uploadRequest(a,t){try{const s=await fetch(`${vt}${a}`,{method:"POST",body:t}),o=await s.json();return s.ok?{data:o,status:s.status}:{error:o.detail||`HTTP ${s.status}`,status:s.status}}catch(s){return{error:s instanceof Error?s.message:"Network error",status:0}}}async getPuzzles(){return this.request("/submissions/puzzles")}async getSubmissions(a=20,t=0){return this.request(`/submissions/submissions?limit=${a}&offset=${t}`)}async getSubmission(a){return this.request(`/submissions/submissions/${a}`)}async createSubmission(a,t){const s=new FormData;return s.append("data",JSON.stringify(a)),t.forEach(o=>{s.append("files",o)}),this.uploadRequest("/submissions/submissions",s)}async validateResponse(a,t){return this.request(`/submissions/responses/${a}/validate`,{method:"PUT",body:JSON.stringify(t)})}async autoValidateResponses(a){return this.request(`/submissions/responses/${a}/validate/auto`,{method:"PUT"})}async getResponsesNeedingValidation(){return this.request("/submissions/responses/needs-validation")}async validateSubmission(a){return this.request(`/submissions/submissions/${a}/validate`,{method:"POST"})}async deleteSubmission(a){return this.request(`/submissions/submissions/${a}`,{method:"DELETE"})}async getStats(){return this.request("/submissions/stats")}async healthCheck(){return this.request("/health")}async getUserInfo(){return this.request("/user")}}const ae=new $s,Cs={async loadPuzzles(){const n=await ae.getPuzzles();return n.error?(console.error("Failed to load puzzles:",n.error),[]):n.data||[]},findPuzzleByName(n,a){if(!a)return null;let t=n.find(s=>s.title.toLowerCase()===a.toLowerCase());return t||(t=n.find(s=>s.title.toLowerCase().includes(a.toLowerCase())||a.toLowerCase().includes(s.title.toLowerCase()))),t||null}},mt={async createFromFiles(n,a,t,s){const o=n.map(c=>{const u=Cs.findPuzzleByName(a,c.ocrData?.puzzle||"");if(u)return{puzzle_id:u.id,puzzle_name:c.ocrData?.puzzle||"",cost:c.ocrData?.cost,cycles:c.ocrData?.cycles,area:c.ocrData?.area,needs_manual_validation:(c.ocrData?.confidence.overall??0)<=.8,ocr_confidence_cost:c.ocrData?.confidence?.cost||0,ocr_confidence_cycles:c.ocrData?.confidence?.cycles||0,ocr_confidence_area:c.ocrData?.confidence?.area||0}}).filter(c=>c!==void 0),r=n.map(c=>c.file);return ae.createSubmission({notes:t,manual_validation_requested:s,responses:o},r)},async loadSubmissions(n=20,a=0){const t=await ae.getSubmissions(n,a);return t.error?(console.error("Failed to load submissions:",t.error),[]):t.data?.items||[]}},Qt={getErrorMessage(n){return typeof n=="string"?n:n instanceof Error?n.message:typeof n=="object"&&n!==null&&"detail"in n?String(n.detail):"An unknown error occurred"},isNetworkError(n){return typeof n=="string"&&n.includes("Network")},isValidationError(n){return n===400},isAuthError(n){return n===401||n===403}},Le=at("puzzles",()=>{const n=j([]),a=j(!1),t=j(""),s=ne(()=>n.value.map(u=>u.title)),o=ne(()=>u=>{if(!u)return null;const p=n.value.find(d=>d.title.toLowerCase()===u.toLowerCase());return p||n.value.find(d=>d.title.toLowerCase().includes(u.toLowerCase())||u.toLowerCase().includes(d.title.toLowerCase()))||null}),r=async()=>{if(!(n.value.length>0))try{a.value=!0,t.value="";const u=await ae.getPuzzles();if(u.error){t.value=u.error,console.error("Failed to load puzzles:",u.error);return}u.data&&(n.value=u.data)}catch(u){t.value="Failed to load puzzles",console.error("Error loading puzzles:",u)}finally{a.value=!1}};return{puzzles:n,isLoading:a,error:t,puzzleNames:s,findPuzzleByName:o,loadPuzzles:r,refreshPuzzles:async()=>{n.value=[],await r()}}}),it=at("submissions",()=>{const n=j([]),a=j(!1),t=j(""),s=j(!1),o=Le(),{puzzles:r}=rt(o),c=async(w=20,_=0)=>{try{a.value=!0,t.value="";const P=await mt.loadSubmissions(w,_);_===0?n.value=P:n.value.push(...P)}catch(P){t.value="Failed to load submissions",console.error("Error loading submissions:",P)}finally{a.value=!1}},u=async(w,_,P)=>{try{a.value=!0,t.value="";const L=await mt.createFromFiles(w,r.value,_,P);if(L.error)throw t.value=L.error,new Error(L.error);return L.data?(n.value.unshift(L.data),L.data):void 0}catch(L){throw t.value=L instanceof Error?L.message:"Failed to create submission",L}finally{a.value=!1}},p=()=>{s.value=!0},g=()=>{s.value=!1};return{submissions:n,isLoading:a,error:t,isSubmissionModalOpen:s,loadSubmissions:c,createSubmission:u,openSubmissionModal:p,closeSubmissionModal:g,refreshSubmissions:async()=>{n.value=[],await c()},handleSubmission:async w=>{try{a.value=!0,t.value="";const _=await u(w.files,w.notes,w.manualValidationRequested);if(_){const P=_.responses.map(L=>L.puzzle_name).join(", ");alert(`Solutions submitted successfully for puzzles: ${P}`)}else alert("Submission created successfully!");g()}catch(_){const P=Qt.getErrorMessage(_);t.value=P,alert(`Submission failed: ${P}`),console.error("Submission error:",_)}finally{a.value=!1}}}}),Ls={class:"card-body"},Ps={class:"flex items-start justify-between"},Rs={class:"flex-1"},Os={class:"card-title text-lg font-bold"},Es={class:"text-sm text-base-content/70 mb-2"},Ms={class:"flex items-center gap-2 mb-3"},Ns={class:"badge badge-primary badge-sm"},As={class:"badge badge-ghost badge-sm"},Ds={key:0,class:"text-sm text-base-content/80 mb-4"},js={key:1,class:"flex flex-wrap gap-1 mb-4"},Is={key:0,class:"badge badge-outline badge-xs"},Ts={class:"flex flex-col items-end gap-2"},qs={class:"tooltip","data-tip":"View on Steam Workshop"},Fs=["href"],Us={key:0,class:"mt-6"},Bs={class:"divider"},Vs={class:"text-sm font-medium"},Gs={class:"table table-xs"},Ws={key:0,class:"badge badge-success badge-xs"},Hs={key:1,class:"text-base-content/50"},Js={key:0,class:"badge badge-info badge-xs"},Ks={key:1,class:"text-base-content/50"},Ys={key:0,class:"badge badge-warning badge-xs"},Zs={key:1,class:"text-base-content/50"},Qs={class:"flex items-center gap-1"},Xs={class:"badge badge-ghost badge-xs"},en=["data-tip"],tn={key:1,class:"tooltip","data-tip":"Needs manual validation"},sn=me({__name:"PuzzleCard",props:{puzzle:{},responses:{}},setup(n){const{openSubmissionModal:a}=it();return(t,s)=>(f(),h("div",{class:re(["card bg-base-100 shadow-lg hover:shadow-2xl transition-shadow duration-300",n.responses?.length==0?"shadow-red-900":"shadow-primary-300"])},[e("div",Ls,[e("div",Ps,[e("div",Rs,[e("h3",Os,x(n.puzzle.title),1),e("p",Es," by "+x(n.puzzle.author_name),1),e("div",Ms,[e("div",Ns,x(n.puzzle.steam_item_id),1),e("div",As,"ID: "+x(n.puzzle.id),1)]),n.puzzle.description?(f(),h("p",Ds,x(n.puzzle.description),1)):A("",!0),n.puzzle.tags&&n.puzzle.tags.length>0?(f(),h("div",js,[(f(!0),h(Q,null,ee(n.puzzle.tags.slice(0,3),o=>(f(),h("span",{key:o,class:"badge badge-outline badge-xs"},x(o),1))),128)),n.puzzle.tags.length>3?(f(),h("span",Is," +"+x(n.puzzle.tags.length-3)+" more ",1)):A("",!0)])):A("",!0)]),e("div",Ts,[e("div",qs,[e("a",{href:`https://steamcommunity.com/workshop/filedetails/?id=${n.puzzle.steam_item_id}`,target:"_blank",class:"btn btn-ghost btn-sm btn-square"},[...s[1]||(s[1]=[e("i",{class:"mdi mdi-steam text-lg"},null,-1)])],8,Fs)])])]),n.responses&&n.responses.length>0?(f(),h("div",Us,[e("div",Bs,[e("span",Vs,"Solutions ("+x(n.responses.length)+")",1)]),e("div",null,[e("table",Gs,[s[4]||(s[4]=e("thead",null,[e("tr",null,[e("th",null,"Cost"),e("th",null,"Cycles"),e("th",null,"Area"),e("th",null,"Files")])],-1)),e("tbody",null,[(f(!0),h(Q,null,ee(n.responses,o=>(f(),h("tr",{key:o.id,class:"hover"},[e("td",null,[o.final_cost||o.cost?(f(),h("span",Ws,x(o.final_cost||o.cost),1)):(f(),h("span",Hs,"-"))]),e("td",null,[o.final_cycles||o.cycles?(f(),h("span",Js,x(o.final_cycles||o.cycles),1)):(f(),h("span",Ks,"-"))]),e("td",null,[o.final_area||o.area?(f(),h("span",Ys,x(o.final_area||o.area),1)):(f(),h("span",Zs,"-"))]),e("td",null,[e("div",Qs,[e("span",Xs,x(o.files?.length||0),1),o.files?.length?(f(),h("div",{key:0,class:"tooltip","data-tip":o.files.map(r=>r.original_filename||r.file?.name).join(", ")},[...s[2]||(s[2]=[e("i",{class:"mdi mdi-information-outline text-xs"},null,-1)])],8,en)):A("",!0),o.needs_manual_validation?(f(),h("div",tn,[...s[3]||(s[3]=[e("i",{class:"mdi mdi-alert-circle text-xs text-warning"},null,-1)])])):A("",!0)])])]))),128))])])])])):(f(),h("div",{key:1,class:"mt-6 text-center py-4 border-2 border-dashed border-base-300 rounded-lg hover:border-primary transition-colors duration-300 cursor-pointer",onClick:s[0]||(s[0]=(...o)=>I(a)&&I(a)(...o))},[...s[5]||(s[5]=[e("i",{class:"mdi mdi-upload text-2xl text-base-content/40"},null,-1),e("p",{class:"text-sm text-base-content/60 mt-2"},"No solutions yet",-1),e("p",{class:"text-xs text-base-content/40"}," Upload solutions using the submit button ",-1)])]))])],2))}});var Oe={exports:{}},gt;function nn(){return gt||(gt=1,(function(n){var a=(function(t){var s=Object.prototype,o=s.hasOwnProperty,r=Object.defineProperty||function(b,m,z){b[m]=z.value},c,u=typeof Symbol=="function"?Symbol:{},p=u.iterator||"@@iterator",g=u.asyncIterator||"@@asyncIterator",d=u.toStringTag||"@@toStringTag";function y(b,m,z){return Object.defineProperty(b,m,{value:z,enumerable:!0,configurable:!0,writable:!0}),b[m]}try{y({},"")}catch{y=function(m,z,R){return m[z]=R}}function w(b,m,z,R){var C=m&&m.prototype instanceof v?m:v,D=Object.create(C.prototype),W=new se(R||[]);return r(D,"_invoke",{value:oe(b,z,W)}),D}t.wrap=w;function _(b,m,z){try{return{type:"normal",arg:b.call(m,z)}}catch(R){return{type:"throw",arg:R}}}var P="suspendedStart",L="suspendedYield",S="executing",i="completed",l={};function v(){}function $(){}function k(){}var T={};y(T,p,function(){return this});var te=Object.getPrototypeOf,N=te&&te(te(U([])));N&&N!==s&&o.call(N,p)&&(T=N);var E=k.prototype=v.prototype=Object.create(T);$.prototype=k,r(E,"constructor",{value:k,configurable:!0}),r(k,"constructor",{value:$,configurable:!0}),$.displayName=y(k,d,"GeneratorFunction");function F(b){["next","throw","return"].forEach(function(m){y(b,m,function(z){return this._invoke(m,z)})})}t.isGeneratorFunction=function(b){var m=typeof b=="function"&&b.constructor;return m?m===$||(m.displayName||m.name)==="GeneratorFunction":!1},t.mark=function(b){return Object.setPrototypeOf?Object.setPrototypeOf(b,k):(b.__proto__=k,y(b,d,"GeneratorFunction")),b.prototype=Object.create(E),b},t.awrap=function(b){return{__await:b}};function H(b,m){function z(D,W,V,Y){var B=_(b[D],b,W);if(B.type==="throw")Y(B.arg);else{var pe=B.arg,fe=pe.value;return fe&&typeof fe=="object"&&o.call(fe,"__await")?m.resolve(fe.__await).then(function(ie){z("next",ie,V,Y)},function(ie){z("throw",ie,V,Y)}):m.resolve(fe).then(function(ie){pe.value=ie,V(pe)},function(ie){return z("throw",ie,V,Y)})}}var R;function C(D,W){function V(){return new m(function(Y,B){z(D,W,Y,B)})}return R=R?R.then(V,V):V()}r(this,"_invoke",{value:C})}F(H.prototype),y(H.prototype,g,function(){return this}),t.AsyncIterator=H,t.async=function(b,m,z,R,C){C===void 0&&(C=Promise);var D=new H(w(b,m,z,R),C);return t.isGeneratorFunction(m)?D:D.next().then(function(W){return W.done?W.value:D.next()})};function oe(b,m,z){var R=P;return function(D,W){if(R===S)throw new Error("Generator is already running");if(R===i){if(D==="throw")throw W;return K()}for(z.method=D,z.arg=W;;){var V=z.delegate;if(V){var Y=ue(V,z);if(Y){if(Y===l)continue;return Y}}if(z.method==="next")z.sent=z._sent=z.arg;else if(z.method==="throw"){if(R===P)throw R=i,z.arg;z.dispatchException(z.arg)}else z.method==="return"&&z.abrupt("return",z.arg);R=S;var B=_(b,m,z);if(B.type==="normal"){if(R=z.done?i:L,B.arg===l)continue;return{value:B.arg,done:z.done}}else B.type==="throw"&&(R=i,z.method="throw",z.arg=B.arg)}}}function ue(b,m){var z=m.method,R=b.iterator[z];if(R===c)return m.delegate=null,z==="throw"&&b.iterator.return&&(m.method="return",m.arg=c,ue(b,m),m.method==="throw")||z!=="return"&&(m.method="throw",m.arg=new TypeError("The iterator does not provide a '"+z+"' method")),l;var C=_(R,b.iterator,m.arg);if(C.type==="throw")return m.method="throw",m.arg=C.arg,m.delegate=null,l;var D=C.arg;if(!D)return m.method="throw",m.arg=new TypeError("iterator result is not an object"),m.delegate=null,l;if(D.done)m[b.resultName]=D.value,m.next=b.nextLoc,m.method!=="return"&&(m.method="next",m.arg=c);else return D;return m.delegate=null,l}F(E),y(E,d,"Generator"),y(E,p,function(){return this}),y(E,"toString",function(){return"[object Generator]"});function ge(b){var m={tryLoc:b[0]};1 in b&&(m.catchLoc=b[1]),2 in b&&(m.finallyLoc=b[2],m.afterLoc=b[3]),this.tryEntries.push(m)}function X(b){var m=b.completion||{};m.type="normal",delete m.arg,b.completion=m}function se(b){this.tryEntries=[{tryLoc:"root"}],b.forEach(ge,this),this.reset(!0)}t.keys=function(b){var m=Object(b),z=[];for(var R in m)z.push(R);return z.reverse(),function C(){for(;z.length;){var D=z.pop();if(D in m)return C.value=D,C.done=!1,C}return C.done=!0,C}};function U(b){if(b){var m=b[p];if(m)return m.call(b);if(typeof b.next=="function")return b;if(!isNaN(b.length)){var z=-1,R=function C(){for(;++z<b.length;)if(o.call(b,z))return C.value=b[z],C.done=!1,C;return C.value=c,C.done=!0,C};return R.next=R}}return{next:K}}t.values=U;function K(){return{value:c,done:!0}}return se.prototype={constructor:se,reset:function(b){if(this.prev=0,this.next=0,this.sent=this._sent=c,this.done=!1,this.delegate=null,this.method="next",this.arg=c,this.tryEntries.forEach(X),!b)for(var m in this)m.charAt(0)==="t"&&o.call(this,m)&&!isNaN(+m.slice(1))&&(this[m]=c)},stop:function(){this.done=!0;var b=this.tryEntries[0],m=b.completion;if(m.type==="throw")throw m.arg;return this.rval},dispatchException:function(b){if(this.done)throw b;var m=this;function z(Y,B){return D.type="throw",D.arg=b,m.next=Y,B&&(m.method="next",m.arg=c),!!B}for(var R=this.tryEntries.length-1;R>=0;--R){var C=this.tryEntries[R],D=C.completion;if(C.tryLoc==="root")return z("end");if(C.tryLoc<=this.prev){var W=o.call(C,"catchLoc"),V=o.call(C,"finallyLoc");if(W&&V){if(this.prev<C.catchLoc)return z(C.catchLoc,!0);if(this.prev<C.finallyLoc)return z(C.finallyLoc)}else if(W){if(this.prev<C.catchLoc)return z(C.catchLoc,!0)}else if(V){if(this.prev<C.finallyLoc)return z(C.finallyLoc)}else throw new Error("try statement without catch or finally")}}},abrupt:function(b,m){for(var z=this.tryEntries.length-1;z>=0;--z){var R=this.tryEntries[z];if(R.tryLoc<=this.prev&&o.call(R,"finallyLoc")&&this.prev<R.finallyLoc){var C=R;break}}C&&(b==="break"||b==="continue")&&C.tryLoc<=m&&m<=C.finallyLoc&&(C=null);var D=C?C.completion:{};return D.type=b,D.arg=m,C?(this.method="next",this.next=C.finallyLoc,l):this.complete(D)},complete:function(b,m){if(b.type==="throw")throw b.arg;return b.type==="break"||b.type==="continue"?this.next=b.arg:b.type==="return"?(this.rval=this.arg=b.arg,this.method="return",this.next="end"):b.type==="normal"&&m&&(this.next=m),l},finish:function(b){for(var m=this.tryEntries.length-1;m>=0;--m){var z=this.tryEntries[m];if(z.finallyLoc===b)return this.complete(z.completion,z.afterLoc),X(z),l}},catch:function(b){for(var m=this.tryEntries.length-1;m>=0;--m){var z=this.tryEntries[m];if(z.tryLoc===b){var R=z.completion;if(R.type==="throw"){var C=R.arg;X(z)}return C}}throw new Error("illegal catch attempt")},delegateYield:function(b,m,z){return this.delegate={iterator:U(b),resultName:m,nextLoc:z},this.method==="next"&&(this.arg=c),l}},t})(n.exports);try{regeneratorRuntime=a}catch{typeof globalThis=="object"?globalThis.regeneratorRuntime=a:Function("r","regeneratorRuntime = r")(a)}})(Oe)),Oe.exports}var Ee,pt;function lt(){return pt||(pt=1,Ee=(n,a)=>`${n}-${a}-${Math.random().toString(16).slice(3,8)}`),Ee}var Me,bt;function Xt(){if(bt)return Me;bt=1;const n=lt();let a=0;return Me=({id:t,action:s,payload:o={}})=>{let r=t;return typeof r>"u"&&(r=n("Job",a),a+=1),{id:r,action:s,payload:o}},Me}var be={},yt;function ct(){if(yt)return be;yt=1;let n=!1;return be.logging=n,be.setLogging=a=>{n=a},be.log=(...a)=>n?console.log.apply(this,a):null,be}var Ne,_t;function on(){if(_t)return Ne;_t=1;const n=Xt(),{log:a}=ct(),t=lt();let s=0;return Ne=()=>{const o=t("Scheduler",s),r={},c={};let u=[];s+=1;const p=()=>u.length,g=()=>Object.keys(r).length,d=()=>{if(u.length!==0){const L=Object.keys(r);for(let S=0;S<L.length;S+=1)if(typeof c[L[S]]>"u"){u[0](r[L[S]]);break}}},y=(L,S)=>new Promise((i,l)=>{const v=n({action:L,payload:S});u.push(async $=>{u.shift(),c[$.id]=v;try{i(await $[L].apply(this,[...S,v.id]))}catch(k){l(k)}finally{delete c[$.id],d()}}),a(`[${o}]: Add ${v.id} to JobQueue`),a(`[${o}]: JobQueue length=${u.length}`),d()});return{addWorker:L=>(r[L.id]=L,a(`[${o}]: Add ${L.id}`),a(`[${o}]: Number of workers=${g()}`),d(),L.id),addJob:async(L,...S)=>{if(g()===0)throw Error(`[${o}]: You need to have at least one worker before adding jobs`);return y(L,S)},terminate:async()=>{Object.keys(r).forEach(async L=>{await r[L].terminate()}),u=[]},getQueueLen:p,getNumWorkers:g}},Ne}function an(n){throw new Error('Could not dynamically require "'+n+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Ae,wt;function rn(){if(wt)return Ae;wt=1;function n(){return!!(typeof window<"u"&&typeof window.process=="object"&&window.process.type==="renderer"||typeof process<"u"&&typeof process.versions=="object"&&process.versions.electron||typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent.indexOf("Electron")>=0)}return Ae=n,Ae}var De,zt;function ln(){if(zt)return De;zt=1;const n=rn();return De=a=>{const t={};return typeof WorkerGlobalScope<"u"?t.type="webworker":n()?t.type="electron":typeof document=="object"?t.type="browser":typeof process=="object"&&typeof an=="function"&&(t.type="node"),typeof a>"u"?t:t[a]},De}var je,kt;function cn(){if(kt)return je;kt=1;const a=ln()("type")==="browser"?t=>new URL(t,window.location.href).href:t=>t;return je=t=>{const s={...t};return["corePath","workerPath","langPath"].forEach(o=>{t[o]&&(s[o]=a(s[o]))}),s},je}var Ie,xt;function un(){return xt||(xt=1,Ie=n=>{const a=[],t=[],s=[],o=[],r=[];return n.blocks&&n.blocks.forEach(c=>{c.paragraphs.forEach(u=>{u.lines.forEach(p=>{p.words.forEach(g=>{g.symbols.forEach(d=>{r.push({...d,page:n,block:c,paragraph:u,line:p,word:g})}),o.push({...g,page:n,block:c,paragraph:u,line:p})}),s.push({...p,page:n,block:c,paragraph:u})}),t.push({...u,page:n,block:c})}),a.push({...c,page:n})}),{...n,blocks:a,paragraphs:t,lines:s,words:o,symbols:r}}),Ie}var Te,St;function es(){return St||(St=1,Te={TESSERACT_ONLY:0,LSTM_ONLY:1,TESSERACT_LSTM_COMBINED:2,DEFAULT:3}),Te}const dn="5.1.1",fn={version:dn};var qe,$t;function hn(){return $t||($t=1,qe={workerBlobURL:!0,logger:()=>{}}),qe}var Fe,Ct;function vn(){if(Ct)return Fe;Ct=1;const n=fn.version;return Fe={...hn(),workerPath:`https://cdn.jsdelivr.net/npm/tesseract.js@v${n}/dist/worker.min.js`},Fe}var Ue,Lt;function mn(){return Lt||(Lt=1,Ue=({workerPath:n,workerBlobURL:a})=>{let t;if(Blob&&URL&&a){const s=new Blob([`importScripts("${n}");`],{type:"application/javascript"});t=new Worker(URL.createObjectURL(s))}else t=new Worker(n);return t}),Ue}var Be,Pt;function gn(){return Pt||(Pt=1,Be=n=>{n.terminate()}),Be}var Ve,Rt;function pn(){return Rt||(Rt=1,Ve=(n,a)=>{n.onmessage=({data:t})=>{a(t)}}),Ve}var Ge,Ot;function bn(){return Ot||(Ot=1,Ge=async(n,a)=>{n.postMessage(a)}),Ge}var We,Et;function yn(){if(Et)return We;Et=1;const n=t=>new Promise((s,o)=>{const r=new FileReader;r.onload=()=>{s(r.result)},r.onerror=({target:{error:{code:c}}})=>{o(Error(`File could not be read! Code=${c}`))},r.readAsArrayBuffer(t)}),a=async t=>{let s=t;if(typeof t>"u")return"undefined";if(typeof t=="string")/data:image\/([a-zA-Z]*);base64,([^"]*)/.test(t)?s=atob(t.split(",")[1]).split("").map(o=>o.charCodeAt(0)):s=await(await fetch(t)).arrayBuffer();else if(typeof HTMLElement<"u"&&t instanceof HTMLElement)t.tagName==="IMG"&&(s=await a(t.src)),t.tagName==="VIDEO"&&(s=await a(t.poster)),t.tagName==="CANVAS"&&await new Promise(o=>{t.toBlob(async r=>{s=await n(r),o()})});else if(typeof OffscreenCanvas<"u"&&t instanceof OffscreenCanvas){const o=await t.convertToBlob();s=await n(o)}else(t instanceof File||t instanceof Blob)&&(s=await n(t));return new Uint8Array(s)};return We=a,We}var He,Mt;function _n(){if(Mt)return He;Mt=1;const n=vn(),a=mn(),t=gn(),s=pn(),o=bn(),r=yn();return He={defaultOptions:n,spawnWorker:a,terminateWorker:t,onMessage:s,send:o,loadImage:r},He}var Je,Nt;function ts(){if(Nt)return Je;Nt=1;const n=cn(),a=un(),t=Xt(),{log:s}=ct(),o=lt(),r=es(),{defaultOptions:c,spawnWorker:u,terminateWorker:p,onMessage:g,loadImage:d,send:y}=_n();let w=0;return Je=async(_="eng",P=r.LSTM_ONLY,L={},S={})=>{const i=o("Worker",w),{logger:l,errorHandler:v,...$}=n({...c,...L}),k={},T={},te=typeof _=="string"?_.split("+"):_;let N=P,E=S;const F=[r.DEFAULT,r.LSTM_ONLY].includes(P)&&!$.legacyCore;let H,oe;const ue=new Promise((O,M)=>{oe=O,H=M}),ge=O=>{H(O.message)};let X=u($);X.onerror=ge,w+=1;const se=(O,M)=>{k[O]=M},U=(O,M)=>{T[O]=M},K=({id:O,action:M,payload:G})=>new Promise((Z,J)=>{s(`[${i}]: Start ${O}, action=${M}`);const le=`${M}-${O}`;se(le,Z),U(le,J),y(X,{workerId:i,jobId:O,action:M,payload:G})}),b=()=>console.warn("`load` is depreciated and should be removed from code (workers now come pre-loaded)"),m=O=>K(t({id:O,action:"load",payload:{options:{lstmOnly:F,corePath:$.corePath,logging:$.logging}}})),z=(O,M,G)=>K(t({id:G,action:"FS",payload:{method:"writeFile",args:[O,M]}})),R=(O,M)=>K(t({id:M,action:"FS",payload:{method:"readFile",args:[O,{encoding:"utf8"}]}})),C=(O,M)=>K(t({id:M,action:"FS",payload:{method:"unlink",args:[O]}})),D=(O,M,G)=>K(t({id:G,action:"FS",payload:{method:O,args:M}})),W=()=>console.warn("`loadLanguage` is depreciated and should be removed from code (workers now come with language pre-loaded)"),V=(O,M)=>K(t({id:M,action:"loadLanguage",payload:{langs:O,options:{langPath:$.langPath,dataPath:$.dataPath,cachePath:$.cachePath,cacheMethod:$.cacheMethod,gzip:$.gzip,lstmOnly:[r.DEFAULT,r.LSTM_ONLY].includes(N)&&!$.legacyLang}}})),Y=()=>console.warn("`initialize` is depreciated and should be removed from code (workers now come pre-initialized)"),B=(O,M,G,Z)=>K(t({id:Z,action:"initialize",payload:{langs:O,oem:M,config:G}})),pe=(O="eng",M,G,Z)=>{if(F&&[r.TESSERACT_ONLY,r.TESSERACT_LSTM_COMBINED].includes(M))throw Error("Legacy model requested but code missing.");const J=M||N;N=J;const le=G||E;E=le;const Pe=(typeof O=="string"?O.split("+"):O).filter(cs=>!te.includes(cs));return te.push(...Pe),Pe.length>0?V(Pe,Z).then(()=>B(O,J,le,Z)):B(O,J,le,Z)},fe=(O={},M)=>K(t({id:M,action:"setParameters",payload:{params:O}})),ie=async(O,M={},G={blocks:!0,text:!0,hocr:!0,tsv:!0},Z)=>K(t({id:Z,action:"recognize",payload:{image:await d(O),options:M,output:G}})),as=(O="Tesseract OCR Result",M=!1,G)=>(console.log("`getPDF` function is depreciated. `recognize` option `savePDF` should be used instead."),K(t({id:G,action:"getPDF",payload:{title:O,textonly:M}}))),rs=async(O,M)=>{if(F)throw Error("`worker.detect` requires Legacy model, which was not loaded.");return K(t({id:M,action:"detect",payload:{image:await d(O)}}))},is=async()=>(X!==null&&(p(X),X=null),Promise.resolve());g(X,({workerId:O,jobId:M,status:G,action:Z,data:J})=>{const le=`${Z}-${M}`;if(G==="resolve"){s(`[${O}]: Complete ${M}`);let we=J;Z==="recognize"?we=a(J):Z==="getPDF"&&(we=Array.from({...J,length:Object.keys(J).length})),k[le]({jobId:M,data:we})}else if(G==="reject")if(T[le](J),Z==="load"&&H(J),v)v(J);else throw Error(J);else G==="progress"&&l({...J,userJobId:M})});const ls={id:i,worker:X,setResolve:se,setReject:U,load:b,writeText:z,readText:R,removeFile:C,FS:D,loadLanguage:W,initialize:Y,reinitialize:pe,setParameters:fe,recognize:ie,getPDF:as,detect:rs,terminate:is};return m().then(()=>V(_)).then(()=>B(_,P,S)).then(()=>oe(ls)).catch(()=>{}),ue},Je}var Ke,At;function wn(){if(At)return Ke;At=1;const n=ts();return Ke={recognize:async(s,o,r)=>{const c=await n(o,1,r);return c.recognize(s).finally(async()=>{await c.terminate()})},detect:async(s,o)=>{const r=await n("osd",0,o);return r.detect(s).finally(async()=>{await r.terminate()})}},Ke}var Ye,Dt;function zn(){return Dt||(Dt=1,Ye={AFR:"afr",AMH:"amh",ARA:"ara",ASM:"asm",AZE:"aze",AZE_CYRL:"aze_cyrl",BEL:"bel",BEN:"ben",BOD:"bod",BOS:"bos",BUL:"bul",CAT:"cat",CEB:"ceb",CES:"ces",CHI_SIM:"chi_sim",CHI_TRA:"chi_tra",CHR:"chr",CYM:"cym",DAN:"dan",DEU:"deu",DZO:"dzo",ELL:"ell",ENG:"eng",ENM:"enm",EPO:"epo",EST:"est",EUS:"eus",FAS:"fas",FIN:"fin",FRA:"fra",FRK:"frk",FRM:"frm",GLE:"gle",GLG:"glg",GRC:"grc",GUJ:"guj",HAT:"hat",HEB:"heb",HIN:"hin",HRV:"hrv",HUN:"hun",IKU:"iku",IND:"ind",ISL:"isl",ITA:"ita",ITA_OLD:"ita_old",JAV:"jav",JPN:"jpn",KAN:"kan",KAT:"kat",KAT_OLD:"kat_old",KAZ:"kaz",KHM:"khm",KIR:"kir",KOR:"kor",KUR:"kur",LAO:"lao",LAT:"lat",LAV:"lav",LIT:"lit",MAL:"mal",MAR:"mar",MKD:"mkd",MLT:"mlt",MSA:"msa",MYA:"mya",NEP:"nep",NLD:"nld",NOR:"nor",ORI:"ori",PAN:"pan",POL:"pol",POR:"por",PUS:"pus",RON:"ron",RUS:"rus",SAN:"san",SIN:"sin",SLK:"slk",SLV:"slv",SPA:"spa",SPA_OLD:"spa_old",SQI:"sqi",SRP:"srp",SRP_LATN:"srp_latn",SWA:"swa",SWE:"swe",SYR:"syr",TAM:"tam",TEL:"tel",TGK:"tgk",TGL:"tgl",THA:"tha",TIR:"tir",TUR:"tur",UIG:"uig",UKR:"ukr",URD:"urd",UZB:"uzb",UZB_CYRL:"uzb_cyrl",VIE:"vie",YID:"yid"}),Ye}var Ze,jt;function kn(){return jt||(jt=1,Ze={OSD_ONLY:"0",AUTO_OSD:"1",AUTO_ONLY:"2",AUTO:"3",SINGLE_COLUMN:"4",SINGLE_BLOCK_VERT_TEXT:"5",SINGLE_BLOCK:"6",SINGLE_LINE:"7",SINGLE_WORD:"8",CIRCLE_WORD:"9",SINGLE_CHAR:"10",SPARSE_TEXT:"11",SPARSE_TEXT_OSD:"12",RAW_LINE:"13"}),Ze}var Qe,It;function xn(){if(It)return Qe;It=1,nn();const n=on(),a=ts(),t=wn(),s=zn(),o=es(),r=kn(),{setLogging:c}=ct();return Qe={languages:s,OEM:o,PSM:r,createScheduler:n,createWorker:a,setLogging:c,...t},Qe}var Sn=xn();class ut{worker=null;availablePuzzleNames=[];regions={puzzle:{x:15,y:600,width:330,height:28},cost:{x:412,y:603,width:65,height:22},cycles:{x:577,y:603,width:65,height:22},area:{x:739,y:603,width:65,height:22}};async initialize(){this.worker||(this.worker=await Sn.createWorker("eng"),await this.worker.setParameters({tessedit_ocr_engine_mode:"3",tessedit_pageseg_mode:7}))}setAvailablePuzzleNames(a){this.availablePuzzleNames=a,console.log("OCR service updated with puzzle names:",a)}async configurePuzzleOCR(){this.worker&&(await this.worker.setParameters({load_system_dawg:"0",load_freq_dawg:"0",load_punc_dawg:"0",load_number_dawg:"0",load_unambig_dawg:"0",load_bigram_dawg:"0",load_fixed_length_dawgs:"0",tessedit_char_whitelist:this.getPuzzleCharacterSet(),tessedit_pageseg_mode:8,segment_penalty_dict_nonword:"2.0",segment_penalty_dict_frequent_word:"0.001",segment_penalty_dict_case_ok:"0.001",segment_penalty_dict_case_bad:"0.1",classify_enable_learning:"0",classify_enable_adaptive_matcher:"1",preserve_interword_spaces:"1"}),console.log("OCR configured for puzzle names with character set:",this.getPuzzleCharacterSet()))}getPuzzleCharacterSet(){if(this.availablePuzzleNames.length===0)return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 -";const a=new Set;return this.availablePuzzleNames.forEach(t=>{for(const s of t)a.add(s)}),Array.from(a).join("")}async extractOpusMagnumData(a){this.worker||await this.initialize();const t=URL.createObjectURL(a),s=new Image;return new Promise((o,r)=>{s.onload=async()=>{try{const c=document.createElement("canvas"),u=c.getContext("2d");c.width=s.width,c.height=s.height,u.drawImage(s,0,0);const p={},g={};for(const[w,_]of Object.entries(this.regions)){const P=document.createElement("canvas"),L=P.getContext("2d");P.width=_.width,P.height=_.height,L.drawImage(c,_.x,_.y,_.width,_.height,0,0,_.width,_.height);const S=L.getImageData(0,0,_.width,_.height);this.preprocessImage(S),L.putImageData(S,0,0),w==="cost"?await this.worker.setParameters({tessedit_char_whitelist:"0123456789G"}):w==="cycles"||w==="area"?await this.worker.setParameters({tessedit_char_whitelist:"0123456789"}):w==="puzzle"?await this.configurePuzzleOCR():await this.worker.setParameters({tessedit_char_whitelist:""});const{data:{text:i,confidence:l}}=await this.worker.recognize(P);let v=i.trim();if(g[w]=l/100,w==="cost"){if(v.endsWith("6")&&v.length>1){const $=v.slice(0,-1);/^\d+$/.test($)&&(v=$)}v=v.replace(/G+$/g,""),v=v.replace(/[^0-9]/g,"")}else if(w==="cycles"||w==="area")v=v.replace(/[^0-9]/g,"");else if(w==="puzzle"&&(v=this.findBestPuzzleMatch(v),this.availablePuzzleNames.length>0&&!this.availablePuzzleNames.includes(v))){const $=this.findBestPuzzleMatchForced(v);$&&(v=$,console.log(`Forced OCR match: "${i.trim()}" -> "${v}"`))}p[w]=v}URL.revokeObjectURL(t);const d=Object.values(g),y=d.length>0?d.reduce((w,_)=>w+_,0)/d.length:0;o({puzzle:p.puzzle||"",cost:parseInt(p.cost||""),cycles:parseInt(p.cycles||""),area:parseInt(p.area||""),confidence:{puzzle:g.puzzle||0,cost:g.cost||0,cycles:g.cycles||0,area:g.area||0,overall:y}})}catch(c){URL.revokeObjectURL(t),r(c)}},s.onerror=()=>{URL.revokeObjectURL(t),r(new Error("Failed to load image"))},s.src=t})}preprocessImage(a){const t=a.data;for(let s=0;s<t.length;s+=4){const r=255-Math.round(.299*t[s]+.587*t[s+1]+.114*t[s+2]);t[s]=r,t[s+1]=r,t[s+2]=r}}levenshteinDistance(a,t){const s=Array(t.length+1).fill(null).map(()=>Array(a.length+1).fill(null));for(let o=0;o<=a.length;o++)s[0][o]=o;for(let o=0;o<=t.length;o++)s[o][0]=o;for(let o=1;o<=t.length;o++)for(let r=1;r<=a.length;r++){const c=a[r-1]===t[o-1]?0:1;s[o][r]=Math.min(s[o][r-1]+1,s[o-1][r]+1,s[o-1][r-1]+c)}return s[t.length][a.length]}findBestPuzzleMatch(a){if(!this.availablePuzzleNames.length)return a.trim();const t=a.trim();if(!t)return"";const s=this.availablePuzzleNames.find(u=>u.toLowerCase()===t.toLowerCase());if(s)return s;const o=this.availablePuzzleNames.find(u=>u.toLowerCase().includes(t.toLowerCase())||t.toLowerCase().includes(u.toLowerCase()));if(o)return o;let r=t,c=0;for(const u of this.availablePuzzleNames){const p=[this.calculateLevenshteinSimilarity(t,u),this.calculateJaroWinklerSimilarity(t,u),this.calculateNGramSimilarity(t,u,2)],g=Math.max(...p);g>c&&g>.4&&(c=g,r=u)}if(c<.6){const u=this.findBestCharacterMatch(t);u&&(r=u)}return r}calculateLevenshteinSimilarity(a,t){const s=this.levenshteinDistance(a.toLowerCase(),t.toLowerCase()),o=Math.max(a.length,t.length);return o===0?1:1-s/o}calculateJaroWinklerSimilarity(a,t){const s=a.toLowerCase(),o=t.toLowerCase();if(s===o)return 1;const r=Math.floor(Math.max(s.length,o.length)/2)-1;if(r<0)return 0;const c=new Array(s.length).fill(!1),u=new Array(o.length).fill(!1);let p=0,g=0;for(let _=0;_<s.length;_++){const P=Math.max(0,_-r),L=Math.min(_+r+1,o.length);for(let S=P;S<L;S++)if(!(u[S]||s[_]!==o[S])){c[_]=!0,u[S]=!0,p++;break}}if(p===0)return 0;let d=0;for(let _=0;_<s.length;_++)if(c[_]){for(;!u[d];)d++;s[_]!==o[d]&&g++,d++}const y=(p/s.length+p/o.length+(p-g/2)/p)/3;let w=0;for(let _=0;_<Math.min(s.length,o.length,4)&&s[_]===o[_];_++)w++;return y+.1*w*(1-y)}calculateNGramSimilarity(a,t,s){const o=a.toLowerCase(),r=t.toLowerCase();if(o===r)return 1;if(o.length<s||r.length<s)return 0;const c=new Set,u=new Set;for(let d=0;d<=o.length-s;d++)c.add(o.substr(d,s));for(let d=0;d<=r.length-s;d++)u.add(r.substr(d,s));const p=new Set([...c].filter(d=>u.has(d))),g=new Set([...c,...u]);return p.size/g.size}findBestCharacterMatch(a){let t=null,s=0;for(const o of this.availablePuzzleNames){const r=this.calculateCharacterFrequencyScore(a.toLowerCase(),o.toLowerCase());r>s&&r>.3&&(s=r,t=o)}return t}calculateCharacterFrequencyScore(a,t){const s=new Map,o=new Map;for(const p of a)s.set(p,(s.get(p)||0)+1);for(const p of t)o.set(p,(o.get(p)||0)+1);const r=new Set([...s.keys(),...o.keys()]);let c=0,u=0;for(const p of r){const g=s.get(p)||0,d=o.get(p)||0;c+=Math.min(g,d),u+=Math.max(g,d)}return u===0?0:c/u}findBestPuzzleMatchForced(a){if(!this.availablePuzzleNames.length||!a.trim())return null;const t=a.trim().toLowerCase();let s=this.availablePuzzleNames[0],o=0;for(const r of this.availablePuzzleNames){const c=[this.calculateLevenshteinSimilarity(t,r),this.calculateJaroWinklerSimilarity(t,r),this.calculateNGramSimilarity(t,r,2),this.calculateCharacterFrequencyScore(t,r.toLowerCase()),this.calculateLengthSimilarity(t,r.toLowerCase())],u=c[0]*.25+c[1]*.25+c[2]*.2+c[3]*.2+c[4]*.1;u>o&&(o=u,s=r)}return console.log(`Forced match for "${a}": "${s}" (score: ${o.toFixed(3)})`),s}calculateLengthSimilarity(a,t){const s=a.length,o=t.length,r=Math.max(s,o),c=Math.min(s,o);return r===0?1:c/r}async terminate(){this.worker&&(await this.worker.terminate(),this.worker=null)}static isValidOpusMagnumImage(a){return["image/jpeg","image/jpg","image/png","image/gif"].includes(a.type)}static drawDebugRegions(a){return new Promise((t,s)=>{const o=URL.createObjectURL(a),r=new Image;r.onload=()=>{const c=document.createElement("canvas"),u=c.getContext("2d");c.width=r.width,c.height=r.height,u.drawImage(r,0,0),u.strokeStyle="#00ff00",u.lineWidth=2;const p=new ut;Object.values(p.regions).forEach(g=>{u.strokeRect(g.x,g.y,g.width,g.height)}),URL.revokeObjectURL(o),t(c.toDataURL())},r.onerror=()=>{URL.revokeObjectURL(o),s(new Error("Failed to load image for debug"))},r.src=o})}}const st=new ut,ye=.8,ss=at("uploads",()=>{const n=j([]),a=ne(()=>n.value.some(p=>p.ocrProcessing)),t=ne(()=>n.value.some(p=>o(p))),s=ne(()=>n.value.filter(p=>p.needsManualPuzzleSelection)),o=p=>p.ocrData?.confidence?p.ocrData.confidence.cost<ye||p.ocrData.confidence.cycles<ye||p.ocrData.confidence.area<ye:!1,r=async p=>{for(;a.value;){const d=Math.floor(Math.random()*400)+100;console.log(`OCR is already processing, waiting ${d}ms...`),await new Promise(y=>setTimeout(y,d))}const g=n.value.indexOf(p);n.value[g].ocrProcessing=!0,n.value[g].ocrError=void 0,n.value[g].ocrData=void 0;try{console.log("Starting OCR processing for:",p.file.name),await st.initialize();const d=await st.extractOpusMagnumData(p.file);console.log("OCR completed:",d),await Se(),n.value[g].ocrData=d,d.confidence.puzzle<ye?(n.value[g].needsManualPuzzleSelection=!0,console.log(`Low puzzle confidence (${Math.round(d.confidence.puzzle*100)}%) for ${p.file.name}, requiring manual selection`)):n.value[g].needsManualPuzzleSelection=!1,await Se()}catch(d){console.error("OCR processing failed:",d),n.value[g].ocrError="Failed to extract puzzle data"}finally{n.value[g].ocrProcessing=!1}};return{submissionFiles:n,submissionFilesNeedingManualSelection:s,processOCR:r,processLowConfidenceOCRFiles:async()=>{const p=n.value.filter(g=>o(g));for(const g of p)r(g)},clearFiles:()=>{n.value=[]},isProcessingOCR:a,hasLowConfidence:t,CONFIDENCE_VALUE:ye}}),$n={class:"form-control w-full"},Cn={key:0,class:"space-y-4"},Ln={key:1,class:"space-y-4"},Pn={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 gap-4"},Rn={class:"aspect-square rounded-lg overflow-hidden bg-base-200"},On=["src","alt"],En={class:"absolute inset-0 bg-black/80 opacity-0 group-hover:opacity-100 transition-opacity duration-200 rounded-lg flex items-center justify-center"},Mn=["onClick"],Nn={class:"mt-2"},An={class:"text-xs font-medium truncate"},Dn={class:"text-xs text-base-content/60"},jn={key:0,class:"mt-1 flex items-center gap-1"},In={key:1,class:"mt-1"},Tn={class:"text-xs text-error"},qn={key:2,class:"mt-1 space-y-1"},Fn={class:"text-xs flex items-center justify-between"},Un={class:"flex items-center gap-2"},Bn=["title"],Vn=["onClick"],Gn={class:"text-xs space-y-1 bg-base-200 p-2 rounded"},Wn={key:0},Hn=["title"],Jn={key:1},Kn=["title"],Yn={key:2},Zn=["title"],Qn={key:3},Xn=["title"],eo={key:3,class:"mt-2"},to={class:"mt-2"},so=["onUpdate:modelValue","onChange"],no=["value"],oo={key:4,class:"mt-1"},ao=["onClick"],ro={class:"flex justify-center"},io={key:0,class:"label"},lo={class:"label-text-alt text-error"},co=me({__name:"FileUpload",setup(n){const a=Le(),{submissionFiles:t,processOCR:s}=ss(),o=j(),r=j(!1),c=j("");$e(()=>a.puzzles,i=>{i&&i.length>0&&st.setAvailablePuzzleNames(a.puzzleNames)},{immediate:!0});const u=i=>{const l=i.target;l.files&&g(Array.from(l.files))},p=i=>{i.preventDefault(),r.value=!1,i.dataTransfer?.files&&g(Array.from(i.dataTransfer.files))},g=async i=>{c.value="";for(const l of i)if(d(l))try{const v=await y(l),$=l.type.startsWith("image/gif")?"gif":"image",k={file:l,file_url:"",preview:v,type:$,ocrProcessing:!1,ocrError:void 0,ocrData:void 0};t.push(k),P(l)&&Se(()=>{s(k)})}catch{c.value=`Failed to process ${l.name}`}},d=i=>i.type.startsWith("image/")?i.size>256*1024*1024?(c.value=`${i.name} is too large (max 256MB)`,!1):!0:(c.value=`${i.name} is not a valid image file`,!1),y=i=>new Promise((l,v)=>{const $=new FileReader;$.onload=k=>l(k.target?.result),$.onerror=v,$.readAsDataURL(i)}),w=i=>{t.splice(i,1)},_=i=>{if(i===0)return"0 Bytes";const l=1024,v=["Bytes","KB","MB","GB"],$=Math.floor(Math.log(i)/Math.log(l));return parseFloat((i/Math.pow(l,$)).toFixed(2))+" "+v[$]},P=i=>i.type.startsWith("image/")&&i.size>5e4,L=i=>i>=.8?"badge-success":i>=.6?"badge-warning":"badge-error",S=i=>{const l=t.findIndex(v=>v.file===i.file);l!==-1&&t[l].manualPuzzleSelection&&(t[l].needsManualPuzzleSelection=!1,console.log(`Manual puzzle selection: ${i.file.name} -> ${t[l].manualPuzzleSelection}`))};return(i,l)=>(f(),h("div",$n,[l[19]||(l[19]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Upload Solution Files"),e("span",{class:"label-text-alt text-xs"},"Images or GIFs only")],-1)),e("div",{class:re(["border-2 border-dashed border-base-300 rounded-lg p-6 text-center hover:border-primary transition-colors duration-300",{"border-primary bg-primary/5":r.value}]),onDrop:p,onDragover:l[2]||(l[2]=Xe(v=>r.value=!0,["prevent"])),onDragleave:l[3]||(l[3]=v=>r.value=!1),onDragenter:l[4]||(l[4]=Xe(()=>{},["prevent"]))},[e("input",{ref_key:"fileInput",ref:o,type:"file",multiple:"",accept:"image/*,.gif",class:"hidden",onChange:u},null,544),I(t).length===0?(f(),h("div",Cn,[l[6]||(l[6]=e("div",{class:"mx-auto w-12 h-12 text-base-content/40 flex items-center justify-center"},[e("i",{class:"mdi mdi-cloud-upload text-5xl"})],-1)),e("div",null,[l[5]||(l[5]=e("p",{class:"text-base-content/70 mb-2"},"Drop your files here or",-1)),e("button",{type:"button",onClick:l[0]||(l[0]=v=>o.value?.click()),class:"btn btn-primary btn-sm"}," Choose Files ")]),l[7]||(l[7]=e("p",{class:"text-xs text-base-content/50"}," Supported formats: JPG, PNG, GIF (max 256MB each) ",-1))])):(f(),h("div",Ln,[e("div",Pn,[(f(!0),h(Q,null,ee(I(t),(v,$)=>(f(),h("div",{key:$,class:"relative group"},[e("div",Rn,[e("img",{src:v.preview,alt:v.file.name,class:"w-full h-full object-cover"},null,8,On)]),e("div",En,[e("button",{onClick:k=>w($),class:"btn btn-error btn-lg btn-circle"},[...l[8]||(l[8]=[e("i",{class:"mdi mdi-close"},null,-1)])],8,Mn)]),e("div",Nn,[e("p",An,x(v.file.name),1),e("p",Dn,x(_(v.file.size))+" • "+x(v.type.toUpperCase()),1),v.ocrProcessing?(f(),h("div",jn,[...l[9]||(l[9]=[e("span",{class:"loading loading-spinner loading-xs"},null,-1),e("span",{class:"text-xs text-info"},"Extracting puzzle data...",-1)])])):v.ocrError?(f(),h("div",In,[e("p",Tn,x(v.ocrError),1)])):v.ocrData?(f(),h("div",qn,[e("div",Fn,[e("div",Un,[l[10]||(l[10]=e("span",{class:"font-medium text-success"},"✓ OCR Complete",-1)),v.ocrData.confidence?(f(),h("span",{key:0,class:re(["badge badge-xs",L(v.ocrData.confidence.overall)]),title:`Overall confidence: ${Math.round(v.ocrData.confidence.overall*100)}%`},x(Math.round(v.ocrData.confidence.overall*100))+"% ",11,Bn)):A("",!0)]),e("button",{onClick:k=>I(s)(v),class:"btn btn-xs btn-ghost",title:"Retry OCR"},[...l[11]||(l[11]=[e("i",{class:"mdi mdi-refresh"},null,-1)])],8,Vn)]),e("div",Gn,[v.ocrData.puzzle?(f(),h("div",Wn,[l[12]||(l[12]=e("strong",null,"Puzzle:",-1)),q(" "+x(v.ocrData.puzzle)+" ",1),v.ocrData.confidence?.puzzle?(f(),h("span",{key:0,class:"ml-2 opacity-60",title:`Puzzle confidence: ${Math.round(v.ocrData.confidence.puzzle*100)}%`}," ("+x(Math.round(v.ocrData.confidence.puzzle*100))+"%) ",9,Hn)):A("",!0)])):A("",!0),v.ocrData.cost?(f(),h("div",Jn,[l[13]||(l[13]=e("strong",null,"Cost:",-1)),q(" "+x(v.ocrData.cost)+" ",1),v.ocrData.confidence?.cost?(f(),h("span",{key:0,class:"ml-2 opacity-60",title:`Cost confidence: ${Math.round(v.ocrData.confidence.cost*100)}%`}," ("+x(Math.round(v.ocrData.confidence.cost*100))+"%) ",9,Kn)):A("",!0)])):A("",!0),v.ocrData.cycles?(f(),h("div",Yn,[l[14]||(l[14]=e("strong",null,"Cycles:",-1)),q(" "+x(v.ocrData.cycles)+" ",1),v.ocrData.confidence?.cycles?(f(),h("span",{key:0,class:"ml-2 opacity-60",title:`Cycles confidence: ${Math.round(v.ocrData.confidence.cycles*100)}%`}," ("+x(Math.round(v.ocrData.confidence.cycles*100))+"%) ",9,Zn)):A("",!0)])):A("",!0),v.ocrData.area?(f(),h("div",Qn,[l[15]||(l[15]=e("strong",null,"Area:",-1)),q(" "+x(v.ocrData.area)+" ",1),v.ocrData.confidence?.area?(f(),h("span",{key:0,class:"ml-2 opacity-60",title:`Area confidence: ${Math.round(v.ocrData.confidence.area*100)}%`}," ("+x(Math.round(v.ocrData.confidence.area*100))+"%) ",9,Xn)):A("",!0)])):A("",!0)])])):A("",!0),v.needsManualPuzzleSelection?(f(),h("div",eo,[l[17]||(l[17]=ms('<div class="alert alert-warning alert-sm"><i class="mdi mdi-alert-circle text-lg"></i><div class="flex-1"><div class="font-medium">Low OCR Confidence</div><div class="text-xs"> Please select the correct puzzle manually </div></div></div>',1)),e("div",to,[ce(e("select",{"onUpdate:modelValue":k=>v.manualPuzzleSelection=k,class:"select select-bordered select-sm w-full",onChange:k=>S(v)},[l[16]||(l[16]=e("option",{value:""},"Select puzzle...",-1)),(f(!0),h(Q,null,ee(I(a).puzzles,k=>(f(),h("option",{key:k.id,value:k.title},x(k.title),9,no))),128))],40,so),[[Wt,v.manualPuzzleSelection]])])])):!v.ocrProcessing&&!v.ocrError&&!v.ocrData?(f(),h("div",oo,[e("button",{onClick:k=>I(s)(v),class:"btn btn-xs btn-outline"},[...l[18]||(l[18]=[e("i",{class:"mdi mdi-text-recognition"},null,-1),q(" Extract Puzzle Data ",-1)])],8,ao)])):A("",!0)])]))),128))]),e("div",ro,[e("button",{type:"button",onClick:l[1]||(l[1]=v=>o.value?.click()),class:"btn btn-outline btn-sm"}," Add More Files ")])]))],34),c.value?(f(),h("div",io,[e("span",lo,x(c.value),1)])):A("",!0)]))}}),uo={class:"card bg-base-100 shadow-xl"},fo={class:"card-body"},ho={key:0,class:"alert alert-info"},vo={class:"flex-1"},mo={class:"font-bold"},go={class:"text-sm space-y-1 mt-1"},po={class:"badge badge-ghost badge-sm ml-2"},bo={key:1,class:"alert alert-warning"},yo={class:"flex-1"},_o={class:"text-sm"},wo={class:"form-control"},zo={class:"flex-1"},ko={class:"flex label"},xo={class:"label-text-alt"},So={class:"form-control"},$o={class:"label cursor-pointer justify-start gap-3"},Co=["disabled"],Lo={class:"card-actions justify-end"},Po=["disabled"],Ro={key:0,class:"loading loading-spinner loading-sm"},Oo={key:1},Eo={key:2},Mo={key:3},No=me({__name:"SubmissionForm",props:{puzzles:{},findPuzzleByName:{type:Function}},setup(n){const a=n,t=ss(),{submissionFiles:s,hasLowConfidence:o,submissionFilesNeedingManualSelection:r}=rt(t),{clearFiles:c,processLowConfidenceOCRFiles:u}=t,{handleSubmission:p}=it(),g=j(""),d=j(!1),y=j(!1),w=ne(()=>g.value.length),_=ne(()=>{const S=s.value.length>0,i=!s.value.some(l=>l.needsManualPuzzleSelection);return S&&!y.value&&i});$e(o,S=>{S&&(d.value=!0)});const P=ne(()=>{const S={};return s.value.forEach(i=>{const l=i.manualPuzzleSelection||i.ocrData?.puzzle;l&&(S[l]||(S[l]={puzzle:a.findPuzzleByName(l),files:[]}),S[l].files.push(i))}),S}),L=async()=>{if(_.value){y.value=!0;try{p({files:s.value,notes:g.value.trim()||void 0,manualValidationRequested:o.value||d.value}),c(),g.value="",d.value=!1}catch(S){console.error("Submission error:",S)}finally{y.value=!1}}};return(S,i)=>(f(),h("div",uo,[e("div",fo,[i[9]||(i[9]=e("h2",{class:"card-title text-xl mb-6"},[e("i",{class:"mdi mdi-check-circle text-2xl text-primary"}),q(" Submit Solution ")],-1)),e("form",{onSubmit:Xe(L,["prevent"]),class:"space-y-6"},[Object.keys(P.value).length>0?(f(),h("div",ho,[i[3]||(i[3]=e("i",{class:"mdi mdi-information-outline text-xl"},null,-1)),e("div",vo,[e("h4",mo," Detected Puzzles ("+x(Object.keys(P.value).length)+") ",1),e("div",go,[(f(!0),h(Q,null,ee(P.value,(l,v)=>(f(),h("div",{key:v,class:"flex justify-between"},[e("span",null,x(v),1),e("span",po,x(l.files.length)+" file(s)",1)]))),128))])])])):A("",!0),ze(co),I(r).length>0?(f(),h("div",bo,[i[6]||(i[6]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",yo,[i[5]||(i[5]=e("div",{class:"font-bold"},"Manual Puzzle Selection Required",-1)),e("div",_o,x(I(r).length)+" file(s) have low OCR confidence for puzzle names. Please select the correct puzzle for each file before submitting. ",1),e("button",{class:"btn mt-3 w-full",onClick:i[0]||(i[0]=(...l)=>I(u)&&I(u)(...l))},[...i[4]||(i[4]=[e("span",{class:"mdi mdi-reload text-2xl"},null,-1),q(" Retry OCR on low confidence puzzle ",-1)])])])])):A("",!0),e("div",wo,[e("div",zo,[e("label",ko,[i[7]||(i[7]=e("span",{class:"label-text font-medium"},"Notes (Optional)",-1)),e("span",xo,x(w.value)+"/500",1)]),ce(e("textarea",{"onUpdate:modelValue":i[1]||(i[1]=l=>g.value=l),class:"flex textarea textarea-bordered h-24 w-full resize-none",placeholder:"Add any notes about your solution, approach, or interesting findings...",maxlength:"500"},null,512),[[ke,g.value]])])]),e("div",So,[e("label",$o,[ce(e("input",{type:"checkbox","onUpdate:modelValue":i[2]||(i[2]=l=>d.value=l),class:"checkbox checkbox-primary",disabled:I(o)},null,8,Co),[[gs,d.value]]),i[8]||(i[8]=e("div",{class:"flex-1"},[e("span",{class:"label-text font-medium"},"Request manual validation"),e("div",{class:"label-text-alt text-xs opacity-70 mt-1"},[q(" Check this if you want an admin to manually review your submission, even if OCR confidence is high. "),e("br"),e("em",null,"Note: This will be automatically checked if any OCR confidence is below 80%.")])],-1))])]),e("div",Lo,[e("button",{type:"submit",class:"btn btn-primary",disabled:!_.value},[y.value?(f(),h("span",Ro)):A("",!0),y.value?(f(),h("span",Oo,"Submitting...")):I(r).length>0?(f(),h("span",Eo," Select Puzzles ("+x(I(r).length)+" remaining) ",1)):(f(),h("span",Mo,"Submit Solution"))],8,Po)])],32)])]))}}),Ao={class:"card bg-base-100 shadow-xl"},Do={class:"card-body"},jo={class:"stats stats-vertical lg:stats-horizontal shadow mb-6"},Io={class:"stat"},To={class:"stat-value text-primary"},qo={class:"stat"},Fo={class:"stat-value text-secondary"},Uo={class:"stat"},Bo={class:"stat-value text-warning"},Vo={class:"stat"},Go={class:"stat-value text-success"},Wo={key:0},Ho={class:"overflow-x-auto"},Jo={class:"table table-zebra"},Ko={class:"font-bold"},Yo={class:"text-sm opacity-50"},Zo={class:"text-sm space-y-1"},Qo={class:"flex justify-between items-center"},Xo={class:"flex justify-between items-center"},ea={class:"flex justify-between items-center"},ta={class:"badge badge-warning badge-sm"},sa=["onClick"],na=["onClick"],oa={key:1,class:"text-center py-8"},aa={key:0,class:"modal modal-open"},ra={class:"modal-box w-11/12 max-w-5xl"},ia=["src"],la={key:0,class:"space-y-4"},ca={class:"alert alert-info"},ua={class:"font-bold"},da={class:"grid grid-cols-4 gap-4"},fa={class:"form-control"},ha=["value"],va={class:"form-control"},ma=["placeholder"],ga={class:"form-control"},pa=["placeholder"],ba={class:"form-control"},ya=["placeholder"],_a={class:"modal-action"},wa=["disabled"],za={key:0,class:"loading loading-spinner loading-sm"},ka={class:"mockup-code w-full"},xa=me({__name:"AdminPanel",setup(n,{expose:a}){const t=Le(),s=j({total_submissions:0,total_responses:0,needs_validation:0,validated_submissions:0,validation_rate:0}),o=j([]),r=j(!1),c=j(!1),u=j({show:!1,response:null,data:{puzzle:-1,validated_cost:0,validated_cycles:0,validated_area:0}}),p=async()=>{try{r.value=!0;try{const i=await ae.getStats();i.data&&(s.value=i.data)}catch(i){console.warn("Stats endpoint not available:",i),s.value={total_submissions:0,total_responses:0,needs_validation:0,validated_submissions:0,validation_rate:0}}const S=await ae.getResponsesNeedingValidation();S.data&&(o.value=S.data)}catch(S){console.error("Failed to load admin data:",S)}finally{r.value=!1}},g=async()=>{for(const S of Array.from(o.value)){if(!S.id)continue;const{data:i,error:l}=await ae.autoValidateResponses(S.id);if(i&&!i.needs_manual_validation)o.value=o.value.filter(v=>v.id!==S.id),s.value.needs_validation-=1;else if(l)break}},d=S=>{u.value.response=S,u.value.data={puzzle:S.puzzle_id||-1,validated_cost:S.cost||0,validated_cycles:S.cycles||0,validated_area:S.area||0},u.value.show=!0},y=()=>{u.value.show=!1,u.value.response=null,u.value.data={puzzle:-1,validated_cost:0,validated_cycles:0,validated_area:0}},w=async S=>{const{data:i}=await ae.autoValidateResponses(S);console.log(i),i&&!i.needs_manual_validation&&(o.value=o.value.filter(l=>l.id!==S),console.log(s.value),s.value.needs_validation-=1,console.log(s.value))},_=async()=>{if(u.value.response?.id)try{c.value=!0;const S=await ae.validateResponse(u.value.response.id,u.value.data);if(S.error){alert(`Validation failed: ${S.error}`);return}o.value=o.value.filter(i=>i.id!==u.value.response?.id),s.value.needs_validation=Math.max(0,s.value.needs_validation-1),y()}catch(S){console.error("Validation error:",S),alert("Validation failed")}finally{c.value=!1}};ot(()=>{p()});const P=S=>S>=.8?"badge-success":S>=.6?"badge-warning":"badge-error",L=S=>{const i=[S.ocr_confidence_cost,S.ocr_confidence_cycles,S.ocr_confidence_area].filter(v=>v!=null);if(i.length===0)return 0;const l=i.reduce((v,$)=>v+$,0)/i.length;return Math.round(l*100)};return a({refresh:p}),(S,i)=>(f(),h(Q,null,[e("div",Ao,[e("div",Do,[i[14]||(i[14]=e("h2",{class:"card-title"},[e("i",{class:"mdi mdi-shield-account text-2xl text-warning"}),q(" Admin Panel ")],-1)),e("div",jo,[e("div",Io,[i[4]||(i[4]=e("div",{class:"stat-title"},"Total Submissions",-1)),e("div",To,x(s.value.total_submissions),1)]),e("div",qo,[i[5]||(i[5]=e("div",{class:"stat-title"},"Total Responses",-1)),e("div",Fo,x(s.value.total_responses),1)]),e("div",Uo,[i[6]||(i[6]=e("div",{class:"stat-title"},"Need Validation",-1)),e("div",Bo,x(s.value.needs_validation),1)]),e("div",Vo,[i[7]||(i[7]=e("div",{class:"stat-title"},"Validation Rate",-1)),e("div",Go,x(Math.round(s.value.validation_rate*100))+"% ",1)])]),e("button",{class:"btn btn-sm btn-primary",onClick:g},[...i[8]||(i[8]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),q(" Auto validation for all responses ",-1)])]),o.value.length>0?(f(),h("div",Wo,[i[12]||(i[12]=e("h3",{class:"text-lg font-bold mb-4"},"Responses Needing Validation",-1)),e("div",Ho,[e("table",Jo,[i[11]||(i[11]=e("thead",null,[e("tr",null,[e("th",null,"Puzzle"),e("th",null,"OCR Data"),e("th",null,"Confidence"),e("th",null,"Actions")])],-1)),e("tbody",null,[(f(!0),h(Q,null,ee(o.value,l=>(f(),h("tr",{key:l.id},[e("td",null,[e("div",Ko,x(l.puzzle_name),1),e("div",Yo,"ID: "+x(l.id),1)]),e("td",null,[e("div",Zo,[e("div",Qo,[e("span",null,"Cost: "+x(l.cost||"-"),1),l.ocr_confidence_cost?(f(),h("span",{key:0,class:re(["badge badge-xs",P(l.ocr_confidence_cost)])},x(Math.round(l.ocr_confidence_cost*100))+"% ",3)):A("",!0)]),e("div",Xo,[e("span",null,"Cycles: "+x(l.cycles||"-"),1),l.ocr_confidence_cycles?(f(),h("span",{key:0,class:re(["badge badge-xs",P(l.ocr_confidence_cycles)])},x(Math.round(l.ocr_confidence_cycles*100))+"% ",3)):A("",!0)]),e("div",ea,[e("span",null,"Area: "+x(l.area||"-"),1),l.ocr_confidence_area?(f(),h("span",{key:0,class:re(["badge badge-xs",P(l.ocr_confidence_area)])},x(Math.round(l.ocr_confidence_area*100))+"% ",3)):A("",!0)])])]),e("td",null,[e("div",ta,x(L(l))+"% ",1)]),e("td",null,[e("button",{onClick:v=>d(l),class:"btn btn-sm btn-primary mr-2"},[...i[9]||(i[9]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),q(" Validate ",-1)])],8,sa),l.id?(f(),h("button",{key:0,onClick:v=>w(l.id),class:"btn btn-sm btn-warning"},[...i[10]||(i[10]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),q(" Auto Validation ",-1)])],8,na)):A("",!0)])]))),128))])])])])):(f(),h("div",oa,[...i[13]||(i[13]=[e("i",{class:"mdi mdi-check-all text-6xl text-success opacity-50"},null,-1),e("p",{class:"text-lg font-medium mt-2"},"All responses validated!",-1),e("p",{class:"text-sm opacity-70"}," No responses currently need manual validation. ",-1)])]))])]),u.value.show?(f(),h("div",aa,[e("div",ra,[i[22]||(i[22]=e("h3",{class:"font-bold text-lg mb-4"},"Validate Response",-1)),(f(!0),h(Q,null,ee(u.value.response?.files??[],l=>(f(),h("div",null,[e("img",{src:l.file_url},null,8,ia)]))),256)),u.value.response?(f(),h("div",la,[e("div",ca,[i[16]||(i[16]=e("i",{class:"mdi mdi-information-outline"},null,-1)),e("div",null,[e("div",ua,x(u.value.response.puzzle_name),1),i[15]||(i[15]=e("div",{class:"text-sm"},"Review and correct the OCR data below",-1))])]),e("div",da,[e("div",fa,[i[18]||(i[18]=e("label",{class:"label"},[e("span",{class:"label-text"},"Puzzle")],-1)),ce(e("select",{"onUpdate:modelValue":i[0]||(i[0]=l=>u.value.data.puzzle=l),class:"select select-bordered select-sm w-full"},[i[17]||(i[17]=e("option",{value:""},"Select puzzle...",-1)),(f(!0),h(Q,null,ee(I(t).puzzles,l=>(f(),h("option",{key:l.id,value:l.id},x(l.title),9,ha))),128))],512),[[Wt,u.value.data.puzzle]])]),e("div",va,[i[19]||(i[19]=e("label",{class:"label"},[e("span",{class:"label-text"},"Cost")],-1)),ce(e("input",{"onUpdate:modelValue":i[1]||(i[1]=l=>u.value.data.validated_cost=l),type:"text",class:"input input-bordered input-sm",placeholder:u.value.response.cost?.toString()||"Enter cost"},null,8,ma),[[ke,u.value.data.validated_cost]])]),e("div",ga,[i[20]||(i[20]=e("label",{class:"label"},[e("span",{class:"label-text"},"Cycles")],-1)),ce(e("input",{"onUpdate:modelValue":i[2]||(i[2]=l=>u.value.data.validated_cycles=l),type:"text",class:"input input-bordered input-sm",placeholder:u.value.response.cycles?.toString()||"Enter cycles"},null,8,pa),[[ke,u.value.data.validated_cycles]])]),e("div",ba,[i[21]||(i[21]=e("label",{class:"label"},[e("span",{class:"label-text"},"Area")],-1)),ce(e("input",{"onUpdate:modelValue":i[3]||(i[3]=l=>u.value.data.validated_area=l),type:"text",class:"input input-bordered input-sm",placeholder:u.value.response.area?.toString()||"Enter area"},null,8,ya),[[ke,u.value.data.validated_area]])])]),e("div",_a,[e("button",{onClick:y,class:"btn btn-ghost"}," Cancel "),e("button",{onClick:_,class:"btn btn-primary",disabled:c.value},[c.value?(f(),h("span",za)):A("",!0),q(" "+x(c.value?"Validating...":"Validate"),1)],8,wa)]),e("div",ka,[e("pre",null,[e("code",null,x(u.value),1)])])])):A("",!0)]),e("div",{class:"modal-backdrop",onClick:y})])):A("",!0)],64))}}),Sa={class:"mb-8"},$a={class:"card bg-base-100 shadow-lg"},Ca={class:"card-body"},La={key:0,class:"flex justify-center py-8"},Pa={key:1,class:"text-center py-8"},Ra={key:2,class:"space-y-6"},Oa={class:"tabs tabs-boxed"},Ea={class:"space-y-4"},Ma={key:0,class:"text-center py-8"},Na={key:1,class:"overflow-x-auto"},Aa={class:"table table-zebra w-full"},Da={class:"font-bold"},ja={key:0,class:"badge badge-warning badge-lg"},Ia={key:1,class:"badge badge-lg"},Ta={key:2,class:"badge badge-lg"},qa={key:3},Fa={class:"font-medium"},Ua={class:"text-right"},Ba={class:"text-right font-bold"},Va={class:"space-y-6"},Ga=["onClick"],Wa={class:"ml-auto badge badge-sm"},Ha={key:0,class:"card-body"},Ja={key:0,class:"text-center py-8"},Ka={key:1,class:"space-y-6"},Ya={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},Za={class:"card-body p-4"},Qa={class:"text-xs text-base-content/70 font-bold"},Xa={class:"font-bold text-lg"},er={class:"space-y-2 text-sm"},tr={class:"flex justify-between"},sr={class:"badge badge-sm"},nr={class:"flex justify-between"},or={class:"badge badge-sm"},ar={class:"flex justify-between"},rr={class:"badge badge-sm"},ir={class:"flex justify-between pt-2 border-t"},lr={class:"badge badge-sm"},cr={class:"flex justify-between pt-2 border-t"},ur={class:"badge badge-primary"},dr={class:"overflow-x-auto"},fr={class:"table table-zebra w-full table-sm"},hr={class:"font-bold"},vr={key:0,class:"badge badge-warning"},mr={key:1,class:"badge"},gr={key:2,class:"badge"},pr={key:3},br={class:"font-medium"},yr={class:"text-center"},_r={key:0,class:"badge badge-sm"},wr={key:1,class:"text-base-content/40"},zr={class:"text-center"},kr={key:0,class:"badge badge-sm"},xr={key:1,class:"text-base-content/40"},Sr={class:"text-center"},$r={key:0,class:"badge badge-sm"},Cr={key:1,class:"text-base-content/40"},Lr={class:"text-center"},Pr={key:0,class:"badge badge-sm"},Rr={key:1,class:"text-base-content/40"},Or={class:"text-right font-bold text-primary text-lg"},Er=me({__name:"Results",setup(n){const a=j(!0),t=j(null),s=j("overall"),o=j(null),r=async()=>{a.value=!0;try{const g=await fetch("/api/results/results");if(!g.ok)throw new Error("Failed to fetch results");t.value=await g.json()}catch(g){console.error("Error fetching results:",g)}finally{a.value=!1}},c=()=>t.value?t.value.users.map(d=>{const y=t.value.responses_by_userid[d.id]||[],w=y.reduce((P,L)=>P+(L.rank_points||0),0),_=y.length;return{username:d.username,totalPoints:w,puzzlesSolved:_}}).sort((d,y)=>y.totalPoints-d.totalPoints):[],u=g=>t.value?(t.value.ranking_by_puzzle[g]||[]).map(y=>(console.log(y),{username:t.value.users.find(_=>_.id===y.user_id)?.username||"Unknown",cost:y.final_cost,cycles:y.final_cycles,area:y.final_area,points:y.points,rank_points:y.rank_points||0})):[],p=g=>{o.value=o.value===g?null:g};return ot(()=>{r()}),(g,d)=>(f(),h("div",Sa,[e("div",$a,[e("div",Ca,[d[16]||(d[16]=e("h2",{class:"card-title text-2xl mb-6"},[e("i",{class:"mdi mdi-trophy text-yellow-500 mr-2"}),q(" General Results ")],-1)),a.value?(f(),h("div",La,[...d[2]||(d[2]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):t.value?(f(),h("div",Ra,[e("div",Oa,[e("button",{onClick:d[0]||(d[0]=y=>s.value="overall"),class:re(["tab",s.value==="overall"?"tab-active":""])},[...d[4]||(d[4]=[e("i",{class:"mdi mdi-chart-line mr-2"},null,-1),q(" Overall Ranking ",-1)])],2),e("button",{onClick:d[1]||(d[1]=y=>s.value="byPuzzle"),class:re(["tab",s.value==="byPuzzle"?"tab-active":""])},[...d[5]||(d[5]=[e("i",{class:"mdi mdi-puzzle mr-2"},null,-1),q(" By Puzzle ",-1)])],2)]),ce(e("div",Ea,[c().length===0?(f(),h("div",Ma,[...d[6]||(d[6]=[e("p",{class:"text-base-content/70"},"No submissions yet",-1)])])):(f(),h("div",Na,[e("table",Aa,[d[7]||(d[7]=e("thead",null,[e("tr",null,[e("th",null,"Rank"),e("th",null,"Player"),e("th",{class:"text-right"},"Puzzles Solved"),e("th",{class:"text-right"},"Total Points")])],-1)),e("tbody",null,[(f(!0),h(Q,null,ee(c(),(y,w)=>(f(),h("tr",{key:y.username},[e("td",Da,[w===0?(f(),h("span",ja," 🏆 #1 ")):w===1?(f(),h("span",Ia," 🥈 #2 ")):w===2?(f(),h("span",Ta," 🥉 #3 ")):(f(),h("span",qa,"#"+x(w+1),1))]),e("td",Fa,x(y.username),1),e("td",Ua,x(y.puzzlesSolved),1),e("td",Ba,x(y.totalPoints),1)]))),128))])])]))],512),[[dt,s.value==="overall"]]),ce(e("div",Va,[(f(!0),h(Q,null,ee(t.value.puzzles,y=>(f(),h("div",{key:y.id,class:"card bg-base-100 border border-base-300"},[e("button",{onClick:w=>p(y.id),class:"btn btn-ghost btn-lg w-full justify-start text-lg font-bold hover:bg-primary/20 rounded-b-none"},[e("i",{class:re(["mdi mr-2",o.value===y.id?"mdi-chevron-down":"mdi-chevron-right"])},null,2),q(" "+x(y.title)+" ",1),e("span",Wa,x(u(y.id).length)+" submissions ",1)],8,Ga),o.value===y.id?(f(),h("div",Ha,[u(y.id).length===0?(f(),h("div",Ja,[...d[8]||(d[8]=[e("p",{class:"text-base-content/70 text-lg"},"No submissions yet",-1)])])):(f(),h("div",Ka,[e("div",Ya,[(f(!0),h(Q,null,ee(u(y.id).slice(0,3),(w,_)=>(f(),h("div",{key:_,class:"card bg-base-200"},[e("div",Za,[e("div",Qa,x(_===0?"🏆 1st Place":_===1?"🥈 2nd Place":"🥉 3rd Place"),1),e("h4",Xa,x(w.username),1),d[14]||(d[14]=e("div",{class:"divider my-2"},null,-1)),e("div",er,[e("div",tr,[d[9]||(d[9]=e("span",null,"Cost",-1)),e("span",sr,x(w.cost||"N/A"),1)]),e("div",nr,[d[10]||(d[10]=e("span",null,"Cycles",-1)),e("span",or,x(w.cycles||"N/A"),1)]),e("div",ar,[d[11]||(d[11]=e("span",null,"Area",-1)),e("span",rr,x(w.area||"N/A"),1)]),e("div",ir,[d[12]||(d[12]=e("span",null,"Total (with coef.)",-1)),e("span",lr,x(w.points||"N/A"),1)]),e("div",cr,[d[13]||(d[13]=e("span",{class:"font-bold"},"Points",-1)),e("span",ur,x(w.rank_points)+" pts",1)])])])]))),128))]),e("div",dr,[e("table",fr,[d[15]||(d[15]=e("thead",null,[e("tr",null,[e("th",{class:"w-12"},"Rank"),e("th",null,"Player"),e("th",{class:"text-center"},"Cost"),e("th",{class:"text-center"},"Cycles"),e("th",{class:"text-center"},"Area"),e("th",{class:"text-center"},"Total (with coef.)"),e("th",{class:"text-right"},"Points")])],-1)),e("tbody",null,[(f(!0),h(Q,null,ee(u(y.id),(w,_)=>(f(),h("tr",{key:_,class:re({"bg-primary/10":_<3})},[e("td",hr,[_===0?(f(),h("span",vr,"🏆")):_===1?(f(),h("span",mr,"🥈")):_===2?(f(),h("span",gr,"🥉")):(f(),h("span",pr,"#"+x(_+1),1))]),e("td",br,x(w.username),1),e("td",yr,[w.cost?(f(),h("span",_r,x(w.cost),1)):(f(),h("span",wr,"—"))]),e("td",zr,[w.cycles?(f(),h("span",kr,x(w.cycles),1)):(f(),h("span",xr,"—"))]),e("td",Sr,[w.area?(f(),h("span",$r,x(w.area),1)):(f(),h("span",Cr,"—"))]),e("td",Lr,[w.points?(f(),h("span",Pr,x(w.points),1)):(f(),h("span",Rr,"—"))]),e("td",Or,x(w.rank_points),1)],2))),128))])])])]))])):A("",!0)]))),128))],512),[[dt,s.value==="byPuzzle"]])])):(f(),h("div",Pa,[...d[3]||(d[3]=[e("p",{class:"text-base-content/70"},"No results available yet",-1)])]))])])]))}});function Tt(n,a){return Vt()?(Gt(n,a),!0):!1}const qt=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;function Mr(n,a=1e3,t={}){const{immediate:s=!0,immediateCallback:o=!1}=t;let r=null;const c=Ht(!1);function u(){r&&(clearInterval(r),r=null)}function p(){c.value=!1,u()}function g(){const d=xe(a);d<=0||(c.value=!0,o&&n(),u(),c.value&&(r=setInterval(n,d)))}return s&&qt&&g(),(ve(a)||typeof a=="function")&&Tt($e(a,()=>{c.value&&qt&&g()})),Tt(p),{isActive:ps(c),pause:p,resume:g}}function Nr(n,a){var t,s;const o=Ht(xe(n)),r=Mr(()=>{var d;const y=o.value-1;if(o.value=y<0?0:y,a==null||(d=a.onTick)===null||d===void 0||d.call(a),o.value<=0){var w;r.pause(),a==null||(w=a.onComplete)===null||w===void 0||w.call(a)}},(t=a?.interval)!==null&&t!==void 0?t:1e3,{immediate:(s=a?.immediate)!==null&&s!==void 0?s:!1}),c=d=>{var y;o.value=(y=xe(d))!==null&&y!==void 0?y:xe(n)},u=()=>{r.pause(),c()},p=()=>{r.isActive.value||o.value>0&&r.resume()};return{remaining:o,reset:c,stop:u,start:d=>{c(d),r.resume()},pause:r.pause,resume:p,isActive:r.isActive}}const Ar={class:"min-h-screen bg-base-200"},Dr={class:"navbar bg-base-100 shadow-lg"},jr={class:"container mx-auto w-full flex items-center gap-4"},Ir={class:"flex items-center gap-4"},Tr={key:0,class:"flex items-center gap-2"},qr={class:"text-sm"},Fr={class:"font-medium"},Ur={key:0,class:"badge badge-warning badge-xs ml-1"},Br={key:1,class:"text-sm text-base-content/70"},Vr={class:"container mx-auto px-4 py-8"},Gr={key:0,class:"flex justify-center"},Wr={class:"text-center"},Hr={class:"mb-6 text-base-content/70"},Jr={key:1,class:"flex justify-center items-center min-h-[400px]"},Kr={key:2,class:"alert alert-error max-w-2xl mx-auto"},Yr={class:"text-sm"},Zr={key:3,class:"space-y-8"},Qr={class:"mb-8"},Xr={class:"card bg-base-100 shadow-lg"},ei={class:"card-body"},ti={class:"card-title text-2xl"},si={class:"text-base-content/70"},ni={class:"flex flex-wrap gap-4 mt-4"},oi={key:0},ai={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"},ri={key:1,class:"text-center py-12"},ii={key:0,class:"modal modal-open"},li={class:"modal-box max-w-6xl"},ci={class:"flex justify-between items-center mb-4"},ui=me({__name:"OpusMagnum",props:{collectionTitle:{},collectionUrl:{},collectionDescription:{}},setup(n){const a=n,t=Le(),s=it(),{submissions:o,isSubmissionModalOpen:r}=rt(s),{openSubmissionModal:c,loadSubmissions:u,closeSubmissionModal:p}=s,g=j(null),d=j(!0),y=j(""),w=ne(()=>g.value?.is_superuser||!1),_=ne(()=>{const $={};return o.value.forEach(k=>{k.responses.forEach(T=>{$[T.puzzle_id]||($[T.puzzle_id]=[]),$[T.puzzle_id].push(T)})}),$});async function P(){try{d.value=!0,y.value="",console.log("Starting data load..."),console.log("Loading user info...");const $=await ae.getUserInfo();$.data?(g.value=$.data,console.log("User info loaded:",$.data)):$.error&&console.warn("User info error:",$.error),console.log("Loading puzzles..."),await t.loadPuzzles(),console.log("Puzzles loaded:",t.puzzles.length),console.log("Loading submissions..."),await u(),console.log("Submissions loaded:",o.value.length),console.log("Data load complete!")}catch($){y.value=Qt.getErrorMessage($),console.error("Failed to load data:",$)}finally{d.value=!1,console.log("Loading state set to false")}g.value?.is_superuser&&S()}const{remaining:L,start:S}=Nr(60,{onComplete(){P()}});ot(async()=>{await P()});const i=$=>t.findPuzzleByName($),l=()=>{window.location.reload()},v=()=>{window.location.href="/"};return($,k)=>(f(),h("div",Ar,[e("div",Dr,[e("div",jr,[e("button",{onClick:v,class:"btn btn-primary btn-sm"},[...k[3]||(k[3]=[e("i",{class:"mdi mdi-arrow-left"},null,-1),q(" Back ",-1)])]),k[6]||(k[6]=e("h1",{class:"text-xl font-bold"},"Opus Magnum Puzzle Submitter",-1)),k[7]||(k[7]=e("div",{class:"flex-1"},null,-1)),e("div",Ir,[g.value?.is_authenticated?(f(),h("div",Tr,[e("div",qr,[e("span",Fr,x(g.value.username),1),g.value.is_superuser?(f(),h("span",Ur,"Admin")):A("",!0)])])):(f(),h("div",Br,"Not logged in")),k[4]||(k[4]=e("a",{href:"/api/docs",class:"btn btn-xs"},"API docs",-1)),k[5]||(k[5]=e("a",{href:"/admin",class:"btn btn-xs btn-warning"},"Admin panel",-1))])])]),e("div",Vr,[g.value?.is_superuser?(f(),h("div",Gr,[e("div",Wr,[e("p",Hr,[k[8]||(k[8]=e("span",{class:"loading loading-spinner loading-lg"},null,-1)),q(" Auto reload page in "+x(I(L))+" seconds ... ",1)])])])):A("",!0),d.value?(f(),h("div",Jr,[...k[9]||(k[9]=[e("div",{class:"text-center"},[e("span",{class:"loading loading-spinner loading-lg"}),e("p",{class:"mt-4 text-base-content/70"},"Loading puzzles...")],-1)])])):y.value?(f(),h("div",Kr,[k[12]||(k[12]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,[k[10]||(k[10]=e("h3",{class:"font-bold"},"Error Loading Data",-1)),e("div",Yr,x(y.value),1)]),e("button",{onClick:l,class:"btn btn-sm btn-outline"},[...k[11]||(k[11]=[e("i",{class:"mdi mdi-refresh mr-1"},null,-1),q(" Retry ",-1)])])])):(f(),h("div",Zr,[e("div",Qr,[e("div",Xr,[e("div",ei,[e("h2",ti,x(a.collectionTitle),1),e("p",si,x(a.collectionDescription),1),e("div",ni,[e("button",{onClick:k[0]||(k[0]=(...T)=>I(c)&&I(c)(...T)),class:"btn btn-primary"},[...k[13]||(k[13]=[e("i",{class:"mdi mdi-plus mr-2"},null,-1),q(" Submit Solution ",-1)])])])])])]),ze(Er),w.value?(f(),h("div",oi,[ze(xa)])):A("",!0),e("div",ai,[(f(!0),h(Q,null,ee(I(t).puzzles,T=>(f(),bs(sn,{key:T.id,puzzle:T,responses:_.value[T.id]||[]},null,8,["puzzle","responses"]))),128))]),I(t).puzzles.length===0?(f(),h("div",ri,[...k[14]||(k[14]=[e("div",{class:"text-6xl mb-4"},"🧩",-1),e("h3",{class:"text-xl font-bold mb-2"},"No Puzzles Available",-1),e("p",{class:"text-base-content/70"}," Check back later for new puzzle collections! ",-1)])])):A("",!0)]))]),I(r)?(f(),h("div",ii,[e("div",li,[e("div",ci,[k[16]||(k[16]=e("h3",{class:"font-bold text-lg"},"Submit Solution",-1)),e("button",{onClick:k[1]||(k[1]=(...T)=>I(p)&&I(p)(...T)),class:"btn btn-sm btn-circle btn-ghost"},[...k[15]||(k[15]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),ze(No,{puzzles:I(t).puzzles,"find-puzzle-by-name":i},null,8,["puzzles"])]),e("div",{class:"modal-backdrop",onClick:k[2]||(k[2]=(...T)=>I(p)&&I(p)(...T))})])):A("",!0)]))}}),di=_s(),ns="#app",fi=document.querySelector(ns),os=ys(ui,{...fi?.dataset});os.use(di);os.mount(ns);
|