PageSourceSearch

https://satellitemap.space/assets/trains-calculator.C8LKi6E7.js

js satellitemap.space collected 2026-09-24 08:55:15 UTC 22,598 bytes, 147 lines download raw bytes

1import{q as se}from"./main.DEsnOkGr.js";class oe{constructor(t,a,n,r,s=null,i=null){this.blueGlobe=t,this.satelliteData=a,this.oe=n,this.detailedData=r,this.ui=s,this.controller=i,this.contentArea=null}async initialize(t){this.contentArea=t,this.blueGlobe.showTrains(!0);const a=this.blueGlobe.preferences.homeLat,n=this.blueGlobe.preferences.homeLon;if(!a||!n){t.innerHTML=`
2                <div class="alert alert-warning">
3                    <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
4                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
5                    </svg>
6                    <div>
7                        <h3 class="font-bold">Location not set</h3>
8                        <div class="text-xs">Please set your home location in Settings to calculate overflights.</div>
9                    </div>
10                </div>
11            `;return}this._loadAlertSettings(),this._buildUI(),this._setupFilterHandler(),this._setupAlertsHandlers(),await this.calculateTrains()}_loadAlertSettings(){if(this.alertSettings={enabled:!1,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,minSats:5,excludeStart:"01:00",excludeEnd:"05:00"},this.blueGlobe.sessionManager){const t=this.blueGlobe.sessionManager.getData();t&&t.email_trains&&(this.alertSettings.enabled=t.email_trains.enabled||!1,this.alertSettings.timezone=t.email_trains.timezone||this.alertSettings.timezone,this.alertSettings.minSats=t.email_trains.min_sats||5,this.alertSettings.excludeStart=t.email_trains.exclude_start||"01:00",this.alertSettings.excludeEnd=t.email_trains.exclude_end||"05:00")}}_saveAlertSettings(){if(this.blueGlobe.sessionManager){let t=this.blueGlobe.sessionManager.getData();t.email_trains||(t.email_trains={}),t.email_trains.enabled=this.alertSettings.enabled,t.email_trains.timezone=this.alertSettings.timezone,t.email_trains.min_sats=this.alertSettings.minSats,t.email_trains.exclude_start=this.alertSettings.excludeStart,t.email_trains.exclude_end=this.alertSettings.excludeEnd,this.blueGlobe.sessionManager.saveData(t)}}_setupAlertsHandlers(){const t=document.getElementById("trains_alerts_enabled"),a=document.getElementById("trains_alerts_min_sats"),n=document.getElementById("trains_alerts_exclude_start"),r=document.getElementById("trains_alerts_exclude_end");t&&t.addEventListener("change",()=>{this.alertSettings.enabled=t.checked,this._saveAlertSettings()}),a&&a.addEventListener("change",()=>{this.alertSettings.minSats=parseInt(a.value)||5,this._saveAlertSettings()}),n&&n.addEventListener("change",()=>{this.alertSettings.excludeStart=n.value,this._saveAlertSettings()}),r&&r.addEventListener("change",()=>{this.alertSettings.excludeEnd=r.value,this._saveAlertSettings()})}_setupFilterHandler(){const t=document.getElementById("trains_filter_toggle"),a=document.getElementById("trains_optimal_toggle"),n=()=>{if(this.allOverflights){const r=document.getElementById("trains_table_body");this._populateTrainsTableFromWorker(r,this.allOverflights)}};t&&t.addEventListener("change",n),a&&a.addEventListener("change",n)}_buildUI(){var l,d;const t=this.blueGlobe.preferences.homeLat,a=this.blueGlobe.preferences.homeLon,n=new Date().toISOString().substring(0,16).replace("T"," "),r=t>=0?`${Math.abs(t).toFixed(2)}°N`:`${Math.abs(t).toFixed(2)}°S`,s=a>=0?`${Math.abs(a).toFixed(2)}°E`:`${Math.abs(a).toFixed(2)}°W`,i=((d=(l=this.blueGlobe.sessionManager)==null?void 0:l.isLoggedIn)==null?void 0:d.call(l))||!1;let h="";i?h=`
12                <div id="trains_alerts_box" class="bg-gray-800 border border-gray-600 rounded-lg p-3 text-sm">
13                    <div class="flex items-center gap-2 mb-3">
14                        <input type="checkbox" id="trains_alerts_enabled" class="checkbox checkbox-sm checkbox-primary" ${this.alertSettings.enabled?"checked":""}>
15                        <label for="trains_alerts_enabled" class="text-gray-200 cursor-pointer">Receive train alerts</label>
16                    </div>
17
18                    <div id="trains_alerts_settings" class="space-y-2 text-xs">
19                        <div class="flex items-center gap-2">
20                            <label class="text-gray-400 w-20">Timezone:</label>
21                            <input type="text" id="trains_alerts_tz" value="${this.alertSettings.timezone}"
22                                   class="input input-xs input-bordered bg-gray-700 text-gray-200 flex-1" readonly>
23                        </div>
24
25                        <div class="flex items-center gap-2">
26                            <label class="text-gray-400 w-20">Min sats:</label>
27                            <input type="number" id="trains_alerts_min_sats" value="${this.alertSettings.minSats}" min="1" max="50"
28                                   class="input input-xs input-bordered bg-gray-700 text-gray-200 w-16">
29                            <span class="text-gray-500">satellites per train</span>
30                        </div>
31
32                        <div class="flex items-center gap-2">
33                            <label class="text-gray-400 w-20">Exclude:</label>
34                            <input type="time" id="trains_alerts_exclude_start" value="${this.alertSettings.excludeStart}"
35                                   class="input input-xs input-bordered bg-gray-700 text-gray-200 w-24">
36                            <span class="text-gray-500">to</span>
37                            <input type="time" id="trains_alerts_exclude_end" value="${this.alertSettings.excludeEnd}"
38                                   class="input input-xs input-bordered bg-gray-700 text-gray-200 w-24">
39                        </div>
40                    </div>
41                </div>
42            `:h=`
43                <div id="trains_alerts_box" class="bg-gray-800 border border-gray-600 rounded-lg p-3 text-sm">
44                    <div class="text-gray-300">
45                        <a href="/login" class="text-blue-400 hover:text-blue-300 underline">Login</a> to get train sighting alerts
46                    </div>
47                </div>
48            `,this.contentArea.innerHTML=`
49            <div class="mb-3 text-sm text-gray-400 leading-relaxed">
50                <p>Track Starlink satellite trains visible from your location. After a SpaceX launch, newly deployed satellites travel in a close formation — a bright "train" of lights crossing the night sky. This tracker calculates when the next satellite train passes overhead and whether it will be visible tonight.</p>
51            </div>
52            <div class="mb-3 flex justify-between items-start gap-4">
53                <div>
54                    <div class="text-sm text-gray-400">
55                        Satellite trains from ${n} UTC
56                    </div>
57                    <div class="text-sm text-gray-400">
58                        Observer location: ${r} / ${s}
59                    </div>
60                </div>
61                ${h}
62            </div>
63
64            <div id="trains_loading">
65                <div class="loading loading-spinner loading-lg mx-auto block"></div>
66                <p class="text-center mt-4">Calculating overflights for the next 7 days...</p>
67            </div>
68
69            <div id="trains_filter_container" style="display: none;">
70                <label class="label cursor-pointer inline-flex items-center gap-2 mb-2">
71                    <span class="label-text">🌙 Show Night Only</span>
72                    <input type="checkbox" class="toggle toggle-primary" id="trains_filter_toggle" checked>
73                    <span class="text-xs text-gray-400 ml-2">
74                        (≥10° elevation + dark sky)
75                    </span>
76                </label>
77                <label class="label cursor-pointer inline-flex items-center gap-2 mb-2">
78                    <span class="label-text">☀️ Show Optimal Lit Only</span>
79                    <input type="checkbox" class="toggle toggle-primary" id="trains_optimal_toggle">
80                    <span class="text-xs text-gray-400 ml-2">
81                        (sunlit with sun behind observer)
82                    </span>
83                </label>
84            </div>
85
86            <div id="trains_filtered_message" class="mb-2 p-2 bg-yellow-900 bg-opacity-20 text-yellow-300 text-xs rounded" style="display: none;">
87                No night viewing opportunities found. Showing all trains.
88            </div>
89
90            <div class="overflow-x-auto" id="trains_table_container" style="display: none;">
91                <table class="table table-zebra table-compact text-xs leading-none">
92                    <thead>
93                        <tr class="text-xs h-8">
94                            <th class="py-1 px-2"></th>
95                            <th class="py-1 px-2">#</th>
96                            <th class="py-1 px-2">Local Date</th>
97                            <th class="py-1 px-2">Start UTC</th>
98                            <th class="py-1 px-2">Start Local</th>
99                            <th class="py-1 px-2">Peak Local</th>
100                            <th class="py-1 px-2">El/Az</th>
101                            <th class="py-1 px-2">Az (start→end)</th>
102                            <th class="py-1 px-2">Sky</th>
103                            <th class="py-1 px-2">☀</th>
104                        </tr>
105                    </thead>
106                    <tbody id="trains_table_body" class="text-xs leading-tight">
107                    </tbody>
108                </table>
109                <div id="flare_explanation" class="mt-3 p-3 bg-blue-900 bg-opacity-20 rounded-lg text-xs" style="display: none;">
110                    <div class="flex items-center mb-1">
111                        <span class="text-lg mr-2">✨</span>
112                        <span class="font-semibold">Sun-lit Viewing Conditions</span>
113                    </div>
114                    <p class="text-gray-300">
115                        The sparkle icon indicates the satellite is sunlit while your location is in darkness. 
116                        These events may offer the chance to see the object reflecting light from the sun.
117                    </p>
118                </div>
119            </div>
120        `}async calculateTrains(){var r,s,i,h,l,d;const t=document.getElementById("trains_loading"),a=document.getElementById("trains_table_container"),n=document.getElementById("trains_table_body");if(!this.blueGlobe.trains||!this.blueGlobe.trains.trains){t.innerHTML=`
121                <div class="alert alert-warning">
122                    <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
123                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
124                    </svg>
125                    <span>Loading trains data...</span>
126                </div>
127            `;const e=1e4,o=Date.now();for(;(!this.blueGlobe.trains||!((s=(r=this.blueGlobe.dots)==null?void 0:r.movingPoints)!=null&&s.length))&&Date.now()-o<e;)await new Promise(p=>setTimeout(p,100));if(!this.blueGlobe.trains||!this.blueGlobe.trains.trains){t.innerHTML=`
128                    <div class="alert alert-error">
129                        <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
130                            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" />
131                        </svg>
132                        <span>Failed to load trains data</span>
133                    </div>
134                `;return}}try{const e=this.blueGlobe.preferences.homeLat,o=this.blueGlobe.preferences.homeLon,p=this.blueGlobe.preferences.homeAlt||0,v=this.blueGlobe.trains.trains.filter(g=>g.satellites&&g.satellites.length>0).map(g=>({train:g,leadSat:g.satellites[0],trainNoradIds:g.satellites.map(c=>c.norad_id)}));if(console.log(`Found ${v.length} trains with lead satellites`),v.length===0){t.style.display="none",a.style.display="block",this._populateTrainsTableFromWorker(n,[]);return}const f=[];for(const{train:g,leadSat:c,trainNoradIds:u}of v){const k=this.blueGlobe.dots.movingPoints.findIndex(b=>b.norad_id===c.norad_id);if(k>=0){const b=this.blueGlobe.dots.movingPoints[k];(h=(i=b.tleData)==null?void 0:i.raw_tle)!=null&&h.tle_line1&&((d=(l=b.tleData)==null?void 0:l.raw_tle)!=null&&d.tle_line2)&&f.push({train:g,noradId:c.norad_id,tle_line1:b.tleData.raw_tle.tle_line1,tle_line2:b.tleData.raw_tle.tle_line2,trainNoradIds:u})}}if(console.log(`Found TLE data for ${f.length} lead satellites`),f.length===0){t.innerHTML=`
135                    <div class="alert alert-warning">
136                        <span>No TLE data available for train lead satellites. Please load satellites first.</span>
137                    </div>
138                `;return}const A=new Date,I=this._calculateSunTransitions(A,e,o),M=f.map(async({train:g,noradId:c,tle_line1:u,tle_line2:k,trainNoradIds:b})=>{const y=new Worker(new URL("/assets/calculation-worker-CNeAc5Mf.js",import.meta.url));try{return await new Promise((R,S)=>{const D=Date.now()+Math.random();y.addEventListener("message",B=>{const{type:F,data:U,messageId:w}=B.data;if(w===D)if(y.terminate(),F==="TRANSITS_RESULT"){const P=U.transits.map(H=>({...H,trainNoradIds:b,trainConstellation:g.constellation_name,leadNoradId:c}));R(P)}else F==="ERROR"&&S(new Error(U.error))}),y.addEventListener("error",B=>{y.terminate(),S(B)}),y.postMessage({type:"CALCULATE_TRANSITS",data:{tle_line1:u,tle_line2:k,observer:{lat:e,lng:o,alt:p},startTime:A,durationDays:7,visibilityArray:I},messageId:D})})}catch(O){return console.error(`Error calculating transits for NORAD ${c}:`,O),[]}}),x=(await Promise.all(M)).flat().sort((g,c)=>new Date(g.startTime)-new Date(c.startTime));console.log(`Combined ${x.length} train transits from ${f.length} trains`),t.style.display="none",a.style.display="block",this.allOverflights=x;const _=document.getElementById("trains_filter_container");_&&(_.style.display="block"),this._populateTrainsTableFromWorker(n,x)}catch(e){console.error("Error calculating train overflights:",e),t.innerHTML=`
139                <div class="alert alert-error">
140                    <svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
141                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" />
142                    </svg>
143                    <span>Error calculating train overflights: ${e.message}</span>
144                </div>
145            `}}_calculateSunTransitions(t,a,n){console.log("Calculating visibility array for:",{date:t,lat:a,lng:n});const r=new Date(t);r.setUTCHours(0,0,0,0);const s=[];for(let i=0;i<1440;i+=5){const h=new Date(r.getTime()+i*6e4),l=se(h,a,n);let d;l>=0?d="Day":l>=-6?d="Civil":l>=-12?d="Naut":l>=-18?d="Astro":d="Night",s.push(d),(i%60===0||s.length>1&&d!==s[s.length-2])&&console.log(`${Math.floor(i/60).toString().padStart(2,"0")}:${(i%60).toString().padStart(2,"0")} UTC - elevation: ${l.toFixed(2)}°, visibility: ${d}`)}return console.log(`Visibility array created with ${s.length} entries`),s}_populateTrainsTableFromWorker(t,a){t.innerHTML="";const n=document.getElementById("trains_filter_toggle"),r=document.getElementById("trains_optimal_toggle"),s=document.getElementById("trains_filtered_message"),i=n&&n.checked,h=r&&r.checked;let l=a,d=!1;if(i){const e=a.filter(o=>o.peakElevation>=10&&(o.visibility==="Night"||o.visibility==="Astro"));d=e.length>0,l=d?e:a,s&&(s.style.display=d?"none":"block")}else s&&(s.style.display="none");if(h&&(l=l.filter(e=>e.isSunlit&&e.sunOrientation==="behind")),l.length===0){const o=t.insertRow().insertCell();o.colSpan=10,o.className="text-center text-gray-500 py-8",o.textContent="No trains pass filter";return}l.forEach(e=>{var K,V,Z;const o=t.insertRow(),p=new Date(e.startTime),T=new Date(e.peakTime),v=new Date(e.endTime);if(isNaN(p.getTime())||isNaN(T.getTime())||isNaN(v.getTime())){console.error("Invalid transit times:",e);return}const f=p.getDate(),I=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][p.getMonth()],M=`${f} ${I}`,W=p.toISOString().substring(11,19),x=p.toLocaleTimeString("en-GB",{hour12:!1}).substring(0,8),_=T.toLocaleTimeString("en-GB",{hour12:!1}).substring(0,8),g=e.trainNoradIds?e.trainNoradIds.length:1,c=e.sunlitDebug||{},u=m=>m==null?"n/a":typeof m=="number"?m.toFixed(1):m;console.log(`[train sunlit] n=${g} lead=${e.leadNoradId} peakUTC=${e.peakTime} peakEl=${u(e.peakElevation)}° =>
145 SUNLIT=${e.isSunlit} (${e.sunOrientation||"n/a"})
146   satAlt=${u(c.satAltKm)}km branch="${c.branch}" distToShadowAxis=${u(c.distToLine)}km R=${u(c.earthRadius)}km clearance=${u(c.clearanceKm)}km
147   SKY: sun az=${u(c.sunAz)}° el=${u(c.sunEl)}°  |  sat az=${u(c.satAz)}° el=${u(c.satEl)}°  |  orientationDot=${u(c.orientationDot)} (dot<0 => behind/good)`);const k=`${Math.round(e.startAzimuth)}°→${Math.round(e.endAzimuth)}°`,b=o.insertCell();b.className="py-0 px-1 h-6 text-center";const y=document.createElement("a");y.className="text-blue-400 hover:text-blue-300 text-lg cursor-pointer",y.textContent="🔭",y.title="Simulate in Photo-bomb tool";const O=this.blueGlobe.preferences.homeLat,R=this.blueGlobe.preferences.homeLon;let S;const D=e.startAzimuth,F=(e.endAzimuth-D+540)%360-180;S=(D+F/2+360)%360,S=Math.round(S);const U=Math.round(e.peakElevation);let w="";e.trainNoradIds&&e.trainNoradIds.length>0?w=e.trainNoradIds.join(","):(K=this.satelliteData)!=null&&K.norad_id?w=this.satelliteData.norad_id:(V=this.detailedData)!=null&&V.norad_id?w=this.detailedData.norad_id:(Z=this.oe)!=null&&Z.norad_id&&(w=this.oe.norad_id);const H=new Date(T.getTime()-60*1e3).toISOString().substring(0,19).replace("T","Z"),X=new URLSearchParams({mode:"localsky",lat:O,lon:R,alt:"10",az:S,elev:U,focal:"10",sensor:"36",utc:H,cmode:"video",dur:10,norad:w});y.href=`/satellite-photobomb?${X.toString()}`,y.target="_blank",b.appendChild(y);const C=document.createElement("button");C.textContent="ⓘ",C.title="Explain this pass",C.className="text-gray-400 hover:text-blue-300 text-base cursor-pointer ml-1 align-middle";let E=null;C.addEventListener("click",()=>{if(E){E.remove(),E=null;return}E=document.createElement("tr");const m=document.createElement("td");m.colSpan=10,m.className="py-2 px-8 text-sm text-gray-300 bg-blue-900 bg-opacity-10",m.innerHTML=Y(),E.appendChild(m),o.after(E)}),b.appendChild(C);const j=o.insertCell();j.textContent=g,j.className="py-0 px-2 h-6 text-center";let z="",L="";e.isSunlit?e.sunOrientation==="behind"?(z="☀️",L="Sunlit satellite, sun behind observer (optimal visibility)"):e.sunOrientation==="front"?(z="🌅",L="Back-lit satellite (sun in front of observer)"):(z="☀️",L="Sunlit satellite"):(z="🌑",L="Satellite in Earth shadow (not visible)");const J=[M,W,x,_,`${Math.round(e.peakElevation)}° / ${Math.round(e.peakAzimuth)}°`,k,e.visibility||"Unknown",z];J.forEach((m,q)=>{const G=o.insertCell();G.textContent=m,G.className="py-0 px-2 h-6",q===J.length-1&&L&&(G.title=L)}),o.className="h-6 leading-none",e.peakElevation>=70?o.classList.add("bg-green-900","bg-opacity-30"):e.peakElevation>=40?o.classList.add("bg-yellow-900","bg-opacity-20"):e.peakElevation>=20&&o.classList.add("bg-orange-900","bg-opacity-20");function Y(){const m=Math.round((v-p)/6e4),G=(te=>["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"][Math.round(te/22.5)%16])(e.peakAzimuth),Q=(e.endAzimuth-e.startAzimuth+540)%360-180>0?"left to right":"right to left",ee=p.toLocaleDateString("en-US",{day:"numeric",month:"long",year:"numeric"}),$={Civil:"civil twilight",Naut:"nautical twilight",Astro:"astronomical twilight",Night:"full darkness"}[e.visibility]||null;let N;return e.visibility==="Day"?N="Although the satellites may be sun-lit, your sky is in daylight and too bright to see them.":e.isSunlit?e.sunOrientation==="behind"?N=`They are sun-lit from approximately behind your position (good viewing)${$?`, and your sky is in ${$}`:""}.`:e.sunOrientation==="front"?N=`They are sun-lit but you would be looking towards the sun's side of the sky (back-lit, harder to see)${$?`, and your sky is in ${$}`:""}.`:N=`They are sun-lit${$?`, and your sky is in ${$}`:""}.`:N="The satellites are in the Earth's shadow at their high point, so this pass is not visible.",`<span style="margin-right: 8px;">↳</span><span class="train-description">On ${ee}, at ${x} local time, if you look ${G} and at an elevation of ${Math.round(e.peakElevation)}°, there will be a train of ${g} satellites passing ${Q} (${Math.round(e.startAzimuth)}° → ${Math.round(e.endAzimuth)}°). ${N} They will take approximately ${m} minutes to pass by. Click the telescope icon for a simulation of the event.</span>`}})}
147_populateTrainsTable(t,a){if(t.innerHTML="",a.length===0){const i=t.insertRow().insertCell();i.colSpan=11,i.className="text-center text-gray-500 py-8",i.textContent="No overflights found for the next 7 days (≥20° elevation, dark sky)";return}let n=!1;a.forEach(s=>{const i=t.insertRow(),h=new Date(s.startTime),l=new Date(s.peakTime),d=new Date(s.endTime);if(isNaN(h.getTime())||isNaN(l.getTime())||isNaN(d.getTime())){console.error("Invalid transit times:",s);return}const e=h.toLocaleDateString(),o=h.toISOString().substring(11,19),p=l.toISOString().substring(11,19),T=h.toLocaleTimeString("en-GB",{hour12:!1}).substring(0,8),v=l.toLocaleTimeString("en-GB",{hour12:!1}).substring(0,8),f=Math.round((d-h)/6e4),A=`${Math.floor(f/60)}:${(f%60).toString().padStart(2,"0")}`,I=`${Math.round(s.startAzimuth)}°→${Math.round(s.endAzimuth)}°`,M=s.isSunlit?"✨":"";s.isSunlit&&(n=!0),[e,o,T,p,v,Math.round(s.peakElevation)+"°",I,A,s.visibility||"N/A",M].forEach(x=>{const _=i.insertCell();_.textContent=x,_.className="py-0 px-2 h-6"}),i.className="h-6 leading-none",s.peakElevation>=70?i.classList.add("bg-green-900","bg-opacity-30"):s.peakElevation>=40?i.classList.add("bg-yellow-900","bg-opacity-20"):s.peakElevation>=20&&i.classList.add("bg-orange-900","bg-opacity-20")});const r=document.getElementById("flare_explanation");r&&(r.style.display=n?"block":"none")}cleanup(){}}export{oe as TrainsCalculator};

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.