PageSourceSearch

https://eve-devoter.com/app-CET437I2.js

js eve-devoter.com collected 2026-10-07 19:32:29 UTC 141,598 bytes, 316 lines download raw bytes

1var ta=Object.defineProperty;var sa=(e,t)=>()=>(e&&(t=e(e=0)),t);var Tt=(e,t)=>{for(var s in t)ta(e,s,{get:t[s],enumerable:!0})};var vs={};Tt(vs,{deleteDB:()=>qa,openDB:()=>Va,unwrap:()=>Ue,wrap:()=>W});function Na(){return us||(us=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function $a(){return ps||(ps=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}function Oa(e){let t=new Promise((s,n)=>{let a=()=>{e.removeEventListener("success",i),e.removeEventListener("error",o)},i=()=>{s(W(e.result)),a()},o=()=>{n(e.error),a()};e.addEventListener("success",i),e.addEventListener("error",o)});return je.set(t,e),t}function Fa(e){if(It.has(e))return;let t=new Promise((s,n)=>{let a=()=>{e.removeEventListener("complete",i),e.removeEventListener("error",o),e.removeEventListener("abort",o)},i=()=>{s(),a()},o=()=>{n(e.error||new DOMException("AbortError","AbortError")),a()};e.addEventListener("complete",i),e.addEventListener("error",o),e.addEventListener("abort",o)});It.set(e,t)}function ys(e){vt=e(vt)}function Ha(e){return $a().includes(e)?function(...t){return e.apply(Ue(this),t),W(this.request)}:function(...t){return W(e.apply(Ue(this),t))}}function Pa(e){return typeof e=="function"?Ha(e):(e instanceof IDBTransaction&&Fa(e),yt(e,Na())?new Proxy(e,vt):e)}function W(e){if(e instanceof IDBRequest)return Oa(e);if(ht.has(e))return ht.get(e);let t=Pa(e);return t!==e&&(ht.set(e,t),je.set(t,e)),t}function Va(e,t,{blocked:s,upgrade:n,blocking:a,terminated:i}={}){let o=indexedDB.open(e,t),l=W(o);return n&&o.addEventListener("upgradeneeded",c=>{n(W(o.result),c.oldVersion,c.newVersion,W(o.transaction),c)}),s&&o.addEventListener("blocked",c=>s(c.oldVersion,c.newVersion,c)),l.then(c=>{i&&c.addEventListener("close",()=>i()),a&&c.addEventListener("versionchange",r=>a(r.oldVersion,r.newVersion,r))}).catch(()=>{}),l}function qa(e,{blocked:t}={}){let s=indexedDB.deleteDatabase(e);return t&&s.addEventListener("blocked",n=>t(n.oldVersion,n)),W(s).then(()=>{})}function gs(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(ft.get(t))return ft.get(t);let s=t.replace(/FromIndex$/,""),n=t!==s,a=ja.includes(s);if(!(s in(n?IDBIndex:IDBObjectStore).prototype)||!(a||Ua.includes(s)))return;let i=async function(o,...l){let c=this.transaction(o,a?"readwrite":"readonly"),r=c.store;
1return n&&(r=r.index(l.shift())),(await Promise.all([r[s](...l),a&&c.done]))[0]};return ft.set(t,i),i}async function*Za(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;let s=new Proxy(t,Wa);for(Is.set(s,t),je.set(s,Ue(t));t;)yield s,t=await(St.get(s)||t.continue()),St.delete(s)}function fs(e,t){return t===Symbol.asyncIterator&&yt(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&yt(e,[IDBIndex,IDBObjectStore])}var yt,us,ps,It,ht,je,vt,Ue,Ua,ja,ft,Xa,hs,St,Is,Wa,Ss=sa(()=>{yt=(e,t)=>t.some(s=>e instanceof s);It=new WeakMap,ht=new WeakMap,je=new WeakMap;vt={get(e,t,s){if(e instanceof IDBTransaction){if(t==="done")return It.get(e);if(t==="store")return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return W(e[t])},set(e,t,s){return e[t]=s,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};Ue=e=>je.get(e);Ua=["get","getKey","getAll","getAllKeys","count"],ja=["put","add","delete","clear"],ft=new Map;ys(e=>({...e,get:(t,s,n)=>gs(t,s)||e.get(t,s,n),has:(t,s)=>!!gs(t,s)||e.has(t,s)}));Xa=["continue","continuePrimaryKey","advance"],hs={},St=new WeakMap,Is=new WeakMap,Wa={get(e,t){if(!Xa.includes(t))return e[t];let s=hs[t];return s||(s=hs[t]=function(...n){St.set(this,Is.get(this)[t](...n))}),s}};ys(e=>({...e,get(t,s,n){return fs(t,s)?Za:e.get(t,s,n)},has(t,s){return fs(t,s)||e.has(t,s)}}))});var De=(e,t)=>e<=t+1e-9,Pt=(e,t)=>e+1e-9>=t,L=(e,t)=>Math.abs(e-t)<=1e-9,q=(e,t)=>e<t-1e-9,te=(e,t)=>e>t+1e-9,R={DESTABILIZED_AT_REMAINING:.5,CRITICAL_AT_REMAINING:.1,MINIMUM_REMAINING:.001,COLLAPSED_AT_REMAINING:0};function aa(e){let[t,s]=e;return{destabilized_at_remaining:[R.DESTABILIZED_AT_REMAINING*t,R.DESTABILIZED_AT_REMAINING*s],critical_at_remaining:[R.CRITICAL_AT_REMAINING*t,R.CRITICAL_AT_REMAINING*s],gone_at_remaining:[R.COLLAPSED_AT_REMAINING*t,R.COLLAPSED_AT_REMAINING*s]}}var le={STABLE:{fmin:R.DESTABILIZED_AT_REMAINING,fmax:1},DESTABILIZED:{fmin:R.CRITICAL_AT_REMAINING,fmax:R.DESTABILIZED_AT_REMAINING-1e-9},CRITICAL:{fmin:1e-9,fmax:R.CRITICAL_AT_REMAINING-1e-9},GONE:{fmin:-1e4,fmax:R.COLLAPSED_AT_REMAINING}};function Vt(e){let{wormhole:t,events:s}=e,n=[],a=t.original_mass_range,i=null;for(let o=0;o<s.length;o++){let l=s.slice(0,o+1).map(()=>[]);for(let h=0;h<=o;h++){let y=le[s[h].new_state];for(let I=0;I<=h;I++){let E=0,_=0;for(let S=0;S<=h;S++)S!==I&&(E+=s[S].passed_mass_range[0],_+=s[S].passed_mass_range[1]);l[I].push({lowerCoeff:1-y.fmax,lowerConst:-_,upperCoeff:1-y.fmin,upperConst:-E})}}for(let h=0;h<=o;h++)l[h].push({lowerCoeff:0,lowerConst:s[h].passed_mass_range[0],upperCoeff:0,upperConst:s[h].passed_mass_range[1]});let c=na(l,t.original_mass_range);if(!c.valid)return{valid:!1,failed_at_event:o,reason:c.reason};a=c.range;let{xRanges:r,cumulativeRanges:m}=ia(l,a,s.slice(0,o+1));i=r;let d=la(a,s[o].new_state,s.slice(0,o+1),t.original_mass_range),u=pa(d.cumulative_possible_passed_geometry),p=d.remaining_analysis,g=p?.until_gone?.range??u.remaining;if(!g){let h=u.cumulative||m[o];g=[a[0]-h[1],a[1]-h[0]]}n.push({geometry:d,event_input_mass_range:s[o].passed_mass_range,event_reduced_mass_range:r[o],cumulative_reduced_mass_range:u.cumulative||m[o],reduced_wormhole_mass_range_after_this_event:u.wormholeMass||[...a],remaining_until_gone_range:g,remaining_until_destab_range:p?.until_destab?.range??null,remaining_until_crit_range:p?.until_crit?.range??null,new_state:s[o].new_state})}if(n.length>1&&i)for(let o=0;o<n.length;o++)n[o].event_reduced_mass_range=i[o];return{valid:!0,wormhole:{original_mass_range:t.original_mass_range,state_boundaries:aa(a),geometry:{backdrop:oa(t.original_mass_range)}},events:n}}function na(e,t){let[s,n]=t;for(let a=0;a<e.length;a++){let i=e[a];for(let o=0;o<i.length;o++)for(let l=0;l<i.length;l++){let c=i[o],r=i[l],m=c.lowerCoeff-r.upperCoeff,d=r.upperConst-c.lowerConst;if(L(m,0)){if(q(d,0))return{valid:!1,reason:`X_${a} constraints ${o} and ${l} have parallel bounds with incompatible constants (gap: ${d.toFixed(4)})`}}else{let u=d/m;te(m,0)?n=Math.min(n,u):s=Math.max(s,u)}if(te(s,n))return{valid:!1,reason:`X_${a} constraints ${o} and ${l} squeeze M range to empty interval [${s.toFixed(2)}, ${n.toFixed(2)}]`}}}return{valid:!0,range:[s,n]}}
1function ia(e,t,s){let[n,a]=t,i=[],o=[];for(let l of e){let c=Math.max(...l.map(g=>g.lowerCoeff*n+g.lowerConst)),r=Math.max(...l.map(g=>g.lowerCoeff*a+g.lowerConst)),m=Math.min(...l.map(g=>g.upperCoeff*n+g.upperConst)),d=Math.min(...l.map(g=>g.upperCoeff*a+g.upperConst)),u=Math.min(c,r),p=Math.max(m,d);i.push([u,p])}for(let l=0;l<s.length;l++){let c=le[s[l].new_state],r=Math.min((1-c.fmax)*n,(1-c.fmax)*a),m=Math.max((1-c.fmin)*n,(1-c.fmin)*a),d=0,u=0;for(let y=0;y<=l;y++)d+=i[y][0],u+=i[y][1];let p=u;for(let y=0;y<l;y++){let I=le[s[y].new_state],E=0;for(let S=y+1;S<=l;S++)E+=i[S][0];let _=(1-I.fmin)*a;p=Math.min(p,_+E)}let g=Math.max(r,d),h=Math.min(m,p);o.push([g,h])}return{xRanges:i,cumulativeRanges:o}}function qt(e,t){let s=e*.9,n=e*1.1,a=le[t];if(!a)throw new Error(`Invalid state: ${t}`);let i=s*(1-a.fmax),o=n*(1-a.fmin),l=s*a.fmin,c=n*a.fmax;return{passed:[i,o],remaining:[l,c]}}function oa(e){let[t,s]=e;return{bounds:{x:[0,s],y:[t,s]},state_lines:{gone:{from:[t,t],to:[s,s]},critical:{from:[.9*t,t],to:[.9*s,s]},destab:{from:[.5*t,t],to:[.5*s,s]}}}}function la(e,t,s,n){let[a,i]=e,o=s.length-1,l=0,c=0;for(let y=0;y<=o;y++)l+=s[y].passed_mass_range[0],c+=s[y].passed_mass_range[1];let m=tt([[l,a],[l,i],[c,i],[c,a]],t);for(let y=0;y<o;y++){let I=le[s[y].new_state];if(!I)continue;let E=0,_=0;for(let b=y+1;b<=o;b++)E+=s[b].passed_mass_range[0],_+=s[b].passed_mass_range[1];let S=1-I.fmin,C=_;S<1/0&&(m=Ne(m,S,"below",C));let P=1-I.fmax,D=E;(P>0||D>0)&&(m=Ne(m,P,"above",D))}let d=N(m),u=ca(d),p=n[1],g=ma(n,p,d),h=va(d,t);return{cumulative_possible_passed_geometry:d,cumulative_certain_passed_geometry:u,excluded_mass_bands:g,remaining_analysis:h}}function tt(e,t){let s=le[t];if(!s)return e;let n=Math.max(0,1-s.fmax),a=Math.min(1/0,1-s.fmin);return ra(e,n,a)}function ra(e,t,s){let n=[...e];return t>0&&(n=Ne(n,t,"above",0)),s<1/0&&(n=Ne(n,s,"below",0)),N(n)}function N(e){if(!e||e.length===0)return[];let t=[];for(let s=0;s<e.length;s++){let n=e[s],a=t[t.length-1];(!a||!L(a[0],n[0])||!L(a[1],n[1]))&&t.push(n)}return t.length>1&&L(t[0][0],t[t.length-1][0])&&L(t[0][1],t[t.length-1][1])&&t.pop(),t}function se(e){if(!e||e.length===0)return null;let t=1/0,s=-1/0,n=1/0,a=-1/0;for(let[i,o]of e)i<t&&(t=i),i>s&&(s=i),o<n&&(n=o),o>a&&(a=o);return{xmin:t,xmax:s,ymin:n,ymax:a}}function da(e){if(!e||e.length<2)return e?[...e]:[];if(!se(e))return[];let s=0;for(let o=1;o<e.length;o++)(te(e[o][1],e[s][1])||L(e[o][1],e[s][1])&&q(e[o][0],e[s][0]))&&(s=o);let n=0;for(let o=1;o<e.length;o++)(q(e[o][1],e[n][1])||L(e[o][1],e[n][1])&&q(e[o][0],e[n][0]))&&(n=o);let a=[],i=s;for(;a.push(e[i]),i!==n;)i=(i-1+e.length)%e.length;return a}function ca(e){let t=N(e);if(!t||t.length===0)return null;let s=se(t);if(!s||De(s.xmin,0))return null;try{let n=da(t);if(!n||n.length===0)return null;let a=[[0,s.ymin],[0,s.ymax]];for(let i of n)a.push([i[0],i[1]]);return N(a)}catch{return N([[0,s.ymin],[0,s.ymax],[s.xmin,s.ymax],[s.xmin,s.ymin]])}}function ma(e,t,s){let n=se(s);if(!n)return{low:null,high:null};let[a,i]=e,o=te(n.ymin,a)?N([[0,a],[0,n.ymin],[t,n.ymin],[t,a]]):null,l=q(n.ymax,i)?N([[0,n.ymax],[0,i],[t,i],[t,n.ymax]]):null;return{low:o,high:l}}function Ne(e,t,s,n=0){if(e.length===0)return[];let a=[];for(let i=0;i<e.length;i++){let o=e[i],l=e[(i+1)%e.length],c=Rt(o,t,s,n),r=Rt(l,t,s,n);if(c)if(r)a.push(l);else{let m=Dt(o,l,t,n);m&&a.push(m)}else if(r){let m=Dt(o,l,t,n);m&&a.push(m),a.push(l)}}return a}function Rt([e,t],s,n,a=0){let i=s*t+a;return n==="above"?Pt(e,i):q(e,i)}function Dt([e,t],[s,n],a,i=0){let o=s-e-a*(n-t);if(L(o,0))return null;let l=(a*t+i-e)/o;if(l>=-1e-9&&l<0&&(l=0),l>1&&l<=1+1e-9&&(l=1),l<0||l>1)return null;let c=e+l*(s-e),r=t+l*(n-t);return[c,r]}function Nt(e,t){return!e||e.length===0?[]:e.map(([s,n])=>[s+t,n])}function ua(e){if(!e||e.length===0)return[];if(e.length===1)return[[e[0][0],e[0][1]]];if(e.length===2)return L(e[0][0],e[1][0])&&L(e[0][1],e[1][1])?[[e[0][0],e[0][1]]]:e.map(o=>[o[0],o[1]]);let t=e.map(o=>[o[0],o[1]]).sort((o,l)=>{let c=o[0]-l[0];return L(c,0)?o[1]-l[1]:c}),s=(o,l,c)=>(l[0]-o[0])*(c[1]-o[1])-(l[1]-o[1])*(c[0]-o[0]),n=[];for(let o of t){for(;n.length>=2&&De(s(n[n.length-2],n[n.length-1],o),0);)n.pop();n.push(o)}let a=[];for(let o=t.length-1;o>=0;o--){let l=t[o];for(;a.length>=2&&De(s(a[a.length-2],a[a.length-1],l),0);)a.pop();a.push(l)}n.pop(),a.pop();let i=n.concat(a);return N(i)}function Ut(e,t,s,n){if(!e||e.length===0)return null;t>s&&([t,s]=[s,t]);let a=n?.useConvexHull!==!1,i=Nt(e,t),o=Nt(e,s),l=se(i),c=se(o),r=[l.xmin,c.xmax],m;if(L(t,s))m=N(i.map(d=>
1[d[0],d[1]]));else{let d=i.concat(o);a?m=ua(d):m=N(d)}return{envelope:m,shiftedMin:i,shiftedMax:o,cumulativeRange:r}}function pa(e){if(!e||e.length===0)return{cumulative:null,wormholeMass:null,remaining:null};let t=e.map(([a,i])=>a),s=e.map(([a,i])=>i),n=e.map(([a,i])=>i-a);return{cumulative:[Math.min(...t),Math.max(...t)],wormholeMass:[Math.min(...s),Math.max(...s)],remaining:[Math.min(...n),Math.max(...n)]}}var et={destab:1-R.DESTABILIZED_AT_REMAINING,crit:1-R.CRITICAL_AT_REMAINING,gone:1};function ga(e,t){if(!e||e.length===0)return null;let s=e.map(([n,a])=>[t*a-n,a]);return s.reverse(),N(s)}function ha(e){if(!e||e.length<2)return e?[...e]:[];if(!se(e))return[];let s=0;for(let o=1;o<e.length;o++)(q(e[o][1],e[s][1])||L(e[o][1],e[s][1])&&te(e[o][0],e[s][0]))&&(s=o);let n=0;for(let o=1;o<e.length;o++)(te(e[o][1],e[n][1])||L(e[o][1],e[n][1])&&te(e[o][0],e[n][0]))&&(n=o);let a=[],i=s;for(;a.push(e[i]),i!==n;)i=(i-1+e.length)%e.length;return a}function fa(e,t){if(!e||e.length===0)return null;let s=se(e);if(!s)return null;let n=t*s.ymin,a=t*s.ymax,i=ha(e);if(!i||i.length===0)return null;let o=!1;for(let[r,m]of i)if(q(r,t*m)){o=!0;break}if(!o)return null;let l=[];for(let r of i)l.push([r[0],r[1]]);l.push([a,s.ymax]),l.push([n,s.ymin]);let c=N(l);return!c||c.length<3?null:c}function $t(e,t){if(!e||e.length===0)return null;let s=t==="min"?(r,m)=>q(r,m):(r,m)=>te(r,m),n=(r,m)=>L(r,m),a=e[0][0];for(let r=1;r<e.length;r++)s(e[r][0],a)&&(a=e[r][0]);let i=e.filter(([r])=>n(r,a));if(i.length===1)return{type:"point",geometry:i[0]};let o=i.map(([,r])=>r),l=Math.min(...o),c=Math.max(...o);return L(l,c)?{type:"point",geometry:[a,l]}:{type:"segment",geometry:[[a,l],[a,c]]}}function ya(e){let t=[{key:"until_destab",passedFraction:et.destab},{key:"until_crit",passedFraction:et.crit},{key:"until_gone",passedFraction:et.gone}];switch(e){case"STABLE":return t;case"DESTABILIZED":return t.slice(1);case"CRITICAL":return t.slice(2);
1case"GONE":return[];default:return t}}function Ot(e){if(!e||e.length<3)return 0;let t=0;for(let s=0;s<e.length;s++){let[n,a]=e[s],[i,o]=e[(s+1)%e.length];t+=n*o-i*a}return Math.abs(t)/2}function Ft(e){if(!e||e.length<2)return 0;let[t,s]=e[0],[n,a]=e[1];return Math.sqrt((n-t)**2+(a-s)**2)}var oe=["STABLE","DESTABILIZED","CRITICAL","GONE"];function Ia(e){let t=oe.indexOf(e);return t===-1?new Set(oe):new Set(oe.slice(t))}function Ht([e,t],s){let n=le[s];if(!n)return!1;let a=Math.max(0,1-n.fmax),i=Math.min(1/0,1-n.fmin);return Pt(e,a*t)&&De(e,i*t)}function jt(e,t){if(!e||e.length===0)return null;let s=e.length,n=Ia(t),a=()=>({polygon:null,measure:0,fraction:0}),i={dimension:s>=3?"2d":s===2?"1d":"0d",total_measure:0,states:{STABLE:a(),DESTABILIZED:a(),CRITICAL:a(),GONE:a()}};if(s===1){i.total_measure=0;for(let m of oe)if(n.has(m)&&Ht(e[0],m))return i.states[m]={polygon:[e[0]],measure:0,fraction:1},i;return i}if(s===2){let m=Ft(e);if(i.total_measure=m,L(m,0)){i.dimension="0d";for(let g of oe)if(n.has(g)&&Ht(e[0],g))return i.states[g]={polygon:[e[0]],measure:0,fraction:1},i;return i}let d=0,u=null,p=-1;for(let g of oe){if(!n.has(g))continue;let h=tt(e,g);if(!h||h.length<2)continue;let y=Ft(h),I=y/m;i.states[g]={polygon:h,measure:y,fraction:I},d+=I,I>p&&(p=I,u=g)}if(u&&!L(d,0)){let g=1-d;L(g,0)||(i.states[u].fraction+=g)}return i}let o=Ot(e);if(i.total_measure=o,L(o,0))return i;let l=0,c=null,r=-1;for(let m of oe){if(!n.has(m))continue;let d=tt(e,m);if(!d||d.length<3)continue;let u=Ot(d),p=u/o;i.states[m]={polygon:d,measure:u,fraction:p},l+=p,p>r&&(r=p,c=m)}if(c&&!L(l,0)){let m=1-l;L(m,0)||(i.states[c].fraction+=m)}return i}function va(e,t){let s=ya(t),n={until_destab:null,until_crit:null,until_gone:null};if(!e||e.length===0)return n;for(let{key:a,passedFraction:i}of s){let o=ga(e,i);if(!o||o.length===0){n[a]=null;continue}let l=fa(e,i),c=se(o),r=c?[c.xmin,c.xmax]:null,m=$t(o,"min"),d=$t(o,"max");n[a]={polygon:o,chart_polygon:l,range:r,min_scenario:m,max_scenario:d}}return n}var Xt={1:{name:"up to Destroyer",maxJumpMass:5},2:{name:"up to Battlecruiser",maxJumpMass:62},3:{name:"up to Battleship",maxJumpMass:375},4:{name:"up to Freighter",maxJumpMass:1e3},5:{name:"up to Capital",maxJumpMass:2e3}};var Me={A009:{totalMass:3e3,restriction:1,destination:"C13",appearsIn:[]},C008:{totalMass:3e3,restriction:1,destination:"C5",appearsIn:[]},E004:{totalMass:3e3,restriction:1,destination:"C1",appearsIn:[]},G008:{totalMass:3e3,restriction:1,destination:"C6",appearsIn:[]},L005:{totalMass:3e3,restriction:1,destination:"C2",appearsIn:[]},M001:{totalMass:3e3,restriction:1,destination:"C4",appearsIn:[]},Q003:{totalMass:3e3,restriction:1,destination:"NS",appearsIn:[]},Z006:{totalMass:3e3,restriction:1,destination:"C3",appearsIn:[]},C729:{totalMass:1e3,restriction:4,destination:"Pochven",appearsIn:[]},C125:{totalMass:1e3,restriction:2,destination:"C2",appearsIn:["c1"]},F216:{totalMass:1e3,restriction:3,destination:"Pochven",appearsIn:[]},H121:{totalMass:500,restriction:2,destination:"C1",appearsIn:["c1"]},J244:{totalMass:1e3,restriction:2,destination:"LS",appearsIn:["c1"]},J377:{totalMass:1e3,restriction:2,destination:"LS",appearsIn:[]},J492:{totalMass:1e3,restriction:2,destination:"LS",appearsIn:[]},L614:{totalMass:1e3,restriction:2,destination:"C5",appearsIn:["c1"]},M609:{totalMass:1e3,restriction:2,destination:"C4",appearsIn:["c1"]},N110:{totalMass:1e3,restriction:2,destination:"HS",appearsIn:["c1"]},O883:{totalMass:1e3,restriction:2,destination:"C3",appearsIn:["c1"]},P060:{totalMass:500,restriction:2,destination:"C1",appearsIn:["c4"]},Q063:{totalMass:500,restriction:2,destination:"HS",appearsIn:["thera"]},Q317:{totalMass:500,restriction:2,destination:"C1",appearsIn:["c6"]},S804:{totalMass:1e3,restriction:2,destination:"C6",appearsIn:["c1"]},T458:{totalMass:500,restriction:2,destination:"Thera",appearsIn:["hs"]},V301:{totalMass:500,restriction:2,destination:"C1",appearsIn:["c3"]},Y790:{totalMass:500,restriction:2,destination:"C1",appearsIn:["c5"]},Z060:{totalMass:1e3,restriction:2,destination:"NS",appearsIn:["c1"]},Z647:{totalMass:500,restriction:2,destination:"C1",appearsIn:["c2"]},Z971:{totalMass:100,restriction:2,destination:"C1",appearsIn:["hs","ls","ns"]},F353:{totalMass:100,restriction:2,destination:"Thera",appearsIn:["c1"]},A239:{totalMass:2e3,restriction:3,destination:"LS",appearsIn:["c2"]},A982:{totalMass:3e3,restriction:3,destination:"C6",appearsIn:["c3"]},B274:{totalMass:2e3,restriction:3,destination:"HS",appearsIn:["c2"]},C247:{totalMass:2e3,restriction:3,destination:"C3",appearsIn:["c4"]},D364:{totalMass:1e3,restriction:3,destination:"C2",appearsIn:["c5"]},D382:{totalMass:2e3,restriction:3,destination:"C2",appearsIn:["c2"]},D845:{totalMass:5e3,restriction:3,destination:"HS",appearsIn:["c3"]},E175:{totalMass:2e3,restriction:3,destination:"C4",appearsIn:["c5"]},E545:{totalMass:2e3,restriction:3,destination:"NS",appearsIn:["c2"]},F135:{totalMass:750,restriction:3,destination:"Thera",appearsIn:["c2","c3"]},G024:{totalMass:2e3,restriction:3,destination:"C2",appearsIn:["c6"]},I182:{totalMass:2e3,restriction:3,destination:"C2",appearsIn:["c3"]},K329:{totalMass:3e3,restriction:3,destination:"NS",appearsIn:["c4"]},K346:{totalMass:3e3,restriction:3,destination:"NS",appearsIn:["c3"]},L477:{totalMass:2e3,restriction:3,destination:"C3",appearsIn:["c6"]},M267:{totalMass:1e3,restriction:3,destination:"C3",appearsIn:["c5"]},N062:{totalMass:3e3,restriction:3,destination:"C5",appearsIn:["c2"]},N290:{totalMass:3e3,restriction:3,destination:"LS",appearsIn:["c4"]},N766:{totalMass:2e3,restriction:3,destination:"C2",appearsIn:["c4"]},N770:{totalMass:3e3,restriction:3,destination:"C5",appearsIn:["c3"]},N968:{totalMass:2e3,restriction:3,destination:"C3",appearsIn:["c3"]},O128:{totalMass:1e3,restriction:3,destination:"C4",appearsIn:["hs","ls","ns"]},O477:{totalMass:2e3,restriction:3,destination:"C3",appearsIn:["c2"]},R943:{totalMass:750,restriction:3,destination:"C2",appearsIn:["hs","ls","ns"]},R081:{totalMass:1e3,restriction:3,destination:"C4",appearsIn:[]},S047:{totalMass:3e3,restriction:3,destination:"HS",appearsIn:["c4"]},T405:{totalMass:2e3,restriction:3,destination:"C4",appearsIn:["c3"]},U210:{totalMass:3e3,restriction:3,destination:"LS",appearsIn:["c3"]},U372:{totalMass:1e3,restriction:3,destination:"Pochven",appearsIn:[]},U574:{totalMass:3e3,restriction:3,destination:"C6",appearsIn:["c4"]},X450:{totalMass:1e3,restriction:3,destination:"NS",appearsIn:[]},X702:{totalMass:1e3,restriction:3,destination:"C3",appearsIn:["hs","ls","ns"]},X877:{totalMass:2e3,restriction:3,destination:"C4",appearsIn:["c4"]},Y683:{totalMass:2e3,restriction:3,destination:"C4",appearsIn:["c2"]},Z457:{totalMass:2e3,restriction:3,destination:"C4",appearsIn:["c6"]},H900:{totalMass:3e3,restriction:3,destination:"C5",appearsIn:["c4"]},R474:{totalMass:3e3,restriction:3,destination:"C6",appearsIn:["c2"]},B735:{totalMass:750,restriction:3,destination:"Drifter",appearsIn:[]},C414:{totalMass:750,restriction:3,destination:"Drifter",appearsIn:[]},R259:{totalMass:750,restriction:3,destination:"Drifter",appearsIn:[]},S877:{totalMass:750,restriction:3,destination:"Drifter",appearsIn:[]},V928:{totalMass:750,restriction:3,destination:"Drifter",appearsIn:[]},A641:{totalMass:2e3,restriction:4,destination:"HS",appearsIn:["hs"]},B041:{totalMass:3e3,restriction:4,destination:"C6",appearsIn:["hs"]},B449:{totalMass:2e3,restriction:4,destination:"HS",appearsIn:["ls","ns"]},B520:{totalMass:3e3,restriction:4,destination:"HS",appearsIn:["c6"]},D792:{totalMass:3e3,restriction:4,destination:"HS",appearsIn:["c5","c6"]},E587:{totalMass:3e3,restriction:4,destination:"NS",appearsIn:["thera"]},L031:{totalMass:3e3,restriction:4,destination:"Thera",appearsIn:["ns"]},M164:{totalMass:2e3,restriction:4,destination:"Thera",appearsIn:["ls"]},M555:{totalMass:3e3,restriction:4,destination:"C5",appearsIn:["hs"]},R051:{totalMass:3e3,restriction:4,destination:"LS",appearsIn:["hs"]},V283:{totalMass:3e3,restriction:4,destination:"NS",appearsIn:["hs"]},V898:{totalMass:2e3,restriction:4,destination:"LS",appearsIn:["thera"]},C140:{totalMass:3300,restriction:5,destination:"LS",appearsIn:["c5","c6"]},C248:{totalMass:3300,restriction:5,destination:"NS",appearsIn:["c6"]},C391:{totalMass:3300,restriction:5,destination:"LS",appearsIn:["c6"]},H296:{totalMass:3300,restriction:5,destination:"C5",appearsIn:["c5"]},N432:{totalMass:3300,restriction:5,destination:"C5",appearsIn:["ls","ns"]},N944:{totalMass:3300,restriction:5,destination:"LS",appearsIn:["ls","ns"]},S199:{totalMass:3300,restriction:5,destination:"NS",appearsIn:["ls","ns"]},U319:{totalMass:3300,restriction:5,destination:"C6",appearsIn:["ls","ns"]},V753:{totalMass:3300,restriction:5,destination:"C6",appearsIn:["c5"]},V911:{totalMass:3300,restriction:5,destination:"C5",appearsIn:["c6"]},W237:{totalMass:3300,restriction:5,destination:"C6",appearsIn:["c6"]},Z142:{totalMass:3300,restriction:5,destination:"NS",appearsIn:["c5","c6"]}};function Wt(e){let t=[];for(let[s,n]of Object.entries(Me)){let a=!0;e.appearsIn&&(!n.appearsIn||n.appearsIn.length===0||n.appearsIn.includes(e.appearsIn.toLowerCase())||(a=!1)),e.destination&&n.destination!==e.destination&&(a=!1),e.restriction&&n.restriction!==e.restriction&&(a=!1),a&&t.push(s)}return t.sort()}function re(e){let t=Me[e];return t?{code:e,totalMass:t.totalMass,restriction:t.restriction,restrictionInfo:Xt[t.restriction],destination:t.destination,appearsIn:t.appearsIn||[]}:null}var U=class e{constructor(){this.wormhole=null,this.events=[],this.constraints=null,this.validationFailed=!1,this.failureReason=null}selectWormhole(t){let s=re(t);if(!s)throw new Error(`Unknown wormhole code: ${t}`);this.wormhole=s,this.events=[],this.constraints=null}setInitialState(t){if(!this.wormhole)throw new Error("Select wormhole first");
1if(t==="STABLE_AND_FRESH")this.events=[{label:"Fresh",passed_mass_range:[0,0],state:"STABLE",constrained_mass_range:null,shipSnapshot:null}];else{let{passed:s}=qt(this.wormhole.totalMass,t);this.events=[{label:"Initial",passed_mass_range:s,state:t,constrained_mass_range:null,shipSnapshot:null}]}this._recompute()}addEvent(t,s,n="",a=null){if(this.isCollapsed())throw new Error("Cannot add events after wormhole collapsed");if(this.validationFailed)throw new Error("Cannot add events after validation failure \u2014 remove the failed event first");this.events.push({label:n||`Event ${this.events.length}`,passed_mass_range:t,state:s,constrained_mass_range:null,shipSnapshot:a||null}),this._recompute()}removeEvent(t){if(t<0||t>=this.events.length)throw new Error("Invalid event index");this.events[t].failedValidation&&(this.validationFailed=!1,this.failureReason=null),this.events.splice(t,1),this.events.length>0?this._recompute():this.constraints=null}editEvent(t,s,n,a){if(t<0||t>=this.events.length)throw new Error("Invalid event index");this.events[t]={label:a||this.events[t].label,passed_mass_range:s,state:n,constrained_mass_range:null,shipSnapshot:this.events[t].shipSnapshot||null},this._recompute()}isCollapsed(){return this.events.length>0&&this.events[this.events.length-1].state==="GONE"}getDisplayData(){if(!this.wormhole||!this.constraints&&!this.validationFailed)return null;if(!this.constraints)return{wormhole:{code:this.wormhole.code,totalMass:this.wormhole.totalMass,originalMassRange:[this.wormhole.totalMass*.9,this.wormhole.totalMass*1.1],reducedWormholeMassRange:null,currentState:this.events[0]?.state||null,remainingUntilGoneRange:null,cumulativeReducedMassRange:null,stateBoundaries:null,geometry:null},events:this.events.map((a,i)=>({index:i,label:a.label,inputMassRange:a.passed_mass_range,eventReducedMassRange:a.passed_mass_range,cumulativeReducedMassRange:a.passed_mass_range,remainingUntilGoneRange:null,remainingUntilDestabRange:null,remainingUntilCritRange:null,reducedWormholeMassRange:null,state:a.state,geometry:null,shipSnapshot:a.shipSnapshot||null,failedValidation:a.failedValidation||!1,failureReason:a.failureReason||null})),validationFailed:this.validationFailed,failureReason:this.failureReason};let t=this.validationFailed?this.events.length-2:this.events.length-1,s=Math.min(t,this.constraints.events.length-1),n=this.constraints.events[s];return{wormhole:{code:this.wormhole.code,totalMass:this.wormhole.totalMass,originalMassRange:[this.wormhole.totalMass*.9,this.wormhole.totalMass*1.1],reducedWormholeMassRange:n.reduced_wormhole_mass_range_after_this_event,currentState:this.events[t].state,remainingUntilGoneRange:n.remaining_until_gone_range,cumulativeReducedMassRange:n.cumulative_reduced_mass_range,stateBoundaries:this.constraints.wormhole.state_boundaries,geometry:this.constraints.wormhole.geometry},events:this.events.map((a,i)=>{if(i<this.constraints.events.length&&!a.failedValidation){let o=this.constraints.events[i];return{index:i,label:a.label,inputMassRange:a.passed_mass_range,eventReducedMassRange:o.event_reduced_mass_range,cumulativeReducedMassRange:o.cumulative_reduced_mass_range,remainingUntilGoneRange:o.remaining_until_gone_range,remainingUntilDestabRange:o.remaining_until_destab_range,remainingUntilCritRange:o.remaining_until_crit_range,reducedWormholeMassRange:o.reduced_wormhole_mass_range_after_this_event,state:a.state,geometry:o.geometry,shipSnapshot:a.shipSnapshot||null,failedValidation:!1,failureReason:null}}return{index:i,label:a.label,inputMassRange:a.passed_mass_range,eventReducedMassRange:a.passed_mass_range,cumulativeReducedMassRange:a.passed_mass_range,remainingUntilGoneRange:null,remainingUntilDestabRange:null,remainingUntilCritRange:null,reducedWormholeMassRange:null,state:a.state,geometry:null,shipSnapshot:a.shipSnapshot||null,failedValidation:!0,failureReason:a.failureReason||this.failureReason}}),validationFailed:this.validationFailed,failureReason:this.failureReason}}reset(){this.wormhole=null,this.events=[],this.constraints=null,this.validationFailed=!1,this.failureReason=null}_recompute(){if(!this.wormhole||this.events.length===0)return;let t={wormhole:{original_mass_range:[this.wormhole.totalMass*.9,this.wormhole.totalMass*1.1]},events:this.events.map(n=>({passed_mass_range:n.passed_mass_range,new_state:n.state}))},s=Vt(t);if(s.valid===!1){this.validationFailed=!0,this.failureReason=s.reason||"Constraints are infeasible";let n=this.events.length-1;this.events[n].failedValidation=!0,this.events[n].failureReason=this.failureReason;return}this.validationFailed=!1,this.failureReason=null,this.constraints=s,this.events.forEac
1h((n,a)=>{n.constrained_mass_range=this.constraints.events[a].event_reduced_mass_range,n.failedValidation=!1,n.failureReason=null})}computeDraftPreview(t,s){if(!this.wormhole||this.events.length===0||!this.constraints||this.isCollapsed()||this.validationFailed)return null;let n=this.constraints.events.length-1,a=this.constraints.events[n].geometry?.cumulative_possible_passed_geometry;if(!a||a.length<2)return null;let i=this.events[this.events.length-1].state,o=Ut(a,t,s);if(!o)return null;let l=jt(o.envelope,i);return{envelope:o,stateBreakdown:l,currentState:i}}toJSON(){return{wormhole:this.wormhole,events:this.events.map(t=>({label:t.label,passed_mass_range:t.passed_mass_range,state:t.state,shipSnapshot:t.shipSnapshot||null}))}}static fromJSON(t){let s=new e;return s.wormhole=t.wormhole,s.events=t.events.map(n=>({...n,constrained_mass_range:null,shipSnapshot:n.shipSnapshot||null})),s.events.length>0&&s._recompute(),s}};function F(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}function $e(){let e=new Date().toISOString(),t={hullTypeId:null,hullName:null,hullSize:null,propModSize:null,higgsEnabled:!1,useCustomMass:!1,nameAutoGenerated:!0};return[{id:F(),type:"fleet",userVisibleName:"Default Scouts",description:"Default Scout fleet (covert ops and interdictors)",modes:{cold:{min:4.702,max:4.702},hot:{min:6.702,max:6.702}},fleetComposition:[{typeId:22456,name:"Sabre",massGg:1.285,size:"S",count:1},{typeId:11192,name:"Buzzard",massGg:1.27,size:"S",count:1},{typeId:11188,name:"Anathema",massGg:1.147,size:"S",count:1},{typeId:22460,name:"Eris",massGg:1,size:"S",count:1}],useCustomMass:!1,nameAutoGenerated:!1,isDefault:!0,createdAt:e,updatedAt:e},{id:F(),type:"ship",userVisibleName:"Default Rolling Battleship",description:"Default Rolling Battleship",modes:{entangle:null,cold:{min:198,max:200},hot:{min:298,max:300}},...t,isDefault:!0,createdAt:e,updatedAt:e},{id:F(),type:"ship",userVisibleName:"Default Rolling HIC",description:"Default Rolling Heavy Interdictor",modes:{entangle:{min:0,max:1},cold:{min:28,max:33},hot:{min:128,max:133}},...t,isDefault:!0,createdAt:e,updatedAt:e},{id:F(),type:"ship",userVisibleName:"Default Rolling Sigil",description:"Default Rolling Sigil",modes:{entangle:null,cold:{min:22,max:22},hot:{min:122,max:122}},...t,isDefault:!0,createdAt:e,updatedAt:e}]}var Sa=["hullTypeId","hullName","hullSize","propModSize","higgsEnabled","useCustomMass","fleetComposition"];function _e(e){let t={};for(let s of Sa)Object.prototype.hasOwnProperty.call(e,s)&&(t[s]=e[s]);return t}function xe(e,t){let s=e.type||"ship",n=e.label||e.userVisibleName||"?";if(s==="quickmass"){let o=e.modes.mass;if(!o)throw new Error(`No mass range configured on ${s} '${n}'`);if(t==="MASS")return{min:o.min,max:o.max};if(t==="MASS+10%")return{min:o.min,max:o.max*1.1};if(t==="MASS+20%")return{min:o.min,max:o.max*1.2};throw new Error(`Unknown mode '${t}' for ${s} '${n}'`)}let a=t.toLowerCase();if(a==="unknown")return ba(e.modes);let i=e.modes[a];if(!i)throw new Error(`Mode '${t}' is not configured on '${n}'`);return{min:i.min,max:i.max}}function ba(e){let t=1/0,s=-1/0;for(let[n,a]of Object.entries(e))a&&n!=="unknown"&&(t=Math.min(t,a.min),s=Math.max(s,a.max));if(t===1/0||s===-1/0)throw new Error("Cannot compute unknown range: no modes configured");return{min:t,max:s}}function st(e){if((e.type||"ship")==="quickmass")return["MASS","MASS+10%","MASS+20%"];let s=[];return e.modes.entangle&&s.push("ENTANGLE"),e.modes.cold&&s.push("COLD"),e.modes.hot&&s.push("HOT"),s.length>0&&s.push("UNKNOWN"),s}function Ma(e,t){if((e.type||"ship")!=="ship")return"none";let n=st(e).filter(o=>o!=="UNKNOWN");if(n.length===0)return"none";let a=!0,i=!1;for(let o of n){let l=xe(e,o);l.min>t?i=!0:(l.max>t&&(i=!0),a=!1)}return a?"all":i?"some":"none"}function _a(e,t,s){let n=xe(e,t);return n.min>s?"full":n.max>s?"partial":"none"}var j=class e{constructor(){this.instances=[]}_generateLabel(t){let s=`${t} #`,n=0;for(let a of this.instances)if(a.label.startsWith(s)){let i=parseInt(a.label.slice(s.length),10);!isNaN(i)&&i>n&&(n=i)}return`${t} #${n+1}`}addInstance(t,s){if(!t||!t.modes)throw new Error("Invalid template: must have modes");let n=this._generateLabel(t.userVisibleName),a={id:F(),side:s,label:n,type:t.type||"ship",modes:JSON.parse(JSON.stringify(t.modes)),..._e(t),draftMode:null,createdAt:new Date().toISOString()};return this.instances.push(a),a}removeInstance(t){this.instances=this.instances.filter(s=>s.id!==t)}renameInstance(t,s){let n=this.instances.find(i=>i.id===t);if(!n)throw new Error(`Instance not found: ${t}`);let a=s?.trim();a&&(n.label=a)}getInstancesBySide(t){return this.instances.filter(s=>s.side===t)}moveInstance(t,s){let n=this.instances.findIndex(m=>m.id===t);if(n===-1)return!1;let a=this.instances[n],i=this.getInstancesBySide(a.side),o=i.findIndex(m=>m.id===t),l=Math.max(0,Math.min(s,i.length-1));if(o===l)return!1;i.splice(o,1),i.splice(l,0,a);let c=[],r=[...i];for(let m of this.instances)m.side===a.side?c.push(r.shift()):c.push(m);return this.instances=c,!0}setDraftMode(t,s){let n=this.instances.find(a=>a.id===t);if(!n)throw new Error(`Instance not found: ${t}`);if(s!==null&&!st(n).includes(s))throw new Error(`Mode '${s}' not available on '${n.label}'`);n.draftMode=s}getDraftedInstances(){return this.instances.filter(t=>t.draftMode!==null)}computePassMassRange(){let t=this.getDraftedInstances();if(t.length===0)return null;let s=0,n=0;for(let a of t){let i=xe(a,a.draftMode);s+=i.min,n+=i.max}return{min:s,max:n,count:t.length}}calculatePass(t,s){let n=this.computePassMassRange();if(!n)return{success:!1,error:"No ships drafted for pass"};let a=this.getDraftedInstances(),i=a.map(o=>{let l=o.draftMode?` (${o.draftMode.toLowerCase()})`:"";return`${o.label}${l}`}).join(", ");
1try{let o=this.getShipSnapshot();t.addEvent([n.min,n.max],s,i,o);for(let l of a)l.side=l.side==="LEFT"?"RIGHT":"LEFT",l.draftMode=null;return{success:!0,passedRange:[n.min,n.max],label:i}}catch(o){return{success:!1,error:o.message}}}clearDraft(){for(let t of this.instances)t.draftMode=null}reset(){this.instances=[]}getInstanceDisplay(t,s=null){let n=st(t),a=null;if(t.draftMode)try{a=xe(t,t.draftMode)}catch{a=null}let i="none";if(s!==null&&(t.type||"ship")==="ship")if(t.draftMode){let o=_a(t,t.draftMode,s);i=o==="full"?"all":o==="partial"?"some":"none"}else i=Ma(t,s);return{...t,availableModes:n,resolvedMass:a,overMassStatus:i}}getShipSnapshot(){return this.instances.map(t=>{let s={id:t.id,label:t.label,type:t.type,side:t.side,draftMode:t.draftMode,modes:JSON.parse(JSON.stringify(t.modes)),..._e(t),createdAt:t.createdAt};if(t.draftMode)try{let n=xe(t,t.draftMode);s.resolvedMassRange={min:n.min,max:n.max}}catch{s.resolvedMassRange=null}return s})}restoreFromSnapshot(t){t&&(this.instances=t.map(s=>({id:s.id,label:s.label,type:s.type||"ship",side:s.side,draftMode:s.draftMode||null,modes:JSON.parse(JSON.stringify(s.modes)),..._e(s),createdAt:s.createdAt})))}toJSON(){return{instances:this.instances.map(t=>({id:t.id,side:t.side,label:t.label,type:t.type,modes:t.modes,..._e(t),draftMode:t.draftMode,createdAt:t.createdAt}))}}static fromJSON(t){let s=new e;return s.instances=(t.instances||[]).map(n=>({id:n.id,side:n.side,label:n.label,type:n.type||"ship",modes:JSON.parse(JSON.stringify(n.modes)),..._e(n),draftMode:n.draftMode||null,createdAt:n.createdAt})),s}};var mt={};Tt(mt,{addFavourite:()=>dt,close:()=>Ta,deleteSession:()=>Ba,deleteTemplate:()=>lt,getFavourites:()=>we,getSession:()=>Aa,getSessions:()=>za,getSetting:()=>ct,getTemplate:()=>La,getTemplates:()=>Fe,initStorage:()=>nt,isEmpty:()=>rt,open:()=>it,pruneSessionsToMax:()=>ka,removeFavourite:()=>Pe,restoreDefaults:()=>He,saveSession:()=>Ca,saveTemplate:()=>ot,setSetting:()=>ce});var at;function nt(e){at=e}
1var xa="wormhole-hangar",Ea=4,X="templates",ae="sessions",de="favourites",Oe="settings",wa=5,Ga=5,Ie=null;function k(){if(!Ie){if(!at)throw new Error("Storage not initialized. Call initStorage(openDB) first.");Ie=at(xa,Ea,{upgrade(e){if(!e.objectStoreNames.contains(X)){let t=e.createObjectStore(X,{keyPath:"id"});t.createIndex("name","userVisibleName",{unique:!1}),t.createIndex("isDefault","isDefault",{unique:!1})}e.objectStoreNames.contains(ae)||e.createObjectStore(ae,{keyPath:"id"}).createIndex("updatedAt","updatedAt",{unique:!1}),e.objectStoreNames.contains(de)||e.createObjectStore(de,{keyPath:"id"}),e.objectStoreNames.contains(Oe)||e.createObjectStore(Oe,{keyPath:"key"})}})}return Ie}async function it(){await k()}async function Fe(){return(await k()).getAll(X)}async function La(e){return(await k()).get(X,e)}async function ot(e){await(await k()).put(X,e)}async function lt(e){await(await k()).delete(X,e)}async function He(e){let t=await k(),s=await t.getAll(X),n=new Map(s.map(i=>[i.userVisibleName,i])),a=t.transaction(X,"readwrite");for(let i of e){let o=n.get(i.userVisibleName);o?await a.store.put({...i,id:o.id,updatedAt:new Date().toISOString()}):await a.store.put(i)}await a.done}async function rt(){return await(await k()).count(X)===0}async function za(){let t=await(await k()).getAll(ae);return t.sort((s,n)=>(n.createdAt||"").localeCompare(s.createdAt||"")),t}async function Aa(e){return(await k()).get(ae,e)}async function Ca(e){await(await k()).put(ae,e)}async function Ba(e){await(await k()).delete(ae,e)}async function ka(e=wa){let t=await k(),s=await t.getAll(ae);if(s.length<=e)return 0;s.sort((i,o)=>(i.createdAt||"").localeCompare(o.createdAt||""));let n=s.slice(0,s.length-e),a=t.transaction(ae,"readwrite");for(let i of n)await a.store.delete(i.id);return await a.done,n.length}async function Ta(){Ie&&((await Ie).close(),Ie=null)}var Ee="user-favourites";async function we(){let t=await(await k()).get(de,Ee);return t?t.codes:[]}async function dt(e){let t=await k(),s=await t.get(de,Ee),n=s?[...s.codes]:[];return n.includes(e)||n.length>=Ga?!1:(n.push(e),await t.put(de,{id:Ee,codes:n}),!0)}async function Pe(e){let t=await k(),s=await t.get(de,Ee),n=s?s.codes.filter(a=>a!==e):[];return await t.put(de,{id:Ee,codes:n}),n}async function ct(e){let s=await(await k()).get(Oe,e);return s!==void 0?s.value:void 0}async function ce(e,t){await(await k()).put(Oe,{key:e,value:t})}var Zt={title:"Quick Example \u2014 3 Stable Passes + Draft",backdrop:{bounds:{x:[0,3300],y:[2700,3300]},state_lines:{gone:{from:[2700,2700],to:[3300,3300]},critical:{from:[2430,2700],to:[2970,3300]},destab:{from:[1350,2700],to:[1650,3300]}}},events:[{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[0,3300],[10,3300],[10,2700],[0,2700]],cumulative_certain_passed_geometry:null,excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[610,2700],[600,2700],[600,3300],[610,3300]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[600,3300],[600,2700]],excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[1300,3300],[1310,3300],[1310,2700],[1300,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[1300,3300],[1300,2700]],excluded_mass_bands:{low:null,high:null}}}],draft:{envelope:[[1600,3300],[1610,3300],[1610,2700],[1600,2700]],shiftedMin:[[1600,3300],[1610,3300],[1610,2700],[1600,2700]],shiftedMax:[[1600,3300],[1610,3300],[1610,2700],[1600,2700]],cumulativeRange:[1600,1610],label:"300 Gg draft"}},Kt={title:"Example 2 \u2014 Uncertainty + Destabilization",backdrop:{bounds:{x:[0,3300],y:[2700,3300]},state_lines:{gone:{from:[2700,2700],to:[3300,3300]},critical:{from:[2430,2700],to:[2970,3300]},destab:{from:[1350,2700],to:[1650,3300]}}},events:[{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[0,3300],[200,3300],[200,2700],[0,2700]],cumulative_certain_passed_geometry:null,excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[1400,2800],[1350,2700],[1200,2700],[1200,3300],[1400,3300]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[1200,3300],[1200,2700]],excluded_mass_bands:{low:null,high:null}}},{state:"DESTABILIZED",geometry:{cumulative_possible_passed_geometry:[[1500,2700],[1500,3e3],[1650,3300],[1700,3300],[1700,2800],[1650,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[1650,3300],[1500,3e3],[1500,2700]],excluded_mass_bands:{low:null,high:null}}}],draft:{envelope:[[1800,2700],[2050,2700],[2100,2800],[2100,3300],[1950,3300],[1800,3e3]],shiftedMin:[[1800,2700],[1800,3e3],[1950,3300],[2e3,3300],[2e3,2800],[1950,2700]],shiftedMax:[[1900,2700],[1900,3e3],[2050,3300],[2100,3300],[2100,2800],[2050,2700]],cumulativeRange:[1800,2100],label:"300\u2013400 Gg draft"}}
1,ut={bounds:{x:[0,3300],y:[2700,3300]},state_lines:{gone:{from:[2700,2700],to:[3300,3300]},critical:{from:[2430,2700],to:[2970,3300]},destab:{from:[1350,2700],to:[1650,3300]}}},Jt={title:"Rolling a 3000 Gg Hole",backdrop:ut,events:[{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[1,3300],[1,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[1,3300],[1,2700]],excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[601,3300],[601,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[601,3300],[601,2700]],excluded_mass_bands:{low:null,high:null}}}],draft:{envelope:[[1501,3300],[1501,2700]],shiftedMin:[[1501,3300],[1501,2700]],shiftedMax:[[1501,3300],[1501,2700]],cumulativeRange:[1501,1501],label:"900 Gg draft"}},Yt={title:"Rolling a 3000 Gg Hole",backdrop:ut,events:[{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[1,3300],[1,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[1,3300],[1,2700]],excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[601,3300],[601,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[601,3300],[601,2700]],excluded_mass_bands:{low:null,high:null}}},{state:"DESTABILIZED",geometry:{cumulative_possible_passed_geometry:[[1501,3002],[1501,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3002],[1501,3002],[1501,2700]],excluded_mass_bands:{low:null,high:[[0,3002],[0,3300],[3300,3300],[3300,3002]]}}},{state:"DESTABILIZED",geometry:{cumulative_possible_passed_geometry:[[2101,3002],[2101,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3002],[2101,3002],[2101,2700]],excluded_mass_bands:{low:null,high:[[0,3002],[0,3300],[3300,3300],[3300,3002]]}}},{state:"CRITICAL",geometry:{cumulative_possible_passed_geometry:[[2701,3001],[2701,2701]],cumulative_certain_passed_geometry:[[0,2701],[0,3001],[2701,3001],[2701,2701]],excluded_mass_bands:{low:[[0,2700],[0,2701],[3300,2701],[3300,2700]],high:[[0,3001],[0,3300],[3300,3300],[3300,3001]]}}},{state:"GONE",geometry:{cumulative_possible_passed_geometry:[[3001,2701],[3001,3001]],cumulative_certain_passed_geometry:[[0,2701],[0,3001],[3001,3001],[3001,2701]],excluded_mass_bands:{low:[[0,2700],[0,2701],[3300,2701],[3300,2700]],high:[[0,3001],[0,3300],[3300,3300],[3300,3001]]}}}]},Qt={bounds:{x:[0,2200],y:[1800,2200]},state_lines:{gone:{from:[1800,1800],to:[2200,2200]},critical:{from:[1620,1800],to:[1980,2200]},destab:{from:[900,1800],to:[1100,2200]}}},es={title:"Rolling a Stable 2000 Gg Hole",backdrop:Qt,events:[{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[0,2200],[1100,2200],[900,1800],[0,1800]],cumulative_certain_passed_geometry:null,excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[900,1800],[299,1800],[299,2200],[1100,2200]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[299,2200],[299,1800]],excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[598,2200],[1100,2200],[900,1800],[598,1800]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[598,2200],[598,1800]],excluded_mass_bands:{low:null,high:null}}}],draft:{envelope:[[897,2200],[1399,2200],[1199,1800],[897,1800]],shiftedMin:[[897,2200],[1399,2200],[1199,1800],[897,1800]],shiftedMax:[[897,2200],[1399,2200],[1199,1800],[897,1800]],cumulativeRange:[897,1399],label:"299 Gg draft (BS HOT)"}},ts={title:"Rolling a Stable 2000 Gg Hole",backdrop:Qt,events:[{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[0,2200],[1100,2200],[900,1800],[0,1800]],cumulative_certain_passed_geometry:null,excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[900,1800],[299,1800],[299,2200],[1100,2200]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[299,2200],[299,1800]],excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[598,2200],[1100,2200],[900,1800],[598,1800]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[598,2200],[598,1800
1]],excluded_mass_bands:{low:null,high:null}}},{state:"DESTABILIZED",geometry:{cumulative_possible_passed_geometry:[[900,1800],[1100,2200],[1399,2200],[1199,1800]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[1100,2200],[900,1800]],excluded_mass_bands:{low:null,high:null}}},{state:"DESTABILIZED",geometry:{cumulative_possible_passed_geometry:[[1399,2200],[1698,2200],[1498,1800],[1199,1800]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[1399,2200],[1199,1800]],excluded_mass_bands:{low:null,high:null}}},{state:"DESTABILIZED",geometry:{cumulative_possible_passed_geometry:[[1620,1800],[1498,1800],[1698,2200],[1980,2200]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[1698,2200],[1498,1800]],excluded_mass_bands:{low:null,high:null}}},{state:"CRITICAL",geometry:{cumulative_possible_passed_geometry:[[2112,2200],[1752,1800],[1630,1800],[1643,1825],[1980,2200]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[1980,2200],[1643,1825],[1630,1800]],excluded_mass_bands:{low:null,high:null}}},{state:"CRITICAL",geometry:{cumulative_possible_passed_geometry:[[1662,1800],[1675,1825],[2012,2200],[2144,2200],[1784,1800]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[2012,2200],[1675,1825],[1662,1800]],excluded_mass_bands:{low:null,high:null}}},{state:"GONE",geometry:{cumulative_possible_passed_geometry:[[2311,2200],[2443,2200],[2083,1800],[1961,1800],[1974,1825]],cumulative_certain_passed_geometry:[[0,1800],[0,2200],[2311,2200],[1974,1825],[1961,1800]],excluded_mass_bands:{low:null,high:null}}}],draft:{envelope:[[1752,1800],[1630,1800],[1830,2200],[2112,2200]],shiftedMin:[[1752,1800],[1630,1800],[1830,2200],[2112,2200]],shiftedMax:[[1752,1800],[1630,1800],[1830,2200],[2112,2200]],cumulativeRange:[1630,2112],label:"132 Gg draft (HOPM HOT)"}},ss={title:"Rolling a 3000 Gg Hole",backdrop:ut,events:[{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[1,3300],[1,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[1,3300],[1,2700]],excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[601,3300],[601,2700]],cumulative_certain_passed_geometry:[[0,2700],[0,3300],[601,3300],[601,2700]],excluded_mass_bands:{low:null,high:null}}},{state:"STABLE",geometry:{cumulative_possible_passed_geometry:[[1501,3002],[1501,3300]],cumulative_certain_passed_geometry:[[0,3002],[0,3300],[1501,3300],[1501,3002]],excluded_mass_bands:{low:[[0,2700],[0,3002],[3300,3002],[3300,2700]],high:null}}},{state:"DESTABILIZED",geometry:{cumulative_possible_passed_geometry:[[2401,3002],[2401,3300]],cumulative_certain_passed_geometry:[[0,3002],[0,3300],[2401,3300],[2401,3002]],excluded_mass_bands:{low:[[0,2700],[0,3002],[3300,3002],[3300,2700]],high:null}}},{state:"CRITICAL",geometry:{cumulative_possible_passed_geometry:[[3001,3002],[3001,3300]],cumulative_certain_passed_geometry:[[0,3002],[0,3300],[3001,3300],[3001,3002]],excluded_mass_bands:{low:[[0,2700],[0,3002],[3300,3002],[3300,2700]],high:null}}},{state:"GONE",geometry:{cumulative_possible_passed_geometry:[[3301,3300],[3301,3002]],cumulative_certain_passed_geometry:[[0,3002],[0,3300],[3301,3300],[3301,3002]],excluded_mass_bands:{low:[[0,2700],[0,3002],[3300,3002],[3300,2700]],high:null}}}]};var Ra=25,Ve=class{constructor(t){this.storage=t,this.activeSessionId=null}async newSession(t,s,n=null){let a=new Date().toISOString(),i={id:F(),name:null,notes:"",createdAt:a,updatedAt:a,tracker:t.toJSON(),shipState:s.toJSON(),uiState:n||null};return await this.storage.saveSession(i),this.activeSessionId=i.id,await this.storage.pruneSessionsToMax(Ra),i}async saveCurrentSession(t,s,n=void 0){if(this.activeSessionId)try{let a=await this.storage.getSession(this.activeSessionId);if(!a){this.activeSessionId=null;return}a.updatedAt=new Date().toISOString(),a.tracker=t.toJSON(),a.shipState=s.toJSON(),n!==void 0&&(a.uiState=n),await this.storage.saveSession(a)}catch(a){console.error("Failed to save session:",a)}}async switchSession(t,s,n,a=void 0){await this.saveCurrentSession(s,n,a);let i=await this.storage.getSession(t);if(!i)return null;this.activeSessionId=i.id;let o=U.fromJSON(i.tracker),l=j.fromJSON(i.shipState);return{tracker:o,shipManager:l,uiState:i.uiState||null}}async deleteSession(t){let s=t===this.activeSessionId;return await this.storage.deleteSession(t),s&&(this.activeSessionId=null),s}async getSavedSessions(){return this.storage.getSessions()}async renameSession(t,s){let n=await this.storage.getSession(t);
1n&&(n.name=s?.trim()||null,n.updatedAt=new Date().toISOString(),await this.storage.saveSession(n))}async onSessionChanged(t,s,n=void 0){await this.saveCurrentSession(t,s,n)}async getSessionNotes(t){return(await this.storage.getSession(t))?.notes||""}async saveSessionNotes(t,s){let n=await this.storage.getSession(t);n&&(n.notes=(s||"").slice(0,500),n.updatedAt=new Date().toISOString(),await this.storage.saveSession(n))}};var ns=new Set([12017,11995,12013,12021,89607]),as=["S","M","L","XL"],qe={S:.5,M:5,L:50,XL:500},gt={S:["S","M"],M:["S","M","L"],L:["S","M","L"],XL:["S","M","L","XL"]};function is({massGg:e,propModSize:t,higgs:s}){let n=s?2:1,a=e*n,i=t==null?null:(e+qe[t])*n;return{cold:a,hot:i}}function os(e,t){return!e||!t?!1:as.indexOf(t)>as.indexOf(e)}function ls(e,{higgs:t,oversized:s,entangle:n}){let a=[];return t&&a.push("Higgs"),s&&a.push("OP"),n&&a.push("ENT"),a.length?`${e} - ${a.join("/")}`:e}var pt=null;function Da(){return pt||(pt=new Map(Ge.map(e=>[e.name.toLowerCase(),e]))),pt}function rs(e){if(!e)return[];let t=new Map,s=Da();for(let n of e.split(`
2`)){let a=n.trim();if(!a)continue;let i=a.split("	"),o,l;if(i.length===4)o=i[2].trim(),l=1;else{let m=a.match(/^(.+?)\s*[×x]\s*(\d+)$/i);m?(o=m[1].trim(),l=Math.max(1,parseInt(m[2],10))):(o=a,l=1)}let c=o.toLowerCase(),r=s.get(c);r&&(t.has(r.typeId)?t.get(r.typeId).count+=l:t.set(r.typeId,{typeId:r.typeId,name:r.name,massGg:r.massGg,size:r.size,count:l}))}return[...t.values()].sort((n,a)=>a.massGg-n.massGg)}function ds(e){let t=0,s=0;for(let n of e)t+=n.massGg*n.count,s+=(n.massGg+qe[n.size])*n.count;return{cold:t,hot:s}}function cs(e){if(!e||e.length===0)return"";let s=[...e].sort((a,i)=>i.count-a.count||i.massGg-a.massGg)[0],n=e.length>1?" (plus friends)":"";return`${s.name} \xD7 ${s.count}${n}`}function ms(e){if(!e||e.length===0)return[];let t=[...e].sort((i,o)=>o.count-i.count||o.massGg-i.massGg),s=t.reduce((i,o)=>i+o.count,0);if(s<4)return[t[0]];let n=[],a=[...t];for(;n.length<4&&a.length>0;){let i=a[0],o=i.count/s,l=1;o>.25&&(l=2),o>.5&&(l=3),o>.75&&(l=4),l=Math.min(l,4-n.length);for(let c=0;c<l;c++)n.push(i);a.shift()}return n}var Ge=[{typeId:24692,name:"Abaddon",massGg:103.2,size:"L"},{typeId:22448,name:"Absolution",massGg:12.3,size:"M"},{typeId:2836,name:"Adrestia",massGg:11.1,size:"M"},{typeId:32872,name:"Algos",massGg:1.6,size:"S"},{typeId:78366,name:"Alligator",massGg:13.5,size:"M"},{typeId:11134,name:"Amarr Shuttle",massGg:1.6,size:"S"},{typeId:11188,name:"Anathema",massGg:1.147,size:"S"},{typeId:28848,name:"Anshar",massGg:940,size:"XL"},{typeId:642,name:"Apocalypse",massGg:97.1,size:"L"},{typeId:11936,name:"Apocalypse Imperial Issue",massGg:99.3,size:"L"},{typeId:17726,name:"Apocalypse Navy Issue",massGg:97.1,size:"L"},{typeId:37604,name:"Apostle",massGg:1310,size:"XL"},{typeId:29266,name:"Apotheosis",massGg:1.6,size:"S"},{typeId:11969,name:"Arazu",massGg:11.65,size:"M"},{typeId:628,name:"Arbitrator",massGg:11.2,size:"M"},{typeId:23757,name:"Archon",massGg:1260,size:"XL"},{typeId:11202,name:"Ares",massGg:.95,size:"S"},{typeId:28850,name:"Ark",massGg:900,size:"XL"},{typeId:643,name:"Armageddon",massGg:105.2,size:"L"},{typeId:11938,name:"Armageddon Imperial Issue",massGg:97.1,size:"L"},{typeId:32305,name:"Armageddon Navy Issue",massGg:105.2,size:"L"},{typeId:17922,name:"Ashimmu",massGg:11.01,size:"M"},{typeId:22466,name:"Astarte",massGg:12.3,size:"M"},{typeId:33468,name:"Astero",massGg:.975,size:"S"},{typeId:608,name:"Atron",massGg:1.05,size:"S"},{typeId:625,name:"Augoror",massGg:12.87,size:"M"},{typeId:29337,name:"Augoror Navy Issue",massGg:10.65,size:"M"},{typeId:81040,name:"Avalanche",massGg:960,size:"XL"},{typeId:88001,name:"Babaroga",massGg:143,size:"L"},{typeId:648,name:"Badger",massGg:10.65,size:"M"},{typeId:77283,name:"Bane",massGg:1290,size:"XL"},{typeId:582,name:"Bantam",massGg:1.48,size:"S"},{typeId:33820,name:"Barghest",massGg:98.467,size:"L"},{typeId:11985,name:"Basilisk",massGg:13.13,size:"M"},{typeId:630,name:"Bellicose",massGg:11.55,size:"M"},{typeId:74316,name:"Bestla",massGg:11.65,size:"M"},{typeId:1944,name:"Bestower",massGg:13.5,size:"M"},{typeId:17920,name:"Bhaalgorn",massGg:97.1,size:"L"},{typeId:37480,name:"Bifrost",massGg:1.235,size:"S"},{typeId:632,name:"Blackbird",massGg:13.19,size:"M"},{typeId:64034,name:"Boobook",massGg:1.6,size:"S"},{typeId:34328,name:"Bowhead",massGg:400,size:"XL"}
2,{typeId:598,name:"Breacher",massGg:1.087,size:"S"},{typeId:12013,name:"Broadsword",massGg:15,size:"M"},{typeId:16229,name:"Brutix",massGg:11.8,size:"M"},{typeId:33151,name:"Brutix Navy Issue",massGg:11.8,size:"M"},{typeId:599,name:"Burst",massGg:1.42,size:"S"},{typeId:12731,name:"Bustard",massGg:20,size:"M"},{typeId:11192,name:"Buzzard",massGg:1.27,size:"S"},{typeId:42246,name:"Caedes",massGg:1.2,size:"S"},{typeId:45647,name:"Caiman",massGg:1270,size:"XL"},{typeId:17619,name:"Caldari Navy Hookbill",massGg:1.081,size:"S"},{typeId:672,name:"Caldari Shuttle",massGg:1.6,size:"S"},{typeId:32788,name:"Cambion",massGg:.997,size:"S"},{typeId:621,name:"Caracal",massGg:11.91,size:"M"},{typeId:17634,name:"Caracal Navy Issue",massGg:9.6,size:"M"},{typeId:16240,name:"Catalyst",massGg:1.55,size:"S"},{typeId:73796,name:"Catalyst Navy Issue",massGg:1.55,size:"S"},{typeId:633,name:"Celestis",massGg:12.07,size:"M"},{typeId:85086,name:"Cenotaph",massGg:13,size:"M"},{typeId:11993,name:"Cerberus",massGg:12.72,size:"M"},{typeId:33675,name:"Chameleon",massGg:12,size:"M"},{typeId:20185,name:"Charon",massGg:960,size:"XL"},{typeId:11182,name:"Cheetah",massGg:1.43,size:"S"},{typeId:42243,name:"Chemosh",massGg:1290,size:"XL"},{typeId:23915,name:"Chimera",massGg:1240,size:"XL"},{typeId:33397,name:"Chremoas",massGg:.93,size:"S"},{typeId:11196,name:"Claw",massGg:1.1,size:"S"},{typeId:22468,name:"Claymore",massGg:12.5,size:"M"},{typeId:85229,name:"Cobra",massGg:12.5,size:"M"},{typeId:16236,name:"Coercer",massGg:1.65,size:"S"},{typeId:73789,name:"Coercer Navy Issue",massGg:1.65,size:"S"},{typeId:583,name:"Condor",massGg:1.1,size:"S"},{typeId:34317,name:"Confessor",massGg:1.8,size:"S"},{typeId:32876,name:"Corax",massGg:1.75,size:"S"},{typeId:16238,name:"Cormorant",massGg:1.7,size:"S"},{typeId:73795,name:"Cormorant Navy Issue",massGg:1.7,size:"S"},{typeId:34496,name:"Council Diplomatic Shuttle",massGg:1.6,size:"S"},{typeId:17476,name:"Covetor",massGg:15,size:"M"},{typeId:12729,name:"Crane",massGg:11,size:"M"},{typeId:11176,name:"Crow",massGg:1.065,size:"S"},{typeId:2161,name:"Crucifier",massGg:1.064,size:"S"},{typeId:37453,name:"Crucifier Navy Issue",massGg:1.064,size:"S"},{typeId:17926,name:"Cruor",massGg:1.003,size:"S"},{typeId:11184,name:"Crusader",massGg:1.05,size:"S"},{typeId:20125,name:"Curse",massGg:11.81,size:"M"},{typeId:77726,name:"Cybele",massGg:11.1,size:"M"},{typeId:16231,name:"Cyclone",massGg:12.4,size:"M"},{typeId:72811,name:"Cyclone Fleet Issue",massGg:12.4,size:"M"},{typeId:17720,name:"Cynabal",massGg:9.047,size:"M"},{typeId:42242,name:"Dagon",massGg:1310,size:"XL"},{typeId:47269,name:"Damavik",massGg:.95,size:"S"},{typeId:22474,name:"Damnation",massGg:13.5,size:"M"},{typeId:17928,name:"Daredevil",massGg:.823,size:"S"},{typeId:37457,name:"Deacon",massGg:1.63,size:"S"},{typeId:12023,name:"Deimos",massGg:11.46,size:"M"},{typeId:81046,name:"Deluge",massGg:10.8,size:"M"},{typeId:12017,name:"Devoter",massGg:16.2,size:"M"},{typeId:645,name:"Dominix",massGg:100.25,size:"L"},{typeId:32307,name:"Dominix Navy Issue",massGg:97.1,size:"L"},{typeId:32874,name:"Dragoon",massGg:1.7,size:"S"},{typeId:24698,name:"Drake",massGg:13.5,size:"M"},{typeId:33153,name:"Drake Navy Issue",massGg:13.5,size:"M"},{typeId:17932,name:"Dramiel",massGg:.95,size:"S"},{typeId:52254,name:"Draugur",massGg:1.45,size:"S"},{typeId:49711,name:"Drekavac",massGg:10.7,size:"M"},{typeId:12011,name:"Eagle",massGg:11.72,size:"M"},{typeId:3532,name:"Echelon",massGg:1.124,size:"S"},{typeId:617,name:"Echo",massGg:1.157,size:"S"},{typeId:37135,name:"Endurance",massGg:1.6,size:"S"},{typeId:44995,name:"Enforcer",massGg:12.5,size:"M"},{typeId:12044,name:"Enyo",massGg:1.0539,size:"S"},{typeId:22442,name:"Eos",massGg:12.5,size:"M"},{typeId:655,name:"Epithal",massGg:12.8,size:"M"},{typeId:22460,name:"Eris",massGg:1,size:"S"},{typeId:32790,name:"Etana",massGg:13.13,size:"M"},{typeId:589,name:"Executioner",massGg:1.09,size:"S"},{typeId:634,name:"Exequror",massGg:11.02,size:"M"},{typeId:29344,name:"Exequror Navy Issue",massGg:11.28,size:"M"},{typeId:11957,name:"Falcon",massGg:12.23,size:"M"},{typeId:17841,name:"Federation Navy Comet",massGg:.97,size:"S"},{typeId:20189,name:"Fenrir",massGg:820,size:"XL"},{typeId:16227,name:"Ferox",massGg:14.25,size:"M"},{typeId:72812,name:"Ferox Navy Issue",massGg:14.25,size:"M"},{typeId:35781,name:"Fiend",massGg:9,size:"M"}
2,{typeId:22464,name:"Flycatcher",massGg:1.35,size:"S"},{typeId:32207,name:"Freki",massGg:1.309,size:"S"},{typeId:11129,name:"Gallente Shuttle",massGg:1.6,size:"S"},{typeId:33816,name:"Garmur",massGg:.987,size:"S"},{typeId:74141,name:"Geri",massGg:1.309,size:"S"},{typeId:17715,name:"Gila",massGg:9.6,size:"M"},{typeId:3756,name:"Gnosis",massGg:10,size:"M"},{typeId:11940,name:"Gold Magnate",massGg:1.5,size:"S"},{typeId:28710,name:"Golem",massGg:157,size:"L"},{typeId:21097,name:"Goru's Shuttle",massGg:1.6,size:"S"},{typeId:584,name:"Griffin",massGg:1.056,size:"S"},{typeId:37455,name:"Griffin Navy Issue",massGg:1.056,size:"S"},{typeId:11987,name:"Guardian",massGg:11.98,size:"M"},{typeId:11011,name:"Guardian-Vexor",massGg:10.91,size:"M"},{typeId:21628,name:"Guristas Shuttle",massGg:1.6,size:"S"},{typeId:24696,name:"Harbinger",massGg:15.5,size:"M"},{typeId:33155,name:"Harbinger Navy Issue",massGg:15.5,size:"M"},{typeId:11381,name:"Harpy",massGg:1.0395,size:"S"},{typeId:11379,name:"Hawk",massGg:1.0953,size:"S"},{typeId:35683,name:"Hecate",massGg:1.05,size:"S"},{typeId:11172,name:"Helios",massGg:1.271,size:"S"},{typeId:33079,name:"Hematos",massGg:1.148,size:"S"},{typeId:22452,name:"Heretic",massGg:1.3,size:"S"},{typeId:605,name:"Heron",massGg:1.15,size:"S"},{typeId:72904,name:"Heron Navy Issue",massGg:1.15,size:"S"},{typeId:651,name:"Hoarder",massGg:10.625,size:"M"},{typeId:12034,name:"Hound",massGg:1.455,size:"S"},{typeId:77281,name:"Hubris",massGg:1250,size:"XL"},{typeId:11961,name:"Huginn",massGg:11.55,size:"M"},{typeId:22544,name:"Hulk",massGg:15,size:"M"},{typeId:24702,name:"Hurricane",massGg:12.8,size:"M"},{typeId:33157,name:"Hurricane Fleet Issue",massGg:12.8,size:"M"},{typeId:48636,name:"Hydra",massGg:.95,size:"S"},{typeId:11387,name:"Hyena",massGg:1.1913,size:"S"},{typeId:24690,name:"Hyperion",massGg:100.2,size:"L"},{typeId:601,name:"Ibis",massGg:1.163,size:"S"},{typeId:52252,name:"Ikitursa",massGg:11.9,size:"M"},{typeId:607,name:"Imicus",massGg:.997,size:"S"},{typeId:72913,name:"Imicus Navy Issue",massGg:.997,size:"S"},{typeId:615,name:"Immolator",massGg:1.148,size:"S"},{typeId:35779,name:"Imp",massGg:.9,size:"S"},{typeId:596,name:"Impairor",massGg:1.148,size:"S"},{typeId:12753,name:"Impel",massGg:19.5,size:"M"},{typeId:17703,name:"Imperial Navy Slicer",massGg:1.003,size:"S"},{typeId:594,name:"Incursus",massGg:1.028,size:"S"},{typeId:590,name:"Inquisitor",massGg:1.63,size:"S"},{typeId:30842,name:"InterBus Shuttle",massGg:1.6,size:"S"},{typeId:12042,name:"Ishkur",massGg:1.0944,size:"S"},{typeId:12005,name:"Ishtar",massGg:10.6,size:"M"},{typeId:657,name:"Iteron Mark V",massGg:13.5,size:"M"},{typeId:34828,name:"Jackdaw",massGg:1.1,size:"S"},{typeId:11400,name:"Jaguar",massGg:1.2294,size:"S"},{typeId:77284,name:"Karura",massGg:1270,size:"XL"},{typeId:11174,name:"Keres",massGg:1.2045,size:"S"},{typeId:602,name:"Kestrel",massGg:1.113,size:"S"},{typeId:78369,name:"Khizriel",massGg:11.52,size:"M"},{typeId:49710,name:"Kikimora",massGg:1.56,size:"S"},{typeId:37458,name:"Kirin",massGg:1.48,size:"S"},{typeId:11194,name:"Kitsune",massGg:1.2287,size:"S"},{typeId:28661,name:"Kronos",massGg:148,size:"L"},{typeId:654,name:"Kryos",massGg:12.625,size:"M"},{typeId:11971,name:"Lachesis",massGg:12.07,size:"M"},{typeId:60764,name:"Laelaps",massGg:10.298,size:"M"},{typeId:29986,name:"Legion",massGg:14.5,size:"M"},{typeId:33513,name:"Leopard",massGg:1.6,size:"S"},{typeId:47271,name:"Leshak",massGg:78,size:"L"},{typeId:37606,name:"Lif",massGg:1260,size:"XL"},{typeId:45645,name:"Loggerhead",massGg:1300,size:"XL"},{typeId:29990,name:"Loki",massGg:13.8,size:"M"},{typeId:17738,name:"Machariel",massGg:94.68,size:"L"},{typeId:22548,name:"Mackinaw",massGg:17.5,size:"M"},{typeId:24694,name:"Maelstrom",massGg:103.6,size:"L"},{typeId:29248,name:"Magnate",massGg:1.072,size:"S"},{typeId:72907,name:"Magnate Navy Issue",massGg:1.072,size:"S"},{typeId:37483,name:"Magus",massGg:1.15,size:"S"},{typeId:11186,name:"Malediction",massGg:1.14,size:"S"},{typeId:3516,name:"Malice",massGg:1.271,size:"S"},{typeId:624,name:"Maller",massGg:13.15,size:"M"},{typeId:78367,name:"Mamba",massGg:1.75,size:"S"},{typeId:652,name:"Mammoth",massGg:11.5,size:"M"},{typeId:12032,name:"Manticore",massGg:1.47,size:"S"},{typeId:44996,name:"Marshal",massGg:150,size:"L"},{typeId:12747,name:"Mastodon",massGg:19.2,size:"M"}
2,{typeId:609,name:"Maulus",massGg:1.063,size:"S"},{typeId:37456,name:"Maulus Navy Issue",massGg:1.063,size:"S"},{typeId:641,name:"Megathron",massGg:98.4,size:"L"},{typeId:13202,name:"Megathron Federate Issue",massGg:105.2,size:"L"},{typeId:17728,name:"Megathron Navy Issue",massGg:98.4,size:"L"},{typeId:78333,name:"Mekubal",massGg:1.44,size:"S"},{typeId:603,name:"Merlin",massGg:.997,size:"S"},{typeId:77114,name:"Metamorphosis",massGg:1,size:"S"},{typeId:656,name:"Miasmos",massGg:12.975,size:"M"},{typeId:32811,name:"Miasmos Amastris Edition",massGg:11.25,size:"M"},{typeId:4363,name:"Miasmos Quafe Ultra Edition",massGg:11.25,size:"M"},{typeId:4388,name:"Miasmos Quafe Ultramarine Edition",massGg:11.25,size:"M"},{typeId:32209,name:"Mimir",massGg:11.65,size:"M"},{typeId:11132,name:"Minmatar Shuttle",massGg:1.6,size:"S"},{typeId:37605,name:"Minokawa",massGg:1300,size:"XL"},{typeId:623,name:"Moa",massGg:12,size:"M"},{typeId:45534,name:"Monitor",massGg:16,size:"M"},{typeId:33395,name:"Moracha",massGg:8.7,size:"M"},{typeId:19724,name:"Moros",massGg:1250,size:"XL"},{typeId:73792,name:"Moros Navy Issue",massGg:1250,size:"XL"},{typeId:12015,name:"Muninn",massGg:11,size:"M"},{typeId:24700,name:"Myrmidon",massGg:12.7,size:"M"},{typeId:72869,name:"Myrmidon Navy Issue",massGg:12.7,size:"M"},{typeId:4306,name:"Naga",massGg:15,size:"M"},{typeId:19722,name:"Naglfar",massGg:1260,size:"XL"},{typeId:73787,name:"Naglfar Fleet Issue",massGg:1260,size:"XL"},{typeId:592,name:"Navitas",massGg:1.45,size:"S"},{typeId:11377,name:"Nemesis",massGg:1.41,size:"S"},{typeId:650,name:"Nereus",massGg:11.25,size:"M"},{typeId:52250,name:"Nergal",massGg:1.043,size:"S"},{typeId:33472,name:"Nestor",massGg:20,size:"L"},{typeId:24483,name:"Nidhoggur",massGg:1230,size:"XL"},{typeId:22470,name:"Nighthawk",massGg:13.2,size:"M"},{typeId:17736,name:"Nightmare",massGg:99.3,size:"L"},{typeId:37607,name:"Ninazu",massGg:1250,size:"XL"},{typeId:2998,name:"Noctis",massGg:14.64,size:"M"},{typeId:28846,name:"Nomad",massGg:820,size:"XL"},{typeId:20187,name:"Obelisk",massGg:940,size:"XL"},{typeId:12745,name:"Occator",massGg:19,size:"M"},{typeId:89607,name:"Odysseus",massGg:15,size:"M"},{typeId:2006,name:"Omen",massGg:13,size:"M"},{typeId:17709,name:"Omen Navy Issue",massGg:10.85,size:"M"},{typeId:11989,name:"Oneiros",massGg:13.16,size:"M"},{typeId:11995,name:"Onyx",massGg:15.4,size:"M"},{typeId:635,name:"Opux Luxury Yacht",massGg:13.075,size:"M"},{typeId:4302,name:"Oracle",massGg:14.76,size:"M"},{typeId:28606,name:"Orca",massGg:150,size:"L"},{typeId:33818,name:"Orthrus",massGg:9.362,size:"M"},{typeId:620,name:"Osprey",massGg:11.1,size:"M"},{typeId:29340,name:"Osprey Navy Issue",massGg:11.78,size:"M"},{typeId:44993,name:"Pacifier",massGg:1.4,size:"S"},{typeId:28659,name:"Paladin",massGg:160,size:"L"},{typeId:22440,name:"Panther",massGg:148.8,size:"L"},{typeId:17718,name:"Phantasm",massGg:9.6,size:"M"},{typeId:12021,name:"Phobos",massGg:14,size:"M"},{typeId:19726,name:"Phoenix",massGg:1270,size:"XL"},{typeId:73793,name:"Phoenix Navy Issue",massGg:1270,size:"XL"},{typeId:11965,name:"Pilgrim",massGg:11.37,size:"M"},{typeId:37481,name:"Pontifex",massGg:1.25,size:"S"},{typeId:42244,name:"Porpoise",massGg:4.5,size:"M"},{typeId:47466,name:"Praxis",massGg:87,size:"L"},{typeId:2863,name:"Primae",massGg:15,size:"M"},{typeId:586,name:"Probe",massGg:1.123,size:"S"},{typeId:72903,name:"Probe Fleet Issue",massGg:1.123,size:"S"},{typeId:17480,name:"Procurer",massGg:20,size:"M"},{typeId:16233,name:"Prophecy",massGg:15.3,size:"M"},{typeId:72872,name:"Prophecy Navy Issue",massGg:15.3,size:"M"},{typeId:12733,name:"Prorator",massGg:10.75,size:"M"},{typeId:33697,name:"Prospect",massGg:1.4,size:"S"},{typeId:29988,name:"Proteus",massGg:13.3,size:"M"},{typeId:20183,name:"Providence",massGg:900,size:"XL"},{typeId:12735,name:"Prowler",massGg:11.2,size:"M"},{typeId:597,name:"Punisher",massGg:1.19,size:"S"},{typeId:12038,name:"Purifier",massGg:1.495,size:"S"},{typeId:85236,name:"Python",massGg:141.7,size:"L"},{typeId:42245,name:"Rabisu",massGg:13,size:"M"},{typeId:60765,name:"Raiju",massGg:.987,size:"S"},{typeId:11963,name:"Rapier",massGg:11.04,size:"M"}
2,{typeId:11178,name:"Raptor",massGg:1.05,size:"S"},{typeId:17918,name:"Rattlesnake",massGg:99.3,size:"L"},{typeId:638,name:"Raven",massGg:99.3,size:"L"},{typeId:17636,name:"Raven Navy Issue",massGg:97.3,size:"L"},{typeId:26840,name:"Raven State Issue",massGg:99.3,size:"L"},{typeId:588,name:"Reaper",massGg:1.157,size:"S"},{typeId:22428,name:"Redeemer",massGg:150.3,size:"L"},{typeId:17812,name:"Republic Fleet Firetail",massGg:1.098,size:"S"},{typeId:11393,name:"Retribution",massGg:1.0539,size:"S"},{typeId:17478,name:"Retriever",massGg:17.5,size:"M"},{typeId:19720,name:"Revelation",massGg:1290,size:"XL"},{typeId:73790,name:"Revelation Navy Issue",massGg:1290,size:"XL"},{typeId:28844,name:"Rhea",massGg:960,size:"XL"},{typeId:587,name:"Rifter",massGg:1.067,size:"S"},{typeId:49712,name:"Rodiva",massGg:10.12,size:"M"},{typeId:24688,name:"Rokh",massGg:105.3,size:"L"},{typeId:11959,name:"Rook",massGg:12.73,size:"M"},{typeId:28352,name:"Rorqual",massGg:800,size:"XL"},{typeId:629,name:"Rupture",massGg:12.2,size:"M"},{typeId:22456,name:"Sabre",massGg:1.285,size:"S"},{typeId:12019,name:"Sacrilege",massGg:11.75,size:"M"},{typeId:87381,name:"Sarathiel",massGg:1130,size:"XL"},{typeId:37460,name:"Scalpel",massGg:1.42,size:"S"},{typeId:11978,name:"Scimitar",massGg:12.09,size:"M"},{typeId:640,name:"Scorpion",massGg:103.6,size:"L"},{typeId:32309,name:"Scorpion Navy Issue",massGg:103.6,size:"L"},{typeId:631,name:"Scythe",massGg:11.11,size:"M"},{typeId:29336,name:"Scythe Fleet Issue",massGg:10.91,size:"M"},{typeId:11190,name:"Sentinel",massGg:1.2232,size:"S"},{typeId:78414,name:"Shapash",massGg:1.054,size:"S"},{typeId:85062,name:"Sidewinder",massGg:1.4,size:"S"},{typeId:19744,name:"Sigil",massGg:11,size:"M"},{typeId:11942,name:"Silver Magnate",massGg:1.5,size:"S"},{typeId:22430,name:"Sin",massGg:141.7,size:"L"},{typeId:22546,name:"Skiff",massGg:20,size:"M"},{typeId:54731,name:"Skybreaker",massGg:.96709,size:"S"},{typeId:585,name:"Slasher",massGg:1.075,size:"S"},{typeId:22444,name:"Sleipnir",massGg:12.8,size:"M"},{typeId:81008,name:"Squall",massGg:12.8,size:"M"},{typeId:622,name:"Stabber",massGg:11.4,size:"M"},{typeId:17713,name:"Stabber Fleet Issue",massGg:10.81,size:"M"},{typeId:11198,name:"Stiletto",massGg:1.01,size:"S"},{typeId:37482,name:"Stork",massGg:1.3,size:"S"},{typeId:54732,name:"Stormbringer",massGg:11.64,size:"M"},{typeId:33470,name:"Stratios",massGg:9.35,size:"M"},{typeId:33553,name:"Stratios Emergency Responder",massGg:9.35,size:"M"},{typeId:17924,name:"Succubus",massGg:.965,size:"S"},{typeId:42685,name:"Sunesis",massGg:1.5,size:"S"},{typeId:34562,name:"Svipul",massGg:1.4,size:"S"},{typeId:33081,name:"Taipan",massGg:1.163,size:"S"},{typeId:4308,name:"Talos",massGg:15.552,size:"M"},{typeId:32878,name:"Talwar",massGg:1.65,size:"S"},{typeId:11200,name:"Taranis",massGg:1.06,size:"S"},{typeId:649,name:"Tayra",massGg:13,size:"M"},{typeId:639,name:"Tempest",massGg:99.5,size:"L"},{typeId:17732,name:"Tempest Fleet Issue",massGg:103.3,size:"L"},{typeId:26842,name:"Tempest Tribal Issue",massGg:103.3,size:"L"},{typeId:29984,name:"Tengu",massGg:14.4,size:"M"},{typeId:37459,name:"Thalia",massGg:1.45,size:"S"},{typeId:23911,name:"Thanatos",massGg:1220,size:"XL"},{typeId:85087,name:"Tholos",massGg:1.7,size:"S"},{typeId:627,name:"Thorax",massGg:11.28,size:"M"},{typeId:16242,name:"Thrasher",massGg:1.6,size:"S"},{typeId:73794,name:"Thrasher Fleet Issue",massGg:1.6,size:"S"},{typeId:54733,name:"Thunderchild",massGg:102.141,size:"L"},{typeId:48635,name:"Tiamat",massGg:9.53,size:"M"},{typeId:591,name:"Tormentor",massGg:1.08,size:"S"},{typeId:4310,name:"Tornado",massGg:15.228,size:"M"},{typeId:81047,name:"Torrent",massGg:19.8,size:"M"},{typeId:593,name:"Tristan",massGg:1.044,size:"S"},{typeId:644,name:"Typhoon",massGg:100.6,size:"L"},{typeId:32311,name:"Typhoon Fleet Issue",massGg:102.6,size:"L"},{typeId:2834,name:"Utu",massGg:1.216,size:"S"},{typeId:11999,name:"Vagabond",massGg:11.59,size:"M"},{typeId:77288,name:"Valravn",massGg:1260,size:"XL"}
2,{typeId:3518,name:"Vangel",massGg:11.89,size:"M"},{typeId:28665,name:"Vargur",massGg:150,size:"L"},{typeId:47270,name:"Vedmak",massGg:9.53,size:"M"},{typeId:42124,name:"Vehement",massGg:1250,size:"XL"},{typeId:606,name:"Velator",massGg:1.148,size:"S"},{typeId:11365,name:"Vengeance",massGg:1.0467,size:"S"},{typeId:32880,name:"Venture",massGg:1.2,size:"S"},{typeId:626,name:"Vexor",massGg:11.1,size:"M"},{typeId:17843,name:"Vexor Navy Issue",massGg:9.7,size:"M"},{typeId:12743,name:"Viator",massGg:10,size:"M"},{typeId:45531,name:"Victor",massGg:11.65,size:"M"},{typeId:34590,name:"Victorieux Luxury Yacht",massGg:1,size:"S"},{typeId:3766,name:"Vigil",massGg:1.08,size:"S"},{typeId:37454,name:"Vigil Fleet Issue",massGg:1.08,size:"S"},{typeId:17722,name:"Vigilant",massGg:9.83,size:"M"},{typeId:17740,name:"Vindicator",massGg:105.2,size:"L"},{typeId:33083,name:"Violator",massGg:1.148,size:"S"},{typeId:45530,name:"Virtuoso",massGg:1.41,size:"S"},{typeId:22446,name:"Vulture",massGg:14,size:"M"},{typeId:33673,name:"Whiptail",massGg:1,size:"S"},{typeId:22436,name:"Widow",massGg:151.1,size:"L"},{typeId:11371,name:"Wolf",massGg:1.1781,size:"S"},{typeId:17930,name:"Worm",massGg:.981,size:"S"},{typeId:653,name:"Wreathe",massGg:10,size:"M"},{typeId:49713,name:"Zarmazd",massGg:10.24,size:"M"},{typeId:12003,name:"Zealot",massGg:12.58,size:"M"},{typeId:52907,name:"Zirnitra",massGg:1100,size:"XL"}];var G=new U,M=new j,w=null,Z=[],pe=[],bs=["C3_1.png","C1_1.png","C1_2.png","C1_3.png","C1_4.png","C1_5.png","C4_1.png","C4_2.png","10.png","11.png","12.png","13.png"],Ce=null,Be=null;function Ka(){if(bs.length===0)return;let e=[...bs].sort(()=>Math.random()-.5);Ce=e[0],Be=e.length>1?e[1]:e[0]}function We(){return{sidePanelBgLeft:Ce,sidePanelBgRight:Be}}function Ze(e){e&&(Ce=e.sidePanelBgLeft||null,Be=e.sidePanelBgRight||null)}var _t={showAxisLabels:!0,hangarSizeFilter:"All",virtualHangarImprovementsNoticeDismissed:!1,virtualHangarCollapsed:!1,showShipImages:!0},x={..._t},ks=!1,Ts=new Set(["All","S","M","L","XL"]),Rs=new Map(Ge.map(e=>[e.name,e])),Ds=new Map(Ge.map(e=>[e.typeId,e])),Ja={hullTypeId:null,hullName:null,hullSize:null,propModSize:null,higgsEnabled:!1,useCustomMass:!1,nameAutoGenerated:!0},f={selectedShip:null,propModSize:null,higgsEnabled:!1,useCustomMass:!1,nameAutoGenerated:!0,suppressNameInput:!1,fleetComposition:null,lastParsedText:null,fleetUseCustomMass:!1,fleetNameAutoGenerated:!0};async function Ya(){for(let[e,t]of Object.entries(_t)){let s=await ct(e);x[e]=s!==void 0?s:t}Ts.has(x.hangarSizeFilter)||(x.hangarSizeFilter=_t.hangarSizeFilter)}var Ms=document.getElementById("results"),Ns="calculator",_s=document.getElementById("page-guide"),xs=document.getElementById("page-maths"),Es=document.getElementById("page-bonus"),$s=document.querySelectorAll(".nav-btn");function Lt(e){Ns=e,$s.forEach(t=>{t.classList.toggle("active",t.dataset.page===e)}),e==="calculator"?(_s.style.display="none",xs.style.display="none",Es.style.display="none",Ms.style.display="block",requestAnimationFrame(()=>{z.svg&&K()})):(Ms.style.display="none",_s.style.display=e==="guide"?"":"none",xs.style.display=e==="maths"?"":"none",Es.style.display=e==="bonus"?"":"none"),window.location.hash=e==="calculator"?"":e}
2$s.forEach(e=>{e.addEventListener("click",()=>Lt(e.dataset.page))});var Os=document.querySelectorAll(".sidebar-btn[data-guide-section]"),xt=document.querySelectorAll(".sidebar-child-btn[data-guide-section]"),Qa=document.querySelectorAll(".guide-section"),en={"usage-overview":"usage-guide","usage-hangar":"usage-guide","usage-sessions":"usage-guide","usage-sending":"usage-guide","usage-results":"usage-guide","rolling-3b":"rolling-guides","stable-simple":"rolling-guides","stable-hicfree":"rolling-guides"},ws={"usage-guide":"usage-overview","rolling-guides":"rolling-3b"};var tn=["usage-results","rolling-3b","stable-hicfree"];function Fs(e){let t=en[e];Os.forEach(n=>{let a=t?n.dataset.guideSection===t:n.dataset.guideSection===e;n.classList.toggle("active",a)}),xt.forEach(n=>{n.classList.toggle("active",n.dataset.guideSection===e)});let s=ws[e]||e;Qa.forEach(n=>{n.style.display=n.id===`guide-${s}`?"":"none"}),ws[e]&&xt.forEach(n=>{n.classList.toggle("active",n.dataset.guideSection===s)}),tn.includes(s)&&on()}Os.forEach(e=>{e.addEventListener("click",()=>Fs(e.dataset.guideSection))});xt.forEach(e=>{e.addEventListener("click",()=>Fs(e.dataset.guideSection))});var Hs=document.querySelectorAll(".sidebar-btn[data-maths-section]"),sn=document.querySelectorAll(".maths-section");function an(e){Hs.forEach(t=>{t.classList.toggle("active",t.dataset.mathsSection===e)}),sn.forEach(t=>{t.style.display=t.id===`maths-${e}`?"":"none"})}Hs.forEach(e=>{e.addEventListener("click",()=>an(e.dataset.mathsSection))});function nn(){let e=window.location.hash.replace("#","");(e==="guide"||e==="maths"||e==="bonus")&&Lt(e)}nn();window.addEventListener("hashchange",()=>{let e=window.location.hash.replace("#",""),t=e==="guide"||e==="maths"||e==="bonus"?e:"calculator";t!==Ns&&Lt(t)});var Ps={"guide-chart-usage":{data:Zt,defaultEvent:0,defaultDraft:!1},"guide-chart-example2":{data:Kt,defaultEvent:0,defaultDraft:!1},"guide-chart-roll-3b":{sources:{first_half:Jt,small:Yt,large:ss},default:"first_half",defaultEvent:0,defaultDraft:!1},"guide-chart-stable-2k":{sources:{setup:es,roll:ts},default:"setup",defaultEvent:0,defaultDraft:!1}};function Vs(e,t){let s=Ps[e];return s?s.sources?s.sources[t]||s.sources[s.default]||null:s.data||s:null}function on(){Object.entries(Ps).forEach(([e,t])=>{let s=document.getElementById(e);if(s&&s.offsetParent!==null){let n=document.querySelector(`.guide-event-btn.active[data-chart="${e}"]`),a=n?.dataset.source||(t.sources?t.default:void 0),i=Vs(e,a);if(!i)return;let o=n?parseInt(n.dataset.event,10):t.defaultEvent!==void 0?t.defaultEvent:i.events.length-1,l=n?n.dataset.draft!=="false":t.defaultDraft!==void 0?t.defaultDraft:!0;Bt(s,i,{eventIndex:o,showDraft:l}),qs(e,o,l,a)}})}document.addEventListener("click",e=>{let t=e.target.closest(".guide-expand-btn");if(t){let d=t.dataset.expandTarget,u=document.getElementById(d);u&&(t.classList.toggle("open"),u.classList.toggle("open"));return}let s=e.target.closest(".guide-event-btn");if(!s)return;let n=s.dataset.chart,a=parseInt(s.dataset.event,10),i=s.dataset.draft!=="false",o=s.dataset.source,l=Vs(n,o),c=document.getElementById(n);if(!l||!c)return;Bt(c,l,{eventIndex:a,showDraft:i}),qs(n,a,i,o);let r=c.getBoundingClientRect();r.top>=0&&r.bottom<=window.innerHeight||c.scrollIntoView({behavior:"smooth",block:"nearest"})});function qs(e,t,s,n){document.querySelectorAll(`.guide-event-btn[data-chart="${e}"]`).forEach(a=>{let i=parseInt(a.dataset.event,10),o=a.dataset.draft!=="false",l=a.dataset.source,c=i===t&&o===s&&(!n||!l||l===n);a.classList.toggle("active",c)})}var Se=document.getElementById("modal-overlay"),H=document.getElementById("modal-content");function ge(e){H.innerHTML=e,Se.style.display="flex"}var ze=null;async function Y(){ze&&(await ze(),ze=null),Se.style.display="none",H.innerHTML="",H.classList.remove("modal-popout","modal-notes","modal-template")}Se.addEventListener("click",e=>{e.target===Se&&Y()});document.addEventListener("keydown",e=>{e.key==="Escape"&&Se.style.display!=="none"&&Y()});document.addEventListener("click",e=>{let t=e.target.closest(".guide-popout-btn");if(!t)return;let s=t.dataset.popoutImg;s&&window.open(s,"_blank","noopener")});function ln(){let e=x.showAxisLabels?"checked":"";ge(`
3    <div class="settings-modal">
4      <h3>Graph Settings</h3>
5      <label class="settings-toggle">
6        <input type="checkbox" id="setting-show-axis-labels" ${e}>
7        Show axis labels
8      </label>
9    </div>
10  `),document.getElementById("setting-show-axis-labels").addEventListener("change",async t=>{x.showAxisLabels=t.target.checked,await ce("showAxisLabels",t.target.checked),K()})}function Q(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function ke(e,t){return`https://images.evetech.net/types/${e}/render?size=${t}`}function Us(e,t,s="sm",n=32){return!e||!x.showShipImages?"":`<img class="ship-thumbn
10ail ship-thumbnail--${s}" src="${ke(e,n)}" alt="${Q(t||"Ship")}" width="${n}" height="${n}" loading="lazy" onerror="this.style.display='none'">`}function js(e){let t=document.getElementById("fleet-results-list");if(!t||!e?.length){t&&(t.innerHTML="");return}t.innerHTML=e.map(s=>`<div class="fleet-result-row">${x.showShipImages?`<img class="ship-thumbnail ship-thumbnail--sm" src="${ke(s.typeId,32)}" alt="${Q(s.name)}" width="32" height="32" loading="lazy" onerror="this.style.display='none'">`:""}<span class="fleet-result-name">${Q(s.name)} \xD7 ${s.count}</span><span class="fleet-result-mass">${s.massGg.toFixed(3)} Gg</span></div>`).join("")}function Xs(e){return e?`<span class="hull-size-badge" data-size="${e}">${e}</span>`:""}function Ws(e){let t=e.type||"ship";if(t!=="ship")return{...Ja,...e,type:t};let s=e.hullTypeId?Ds.get(e.hullTypeId):null;!s&&e.hullName&&(s=Rs.get(e.hullName)||null);let n=!e.isDefault&&!Object.prototype.hasOwnProperty.call(e,"useCustomMass");return{...e,type:t,hullTypeId:e.hullTypeId??s?.typeId??null,hullName:e.hullName??s?.name??null,hullSize:e.hullSize??s?.size??null,propModSize:e.propModSize??null,higgsEnabled:e.higgsEnabled??!1,useCustomMass:e.useCustomMass??n,nameAutoGenerated:e.nameAutoGenerated??!0}}function Zs(e){return e.modes?.mass&&!e.modes?.cold&&(e.modes={cold:{...e.modes.mass},hot:null}),"fleetComposition"in e||(e.fleetComposition=null),"useCustomMass"in e||(e.useCustomMass=!1),"nameAutoGenerated"in e||(e.nameAutoGenerated=!1),e}function Ks(e,t="md"){if(!x.showShipImages||!e?.length)return"";let s=ms(e);if(s.length===0)return"";if(s.length===1){let a=s[0],i=t==="sm"?32:64;return`<img class="ship-thumbnail ship-thumbnail--${t}" src="${ke(a.typeId,i)}" alt="${Q(a.name)}" width="${i}" height="${i}" loading="lazy" onerror="this.style.display='none'">`}for(;s.length<4;)s.push(s[s.length-1]);let n=s.map(a=>`<img class="fleet-thumb__cell" src="${ke(a.typeId,32)}" alt="${Q(a.name)}" loading="lazy" onerror="this.style.display='none'">`).join("");return`<div class="fleet-thumb fleet-thumb--${t} fleet-thumb--grid2x2">${n}</div>`}function rn(e){return(e.type||"ship")!=="ship"||e.isDefault?!1:!Object.prototype.hasOwnProperty.call(e,"useCustomMass")||!Object.prototype.hasOwnProperty.call(e,"hullTypeId")||!Object.prototype.hasOwnProperty.call(e,"hullName")||!Object.prototype.hasOwnProperty.call(e,"hullSize")||!Object.prototype.hasOwnProperty.call(e,"propModSize")||!Object.prototype.hasOwnProperty.call(e,"higgsEnabled")||!Object.prototype.hasOwnProperty.call(e,"nameAutoGenerated")}function Te(e){if(e===""||e===null||e===void 0)return"";let t=Number(e);return Number.isFinite(t)?Number(t.toPrecision(6)):e}function be(e){let t=document.getElementById("template-name");f.suppressNameInput=!0,t.value=e,f.suppressNameInput=!1}function dn(){let e=document.getElementById("ship-picker-list");e&&(e.innerHTML=Ge.map(t=>`<option value="${Q(t.name)}"></option>`).join(""))}function bt(e,t){document.getElementById(`mode-${e}-min`).readOnly=t,document.getElementById(`mode-${e}-max`).readOnly=t}function Gs(e,t){let s=document.getElementById(`mode-${e}-min`)?.closest(".mode-row");s&&(s.style.display=t?"":"none")}function Ls(e,t){for(let s of["min","max"]){let n=document.getElementById(`mode-${e}-${s}`);!n||n.value===""||(n.value=Te(Number(n.value)*t))}}function Mt(e,t){document.getElementById(`mode-${e}-min`).value=t==null?"":Te(t),document.getElementById(`mode-${e}-max`).value=t==null?"":Te(t)}function cn(){if(!f.propModSize)return;let e=Ae("cold");if(!e)return;let t=qe[f.propModSize];document.getElementById("mode-hot-min").value=Te(e.min+t),document.getElementById("mode-hot-max").value=Te(e.max+t)}function zt(){let e=f.selectedShip;!e||!f.nameAutoGenerated||be(ls(e.name,{higgs:f.higgsEnabled,oversized:os(e.size,f.propModSize),entangle:Ae("entangle")!==null}))}function he({recomputeMass:e=!0}={}){let t=f.selectedShip,s=!!t,n=f.useCustomMass,a=document.getElementById("ship-picker-section"),i=document.getElementById("ship-picker-preview"),o=document.getElementById("ship-picker-thumbnail"),l=document.getElementById("ship-picker-hull-badge"),c=document.getElementById("higgs-toggle"),r=document.getElementById("custom-mass-checkbox");
10if(a&&(a.style.display=document.getElementById("template-type").value==="ship"?"":"none"),s?(i.style.display="flex",o.src=ke(t.typeId,64),o.alt=t.name,o.style.display="",l.textContent=t.size,l.dataset.size=t.size,l.style.display="inline-flex"):(i.style.display="none",o.removeAttribute("src"),l.style.display="none"),s){let d=gt[t.size]||[];f.propModSize&&!d.includes(f.propModSize)&&(f.propModSize=null)}document.querySelectorAll(".prop-mod-btn").forEach(d=>{let u=d.dataset.propSize||null,p=s&&u&&!(gt[t.size]||[]).includes(u);d.disabled=!!p,d.classList.toggle("active",u===f.propModSize)}),c.classList.toggle("active",f.higgsEnabled),c.setAttribute("aria-pressed",String(f.higgsEnabled)),r.checked=n;let m=!s||ns.has(t.typeId);if(Gs("entangle",m),m||Mt("entangle",null),Gs("hot",!s||!!f.propModSize),s&&!n&&e){let d=is({massGg:t.massGg,propModSize:f.propModSize,higgs:f.higgsEnabled});Mt("cold",d.cold),Mt("hot",d.hot)}bt("cold",s&&!n),bt("hot",s&&!n),bt("entangle",!1),zt()}async function mn(e){let t=await w.getSessionNotes(e);ge(`
11    <button class="modal-close-btn" id="notes-close-btn">\u2715</button>
12    <h3 class="modal-notes-title">Session Notes</h3>
13    <textarea id="session-notes-input" class="session-notes-textarea"
14      maxlength="500" placeholder="Add session notes\u2026">${Q(t)}</textarea>
15    <span id="session-notes-counter" class="session-notes-counter">${t.length}/500</span>
16  `),H.classList.add("modal-notes");let s=document.getElementById("session-notes-input"),n=document.getElementById("session-notes-counter");s.addEventListener("input",()=>{n.textContent=`${s.value.length}/500`}),document.getElementById("notes-close-btn").addEventListener("click",()=>Y()),s.focus(),ze=async()=>{let a=document.getElementById("session-notes-input")?.value||"";await w.saveSessionNotes(e,a)}}var un={hs:"High",ls:"Low",ns:"Null",thera:"Thera",c1:"C1",c2:"C2",c3:"C3",c4:"C4",c5:"C5",c6:"C6",c13:"C13",drifter:"Drifter",pochven:"Pochven"};function fe(e){return e&&(un[e.toLowerCase()]??e)}function pn(){ge(`
17    <button class="modal-close-btn" id="modal-close">&times;</button>
18    <h2 style="margin-bottom: 12px;">Select Wormhole</h2>
19    <div class="modal-filter-section">
20      <div class="modal-code-row">
21        <input type="text" id="modal-code-filter" class="code-filter" placeholder="Type wormhole code or use the filter selection below" autofocus>
22      </div>
23      <div class="modal-favourites-row">
24        <div id="modal-favourites-bar" class="favourites-bar"></div>
25      </div>
26      <div class="modal-filter-row">
27        <fieldset class="filter-group">
28          <legend>Appears In</legend>
29          <div class="filter-labels-grid">
30            <label><input type="radio" name="modal-src" value="" checked> Any</label>
31            <label><input type="radio" name="modal-src" value="hs"> High</label>
32            <label><input type="radio" name="modal-src" value="c1"> C1</label>
33            <label><input type="radio" name="modal-src" value="ls"> Low</label>
34            <label><input type="radio" name="modal-src" value="c2"> C2</label>
35            <label><input type="radio" name="modal-src" value="ns"> Null</label>
36            <label><input type="radio" name="modal-src" value="c3"> C3</label>
37            <label><input type="radio" name="modal-src" value="thera"> Thera</label>
38            <label><input type="radio" name="modal-src" value="c4"> C4</label>
39            <span class="filter-spacer"></span>
40            <label><input type="radio" name="modal-src" value="c5"> C5</label>
41            <span class="filter-spacer"></span>
42            <label><input type="radio" name="modal-src" value="c6"> C6</label>
43            <span class="filter-spacer"></span>
44          </div>
45        </fieldset>
46        <fieldset class="filter-group">
47          <legend>Destination (K162 end)</legend>
48          <div class="filter-labels-grid">
49            <label><input type="radio" name="modal-dst" value="" checked> Any</label>
50            <label><input type="radio" name="modal-dst" value="C13"> C13</label>
51            <label><input type="radio" name="modal-dst" value="C1"> C1</label>
52            <label><input type="radio" name="modal-dst" value="HS"> High</label>
53            <label><input type="radio" name="modal-dst" value="C2"> C2</label>
54            <label><input type="radio" name="modal-dst" value="LS"> Low</label>
55            <label><input type="radio" name="modal-dst" value="C3"> C3</label>
56            <label><input type="radio" name="modal-dst" value="NS"> Null</label>
57            <label><input type="radio" name="modal-dst" value="C4"> C4</label>
58            <label><input type="radio" name="modal-dst" value="Thera"> Thera</label>
59            <label><input type="radio" name="modal-dst" value="C5"> C5</label>
60            <label><input type="radio" name="modal-dst" value="Drifter"> Drifter</label>
61            <label><input type="radio" name="modal-dst" value="C6"> C6</label>
62            <label><input type="radio" name="modal-dst" value="Pochven"> Pochven</label>
63            <span class="filter-spacer"></span>
64          </div>
65        </fieldset>
66        <fieldset class="filter-group">
67          <legend>Max Ship Size</legend>
68          <label><input type="radio" name="modal-restriction" value="" checked> Any</label>
69          <label><input type="radio" name="modal-restriction" value="1"> Up to Destroyer (5 Gg)</label>
70          <label><input type="radio" name="modal-restriction" value="2"> Up to Battlecruiser (62 Gg)</label>
71          <label><input type="radio" name="modal-restriction" value="3"> Up to Battleship (375 Gg)</label>
72          <label><input type="radio" name="modal-restriction" value="4"> Up to Freighter (1000 Gg)</label>
73          <label><input type="radio" name="modal-restriction" value="5"> Up to Capital (2000 Gg)</label>
74        </fieldset>
75      </div>
76    </div>
77    <div id="modal-wormhole-list" class="wormhole-list"></div>
78  `);let t=document.getElementById("modal-code-filter"),s=document.getElementById("modal-wormhole-list");function n(){let a=t.value.toUpperCase(),i=document.querySelector('input[name="modal-src"]:checked').value,o=document.querySelector('input[name="modal-dst"]:checked').value,l=document.querySelector('input[name="modal-restriction"]:checked').value,c={};i&&(c.appearsIn=i),o&&(c.destination=o),l&&(c.restriction=parseInt(l));let r;if(!i&&!o&&!l&&!a?r=Object.keys(Me).sort():r=Wt(c),a&&(r=r.filter(m=>m.startsWith(a))),r.length===0){s.innerHTML='<div class="no-results">No matching wormholes found</div>';return}s.innerHTML=r.map(m=>{let d=re(m),u=d.appearsIn&&d.appearsIn.length>0?d.appearsIn.map(g=>fe(g)).join(", "):"Any",p=pe.includes(m);return`<div class="wormhole-item" data-code="${m}">
79        <span class="wh-star ${p?"is-favourite":""}" data-code="${m}" title="${p?"Remove favourite":"Add favourite"}">${p?"\u2605":"\u2606"}</span>
80        <div class="wormhole-header">
81          <span class="wormhole-code">${m}</span>
82          <span class="wormhole-mass">${d.totalMass} Gg</span>
83        </div>
84        <div class="wormhole-details">
85          <span>From: ${u}</span>
86          <span>To: ${fe(d.destination)}</span>
87          <span class="restriction-${d.restriction}">Max: ${d.restrictionInfo.name}</span>
88        </div>
89      </div>`}).join(""),s.querySelectorAll(".wormhole-item").forEach(m=>{m.addEventListener("click",()=>{let d=m.dataset.code;Y(),Js(d)})}),s.querySelectorAll(".wh-star").forEach(m=>{m.addEventListener("click",async d=>{d.stopPropagation();let u=m.dataset.code;if(pe.includes(u))await Pe(u);else if(!await dt(u))return;pe=await we(),Et(),n()})})}t.addEventListener("input",n),H.querySelectorAll('input[name="modal-src"], input[name="modal-dst"], input[name="modal-restriction"]').forEach(a=>a.addEventListener("change",n)),document.getElementById("modal-close").addEventListener("click",Y),n(),Et()}function Et(){let e=document.getElementById("modal-favourites-bar");if(e){if(pe.length===0){e.innerHTML='<span class="favourites-empty">No favourites \u2014 hover a wormhole and click \u2606</span>';return}e.innerHTML=pe.filter(t=>re(t)).map(t=>{let s=re(t);return`<div class="favourite-card" data-code="${t}">
90        <span class="fav-star" data-code="${t}" title="Remove favourite">\u2605</span>
91        <span class="fav-code">${t}</span>
92        <span class="fav-detail">${s.totalMass}Gg \u2192 ${fe(s.destination)}</span>
93      </div>`}).join(""),e.querySelectorAll(".favourite-card").forEach(t=>{t.addEventListener("click",s=>{s.target.classList.contains("fav-star")||(Y(),Js(t.dataset.code))})}),e.querySelectorAll(".fav-star").forEach(t=>{t.addEventListener("click",async s=>{if(s.stopPropagation(),await Pe(t.dataset.code),pe=await we(),Et(),document.getElementById("modal-wormhole-list")){let a=document.getElementById("modal-code-filter");a&&a.dispatchEvent(new Event("input"))}})})}}function Js(e){let t=re(e),s=t.appearsIn&&t.appearsIn.length>0?t.appearsIn.map(a=>fe(a)).join(", "):"Any",n=`
94    <button class="modal-close-btn" id="modal-close">&times;</button>
95    <h2>Current Wormhole State</h2>
96    <div class="state-selection-container">
97      <div class="selected-wormhole-column">
98        <div class="selected-wormhole-display">
99          <div class="wormhole-item selected-item">
100            <div class="wormhole-header">
101              <span class="wormhole-code">${t.code}</span>
102              <span class="wormhole-mass">${t.totalMass} Gg</span>
103            </div>
104            <div class="wormhole-details">
105              <span><strong>From:</strong> ${s}</span>
106              <span><strong>To:</strong> ${fe(t.destination)}</span>
107              <span class="restriction-${t.restriction}"><strong>Max Jump:</strong> ${t.restrictionInfo.name}</span>
108            </div>
109          </div>
110        </div>
111      </div>
112      <div class="state-selection-column">
113        <div class="filter-section radio-filter-box">
114          <label>Select current state:</label>
115          <div class="radio-group">
116            <label>
117              <input type="radio" name="modal-state" value="STABLE_AND_FRESH" checked>
118              <span class="state-option">
119                <span class="state-name">Stable and Fresh</span>
120                <span class="state-desc">You saw the hole spawn and nothing has passed</span>
121              </span>
122            </label>
123            <label>
124              <input type="radio" name="modal-state" value="STABLE">
125              <span class="state-option">
126                <span class="state-name">Stable</span>
127                <span class="state-desc">50-100%</span>
128              </span>
129            </label>
130            <label>
131              <input type="radio" name="modal-state" value="DESTABILIZED">
132              <span class="state-option">
133                <span class="state-name">Destabilized</span>
134                <span class="state-desc">10-50%</span>
135              </span>
136            </label>
137            <label>
138              <input type="radio" name="modal-state" value="CRITICAL">
139              <span class="state-option">
140                <span class="state-name">Critical</span>
141                <span class="state-desc">0.1-10%</span>
142              </span>
143            </label>
144          </div>
145          <button id="modal-set-state-btn" class="btn-primary">Set State</button>
146        </div>
147      </div>
148    </div>
149  `;ge(n),document.getElementById("modal-close").addEventListener("click",Y),document.getElementById("modal-set-state-btn").addEventListener("click",async()=>{let a=document.querySelector('input[name="modal-state"]:checked'),i=a?a.value:"STABLE_AND_FRESH";try{G=new U,M=new j,G.selectWormhole(e),G.setInitialState(i),Ka(),w&&(await w.newSession(G,M,We()),ie()),Y(),K()}catch(o){console.error("Error starting session:",o)}})}var gn={STABLE:"calc-pass-stable",DESTABILIZED:"calc-pass-destab",CRITICAL:"calc-pass-crit",GONE:"calc-pass-gone"};for(let[e,t]of Object.entries(gn))document.getElementById(t).addEventListener("click",async()=>{if(document.getElementById(t).disabled)return;let n=M.calculatePass(G,e);if(!n.success){console.warn("Calculate pass failed:",n.error);return}K(),w&&(await w.onSessionChanged(G,M),ie())});document.getElementById("clear-draft-btn").addEventListener("click",()=>{M.clearDraft(),J(),Ct()});document.getElementById("add-ship-btn").addEventListener("click",()=>{At(null,"ship")});document.getElementById("add-fleet-btn").addEventListener("click",()=>{At(null,"fleet")});document.getElementById("restore-defaults-btn").addEventListener("click",async()=>{try{let e=$e();await He(e),await Ke(),$()}catch(e){console.error("Error restoring defaults:",e)}});document.getElementById("ship-images-toggle").addEventListener("click",async()=>{x.showShipImages=!x.showShipImages,await ce("showShipImages",x.showShipImages),$(),J()});document.getElementById("dismiss-hangar-migration-notice").addEventListener("click",async()=>{x.virtualHangarImprovementsNoticeDismissed=!0,await ce("virtualHangarImprovementsNoticeDismissed",!0),$()});document.getElementById("save-template-btn").addEventListener("click",async()=>{await yn()});document.getElementById("cancel-template-btn").addEventListener("click",()=>{Qs()});document.getElementById("fleet-dscan-input").addEventListener("input",()=>{let e=document.getElementById("fleet-dscan-input").value,t=e!==f.lastParsedText;document.getElementById("fleet-parse-btn").disabled=!t||!e.trim()});document.getElementById("fleet-parse-btn").addEventListener("click",()=>{let e=document.getElementById("fleet-dscan-input").value,t=rs(e);f.fleetComposition=t,f.lastParsedText=e,document.getElementById("fleet-parse-btn").disabled=!0;let s=document.getElementById("fleet-results-panel");
149if(!t.length){s.style.display="none";return}let{cold:n,hot:a}=ds(t);if(document.getElementById("fleet-cold-input").value=n.toFixed(3),document.getElementById("fleet-hot-input").value=a.toFixed(3),js(t),s.style.display="block",f.fleetNameAutoGenerated){let i=cs(t);be(i),f.fleetNameAutoGenerated=!0}});document.getElementById("fleet-custom-mass-checkbox").addEventListener("change",e=>{let t=e.target.checked;document.getElementById("fleet-cold-input").readOnly=!t,document.getElementById("fleet-hot-input").readOnly=!t});dn();document.getElementById("template-name").addEventListener("input",()=>{f.suppressNameInput||(f.nameAutoGenerated=!1,f.fleetNameAutoGenerated=!1)});document.getElementById("ship-picker-input").addEventListener("input",e=>{let t=e.target.value.trim();if(!t){f.selectedShip=null,f.nameAutoGenerated=!0,be(""),he({recomputeMass:!1});return}let s=Rs.get(t);s&&(f.selectedShip=s,f.nameAutoGenerated&&be(s.name),he())});document.querySelectorAll(".prop-mod-btn").forEach(e=>{e.addEventListener("click",()=>{e.disabled||(f.propModSize=e.dataset.propSize||null,!f.selectedShip&&!f.useCustomMass&&cn(),he())})});document.getElementById("higgs-toggle").addEventListener("click",()=>{let e=!f.higgsEnabled;if(!f.selectedShip&&!f.useCustomMass){let t=e?2:.5;Ls("cold",t),Ls("hot",t)}f.higgsEnabled=e,he({recomputeMass:!!f.selectedShip})});document.getElementById("custom-mass-checkbox").addEventListener("change",e=>{f.useCustomMass=e.target.checked,he({recomputeMass:!f.useCustomMass})});for(let e of["entangle","cold","hot"])for(let t of["min","max"])document.getElementById(`mode-${e}-${t}`).addEventListener("input",()=>{e==="entangle"&&zt()});document.querySelectorAll(".hangar-filter-btn[data-size]").forEach(e=>{e.addEventListener("click",async()=>{let t=e.dataset.size;Ts.has(t)&&(x.hangarSizeFilter=t,await ce("hangarSizeFilter",t),$())})});document.getElementById("hangar-visibility-toggle").addEventListener("click",async()=>{x.virtualHangarCollapsed=!x.virtualHangarCollapsed,await ce("virtualHangarCollapsed",x.virtualHangarCollapsed),$()});var ne=document.getElementById("ship-template-form"),zs=ne.parentNode,hn=ne.nextSibling;function Ys(){ne.style.display="none",ne.parentNode!==zs&&zs.insertBefore(ne,hn)}function fn(){H.innerHTML="",H.classList.add("modal-template"),H.appendChild(ne),Se.style.display="flex",ze=async()=>{Ys()}}function At(e=null,t="ship"){let s=ne,n=document.getElementById("template-form-title"),a=document.getElementById("template-edit-id"),i=document.getElementById("template-type"),o=document.getElementById("ship-mode-section"),l=document.getElementById("fleet-mode-section"),c=document.getElementById("ship-picker-input"),r=e?e.type||"ship":t;i.value=r,r==="fleet"?(o.style.display="none",l.style.display="block"):(o.style.display="block",l.style.display="none");let m=document.getElementById("template-name");m.placeholder=r==="fleet"?"Fleet name (e.g., 'Heavy Shield Fleet')":"Ship name (e.g., 'My Megathron')";let d=e?Ws(e):null;d&&r==="fleet"&&Zs(d);let u=d?.hullTypeId?Ds.get(d.hullTypeId):null;if(f={selectedShip:r==="ship"&&u||null,propModSize:r==="ship"?d?.propModSize??null:null,higgsEnabled:r==="ship"?d?.higgsEnabled??!1:!1,useCustomMass:r==="ship"?d?.useCustomMass??!1:!1,nameAutoGenerated:r==="ship"?d?.nameAutoGenerated??!0:!1,suppressNameInput:!1,fleetComposition:r==="fleet"?d?.fleetComposition??null:null,lastParsedText:null,fleetUseCustomMass:r==="fleet"?d?.useCustomMass??!1:!1,fleetNameAutoGenerated:r==="fleet"?d?.nameAutoGenerated??!0:!1},c.value=f.selectedShip?.name||"",d)if(n.textContent=r==="fleet"?"Edit Fleet Template":"Edit Ship Template",a.value=d.id,be(d.userVisibleName),document.getElementById("template-desc").value=d.description||"",r==="fleet"){let p=d.fleetComposition,g=document.getElementById("fleet-dscan-input");p?.length?g.value=p.map(E=>`${E.name} \xD7 ${E.count}`).join(`
150`):g.value="",f.lastParsedText=g.value,document.getElementById("fleet-parse-btn").disabled=!0;let h=!!d.modes.cold,y=document.getElementById("fleet-results-panel");y.style.display=h?"block":"none",h&&(js(p),document.getElementById("fleet-cold-input").value=d.modes.cold?d.modes.cold.min:"",document.getElementById("fleet-hot-input").value=d.modes.hot?d.modes.hot.min:"");let I=d.useCustomMass??!1;document.getElementById("fleet-custom-mass-checkbox").checked=I,document.getElementById("fleet-cold-input").readOnly=!I,document.getElementById("fleet-hot-input").readOnly=!I}else ve("entangle",d.modes.entangle),ve("cold",d.modes.cold),ve("hot",d.modes.hot);else n.textContent=r==="fleet"?"Add Fleet Template":"Add Ship Template",a.value="",be(""),document.getElementById("template-desc").value="",r==="fleet"?(document.getElementById("fleet-dscan-input").value="",document.getElementById("fleet-parse-btn").disabled=!0,document.getElementById("fleet-results-panel").style.display="none",document.getElementById("fleet-cold-input").value="",document.getElementById("fleet-hot-input").value="",document.getElementById("fleet-cold-input").readOnly=!0,document.getElementById("fleet-hot-input").readOnly=!0,document.getElementById("fleet-custom-mass-checkbox").checked=!1,f.lastParsedText=null):(ve("entangle",null),ve("cold",null),ve("hot",null));he({recomputeMass:!1}),s.style.display="block",fn()}function Qs(){ne.parentNode===H?Y():Ys()}function ve(e,t){document.getElementById(`mode-${e}-min`).value=t?t.min:"",document.getElementById(`mode-${e}-max`).value=t?t.max:""}function Ae(e){let t=document.getElementById(`mode-${e}-min`).value,s=document.getElementById(`mode-${e}-max`).value;if(t===""&&s==="")return null;let n=parseFloat(t);if(isNaN(n)||n<0)return null;let a=s===""?n:parseFloat(s);return isNaN(a)||a<0||n>a?null:{min:n,max:a}}async function yn(){zt();let e=document.getElementById("template-name").value.trim();if(!e){console.warn("Ship name is required");return}let t=document.getElementById("template-type").value||"ship",s=document.getElementById("template-edit-id").value,
150n=new Date().toISOString(),a,i;if(t==="fleet"){let l=parseFloat(document.getElementById("fleet-cold-input").value),c=parseFloat(document.getElementById("fleet-hot-input").value);if(isNaN(l)||l<=0){console.warn("Fleet cold mass is required");return}let r={min:l,max:l},m=!isNaN(c)&&c>0?{min:c,max:c}:null;a={cold:r,hot:m},i=document.getElementById("template-desc").value.trim()||void 0}else{he({recomputeMass:!!f.selectedShip&&!f.useCustomMass});let l=Ae("entangle"),c=Ae("cold"),r=Ae("hot");if(!l&&!c&&!r){console.warn("At least one mode must be defined");return}a={entangle:l,cold:c,hot:r},i=document.getElementById("template-desc").value.trim()||void 0}let o={id:s||F(),type:t,userVisibleName:e,description:i,modes:a,isDefault:!1,createdAt:s?void 0:n,updatedAt:n};if(t==="ship"){let l=f.selectedShip;Object.assign(o,{hullTypeId:l?.typeId??null,hullName:l?.name??null,hullSize:l?.size??null,propModSize:f.propModSize,higgsEnabled:f.higgsEnabled,useCustomMass:f.useCustomMass,nameAutoGenerated:f.nameAutoGenerated})}else t==="fleet"&&Object.assign(o,{fleetComposition:f.fleetComposition,useCustomMass:document.getElementById("fleet-custom-mass-checkbox").checked,nameAutoGenerated:f.fleetNameAutoGenerated});if(s){let l=Z.find(c=>c.id===s);l&&(o.createdAt=l.createdAt)}try{await ot(o),await Ke(),$(),Qs()}catch(l){console.error("Error saving template:",l)}}async function In(e){try{await lt(e),await Ke(),$()}catch(t){console.error("Error deleting template:",t)}}async function Ke(){let e=await Fe();ks=e.some(rn),Z=e.map(t=>{let s=Ws(t);return(s.type||"ship")==="fleet"&&Zs(s),s})}var me=document.getElementById("session-tiles"),vn=document.getElementById("new-session-btn");vn.addEventListener("click",()=>{pn()});async function ie(){if(!w){me.innerHTML='<div class="no-session-placeholder">Loading...</div>';return}let e=await w.getSavedSessions();if(e.length===0){let s=(await Fe()).some(a=>!a.isDefault),n='<div class="no-session-placeholder">No sessions \u2014 click + New Session to begin';s||(n+=`<p class="placeholder-hint">If this is your first time here, have a play, you're a smart cookie, I'm sure you can work it out. Then later maybe check out the <a href="#guide">Guide</a> page</p>`),n+="</div>",me.innerHTML=n;return}me.innerHTML=e.map(t=>{let s=t.id===w.activeSessionId,n=t.tracker?.wormhole?.code||"???",a=t.name||n,i=t.tracker?.events||[],l=`state-${i.length>0?i[i.length-1].state:(t.tracker?.wormhole,"STABLE")}`,c=Sn(t.createdAt),r=i.length;return`<div class="session-tile ${s?"active":""} ${l}" data-session-id="${t.id}">
151      <div class="session-tile-info">
152        <span class="session-tile-name inline-editable" data-session-id="${t.id}" data-fallback="${n}" tabindex="0">${a}</span>
153        <small class="session-tile-passes">(${r} pass${r!==1?"es":""})</small>
154        <span class="session-tile-time">${c}</span>
155      </div>
156      <button class="session-tile-delete" data-delete-id="${t.id}" title="Delete session">\u2715</button>
157      <button class="session-tile-notes" data-notes-id="${t.id}" title="Session notes">\u{1F4CB}</button>
158    </div>`}).join(""),me.querySelectorAll(".session-tile").forEach(t=>{t.addEventListener("click",async s=>{if(s.target.closest(".session-tile-delete")||s.target.closest(".session-tile-notes")||s.target.closest('.session-tile-name[contenteditable="true"]'))return;let n=t.dataset.sessionId;if(n===w.activeSessionId)return;let a=await w.switchSession(n,G,M,We());a&&(G=a.tracker,M=a.shipManager,Ze(a.uiState),K(),ie())})}),me.querySelectorAll(".session-tile-name.inline-editable").forEach(t=>{let s=t.dataset.sessionId,n=t.dataset.fallback;t.addEventListener("click",a=>{if(a.stopPropagation(),t.contentEditable==="true")return;t.contentEditable="true",t.focus();let i=document.createRange();i.selectNodeContents(t);let o=window.getSelection();o.removeAllRanges(),o.addRange(i)}),t.addEventListener("keydown",a=>{a.key==="Enter"?(a.preventDefault(),t.blur()):a.key==="Escape"&&(t.textContent=t.textContent,t.contentEditable="false")}),t.addEventListener("blur",async()=>{t.contentEditable="false";let a=t.textContent.trim(),i=a&&a!==n?a:null;await w.renameSession(s,i),t.textContent=i||n})}),me.querySelectorAll(".session-tile-delete").forEach(t=>{t.addEventListener("click",async s=>{s.stopPropagation();let n=t.dataset.deleteId;if(await w.deleteSession(n)){let i=await w.getSavedSessions();if(i.length>0){let o=i[0],l=await w.switchSession(o.id,G,M,We());l&&(G=l.tracker,M=l.shipManager,Ze(l.uiState),K())}else G=new U,M=new j,wt()}ie()})}),me.querySelectorAll(".session-tile-notes").forEach(t=>{t.addEventListener("click",async s=>{s.stopPropagation();let n=t.dataset.notesId;if(n!==w.activeSessionId){let a=await w.switchSession(n,G,M,We());a&&(G=a.tracker,M=a.shipManager,Ze(a.uiState),K(),ie())}mn(n)})})}function Sn(e){if(!e)return"";let t=new Date(e),n=new Date-t,a=Math.floor(n/6e4);if(a<1)return"just now";if(a<60)return`${a}m ago`;let i=Math.floor(a/60);if(i<24)return`${i}h ago`;let o=t.getFullYear(),l=String(t.getMonth()+1).padStart(2,"0"),c=String(t.getDate()).padStart(2,"0");return`${o}-${l}-${c}`}function wt(){let e=document.getElementById("wormhole-summary");e.innerHTML=`
159    <div class="no-session-placeholder" style="padding: 60px 20px; text-align: center; width: 100%;">
160      <h3 style="color: var(--text-secondary); margin-bottom: 8px;">No Active Session</h3>
161      <p style="color: var(--text-muted);">Click <strong>+ New Session</strong> to select a wormhole and begin tracking.</p>
162    </div>
163  `;let t=document.getElementById("events-list");t&&(t.innerHTML="");let s=document.getElementById("calc-pass-area");
163s&&(s.style.display="none"),$()}function K(){try{let e=G.getDisplayData();if(!e)return;let t=document.getElementById("wormhole-summary"),s=Ce?`background-image: linear-gradient(rgba(11,15,20,0.7), rgba(11,15,20,0.7)), url('images/side-panels/${Ce}');`:"",n=Be?`background-image: linear-gradient(rgba(11,15,20,0.7), rgba(11,15,20,0.7)), url('images/side-panels/${Be}');`:"";t.innerHTML=`
164    <div id="side-panel-left" class="summary-side-panel" style="${s}">
165      <div class="side-panel-header">\u25C0 Left Side</div>
166      <div id="side-list-left"></div>
167    </div>
168    <div class="wormhole-overlay">
169      <div id="geometry-chart"></div>
170    </div>
171    <div id="side-panel-right" class="summary-side-panel" style="${n}">
172      <div class="side-panel-header">Right Side \u25B6</div>
173      <div id="side-list-right"></div>
174    </div>
175  `,J(),$();let a=e.events.length-1;a>=0&&e.events[a]?.failedValidation&&(a=a>0?a-1:null),a===null&&e.events.length===0&&(a=null);let i=a!==null?[a]:null;e.wormhole.geometry&&Ye(e,i),bn(e);let o=document.getElementById("calc-pass-area");G.isCollapsed()||G.validationFailed?o.style.display="none":o.style.display="flex",Ct()}catch(e){console.error("Error in renderResults:",e)}}function bn(e){let t=document.getElementById("events-list");if(!t)return;if(e.events.length===0){t.innerHTML='<div class="event-empty">No events yet</div>';return}let s=e.wormhole.totalMass,n=s*.9,a=s*1.1,i=[Math.round(.5*n),Math.round(.5*a)],o=[Math.round(.9*n),Math.round(.9*a)],l=[Math.round(n),Math.round(a)],c=[...e.events].reverse(),r=e.validationFailed?e.events.length-2:e.events.length-1,m=`
176    <table class="events-table">
177      <thead>
178        <tr class="ev-hdr-group">
179          <th colspan="2" class="hdr-group" title="All calculated events">Event</th>
180          <th colspan="2" class="hdr-group" title="Ship mass entered for this event">Input</th>
181          <th colspan="2" class="hdr-group hdr-passed" title="Cumulative total mass passed through the wormhole">Passed</th>
182          <th colspan="2" class="hdr-group hdr-destab" title="Mass you can still pass before destabilization">Destab</th>
183          <th colspan="2" class="hdr-group hdr-crit" title="Mass you can still pass before critical">Crit</th>
184          <th colspan="2" class="hdr-group hdr-gone" title="Mass you can still pass before collapse">Gone</th>
185          <th colspan="2"></th>
186        </tr>
187        <tr class="ev-hdr-sub">
188          <th class="col-id">#</th>
189          <th class="col-label"></th>
190          <th class="col-num">min</th>
191          <th class="col-num">max</th>
192          <th class="col-num">min</th>
193          <th class="col-num">max</th>
194          <th class="col-num">min</th>
195          <th class="col-num">max</th>
196          <th class="col-num">min</th>
197          <th class="col-num">max</th>
198          <th class="col-num">min</th>
199          <th class="col-num">max</th>
200          <th class="col-state">State</th>
201          <th class="col-del"></th>
202        </tr>
203      </thead>
204      <tbody>`;m+=c.map((d,u)=>{let p=e.events.length-1-u,g=d.failedValidation,h=p===r&&!g,y=p+1,I=p===0,_=p===e.events.length-1&&!I,S="ev-row";h&&(S+=" ev-latest"),g&&(S+=" ev-failed");let C=_?`<button class="event-delete-btn" data-event-idx="${p}" title="Remove this event">\u2715</button>`:"";if(g){let T=parseFloat(d.inputMassRange[0].toFixed(1)),O=parseFloat(d.inputMassRange[1].toFixed(1)),Re=d.shipSnapshot?`<button class="ev-info-btn" data-event-idx="${p}" title="View pass details">\u2139</button>`:"",Qe=d.shipSnapshot&&d.shipSnapshot.filter(ye=>ye.draftMode!==null).map(ye=>`${ye.label} (${ye.draftMode})`).join(`
205`)||d.label;return`
206        <tr class="${S}">
207          <td class="col-id">${y}</td>
208          <td class="col-label"><span class="ev-label-text" title="${Qe}">${d.label}</span>${Re}</td>
209          <td class="col-num">${T}</td>
210          <td class="col-num">${O}</td>
211          <td colspan="8" class="ev-error">This state is impossible for the given information</td>
212          <td class="col-state"><span class="event-state ${d.state}">${d.state}</span></td>
213          <td class="col-del">${C}</td>
214        </tr>`}let P=parseFloat(d.inputMassRange[0].toFixed(1)),D=parseFloat(d.inputMassRange[1].toFixed(1)),b=d.cumulativeReducedMassRange[0].toFixed(1),v=d.cumulativeReducedMassRange[1].toFixed(1),B=(T,O)=>T?Math.round(T[O]).toString():"\u2013",A=(T,O)=>{let Re=`col-num col-rem col-rem-${T}`,Qe=B(O,0),ye=B(O,1),kt=O?` data-rem-type="${T}"`:"";return`<td class="${Re}"${kt}>${Qe}</td><td class="${Re}"${kt}>${ye}</td>`}
214,V=d.shipSnapshot?`<button class="ev-info-btn" data-event-idx="${p}" title="View pass details">\u2139</button>`:"",ee=d.shipSnapshot&&d.shipSnapshot.filter(T=>T.draftMode!==null).map(T=>`${T.label} (${T.draftMode})`).join(`
215`)||d.label;return`
216      <tr class="${S}" data-event-idx="${p}">
217        <td class="col-id">${y}</td>
218        <td class="col-label"><span class="ev-label-text" title="${ee}">${d.label}</span>${V}</td>
219        <td class="col-num">${P}</td>
220        <td class="col-num">${D}</td>
221        <td class="col-num col-passed-val">${b}</td>
222        <td class="col-num col-passed-val">${v}</td>
223        ${A("destab",d.remainingUntilDestabRange)}
224        ${A("crit",d.remainingUntilCritRange)}
225        ${A("gone",d.remainingUntilGoneRange)}
226        <td class="col-state"><span class="event-state ${d.state}">${d.state}</span></td>
227        <td class="col-del">${C}</td>
228      </tr>`}).join(""),m+=`
229    <tr class="ev-row ev-baseline">
230      <td class="col-id">0</td>
231      <td class="col-label">Baseline</td>
232      <td class="col-num">\u2013</td>
233      <td class="col-num">\u2013</td>
234      <td class="col-num">\u2013</td>
235      <td class="col-num">\u2013</td>
236      <td class="col-num col-rem-destab">${i[0]}</td>
237      <td class="col-num col-rem-destab">${i[1]}</td>
238      <td class="col-num col-rem-crit">${o[0]}</td>
239      <td class="col-num col-rem-crit">${o[1]}</td>
240      <td class="col-num col-rem-gone">${l[0]}</td>
241      <td class="col-num col-rem-gone">${l[1]}</td>
242      <td class="col-state"></td>
243      <td class="col-del"></td>
244    </tr>`,m+="</tbody></table>",t.innerHTML=m,t.querySelectorAll(".event-delete-btn").forEach(d=>{d.addEventListener("click",()=>{let u=parseInt(d.dataset.eventIdx);wn(u)})}),t.querySelectorAll(".ev-info-btn").forEach(d=>{d.addEventListener("click",u=>{u.stopPropagation();let p=parseInt(d.dataset.eventIdx);En(e,p)})}),t.querySelectorAll(".ev-row[data-event-idx]").forEach(d=>{d.addEventListener("mouseenter",()=>{let u=parseInt(d.dataset.eventIdx);As(e,u,null)}),d.addEventListener("mouseleave",()=>{Mn(e)})}),t.querySelectorAll(".col-rem[data-rem-type]").forEach(d=>{d.addEventListener("mouseenter",u=>{u.stopPropagation();let p=u.target.closest(".ev-row"),g=parseInt(p.dataset.eventIdx),h=u.target.dataset.remType;As(e,g,h)}),d.addEventListener("mouseleave",()=>{Je()})})}var Gt=null;function As(e,t,s){let n=e.events[t];!n||n.failedValidation||(Gt!==t&&(Gt=t,e.wormhole.geometry&&Ye(e,[t])),Je(),s&&_n(n,s))}function Mn(e){Gt=null,Je();let t=e.validationFailed?e.events.length-2:e.events.length-1;t>=0&&e.wormhole.geometry&&Ye(e,[t])}function _n(e,t){if(Je(),!e||!e.geometry||!e.geometry.remaining_analysis||!z.svg||!z.xScale||!z.yScale||!z.chartArea)return;let s=e.geometry.remaining_analysis,n=`until_${t}`,a=s[n];if(!a||!a.chart_polygon||a.chart_polygon.length<3)return;let{xScale:i,yScale:o,chartArea:l}=z,c=d3.line().x(u=>i(u[0])).y(u=>o(u[1])).curve(d3.curveLinearClosed),r={destab:{fill:"rgba(255, 184, 77, 0.18)",stroke:"rgba(255, 184, 77, 0.7)"},crit:{fill:"rgba(255, 77, 77, 0.18)",stroke:"rgba(255, 77, 77, 0.7)"},gone:{fill:"rgba(107, 125, 138, 0.18)",stroke:"rgba(107, 125, 138, 0.7)"}},m=r[t]||r.gone;l.append("g").attr("class","remaining-overlay").append("path").datum(a.chart_polygon).attr("d",c).style("fill",m.fill).style("stroke",m.stroke).style("stroke-width",1.5).style("stroke-dasharray","4 3")}function Je(){z.svg&&z.svg.selectAll(".remaining-overlay").remove()}function J(){Cs("LEFT","side-list-left"),Cs("RIGHT","side-list-right"),Ct()}async function ue(){w?.activeSessionId&&(await w.onSessionChanged(G,M),ie())}function Cs(e,t){let s=document.getElementById(t);if(!s)return;let n=M.getInstancesBySide(e);if(n.length===0){s.innerHTML='<div class="side-panel-empty">No ships on this side.<br>Add from hangar above.</div>';return}s.innerHTML=n.map((a,i)=>{let o=G.wormhole?.restrictionInfo?.maxJumpMass??null,l=M.getInstanceDisplay(a,o),c=a.draftMode!==null,r=c?" drafted":"",m="";if(l.resolvedMass){let I=l.resolvedMass,E=parseFloat(I.min.toFixed(1)),_=parseFloat(I.max.toFixed(1));m=E===_?`<span class="ship-instance-mass">${E} Gg</span>`:`<span class="ship-instance-mass">${E}\u2013${_} Gg</span>`}let d=l.availableModes.map(I=>`<button class="ship-mode-btn${a.draftMode===I?" active":""}" data-instance-id="${a.id}" data-mode="${I}">${I.toLowerCase()}</button>`).join(""),u="";l.overMassStatus==="all"?u=`<span class="over-mass-label over-mass-solid" title="Max jumpable: ${o} Gg">Over Mass</span>`:l.overMassStatus==="some"&&(u=`<span class="over-mass-label over-mass-maybe" title="Max jumpable: ${o} Gg">Over Mass</span>`);let p=a.type==="fleet"?Ks(a.fleetComposition,"sm"):Us(a.hullTypeId,a.hullName||a.label,"sm",32),g=Xs(a.hullSize),h=i===0?" disabled":"",y=i===n.length-1?" disabled":"";return`
245      <div class="ship-instance${r}"${c?` data-draft-mode="${a.draftMode}"`:""} data-instance-id="${a.id}" data-side="${e}" data-side-index="${i}">
246        ${p}
247        <div class="ship-instance-body">
248        <div class="ship-instance-header">
249          ${g}
250          <span class="ship-instance-name inline-editable" data-instance-id="${a.id}" tabindex="0">${Q(a.label)}</span>
251          ${m}
252          <button class="ship-move-btn" data-instance-id="${a.id}" data-direction="up" title="Move up"${h}>\u25B2</button>
253          <button class="ship-move-btn" data-instance-id="${a.id}" data-direction="down" title="Move down"${y}>\u25BC</button>
254          <button class="ship-instance-remove" data-instance-id="${a.id}" title="Remove">\u2715</button>
255        </div>
256        <div class="ship-mode-buttons">${d}${u}</div>
257        </div>
258      </div>
259    `}).join(""),s.querySelectorAll(".ship-mode-btn").forEach(a=>{a.addEventListener("click",async()=>{let i=a.dataset.instanceId,o=a.dataset.mode,l=M.instances.find(c=>c.id===i);l&&l.draftMode===o?M.setDraftMode(i,null):M.setDraftMode(i,o),J(),await ue()})}),s.querySelectorAll(".ship-instance-remove").forEach(a=>{a.addEventListener("click",async()=>{M.removeInstance(a.dataset.instanceId),J(),await ue()})}),s.querySelectorAll(".ship-move-btn").forEach(a=>{a.addEventListener("click",async()=>{let i=M.instances.find(r=>r.id===a.dataset.instanceId);if(!i)return;let l=M.getInstancesBySide(i.side).findIndex(r=>
259r.id===i.id),c=a.dataset.direction==="up"?-1:1;M.moveInstance(i.id,l+c)&&(J(),await ue())})}),s.querySelectorAll(".ship-instance-name.inline-editable").forEach(a=>{let i=a.dataset.instanceId,o=M.instances.find(l=>l.id===i);o&&(a.addEventListener("click",l=>{if(l.stopPropagation(),a.contentEditable==="true")return;a.contentEditable="true",a.focus();let c=document.createRange();c.selectNodeContents(a);let r=window.getSelection();r.removeAllRanges(),r.addRange(c)}),a.addEventListener("keydown",l=>{l.key==="Enter"?(l.preventDefault(),a.blur()):l.key==="Escape"&&(a.textContent=o.label,a.contentEditable="false")}),a.addEventListener("blur",async()=>{a.contentEditable="false";let l=a.textContent.trim();l&&l!==o.label?(M.renameInstance(i,l),a.textContent=o.label,await ue()):a.textContent=o.label}))})}function Ct(){let e=document.getElementById("draft-summary"),t=document.getElementById("draft-mass-range");if(!e||!t)return;let s=M.computePassMassRange(),n={STABLE:{id:"calc-pass-stable",shortLabel:"Stable",stillLabel:"Hole Still Stable",nowLabel:"Hole Now Stable"},DESTABILIZED:{id:"calc-pass-destab",shortLabel:"Destab",stillLabel:"Hole Still Destab",nowLabel:"Hole Now Destab"},CRITICAL:{id:"calc-pass-crit",shortLabel:"Crit",stillLabel:"Hole Still Crit",nowLabel:"Hole Now Crit"},GONE:{id:"calc-pass-gone",shortLabel:"Gone",stillLabel:"Hole Still Gone",nowLabel:"Hole Now Gone"}};if(s){let i=M.getDraftedInstances().map(d=>d.label).join(", ");e.textContent=`${s.count} ship${s.count>1?"s":""} drafted: ${i}`,e.classList.add("has-draft");let o=parseFloat(s.min.toFixed(1)),l=parseFloat(s.max.toFixed(1));o===l?t.textContent=`${o} Gg`:t.textContent=`${o}\u2013${l} Gg`;let c=G.computeDraftPreview(s.min,s.max),r=c?.stateBreakdown||null,m=c?.currentState||null;xn=r;for(let[d,u]of Object.entries(n)){let p=document.getElementById(u.id);if(p)if(p.disabled=!1,r){let g=r.states[d],h=g.fraction>0,y=d===m?u.stillLabel:u.nowLabel;p.querySelector(".cp-btn-label").textContent=y;let I=(g.fraction*100).toFixed(1),E=(g.fraction*100).toFixed(5);p.querySelector(".cp-btn-pct").textContent=`${I}%`,p.title=`${E}%`,h?p.classList.add("cp-active"):p.classList.remove("cp-active")}else p.querySelector(".cp-btn-label").textContent=u.shortLabel,p.querySelector(".cp-btn-pct").textContent="",p.title="",p.classList.remove("cp-active")}}else{e.textContent="No ships drafted \u2014 select a mode on ships above",e.classList.remove("has-draft"),t.textContent="";for(let[,a]of Object.entries(n)){let i=document.getElementById(a.id);i&&(i.disabled=!0,i.classList.remove("cp-active"),i.title="",i.querySelector(".cp-btn-label").textContent=a.shortLabel,i.querySelector(".cp-btn-pct").textContent="")}}ea()}function ea(){z.svg&&z.svg.selectAll(".draft-overlay").remove();let e=document.getElementById("draft-cumulative-preview");e&&(e.style.display="none",e.textContent=""),Xe&&Xe.abort(),Xe=new AbortController;let t=Xe.signal,s=M.computePassMassRange();if(!s)return;let n=G.computeDraftPreview(s.min,s.max);if(!n)return;let{envelope:a,stateBreakdown:i}=n;if(!z.svg||!z.xScale||!z.yScale||!z.chartArea)return;let{xScale:o,yScale:l,chartArea:c}=z,r=d3.line().x(u=>o(u[0])).y(u=>l(u[1])).curve(d3.curveLinearClosed),m=c.append("g").attr("class","draft-overlay").attr("aria-label","Draft pass preview");m.append("path").datum(a.envelope).attr("class","draft-envelope").attr("d",r).style("fill","rgba(0, 119, 179, 0.18)").style("stroke","rgba(0, 119, 179, 0.6)").style("stroke-width",1.5).style("stroke-dasharray","6 4"),a.shiftedMin&&a.shiftedMin.length>=2&&m.append("path").datum(a.shiftedMin).attr("class","draft-shifted-min").attr("d",r).style("fill","none").style("stroke","rgba(0, 119, 179, 0.3)").style("stroke-width",1).style("stroke-dasharray","2 3"),a.shiftedMax&&a.shiftedMax.length>=2&&m.append("path").datum(a.shiftedMax).attr("class","draft-shifted-max").attr("d",r).style("fill","none").style("stroke","rgba(0, 119, 179, 0.3)").style("stroke-width",1).style("stroke-dasharray","2 3");let d=document.getElementById("draft-cumulative-preview");if(d){let[u,p]=a.cumulativeRange;d.textContent=`Possible cumulative after draft: ${u.toFixed(1)}\u2013${p.toFixed(1)} Gg`,d.style.display="block"}if(i){let u={STABLE:"rgba(77,255,145,0.25)",DESTABILIZED:"rgba(255,184,77,0.25)",CRITICAL:"rgba(255,77,77,0.25)",GONE:"rgba(107,125,138,0.25)"},p={STABLE:"rgba(77,255,145,0.7)",DESTABILIZED:"rgba(255,184,77,0.7)",CRITICAL:"rgba(255,77,77,0.7)",GONE:"rgba(107,125,138,0.7)"};document.querySelectorAll(".calc-pass-state-btn.cp-active").forEach(g=>{let h=g.dataset.state,y=i.states[h];!y||!y.polygon||y.polygon.length<2||(g.addEventListener("mouseenter",()=>
259{c.append("g").attr("class","draft-overlay draft-state-highlight").append("path").datum(y.polygon).attr("d",r).style("fill",u[h]||"rgba(255,255,255,0.15)").style("stroke",p[h]||"rgba(255,255,255,0.5)").style("stroke-width",1.5)},{signal:t}),g.addEventListener("mouseleave",()=>{c&&c.selectAll(".draft-state-highlight").remove()},{signal:t}))})}}function $(){let e=document.getElementById("hangar-list");if(!e)return;let t=document.getElementById("hangar-panel");t&&t.classList.toggle("hangar-panel-collapsed",x.virtualHangarCollapsed);let s=document.getElementById("hangar-visibility-toggle");s&&(s.textContent=x.virtualHangarCollapsed?"Show":"Hide",s.setAttribute("aria-expanded",String(!x.virtualHangarCollapsed)));let n=document.getElementById("ship-images-toggle");n&&(n.classList.toggle("active",x.showShipImages),n.setAttribute("aria-pressed",String(x.showShipImages)));let a=document.getElementById("hangar-migration-notice");a&&(a.style.display=!x.virtualHangarCollapsed&&ks&&!x.virtualHangarImprovementsNoticeDismissed?"flex":"none"),document.querySelectorAll(".hangar-filter-btn[data-size]").forEach(r=>{r.classList.toggle("active",r.dataset.size===x.hangarSizeFilter)});let i=`
260    <div class="hangar-ship hangar-quickmass">
261      <div class="hangar-ship-header">
262        <span class="hangar-ship-name">+ Quick Mass</span>
263        <span class="hangar-ship-badge hangar-badge-quickmass">quick</span>
264      </div>
265      <div class="quickmass-inputs">
266        <input type="number" id="quickmass-min" placeholder="Min" step="0.1" min="0" class="quickmass-input quickmass-num">
267        <span class="mode-dash">\u2013</span>
268        <input type="number" id="quickmass-max" placeholder="Max" step="0.1" min="0" class="quickmass-input quickmass-num">
269      </div>
270      <div class="hangar-ship-actions">
271        <button class="hangar-btn add-left quickmass-add" data-side="LEFT" title="Add to Left side">\u25C0 L</button>
272        <button class="hangar-btn add-right quickmass-add" data-side="RIGHT" title="Add to Right side">R \u25B6</button>
273      </div>
274    </div>
275  `,o={fleet:0,ship:1},c=[...x.hangarSizeFilter==="All"?Z:Z.filter(r=>(r.type||"ship")==="ship"&&r.hullSize===x.hangarSizeFilter)].sort((r,m)=>{let d=o[r.type||"ship"]??1,u=o[m.type||"ship"]??1;return d-u});i+=c.map(r=>{let m=r.type||"ship",d=m==="fleet"?" hangar-fleet":" hangar-type-ship",u="";if(m==="fleet"){let S=[];r.modes.cold&&S.push(Le(r.modes.cold)),r.modes.hot&&S.push(Le(r.modes.hot)),u=S.join("/")}else{let S=[];r.modes.entangle&&S.push(Le(r.modes.entangle)),r.modes.cold&&S.push(Le(r.modes.cold)),r.modes.hot&&S.push(Le(r.modes.hot)),u=S.join("/")}let p=m==="fleet"?'<span class="hangar-ship-badge hangar-badge-fleet">fleet</span>':"",g=r.isDefault?'<span class="hangar-ship-badge hangar-badge-default">\u2605</span>':"",h=p+g,y=m==="fleet"&&r.description?` title="${r.description.replace(/"/g,"&quot;")}"`:"",I=`<button class="hangar-btn edit" data-template-id="${r.id}" title="Edit">\u270E</button>`,E=m==="ship"?Us(r.hullTypeId,r.hullName||r.userVisibleName,"md",64):Ks(r.fleetComposition,"md"),_=m==="ship"?Xs(r.hullSize):"";return`
276      <div class="hangar-ship${d}" data-template-id="${r.id}"${y}>
277        ${E}
278        <div class="hangar-ship-content">
279        <div class="hangar-ship-header">
280          ${_}
281          <span class="hangar-ship-name">${Q(r.userVisibleName)}</span>
282          ${h}
283        </div>
284        <div class="hangar-ship-modes">${u}</div>
285        <div class="hangar-ship-actions">
286          <button class="hangar-btn add-left" data-template-id="${r.id}" title="Add to Left side">\u25C0 L</button>
287          <button class="hangar-btn add-right" data-template-id="${r.id}" title="Add to Right side">R \u25B6</button>
288          ${I}
289          <button class="hangar-btn delete" data-template-id="${r.id}" title="Delete">\u2715</button>
290        </div>
291        </div>
292      </div>
293    `}).join(""),c.length===0&&x.hangarSizeFilter!=="All"&&(i+='<div class="hangar-empty">No saved ships in this size.</div>'),e.innerHTML=i,e.querySelectorAll(".quickmass-add").forEach(r=>{r.addEventListener("click",async()=>{let m=r.dataset.side,d=document.getElementById("quickmass-min"),u=document.getElementById("quickmass-max"),p=parseFloat(d.value);if(isNaN(p)||p<0){console.warn("Quick mass: min is required");return}let g=u.value===""?p:parseFloat(u.value);if(isNaN(g)||g<0||p>
293g){console.warn("Quick mass: invalid range");return}let h={type:"quickmass",userVisibleName:"quick-mass",description:"",modes:{mass:{min:p,max:g}}};w?.activeSessionId&&(M.addInstance(h,m),d.value="",u.value="",J(),await ue())})}),e.querySelectorAll(".hangar-btn.add-left:not(.quickmass-add)").forEach(r=>{r.addEventListener("click",async()=>{if(!w?.activeSessionId)return;let m=Z.find(d=>d.id===r.dataset.templateId);m&&(M.addInstance(m,"LEFT"),J(),await ue())})}),e.querySelectorAll(".hangar-btn.add-right:not(.quickmass-add)").forEach(r=>{r.addEventListener("click",async()=>{if(!w?.activeSessionId)return;let m=Z.find(d=>d.id===r.dataset.templateId);m&&(M.addInstance(m,"RIGHT"),J(),await ue())})}),e.querySelectorAll(".hangar-btn.edit").forEach(r=>{r.addEventListener("click",()=>{let m=Z.find(d=>d.id===r.dataset.templateId);m&&At(m)})}),e.querySelectorAll(".hangar-btn.delete").forEach(r=>{r.addEventListener("click",()=>{In(r.dataset.templateId)})})}function Le(e){if(!e)return"";let t=Bs(e.min),s=Bs(e.max);return e.min===e.max?t:`${t}-${s}`}function Bs(e){let t=Number(e);return Number.isFinite(t)?`${Math.round(t*10)/10}`:`${e}`}var z={svg:null,container:null},xn=null,Xe=null;function Ye(e,t=null){let s=document.getElementById("geometry-chart");if(!s)return;d3.select(s).selectAll("*").remove();let n=s.parentElement?.querySelector(".chart-info-btn");n&&n.remove();let a=s.parentElement?.querySelector(".chart-settings-btn");a&&a.remove();let i=s.closest(".wormhole-overlay");if(i){let v=document.createElement("button");v.className="chart-info-btn",v.title="Chart guide",v.textContent="\u2139",v.addEventListener("click",()=>{ge('<img src="images/graph_info.svg.png" alt="Chart Guide" class="popout-img" />'),H.classList.add("modal-popout")}),i.appendChild(v);let B=document.createElement("button");B.className="chart-settings-btn",B.title="Graph settings",B.textContent="\u2699",B.addEventListener("click",ln),i.appendChild(B)}let o="",l=G.wormhole;if(l){let v=l.appearsIn&&l.appearsIn.length>0?l.appearsIn.map(ee=>fe(ee)).join("/"):"Any",B=l.restrictionInfo?l.restrictionInfo.name.replace("up to ",""):"",A=Math.round(l.totalMass*.9),V=Math.round(l.totalMass*1.1);o=`${l.code} ${v}\u2192${fe(l.destination)} ${B} ${l.totalMass}Gg (${A}\u2013${V})`}let c=e.wormhole.geometry.backdrop;if(!c){console.warn("No backdrop geometry available");return}let{bounds:r,state_lines:m}=c,d={top:34,right:20,bottom:x.showAxisLabels?52:40,left:x.showAxisLabels?72:60},u=s.clientWidth||800,p=s.clientHeight||600,g=u-d.left-d.right,h=p-d.top-d.bottom,y=d3.select(s).append("svg").attr("width",u).attr("height",p).style("background","transparent");y.append("defs").append("pattern").attr("id","wormhole-background").attr("patternUnits","userSpaceOnUse").attr("width",g).attr("height",h).attr("x",0).attr("y",0).append("image").attr("href","images/wormhole.png").attr("width",g).attr("height",h).attr("preserveAspectRatio","xMidYMid slice").attr("opacity",.2),o&&y.append("text").attr("x",u/2).attr("y",18).attr("text-anchor","middle").attr("class","chart-title-text").style("fill","var(--text-secondary)").style("font-size","13px").style("font-weight","600").style("letter-spacing","0.5px").style("font-family","'Roboto Condensed', sans-serif").text(o);let _=y.append("g").attr("transform",`translate(${d.left},${d.top})`);_.append("rect").attr("x",0).attr("y",0).attr("width",g).attr("height",h).style("fill","url(#wormhole-background)");let S=d3.scaleLinear().domain([r.x[0],r.x[1]]).range([0,g]),C=d3.scaleLinear().domain([r.y[0],r.y[1]]).range([h,0]);_.append("g").attr("class","grid grid-x").attr("transform",`translate(0,${h})`).call(d3.axisBottom(S).tickSize(-h).tickFormat("")).selectAll("line").style("stroke","rgba(0, 209, 255, 0.06)").style("stroke-width",1),_.append("g").attr("class","grid grid-y").call(d3.axisLeft(C).tickSize(-g).tickFormat("")).selectAll("line").style("stroke","rgba(0, 209, 255, 0.06)").style("stroke-width",1),_.append("g").attr("class","axis axis-x").attr("transform",`translate(0,${h})`).call(d3.axisBottom(S)).selectAll("text").style("fill","#6B7D8A").style("font-size","10px").style("font-family","Roboto Condensed, sans-serif"),_.append("g").attr("class","axis axis-y").call(
293d3.axisLeft(C)).selectAll("text").style("fill","#6B7D8A").style("font-size","10px").style("font-family","Roboto Condensed, sans-serif"),_.selectAll(".axis path, .axis line").style("stroke","#3F4A52"),x.showAxisLabels&&(y.append("text").attr("class","axis-label axis-label-x").attr("x",d.left+g/2).attr("y",p-4).attr("text-anchor","middle").style("fill","#6B7D8A").style("font-size","11px").style("font-family","'Roboto Condensed', sans-serif").text("mass passed (Gg)"),y.append("text").attr("class","axis-label axis-label-y").attr("transform","rotate(-90)").attr("x",-(d.top+h/2)).attr("y",14).attr("text-anchor","middle").style("fill","#6B7D8A").style("font-size","11px").style("font-family","'Roboto Condensed', sans-serif").text("wormhole size (Gg)"));let P=d3.line().x(v=>S(v[0])).y(v=>C(v[1])),D=d3.line().x(v=>S(v[0])).y(v=>C(v[1])).curve(d3.curveLinearClosed),b={destab:{color:"#FFB84D",label:"Destabilized (50%)"},critical:{color:"#FF4D4D",label:"Critical (90%)"},gone:{color:"#6B7D8A",label:"Gone (100%)"}};Object.entries(m).forEach(([v,B])=>{B&&b[v]&&_.append("path").datum([B.from,B.to]).attr("class",`state-line state-${v}`).attr("d",P).style("fill","none").style("stroke",b[v].color).style("stroke-width",2).style("opacity",.8)}),t&&e.events&&t.forEach((v,B)=>{if(v<0||v>=e.events.length)return;let A=e.events[v];if(!A.geometry)return;let V={STABLE:{possible:{fill:"rgba(77, 255, 145, 0.12)",stroke:"rgba(77, 255, 145, 0.5)"},known:{fill:"rgba(77, 255, 145, 0.3)",stroke:"rgba(77, 255, 145, 0.8)"}},DESTABILIZED:{possible:{fill:"rgba(255, 184, 77, 0.12)",stroke:"rgba(255, 184, 77, 0.5)"},known:{fill:"rgba(255, 184, 77, 0.3)",stroke:"rgba(255, 184, 77, 0.8)"}},CRITICAL:{possible:{fill:"rgba(255, 77, 77, 0.12)",stroke:"rgba(255, 77, 77, 0.5)"},known:{fill:"rgba(255, 77, 77, 0.3)",stroke:"rgba(255, 77, 77, 0.8)"}},GONE:{possible:{fill:"rgba(107, 125, 138, 0.12)",stroke:"rgba(107, 125, 138, 0.5)"},known:{fill:"rgba(107, 125, 138, 0.3)",stroke:"rgba(107, 125, 138, 0.8)"}},default:{possible:{fill:"rgba(0, 209, 255, 0.12)",stroke:"rgba(0, 209, 255, 0.5)"},known:{fill:"rgba(0, 209, 255, 0.3)",stroke:"rgba(0, 209, 255, 0.8)"}}},ee=V[A.state]||V.default;if(A.geometry.cumulative_possible_passed_geometry&&_.append("path").datum(A.geometry.cumulative_possible_passed_geometry).attr("class",`event-uncertainty event-${v}`).attr("d",D).style("fill",ee.possible.fill).style("stroke",ee.possible.stroke).style("stroke-width",1).style("stroke-dasharray","3,3").style("opacity",1),A.geometry.cumulative_certain_passed_geometry&&_.append("path").datum(A.geometry.cumulative_certain_passed_geometry).attr("class",`event-known event-${v}`).attr("d",D).style("fill",ee.known.fill).style("stroke",ee.known.stroke).style("stroke-width",2).style("opacity",1),A.geometry.excluded_mass_bands){let T="rgba(107, 125, 138, 0.15)",O="rgba(107, 125, 138, 0.35)";A.geometry.excluded_mass_bands.low&&_.append("path").datum(A.geometry.excluded_mass_bands.low).attr("class",`event-excluded-low event-${v}`).attr("d",D).style("fill",T).style("stroke",O).style("stroke-width",1).style("opacity",1),A.geometry.excluded_mass_bands.high&&_.append("path").datum(A.geometry.excluded_mass_bands.high).attr("class",`event-excluded-high event-${v}`).attr("d",D).style("fill",T).style("stroke",O).style("stroke-width",1).style("opacity",1)}}),z.svg=y,z.container=s,z.xScale=S,z.yScale=C,z.chartArea=_,ea(),console.log("D3 geometry chart created with backdrop:",c,"events:",t)}window.chartEvent=function(e){let t=G.getDisplayData();t&&e>=0&&e<t.events.length&&t.wormhole.geometry&&Ye(t,[e])};function En(e,t){let s=e.events[t];if(!s)return;let n=t+1,a=s.state||"";if(!s.shipSnapshot){ge(`
294      <div class="event-info-modal">
295        <h3>Event ${n} \u2014 <span class="event-state ${a}">${s.state}</span></h3>
296        <p class="event-info-label">${s.label}</p>
297        <p class="event-info-mass">Mass passed: ${s.inputMassRange[0].toFixed(1)} \u2013 ${s.inputMassRange[1].toFixed(1)} Gg</p>
298      </div>
299    `);return}let i=s.shipSnapshot.filter(l=>l.draftMode!==null),o="";i.length===0?o='<p class="event-info-none">No ship data available</p>':o=i.map(l=>{let c=l.draftMode,r="?";if(l.resolvedMassRange){let{min:d,max:u}=l.resolvedMassRange;r=d===u?`${d} Gg`:`${d}\u2013${u} Gg`}let m=l.side==="LEFT"?"RIGHT":"LEFT";return`
300        <div class="event-info-ship">
301          <div class="event-info-ship-name">${l.label}</div>
302          <div class="event-info-ship-detail">
303            <span class="event-info-mode">${c}</span>
304            <span class="event-info-mass-val">${r}</span>
305            <span class="event-info-side">${l.side} \u2192 ${m}</span>
306          </div>
307        </div>`}).join(""),ge(`
308    <div class="event-info-modal">
309      <h3>Event ${n} \u2014 <span class="event-state ${a}">${s.state}</span></h3>
310      <p class="event-info-mass">Mass passed: ${s.inputMassRange[0].toFixed(1)} \u2013 ${s.inputMassRange[1].toFixed(1)} Gg</p>
311      <div class="event-info-ships">
312        <h4>Ships</h4>
313        ${o}
314      </div>
315    </div>
316  `)}function wn(e){let t=G.events;if(!t.length||e!==t.length-1)return;let s=t[e].state,n=t[e].shipSnapshot;G.removeEvent(e),n&&M.restoreFromSnapshot(n),K(),w&&(w.onSessionChanged(G,M),ie())}function Bt(e,t,s={}){if(!e||!t)return;d3.select(e).selectAll("*").remove();let{backdrop:n,events:a,title:i,draft:o}=t,l=s.eventIndex!==void 0?s.eventIndex:a?a.length-1:-1,c=s.showDraft!==void 0?s.showDraft:!0;if(!n)return;let{bounds:r,state_lines:m}=n,d={top:i?34:20,right:20,bottom:40,left:60},u=e.clientWidth||800,p=e.clientHeight||400,g=u-d.left-d.right,h=p-d.top-d.bottom,y=d3.select(e).append("svg").attr("width",u).attr("height",p).style("background","transparent");i&&y.append("text").attr("x",u/2).attr("y",18).attr("text-anchor","middle").style("fill","var(--text-secondary)").style("font-size","13px").style("font-weight","600").style("letter-spacing","0.5px").style("font-family","'Roboto Condensed', sans-serif").text(i);let I=y.append("g").attr("transform",`translate(${d.left},${d.top})`),E=d3.scaleLinear().domain([r.x[0],r.x[1]]).range([0,g]),_=d3.scaleLinear().domain([r.y[0],r.y[1]]).range([h,0]);I.append("g").attr("transform",`translate(0,${h})`).call(d3.axisBottom(E).tickSize(-h).tickFormat("")).selectAll("line").style("stroke","rgba(0, 209, 255, 0.06)").style("stroke-width",1),I.append("g").call(d3.axisLeft(_).tickSize(-g).tickFormat("")).selectAll("line").style("stroke","rgba(0, 209, 255, 0.06)").style("stroke-width",1),I.append("g").attr("transform",`translate(0,${h})`).call(d3.axisBottom(E)).selectAll("text").style("fill","#6B7D8A").style("font-size","10px"),I.append("g").call(d3.axisLeft(_)).selectAll("text").style("fill","#6B7D8A").style("font-size","10px"),I.selectAll(".axis path, .axis line, .domain, .tick line").style("stroke","#3F4A52");let S=d3.line().x(b=>E(b[0])).y(b=>_(b[1])),C=d3.line().x(b=>E(b[0])).y(b=>_(b[1])).curve(d3.curveLinearClosed),P={destab:"#FFB84D",critical:"#FF4D4D",gone:"#6B7D8A"};m&&Object.entries(m).forEach(([b,v])=>{v&&P[b]&&I.append("path").datum([v.from,v.to]).attr("d",S).style("fill","none").style("stroke",P[b]).style("stroke-width",2).style("opacity",.8)});let D={STABLE:{possible:{fill:"rgba(77, 255, 145, 0.12)",stroke:"rgba(77, 255, 145, 0.5)"},known:{fill:"rgba(77, 255, 145, 0.3)",stroke:"rgba(77, 255, 145, 0.8)"}},DESTABILIZED:{possible:{fill:"rgba(255, 184, 77, 0.12)",stroke:"rgba(255, 184, 77, 0.5)"},known:{fill:"rgba(255, 184, 77, 0.3)",stroke:"rgba(255, 184, 77, 0.8)"}},CRITICAL:{possible:{fill:"rgba(255, 77, 77, 0.12)",stroke:"rgba(255, 77, 77, 0.5)"},known:{fill:"rgba(255, 77, 77, 0.3)",stroke:"rgba(255, 77, 77, 0.8)"}},GONE:{possible:{fill:"rgba(107, 125, 138, 0.12)",stroke:"rgba(107, 125, 138, 0.5)"},known:{fill:"rgba(107, 125, 138, 0.3)",stroke:"rgba(107, 125, 138, 0.8)"}},default:{possible:{fill:"rgba(0, 209, 255, 0.12)",stroke:"rgba(0, 209, 255, 0.5)"},known:{fill:"rgba(0, 209, 255, 0.3)",stroke:"rgba(0, 209, 255, 0.8)"}}};if(a&&a.length>0&&l>=0&&l<a.length){let b=a[l];if(b.geometry){let v=D[b.state]||D.default;if(b.geometry.cumulative_possible_passed_geometry&&I.append("path").datum(b.geometry.cumulative_possible_passed_geometry).attr("d",C).style("fill",v.possible.fill).style("stroke",v.possible.stroke).style("stroke-width",1).style("stroke-dasharray","3,3"),b.geometry.cumulative_certain_passed_geometry&&I.append("path").datum(b.geometry.cumulative_certain_passed_geometry).attr("d",C).style("fill",v.known.fill).style("stroke",v.known.stroke).style("stroke-width",2),b.geometry.excluded_mass_bands){let B="rgba(107, 125, 138, 0.15)",A="rgba(107, 125, 138, 0.35)";["low","high"].forEach(V=>{b.geometry.excluded_mass_bands[V]&&I.append("path").datum(b.geometry.excluded_mass_bands[V]).attr("d",C).style("fill",B).style("stroke",A).style("stroke-width",1)})}}}if(c&&o&&o.envelope&&o.envelope.length>
316=2){let b=I.append("g").attr("class","draft-overlay").attr("aria-label",o.label||"Draft pass preview");b.append("path").datum(o.envelope).attr("d",C).style("fill","rgba(0, 119, 179, 0.18)").style("stroke","rgba(0, 119, 179, 0.6)").style("stroke-width",1.5).style("stroke-dasharray","6 4"),o.shiftedMin&&o.shiftedMin.length>=2&&b.append("path").datum(o.shiftedMin).attr("d",C).style("fill","none").style("stroke","rgba(0, 119, 179, 0.3)").style("stroke-width",1).style("stroke-dasharray","2 3"),o.shiftedMax&&o.shiftedMax.length>=2&&b.append("path").datum(o.shiftedMax).attr("d",C).style("fill","none").style("stroke","rgba(0, 119, 179, 0.3)").style("stroke-width",1).style("stroke-dasharray","2 3")}}window.renderStaticChart=Bt;async function Gn(){try{let{openDB:e}=await Promise.resolve().then(()=>(Ss(),vs));if(nt(e),await it(),await rt()){let s=$e();await He(s)}await Ke(),console.log(`Ship hangar loaded: ${Z.length} templates`),pe=await we(),await Ya(),$(),w=new Ve(mt);let t=await w.getSavedSessions();if(t.length>0){let s=t[0];w.activeSessionId=s.id,G=U.fromJSON(s.tracker),M=j.fromJSON(s.shipState),Ze(s.uiState),K()}else wt();ie()}catch(e){console.error("Failed to initialize ship storage:",e),Z=$e(),$(),wt()}}Gn();

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.