1(function(){"use strict";const S={Tutorial:"Tutorial",Easy:"Easy",Medium:"Medium",Hard:"Hard"},g=99,V=-g-2,O=-g+1,x=-g,M=g+1,G=g,I=e=>({vertices:e.vertices.map(t=>({isBorder:t.isBorder||t.lastPlayerVisited!==void 0||t.goalId!==void 0,neighbours:t.neighbours.filter(n=>n.available).map(n=>n.id),goalId:t.goalId})),currentPlayerTurn:e.currentPlayerTurn,currentVertex:e.currentVertex,winner:e.winner,goalVertices0:e.goalVertices0,goalVertices1:e.goalVertices1}),b=(e,t)=>{const n=e.currentVertex,r=e.vertices[n],o=e.vertices[t],h=e.currentPlayerTurn;e.currentVertex=t,!o.isBorder&&o.goalId==null&&(e.currentPlayerTurn=1-h),o.isBorder=!0,r.neighbours=r.neighbours.filter(a=>a!==t),o.neighbours=o.neighbours.filter(a=>a!==n),o.goalId!==void 0?e.winner=1-o.goalId:o.neighbours.length===0&&(e.winner=1-e.currentPlayerTurn)},w=(e,t)=>{const n=I(e.gameState),r=[n.currentVertex];return t===S.Easy?B(n,0,r):t===S.Medium?L(n,4,r):E(n,8,r)},P=(e,t=!1)=>{let n=-1;const r=new Set(e.vertices.map((i,s)=>s)),o=e.vertices.map(()=>g),h=e.vertices.map(()=>!1);for(o[e.currentVertex]=0,n=e.currentVertex;n>=0;)e.vertices[n].neighbours.forEach(s=>{const u=e.vertices[s];if(!h[s]){const y=u.isBorder&&!t?0:1;o[s]=Math.min(o[s],o[n]+y)}}),h[n]=!0,r.delete(n),n=[...r].filter(s=>o[s]<g).sort((s,u)=>o[s]-o[u])[0]??-1;const a=Math.min(...e.goalVertices0.map(i=>o[i])),c=Math.min(...e.goalVertices1.map(i=>o[i]));return[a,c,o]},v=e=>({vertices:e.vertices.map(t=>({isBorder:t.isBorder,neighbours:t.neighbours,goalId:t.goalId})),currentPlayerTurn:e.currentPlayerTurn,currentVertex:e.currentVertex,winner:e.winner,goalVertices0:e.goalVertices0,goalVertices1:e.goalVertices1}),_=e=>e.sort((t,n)=>n.score!==t.score?n.score-t.score:n.moveEnded&&!t.moveEnded?-1:t.moveEnded&&!n.moveEnded?1:Math.random()-.5)[0],D=(e,t,n)=>_(E(e,t,n)),E=(e,t,n)=>{const r=e,o=r.vertices[r.currentVertex].neighbours,h=t-(o.length-1)/2;return o.map(c=>{const i=v(r);b(i,c);let s=[...n,c];const u=r.currentPlayerTurn!==i.currentPlayerTurn,y=i.winner===1-r.currentPlayerTurn,f=P(i),m=f[1-r.currentPlayerTurn],T=f[r.currentPlayerTurn];let l=0;if(y)l=V;else if(!u&&m===0)l=M;else if(m===g)l=x;else if(T===g)l=G;else if(u&&T===0)l=O;else if(t>0){const d=D(i,h,s);u?l=-d.score:l=d.score,s=d.path}return{id:c,score:l,moveEnded:u,path:s}})},L=(e,t,n)=>{const r=e;return r.vertices[r.currentVertex].neighbours.map(a=>{const c=v(r);b(c,a);const i=[...n,a],s=r.currentPlayerTurn!==c.currentPlayerTurn,u=c.winner===1-r.currentPlayerTurn,f=P(c)[r.currentPlayerTurn],m=P(c,!0),T=m[1-r.currentPlayerTurn],l=m[r.currentPlayerTurn];let d=0;return u?d=V-10:(d=-T,f===0&&s&&(d+=l-5),d+=s?0:1,d+=Math.random()*2),{id:a,score:d,moveEnded:s,path:i}})},B=(e,t,n)=>{const r=e;return r.vertices[r.currentVertex].neighbours.map(a=>{const c=v(r);b(c,a);const i=[...n,a],s=r.currentPlayerTurn!==c.currentPlayerTurn,u=c.winner===1-r.currentPlayerTurn,y=c.winner===r.currentPlayerTurn,m=P(c)[r.currentPlayerTurn],T=P(c,!0),l=T[1-r.currentPlayerTurn],d=T[r.currentPlayerTurn];let p=0;return u?p=V-10:y?p=M:(p=-l,m===0&&s&&(p+=d-5),p+=s?.5:0,p+=Math.random()*2),{id:a,score:p,moveEnded:s,path:i}})};self.onmessage=e=>{const{game:t,aiDifficulty:n}=e.data,r=w(t,n);self.postMessage(r)}})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.