@rr0/ufoathome 0.137.0 → 0.138.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist-embed-scene/BeamSystem-Dp1WU1Zx.js +1 -0
  2. package/dist-embed-scene/ContrailGrowth-DwHS8If9.js +1 -0
  3. package/dist-embed-scene/ContrailSystem-GO0Hkyj3.js +1 -0
  4. package/dist-embed-scene/{SceneNames_es-D_98QraV.js → SceneNames_es-BS2ioieu.js} +1 -1
  5. package/dist-embed-scene/{SceneNames_fr-y6Z57BDf.js → SceneNames_fr-B-fRwUUu.js} +1 -1
  6. package/dist-embed-scene/{SceneNames_it-DQt9yIh1.js → SceneNames_it-B-QEwmuM.js} +1 -1
  7. package/dist-embed-scene/rr0-scene.mjs +337 -337
  8. package/dist-embed-scene/{sightingSchema-CNCtrneh.js → sightingSchema-DT9g-OyF.js} +1 -1
  9. package/{dist-embed-sighting/trafficRuntime-sSIo5Lms.js → dist-embed-scene/trafficRuntime-BPEJW9KZ.js} +2 -2
  10. package/dist-embed-sighting/BeamSystem-Ddt2lTBT.js +1 -0
  11. package/dist-embed-sighting/ContrailGrowth-DwHS8If9.js +1 -0
  12. package/dist-embed-sighting/ContrailSystem-D_EBfThB.js +1 -0
  13. package/dist-embed-sighting/{SceneNames_es-Zb4vw-Vp.js → SceneNames_es-wkWHMHet.js} +1 -1
  14. package/dist-embed-sighting/{SceneNames_fr-C6_IIN2c.js → SceneNames_fr-DbbzZ1bB.js} +1 -1
  15. package/dist-embed-sighting/{SceneNames_it-D7GivBq2.js → SceneNames_it-BsxnweGu.js} +1 -1
  16. package/dist-embed-sighting/rr0-sighting.mjs +326 -326
  17. package/dist-embed-sighting/{sightingSchema-CNCtrneh.js → sightingSchema-DT9g-OyF.js} +1 -1
  18. package/dist-embed-sighting/trafficRuntime-CfPqH9j0.js +2 -0
  19. package/dist-embed-sighting-editor/BeamSystem-B3qYVuHd.js +1 -0
  20. package/dist-embed-sighting-editor/ContrailGrowth-DwHS8If9.js +1 -0
  21. package/dist-embed-sighting-editor/ContrailSystem-D9rPfOBE.js +1 -0
  22. package/dist-embed-sighting-editor/{InterviewEditorElement-DHxRISPC.js → InterviewEditorElement-D6TqSXYB.js} +2 -2
  23. package/dist-embed-sighting-editor/LaunchEditor-CPa-pltK.js +18 -0
  24. package/dist-embed-sighting-editor/LaunchEditorMessages_en-DH8gI1vo.js +1 -0
  25. package/dist-embed-sighting-editor/LaunchEditorMessages_es-WCfaY4uY.js +1 -0
  26. package/dist-embed-sighting-editor/LaunchEditorMessages_fr-CWCGUG_A.js +1 -0
  27. package/dist-embed-sighting-editor/LaunchEditorMessages_it-DxSSiAd7.js +1 -0
  28. package/dist-embed-sighting-editor/{SceneNames_es-7RR79EmC.js → SceneNames_es-umTyyCxN.js} +1 -1
  29. package/dist-embed-sighting-editor/{SceneNames_fr-Da_S9KXa.js → SceneNames_fr-BNgnxIHx.js} +1 -1
  30. package/dist-embed-sighting-editor/{SceneNames_it-BwFZROII.js → SceneNames_it-5UYhmJHo.js} +1 -1
  31. package/dist-embed-sighting-editor/SightingEditorMessages_es-UiUywEk4.js +12 -0
  32. package/dist-embed-sighting-editor/{SightingEditorMessages_fr-90Ojknvv.js → SightingEditorMessages_fr-D5pajHZd.js} +2 -2
  33. package/dist-embed-sighting-editor/SightingEditorMessages_it-9SduHYDB.js +12 -0
  34. package/dist-embed-sighting-editor/{SightingFileEditor-DcOCyimm.js → SightingFileEditor-DkRqrb-a.js} +1 -1
  35. package/dist-embed-sighting-editor/rr0-sighting-editor.mjs +401 -393
  36. package/dist-embed-sighting-editor/{sightingSchema-CNCtrneh.js → sightingSchema-DT9g-OyF.js} +1 -1
  37. package/dist-embed-sighting-editor/trafficRuntime-BAGbGiVc.js +2 -0
  38. package/package.json +1 -1
  39. package/dist-embed-scene/BeamSystem-DDqbr8Bb.js +0 -1
  40. package/dist-embed-scene/ContrailGrowth-CuAzwIoc.js +0 -1
  41. package/dist-embed-scene/ContrailSystem-CG5BhBF7.js +0 -1
  42. package/dist-embed-scene/trafficRuntime-CgM31CwB.js +0 -2
  43. package/dist-embed-sighting/BeamSystem-wkZ6I_8Y.js +0 -1
  44. package/dist-embed-sighting/ContrailGrowth-CuAzwIoc.js +0 -1
  45. package/dist-embed-sighting/ContrailSystem-XVzDvxFV.js +0 -1
  46. package/dist-embed-sighting-editor/BeamSystem-YGYbbAkU.js +0 -1
  47. package/dist-embed-sighting-editor/ContrailGrowth-CuAzwIoc.js +0 -1
  48. package/dist-embed-sighting-editor/ContrailSystem-CyYvtUTV.js +0 -1
  49. package/dist-embed-sighting-editor/LaunchEditor-qoB8RSgQ.js +0 -13
  50. package/dist-embed-sighting-editor/LaunchEditorMessages_en-BzymQ_VU.js +0 -1
  51. package/dist-embed-sighting-editor/LaunchEditorMessages_es-DzI2xAcW.js +0 -1
  52. package/dist-embed-sighting-editor/LaunchEditorMessages_fr-BLOwKfkH.js +0 -1
  53. package/dist-embed-sighting-editor/LaunchEditorMessages_it-CuovusOf.js +0 -1
  54. package/dist-embed-sighting-editor/SightingEditorMessages_es-BFzjoSef.js +0 -12
  55. package/dist-embed-sighting-editor/SightingEditorMessages_it-BtQIjKie.js +0 -12
  56. package/dist-embed-sighting-editor/trafficRuntime-lbQ2eKSF.js +0 -2
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rr0/ufoathome",
3
3
  "type": "module",
4
- "version": "0.137.0",
4
+ "version": "0.138.0",
5
5
  "description": "UFO@home — record and replay a UFO sighting's shape, movement and appearance",
6
6
  "author": "Jérôme Beau <rr0@rr0.org> (https://rr0.org)",
7
7
  "license": "MIT",
@@ -1 +0,0 @@
1
- import{R as _,E as m,H as C,G as V,B as W,d as L,b as X,y as F,z as Y,J as k}from"./rr0-scene.mjs";class y{static DEFAULT_DIVERGENCE_MRAD=.1;static DEFAULT_APERTURE_M=.01;static AEROSOL_SINGLE_SCATTERING_ALBEDO=.9;static AEROSOL_ASYMMETRY=.7;static STEP_M=25;static MAX_SAMPLES=2e3;static viewsAt(t,s,e,n){return y.onAt(t,s).map(o=>({id:o.id,wavelengthNm:o.wavelengthNm,samples:y.samplesOf(o,e,n)}))}static onAt(t,s){return t.filter(e=>e.path.length>=2&&(e.fromT===void 0||s>=e.fromT)&&(e.untilT===void 0||s<=e.untilT))}static samplesOf(t,s,e){const n=_.ecef({lat:s.lat,lng:s.lng,heightM:0}),o=s.lat*Math.PI/180,c=s.lng*Math.PI/180,i=z=>{const x=z[0]-n[0],E=z[1]-n[1],u=z[2]-n[2];return[-Math.sin(c)*x+Math.cos(c)*E,-Math.sin(o)*Math.cos(c)*x-Math.sin(o)*Math.sin(c)*E+Math.cos(o)*u,Math.cos(o)*Math.cos(c)*x+Math.cos(o)*Math.sin(c)*E+Math.sin(o)*u]},M=(t.divergenceMrad??y.DEFAULT_DIVERGENCE_MRAD)/1e3,h=t.apertureM??y.DEFAULT_APERTURE_M,l=[];let p=0,T=t.powerW,O=0;for(let z=0;z+1<t.path.length;z++){const x=t.path[z],E=t.path[z+1],u=_.ecef({lat:x.lat,lng:x.lng,heightM:x.altitudeM}),d=_.ecef({lat:E.lat,lng:E.lng,heightM:E.altitudeM}),P=Math.hypot(d[0]-u[0],d[1]-u[1],d[2]-u[2]),g=Math.max(1,Math.min(y.MAX_SAMPLES,Math.ceil(P/y.STEP_M)));for(let S=z===0?0:1;S<=g;S++){const I=S/g,G=[0,1,2].map(A=>u[A]+(d[A]-u[A])*I),a=I*P,f=x.altitudeM+(E.altitudeM-x.altitudeM)*I+y.bulgeM(a,P);if(S>0){const A=l[l.length-1],w=a+p-A.fromSourceM,D=y.extinctionAt(e,t.wavelengthNm,(A.altitudeM+f)/2);O+=D*w,T=t.powerW*Math.exp(-O)}const[v,N,r]=i(G);l.push({eastM:v,northM:N,upM:r,altitudeM:f,fromSourceM:p+a,widthM:h+M*(p+a),powerW:T})}p+=P}return l}static bulgeM(t,s){return t*(s-t)/(2*6371e3)}static extinctionAt(t,s,e){const{rayleighPerM:n,aerosolPerM:o}=y.coefficientsAt(t,s,e);return n+o}static coefficientsAt(t,s,e){const n=m.rayleighAt(s)*m.rayleighDensity(e),o=t.aerosol[1]*(s/550)**-1.3*m.aerosolDensity(e);return{rayleighPerM:n,aerosolPerM:o}}static phasedScattering(t,s){const e=3/(16*Math.PI)*(1+s*s),n=y.AEROSOL_ASYMMETRY,o=(1-n*n)/(4*Math.PI*(1+n*n-2*n*s)**1.5);return t.rayleighPerM*e+t.aerosolPerM*y.AEROSOL_SINGLE_SCATTERING_ALBEDO*o}static efficacy(t){return 683*Math.max(0,C.colourMatching(t)[1])}static colourOf(t){const[s,e,n]=C.colourMatching(t);if(e<=0)return[0,0,0];const o=C.linearSrgbOf([s/e,1,n/e]).map(i=>Math.max(0,i)),c=.2126*o[0]+.7152*o[1]+.0722*o[2];return o.map(i=>i/c)}static luminanceCdM2(t,s,e,n,o){return y.efficacy(s)*t*e/(n*Math.max(o,.001))}}class R{static MAX_SEGMENTS=6e3;static MIN_PIXELS=2;static VERTICES_PER_SEGMENT=24;static HALO_RAD=.002;static HALO_SHARE=.15;static BRIGHTEST_RELATIVE=6e4;group=new V;mesh;positions=new Float32Array(R.MAX_SEGMENTS*R.VERTICES_PER_SEGMENT*3);colors=new Float32Array(R.MAX_SEGMENTS*R.VERTICES_PER_SEGMENT*3);segments=0;drawn=[];cut;constructor(){const t=new W;t.setAttribute("position",new L(this.positions,3)),t.setAttribute("color",new L(this.colors,3)),t.setDrawRange(0,0),this.mesh=new X(t,new F({vertexColors:!0,transparent:!0,blending:k,depthWrite:!1,fog:!1,side:Y})),this.mesh.frustumCulled=!1,this.mesh.renderOrder=8,this.mesh.name="beams",this.group.name="beams",this.group.add(this.mesh)}get segmentCount(){return this.segments}update(t,s,e){const n=this.viewsOf(t,s,e);let o=0;this.segments=0,this.drawn=[];for(const i of n){const M=y.colourOf(i.wavelengthNm),h=this.place(i,e);this.drawn.push({id:i.id,points:h});for(let l=0;l+1<h.length&&!(this.segments>=R.MAX_SEGMENTS);l++){const p=this.pushSegment(o,h[l],h[l+1],i.wavelengthNm,M,e);p>o&&this.segments++,o=p}}const c=this.mesh.geometry;c.setDrawRange(0,o);for(const i of["position","color"]){const M=c.getAttribute(i);M.clearUpdateRanges(),o>0&&M.addUpdateRange(0,o*3),M.needsUpdate=!0}}viewsOf(t,s,e){const{lat:n,lng:o}=e.reference;(!this.cut||this.cut.lat!==n||this.cut.lng!==o||this.cut.air!==e.air)&&(this.cut={lat:n,lng:o,air:e.air,views:new Map});const c=this.cut.views;return y.onAt(t,s).map(i=>{let M=c.get(i);return M||c.set(i,M={id:i.id,wavelengthNm:i.wavelengthNm,samples:y.samplesOf(i,e.reference,e.air)}),M})}place(t,s){const e=[];for(const n of t.samples){const o=s.origin.x+n.eastM*s.eastScale,c=s.origin.z-n.northM,i=n.upM-s.siteElevationM;if(e.length>0&&i<s.groundYAt(o,c))break;e.push({x:o,y:i,z:c,altitudeM:n.altitudeM,widthM:n.widthM,powerW:n.powerW})}return e}pushSegment(t,s,e,n,o,c){const i={x:e.x-s.x,y:e.y-s.y,z:e.z-s.z},M=Math.hypot(i.x,i.y,i.z);if(M<1e-6)return t;const h={x:i.x/M,y:i.y/M,z:i.z/M},l={x:(s.x+e.x)/2,y:(s.y+e.y)/2,z:(s.z+e.z)/2},p={x:c.eye.x-l.x,y:c.eye.y-l.y,z:c.eye.z-l.z},T=Math.hypot(p.x,p.y,p.z);if(T<.001)return t;const O=(h.x*p.x+h.y*p.y+h.z*p.z)/T,z=Math.sqrt(Math.max(0,1-O*O)),x=y.coefficientsAt(c.air,n,(s.altitudeM+e.altitudeM)/2),E=y.phasedScattering(x,O),u=c.transmittanceTo(l.x,l.y,l.z),d=a=>R.MIN_PIXELS*c.pixelRad*Math.hypot(a.x-c.eye.x,a.y-c.eye.y,a.z-c.eye.z),P=a=>Math.hypot(a.x-c.eye.x,a.y-c.eye.y,a.z-c.eye.z),g=a=>Math.max(a.widthM,R.HALO_RAD*P(a)),S=a=>g(a)>d(a)?R.HALO_SHARE:0,I=(a,f,v)=>{const N=Math.max(f,d(a)),r=2*v*y.luminanceCdM2(a.powerW,n,E,N,z),A=o.map((H,U)=>Math.min(R.BRIGHTEST_RELATIVE,r*c.relativeScale*H*u[U])),w={x:c.eye.x-a.x,y:c.eye.y-a.y,z:c.eye.z-a.z},D=this.normalise(this.cross(i,w));return{point:a,half:N/2,level:A,across:D}},G=[[I(s,s.widthM,1-S(s)),I(e,e.widthM,1-S(e))],[I(s,g(s),S(s)),I(e,g(e),S(e))]];for(const a of G){if(a.every(r=>Math.max(...r.level)<=0))continue;const f=(r,A)=>{const w=t*3;this.positions[w]=r.point.x+r.across.x*r.half*A,this.positions[w+1]=r.point.y+r.across.y*r.half*A,this.positions[w+2]=r.point.z+r.across.z*r.half*A;const D=A===0?1:0;this.colors[w]=r.level[0]*D,this.colors[w+1]=r.level[1]*D,this.colors[w+2]=r.level[2]*D,t++},[v,N]=a;for(const r of[-1,1])f(v,r),f(v,0),f(N,r),f(v,0),f(N,0),f(N,r)}return t}pickAt(t,s,e){let n;for(const o of this.drawn)for(let c=0;c+1<o.points.length;c++){const i=o.points[c],M=o.points[c+1],h={x:M.x-i.x,y:M.y-i.y,z:M.z-i.z},l={x:i.x-t.x,y:i.y-t.y,z:i.z-t.z},p=h.x*h.x+h.y*h.y+h.z*h.z,T=h.x*s.x+h.y*s.y+h.z*s.z,O=h.x*l.x+h.y*l.y+h.z*l.z,z=s.x*l.x+s.y*l.y+s.z*l.z,x=p-T*T,E=x>1e-9?Math.min(1,Math.max(0,(T*z-O)/x)):0,u={x:i.x+h.x*E,y:i.y+h.y*E,z:i.z+h.z*E},d=(u.x-t.x)*s.x+(u.y-t.y)*s.y+(u.z-t.z)*s.z;if(d<=0)continue;const P=Math.hypot(u.x-t.x-s.x*d,u.y-t.y-s.y*d,u.z-t.z-s.z*d),g=Math.atan2(P,d);g<=e&&(!n||g<n.angle)&&(n={id:o.id,distanceM:Math.hypot(u.x-t.x,u.y-t.y,u.z-t.z),angle:g})}return n&&{id:n.id,distanceM:n.distanceM}}cross(t,s){return{x:t.y*s.z-t.z*s.y,y:t.z*s.x-t.x*s.z,z:t.x*s.y-t.y*s.x}}normalise(t){const s=Math.hypot(t.x,t.y,t.z)||1;return{x:t.x/s,y:t.y/s,z:t.z/s}}dispose(){this.mesh.geometry.dispose(),this.mesh.material.dispose(),this.group.removeFromParent()}}export{R as BeamSystem};
@@ -1 +0,0 @@
1
- class I{static FORMATION_S=.3;static DIFFUSION_M_PER_S=.2;static TYPICAL_SHEAR_PER_S=.003;static INITIAL_DEPTH_M=150;static DEEPENING_M_PER_S=.1;static YOUNG_OPTICAL_DEPTH=.5;static DILUTION_EXPONENT=.75;static MIXING_S=1500;static INVISIBLE=.006;static MIN_LIFETIME_S=15;static LIFETIME_SPAN_S=120;static widthM(t,E,_=I.TYPICAL_SHEAR_PER_S){const s=Math.max(0,E),N=_*(I.INITIAL_DEPTH_M*s+I.DEEPENING_M_PER_S*s*s/2);return t+I.DIFFUSION_M_PER_S*s+N}static lifetimeS(t){const E=Math.min(1,Math.max(0,t));return I.MIN_LIFETIME_S+I.LIFETIME_SPAN_S*E*E}static opacity(t,E){if(t<I.FORMATION_S)return 0;let _;if(E.persistent){const N=(E.spanM/I.widthM(E.spanM,t,E.shearPerS))**I.DILUTION_EXPONENT;_=I.YOUNG_OPTICAL_DEPTH*N*Math.exp(-t/I.MIXING_S)}else{if(t>=E.lifetimeS)return 0;_=I.YOUNG_OPTICAL_DEPTH*(1-t/E.lifetimeS)**2}const s=1-Math.exp(-_);return s<I.INVISIBLE?0:s}}export{I as C};
@@ -1 +0,0 @@
1
- import{G as T,B as A,d as N,b as w,y as G,z as O}from"./rr0-scene.mjs";import{C as z}from"./ContrailGrowth-CuAzwIoc.js";class f{static MAX_SEGMENTS=4e3;static MIN_PIXELS=2;static UNRESOLVED_CONTRAST=.5;static VERTICES_PER_SEGMENT=12;object;group=new T;trails=[];positions=new Float32Array(f.MAX_SEGMENTS*f.VERTICES_PER_SEGMENT*3);colors=new Float32Array(f.MAX_SEGMENTS*f.VERTICES_PER_SEGMENT*4);segments=0;constructor(){const t=new A;t.setAttribute("position",new N(this.positions,3)),t.setAttribute("color",new N(this.colors,4)),t.setDrawRange(0,0),this.object=new w(t,new G({vertexColors:!0,transparent:!0,depthWrite:!1,side:O})),this.object.frustumCulled=!1,this.object.name="contrails",this.group.name="contrails",this.group.add(this.object)}get segmentCount(){return this.segments}set(t){this.trails=t}update(t,s,r){let h=0;this.segments=0;for(const n of this.trails){const a=this.samplesOf(n,t,s),e=r(n.id);for(let c=0;c+1<a.length;c++){const o=a[c],p=a[c+1];if(!o.forms||!p.forms)continue;if(this.segments>=f.MAX_SEGMENTS)break;const l=this.pushSegment(h,o,p,n.spanM,e,s);l>h&&this.segments++,h=l}}const u=this.object.geometry;u.setDrawRange(0,h);for(const[n,a]of[["position",3],["color",4]]){const e=u.getAttribute(n);e.clearUpdateRanges(),h>0&&e.addUpdateRange(0,h*a),e.needsUpdate=!0}}samplesOf(t,s,r){const h=s-z.FORMATION_S*1e3,u=[],n=(o,p,l,d,m,y)=>({x:p+o.driftEastMs*m+r.origin.x,y:d,z:-(l+o.driftNorthMs*m)+r.origin.z,age:m,forms:y,point:o});let a=-1;t.points.forEach((o,p)=>{o.tMs>h||(a=p,u.push(n(o,o.eastM,o.northM,o.upM,(s-o.tMs)/1e3,o.forms)))});const e=t.points[a],c=t.points[a+1];if(e&&c){const o=(h-e.tMs)/(c.tMs-e.tMs),p=(l,d)=>l+(d-l)*o;u.push(n(e,p(e.eastM,c.eastM),p(e.northM,c.northM),p(e.upM,c.upM),z.FORMATION_S,e.forms&&c.forms))}return u}pushSegment(t,s,r,h,u,n){const a={persistent:s.point.persistent,lifetimeS:s.point.lifetimeS,spanM:h,shearPerS:s.point.shearPerS},e=z.opacity(s.age,a),c=z.opacity(r.age,a);if(e<=0&&c<=0)return t;const o={x:r.x-s.x,y:r.y-s.y,z:r.z-s.z};if(Math.hypot(o.x,o.y,o.z)<1e-6)return t;const p={x:(s.x+r.x)/2-n.eye.x,y:(s.y+r.y)/2-n.eye.y,z:(s.z+r.z)/2-n.eye.z},l=this.normalise(this.cross(o,p)),d=(i,M)=>{const g=Math.hypot(i.x-n.eye.x,i.y-n.eye.y,i.z-n.eye.z),E=z.widthM(h,i.age,i.point.shearPerS),R=Math.max(E,f.MIN_PIXELS*n.pixelRad*g);return{half:R/2,alpha:M*(E/R)**f.UNRESOLVED_CONTRAST}},m=[{sample:s,...d(s,e)},{sample:r,...d(r,c)}],y=(i,M)=>{const g=t*3;this.positions[g]=i.sample.x+l.x*i.half*M,this.positions[g+1]=i.sample.y+l.y*i.half*M,this.positions[g+2]=i.sample.z+l.z*i.half*M;const E=t*4;this.colors[E]=u[0],this.colors[E+1]=u[1],this.colors[E+2]=u[2],this.colors[E+3]=M===0?i.alpha:0,t++},[S,x]=m;for(const[i,M]of[[-1,0],[1,0]])y(S,i),y(S,M),y(x,i),y(S,M),y(x,M),y(x,i);return t}cross(t,s){return{x:t.y*s.z-t.z*s.y,y:t.z*s.x-t.x*s.z,z:t.x*s.y-t.y*s.x}}normalise(t){const s=Math.hypot(t.x,t.y,t.z)||1;return{x:t.x/s,y:t.y/s,z:t.z/s}}dispose(){this.object.geometry.dispose(),this.object.material.dispose(),this.group.removeFromParent()}}export{f as ContrailSystem};
@@ -1,2 +0,0 @@
1
- import{A as ht,L as ut,T as K,R as P,a as L,r as dt,l as X}from"./rr0-scene.mjs";import{C as J}from"./ContrailGrowth-CuAzwIoc.js";class f{static OCTAVES=[63,125,250,500,1e3,2e3,4e3,8e3];static STANDARD={temperatureC:15,relativeHumidity:.7,pressureKPa:101.325};static REFERENCE_PRESSURE_KPA=101.325;static REFERENCE_TEMPERATURE_K=293.15;static TRIPLE_POINT_K=273.16;static speedOfSound(t){return 20.0468*Math.sqrt(t+273.15)}static absorptionDbPerKm(t,e=f.STANDARD){const a=e.temperatureC+273.15,n=f.REFERENCE_TEMPERATURE_K,i=e.pressureKPa/f.REFERENCE_PRESSURE_KPA,o=10**(-6.8346*(f.TRIPLE_POINT_K/a)**1.261+4.6151),s=e.relativeHumidity*100*o/i,r=i*(24+40400*s*(.02+s)/(.391+s)),h=i*(a/n)**-.5*(9+280*s*Math.exp(-4.17*((a/n)**(-1/3)-1))),c=t*t;return 8.686*c*(184e-13*(1/i)*Math.sqrt(a/n)+(a/n)**-2.5*(.01275*Math.exp(-2239.1/a)/(r+c/r)+.1068*Math.exp(-3352/a)/(h+c/h)))*1e3}static aWeightingDb(t){const e=t*t,a=12194**2*e*e/((e+20.6**2)*Math.sqrt((e+107.7**2)*(e+737.9**2))*(e+12194**2));return 20*Math.log10(a)+2}static sumDb(t){return 10*Math.log10(t.reduce((e,a)=>e+10**(a/10),0))}}const pt=.25,x=.4,Z=6,U=12,mt=3,Q=.2,gt=.2,ft=24,Mt=3,At=12,tt=1,Et=.7,bt=1.5,Dt=.8,St=1.3,et=.9,at=5,Rt=25,vt=.5,Ot=.12,nt=[.13,.31],Bt=.16,It=1.6,Tt=3.6,it=1.1,_t=.3,Ct=1e3,st=.7;class ${context;noiseBuffer;roughBuffers=new Map;voices=new Map;bus;reverb;reverbOut;level=1;master;paused=!0;requested=[];headingDeg=0;resume(){if(!this.context){if(typeof AudioContext>"u")return;try{this.context=new AudioContext}catch(t){console.warn("AircraftAudio: Web Audio unavailable, aircraft stay silent:",t);return}}ht.unlock(this.context),this.apply()}setLevel(t){this.level=t,this.master&&(this.master.gain.value=t)}setPaused(t){t!==this.paused&&(this.paused=t,this.apply())}setVoices(t,e=0){this.requested=t,this.headingDeg=e,this.apply()}dispose(){for(const t of[...this.voices.keys()])this.release(t);this.context?.close(),this.context=void 0,this.master=void 0,this.bus=void 0}apply(){const t=this.context;if(!t)return;const e=this.paused?[]:this.requested,a=new Set(e.map(n=>n.id));for(const n of[...this.voices.keys()])a.has(n)||this.release(n);for(const n of e){const i=this.voices.get(n.id)??this.build(t,n);this.retarget(t,i,n)}}build(t,e){const a=t.createGain();a.gain.value=0;let n;const i=this.busOf(t);typeof t.createStereoPanner=="function"?(n=t.createStereoPanner(),a.connect(n).connect(i)):a.connect(i);const o=t.createGain(),s=e.character?.modulationDepth??0;o.gain.value=1-s/2;const r=t.createOscillator();r.type="sine";const h=t.createGain();h.gain.value=s/2,r.connect(h).connect(o.gain),o.connect(a);const c=t.createBufferSource();c.buffer=this.noise(t),c.loop=!0,c.loopStart=Math.random()*Z*.5;const d=[],l=[],u=[];for(const S of f.OCTAVES){const O=t.createBiquadFilter();O.type="bandpass",O.frequency.value=S,O.Q.value=tt;const C=t.createBiquadFilter();C.type="bandpass",C.frequency.value=S,C.Q.value=tt;const y=t.createGain();y.gain.value=0,c.connect(O).connect(C).connect(y).connect(o),d.push(O),l.push(C),u.push(y)}const p=[];for(const[S,O]of[[e.character?.toneHz,e.character?.toneShare],[e.character?.humHz,e.character?.humShare]])if(S!==void 0)for(let C=1;C<=Mt;C++){const y=t.createOscillator();y.type="sine",y.frequency.value=S*C;const V=t.createGain();V.gain.value=0,y.connect(V).connect(a),p.push({oscillator:y,gain:V,harmonic:C,baseHz:S,share:O??0})}const m=t.createGain();m.gain.value=0,m.connect(a.gain);const A=nt.map(S=>{const O=t.createOscillator();return O.type="sine",O.frequency.value=S,O.connect(m),O}),b=t.createGain();b.gain.value=e.character?.roughness??Q;const w=t.createBufferSource();w.buffer=this.roughTable(t,mt),w.loop=!0,w.loopStart=Math.random()*U*.5,w.connect(b).connect(o.gain);const _=t.createGain();_.gain.value=(e.character?.roughness??Q)*gt;const R=t.createBufferSource();R.buffer=this.roughTable(t,ft),R.loop=!0,R.loopStart=Math.random()*U*.5,R.connect(_).connect(o.gain);let B;const j=this.busOf(t)&&this.reverb;j&&(B=t.createGain(),B.gain.value=0,a.connect(B).connect(j));const W=[c,w,R,r,...p.map(S=>S.oscillator),...A];for(const S of W)S.start();const Y={nodes:[a,o,h,b,_,m,...p.map(S=>S.gain),...d,...l,...u,...B?[B]:[],...n?[n]:[],...W],sources:W,filters:d,seconds:l,gains:u,tones:p,lfo:r,lfoDepth:h,wander:A,wanderDepth:m,roughDepth:b,crackleDepth:_,beat:o,output:a,panner:n,send:B};return this.voices.set(e.id,Y),Y}retarget(t,e,a){const n=t.currentTime,i=(p,m)=>p.setTargetAtTime(m,n,pt),o=Math.min(bt,Math.max(Et,a.dopplerRatio)),s=Math.min(St,Math.max(Dt,Math.sqrt(a.dopplerRatio))),r=t.sampleRate*.45,h=a.bandAmplitudes.map((p,m)=>p*$.unweighting(f.OCTAVES[m])),c=Math.sqrt(h.reduce((p,m)=>p+m*m,0)),d=Math.min(1,Math.max(0,(a.distanceKm-at)/(Rt-at)));f.OCTAVES.forEach((p,m)=>{i(e.filters[m].frequency,Math.min(r,p*s)),i(e.seconds[m].frequency,Math.min(r,p*s)),i(e.gains[m].gain,h[m]*Math.sqrt(Ct/p))});const l=a.character;for(const{oscillator:p,gain:m,harmonic:A,baseHz:b,share:w}of e.tones){const _=b*A;i(p.frequency,_*o);const R=_*o;i(m.gain,R<r?w*Bt*h[$.bandOf(R)]/A:0)}l?.modulationHz!==void 0&&i(e.lfo.frequency,l.modulationHz*o);const u=c>0?st*(1-Math.exp(-c/st))/c:1;if(i(e.output.gain,u*(1-_t*d)),i(e.wanderDepth.gain,u*Ot*d/nt.length),e.send&&i(e.send.gain,It*d),e.panner){const p=(a.azimuthDeg-this.headingDeg)*Math.PI/180;i(e.panner.pan,Math.max(-et,Math.min(et,Math.sin(p)))*(1-vt*d))}}static unweighting(t){return 10**(Math.min(At,Math.max(0,-f.aWeightingDb(t)))/20)}static bandOf(t){let e=0;return f.OCTAVES.forEach((a,n)=>{Math.abs(Math.log(t/a))<Math.abs(Math.log(t/f.OCTAVES[e]))&&(e=n)}),e}roughTable(t,e){const a=this.roughBuffers.get(e);if(a)return a;const n=Math.floor(t.sampleRate*U),i=t.createBuffer(1,n,t.sampleRate),o=i.getChannelData(0),s=Array.from({length:U*e},()=>(Math.random()*2-1)**3),r=t.sampleRate/e;for(let h=0;h<o.length;h++){const c=h/r,d=Math.floor(c),l=c-d,u=l*l*(3-2*l);o[h]=s[d%s.length]*(1-u)+s[(d+1)%s.length]*u}return this.roughBuffers.set(e,i),i}roomImpulse(t){const e=Math.floor(t.sampleRate*Tt),a=t.createBuffer(2,e,t.sampleRate);for(let n=0;n<2;n++){const i=a.getChannelData(n);let o=0;for(let s=0;s<e;s++){const r=s/t.sampleRate,h=.6*Math.exp(-r/(it*2))+.04;o+=h*(Math.random()*2-1-o),i[s]=o*Math.exp(-r/it)}}return a}busOf(t){if(this.bus)return this.bus;const e=t.createGain();if(e.gain.value=this.level,e.connect(t.destination),this.master=e,typeof t.createConvolver=="function"){const a=t.createConvolver();a.buffer=this.roomImpulse(t);const n=t.createGain();n.gain.value=.9,a.connect(n),this.reverb=a,this.reverbOut=n}if(typeof t.createDynamicsCompressor=="function"){const a=t.createDynamicsCompressor();a.threshold.value=-6,a.knee.value=3,a.ratio.value=4,a.attack.value=.005,a.release.value=.25,a.connect(e),this.bus=a}else this.bus=e;return this.reverbOut?.connect(this.bus),this.bus}release(t){const e=this.voices.get(t);if(!e)return;this.voices.delete(t);const a=this.context;a&&(e.output.gain.setTargetAtTime(0,a.currentTime,x/3),setTimeout(()=>{for(const n of e.sources)try{n.stop()}catch{}for(const n of e.nodes)n.disconnect()},x*1e3*3))}noise(t){if(this.noiseBuffer)return this.noiseBuffer;const e=t.createBuffer(1,t.sampleRate*Z,t.sampleRate),a=e.getChannelData(0);for(let n=0;n<a.length;n++)a[n]=Math.random()*2-1;return this.noiseBuffer=e,e}}class I{static BASE_DB_A=30;static WIND_DB_A=[[0,10],[1,28],[2,36],[3,40],[5,46],[8,52],[12,58],[20,66]];static RAIN_DB_A=[[0,0],[.1,42],[.3,50],[.6,58],[1,65]];static BED_RMS=.2;static MINIMUM_REFERENCE=.008;static WIND_BED_MIN_MS=1;static WIND_BED_FULL_MS=20;static dbA(t){const e=[I.BASE_DB_A,I.along(I.WIND_DB_A,t.windSpeed)];return(t.precipitationType==="rain"||t.precipitationType==="hail")&&e.push(I.along(I.RAIN_DB_A,t.precipitationIntensity)),10*Math.log10(e.filter(a=>a>0).reduce((a,n)=>a+10**(n/10),0))}static bedVolume(t){const e=t.windSpeed>I.WIND_BED_MIN_MS?Math.min(t.windSpeed/I.WIND_BED_FULL_MS,1):0,a=t.precipitationType==="hail"?Math.min(1,t.precipitationIntensity*1.3+.2):t.precipitationType==="rain"?t.precipitationIntensity:0;return Math.hypot(e,a)}static referenceAmplitude(t){return Math.max(I.BED_RMS*I.bedVolume(t),I.MINIMUM_REFERENCE)}static along(t,e){if(e<=t[0][0])return t[0][1];for(let a=1;a<t.length;a++)if(e<=t[a][0]){const[n,i]=t[a-1],[o,s]=t[a];return i+(s-i)*(e-n)/(o-n)}return t[t.length-1][1]}}class N{static TYPES={A318:["Airbus A318","airliner-narrow",34.1,31.4],A319:["Airbus A319","airliner-narrow",34.1,33.8],A320:["Airbus A320","airliner-narrow",34.1,37.6],A321:["Airbus A321","airliner-narrow",34.1,44.5],A19N:["Airbus A319neo","airliner-narrow",35.8,33.8],A20N:["Airbus A320neo","airliner-narrow",35.8,37.6],A21N:["Airbus A321neo","airliner-narrow",35.8,44.5],B737:["Boeing 737-700","airliner-narrow",34.3,33.6],B738:["Boeing 737-800","airliner-narrow",35.8,39.5],B739:["Boeing 737-900","airliner-narrow",35.8,42.1],B38M:["Boeing 737 MAX 8","airliner-narrow",35.9,39.5],B39M:["Boeing 737 MAX 9","airliner-narrow",35.9,42.2],B752:["Boeing 757-200","airliner-narrow",38,47.3],B753:["Boeing 757-300","airliner-narrow",38,54.4],B762:["Boeing 767-200","airliner-wide",47.6,48.5],B763:["Boeing 767-300","airliner-wide",47.6,54.9],B764:["Boeing 767-400","airliner-wide",51.9,61.4],B772:["Boeing 777-200","airliner-wide",60.9,63.7],B77L:["Boeing 777-200LR","airliner-wide",64.8,63.7],B77W:["Boeing 777-300ER","airliner-wide",64.8,73.9],B788:["Boeing 787-8","airliner-wide",60.1,56.7],B789:["Boeing 787-9","airliner-wide",60.1,62.8],B78X:["Boeing 787-10","airliner-wide",60.1,68.3],B744:["Boeing 747-400","airliner-wide",64.4,70.7],B748:["Boeing 747-8","airliner-wide",68.4,76.3],A306:["Airbus A300-600","airliner-wide",44.8,54.1],A310:["Airbus A310","airliner-wide",43.9,46.7],A332:["Airbus A330-200","airliner-wide",60.3,58.8],A333:["Airbus A330-300","airliner-wide",60.3,63.7],A338:["Airbus A330-800","airliner-wide",64,58.8],A339:["Airbus A330-900","airliner-wide",64,63.7],A343:["Airbus A340-300","airliner-wide",60.3,63.7],A346:["Airbus A340-600","airliner-wide",63.5,75.4],A359:["Airbus A350-900","airliner-wide",64.8,66.8],A35K:["Airbus A350-1000","airliner-wide",64.8,73.8],A388:["Airbus A380-800","airliner-wide",79.8,72.7],E170:["Embraer 170","regional-jet",26,29.9],E75L:["Embraer 175","regional-jet",26,31.7],E75S:["Embraer 175","regional-jet",26,31.7],E190:["Embraer 190","regional-jet",28.7,36.2],E195:["Embraer 195","regional-jet",28.7,38.7],E290:["Embraer 190-E2","regional-jet",33.7,36.2],E295:["Embraer 195-E2","regional-jet",33.7,41.5],CRJ2:["Bombardier CRJ200","regional-jet",21.2,26.8],CRJ7:["Bombardier CRJ700","regional-jet",23.2,32.3],CRJ9:["Bombardier CRJ900","regional-jet",24.9,36.2],CRJX:["Bombardier CRJ1000","regional-jet",26.2,39.1],AT72:["ATR 72","regional-turboprop",27.1,27.2],AT76:["ATR 72-600","regional-turboprop",27.1,27.2],AT45:["ATR 42","regional-turboprop",24.6,22.7],DH8D:["Dash 8 Q400","regional-turboprop",28.4,32.8],DH8C:["Dash 8-300","regional-turboprop",27.4,25.7],SF34:["Saab 340","regional-turboprop",21.4,19.7],B190:["Beechcraft 1900","regional-turboprop",17.7,17.6],C25A:["Cessna CitationJet CJ2","business-jet",14.3,14.4],C56X:["Cessna Citation Excel","business-jet",17.2,16],C68A:["Cessna Citation Latitude","business-jet",22,18.9],C550:["Cessna Citation II","business-jet",15.8,14.4],E55P:["Embraer Phenom 300","business-jet",15.9,15.6],E50P:["Embraer Phenom 100","business-jet",12.3,12.8],GLF5:["Gulfstream G550","business-jet",28.5,29.4],FA7X:["Dassault Falcon 7X","business-jet",26.2,23.4],CL60:["Bombardier Challenger 600","business-jet",19.6,20.9],LJ45:["Learjet 45","business-jet",14.6,17.7],H25B:["Hawker 800","business-jet",15.7,15.6],C172:["Cessna 172","light-piston",11,8.3],C152:["Cessna 152","light-piston",10.2,7.3],C182:["Cessna 182","light-piston",10.9,8.8],P28A:["Piper Cherokee","light-piston",10.7,7.2],PA34:["Piper Seneca","light-piston",11.8,8.7],SR20:["Cirrus SR20","light-piston",10.9,7.9],SR22:["Cirrus SR22","light-piston",11.7,7.9],S22T:["Cirrus SR22T","light-piston",11.7,7.9],DA40:["Diamond DA40","light-piston",11.6,8.1],DA42:["Diamond DA42","light-piston",13.4,8.6],BE20:["Beechcraft King Air 200","turboprop-light",16.6,13.3],BE58:["Beechcraft Baron","light-piston",11.5,9.1],C208:["Cessna Caravan","turboprop-light",15.9,11.5],PC12:["Pilatus PC-12","turboprop-light",16.3,14.4],TBM9:["Daher TBM 900","turboprop-light",12.8,10.7],EC35:["Airbus H135","helicopter-light",10.2,12.1],EC45:["Airbus H145","helicopter-medium",11,13.6],AS50:["Airbus H125","helicopter-light",10.7,12.9],EC30:["Airbus H130","helicopter-light",10.7,12.6],B407:["Bell 407","helicopter-light",10.7,12.7],B06:["Bell 206","helicopter-light",10.2,12],B429:["Bell 429","helicopter-medium",10.9,13],B505:["Bell 505","helicopter-light",10.4,11.9],R44:["Robinson R44","helicopter-light",10.1,11.7],R22:["Robinson R22","helicopter-light",7.7,8.8],A109:["Agusta A109","helicopter-medium",11,13],A139:["Leonardo AW139","helicopter-medium",13.8,16.7],S92:["Sikorsky S-92","helicopter-heavy",17.2,20.9],H60:["Sikorsky UH-60 Black Hawk","helicopter-heavy",16.4,19.8],T38:["Northrop T-38 Talon","military-jet",7.7,14.1],HAWK:["BAE Hawk","military-jet",9.4,11.9],GLID:["Glider","glider",17,7],BALL:["Balloon","balloon",15,20],ULAC:["Ultralight","ultralight",9.5,6],C42:["Ikarus C42","ultralight",9.4,6.3],DRON:["Drone","unmanned",1,.6]};static CATEGORIES={A1:["Light aircraft","light-piston",11,8.3],A2:["Small aircraft","business-jet",15,15],A3:["Large aircraft","airliner-narrow",34.1,37.6],A4:["High-vortex large aircraft","airliner-narrow",38,47.3],A5:["Heavy aircraft","airliner-wide",60.3,63.7],A6:["High-performance aircraft","military-jet",8,14],A7:["Rotorcraft","helicopter-medium",10.7,12.7],B1:["Glider","glider",17,7],B2:["Lighter-than-air","balloon",15,20],B4:["Ultralight","ultralight",9.5,6],B6:["Unmanned aircraft","unmanned",1.5,1]};static GENERIC={name:"Airliner",kind:"airliner-narrow",spanM:34.1,lengthM:37.6,basis:"nothing"};static of(t){const e=t?.type?.toUpperCase(),a=e?N.TYPES[e]:void 0;if(a)return{code:e,name:a[0],kind:a[1],spanM:a[2],lengthM:a[3],basis:"type"};const n=t?.category?N.CATEGORIES[t.category]:void 0;return n?{name:n[0],kind:n[1],spanM:n[2],lengthM:n[3],basis:"category"}:{...N.GENERIC}}static isHelicopter(t){return t.kind.startsWith("helicopter")}}class H{static DUSK_SUN_ELEVATION_DEG=-.83;static ALWAYS=new Set(["airliner-narrow","airliner-wide","regional-turboprop","regional-jet","business-jet"]);static NONE=new Set(["glider","balloon"]);static BRIGHTNESS={"light-piston":[.5,.2,.5],"turboprop-light":[.7,.4,.8],ultralight:[.4,.2,.4],unmanned:[0,.05,0],"helicopter-light":[1,1,1],"helicopter-medium":[1,1,1],"helicopter-heavy":[1,1,1],"military-jet":[1,1,1]};static lampsOn(t,e){if(H.NONE.has(t))return{navigation:!1,beacon:!1,strobes:!1};if(H.ALWAYS.has(t))return{navigation:!0,beacon:!0,strobes:!0};const a=e<H.DUSK_SUN_ELEVATION_DEG;return t==="unmanned"?{navigation:!1,beacon:!1,strobes:a}:{navigation:a,beacon:a,strobes:a}}static lights(t,e){const a=H.lampsOn(t.kind,e),n=t.kind.startsWith("helicopter"),i=ut.find(u=>u.id===(n?"helicopter":"airliner")).create(),[o,s]=n?[5,7]:[17,18],r=t.spanM/2/o,h=t.lengthM/2/s,[c,d,l]=H.BRIGHTNESS[t.kind]??[1,1,1];return i.filter(u=>u.id.startsWith("nav")?a.navigation:u.id.startsWith("strobe")?a.strobes:u.id.startsWith("beacon")?a.beacon:!0).filter(u=>!(u.id.startsWith("beacon")&&!a.beacon)).map(u=>{const p=u.id.startsWith("nav")?c:u.id.startsWith("strobe")?d:l;return{...u,offsetM:{x:u.offsetM.x*r,y:u.offsetM.y,z:u.offsetM.z*h},intensity:(u.intensity??1)*p}}).filter(u=>(u.intensity??1)>0)}static bodyColor(t){return t.kind==="military-jet"?"#8a8e94":t.kind.startsWith("helicopter")?"#c8ccd1":t.kind==="unmanned"?"#2c2e33":"#dde0e4"}}class G{static FAMILIES={"amvlab-a320":["A318","A319","A320","A321","A19N","A20N","A21N"],"amvlab-b737":["B732","B733","B734","B735","B736","B737","B738","B739","B37M","B38M","B39M","B3XM"],"amvlab-a350":["A359","A35K"],"amvlab-a380":["A388"],"amvlab-b787":["B788","B789","B78X"]};static BY_TYPE=new Map(Object.entries(G.FAMILIES).flatMap(([t,e])=>e.map(a=>[a,t])));static idOf(t){return t?G.BY_TYPE.get(t.toUpperCase()):void 0}}class E{static ID_PREFIX=K.ID_PREFIX;static MAX_OBJECTS=40;static FT_TO_M=.3048;static DEG=Math.PI/180;static from(t,e,a,n=E.MAX_OBJECTS,i={}){return new wt(t,e,a,n,i).build()}static idOf(t,e){return K.idOf(t,e)}static keyOf(t){return K.keyOf(t)}static HEIGHT_OVER_LENGTH=.29;static sizeOf(t){return{widthM:t.spanM,lengthM:t.lengthM,heightM:t.lengthM*E.HEIGHT_OVER_LENGTH}}static offsetOf(t,e){const a=P.seenFrom(t,{lat:e.lat,lng:e.lng,heightM:e.altitudeFt*E.FT_TO_M}),n=a.distanceKm*1e3,i=n*Math.cos(a.altitudeDeg*E.DEG);return{eastM:i*Math.sin(a.azimuthDeg*E.DEG),northM:i*Math.cos(a.azimuthDeg*E.DEG),upM:n*Math.sin(a.altitudeDeg*E.DEG),altitudeDeg:a.altitudeDeg,distanceKm:a.distanceKm}}static segments(t){const e=[];let a=[];for(const n of t.points){const i=a[a.length-1];i&&n.t-i.t>L.MAX_GAP_S*1e3&&(e.push(a),a=[]),a.push(n)}return e.push(a),e.filter(n=>n.length>=2)}static bearingDeg(t,e){return(Math.atan2(e.eastM-t.eastM,e.northM-t.northM)/E.DEG+360)%360}}class wt{constructor(t,e,a,n,i){this.tracks=t,this.observer=e,this.startMs=a,this.maxObjects=n,this.options=i}build(){const t=[];for(const a of this.tracks){const n=E.keyOf(a),i=this.options.models?.get(n)??N.of(void 0);E.segments(a).forEach((o,s)=>{const r=o.map(u=>({point:u,at:E.offsetOf(this.observer,u)}));if(!r.some(u=>u.at.altitudeDeg>=0))return;const h=r.map((u,p)=>({t:u.point.t-this.startMs,eastM:u.at.eastM,northM:u.at.northM,altitudeM:u.at.upM,headingDeg:u.point.trackDeg??(p+1<r.length?E.bearingDeg(u.at,r[p+1].at):E.bearingDeg(r[p-1].at,u.at))})),c=E.idOf(a,s),d=r[Math.floor(r.length/2)].point,l=this.options.sunElevationAt?.(d)??90;t.push({object:{id:c,kind:"aircraft",eastM:h[0].eastM,northM:h[0].northM,headingDeg:h[0].headingDeg,sizeM:E.sizeOf(i),model:G.idOf(i.code)?{id:G.idOf(i.code)}:void 0,color:H.bodyColor(i),lights:H.lights(i,l),track:h},presence:{fromMs:h[0].t,untilMs:h[h.length-1].t},flight:{icao:a.icao,nonIcao:a.nonIcao,points:o},closestKm:Math.min(...r.map(u=>u.at.distanceKm))})})}t.sort((a,n)=>a.closestKm-n.closestKm);const e=t.slice(0,this.maxObjects);return{objects:e.map(a=>a.object),presence:new Map(e.map(a=>[a.object.id,a.presence])),flights:new Map(e.map(a=>[a.object.id,a.flight])),total:t.length,shown:e.length}}}const lt=[{id:"turbofan-narrow-body",name:"Turbofan airliner, narrow-body",kinds:["airliner-narrow"],totalDbA:148,shapeDb:[-32,-17,-9,-6,-5,-7,-12,-22],character:{toneHz:1800,toneShare:.3,humHz:90,humShare:.7}},{id:"turbofan-wide-body",name:"Turbofan airliner, wide-body",kinds:["airliner-wide"],totalDbA:151,shapeDb:[-28,-14,-7,-4,-3,-6,-12,-22],character:{toneHz:1200,toneShare:.3,humHz:70,humShare:.7}},{id:"regional-jet",name:"Regional jet",kinds:["regional-jet"],totalDbA:144,shapeDb:[-32,-17,-9,-5,-4,-6,-11,-21],character:{toneHz:1900,toneShare:.3,humHz:95,humShare:.7}},{id:"business-jet",name:"Business jet",kinds:["business-jet"],totalDbA:141,shapeDb:[-30,-15,-8,-4,-3,-4,-9,-19],character:{toneHz:2500,toneShare:.25,humHz:110,humShare:.7}},{id:"turboprop",name:"Turboprop",kinds:["regional-turboprop","turboprop-light"],totalDbA:138,shapeDb:[-14,-9,-8,-6,-8,-13,-20,-28],character:{toneHz:80,toneShare:.5}},{id:"light-piston",name:"Light piston aircraft",kinds:["light-piston"],totalDbA:130,shapeDb:[-18,-9,-5,-4,-8,-14,-22,-30],character:{toneHz:80,toneShare:.4}},{id:"ultralight",name:"Ultralight",kinds:["ultralight"],totalDbA:124,shapeDb:[-16,-8,-5,-4,-9,-15,-23,-31],character:{toneHz:140,toneShare:.4}},{id:"helicopter-light",name:"Light helicopter",kinds:["helicopter-light"],totalDbA:134,shapeDb:[-15,-8,-4,-3,-6,-10,-16,-24],character:{modulationHz:20,modulationDepth:.5}},{id:"helicopter-medium",name:"Medium helicopter",kinds:["helicopter-medium"],totalDbA:138,shapeDb:[-14,-7,-4,-3,-6,-10,-16,-24],character:{modulationHz:22,modulationDepth:.5}},{id:"helicopter-heavy",name:"Heavy helicopter",kinds:["helicopter-heavy"],totalDbA:144,shapeDb:[-12,-6,-4,-4,-7,-11,-17,-25],character:{modulationHz:17,modulationDepth:.5}},{id:"military-jet",name:"Military jet",kinds:["military-jet"],totalDbA:152,shapeDb:[-26,-12,-6,-3,-2,-3,-7,-15]},{id:"glider",name:"Glider",kinds:["glider"],totalDbA:85,shapeDb:[-30,-22,-15,-10,-8,-8,-14,-22]},{id:"balloon",name:"Hot-air balloon",kinds:["balloon"],totalDbA:100,shapeDb:[-25,-15,-9,-5,-3,-6,-12,-20]},{id:"unmanned",name:"Unmanned aircraft",kinds:["unmanned"],totalDbA:88,shapeDb:[-40,-30,-20,-12,-6,-3,-3,-8],character:{toneHz:450,toneShare:1}}],rt=lt.map(T=>({id:T.id,name:T.name,soundPowerA:T.shapeDb.map(t=>t+T.totalDbA-f.sumDb(T.shapeDb)),character:T.character}));class g{static DEFAULT_AMBIENT_DB_A=35;static DETECTION_MARGIN_DB=3;static AMBIENT_SHAPE_DB=[-12,-7,-5,-5,-7,-11,-17,-25];static HEARING_FLOOR_DB_A=0;static ITERATIONS=30;static CONVERGED_MS=.5;static VELOCITY_STEP_MS=500;static noiseOfKind(t){const e=lt.find(a=>a.kinds.includes(t));return rt.find(a=>a.id===(e?.id??"turbofan-narrow-body"))}static bandsAt(t,e,a=f.STANDARD){const n=20*Math.log10(Math.max(e*1e3,1))+11;return f.OCTAVES.map((i,o)=>t.soundPowerA[o]-n-f.absorptionDbPerKm(i,a)*e)}static couldBeHeard(t,e,a=g.DEFAULT_AMBIENT_DB_A,n=f.STANDARD){const i=g.ambientBands(a);return g.bandsAt(t,e,n).some((o,s)=>o>=Math.max(i[s]+g.DETECTION_MARGIN_DB,g.HEARING_FLOOR_DB_A))}static ambientBands(t){const e=g.AMBIENT_SHAPE_DB,a=f.sumDb(e);return e.map(n=>t+n-a)}static heardAt(t,e,a,n={}){const i=n.air??f.STANDARD,o=f.speedOfSound(i.temperatureC),s=t.points[t.points.length-1]?.t;if(s===void 0)return;let r=Math.min(a,s),h=L.positionAt(t,r);if(!h)return;let c=P.seenFrom(e,h.geo);for(let R=0;R<g.ITERATIONS;R++){const B=a-c.distanceKm*1e3*1e3/o,j=Math.abs(B-r);if(r=B,h=L.positionAt(t,r),!h)return;if(c=P.seenFrom(e,h.geo),j<g.CONVERGED_MS)break}const d=L.positionAt(t,a),l=d?P.seenFrom(e,d.geo):c,u=n.noise??rt[0],p=n.ambientDbA??g.DEFAULT_AMBIENT_DB_A,m=g.ambientBands(p),A=g.bandsAt(u,c.distanceKm,i),b=A.map((R,B)=>R>=Math.max(m[B]+g.DETECTION_MARGIN_DB,g.HEARING_FLOOR_DB_A)),w=A.indexOf(Math.max(...A)),_=b.lastIndexOf(!0);return{track:t,audible:b.some(Boolean),levelDbA:f.sumDb(A),bandsDbA:A,ambientDbA:p,delayS:(a-r)/1e3,emittedAtMs:r,sound:c,seen:l,lagDeg:g.angleBetween(c,l),dopplerRatio:g.doppler(t,e,r,o),dominantHz:f.OCTAVES[w],cutoffHz:_<0?void 0:f.OCTAVES[_]}}static profile(t,e,a,n,i=2e3,o={}){const s=[];let r,h,c=a;for(let d=a;d<=n;d+=i){const l=g.heardAt(t,e,d,o);l&&(!h||l.levelDbA>h.levelDbA)&&(h=l,c=d),l?.audible?r?r.untilMs=d:s.push(r={fromMs:d,untilMs:d}):r=void 0}return{track:t,audible:s,peakDbA:h?.levelDbA??-1/0,peakAtMs:c,peakDelayS:h?.delayS??0}}static angleBetween(t,e){const a=c=>{const d=c.altitudeDeg*Math.PI/180,l=c.azimuthDeg*Math.PI/180;return[Math.cos(d)*Math.sin(l),Math.cos(d)*Math.cos(l),Math.sin(d)]},[n,i,o]=a(t),[s,r,h]=a(e);return Math.acos(Math.min(1,Math.max(-1,n*s+i*r+o*h)))*180/Math.PI}static doppler(t,e,a,n){const i=g.VELOCITY_STEP_MS,o=L.positionAt(t,a-i),s=L.positionAt(t,a+i);if(!o||!s)return 1;const r=P.seenFrom(e,o.geo).distanceKm*1e3,h=P.seenFrom(e,s.geo).distanceKm*1e3;return 1/(1-(r-h)/(2*i/1e3)/n)}}class Lt{static at(t,e,a,n,i={}){const o=L.seenFrom(t,a,n);if(!o)return;const s=N.of(e),r=g.heardAt(t,a,n,{noise:g.noiseOfKind(s.kind),...i});return{hex:`${t.nonIcao?"~":""}${t.icao.toString(16).padStart(6,"0")}`,registration:e?.registration,typeCode:s.code??e?.type,name:s.basis==="nothing"?void 0:s.name,kind:s.kind,basis:s.basis,military:e?.military===!0,restricted:e?.restricted===!0,altitudeFt:o.altitudeFt,groundSpeedKt:o.groundSpeedKt,trackDeg:o.trackDeg,sky:o.sky,angularRateDegPerS:o.angularRateDegPerS,hearing:r&&{audible:r.audible,levelDbA:r.levelDbA,ambientDbA:r.ambientDbA,delayS:r.delayS,lagDeg:r.lagDeg,dopplerRatio:r.dopplerRatio,cutoffHz:r.cutoffHz,dominantHz:r.dominantHz}}}}class D{static REFERENCE_AMPLITUDE=.02;static MASKING_RANGE_DB=6;static KNEE_DB=20;static COMPRESSION_RATIO=1.5;static EXPANSION_RATIO=1.8;static DEFAULT_MAX_VOICES=4;static candidates(t,e,a,n,i={}){const o=new Set;for(const[s,r]of t){const h=g.noiseOfKind(N.of(e.get(a(r))).kind);let c=1/0;for(const d of r.points)c=Math.min(c,P.seenFrom(n,{lat:d.lat,lng:d.lng,heightM:d.altitudeFt*.3048}).distanceKm);g.couldBeHeard(h,c,i.ambientDbA,i.air)&&o.add(s)}return o}static voices(t,e,a,n,i,o,s={}){const r=[];for(const h of t){const c=e.get(h);if(!c||s.only?.(h)===!1)continue;const d=s.kindOf?.(h)??N.of(a.get(n(c))).kind,l=s.noiseOf?.(h)??g.noiseOfKind(d),u=g.heardAt(c,i,o,{...s,noise:l});u?.audible&&r.push({id:h,kind:d,bandAmplitudes:D.bandAmplitudes(u.bandsDbA,u.ambientDbA,s.referenceAmplitude),levelDbA:u.levelDbA,distanceKm:u.sound.distanceKm,dopplerRatio:u.dopplerRatio,azimuthDeg:u.sound.azimuthDeg,elevationDeg:u.sound.altitudeDeg,character:l.character})}return r.sort((h,c)=>c.levelDbA-h.levelDbA).slice(0,s.maxVoices??D.DEFAULT_MAX_VOICES)}static bandAmplitudes(t,e,a=D.REFERENCE_AMPLITUDE){const n=g.ambientBands(e),i=g.DETECTION_MARGIN_DB,o=f.sumDb(t),s=o-e,r=s>=D.KNEE_DB?D.KNEE_DB+(s-D.KNEE_DB)/D.COMPRESSION_RATIO:D.KNEE_DB-(D.KNEE_DB-s)*D.EXPANSION_RATIO,h=a*10**(r/20);return t.map((c,d)=>{const l=Math.min(1,Math.max(0,(c-n[d]-i+D.MASKING_RANGE_DB)/(2*D.MASKING_RANGE_DB)));return l*l*(3-2*l)*h*10**((c-o)/20)})}static BANDS_HZ=f.OCTAVES}class z{static ENGLISH={unnamed:"Aircraft {hex}",altitude:"{value} ft",speed:"{value} kt",heading:"heading {value}°",position:"{distance} km away, {elevation}° above the horizon, {bearing}",heard:"Heard at {level} dB(A), left the aircraft {delay} s ago, {lag}° behind it: {character}{pitch}",rumble:"a low rumble, nothing above {cutoff} Hz",muffled:"a dull noise, nothing above {cutoff} Hz",broad:"a broad roar",pitchHigher:", pitch {percent} % higher",pitchLower:", pitch {percent} % lower",inaudible:"Not audible here: {level} dB(A) against {ambient} dB(A) of ambient noise",soundUnknown:"Its sound cannot be worked out: the aircraft was not recorded yet when it left",contrailPersistent:"Leaves a trail that lasts: the air is supersaturated over ice ({rhi} % over ice)",contrailShort:"Leaves a short-lived trail: the air is dry over ice ({rhi} % over ice)",military:"military",restricted:"identity withheld by its owner",candidate:"A compatible candidate, not an identification"};static RUMBLE_BELOW_HZ=500;static DULL_BELOW_HZ=2e3;static PITCH_NOTICED=.03;static text(t,e,a,n){const i=(l,u=0)=>l.toLocaleString(n,{maximumFractionDigits:u}),o=(l,u)=>l.replace(/\{(\w+)\}/g,(p,m)=>u[m]??`{${m}}`),s=[],r=[t.registration,t.name].filter(Boolean).join(" · ");s.push(r||o(e.unnamed,{hex:t.hex}));const h=[o(e.altitude,{value:i(Math.round(t.altitudeFt/100)*100)}),t.groundSpeedKt===void 0?void 0:o(e.speed,{value:i(Math.round(t.groundSpeedKt))}),t.trackDeg===void 0?void 0:o(e.heading,{value:i(Math.round(t.trackDeg))})].filter(Boolean);s.push(h.join(" · ")),s.push(o(e.position,{distance:i(t.sky.distanceKm,t.sky.distanceKm<10?1:0),elevation:i(Math.round(t.sky.altitudeDeg)),bearing:a(t.sky.azimuthDeg)}));const c=t.hearing;if(!c)s.push(e.soundUnknown);else if(!c.audible)s.push(o(e.inaudible,{level:i(Math.round(c.levelDbA)),ambient:i(Math.round(c.ambientDbA))}));else{const l=c.cutoffHz??0,u=l<=z.RUMBLE_BELOW_HZ?e.rumble:l<=z.DULL_BELOW_HZ?e.muffled:e.broad,p=c.dopplerRatio-1,m=Math.abs(p)<z.PITCH_NOTICED?"":o(p>0?e.pitchHigher:e.pitchLower,{percent:i(Math.round(Math.abs(p)*100))});s.push(o(e.heard,{level:i(Math.round(c.levelDbA)),delay:i(Math.round(c.delayS)),lag:i(Math.round(c.lagDeg)),character:o(u,{cutoff:i(l)}),pitch:m}))}t.contrail&&s.push(o(t.contrail.persistent?e.contrailPersistent:e.contrailShort,{rhi:i(Math.round(t.contrail.iceRelativeHumidity*100))}));const d=[t.military?e.military:void 0,t.restricted?e.restricted:void 0].filter(Boolean);return d.length>0&&s.push(d.join(" · ")),s.push(e.candidate),s.join(`
2
- `)}}class q{static EFFICIENCY={"airliner-narrow":.34,"airliner-wide":.38,"regional-jet":.32,"business-jet":.3,"military-jet":.22,unknown:.34};static efficiencyOf(t){return q.EFFICIENCY[t]}}class M{static EMISSION_INDEX_WATER=1.25;static COMBUSTION_HEAT=432e5;static AIR_HEAT_CAPACITY=1004;static MOLAR_MASS_RATIO=.622;static FT_TO_M=.3048;static TROPOPAUSE_M=11e3;static TROPOPAUSE_HPA=226.32;static ISOTHERMAL_SCALE_HEIGHT_M=6341.62;static pressureAtAltitudeFt(t){const e=t*M.FT_TO_M;return e<=M.TROPOPAUSE_M?1013.25*(1-225577e-10*e)**5.25588:M.TROPOPAUSE_HPA*Math.exp(-(e-M.TROPOPAUSE_M)/M.ISOTHERMAL_SCALE_HEIGHT_M)}static saturationOverWaterPa(t){const e=t+273.15;return Math.exp(54.842763-6763.22/e-4.21*Math.log(e)+367e-6*e+Math.tanh(.0415*(e-218.8))*(53.878-1331.22/e-9.44523*Math.log(e)+.014025*e))}static saturationOverIcePa(t){const e=t+273.15;return Math.exp(9.550426-5723.265/e+3.53068*Math.log(e)-.00728332*e)}static iceRelativeHumidity(t,e){return e*M.saturationOverWaterPa(t)/M.saturationOverIcePa(t)}static mixingSlope(t,e){return M.EMISSION_INDEX_WATER*M.AIR_HEAT_CAPACITY*t*100/(M.MOLAR_MASS_RATIO*M.COMBUSTION_HEAT*(1-e))}static criticalTemperatureC(t,e){const a=Math.log(M.mixingSlope(t,e)-.053);return-46.46+9.43*a+.72*a*a}static requiredHumidity(t,e,a){const n=M.criticalTemperatureC(t,e);return(M.mixingSlope(t,e)*(a-n)+M.saturationOverWaterPa(n))/M.saturationOverWaterPa(a)}static evaluate(t,e){const a=M.criticalTemperatureC(t.pressureHpa,e),n=M.requiredHumidity(t.pressureHpa,e,t.temperatureC),i=M.iceRelativeHumidity(t.temperatureC,t.relativeHumidity),o=t.temperatureC<a&&t.relativeHumidity>=n;return{forms:o,persistent:o&&i>=1,criticalTemperatureC:a,requiredHumidity:n,iceRelativeHumidity:i}}}class k{static HOLD_MS=36e5;static DEG=Math.PI/180;static GAS_CONSTANT_OVER_GRAVITY=287.05/9.80665;static at(t,e,a){if(t.length===0)return;const n=t[0],i=t[t.length-1];if(e<n.t-k.HOLD_MS||e>i.t+k.HOLD_MS)return;const o=t.findIndex(u=>u.t>e),s=o===0?t[0]:t[(o===-1?t.length:o)-1],r=o===-1||o===0?s:t[o],h=k.atLevel(s,a),c=k.atLevel(r,a);if(!h||!c)return;const d=r.t>s.t?Math.min(1,Math.max(0,(e-s.t)/(r.t-s.t))):0,l=(u,p)=>u+(p-u)*d;return{pressureHpa:a,temperatureC:l(h.temperatureC,c.temperatureC),relativeHumidity:l(h.relativeHumidity,c.relativeHumidity),driftEastMs:l(h.driftEastMs,c.driftEastMs),driftNorthMs:l(h.driftNorthMs,c.driftNorthMs),shearPerS:l(h.shearPerS,c.shearPerS)}}static atLevel(t,e){const a=t.levels;for(let n=0;n+1<a.length;n++){const i=a[n],o=a[n+1];if(e>i.pressureHpa||e<o.pressureHpa)continue;const s=(Math.log(i.pressureHpa)-Math.log(e))/(Math.log(i.pressureHpa)-Math.log(o.pressureHpa)),r=(u,p)=>u+(p-u)*s,h=u=>{const p=u.windFromDeg*k.DEG;return{east:-u.windSpeedMs*Math.sin(p),north:-u.windSpeedMs*Math.cos(p)}},c=h(i),d=h(o),l=k.GAS_CONSTANT_OVER_GRAVITY*((i.temperatureC+o.temperatureC)/2+273.15)*Math.log(i.pressureHpa/o.pressureHpa);return{pressureHpa:e,temperatureC:r(i.temperatureC,o.temperatureC),relativeHumidity:r(i.relativeHumidity,o.relativeHumidity),driftEastMs:r(c.east,d.east),driftNorthMs:r(c.north,d.north),shearPerS:Math.hypot(d.east-c.east,d.north-c.north)/l}}}}class Ft{static plan(t,e,a,n){if(a.length===0)return[];const i=[];for(const o of t.objects){const s=t.flights.get(o.id),r=o.track;if(!s||!r||r.length!==s.points.length)continue;const h=e?.get(K.keyOf(s))??N.of(void 0),c=q.efficiencyOf(h.kind);if(c===void 0)continue;const d=[];r.forEach((l,u)=>{const p=s.points[u],m=M.pressureAtAltitudeFt(p.altitudeFt),A=k.at(a,n+l.t,m),b=A&&M.evaluate(A,c);d.push({tMs:l.t,eastM:l.eastM,northM:l.northM,upM:l.altitudeM??0,forms:b?.forms??!1,persistent:b?.persistent??!1,lifetimeS:b?J.lifetimeS(b.iceRelativeHumidity):0,driftEastMs:A?.driftEastMs??0,driftNorthMs:A?.driftNorthMs??0,shearPerS:A?.shearPerS??J.TYPICAL_SHEAR_PER_S,iceRelativeHumidity:b?.iceRelativeHumidity??0})}),d.some((l,u)=>l.forms&&d[u+1]?.forms)&&i.push({id:o.id,spanM:h.spanM,points:d})}return i}}const ot=[500,400,300,250,200,150],Nt=["temperature","relative_humidity","wind_speed","wind_direction"],yt="2022-01-01",ct=.25;class kt{fetchImpl;baseUrl;cache=new Map;constructor(t={}){this.fetchImpl=t.fetchImpl??fetch.bind(globalThis),this.baseUrl=t.baseUrl??"https://historical-forecast-api.open-meteo.com/v1/forecast"}between(t,e,a){const n=new Date(e).toISOString().slice(0,10);if(n<yt)return Promise.resolve({status:"outside"});const i=new Date(a).toISOString().slice(0,10),s=`${`${Math.round(t.lat/ct)},${Math.round(t.lng/ct)}`}|${n}|${i}`;let r=this.cache.get(s);return r||(r=this.read(t,n,i),this.cache.set(s,r),r.then(h=>{h.status==="failed"&&this.cache.delete(s)})),r}async read(t,e,a){const n=ot.flatMap(s=>Nt.map(r=>`${r}_${s}hPa`)),i=new URLSearchParams({latitude:String(t.lat),longitude:String(t.lng),start_date:e,end_date:a,hourly:n.join(","),wind_speed_unit:"ms",timezone:"UTC"}),o=`${this.baseUrl}?${i}`;try{const s=await this.fetchImpl(o);if(!s.ok)return{status:"failed"};const r=await s.json();return this.decode(r,{id:"open-meteo-forecast",name:"Open-Meteo (historical forecast)",url:o})}catch{return{status:"failed"}}}decode(t,e){const a=t.hourly;if(!a?.time)return{status:"outside"};const n=[];return a.time.forEach((i,o)=>{const s=[];for(const r of ot){const h=p=>a[`${p}_${r}hPa`]?.[o],c=h("temperature"),d=h("relative_humidity"),l=h("wind_speed"),u=h("wind_direction");if([c,d,l,u].some(p=>p==null))return;s.push({pressureHpa:r,temperatureC:c,relativeHumidity:d/100,windSpeedMs:l,windFromDeg:u})}n.push({t:Date.parse(`${i}Z`),levels:s})}),n.length>0?{status:"found",samples:n,source:e}:{status:"outside"}}}const Gt=[{id:"open-meteo-forecast",name:"Open-Meteo (historical forecast)",credit:"Weather data by Open-Meteo.com, CC BY 4.0",creditUrl:"https://open-meteo.com/en/docs/historical-forecast-api",create:()=>new kt}];class v{static DEFAULT_KIND="airliner-narrow";static STEP_MS=1e3;static LEAD_MS=12e4;static FT_PER_M=1/.3048;static ID_PREFIX="decor:";tracks=new Map;static kindOf(t,e){if(t.kind!=="aircraft"||!v.flies(t))return;const a=t.aircraftSound??e??v.DEFAULT_KIND;return a==="silent"?void 0:a}static flies(t){return(t.track??[]).some(e=>(e.altitudeM??0)>0)}voices(t,e,a,n={},i=()=>{}){const o=t.event.place?.[0];if(!o)return[];const s=new Map,r=new Map,h=Math.max(t.observerTrack.duration,(t.event.durationSeconds??0)*1e3);for(const c of t.decor){const d=v.kindOf(c,i(c));if(!d)continue;const l=`${v.ID_PREFIX}${c.id}`;s.set(l,this.trackOf(c,l,o,h)),r.set(l,d)}for(const c of this.tracks.keys())s.has(c)||this.tracks.delete(c);return s.size===0?[]:D.voices(new Set(s.keys()),s,new Map,c=>String(c.icao),a,e,{...n,kindOf:c=>r.get(c)})}trackOf(t,e,a,n){const i=JSON.stringify([t.track,t.eastM,t.northM,t.headingDeg,a.lat,a.lng,n]),o=this.tracks.get(e);if(o?.key===i)return o.track;const s=[];for(let l=0;l<=n;l+=v.STEP_MS)s.push(v.pointAt(t,l,a));(s.length===0||s[s.length-1].t<n)&&s.push(v.pointAt(t,n,a));const r=s[0],h=s[1]??r,c=l=>(h[l]-r[l])/(h.t-r.t||1);for(let l=v.STEP_MS*10;l<=v.LEAD_MS;l+=v.STEP_MS*10)s.unshift({t:-l,lat:r.lat-c("lat")*l,lng:r.lng-c("lng")*l,altitudeFt:Math.max(0,r.altitudeFt-c("altitudeFt")*l)});const d={icao:v.hash(e),nonIcao:!0,points:s};return this.tracks.set(e,{key:i,track:d}),d}static pointAt(t,e,a){const n=dt(t,e),i=X(n.eastM,-n.northM,a.lat,a.lng);return{t:e,lat:i.lat,lng:i.lng,altitudeFt:n.altitudeM*v.FT_PER_M}}static hash(t){let e=0;for(let a=0;a<t.length;a++)e=e*31+t.charCodeAt(a)>>>0;return e}}class F{static STEP_MS=250;static FT_PER_M=1/.3048;static ID_PREFIX="body:";tracks=new Map;static noiseOf(t){const e=g.noiseOfKind(t.kind),a=t.quieterDb??0;return a===0?e:{...e,id:`${e.id}-${a}dB`,soundPowerA:e.soundPowerA.map(n=>n-a)}}voices(t,e,a,n,i,o,s={}){const r=new Map,h=new Map,c=new Map;for(const l of t){if(!l.sound)continue;const u=`${F.ID_PREFIX}${l.id}`,p=this.trackOf(l,u,e,n,o);p&&(r.set(u,p),h.set(u,l.sound.kind),c.set(u,F.noiseOf(l.sound)))}for(const l of this.tracks.keys())r.has(l)||this.tracks.delete(l);if(r.size===0)return[];const d=X(a.eastM,-a.northM,n.lat,n.lng);return D.voices(new Set(r.keys()),r,new Map,l=>String(l.icao),{lat:d.lat,lng:d.lng,heightM:a.upM},i,{...s,kindOf:l=>h.get(l),noiseOf:l=>c.get(l)})}trackOf(t,e,a,n,i){const o=`${n.lat},${n.lng},${i}`,s=this.tracks.get(e);if(s&&s.body===t&&s.origin===o)return s.track;const r=[];for(let c=-12e4;c<=i;c+=F.STEP_MS){const d=a(t,c);if(!d)continue;const l=X(d.eastM,-d.northM,n.lat,n.lng);r.push({t:c,lat:l.lat,lng:l.lng,altitudeFt:d.upM*F.FT_PER_M})}if(r.length<2)return;const h={icao:F.hash(e),nonIcao:!0,points:r};return this.tracks.set(e,{body:t,origin:o,track:h}),h}static hash(t){let e=0;for(let a=0;a<t.length;a++)e=e*31+t.charCodeAt(a)>>>0;return e}}export{$ as AircraftAudio,Ft as AircraftContrails,N as AircraftModels,I as AmbientNoise,F as BodyHearing,v as DecorAircraftHearing,E as TrafficDecor,Lt as TrafficInfos,D as TrafficSound,z as TrafficTooltip,Gt as UPPER_AIR_SOURCES};
@@ -1 +0,0 @@
1
- import{R as _,Q as m,X as C,G as H,B as V,h as L,b as W,N as F,O as Y,Y as k}from"./rr0-sighting.mjs";class y{static DEFAULT_DIVERGENCE_MRAD=.1;static DEFAULT_APERTURE_M=.01;static AEROSOL_SINGLE_SCATTERING_ALBEDO=.9;static AEROSOL_ASYMMETRY=.7;static STEP_M=25;static MAX_SAMPLES=2e3;static viewsAt(t,s,e,n){return y.onAt(t,s).map(o=>({id:o.id,wavelengthNm:o.wavelengthNm,samples:y.samplesOf(o,e,n)}))}static onAt(t,s){return t.filter(e=>e.path.length>=2&&(e.fromT===void 0||s>=e.fromT)&&(e.untilT===void 0||s<=e.untilT))}static samplesOf(t,s,e){const n=_.ecef({lat:s.lat,lng:s.lng,heightM:0}),o=s.lat*Math.PI/180,c=s.lng*Math.PI/180,i=z=>{const x=z[0]-n[0],E=z[1]-n[1],u=z[2]-n[2];return[-Math.sin(c)*x+Math.cos(c)*E,-Math.sin(o)*Math.cos(c)*x-Math.sin(o)*Math.sin(c)*E+Math.cos(o)*u,Math.cos(o)*Math.cos(c)*x+Math.cos(o)*Math.sin(c)*E+Math.sin(o)*u]},M=(t.divergenceMrad??y.DEFAULT_DIVERGENCE_MRAD)/1e3,h=t.apertureM??y.DEFAULT_APERTURE_M,l=[];let p=0,T=t.powerW,O=0;for(let z=0;z+1<t.path.length;z++){const x=t.path[z],E=t.path[z+1],u=_.ecef({lat:x.lat,lng:x.lng,heightM:x.altitudeM}),d=_.ecef({lat:E.lat,lng:E.lng,heightM:E.altitudeM}),P=Math.hypot(d[0]-u[0],d[1]-u[1],d[2]-u[2]),g=Math.max(1,Math.min(y.MAX_SAMPLES,Math.ceil(P/y.STEP_M)));for(let S=z===0?0:1;S<=g;S++){const I=S/g,G=[0,1,2].map(A=>u[A]+(d[A]-u[A])*I),a=I*P,f=x.altitudeM+(E.altitudeM-x.altitudeM)*I+y.bulgeM(a,P);if(S>0){const A=l[l.length-1],w=a+p-A.fromSourceM,D=y.extinctionAt(e,t.wavelengthNm,(A.altitudeM+f)/2);O+=D*w,T=t.powerW*Math.exp(-O)}const[v,N,r]=i(G);l.push({eastM:v,northM:N,upM:r,altitudeM:f,fromSourceM:p+a,widthM:h+M*(p+a),powerW:T})}p+=P}return l}static bulgeM(t,s){return t*(s-t)/(2*6371e3)}static extinctionAt(t,s,e){const{rayleighPerM:n,aerosolPerM:o}=y.coefficientsAt(t,s,e);return n+o}static coefficientsAt(t,s,e){const n=m.rayleighAt(s)*m.rayleighDensity(e),o=t.aerosol[1]*(s/550)**-1.3*m.aerosolDensity(e);return{rayleighPerM:n,aerosolPerM:o}}static phasedScattering(t,s){const e=3/(16*Math.PI)*(1+s*s),n=y.AEROSOL_ASYMMETRY,o=(1-n*n)/(4*Math.PI*(1+n*n-2*n*s)**1.5);return t.rayleighPerM*e+t.aerosolPerM*y.AEROSOL_SINGLE_SCATTERING_ALBEDO*o}static efficacy(t){return 683*Math.max(0,C.colourMatching(t)[1])}static colourOf(t){const[s,e,n]=C.colourMatching(t);if(e<=0)return[0,0,0];const o=C.linearSrgbOf([s/e,1,n/e]).map(i=>Math.max(0,i)),c=.2126*o[0]+.7152*o[1]+.0722*o[2];return o.map(i=>i/c)}static luminanceCdM2(t,s,e,n,o){return y.efficacy(s)*t*e/(n*Math.max(o,.001))}}class R{static MAX_SEGMENTS=6e3;static MIN_PIXELS=2;static VERTICES_PER_SEGMENT=24;static HALO_RAD=.002;static HALO_SHARE=.15;static BRIGHTEST_RELATIVE=6e4;group=new H;mesh;positions=new Float32Array(R.MAX_SEGMENTS*R.VERTICES_PER_SEGMENT*3);colors=new Float32Array(R.MAX_SEGMENTS*R.VERTICES_PER_SEGMENT*3);segments=0;drawn=[];cut;constructor(){const t=new V;t.setAttribute("position",new L(this.positions,3)),t.setAttribute("color",new L(this.colors,3)),t.setDrawRange(0,0),this.mesh=new W(t,new F({vertexColors:!0,transparent:!0,blending:k,depthWrite:!1,fog:!1,side:Y})),this.mesh.frustumCulled=!1,this.mesh.renderOrder=8,this.mesh.name="beams",this.group.name="beams",this.group.add(this.mesh)}get segmentCount(){return this.segments}update(t,s,e){const n=this.viewsOf(t,s,e);let o=0;this.segments=0,this.drawn=[];for(const i of n){const M=y.colourOf(i.wavelengthNm),h=this.place(i,e);this.drawn.push({id:i.id,points:h});for(let l=0;l+1<h.length&&!(this.segments>=R.MAX_SEGMENTS);l++){const p=this.pushSegment(o,h[l],h[l+1],i.wavelengthNm,M,e);p>o&&this.segments++,o=p}}const c=this.mesh.geometry;c.setDrawRange(0,o);for(const i of["position","color"]){const M=c.getAttribute(i);M.clearUpdateRanges(),o>0&&M.addUpdateRange(0,o*3),M.needsUpdate=!0}}viewsOf(t,s,e){const{lat:n,lng:o}=e.reference;(!this.cut||this.cut.lat!==n||this.cut.lng!==o||this.cut.air!==e.air)&&(this.cut={lat:n,lng:o,air:e.air,views:new Map});const c=this.cut.views;return y.onAt(t,s).map(i=>{let M=c.get(i);return M||c.set(i,M={id:i.id,wavelengthNm:i.wavelengthNm,samples:y.samplesOf(i,e.reference,e.air)}),M})}place(t,s){const e=[];for(const n of t.samples){const o=s.origin.x+n.eastM*s.eastScale,c=s.origin.z-n.northM,i=n.upM-s.siteElevationM;if(e.length>0&&i<s.groundYAt(o,c))break;e.push({x:o,y:i,z:c,altitudeM:n.altitudeM,widthM:n.widthM,powerW:n.powerW})}return e}pushSegment(t,s,e,n,o,c){const i={x:e.x-s.x,y:e.y-s.y,z:e.z-s.z},M=Math.hypot(i.x,i.y,i.z);if(M<1e-6)return t;const h={x:i.x/M,y:i.y/M,z:i.z/M},l={x:(s.x+e.x)/2,y:(s.y+e.y)/2,z:(s.z+e.z)/2},p={x:c.eye.x-l.x,y:c.eye.y-l.y,z:c.eye.z-l.z},T=Math.hypot(p.x,p.y,p.z);if(T<.001)return t;const O=(h.x*p.x+h.y*p.y+h.z*p.z)/T,z=Math.sqrt(Math.max(0,1-O*O)),x=y.coefficientsAt(c.air,n,(s.altitudeM+e.altitudeM)/2),E=y.phasedScattering(x,O),u=c.transmittanceTo(l.x,l.y,l.z),d=a=>R.MIN_PIXELS*c.pixelRad*Math.hypot(a.x-c.eye.x,a.y-c.eye.y,a.z-c.eye.z),P=a=>Math.hypot(a.x-c.eye.x,a.y-c.eye.y,a.z-c.eye.z),g=a=>Math.max(a.widthM,R.HALO_RAD*P(a)),S=a=>g(a)>d(a)?R.HALO_SHARE:0,I=(a,f,v)=>{const N=Math.max(f,d(a)),r=2*v*y.luminanceCdM2(a.powerW,n,E,N,z),A=o.map((U,X)=>Math.min(R.BRIGHTEST_RELATIVE,r*c.relativeScale*U*u[X])),w={x:c.eye.x-a.x,y:c.eye.y-a.y,z:c.eye.z-a.z},D=this.normalise(this.cross(i,w));return{point:a,half:N/2,level:A,across:D}},G=[[I(s,s.widthM,1-S(s)),I(e,e.widthM,1-S(e))],[I(s,g(s),S(s)),I(e,g(e),S(e))]];for(const a of G){if(a.every(r=>Math.max(...r.level)<=0))continue;const f=(r,A)=>{const w=t*3;this.positions[w]=r.point.x+r.across.x*r.half*A,this.positions[w+1]=r.point.y+r.across.y*r.half*A,this.positions[w+2]=r.point.z+r.across.z*r.half*A;const D=A===0?1:0;this.colors[w]=r.level[0]*D,this.colors[w+1]=r.level[1]*D,this.colors[w+2]=r.level[2]*D,t++},[v,N]=a;for(const r of[-1,1])f(v,r),f(v,0),f(N,r),f(v,0),f(N,0),f(N,r)}return t}pickAt(t,s,e){let n;for(const o of this.drawn)for(let c=0;c+1<o.points.length;c++){const i=o.points[c],M=o.points[c+1],h={x:M.x-i.x,y:M.y-i.y,z:M.z-i.z},l={x:i.x-t.x,y:i.y-t.y,z:i.z-t.z},p=h.x*h.x+h.y*h.y+h.z*h.z,T=h.x*s.x+h.y*s.y+h.z*s.z,O=h.x*l.x+h.y*l.y+h.z*l.z,z=s.x*l.x+s.y*l.y+s.z*l.z,x=p-T*T,E=x>1e-9?Math.min(1,Math.max(0,(T*z-O)/x)):0,u={x:i.x+h.x*E,y:i.y+h.y*E,z:i.z+h.z*E},d=(u.x-t.x)*s.x+(u.y-t.y)*s.y+(u.z-t.z)*s.z;if(d<=0)continue;const P=Math.hypot(u.x-t.x-s.x*d,u.y-t.y-s.y*d,u.z-t.z-s.z*d),g=Math.atan2(P,d);g<=e&&(!n||g<n.angle)&&(n={id:o.id,distanceM:Math.hypot(u.x-t.x,u.y-t.y,u.z-t.z),angle:g})}return n&&{id:n.id,distanceM:n.distanceM}}cross(t,s){return{x:t.y*s.z-t.z*s.y,y:t.z*s.x-t.x*s.z,z:t.x*s.y-t.y*s.x}}normalise(t){const s=Math.hypot(t.x,t.y,t.z)||1;return{x:t.x/s,y:t.y/s,z:t.z/s}}dispose(){this.mesh.geometry.dispose(),this.mesh.material.dispose(),this.group.removeFromParent()}}export{R as BeamSystem};
@@ -1 +0,0 @@
1
- class I{static FORMATION_S=.3;static DIFFUSION_M_PER_S=.2;static TYPICAL_SHEAR_PER_S=.003;static INITIAL_DEPTH_M=150;static DEEPENING_M_PER_S=.1;static YOUNG_OPTICAL_DEPTH=.5;static DILUTION_EXPONENT=.75;static MIXING_S=1500;static INVISIBLE=.006;static MIN_LIFETIME_S=15;static LIFETIME_SPAN_S=120;static widthM(t,E,_=I.TYPICAL_SHEAR_PER_S){const s=Math.max(0,E),N=_*(I.INITIAL_DEPTH_M*s+I.DEEPENING_M_PER_S*s*s/2);return t+I.DIFFUSION_M_PER_S*s+N}static lifetimeS(t){const E=Math.min(1,Math.max(0,t));return I.MIN_LIFETIME_S+I.LIFETIME_SPAN_S*E*E}static opacity(t,E){if(t<I.FORMATION_S)return 0;let _;if(E.persistent){const N=(E.spanM/I.widthM(E.spanM,t,E.shearPerS))**I.DILUTION_EXPONENT;_=I.YOUNG_OPTICAL_DEPTH*N*Math.exp(-t/I.MIXING_S)}else{if(t>=E.lifetimeS)return 0;_=I.YOUNG_OPTICAL_DEPTH*(1-t/E.lifetimeS)**2}const s=1-Math.exp(-_);return s<I.INVISIBLE?0:s}}export{I as C};
@@ -1 +0,0 @@
1
- import{G as T,B as A,h as R,b as w,N as O,O as G}from"./rr0-sighting.mjs";import{C as S}from"./ContrailGrowth-CuAzwIoc.js";class f{static MAX_SEGMENTS=4e3;static MIN_PIXELS=2;static UNRESOLVED_CONTRAST=.5;static VERTICES_PER_SEGMENT=12;object;group=new T;trails=[];positions=new Float32Array(f.MAX_SEGMENTS*f.VERTICES_PER_SEGMENT*3);colors=new Float32Array(f.MAX_SEGMENTS*f.VERTICES_PER_SEGMENT*4);segments=0;constructor(){const t=new A;t.setAttribute("position",new R(this.positions,3)),t.setAttribute("color",new R(this.colors,4)),t.setDrawRange(0,0),this.object=new w(t,new O({vertexColors:!0,transparent:!0,depthWrite:!1,side:G})),this.object.frustumCulled=!1,this.object.name="contrails",this.group.name="contrails",this.group.add(this.object)}get segmentCount(){return this.segments}set(t){this.trails=t}update(t,s,r){let h=0;this.segments=0;for(const n of this.trails){const a=this.samplesOf(n,t,s),e=r(n.id);for(let c=0;c+1<a.length;c++){const o=a[c],p=a[c+1];if(!o.forms||!p.forms)continue;if(this.segments>=f.MAX_SEGMENTS)break;const l=this.pushSegment(h,o,p,n.spanM,e,s);l>h&&this.segments++,h=l}}const u=this.object.geometry;u.setDrawRange(0,h);for(const[n,a]of[["position",3],["color",4]]){const e=u.getAttribute(n);e.clearUpdateRanges(),h>0&&e.addUpdateRange(0,h*a),e.needsUpdate=!0}}samplesOf(t,s,r){const h=s-S.FORMATION_S*1e3,u=[],n=(o,p,l,d,m,y)=>({x:p+o.driftEastMs*m+r.origin.x,y:d,z:-(l+o.driftNorthMs*m)+r.origin.z,age:m,forms:y,point:o});let a=-1;t.points.forEach((o,p)=>{o.tMs>h||(a=p,u.push(n(o,o.eastM,o.northM,o.upM,(s-o.tMs)/1e3,o.forms)))});const e=t.points[a],c=t.points[a+1];if(e&&c){const o=(h-e.tMs)/(c.tMs-e.tMs),p=(l,d)=>l+(d-l)*o;u.push(n(e,p(e.eastM,c.eastM),p(e.northM,c.northM),p(e.upM,c.upM),S.FORMATION_S,e.forms&&c.forms))}return u}pushSegment(t,s,r,h,u,n){const a={persistent:s.point.persistent,lifetimeS:s.point.lifetimeS,spanM:h,shearPerS:s.point.shearPerS},e=S.opacity(s.age,a),c=S.opacity(r.age,a);if(e<=0&&c<=0)return t;const o={x:r.x-s.x,y:r.y-s.y,z:r.z-s.z};if(Math.hypot(o.x,o.y,o.z)<1e-6)return t;const p={x:(s.x+r.x)/2-n.eye.x,y:(s.y+r.y)/2-n.eye.y,z:(s.z+r.z)/2-n.eye.z},l=this.normalise(this.cross(o,p)),d=(i,M)=>{const g=Math.hypot(i.x-n.eye.x,i.y-n.eye.y,i.z-n.eye.z),E=S.widthM(h,i.age,i.point.shearPerS),N=Math.max(E,f.MIN_PIXELS*n.pixelRad*g);return{half:N/2,alpha:M*(E/N)**f.UNRESOLVED_CONTRAST}},m=[{sample:s,...d(s,e)},{sample:r,...d(r,c)}],y=(i,M)=>{const g=t*3;this.positions[g]=i.sample.x+l.x*i.half*M,this.positions[g+1]=i.sample.y+l.y*i.half*M,this.positions[g+2]=i.sample.z+l.z*i.half*M;const E=t*4;this.colors[E]=u[0],this.colors[E+1]=u[1],this.colors[E+2]=u[2],this.colors[E+3]=M===0?i.alpha:0,t++},[x,z]=m;for(const[i,M]of[[-1,0],[1,0]])y(x,i),y(x,M),y(z,i),y(x,M),y(z,M),y(z,i);return t}cross(t,s){return{x:t.y*s.z-t.z*s.y,y:t.z*s.x-t.x*s.z,z:t.x*s.y-t.y*s.x}}normalise(t){const s=Math.hypot(t.x,t.y,t.z)||1;return{x:t.x/s,y:t.y/s,z:t.z/s}}dispose(){this.object.geometry.dispose(),this.object.material.dispose(),this.group.removeFromParent()}}export{f as ContrailSystem};
@@ -1 +0,0 @@
1
- import{Y as P,aj as X,al as O,a0 as D,aF as V,aG as W,aH as F}from"./rr0-sighting-editor.mjs";import{L as A}from"./LaserBeam-B6u7y0-E.js";class z{static MAX_SEGMENTS=6e3;static MIN_PIXELS=2;static VERTICES_PER_SEGMENT=24;static HALO_RAD=.002;static HALO_SHARE=.15;static BRIGHTEST_RELATIVE=6e4;group=new P;mesh;positions=new Float32Array(z.MAX_SEGMENTS*z.VERTICES_PER_SEGMENT*3);colors=new Float32Array(z.MAX_SEGMENTS*z.VERTICES_PER_SEGMENT*3);segments=0;drawn=[];cut;constructor(){const s=new X;s.setAttribute("position",new O(this.positions,3)),s.setAttribute("color",new O(this.colors,3)),s.setDrawRange(0,0),this.mesh=new D(s,new V({vertexColors:!0,transparent:!0,blending:F,depthWrite:!1,fog:!1,side:W})),this.mesh.frustumCulled=!1,this.mesh.renderOrder=8,this.mesh.name="beams",this.group.name="beams",this.group.add(this.mesh)}get segmentCount(){return this.segments}update(s,t,n){const h=this.viewsOf(s,t,n);let r=0;this.segments=0,this.drawn=[];for(const e of h){const l=A.colourOf(e.wavelengthNm),i=this.place(e,n);this.drawn.push({id:e.id,points:i});for(let y=0;y+1<i.length&&!(this.segments>=z.MAX_SEGMENTS);y++){const x=this.pushSegment(r,i[y],i[y+1],e.wavelengthNm,l,n);x>r&&this.segments++,r=x}}const o=this.mesh.geometry;o.setDrawRange(0,r);for(const e of["position","color"]){const l=o.getAttribute(e);l.clearUpdateRanges(),r>0&&l.addUpdateRange(0,r*3),l.needsUpdate=!0}}viewsOf(s,t,n){const{lat:h,lng:r}=n.reference;(!this.cut||this.cut.lat!==h||this.cut.lng!==r||this.cut.air!==n.air)&&(this.cut={lat:h,lng:r,air:n.air,views:new Map});const o=this.cut.views;return A.onAt(s,t).map(e=>{let l=o.get(e);return l||o.set(e,l={id:e.id,wavelengthNm:e.wavelengthNm,samples:A.samplesOf(e,n.reference,n.air)}),l})}place(s,t){const n=[];for(const h of s.samples){const r=t.origin.x+h.eastM*t.eastScale,o=t.origin.z-h.northM,e=h.upM-t.siteElevationM;if(n.length>0&&e<t.groundYAt(r,o))break;n.push({x:r,y:e,z:o,altitudeM:h.altitudeM,widthM:h.widthM,powerW:h.powerW})}return n}pushSegment(s,t,n,h,r,o){const e={x:n.x-t.x,y:n.y-t.y,z:n.z-t.z},l=Math.hypot(e.x,e.y,e.z);if(l<1e-6)return s;const i={x:e.x/l,y:e.y/l,z:e.z/l},y={x:(t.x+n.x)/2,y:(t.y+n.y)/2,z:(t.z+n.z)/2},x={x:o.eye.x-y.x,y:o.eye.y-y.y,z:o.eye.z-y.z},E=Math.hypot(x.x,x.y,x.z);if(E<.001)return s;const S=(i.x*x.x+i.y*x.y+i.z*x.z)/E,I=Math.sqrt(Math.max(0,1-S*S)),v=A.coefficientsAt(o.air,h,(t.altitudeM+n.altitudeM)/2),T=A.phasedScattering(v,S),u=o.transmittanceTo(y.x,y.y,y.z),p=c=>z.MIN_PIXELS*o.pixelRad*Math.hypot(c.x-o.eye.x,c.y-o.eye.y,c.z-o.eye.z),L=c=>Math.hypot(c.x-o.eye.x,c.y-o.eye.y,c.z-o.eye.z),d=c=>Math.max(c.widthM,z.HALO_RAD*L(c)),G=c=>d(c)>p(c)?z.HALO_SHARE:0,N=(c,M,R)=>{const g=Math.max(M,p(c)),a=2*R*A.luminanceCdM2(c.powerW,h,T,g,I),f=r.map((_,C)=>Math.min(z.BRIGHTEST_RELATIVE,a*o.relativeScale*_*u[C])),w={x:o.eye.x-c.x,y:o.eye.y-c.y,z:o.eye.z-c.z},m=this.normalise(this.cross(e,w));return{point:c,half:g/2,level:f,across:m}},H=[[N(t,t.widthM,1-G(t)),N(n,n.widthM,1-G(n))],[N(t,d(t),G(t)),N(n,d(n),G(n))]];for(const c of H){if(c.every(a=>Math.max(...a.level)<=0))continue;const M=(a,f)=>{const w=s*3;this.positions[w]=a.point.x+a.across.x*a.half*f,this.positions[w+1]=a.point.y+a.across.y*a.half*f,this.positions[w+2]=a.point.z+a.across.z*a.half*f;const m=f===0?1:0;this.colors[w]=a.level[0]*m,this.colors[w+1]=a.level[1]*m,this.colors[w+2]=a.level[2]*m,s++},[R,g]=c;for(const a of[-1,1])M(R,a),M(R,0),M(g,a),M(R,0),M(g,0),M(g,a)}return s}pickAt(s,t,n){let h;for(const r of this.drawn)for(let o=0;o+1<r.points.length;o++){const e=r.points[o],l=r.points[o+1],i={x:l.x-e.x,y:l.y-e.y,z:l.z-e.z},y={x:e.x-s.x,y:e.y-s.y,z:e.z-s.z},x=i.x*i.x+i.y*i.y+i.z*i.z,E=i.x*t.x+i.y*t.y+i.z*t.z,S=i.x*y.x+i.y*y.y+i.z*y.z,I=t.x*y.x+t.y*y.y+t.z*y.z,v=x-E*E,T=v>1e-9?Math.min(1,Math.max(0,(E*I-S)/v)):0,u={x:e.x+i.x*T,y:e.y+i.y*T,z:e.z+i.z*T},p=(u.x-s.x)*t.x+(u.y-s.y)*t.y+(u.z-s.z)*t.z;if(p<=0)continue;const L=Math.hypot(u.x-s.x-t.x*p,u.y-s.y-t.y*p,u.z-s.z-t.z*p),d=Math.atan2(L,p);d<=n&&(!h||d<h.angle)&&(h={id:r.id,distanceM:Math.hypot(u.x-s.x,u.y-s.y,u.z-s.z),angle:d})}return h&&{id:h.id,distanceM:h.distanceM}}cross(s,t){return{x:s.y*t.z-s.z*t.y,y:s.z*t.x-s.x*t.z,z:s.x*t.y-s.y*t.x}}normalise(s){const t=Math.hypot(s.x,s.y,s.z)||1;return{x:s.x/t,y:s.y/t,z:s.z/t}}dispose(){this.mesh.geometry.dispose(),this.mesh.material.dispose(),this.group.removeFromParent()}}export{z as BeamSystem};
@@ -1 +0,0 @@
1
- class I{static FORMATION_S=.3;static DIFFUSION_M_PER_S=.2;static TYPICAL_SHEAR_PER_S=.003;static INITIAL_DEPTH_M=150;static DEEPENING_M_PER_S=.1;static YOUNG_OPTICAL_DEPTH=.5;static DILUTION_EXPONENT=.75;static MIXING_S=1500;static INVISIBLE=.006;static MIN_LIFETIME_S=15;static LIFETIME_SPAN_S=120;static widthM(t,E,_=I.TYPICAL_SHEAR_PER_S){const s=Math.max(0,E),N=_*(I.INITIAL_DEPTH_M*s+I.DEEPENING_M_PER_S*s*s/2);return t+I.DIFFUSION_M_PER_S*s+N}static lifetimeS(t){const E=Math.min(1,Math.max(0,t));return I.MIN_LIFETIME_S+I.LIFETIME_SPAN_S*E*E}static opacity(t,E){if(t<I.FORMATION_S)return 0;let _;if(E.persistent){const N=(E.spanM/I.widthM(E.spanM,t,E.shearPerS))**I.DILUTION_EXPONENT;_=I.YOUNG_OPTICAL_DEPTH*N*Math.exp(-t/I.MIXING_S)}else{if(t>=E.lifetimeS)return 0;_=I.YOUNG_OPTICAL_DEPTH*(1-t/E.lifetimeS)**2}const s=1-Math.exp(-_);return s<I.INVISIBLE?0:s}}export{I as C};
@@ -1 +0,0 @@
1
- import{Y as T,aj as A,al as N,a0 as w,aF as G,aG as O}from"./rr0-sighting-editor.mjs";import{C as S}from"./ContrailGrowth-CuAzwIoc.js";class f{static MAX_SEGMENTS=4e3;static MIN_PIXELS=2;static UNRESOLVED_CONTRAST=.5;static VERTICES_PER_SEGMENT=12;object;group=new T;trails=[];positions=new Float32Array(f.MAX_SEGMENTS*f.VERTICES_PER_SEGMENT*3);colors=new Float32Array(f.MAX_SEGMENTS*f.VERTICES_PER_SEGMENT*4);segments=0;constructor(){const t=new A;t.setAttribute("position",new N(this.positions,3)),t.setAttribute("color",new N(this.colors,4)),t.setDrawRange(0,0),this.object=new w(t,new G({vertexColors:!0,transparent:!0,depthWrite:!1,side:O})),this.object.frustumCulled=!1,this.object.name="contrails",this.group.name="contrails",this.group.add(this.object)}get segmentCount(){return this.segments}set(t){this.trails=t}update(t,s,r){let a=0;this.segments=0;for(const n of this.trails){const h=this.samplesOf(n,t,s),e=r(n.id);for(let c=0;c+1<h.length;c++){const o=h[c],p=h[c+1];if(!o.forms||!p.forms)continue;if(this.segments>=f.MAX_SEGMENTS)break;const l=this.pushSegment(a,o,p,n.spanM,e,s);l>a&&this.segments++,a=l}}const u=this.object.geometry;u.setDrawRange(0,a);for(const[n,h]of[["position",3],["color",4]]){const e=u.getAttribute(n);e.clearUpdateRanges(),a>0&&e.addUpdateRange(0,a*h),e.needsUpdate=!0}}samplesOf(t,s,r){const a=s-S.FORMATION_S*1e3,u=[],n=(o,p,l,d,m,y)=>({x:p+o.driftEastMs*m+r.origin.x,y:d,z:-(l+o.driftNorthMs*m)+r.origin.z,age:m,forms:y,point:o});let h=-1;t.points.forEach((o,p)=>{o.tMs>a||(h=p,u.push(n(o,o.eastM,o.northM,o.upM,(s-o.tMs)/1e3,o.forms)))});const e=t.points[h],c=t.points[h+1];if(e&&c){const o=(a-e.tMs)/(c.tMs-e.tMs),p=(l,d)=>l+(d-l)*o;u.push(n(e,p(e.eastM,c.eastM),p(e.northM,c.northM),p(e.upM,c.upM),S.FORMATION_S,e.forms&&c.forms))}return u}pushSegment(t,s,r,a,u,n){const h={persistent:s.point.persistent,lifetimeS:s.point.lifetimeS,spanM:a,shearPerS:s.point.shearPerS},e=S.opacity(s.age,h),c=S.opacity(r.age,h);if(e<=0&&c<=0)return t;const o={x:r.x-s.x,y:r.y-s.y,z:r.z-s.z};if(Math.hypot(o.x,o.y,o.z)<1e-6)return t;const p={x:(s.x+r.x)/2-n.eye.x,y:(s.y+r.y)/2-n.eye.y,z:(s.z+r.z)/2-n.eye.z},l=this.normalise(this.cross(o,p)),d=(i,M)=>{const g=Math.hypot(i.x-n.eye.x,i.y-n.eye.y,i.z-n.eye.z),E=S.widthM(a,i.age,i.point.shearPerS),R=Math.max(E,f.MIN_PIXELS*n.pixelRad*g);return{half:R/2,alpha:M*(E/R)**f.UNRESOLVED_CONTRAST}},m=[{sample:s,...d(s,e)},{sample:r,...d(r,c)}],y=(i,M)=>{const g=t*3;this.positions[g]=i.sample.x+l.x*i.half*M,this.positions[g+1]=i.sample.y+l.y*i.half*M,this.positions[g+2]=i.sample.z+l.z*i.half*M;const E=t*4;this.colors[E]=u[0],this.colors[E+1]=u[1],this.colors[E+2]=u[2],this.colors[E+3]=M===0?i.alpha:0,t++},[x,z]=m;for(const[i,M]of[[-1,0],[1,0]])y(x,i),y(x,M),y(z,i),y(x,M),y(z,M),y(z,i);return t}cross(t,s){return{x:t.y*s.z-t.z*s.y,y:t.z*s.x-t.x*s.z,z:t.x*s.y-t.y*s.x}}normalise(t){const s=Math.hypot(t.x,t.y,t.z)||1;return{x:t.x/s,y:t.y/s,z:t.z/s}}dispose(){this.object.geometry.dispose(),this.object.material.dispose(),this.group.removeFromParent()}}export{f as ContrailSystem};
@@ -1,13 +0,0 @@
1
- import{L as p,q as c,U as m,v as g,o as d,n as u,p as f,u as v}from"./rr0-sighting-editor.mjs";import{launchEditorMessages_en as h}from"./LaunchEditorMessages_en-BzymQ_VU.js";class i{static plumeValue(e){return t=>p.plumeOf(t)[e]}static plume(e,t){return{type:"number",key:`plume.${e}`,effective:i.plumeValue(e),...t}}static burn(e,t){return{type:"number",key:e,min:-3600,max:36e3,step:.1,unit:"s",scale:.001,label:t.label,hint:t.hint,group:{en:"Engine",fr:"Moteur",es:"Motor",it:"Motore"},effective:s=>t.ends(s.track??[])?.t}}static nextPlace(e){const t=e[e.length-1]??{t:0,lat:0,lng:0,altitudeKm:0},s=e[e.length-2]??t,a=(n,l=0)=>e.length>1?t[n]-s[n]:l;return{t:t.t+(e.length>1?a("t"):1e4),lat:t.lat+a("lat"),lng:t.lng+a("lng"),altitudeKm:Math.max(0,t.altitudeKm+a("altitudeKm"))}}static SET={kind:"launch",title:{en:"Launch",fr:"Lancement",es:"Lanzamiento",it:"Lancio"},parameters:[{type:"said",key:"title",label:{en:"Name",fr:"Nom",es:"Nombre",it:"Nome"},group:{en:"Vehicle",fr:"Lanceur",es:"Lanzador",it:"Lanciatore"}},{type:"text",key:"vehicle.mission",label:{en:"Mission",fr:"Mission",es:"Misión",it:"Missione"},placeholder:"Starlink Group 10-49",group:{en:"Vehicle",fr:"Lanceur",es:"Lanzador",it:"Lanciatore"}},{type:"number",key:"vehicle.engine.thrustKN",min:1,max:1e5,step:1,unit:"kN",label:{en:"Thrust (vacuum)",fr:"Poussée (dans le vide)",es:"Empuje (en el vacío)",it:"Spinta (nel vuoto)"},hint:{en:"Merlin Vacuum 934, RL10 110, a solid booster several thousand. With the specific impulse, it sets how much exhaust leaves each second.",fr:"Merlin Vacuum 934, RL10 110, un booster à poudre plusieurs milliers. Avec l'impulsion spécifique, elle fixe le débit d'échappement.",es:"Merlin Vacuum 934, RL10 110, un propulsor sólido varios miles. Con el impulso específico, fija el caudal de escape.",it:"Merlin Vacuum 934, RL10 110, un booster solido diverse migliaia. Con l'impulso specifico, fissa la portata dello scarico."},group:{en:"Engine",fr:"Moteur",es:"Motor",it:"Motore"}},{type:"number",key:"vehicle.engine.specificImpulseS",min:100,max:500,step:1,unit:"s",label:{en:"Specific impulse (vacuum)",fr:"Impulsion spécifique (dans le vide)",es:"Impulso específico (en el vacío)",it:"Impulso specifico (nel vuoto)"},hint:{en:"Times 9.81 m/s² it is the exhaust velocity, which sets how fast the exhaust spreads round the stage: 348 s is 3.4 km/s.",fr:"Multipliée par 9,81 m/s², c'est la vitesse d'éjection, qui fixe la vitesse à laquelle l'échappement s'étale autour de l'étage : 348 s font 3,4 km/s.",es:"Multiplicado por 9,81 m/s² es la velocidad de escape, que fija la rapidez con que el escape se extiende alrededor de la etapa: 348 s son 3,4 km/s.",it:"Moltiplicato per 9,81 m/s² è la velocità di scarico, che fissa quanto in fretta lo scarico si allarga attorno allo stadio: 348 s sono 3,4 km/s."},group:{en:"Engine",fr:"Moteur",es:"Motor",it:"Motore"}},{type:"choice",key:"vehicle.engine.propellant",label:{en:"Propellant",fr:"Ergols",es:"Propelentes",it:"Propellenti"},hint:{en:"What the exhaust is made of decides how much of it turns into particles that scatter light.",fr:"Ce dont l'échappement est fait décide quelle part devient des particules qui diffusent la lumière.",es:"De qué está hecho el escape decide qué parte se vuelve partículas que difunden la luz.",it:"Di cosa è fatto lo scarico decide quanta parte diventa particelle che diffondono la luce."},choices:[{value:"rp1-lox",label:{en:"Kerosene and oxygen",fr:"Kérosène et oxygène",es:"Queroseno y oxígeno",it:"Cherosene e ossigeno"}},{value:"methane-lox",label:{en:"Methane and oxygen",fr:"Méthane et oxygène",es:"Metano y oxígeno",it:"Metano e ossigeno"}},{value:"hydrogen-lox",label:{en:"Hydrogen and oxygen",fr:"Hydrogène et oxygène",es:"Hidrógeno y oxígeno",it:"Idrogeno e ossigeno"}},{value:"hypergolic",label:{en:"Hypergolic",fr:"Hypergolique",es:"Hipergólico",it:"Ipergolico"}},{value:"solid",label:{en:"Solid",fr:"Poudre",es:"Sólido",it:"Solido"}}],group:{en:"Engine",fr:"Moteur",es:"Motor",it:"Motore"}},i.burn("burnFromT",{label:{en:"Engine start",fr:"Allumage du moteur",es:"Encendido del motor",it:"Accensione del motore"},hint:{en:"When the engine started, in seconds of the recording; it may be before it. Empty: the first point of the path.",fr:"Quand le moteur s'est allumé, en secondes de l'enregistrement ; avant lui si besoin. Vide : le premier point du chemin.",es:"Cuándo se encendió el motor, en segundos de la grabación; puede ser antes. Vacío: el primer punto de la trayectoria.",it:"Quando si è acceso il motore, in secondi della registrazione; può essere prima. Vuoto: il primo punto del percorso."},ends:e=>e[0]}),i.burn("burnUntilT",{label:{en:"Engine cut-off",fr:"Extinction du moteur",es:"Apagado del motor",it:"Spegnimento del motore"},hint:{en:"When the engine stopped, in seconds of the recording. Empty: the last point of the path. Nothing is let go after it.",fr:"Quand le moteur s'est éteint, en secondes de l'enregistrement. Vide : le dernier point du chemin. Rien n'est lâché après.",es:"Cuándo se apagó el motor, en segundos de la grabación. Vacío: el último punto de la trayectoria. Nada se suelta después.",it:"Quando si è spento il motore, in secondi della registrazione. Vuoto: l'ultimo punto del percorso. Dopo non si rilascia nulla."},ends:e=>e[e.length-1]}),i.plume("exhaustKgPerS",{min:.1,max:1e5,step:.1,unit:"kg/s",label:{en:"Exhaust flow",fr:"Débit d'échappement",es:"Caudal de escape",it:"Portata di scarico"},hint:{en:"How much exhaust leaves the engine each second: how bright the plume is. Thrust over exhaust velocity when the engine is stated.",fr:"La masse d'échappement qui sort du moteur chaque seconde : la luminosité du panache. La poussée sur la vitesse d'éjection quand le moteur est donné.",es:"La masa de escape que sale del motor cada segundo: el brillo de la estela. El empuje sobre la velocidad de escape cuando se da el motor.",it:"La massa di scarico che esce dal motore ogni secondo: la luminosità della scia. La spinta sulla velocità di scarico quando il motore è dato."},group:{en:"Plume",fr:"Panache",es:"Estela",it:"Scia"}}),i.plume("condensedShare",{min:0,max:1,step:.01,label:{en:"Share that scatters",fr:"Part qui diffuse",es:"Parte que difunde",it:"Parte che diffonde"},hint:{en:"The share of the exhaust that ends up as particles that scatter the Sun's light. Nobody has measured it for a launch: the one number to fit against a photograph.",fr:"La part de l'échappement qui devient des particules diffusant la lumière du Soleil. Personne ne l'a mesurée pour un lancement : le seul nombre à caler sur une photographie.",es:"La parte del escape que acaba como partículas que difunden la luz del Sol. Nadie la ha medido para un lanzamiento: el único número que ajustar con una fotografía.",it:"La parte dello scarico che diventa particelle che diffondono la luce del Sole. Nessuno l'ha misurata per un lancio: l'unico numero da tarare su una fotografia."},group:{en:"Plume",fr:"Panache",es:"Estela",it:"Scia"}}),i.plume("particleRadiusUm",{min:.05,max:5,step:.05,unit:"µm",label:{en:"Particle radius",fr:"Rayon des particules",es:"Radio de las partículas",it:"Raggio delle particelle"},group:{en:"Plume",fr:"Panache",es:"Estela",it:"Scia"}}),i.plume("lifetimeS",{min:10,max:3600,step:10,unit:"s",label:{en:"Trail lifetime",fr:"Durée de la traînée",es:"Duración de la estela",it:"Durata della scia"},hint:{en:"How long the narrow trail lasts before the particles have gone.",fr:"Combien de temps la traînée étroite dure avant que les particules aient disparu.",es:"Cuánto dura la estela estrecha antes de que las partículas hayan desaparecido.",it:"Quanto dura la scia stretta prima che le particelle siano sparite."},group:{en:"Plume",fr:"Panache",es:"Estela",it:"Scia"}}),i.plume("expansionKmPerS",{min:0,max:5,step:.01,unit:"km/s",label:{en:"Trail spreading",fr:"Étalement de la traînée",es:"Expansión de la estela",it:"Espansione della scia"},group:{en:"Plume",fr:"Panache",es:"Estela",it:"Scia"}}),i.plume("initialRadiusKm",{min:0,max:50,step:.1,unit:"km",label:{en:"Radius at release",fr:"Rayon au lâcher",es:"Radio al soltar",it:"Raggio al rilascio"},group:{en:"Plume",fr:"Panache",es:"Estela",it:"Scia"}}),i.plume("collarShare",{min:0,max:1,step:.01,label:{en:"Share in the collar",fr:"Part dans la collerette",es:"Parte en el collar",it:"Parte nel collare"},hint:{en:"The collar is the exhaust just let go, which spreads fast into a wide short-lived shell round the stage; the rest stays behind as the narrow trail.",fr:"La collerette est l'échappement qui vient d'être lâché, qui s'étale vite en une coque large et brève autour de l'étage ; le reste demeure derrière en traînée étroite.",es:"El collar es el escape recién soltado, que se extiende rápido en una envoltura ancha y breve alrededor de la etapa; el resto queda detrás como estela estrecha.",it:"Il collare è lo scarico appena rilasciato, che si allarga in fretta in un guscio largo e breve attorno allo stadio; il resto resta dietro come scia stretta."},group:{en:"Collar",fr:"Collerette",es:"Collar",it:"Collare"}}),i.plume("collarExpansionKmPerS",{min:0,max:10,step:.05,unit:"km/s",label:{en:"Collar spreading",fr:"Étalement de la collerette",es:"Expansión del collar",it:"Espansione del collare"},hint:{en:"How fast the collar widens: three quarters of the exhaust velocity when the engine is stated.",fr:"La vitesse à laquelle la collerette s'élargit : les trois quarts de la vitesse d'éjection quand le moteur est donné.",es:"La rapidez con que el collar se ensancha: tres cuartos de la velocidad de escape cuando se da el motor.",it:"Quanto in fretta il collare si allarga: tre quarti della velocità di scarico quando il motore è dato."},group:{en:"Collar",fr:"Collerette",es:"Collar",it:"Collare"}}),i.plume("collarLifetimeS",{min:1,max:300,step:1,unit:"s",label:{en:"Collar lifetime",fr:"Durée de la collerette",es:"Duración del collar",it:"Durata del collare"},group:{en:"Collar",fr:"Collerette",es:"Collar",it:"Collare"}})]};static PLACE={kind:"launch-place",title:{en:"Place of the path",fr:"Point du chemin",es:"Punto de la trayectoria",it:"Punto del percorso"},parameters:[{type:"number",key:"t",min:-3600,max:36e3,step:.1,unit:"s",scale:.001,required:!0,label:{en:"Time",fr:"Instant",es:"Instante",it:"Istante"},hint:{en:"Seconds of the recording; negative before it began: a stage seen minutes after its launch was already high when the recording started.",fr:"Secondes de l'enregistrement ; négatives avant son début : un étage vu des minutes après son lancement était déjà haut quand l'enregistrement a commencé.",es:"Segundos de la grabación; negativos antes de que empezara: una etapa vista minutos después de su lanzamiento ya estaba alta cuando empezó la grabación.",it:"Secondi della registrazione; negativi prima del suo inizio: uno stadio visto minuti dopo il lancio era già alto quando la registrazione è iniziata."}},{type:"number",key:"lat",min:-90,max:90,step:1e-4,unit:"°",required:!0,label:{en:"Latitude",fr:"Latitude",es:"Latitud",it:"Latitudine"}},{type:"number",key:"lng",min:-180,max:180,step:1e-4,unit:"°",required:!0,label:{en:"Longitude",fr:"Longitude",es:"Longitud",it:"Longitudine"}},{type:"number",key:"altitudeKm",min:0,max:2e3,step:.1,unit:"km",required:!0,label:{en:"Altitude",fr:"Altitude",es:"Altitud",it:"Altitudine"}}]};static publish(){c.publish(i.SET)}}class r{constructor(e,t,s){this.container=e,this.host=t,this.language=s,c.of("launch")||i.publish(),this.render(),this.setLanguage(s)}messages=h;languageToken=0;currentId;form;list;places;placeForm;placeIndex=0;language;shown=[];async setLanguage(e){const t=++this.languageToken;this.language=e;const s=m.includes(e)?e:"en",a=s==="en"?h:await g(s);t===this.languageToken&&(this.messages=a,this.render(),this.sync())}sync(){const e=this.launches;this.shown=[...e],e.some(a=>a.id===this.currentId)||(this.currentId=e[0]?.id),this.list?.setItems(e.map(a=>({id:a.id,label:this.labelOf(a)})),this.currentId),this.syncAddState();const t=this.current;if(this.element("launch-fields").hidden=t===void 0,!t)return;this.syncPlaces(t);const s=c.of("launch");this.form??=new d(this.element("launch-parameters"),this.language,"",{said:()=>this.host.said(),writingLanguage:()=>this.host.writingLanguage()}),this.form.show(s,t,()=>this.written())}refresh(){this.syncAddState();const e=this.launches;e.length===this.shown.length&&e.every((t,s)=>t===this.shown[s])||this.sync()}syncAddState(){const e=this.startOfNew()!==void 0;this.list?.setAddState(e,e?void 0:this.messages.addLaunchNowhere)}get current(){return this.launches.find(e=>e.id===this.currentId)}show(e){this.currentId=e,this.placeIndex=0,this.sync()}render(){const e=this.messages;this.form=void 0,this.container.innerHTML=`<div class="launch-editor">
2
- <p class="launch-intro">${e.intro}</p>
3
- <div id="launch-list"></div>
4
- <div id="launch-fields" class="launch-fields">
5
- <fieldset id="launch-path" class="launch-path">
6
- <legend>${e.path}</legend>
7
- <div id="launch-places"></div>
8
- <div id="launch-place-parameters" class="launch-parameters"></div>
9
- </fieldset>
10
- <div id="launch-parameters" class="launch-parameters"></div>
11
- <p class="launch-intro">${e.derivedNote}</p>
12
- </div>
13
- </div>`;const t=this.element("launch-list");this.list=new u({header:t,body:this.element("launch-fields"),ids:{list:"launch-select",remove:"launch-delete",add:"launch-add",kinds:"launch-add-kind",kind:a=>`launch-add-${a}`},onSelect:a=>{this.currentId=a,this.placeIndex=0,this.sync()},onAdd:a=>this.addLaunch(a??r.VEHICLES[0].id),onRemove:()=>this.deleteCurrent()}),this.list.setLabels({list:e.launch,remove:e.deleteLaunch,add:e.addLaunch,empty:e.none}),this.list.setKinds(r.VEHICLES.map(a=>({value:a.id,label:a.vehicle.name??a.id})));const s=this.element("launch-places");this.places=new u({header:s,body:this.element("launch-place-parameters"),ids:{list:"launch-place",remove:"launch-place-delete",add:"launch-place-add"},navigation:{scope:this.container,onStep:a=>this.selectPlace(this.placeIndex+a)},onSelect:a=>this.selectPlace(Number(a)),onAdd:()=>this.addPlace(),onRemove:()=>this.removePlace()}),this.places.setLabels({list:e.place,remove:e.deletePlace,add:e.addPlace,previous:e.previousPlace,next:e.nextPlace}),this.placeForm=void 0}written(){this.host.changed();const e=this.current;e&&this.list?.rename(e.id,this.labelOf(e))}syncPlaces(e,t=!1){const s=e.track??[];this.placeIndex=Math.max(0,Math.min(this.placeIndex,s.length-1)),this.places?.setItems(s.map((a,n)=>({id:String(n),label:this.seconds(a.t)})),String(this.placeIndex)),this.places?.setStepState(this.placeIndex>0,this.placeIndex<s.length-1),this.places?.setRemoveEnabled(s.length>r.MIN_PLACES),this.placeForm?this.placeForm.sync(t):(this.placeForm=new d(this.element("launch-place-parameters"),this.language,"launchPlace."),this.placeForm.show(i.PLACE,new f(()=>this.current?.track[this.placeIndex],a=>this.editPlace(a)),()=>{}))}static MIN_PLACES=2;seconds(e){return`${Math.round(e/100)/10} s`}selectPlace(e){const t=this.current?.track??[];e<0||e>=t.length||(this.placeIndex=e,this.syncPlaces(this.current,!0))}editPlace(e){const t=this.current;if(!t)return;const s={...t.track[this.placeIndex]};e(s);const a=t.track.map((n,l)=>l===this.placeIndex?s:n).sort((n,l)=>n.t-l.t);this.replaceTrack(t,a),this.placeIndex=a.indexOf(s),this.syncPlaces(this.current),this.written()}addPlace(){const e=this.current;if(!e)return;const t=e.track,s=i.nextPlace(t),a=[...e.track,s].sort((n,l)=>n.t-l.t);this.replaceTrack(e,a),this.placeIndex=a.indexOf(s),this.syncPlaces(this.current),this.host.changed()}removePlace(){const e=this.current;!e||e.track.length<=r.MIN_PLACES||(this.replaceTrack(e,e.track.filter((t,s)=>s!==this.placeIndex)),this.syncPlaces(this.current),this.host.changed())}replaceTrack(e,t){e.track=t}startOfNew(){const e=this.host.sighting(),t=e.event?.place?.[0];if(t?.lat===void 0||t.lng===void 0)return;const s=(e.observerTrack?.getInterpolatedPoseAt(0)?.headingDeg??0)*Math.PI/180,a=n=>({lat:t.lat+n*Math.cos(s)/111.32,lng:t.lng+n*Math.sin(s)/(111.32*Math.max(.05,Math.cos(t.lat*Math.PI/180)))});return[{t:0,...a(300),altitudeKm:80},{t:6e4,...a(450),altitudeKm:160}]}static VEHICLES=[{id:"falcon-9",vehicle:{name:"Falcon 9"}}];addLaunch(e){const t=this.startOfNew();if(!t)return;const s=r.VEHICLES.find(o=>o.id===e)??r.VEHICLES[0];let a=this.launches.length+1;for(;this.launches.some(o=>o.id===`launch-${a}`);)a++;const n={id:`launch-${a}`,vehicle:{...s.vehicle},track:t},l=this.host.sighting();l.skyEvents={...l.skyEvents,launches:[...this.launches,n]},this.currentId=n.id,this.host.changed(),this.sync()}deleteCurrent(){const e=this.current;if(!e)return;this.currentId=void 0;const t=this.host.sighting();t.skyEvents=v.written({...t.skyEvents,launches:this.launches.filter(s=>s!==e)}),this.host.changed(),this.sync()}labelOf(e){const t=this.host.said().read(e.title)??e.vehicle?.mission??e.vehicle?.name;return t?`${t} (${e.id})`:e.id}get launches(){return this.host.sighting().skyEvents?.launches??[]}element(e){return this.container.querySelector(`#${e}`)}}export{r as LaunchEditor};
@@ -1 +0,0 @@
1
- const e={intro:"A rocket launch while the recording runs, a fact of the sky: its exhaust shows lit by a Sun the ground no longer sees. Its path, its engine and how its exhaust spreads are set below.",none:"No launch in this recording",launch:"Launch",deleteLaunch:"Delete launch",addLaunch:"Add a launch",path:"Path",place:"Place of the path",addPlace:"Add a place to the path, going on as it was going",deletePlace:"Remove this place",previousPlace:"Previous place",nextPlace:"Next place",addLaunchNowhere:"Give the recording a place first: a launch is put in front of the observer",derivedNote:"An empty field shows, greyed, the value used: the default, or what the engine implies. Clear a field to go back to it."};export{e as launchEditorMessages_en};
@@ -1 +0,0 @@
1
- const e={intro:"Un lanzamiento de cohete durante la grabación, un hecho del cielo: su escape se ve iluminado por un Sol que el suelo ya no ve. Su trayectoria, su motor y la expansión del escape se ajustan abajo.",none:"Ningún lanzamiento en esta grabación",launch:"Lanzamiento",deleteLaunch:"Eliminar el lanzamiento",addLaunch:"Añadir un lanzamiento",path:"Trayectoria",place:"Punto de la trayectoria",addPlace:"Añadir un punto a la trayectoria, en su continuidad",deletePlace:"Quitar este punto",previousPlace:"Punto anterior",nextPlace:"Punto siguiente",addLaunchNowhere:"Dé primero un lugar a la grabación: un lanzamiento se pone delante del observador",derivedNote:"Un campo vacío muestra, en gris, el valor usado: el predeterminado, o lo que implica el motor. Vacíe un campo para volver a él."};export{e as launchEditorMessages_es};
@@ -1 +0,0 @@
1
- const e={intro:"Un lancement de fusée pendant l'enregistrement, un fait du ciel : son échappement se voit éclairé par un Soleil que le sol ne voit plus. Son chemin, son moteur et l'étalement de l'échappement se règlent ci-dessous.",none:"Aucun lancement dans cet enregistrement",launch:"Lancement",deleteLaunch:"Supprimer le lancement",addLaunch:"Ajouter un lancement",path:"Chemin",place:"Point du chemin",addPlace:"Ajouter un point au chemin, dans la continuité",deletePlace:"Retirer ce point",previousPlace:"Point précédent",nextPlace:"Point suivant",addLaunchNowhere:"Donnez d'abord un lieu à l'enregistrement : un lancement est placé devant l'observateur",derivedNote:"Un champ vide montre, en grisé, la valeur utilisée : le défaut, ou ce que le moteur implique. Videz un champ pour y revenir."};export{e as launchEditorMessages_fr};
@@ -1 +0,0 @@
1
- const o={intro:"Un lancio di razzo durante la registrazione, un fatto del cielo: il suo scarico si vede illuminato da un Sole che il suolo non vede più. Il suo percorso, il motore e l'espansione dello scarico si regolano qui sotto.",none:"Nessun lancio in questa registrazione",launch:"Lancio",deleteLaunch:"Elimina il lancio",addLaunch:"Aggiungi un lancio",path:"Percorso",place:"Punto del percorso",addPlace:"Aggiungi un punto al percorso, in continuità",deletePlace:"Rimuovi questo punto",previousPlace:"Punto precedente",nextPlace:"Punto successivo",addLaunchNowhere:"Dia prima un luogo alla registrazione: un lancio è posto davanti all'osservatore",derivedNote:"Un campo vuoto mostra, in grigio, il valore usato: il predefinito, o ciò che implica il motore. Svuota un campo per tornarci."};export{o as launchEditorMessages_it};
@@ -1,12 +0,0 @@
1
- const e={basisTitle:"Cómo se obtuvo este valor",basisField:"Base",howField:"Cómo",rationaleField:"Justificación",basisReset:"Base devuelta a «declarada»: el valor se volvió a escribir (era: {basis}).",lawSources:"Fuentes: {sources}",extrapolation:"Estas leyes se midieron en observaciones nocturnas: aplicarlas a una observación diurna es una extrapolación.",sectionAccountConditions:"Condiciones del testimonio",sectionViewing:"Condiciones de visión",sectionMoon:"Calibre Luna",sectionErrorParameters:"Parámetros de error de este testigo",errorModelField:"Modelo de error",delayField:"Plazo antes de este relato",delayUnit:"días",versionField:"Versión",wordField:"Palabra empleada",exposureField:"Exposición",independenceField:"Independencia",independentYes:"sin haber hablado con los otros testigos",independentNo:"tras hablar con los otros testigos",unknownChoice:"no se sabe",darkAdapted:"Adaptado a la oscuridad",correctedVision:"Vista corregida (gafas, lentillas)",glare:"Luz intensa justo antes",viewingNote:"El cristal o el parabrisas y los prismáticos se ajustan en «Visión» más arriba.",moonIntro:"El testigo muestra la Luna llena como mostró el objeto. La razón da su propio factor de tamaño angular: la única medida que hace individual la ley general. A tomar una vez por testigo.",moonField:"Luna tal como se muestra",moonHint:"Con el brazo extendido, 1 cm ≈ 1°",moonNone:"Aún no medida: se aplica la ley general ({law}).",moonFactor:"Factor ×{k}: sustituye a la ley general en todos los tamaños angulares de este testigo.",moonReal:"Luna real · 0,52°",parametersIntro:"Los errores de un mismo testigo están ligados: el mismo factor en todos sus tamaños, el mismo desfase en todas sus horas. Calculados, nunca escritos: ningún margen «±» se introduce a mano.",showMore:"Mostrar",basis:{measured:"◆ medida",stated:"declarada",derived:"deducida",assumed:"supuesta"},how:{clock:"leída en un reloj",anchored:"anclada a un evento fechado",estimated:"estimada","shown-on-the-spot":"mostrada en el lugar","arm-length-gauge":"calibre con el brazo extendido","recalled-object":"referida a un objeto conocido",instrument:"instrumento",landmark:"referencia del paisaje",occlusion:"ocultación","known-size":"tamaño conocido",triangulation:"triangulación"},status:{consolidated:"consolidada",individual:"individual",single:"estudio único",argued:"argumentada",contested:"discutida"},laws:{timeClock:"± {minutes} min (leída en un reloj)",timeAnchored:"± {minutes} min (anclada a un evento fechado)",timeEstimated:"± {minutes} min para 9 testigos de 10 (estimada)",duration:"{low} a {high}: ×/÷{factor} (log-normal)",elevationOver:"{low} a {high}: altura sobreestimada",measuredInstrument:"± {degrees}° (medida)",measuredLandmark:"± {degrees}° (según una referencia)",headingCross:"{low} a {high}: ± {degrees}°, sentido a veces invertido",sizeMoon:"{low} a {high}: factor ×{factor} del calibre Luna",sizeShown:"{low} a {high}: mostrada en el lugar, +2 a +17 %",sizeRecalled:"{low} a {high}: referida a un objeto conocido, ~30 % demasiado grande",sizeArm:"{low} a {high}: sobreestimada ×{from} a ×{to} con el brazo extendido",sizeGauge:"{low} a {high}: calibre, ± {percent} %",distanceAnchored:"Anclada: su error sigue al de aquello de lo que se deduce",distanceNotData:"No es un dato: errónea en un factor {factor} o más sin anclaje"},parameterNames:{clock:"Desfase del reloj",date:"Desfase de fecha",heading:"Rotación del rumbo",elevation:"Compresión de alturas",size:"Factor de tamaño angular",duration:"Factor de duración"},parameterScopes:{clock:"todas las horas",date:"la fecha",heading:"todos los rumbos",elevation:"todas las alturas",size:"todos los tamaños angulares",duration:"la duración y la escala de la línea de tiempo"},parameters:{clockClock:"± {minutes} min (reloj)",clockAnchored:"± {minutes} min (anclada)",clockEstimated:"± {minutes} min (estimada)",dateShift:"±1 día, mes o año; horario de verano ({percent} % de las fechas)",headingRotation:"± {degrees}°, espejo posible",elevationCompression:"sobreestimadas, nunca subestimadas",sizeMoon:"×{factor} (calibre Luna)",sizeArm:"×{from} a ×{to} con el brazo extendido",sizeShown:"+2 a +17 % mostrada en el lugar",durationFactor:"×/÷{factor} (log-normal)"},words:{light:"luz",object:"objeto",craft:"aparato",ufo:"ovni",other:"otra"},exposures:{none:"ninguna",press:"prensa",broadcast:"radio, televisión","other-witnesses":"otros testigos",investigators:"investigadores"},models:{consolidated:"Lecturas consolidadas (UFO@home)",keul:"Keul (tamaños mostrados en el lugar)"},candidates:{title:"Explicaciones candidatas",verdicts:{consolidated:"Compatible con sesgos consolidados",contested:"Solo invocando sesgos discutidos",incompatible:"Incompatible incluso en los límites"},cost:"coste {x} σ",seeVariant:"Ver esta variante",variantLabel:"Variante: {name}",backToAccount:"Volver al relato",costNote:"Un coste no es una probabilidad: dice qué sesgos hay que invocar, y cuánto.",scopeNote:"Matriz de Poher (1977) para la lista de partida; la Luna, los planetas, los pasos de satélites, las reentradas, los bólidos registrados y los aviones del registro se calculan y se confrontan con el relato.",fields:{time:"Hora",heading:"Acimut",elevation:"Altura sobre el horizonte",size:"Anchura aparente",duration:"Duración",sweep:"Recorrido en el cielo"},biases:{clock:"desfase del reloj {x} min",heading:"rotación del rumbo {x}°",elevation:"altura sobreestimada ×{x}",size:"tamaño sobreestimado ×{x}",duration:"duración mal estimada ×{x}",sweep:"recorrido mal estimado {x}°"},reasons:{"never-seen":"Nunca visible desde este lugar en el margen de la hora dada.",direction:"Demasiado lejos de la dirección dada, incluso en los límites de las leyes.",size:"Tamaño demasiado distinto, incluso en los límites de las leyes.",motion:"No se mueve como dice el relato, y nada hace leer uno por otro.",growth:"No crece como dice el relato, ni se vuelve más brillante."},readingTitle:"Lectura",readings:{grouped:"luces leídas como un solo cuerpo","still-seen-moving":"una luz fija vista en movimiento (efecto autocinético, nubes que pasan)","moving-seen-still":"una luz en movimiento vista inmóvil (llegando de frente)","brightening-as-approach":"un brillo creciente leído como un acercamiento"},notAgainst:"No es un argumento contra el relato.",noDirection:"El relato no sitúa el fenómeno en el cielo: no hay nada que confrontar.",noSky:"Sin fecha, hora y lugar, ningún astro puede situarse.",bodies:{Moon:"Luna",Venus:"Venus",Mars:"Marte",Jupiter:"Júpiter",Saturn:"Saturno"},aircraft:"Aeronave {name}",interpretation:"Interpretación: {name}",keepVariant:"Guardar esta variante",keptTitle:"Variantes guardadas ({n})",seeKept:"Ver",removeVariant:"Quitar",keptRecomputed:"calculada de nuevo: {verdict}, coste {x} σ",keptModel:"modelo: {model}",reentry:"Reentrada {name}",star:"Estrella {name}",fireball:"Bólido {name}",poherLoading:"Cargando la matriz de Poher…",poherFailed:"No se pudo leer la matriz de Poher: solo se proponen los astros.",poherTitle:"Según la matriz de Poher (1977)",poherIntro:"Los demás fenómenos conocidos de la matriz, sin trayectoria calculada aquí: su nota es el juicio de Poher, a confrontar a mano.",poherPossible:"Posibles",poherExcluded:"Excluidos ({n})",poherExcludedBy:"excluido por: {list}",poherDoubted:"dudoso según estimaciones: {list}",poherScore:"nota {x}",poherTag:"Poher: {state}",poherStatePossible:"posible, nota {x}",poherStateExcluded:"excluido",answersTitle:"Respuestas deducidas de la grabación ({n})",firm:"firme",soft:"estimación, no excluye nada por sí sola"}},a={color:"Color",transparency:"Transparencia",halo:"Halo",blur:"Desenfoque",brightness:"Brillo",shapeTitle:"Nombre",utcOffset:"Zona horaria",cloudBase:"Base de las nubes",elevation:"Altitud",heightAboveGround:"Altura sobre el suelo",duration:"Duración",placeName:"Lugar",latitude:"Latitud",longitude:"Longitud",heading:"Orientación",pitch:"Inclinación",roll:"Alabeo",sway:"Vaivén en reposo",swayTitle:"Cuánto mueve la vista el cuerpo que sostiene el instrumento cuando no camina: 1 para una persona de pie, 0 para un trípode. Vacío: 1 (0 si el relato dice que el observador estaba paralizado)",lightPollution:"Cielo nocturno",lightPollutionTitle:"El cenit de una noche sin Luna en este lugar, en magnitudes por segundo de arco cuadrado, tal como lo lee un Sky Quality Meter o lo da el atlas mundial del brillo artificial del cielo (Falchi et al. 2016, lightpollutionmap.info, «SQM»). 22 es un cielo natural; un suburbio ronda 19, el centro de una ciudad 17. Vacío: un cielo natural",observationTime:"Inicio de la observación",observationEndTime:"Fin de la observación",assessmentGroup:"Evaluación",assessmentNames:{coverage:"Datos del observador"},assessmentVerdicts:{"hynek.nl":"NL — luz nocturna","hynek.dd":"DD — disco diurno","hynek.rv":"RV — radar-visual","hynek.ce1":"EC1 — encuentro cercano","hynek.ce2":"EC2 — con huella física","hynek.ce3":"EC3 — con entidades"},timeQualifierApproximate:"Aproximada",timeQualifierUncertain:"Incierta",timeQualifierBoth:"Incierta y aproximada",timeSeasonSpring:"Primavera",timeSeasonSummer:"Verano",timeSeasonAutumn:"Otoño",timeSeasonWinter:"Invierno",summaryGroups:{observation:"Observación",location:"Posición",temporal:"Tiempo",weather:"Clima",sound:"Sonido"},summaryGroup:"Resumen",summaryDescription:"Descripción",closeDescription:"Cerrar la descripción",observerGroup:"Observador",observerId:"ID",observerTitle:"Tratamiento",observerLastName:"Apellidos",observerFirstNames:"Nombres",sightingId:"ID",tags:"Etiquetas",cloudCover:"Nubosidad",highCloudCover:"Nubes de hielo (cirros)",focalLength:"Distancia focal",fieldOfView:"Campo de visión",aperture:"Apertura",exposure:"Exposición",focusDistance:"Enfocado a",iceCrystalAlignment:"Alineación de los cristales",rareIceCrystals:"Cristales raros",cloudDarkness:"Oscuridad de las nubes",precipitationType:"Precipitación",precipitationNone:"Ninguna",precipitationRain:"Lluvia",precipitationSnow:"Nieve",precipitationHail:"Granizo",precipitationIntensity:"Intensidad",windDirection:"Dirección del viento",windSpeed:"Velocidad del viento",storm:"Tormenta",cloudsGroup:"Nubes",precipitationGroup:"Precipitación",windGroup:"Viento",soundKind:"Sonido",soundNone:"Ninguno (silencioso)",soundHum:"Zumbido",soundWhistle:"Silbido",soundRumble:"Retumbo",soundCrackle:"Crepitación",soundVolume:"Volumen",soundPitch:"Tono",soundSrc:"Grabación",instrument:"Observado con",filter:"Delante",filterNone:"nada",filterSolarVisual:"un filtro solar para el ojo (gafas de eclipse, densidad 5)",filterSolarPhoto:"una película solar para cámara (densidad 3,8)",decorAircraft:"Aeronave",decorEntity:"Ser",decorAltitude:"Altitud",decorLights:"Luces",decorLightsNone:"ninguna",decor:"Entorno",decorBuilding:"Edificio",decorTree:"Árbol",decorShrub:"Arbusto",decorBridge:"Puente",decorWire:"Línea aérea",decorCrop:"Hilera de cultivo",decorTerrace:"Bancal (terraza)",decorMound:"Montón de piedras",decorWall:"Muro de piedra seca",decorStreetlight:"Farola",decorTrafficLight:"Semáforo",decorCrossing:"Paso de peatones",decorRoadSign:"Señal de tráfico",decorVehicle:"Vehículo",decorObserver:"Otro observador",decorEast:"Distancia al este",decorNorth:"Distancia al norte",decorHeading:"Orientación",decorColor:"Color",decorLit:"Encendido",decorTitle:"Nombre",milestones:"Momentos",milestoneLabel:"Etiqueta",milestoneNote:"Qué ocurre",addMilestone:"Nombrar este momento",deleteMilestone:"Eliminar momento",goToMilestone:"Ir a este momento",decorWidth:"Anchura",decorLength:"Longitud",decorHeight:"Altura",decorModel:"Modelo 3D",decorModelAdvanced:"Modelo desde una dirección",decorModelUrl:"Dirección glTF/GLB",decorModelTitle:"Nombre del modelo",decorModelAuthor:"Autor",decorModelLicense:"Licencia",decorModelSource:"Procedencia",decorObserverSide:"Ubicación del observador",decorObserverSideNone:"No presente",decorSideFront:"Delante",decorSideBehind:"Detrás",decorSideLeft:"Izquierda",decorSideRight:"Derecha",decorSideFrontLeft:"Delante a la izquierda",decorSideFrontRight:"Delante a la derecha",decorSideBehindLeft:"Detrás a la izquierda",decorSideBehindRight:"Detrás a la derecha"},o={...a,oval:"Óvalo",polygon:"Polígono",modelTriangle:"Triángulo",modelSaucer:"Platillo",modelCigar:"Cigarro",modelChevron:"Chevrón",modelLight:"Luz",modelPartDisc:"disco",modelPartDome:"cúpula",addVertex:"Añadir vértice",deleteVertex:"Eliminar vértice",notAPolygon:"Selecciona una sola forma poligonal",tooFewVertices:"Una forma necesita al menos 3 puntos",shape:"Forma",apparentWidth:"Anchura aparente",realWidth:"Anchura real",distance:"Distancia",shapeRotation:"Rotación",shapeRotationTitle:"Cuánto está girada la forma en el dibujo, en sentido horario, en grados: lo que ajusta su asa de rotación",sizeLock:"Mantener",lockNone:"nada",lockApparent:"la anchura aparente",lockReal:"la anchura real",lockDistance:"la distancia",apparentSize:"{moons}× la Luna",utcOffsetPlaceholder:"según la longitud",realSizeBetween:"La escena acota esa anchura: entre {min} y {max} m, según lo que cruza",realSizeAtLeast:"La escena acota esa anchura: al menos {min} m, según lo que pasa por detrás",realSizeAtMost:"La escena acota esa anchura: como mucho {max} m, según lo que pasa por delante",realSizeUnknown:"Nada en la escena acota esa anchura: solo es lo que implica la distancia",realSizeOutside:" — la anchura de arriba queda fuera",blurBound:"Desenfocado a través de este objetivo: más cerca de {max} m",blurBoundNoInstrument:"El desenfoque a simple vista no acota ninguna distancia — un ojo no tiene diafragma con el que desenfocar",blurBoundNotAtInfinity:"El desenfoque solo acota una distancia con un objetivo enfocado al infinito: este está enfocado a {focus} m, lo que desenfoca a ambos lados",realSizeContradiction:"Contradicción: los cruces declarados no pueden ser todos ciertos",realDistanceHere:" — es decir, aquí entre {min} y {max} m",clearDistanceHypothesis:"Retirar la hipótesis de distancia",clearDistanceHypothesisTitle:"Volver a lo que establece la grabación",depthStated:"Dibujado a {m} m, como indica la grabación",depthHypothesis:"Dibujado a {m} m: tu hipótesis — lo que el decorado oculta de él es lo que perdería algo tan lejano",depthDerived:"Dibujado a {m} m, según la propia marcha del observador",depthBounded:"Dibujado a {m} m, según lo que pasa por detrás y por delante",depthConventional:"Dibujado a {m} m por convención: nada en la grabación establece una distancia",addShape:"Añadir forma",deleteShape:"Eliminar forma",play:"Reproducir",pause:"Pausa",noDuration:"Sin duración de observación",previousKeyframe:"Fotograma clave anterior",nextKeyframe:"Fotograma clave siguiente",keyframeMark:"Fotograma clave",shapesTrack:"formas",observerTrack:"observador",weatherTrack:"meteorología",soundTrack:"sonido",group:"Agrupar",ungroup:"Desagrupar",duplicate:"Duplicar",bringToFront:"Traer al frente",sendToBack:"Enviar al fondo",contextMenuDelete:"Eliminar",onlyOneShape:"Solo hay una forma",alreadyAtFront:"Esta forma ya está al frente",alreadyAtBack:"Esta forma ya está al fondo",needTwoShapesToGroup:"Selecciona al menos dos formas para agruparlas",notGrouped:"Esta forma no forma parte de un grupo",multipleShapesSelected:"Varias formas seleccionadas — selecciona solo una para editar esto",samplingRate:"Frecuencia de muestreo",currentPosition:"Posición actual",switchToElapsed:"haz clic para mostrar el tiempo transcurrido",switchToClockTime:"haz clic para mostrar la hora del día",durationPlaceholder:"duración de la observación",durationImprecise:"Estas fechas no determinan con suficiente precisión una duración — introdúcela manualmente.",export:"Guardar",frozenTitle:"Datos congelados",frozenHint:"Lo que la escena pediría si no a terceros en cada reproducción (relieve, foto del suelo, carreteras, agua, vías férreas, atmósfera alta), tomado al guardar y conservado en archivos junto a la grabación, para que se reproduzca igual sin pedir nada a nadie.",frozenLive:"Consultar las fuentes en cada reproducción (no congelar nada)",frozenRelief:"Relieve",frozenImagery:"Foto del suelo",frozenRoads:"Carreteras",frozenWater:"Agua",frozenRailways:"Vías férreas",frozenUpperAir:"Atmósfera alta",frozenMap:"Foto del mapa",fileItemRecording:"Registro",fileItemWeather:"Tiempo",fileItemPlace:"Lugar",fileItemLightPollution:"Contaminación lumínica",fileItemDecor:"Decorado",weatherStatedByObserver:"tal como la dio el observador",annexSource:"Archivo",annexStorageInline:"dentro del propio registro",annexEditorLabel:"El anexo como texto JSON",annexUnreadable:"Este archivo no es un anexo de este tipo: no se ha cambiado nada.",frozenTakenOn:"tomado el {date}",frozenPending:"se toma al guardar",frozenLiveState:"consultado en directo",frozenRefresh:"Actualizar",frozenTaking:"Tomando: {group}… {done}/{of}",frozenFailed:"{group}: la fuente no respondió, no se tomó nada.",frozenMissing:"{file} no se pudo leer: queda fuera del archivo.",frozenExported:"Guardado con {count} anexos ({size}), en un archivo que descomprimir donde se publica la grabación.",identityHint:"Nombra a alguien solo si lo consintió o publicó él mismo su testimonio; si no, bastan unas iniciales.",identityAsk:"Esta grabación nombra o sitúa a una persona. Respondes de lo que publicas: nombra a alguien solo si lo consintió, o si publicó él mismo su testimonio. Si no, bastan unas iniciales.",identityLastName:"Apellidos: {value}",identityFirstNames:"Nombre: {value}",identityNameInId:"Nombre en un identificador: {value}",identityNameInText:"Nombre en el texto: {value}",identityAddress:"Dirección: {value}",identityEmail:"Correo electrónico: {value}",identityPhone:"Número de teléfono: {value}",identityInitials:"Sustituir por iniciales",identityKeep:"Guardar de todos modos",identityBack:"Volver",importFile:"Cargar un archivo de observación",paramSummaryTitle:"Lo que indica la grabación ({n})",wholeKeyframes:"Cada fotograma clave entero",wholeKeyframesHint:"Si no, un fotograma clave solo dice lo que cambió desde el anterior, como se escribe una grabación a mano. Cambiar esto vacía el historial de deshacer.",importUrlPlaceholder:"https://…/sighting.json",inputFileFromFile:"desde su disco",inputFileFromUrl:"desde una dirección",inputFileModeHint:"Pulsar para darlo de la otra forma: un archivo suyo o una dirección",inputFileLoad:"Cargar",importError:"No se pudo cargar esa grabación — revisa el archivo o la URL e inténtalo de nuevo.",importErrorCors:'Esa dirección responde, pero el navegador no tiene permiso para leerla desde esta página. El archivo en sí está bien: su servidor debe enviarlo con la cabecera "Access-Control-Allow-Origin: *". Si no es tu servidor, eso es lo que debes pedir a su administrador.',importErrorMixedContent:"Una página segura no puede cargar una dirección que empiece por http://. Usa https:// si ese servidor lo ofrece.",importErrorUnreachable:"Nada respondió en esa dirección. Revisa cómo está escrita y que tengas conexión.",importErrorStatus:"Ese servidor respondió con un error ({status}). Probablemente la dirección es incorrecta o el archivo se ha movido.",importErrorMalformed:"Esa dirección respondió, pero lo que devolvió no es una grabación.",formatVersionError:"Este archivo indica la versión {found} de su formato; este UFO@home lee hasta la versión {supported}. Ábralo con un UFO@home más reciente.",record:"Grabar",stop:"Detener",according:"según",sourceElevation:"Relieve",sourceImagery:"Imágenes",sourceAircraft:"Tráfico aéreo",sourceFile:"Archivo",sourceKind:"Datos",placeNamePlaceholder:"Valensole, Francia",searchPlace:"Localizar",placeMatch:"Coincidencias",placeSearching:"Buscando el lugar…",placeMatchFound:"lugar encontrado",placeMatchesFound:"lugares encontrados",placeNotFound:"Ningún lugar con ese nombre",placeSearchFailed:"Búsqueda de lugares no disponible por el momento",utcOffsetNoZone:"Ninguna zona horaria marca este desfase ese día",utcOffsetImplausible:"Esta zona horaria no corresponde a la longitud introducida, cuya hora solar es UTC{solar} — aun así, la escena y el registro meteorológico obedecen a lo que se declara aquí. Vacía el campo para deducirla de la longitud.",timeZoneManual:"desconocido",altitudeAboveSeaLevel:"Altitud del observador sobre el nivel del mar — el suelo del lugar introducido fija su mínimo: un observador en los Alpes no está a 0 m.",groundAt:"suelo a {m} m",headingPlaceholder:"desconocido",edtfInvalid:"Fecha/hora EDTF no válida (p. ej. 1965-07-01T05:00, 2025-06?, 2025~).",edtfPlaceholder:"AAAA-MM-DDThh:mm[?~%] o hh:mm",observationTimeHint:"EDTF — p. ej. 1965-07-01T05:00, 2025-06? (incierto), 2025~ (aproximado), o solo 05:00 si no se conoce la fecha",observationEndTimeHint:"EDTF — p. ej. 1965-07-01T05:10, 2025-06? (incierto), 2025~ (aproximado), o solo 05:10 si no se conoce la fecha",presetsGroupLabel:"Forma del ovni",description:"Descripción",tagsPlaceholder:"separadas por comas",weather:"Meteorología",shapeGroup:"Fenómeno",shapesSubgroup:"Formas",bodiesSubgroup:"Cuerpos",launchesSubgroup:"Lanzamientos",sky:"Cielo",dataSources:"Fuentes de datos",beamsSubgroup:"Haces",soundGroup:"Sonido",close:"Cerrar",editorKicker:"Editor de avistamiento",witnessError:e,expandTracks:"Desplegar las pistas",collapseTracks:"Plegar las pistas",addKeyframeHere:"Añadir un fotograma clave aquí",keyframeHere:"Aquí hay un fotograma clave: editarlo lo modifica",overlayHorizon:"Horizonte · inclinación {deg}°",overlayFov:"Campo de visión {v}° × {h}°",overlayWind:"Sopla hacia {point} · {speed} m/s",sectionIdentity:"Identidad",sectionProfile:"Perfil",sectionTestimony:"Testimonio",sectionVision:"Visión",sectionPerception:"Percepción",sectionCoordinates:"Coordenadas",sectionGaze:"Mirada",sectionNightSky:"Cielo nocturno",sectionPeriod:"Periodo",sectionSurvey:"Decorado tomado de un levantamiento",sectionHeard:"Lo que se oyó",sectionSoundRecording:"Grabación",sectionPicture:"Foto",sectionPose:"Pose",sectionAppearance:"Apariencia",sectionSize:"Tamaño y distancia",sectionPath:"Trayectoria",moreSettings:"Más ajustes ({n})",lessSettings:"Menos ajustes",showSettings:"Mostrar ({n} ajustes)",showSettingsOne:"Mostrar (1 ajuste)",showSettingsAny:"Mostrar",hideSettings:"Ocultar",save:"Guardar",stateNew:"Nueva grabación",panelIntroObservation:"Lo que pasó, en pocas líneas, y lo que queda por completar.",panelIntroObserver:"Quién lo vio, y con qué. Cada observador tiene su propio punto de vista en la escena.",panelIntroLocation:"Desde dónde miraba el observador, y en qué dirección.",panelIntroTemporal:"Cuándo empezó, cuánto duró, y los momentos del relato.",panelIntroDecor:"Lo que rodeaba al observador: vehículos, edificios, vegetación.",panelIntroWeather:"El tiempo que hacía, y lo que cruzaba el cielo sin ser el fenómeno: lanzamientos, haces.",panelIntroShape:"Lo que se vio, dibujado en la escena desde el punto de vista del observador.",panelIntroSound:"Lo que se oyó.",panelIntroReference:"Fotos y croquis, ajustados a la escena para compararla.",panelIntroFile:"La grabación completa, para guardar o volver a cargar.",temporalGroup:"Fecha",fileGroup:"Archivos",fileLoading:"Cargando el editor…",weatherEditedAsk:"Esta edición toca el tiempo, un dato leído dinámicamente desde {source}. ¿Quieres dejar de leerlo desde {source}?",weatherEditedStop:"Dejar de leerlo",weatherEditedKeep:"Seguir leyéndolo (deshacer mi edición)",fileEditorLabel:"El registro como texto JSON",fileSearchPhrases:{Find:"Buscar",Replace:"Reemplazar",next:"siguiente",previous:"anterior",all:"todo","match case":"mayúsculas","by word":"palabra completa",regexp:"regexp",replace:"reemplazar","replace all":"reemplazar todo",close:"cerrar","current match":"coincidencia actual","on line":"en la línea","replaced $ matches":"$ coincidencias reemplazadas","replaced match on line $":"coincidencia reemplazada en la línea $","Go to line":"Ir a la línea",go:"ir"},timeQualifierExact:"Exacta",durationPrecise:"precisa",durationIso:"imprecisa",durationModeTitle:"Decir la duración exactamente, o como se enunció: aproximadamente, entre dos duraciones",durationInvalid:"No es una duración: PT10M, PT1H30M, PT5M/PT10M…",durationHelpTitle:"Lo que acepta el texto (EDTF)",durationHelpLines:`PT45S — 45 segundos
2
- PT10M — 10 minutos
3
- PT1H30M — 1 hora 30 minutos
4
- PT5M/PT10M — entre 5 y 10 minutos
5
- Terminar con ? si es incierto, ~ si es aproximado, % para ambos
6
- 1965-?07 — la duda también puede afectar a una parte`,durationChosen:"(simulada: {value})",accountView:"Relato",accountView2d:"2D · formas",accountView3d:"3D · cuerpos",accountViewHint:"Lo que muestra el render y lo que se edita: las formas que el observador dibujó, o los cuerpos que dijo que eran",datePrecise:"precisa",dateEdtf:"imprecisa",dateHelpTitle:"Lo que acepta el texto (EDTF)",dateHelpLines:`1965 — un año
7
- 1965-07 — un mes
8
- 1965-21 — una estación (21 primavera, 22 verano, 23 otoño, 24 invierno)
9
- 1965-07-01 — un día
10
- 1965-07-01T05:00 — un día y una hora
11
- 05:00 — una hora, fecha desconocida
12
- Terminar con ? si es incierto, ~ si es aproximado, % para ambos`,edtfModeTitle:"Escribe en su lugar una fecha imprecisa: solo un año, un mes, una hora sin fecha",locationGroup:"Lugar",observerTab:"Testigo",observationGroup:"Resumen",weatherWhilePlaying:"Pausa la grabación para indicar el tiempo — mientras se reproduce, el instante en que se escribiría se está moviendo",weatherInferred:"Fuente",weatherInferredTitle:"La meteorología no es un relato: es un hecho medible, registrado para la fecha, la hora y el lugar de la observación. Desmarca para indicar las condiciones que refirió el observador, que entonces prevalecen sobre el registro.",weatherLookingUp:"Buscando el registro…",weatherNeedsDateAndPlace:"Se necesitan una fecha completa y un lugar para buscar el registro",weatherNeedsDate:"Se necesita una fecha completa (año, mes y día) para buscar los registros meteorológicos",weatherNeedsPlace:"Se necesita un lugar con coordenadas para buscar los registros meteorológicos",weatherNoRecord:"Ningún registro para esta fecha y este lugar",weatherLookupFailed:"Registros meteorológicos inaccesibles por el momento",lightPollutionLookingUp:"Consultando el atlas…",lightPollutionFound:"{artificial} µcd/m² de luz artificial,",lightPollutionNatural:"Ninguna luz artificial aquí,",lightPollutionOutside:"Fuera del atlas (85°N a 60°S),",lightPollutionFailed:"Atlas inaccesible por ahora",lightPollutionTooEarly:"El atlas describe {atlasYear}; el cielo de {year} era más oscuro, indíquelo si se conoce",instrumentOutOfPeriod:"{name} — no es de esta fecha",instrumentCategoryEye:"Ojo desnudo",instrumentCategoryCamera:"Cámaras",instrumentCategoryDslr:"Réflex digitales",instrumentCategoryPhone:"Teléfonos",instrumentCategoryBinoculars:"Prismáticos",instrumentCategoryTelescope:"Telescopios",instrumentNotYetOnSale:"Aún no existía en {year} (a la venta desde {from})",instrumentNoLongerOnSale:"Ya no existía en {year} (a la venta hasta {to})",filterNotForInstrument:"No se puede usar con este instrumento",unitMillimetres:"mm",unitDegrees:"°",fieldOfViewReadout:"{deg}° de campo",soundSrcPlaceholder:"URL de una grabación real",referenceGroup:"Fotos",reference:"Foto",referenceTitle:"Nombre",referenceSrc:"Imagen",referenceSrcPlaceholder:"https://…/photo.jpg",referenceKind:"Tipo",referencePhoto:"Foto",referencePanorama:"Panorama (360°)",referenceCredit:"Crédito",referenceCreditUrl:"Enlace del crédito",referenceT:"Tomada en",referenceDrawing:"Dibujo encima",referenceOpacity:"Opacidad",referenceHeading:"Rumbo",referencePitch:"Cabeceo",referenceRoll:"Alabeo",referenceFov:"Campo vertical",referenceUsePose:"Usar la pose del observador",addReferenceUrl:"Desde una dirección",addReferenceFile:"Desde un archivo",deleteReference:"Eliminar foto",referenceEmbedded:"{kb} kB incrustados en la grabación — una dirección la mantendría ligera",referenceUnreachable:"No se pudo cargar la foto: revisa la dirección y que su sitio permita que otros sitios la lean",referenceRegisterHint:"Arrastra para girar la foto, rueda para cambiar su campo; «Añadir un punto de referencia» para señalar un detalle en la foto y luego el mismo en el render",referenceLandmarkPicture:"Punto de referencia {n}: haz clic en el punto de la foto",referenceLandmarkScene:"Punto de referencia {n}: haz clic en el mismo punto del render",referenceLandmarkOffPicture:"Ese clic no cae en la foto",referenceNotLoaded:"La foto aún no ha llegado",referenceLandmarksFit:"{n} puntos de referencia — desviación media de {deg}°",referenceLandmarks:"Puntos de referencia",addReferenceLandmark:"Añadir un punto de referencia",deleteReferenceLandmark:"Eliminar punto de referencia",referenceLandmarkLabel:"Nombre",referenceLandmarkLabelPlaceholder:"Árbol que tapa, valla…",referenceAdoptPose:"Adoptar como pose del observador",referenceAdoptRationale:"Medido en la foto «{title}»: {n} puntos de referencia alineados, {deg}° de desviación residual",referenceStreetSearch:"Fotos a pie de calle cercanas",referenceStreetNoPlace:"Dé primero un lugar a la grabación: las fotos se buscan alrededor",referenceStreetSearching:"Buscando fotos tomadas cerca…",referenceStreetNone:"Ninguna foto a pie de calle a menos de {m} m (Panoramax)",referenceStreetFailed:"No se pudo contactar con Panoramax",referenceStreetAdd:"Añadir",traceImport:"Trazos del investigador (KML, KMZ)",trace:"Trazo",deleteTrace:"Eliminar el trazo",traceTitle:"Nombre",traceSource:"Fuente",traceImported:"{n} importado(s) de {name}.",traceSkipped:"Omitido: {what}.",traceNone:"Ninguna línea, lugar ni contorno en este archivo.",traceFailed:"No se pudo leer este archivo.",traceKindPoint:"lugar",traceKindLine:"línea",traceKindPolygon:"contorno",referenceStreetItem:"{distance} m a {bearing}°, {date}{panorama}",referenceStreetPanorama:" — 360°",referenceStreetTitle:"Foto a pie de calle a {distance} m a {bearing}°, {date}",skyLine:"Cielo: {parts}",skyStarsEye:"estrellas hasta la magnitud {limit}, lo más tenue que alcanzaba un ojo bajo este cielo",skyStarsDeeper:"estrellas hasta la magnitud {limit} a través de un {device} — {gain} magnitudes más allá de las {eye} que alcanzaban los ojos del observador",skyStarsShallower:"estrellas hasta la magnitud {limit} a través de un {device} — {gain} magnitudes por debajo de las {eye} que alcanzaban los ojos del observador",skyStarsCatalogue:", dibujadas hasta {catalogue}, donde se detiene el catálogo de este proyecto",skyStarsNone:"ninguna estrella se distinguía en un cielo tan claro",skyDetails:"Ver los registros completos",skyDetailsHide:"Ocultar los registros",skyShowerActive:"{name} — radiante a {altitude}° sobre el horizonte, {bearing} — unos {rate}/h bajo este cielo, sobre un fondo esporádico de {sporadic}/h",skyShowerBelowHorizon:"{name} está activa, pero su radiante está bajo el horizonte — no ha podido producir nada",skyNothingActive:"ninguna lluvia de meteoros activa en esta fecha — un fondo esporádico de unos {sporadic}/h",showMeteor:"Muéstrame uno",skyComet:"El {name}, magnitud {magnitude}, a {altitude}° sobre el horizonte {bearing}, cola de {tail}° de largo",skyCometNoTail:"El {name}, magnitud {magnitude}, a {altitude}° sobre el horizonte {bearing}",skyCometBelowHorizon:"El {name} estaba ahí, de magnitud {magnitude}, pero bajo el horizonte — nadie aquí lo vio",skyCometInDaylight:"El {name}, magnitud {magnitude}, a {altitude}° sobre el horizonte {bearing} — pero a solo {elongation}° del Sol",showComet:"Muéstrame el cometa",skyNova:"La {name}, una estrella nueva de magnitud {magnitude}, a {altitude}° sobre el horizonte {bearing}",skyNovaBelowHorizon:"La {name} brillaba con magnitud {magnitude}, pero bajo el horizonte: nadie aquí la vio",showNova:"Muéstrame la estrella nueva",skyEclipsePartial:"Eclipse de Sol: la Luna oculta el {percent} % del Sol a las {time}, a {altitude}° sobre el horizonte {bearing}",skyEclipseTotal:"Eclipse total de Sol: el Sol queda totalmente oculto desde las {time} durante {duration}, a {altitude}° sobre el horizonte {bearing}",skySupermoon:"Luna llena a {distance} km: {diameter}° de ancho, un {percent} % más que a su distancia media — una «superluna», y no más grande en el horizonte que en lo alto",skyMicromoon:"Luna llena a {distance} km: {diameter}° de ancho, un {percent} % menos que a su distancia media — una «microluna», y no más pequeña en el horizonte que en lo alto",skyRedMoon:"La «lune rousse»: la Luna llena de la lunación que sigue a la Pascua, a {altitude}° sobre el horizonte {bearing} — baja, y por eso enrojecida por el aire que atraviesa, y ni más grande ni más brillante que otra",skySatellitePasses:"{count} satélites cruzaron este cielo con brillo suficiente para ser vistos, el más brillante {name}, magnitud {magnitude}, a {altitude}° sobre el horizonte {bearing} a las {time}",skySatellitePassesOne:"un satélite cruzó este cielo con brillo suficiente para ser visto: {name}, magnitud {magnitude}, a {altitude}° sobre el horizonte {bearing} a las {time}",skySatelliteTrain:"entre ellos un tren de {count} Starlink lanzados el {date}",skySatellitePassesNone:"según los elementos orbitales archivados para esa fecha, ningún satélite iluminado cruzó este cielo con brillo suficiente para ser visto",skySatelliteElementsGap:"ningún elemento orbital archivado cerca de esa fecha",skyReentries:"reentradas registradas: {list}",skyReentriesMore:"{count} más",skyReentrySeen:"{name} cayó a las {time}, visto desde {place} (a {distance} km)",skyReentryObserved:"{name} cayó a las {time}, visto",skyReentryOffset:", a {minutes} min de la observación",skyReentryPredicted:"{name} cayó hacia las {time} ± {hours} h, no se sabe dónde",skyReentryDay:"{name} cayó el {date} (UTC), sin hora ni lugar conocidos",skyFireballs:"{count} bólidos registrados por la Global Meteor Network, el más brillante de magnitud {magnitude} a las {time}, a {altitude}° de altura {bearing}, a {distance} km ({stations} estaciones)",skyFireballsOne:"un bólido registrado por la Global Meteor Network: magnitud {magnitude} a las {time}, a {altitude}° de altura {bearing}, a {distance} km ({stations} estaciones)",showFireball:"Mostrar el bólido",showSatellite:"Muéstrame un satélite",skyOpticsPossible:"nubes de hielo suficientes, alrededor {source}, para {forms}",skyOpticsAlignment:" — todo salvo los anillos necesita cristales que caigan horizontales, aquí supuestos alineados al {alignment} %, ya que ningún registro lo da",skyOpticsHalo22:"un anillo de {angle}°",skyOpticsHalo46:"un anillo de {angle}°",skyOpticsParhelia:"parhelios a {angle}° a cada lado",skyOpticsTangentArc:"un arco tangente encima",skyOpticsParhelicCircle:"un círculo blanco que da la vuelta al cielo a su misma altura",skyOpticsCircumzenithal:"un arco circuncenital a {angle}° de altura",skyOpticsCircumhorizontal:"un arco circunhorizontal muy por debajo",skyOpticsPillar:"un pilar alzado sobre él",skyOpticsNoIce:"sin nubes de hielo: ni halo ni parhelios",skyOpticsHidden:"nubes de hielo en altura, pero una capa más baja entre ellas y el observador",skyOpticsSun:"del Sol",skyOpticsMoon:"de la Luna",skyBowPossible:"lluvia y sol suficientes para {forms}",skyBowMoon:"lluvia bajo una Luna iluminada al {lit} %, suficiente para {forms} — un arcoíris lunar, que el ojo ve como un arco blanco",skyGlowBand:"la Vía Láctea a {contrast}× el fondo del cielo, a {altitude}° de altura {bearing}",skyGlowCone:"la luz zodiacal a {contrast}× el fondo del cielo, a {altitude}° de altura {bearing}, a {elongation}° del Sol — un tenue cono de luz inclinado, de bordes difusos, desaparecido en menos de una hora",skyGlowZodiacalBand:"la banda zodiacal a {contrast}× el fondo del cielo, a {altitude}° de altura {bearing} — toda la eclíptica débilmente encendida, que no es lo que la gente cuenta",skyGlowMoon:"ni Vía Láctea ni luz zodiacal: una Luna iluminada al {lit} % mantenía el cielo en {sky} magnitudes por segundo de arco cuadrado, cuando necesitan 22",skyGlowTwilight:"ni Vía Láctea ni luz zodiacal: el crepúsculo aún mantenía el cielo en {sky} magnitudes por segundo de arco cuadrado, cuando necesitan 22",skyGlowTowns:"ni Vía Láctea ni luz zodiacal: el resplandor de las ciudades mantenía el cielo en {sky} magnitudes por segundo de arco cuadrado, cuando necesitan 22",skyGlowNothingUp:"cielo bastante oscuro ({sky} magnitudes por segundo de arco cuadrado), pero ni el plano galáctico ni la eclíptica estaban lo bastante altos en él",skyBowPrimary:"un arco de {radius}° de radio, con la cima a {top}° de altura",skyBowSecondary:"un segundo, más tenue, a {radius}°, con los colores invertidos",skyBowSourceTooHigh:"lluvia, pero con el astro a {altitude}° de altura ningún arco podía asomar sobre el horizonte: se sitúan a {radius}° del punto opuesto",skyBowHidden:"lluvia, pero una capa continua entre ella y la luz: ningún arco",skyBowNoSource:"lluvia, y nada iluminado para formar un arco con ella",skySatellitesLit:"la sombra de la Tierra estaba a {height} km sobre el observador, así que la órbita baja seguía al sol — {count} objetos catalogados estaban en órbita ese mes",skySatellitesLitWith:"la sombra de la Tierra estaba a {height} km sobre el observador, así que la órbita baja seguía al sol — {count} objetos catalogados estaban en órbita ese mes, entre ellos {eras}",skySatellitesShadowed:"la sombra de la Tierra estaba a {height} km sobre el observador: de los {count} objetos catalogados en órbita ese mes, nada en órbita baja estaba iluminado",skySatellitesNotYet:"aún no se había puesto nada en órbita",skySatellitesDaylight:"todo lo que estaba en órbita estaba iluminado, como siempre de día, y {eras} podían brillar más que incluso este cielo",skySatellitesDaylightOne:"todo lo que estaba en órbita estaba iluminado, como siempre de día, y {eras} podía brillar más que incluso este cielo",skyUnknown:"no se puede determinar sin una fecha y un lugar",lookAtDecor:"Mirarlo",addDecor:"Añadir",deleteDecor:"Eliminar elemento del decorado",undo:"Deshacer",redo:"Rehacer",viewAccount:"Ver el relato",noObserverRecording:"No hay URL de grabación para este observador",masks:"Oculta",masksNone:"Aún no hay fenómeno que ocultar",masksBodyFully:"oculto por este objeto",masksBodyPartly:"oculto al {share} % por este objeto",masksBodyNot:"no oculto por este objeto",modelPickerTitle:"Elegir un modelo 3D",modelPickerClose:"Cerrar",modelPickerChoose:"Elegir un modelo 3D",modelPickerUse:"Usar este modelo",modelPickerIncomplete:"No se dibuja hasta indicar el nombre y la licencia del modelo",addObserver:"Añadir observador",surveyLabel:"Decorado tomado de un levantamiento",surveySource:"Decorado tomado de",surveyDated:"Levantado el: {dates}.",surveyLaserLabel:"láser",surveyPhotoLabel:"foto aérea",surveyMapLabel:"mapa",surveyLampsLabel:"OpenStreetMap",surveyWarning:"⚠ Este decorado viene de levantamientos del {survey}, posteriores a la observación ({observation}): no es lo que había allí entonces. Consérvalo como referencia, o elimínalo.",surveyRadius:"Radio",surveyRadiusTitle:"Hasta dónde alrededor del observador se consulta el levantamiento, en metros. Un radio mayor trae edificios, puentes y líneas más lejanos; los árboles vienen del láser, que solo se consulta dentro de 150 m.",surveySourceTitle:"El levantamiento del que se toman, por sí solos, los árboles, edificios, puentes y líneas aéreas alrededor del lugar cuando das un lugar al registro: se ponen en la lista, en su lugar, altura y anchura medidos. Las coordenadas del lugar se envían a ese servicio. Ninguno deja el decorado a tu cargo. Lo que colocaste tú nunca se toca.",surveySourceNone:"Ninguno (todo a mano)",surveyBusy:"Buscando el decorado alrededor del observador…",surveyDone:"Según {source}: árboles {trees}, edificios {buildings}, puentes {bridges}, líneas eléctricas {lines}. Son los del día del levantamiento, no los de la grabación: consérvelos, muévalos o elimínelos.",surveyNone:"No se encontró ningún árbol, edificio, puente ni línea eléctrica en un radio de {radius} m.",surveyKept:"Lo que usted colocó se queda como está.",surveyUnreachable:"No se pudo contactar con el levantamiento. Inténtelo más tarde.",surveyFurniturePending:"Alumbrado público y semáforos: esperando a OpenStreetMap…",surveyFurnitureDone:"Según {source}: farolas {lamps}, semáforos {signals}, pasos de peatones {crossings}, señales {signs}.",surveyFurnitureUnavailable:"Alumbrado público y semáforos no disponibles por ahora: OpenStreetMap no responde.",surveyFurnitureRetry:"Reintentar",narrativePlaceholder:"Lo que refirió el observador, con sus propias palabras",narrativeSource:"Redactado por",narrativeNeedsSetting:'Rellena "{setting}" ({source}) para generar una reconstrucción a partir del relato',narrativeNeedsAsk:"Nada que enviar todavía",narrativeRemember:"Recordar en este dispositivo",narrativeDraft:"Generar reconstrucción",narrativeStop:"Detener",narrativeWorking:"Leyendo el relato…",narrativeApplied:"{count} campos escritos en el editor",narrativeUnchanged:"El relato no dice nada que la grabación pueda contener todavía",narrativeStated:"Lo que dijo el observador",narrativeDerived:"Deducido del relato",narrativeAssumed:"Supuesto, para que la reconstrucción funcione — compruébalo",narrativeGaps:"Lo que nada pudo resolver",narrativeErrorCredential:"No hay clave, o fue rechazada — compruébala en console.anthropic.com",narrativeErrorRateLimited:"Demasiadas solicitudes en tu cuenta: espera un momento y vuelve a pedirlo",narrativeErrorRefused:"El relato no obtuvo respuesta. Reformularlo puede ayudar; volver a pedirlo, no",narrativeErrorMalformed:"La respuesta no era un borrador utilizable — vale la pena pedirlo una vez más",narrativeErrorUnreachable:"Nada respondió: revisa la conexión",narrativeErrorRejected:"Rechazado: {detail}",observerAge:"Edad entonces",observerBirth:"Nacido el",observerPerception:{"color-vision":"Visión del color","color-vision.hint":"Cómo se ven los colores con conos distintos (Machado et al. 2009). Solo recolorea: brillo y resolución no cambian.","color-vision.type":"Tipo","color-vision.type.normal":"Típica","color-vision.type.protan":"Protán (rojo débil o ciego)","color-vision.type.deutan":"Deután (verde débil o ciego)","color-vision.type.tritan":"Tritán (azul débil o ciego)","color-vision.severity":"Gravedad",intoxication:"Alcohol","intoxication.hint":"Reduce la sensibilidad al contraste unos 0,9 dB con 0,08 % de alcohol en sangre (un estudio controlado; los resultados varían), mostrado hasta 0,1 % como máximo: un nivel mayor se registra pero se muestra como 0,1 %, ya que nada se midió por encima. La visión doble, el campo reducido y otras drogas no se modelan: ninguna fuente los cuantifica.","intoxication.bloodAlcohol":"Alcoholemia",fatigue:"Fatiga","fatigue.hint":"Solo declarada: no se ha demostrado que la falta de sueño cambie lo que recibe un ojo sano, así que la imagen no cambia. Afecta a la atención y la memoria, no a la vista.","fatigue.hoursAwake":"Despierto desde hace"},observerOccupation:"Profesión",accountSource:"Relato obtenido",accountUrl:"Fuente (URL)",accountSourceUnknown:"desconocido",accountSourceOnSite:"investigación in situ",accountSourceInterview:"entrevista en persona",accountSourceTelephone:"por teléfono",accountSourceQuestionnaire:"cuestionario",accountSourceLetter:"lo escribió el observador",accountSourceSocialMedia:"lo publicó el observador en internet",accountSourcePress:"prensa o radiodifusión",accountFollowedUp:"Recontactado",accountUnknown:"desconocido",accountYes:"sí",accountNo:"no",questionUnanswered:"Nada en esta grabación responde a una de las preguntas que una reconstrucción necesita resolver",durationRequired:"La observación necesita una duración para poder reproducirse — indícala, o una hora de fin, que puede ser aproximada",questionsUnanswered:"{count} de las preguntas que responde una reconstrucción completa quedan sin respuesta aquí",emptyDecor:"Ningún elemento del decorado",emptyMilestones:"Ningún momento",emptyReferences:"Ninguna foto",emptyReferenceLandmarks:"Ningún punto de referencia",emptyTraces:"Ningún trazado del investigador",emptyShapes:"Ninguna forma",addReference:"Añadir una foto",principalObserver:"Observador de este relato",deleteObserver:"Eliminar el observador"};export{o as sightingEditorMessages_es};
@@ -1,12 +0,0 @@
1
- const e={basisTitle:"Come è stato ottenuto questo valore",basisField:"Base",howField:"Come",rationaleField:"Giustificazione",basisReset:"Base riportata a «dichiarata»: il valore è stato riscritto (era: {basis}).",lawSources:"Fonti: {sources}",extrapolation:"Queste leggi sono misurate su osservazioni notturne: applicarle a un'osservazione diurna è un'estrapolazione.",sectionAccountConditions:"Condizioni della testimonianza",sectionViewing:"Condizioni di visione",sectionMoon:"Calibro Luna",sectionErrorParameters:"Parametri d'errore di questo testimone",errorModelField:"Modello d'errore",delayField:"Ritardo prima di questo racconto",delayUnit:"giorni",versionField:"Versione",wordField:"Parola usata",exposureField:"Esposizione",independenceField:"Indipendenza",independentYes:"senza aver parlato con gli altri testimoni",independentNo:"dopo aver parlato con gli altri testimoni",unknownChoice:"non si sa",darkAdapted:"Adattato al buio",correctedVision:"Vista corretta (occhiali, lenti)",glare:"Luce intensa poco prima",viewingNote:"Il vetro o il parabrezza e il binocolo si impostano in «Visione» qui sopra.",moonIntro:"Il testimone mostra la Luna piena come ha mostrato l'oggetto. Il rapporto dà il suo fattore di dimensione angolare: l'unica misura che rende individuale la legge generale. Da rilevare una volta per testimone.",moonField:"Luna come mostrata",moonHint:"A braccio teso, 1 cm ≈ 1°",moonNone:"Non ancora misurata: si applica la legge generale ({law}).",moonFactor:"Fattore ×{k}: sostituisce la legge generale in tutte le dimensioni angolari di questo testimone.",moonReal:"Luna reale · 0,52°",parametersIntro:"Gli errori di uno stesso testimone sono legati: lo stesso fattore su tutte le dimensioni, lo stesso scarto su tutte le ore. Calcolati, mai scritti: nessun margine «±» si inserisce a mano.",showMore:"Mostra",basis:{measured:"◆ misurata",stated:"dichiarata",derived:"dedotta",assumed:"supposta"},how:{clock:"letta su un orologio",anchored:"ancorata a un evento datato",estimated:"stimata","shown-on-the-spot":"mostrata sul posto","arm-length-gauge":"calibro a braccio teso","recalled-object":"riferita a un oggetto noto",instrument:"strumento",landmark:"riferimento del paesaggio",occlusion:"occultazione","known-size":"dimensione nota",triangulation:"triangolazione"},status:{consolidated:"consolidata",individual:"individuale",single:"studio unico",argued:"argomentata",contested:"contestata"},laws:{timeClock:"± {minutes} min (letta su un orologio)",timeAnchored:"± {minutes} min (ancorata a un evento datato)",timeEstimated:"± {minutes} min per 9 testimoni su 10 (stimata)",duration:"da {low} a {high}: ×/÷{factor} (log-normale)",elevationOver:"da {low} a {high}: altezza sovrastimata",measuredInstrument:"± {degrees}° (misurata)",measuredLandmark:"± {degrees}° (da un riferimento)",headingCross:"da {low} a {high}: ± {degrees}°, verso talvolta invertito",sizeMoon:"da {low} a {high}: fattore ×{factor} del calibro Luna",sizeShown:"da {low} a {high}: mostrata sul posto, da +2 a +17 %",sizeRecalled:"da {low} a {high}: riferita a un oggetto noto, ~30 % troppo grande",sizeArm:"da {low} a {high}: sovrastimata da ×{from} a ×{to} a braccio teso",sizeGauge:"da {low} a {high}: calibro, ± {percent} %",distanceAnchored:"Ancorata: il suo errore segue quello di ciò da cui è dedotta",distanceNotData:"Non è un dato: sbagliata di un fattore {factor} o più senza ancoraggio"},parameterNames:{clock:"Scarto dell'orologio",date:"Scarto di data",heading:"Rotazione della direzione",elevation:"Compressione delle altezze",size:"Fattore di dimensione angolare",duration:"Fattore di durata"},parameterScopes:{clock:"tutte le ore",date:"la data",heading:"tutte le direzioni",elevation:"tutte le altezze",size:"tutte le dimensioni angolari",duration:"la durata e la scala della timeline"},parameters:{clockClock:"± {minutes} min (orologio)",clockAnchored:"± {minutes} min (ancorata)",clockEstimated:"± {minutes} min (stimata)",dateShift:"±1 giorno, mese o anno; ora legale ({percent} % delle date)",headingRotation:"± {degrees}°, specchio possibile",elevationCompression:"sovrastimate, mai sottostimate",sizeMoon:"×{factor} (calibro Luna)",sizeArm:"da ×{from} a ×{to} a braccio teso",sizeShown:"da +2 a +17 % mostrata sul posto",durationFactor:"×/÷{factor} (log-normale)"},words:{light:"luce",object:"oggetto",craft:"velivolo",ufo:"ufo",other:"altro"},exposures:{none:"nessuna",press:"stampa",broadcast:"radio, televisione","other-witnesses":"altri testimoni",investigators:"investigatori"},models:{consolidated:"Letture consolidate (UFO@home)",keul:"Keul (dimensioni mostrate sul posto)"},candidates:{title:"Spiegazioni candidate",verdicts:{consolidated:"Compatibile con distorsioni consolidate",contested:"Solo invocando distorsioni contestate",incompatible:"Incompatibile anche ai limiti"},cost:"costo {x} σ",seeVariant:"Vedi questa variante",variantLabel:"Variante: {name}",backToAccount:"Torna al racconto",costNote:"Un costo non è una probabilità: dice quali distorsioni bisogna invocare, e di quanto.",scopeNote:"Matrice di Poher (1977) per la lista di partenza; la Luna, i pianeti, i passaggi di satelliti, i rientri, i bolidi registrati e gli aerei del tracciato sono calcolati e confrontati con il racconto.",fields:{time:"Ora",heading:"Azimut",elevation:"Altezza sull'orizzonte",size:"Larghezza apparente",duration:"Durata",sweep:"Percorso nel cielo"},biases:{clock:"scarto dell'orologio {x} min",heading:"rotazione della direzione {x}°",elevation:"altezza sovrastimata ×{x}",size:"dimensione sovrastimata ×{x}",duration:"durata stimata male ×{x}",sweep:"percorso stimato male {x}°"},reasons:{"never-seen":"Mai visibile da questo luogo nel margine dell'ora data.",direction:"Troppo lontano dalla direzione data, anche ai limiti delle leggi.",size:"Dimensione troppo diversa, anche ai limiti delle leggi.",motion:"Non si muove come dice il resoconto, e nulla fa leggere l'uno per l'altro.",growth:"Non cresce come dice il resoconto, né diventa più luminoso."},readingTitle:"Lettura",readings:{grouped:"luci lette come un solo corpo","still-seen-moving":"una luce ferma vista muoversi (effetto autocinetico, nuvole che scorrono)","moving-seen-still":"una luce in moto vista immobile (in arrivo di fronte)","brightening-as-approach":"una luminosità crescente letta come un avvicinamento"},notAgainst:"Non è un argomento contro il racconto.",noDirection:"Il racconto non colloca il fenomeno nel cielo: non c'è nulla da confrontare.",noSky:"Senza data, ora e luogo, nessun astro può essere collocato.",bodies:{Moon:"Luna",Venus:"Venere",Mars:"Marte",Jupiter:"Giove",Saturn:"Saturno"},aircraft:"Aeromobile {name}",interpretation:"Interpretazione: {name}",keepVariant:"Conserva questa variante",keptTitle:"Varianti conservate ({n})",seeKept:"Vedi",removeVariant:"Rimuovi",keptRecomputed:"ricalcolata: {verdict}, costo {x} σ",keptModel:"modello: {model}",reentry:"Rientro {name}",star:"Stella {name}",fireball:"Bolide {name}",poherLoading:"Caricamento della matrice di Poher…",poherFailed:"Non è stato possibile leggere la matrice di Poher: sono proposti solo gli astri.",poherTitle:"Secondo la matrice di Poher (1977)",poherIntro:"Gli altri fenomeni noti della matrice, senza traiettoria calcolata qui: il loro punteggio è il giudizio di Poher, da confrontare a mano.",poherPossible:"Possibili",poherExcluded:"Esclusi ({n})",poherExcludedBy:"escluso da: {list}",poherDoubted:"dubbio secondo stime: {list}",poherScore:"punteggio {x}",poherTag:"Poher: {state}",poherStatePossible:"possibile, punteggio {x}",poherStateExcluded:"escluso",answersTitle:"Risposte dedotte dalla registrazione ({n})",firm:"ferma",soft:"stima, da sola non esclude nulla"}},o={color:"Colore",transparency:"Trasparenza",halo:"Alone",blur:"Sfocatura",brightness:"Brillantezza",shapeTitle:"Nome",utcOffset:"Fuso orario",cloudBase:"Base delle nuvole",elevation:"Altitudine",heightAboveGround:"Altezza dal suolo",duration:"Durata",placeName:"Luogo",latitude:"Latitudine",longitude:"Longitudine",heading:"Orientamento",pitch:"Inclinazione",roll:"Rollio",sway:"Oscillazione a riposo",swayTitle:"Quanto il corpo che regge lo strumento muove la vista quando non cammina: 1 per una persona in piedi, 0 per un treppiede. Vuoto: 1 (0 se il resoconto dice che l'osservatore era paralizzato)",lightPollution:"Cielo notturno",lightPollutionTitle:"Lo zenit di una notte senza Luna in questo luogo, in magnitudini per secondo d'arco quadrato, come lo legge uno Sky Quality Meter o lo dà l'atlante mondiale della brillanza artificiale del cielo (Falchi et al. 2016, lightpollutionmap.info, «SQM»). 22 è un cielo naturale; una periferia è intorno a 19, un centro città a 17. Vuoto: un cielo naturale",observationTime:"Inizio dell'osservazione",observationEndTime:"Fine dell'osservazione",assessmentGroup:"Valutazione",assessmentNames:{coverage:"Dati dell'osservatore"},assessmentVerdicts:{"hynek.nl":"NL — luce notturna","hynek.dd":"DD — disco diurno","hynek.rv":"RV — radar-visivo","hynek.ce1":"IR1 — incontro ravvicinato","hynek.ce2":"IR2 — con traccia fisica","hynek.ce3":"IR3 — con entità"},timeQualifierApproximate:"Approssimativa",timeQualifierUncertain:"Incerta",timeQualifierBoth:"Incerta e approssimativa",timeSeasonSpring:"Primavera",timeSeasonSummer:"Estate",timeSeasonAutumn:"Autunno",timeSeasonWinter:"Inverno",summaryGroups:{observation:"Osservazione",location:"Posizione",temporal:"Tempo",weather:"Meteo",sound:"Suono"},summaryGroup:"Riepilogo",summaryDescription:"Descrizione",closeDescription:"Chiudi la descrizione",observerGroup:"Osservatore",observerId:"ID",observerTitle:"Titolo",observerLastName:"Cognome",observerFirstNames:"Nomi",sightingId:"ID",tags:"Etichette",cloudCover:"Copertura nuvolosa",highCloudCover:"Nubi di ghiaccio (cirri)",focalLength:"Lunghezza focale",fieldOfView:"Campo visivo",aperture:"Apertura",exposure:"Esposizione",focusDistance:"Messa a fuoco a",iceCrystalAlignment:"Allineamento dei cristalli",rareIceCrystals:"Cristalli rari",cloudDarkness:"Oscurità delle nuvole",precipitationType:"Precipitazioni",precipitationNone:"Nessuna",precipitationRain:"Pioggia",precipitationSnow:"Neve",precipitationHail:"Grandine",precipitationIntensity:"Intensità",windDirection:"Direzione del vento",windSpeed:"Velocità del vento",storm:"Temporale",cloudsGroup:"Nuvole",precipitationGroup:"Precipitazioni",windGroup:"Vento",soundKind:"Suono",soundNone:"Nessuno (silenzioso)",soundHum:"Ronzio",soundWhistle:"Fischio",soundRumble:"Rombo",soundCrackle:"Crepitio",soundVolume:"Volume",soundPitch:"Tono",soundSrc:"Registrazione",instrument:"Osservato con",filter:"Davanti",filterNone:"niente",filterSolarVisual:"un filtro solare per l'occhio (occhiali da eclissi, densità 5)",filterSolarPhoto:"una pellicola solare per fotocamera (densità 3,8)",decorAircraft:"Aeromobile",decorEntity:"Essere",decorAltitude:"Altitudine",decorLights:"Luci",decorLightsNone:"nessuna",decor:"Ambiente",decorBuilding:"Edificio",decorTree:"Albero",decorShrub:"Cespuglio",decorBridge:"Ponte",decorWire:"Linea aerea",decorCrop:"Filare di coltura",decorTerrace:"Terrazzamento",decorMound:"Mucchio di pietre",decorWall:"Muretto a secco",decorStreetlight:"Lampione",decorTrafficLight:"Semaforo",decorCrossing:"Attraversamento pedonale",decorRoadSign:"Segnale stradale",decorVehicle:"Veicolo",decorObserver:"Altro osservatore",decorEast:"Distanza a est",decorNorth:"Distanza a nord",decorHeading:"Orientamento",decorColor:"Colore",decorLit:"Acceso",decorTitle:"Nome",milestones:"Momenti",milestoneLabel:"Etichetta",milestoneNote:"Cosa succede",addMilestone:"Dai un nome a questo momento",deleteMilestone:"Elimina momento",goToMilestone:"Vai a questo momento",decorWidth:"Larghezza",decorLength:"Lunghezza",decorHeight:"Altezza",decorModel:"Modello 3D",decorModelAdvanced:"Modello da un indirizzo",decorModelUrl:"Indirizzo glTF/GLB",decorModelTitle:"Nome del modello",decorModelAuthor:"Autore",decorModelLicense:"Licenza",decorModelSource:"Provenienza",decorObserverSide:"Posizione dell'osservatore",decorObserverSideNone:"Non presente",decorSideFront:"Davanti",decorSideBehind:"Dietro",decorSideLeft:"Sinistra",decorSideRight:"Destra",decorSideFrontLeft:"Davanti a sinistra",decorSideFrontRight:"Davanti a destra",decorSideBehindLeft:"Dietro a sinistra",decorSideBehindRight:"Dietro a destra"},a={...o,oval:"Ovale",polygon:"Poligono",modelTriangle:"Triangolo",modelSaucer:"Disco volante",modelCigar:"Sigaro",modelChevron:"Chevron",modelLight:"Luce",modelPartDisc:"disco",modelPartDome:"cupola",addVertex:"Aggiungi vertice",deleteVertex:"Elimina vertice",notAPolygon:"Seleziona una sola forma poligonale",tooFewVertices:"Una forma ha bisogno di almeno 3 punti",shape:"Forma",apparentWidth:"Larghezza apparente",realWidth:"Larghezza reale",distance:"Distanza",shapeRotation:"Rotazione",shapeRotationTitle:"Di quanto la forma è ruotata nel disegno, in senso orario, in gradi: ciò che regola la sua maniglia di rotazione",sizeLock:"Mantieni",lockNone:"niente",lockApparent:"la larghezza apparente",lockReal:"la larghezza reale",lockDistance:"la distanza",apparentSize:"{moons}× la Luna",utcOffsetPlaceholder:"dalla longitudine",realSizeBetween:"La scena delimita quella larghezza: tra {min} e {max} m, in base a ciò che attraversa",realSizeAtLeast:"La scena delimita quella larghezza: almeno {min} m, in base a ciò dietro cui passa",realSizeAtMost:"La scena delimita quella larghezza: al massimo {max} m, in base a ciò davanti a cui passa",realSizeUnknown:"Nulla nella scena delimita quella larghezza: è solo ciò che la distanza implica",realSizeOutside:" — la larghezza qui sopra ne è fuori",blurBound:"Sfocato attraverso questo obiettivo: più vicino di {max} m",blurBoundNoInstrument:"La sfocatura a occhio nudo non delimita alcuna distanza — un occhio non ha un diaframma con cui andare fuori fuoco",blurBoundNotAtInfinity:"La sfocatura delimita una distanza solo per un obiettivo messo a fuoco all'infinito: questo è a fuoco a {focus} m, il che sfoca da entrambi i lati",realSizeContradiction:"Contraddizione: gli attraversamenti dichiarati non possono essere tutti veri",realDistanceHere:" — cioè qui tra {min} e {max} m",clearDistanceHypothesis:"Ritira l'ipotesi di distanza",clearDistanceHypothesisTitle:"Torna a ciò che la registrazione stabilisce",depthStated:"Disegnato a {m} m, come dichiara la registrazione",depthHypothesis:"Disegnato a {m} m: la tua ipotesi — ciò che la scenografia ne nasconde è ciò che perderebbe una cosa così lontana",depthDerived:"Disegnato a {m} m, in base alla camminata stessa dell'osservatore",depthBounded:"Disegnato a {m} m, in base a ciò dietro e davanti a cui passa",depthConventional:"Disegnato a {m} m per convenzione: nulla nella registrazione stabilisce una distanza",addShape:"Aggiungi forma",deleteShape:"Elimina forma",play:"Riproduci",pause:"Pausa",noDuration:"Nessuna durata di osservazione",previousKeyframe:"Fotogramma chiave precedente",nextKeyframe:"Fotogramma chiave successivo",keyframeMark:"Fotogramma chiave",shapesTrack:"forme",observerTrack:"osservatore",weatherTrack:"meteo",soundTrack:"suono",group:"Raggruppa",ungroup:"Separa",duplicate:"Duplica",bringToFront:"Porta in primo piano",sendToBack:"Porta in fondo",contextMenuDelete:"Elimina",onlyOneShape:"C'è una sola forma",alreadyAtFront:"Questa forma è già in primo piano",alreadyAtBack:"Questa forma è già in fondo",needTwoShapesToGroup:"Seleziona almeno due forme per raggrupparle",notGrouped:"Questa forma non fa parte di un gruppo",multipleShapesSelected:"Più forme selezionate — selezionane una sola per modificare questo",samplingRate:"Frequenza di campionamento",currentPosition:"Posizione attuale",switchToElapsed:"clicca per mostrare il tempo trascorso",switchToClockTime:"clicca per mostrare l'ora del giorno",durationPlaceholder:"durata dell'osservazione",durationImprecise:"Queste date non determinano con sufficiente precisione una durata — inseriscila manualmente.",export:"Salva",frozenTitle:"Dati congelati",frozenHint:"Ciò che la scena chiederebbe altrimenti a terzi a ogni riproduzione (rilievo, foto del suolo, strade, acqua, ferrovie, alta atmosfera), rilevato al salvataggio e conservato in file accanto alla registrazione, perché si riproduca uguale senza chiedere nulla a nessuno.",frozenLive:"Interrogare le fonti a ogni riproduzione (non congelare nulla)",frozenRelief:"Rilievo",frozenImagery:"Foto del suolo",frozenRoads:"Strade",frozenWater:"Acqua",frozenRailways:"Ferrovie",frozenUpperAir:"Alta atmosfera",frozenMap:"Foto della mappa",fileItemRecording:"Registrazione",fileItemWeather:"Meteo",fileItemPlace:"Luogo",fileItemLightPollution:"Inquinamento luminoso",fileItemDecor:"Scenografia",weatherStatedByObserver:"come l'ha data l'osservatore",annexSource:"File",annexStorageInline:"dentro la registrazione stessa",annexEditorLabel:"L'allegato come testo JSON",annexUnreadable:"Questo file non è un allegato di questo tipo: non è cambiato nulla.",frozenTakenOn:"rilevato il {date}",frozenPending:"rilevato al salvataggio",frozenLiveState:"chiesto in diretta",frozenRefresh:"Aggiorna",frozenTaking:"Rilevamento: {group}… {done}/{of}",frozenFailed:"{group}: la fonte non ha risposto, nulla è stato rilevato.",frozenMissing:"{file} illeggibile: lasciato fuori dall'archivio.",frozenExported:"Salvato con {count} allegati ({size}), in un archivio da decomprimere dove la registrazione è pubblicata.",identityHint:"Nomina qualcuno solo se vi ha acconsentito o ha pubblicato lui stesso la propria testimonianza; altrimenti bastano le iniziali.",identityAsk:"Questa registrazione nomina o colloca una persona. Rispondi di ciò che pubblichi: nomina qualcuno solo se vi ha acconsentito, o se ha pubblicato lui stesso la propria testimonianza. Altrimenti bastano le iniziali.",identityLastName:"Cognome: {value}",identityFirstNames:"Nome: {value}",identityNameInId:"Nome in un identificativo: {value}",identityNameInText:"Nome nel testo: {value}",identityAddress:"Indirizzo: {value}",identityEmail:"Indirizzo e-mail: {value}",identityPhone:"Numero di telefono: {value}",identityInitials:"Sostituisci con le iniziali",identityKeep:"Salva comunque",identityBack:"Torna indietro",importFile:"Carica un file di osservazione",paramSummaryTitle:"Ciò che indica la registrazione ({n})",wholeKeyframes:"Ogni fotogramma chiave per intero",wholeKeyframesHint:"Altrimenti un fotogramma chiave dice solo ciò che è cambiato dal precedente, come si scrive una registrazione a mano. Cambiare questa scelta svuota la cronologia di annullamento.",importUrlPlaceholder:"https://…/sighting.json",inputFileFromFile:"dal proprio disco",inputFileFromUrl:"da un indirizzo",inputFileModeHint:"Fare clic per darlo nell'altro modo: un proprio file o un indirizzo",inputFileLoad:"Carica",importError:"Impossibile caricare questa registrazione — controlla il file o l'URL e riprova.",importErrorCors:`Questo indirizzo risponde, ma il browser non ha il permesso di leggerlo da questa pagina. Il file in sé va bene: è il suo server che deve inviarlo con l'intestazione "Access-Control-Allow-Origin: *". Se il server non è tuo, è questo che devi chiedere al suo amministratore.`,importErrorMixedContent:"Una pagina sicura non può caricare un indirizzo che inizia con http://. Usa https:// se quel server lo offre.",importErrorUnreachable:"Nulla ha risposto a questo indirizzo. Controlla come è scritto e di essere connesso.",importErrorStatus:"Quel server ha risposto con un errore ({status}). Probabilmente l'indirizzo è sbagliato o il file è stato spostato.",importErrorMalformed:"Questo indirizzo ha risposto, ma ciò che è tornato non è una registrazione.",formatVersionError:"Questo file indica la versione {found} del suo formato; questo UFO@home legge fino alla versione {supported}. Lo apra con un UFO@home più recente.",record:"Registra",stop:"Ferma",according:"secondo",sourceElevation:"Rilievo",sourceImagery:"Immagini",sourceAircraft:"Traffico aereo",sourceFile:"File",sourceKind:"Dati",placeNamePlaceholder:"Valensole, Francia",searchPlace:"Localizza",placeMatch:"Corrispondenze",placeSearching:"Ricerca del luogo…",placeMatchFound:"luogo trovato",placeMatchesFound:"luoghi trovati",placeNotFound:"Nessun luogo con questo nome",placeSearchFailed:"Ricerca dei luoghi momentaneamente non disponibile",utcOffsetNoZone:"Nessun fuso indica questo scarto quel giorno",utcOffsetImplausible:"Questo fuso orario non corrisponde alla longitudine inserita, la cui ora solare è UTC{solar} — eppure la scena e il rilevamento meteo obbediscono a ciò che è dichiarato qui. Svuota il campo per ricavarlo dalla longitudine.",timeZoneManual:"sconosciuto",altitudeAboveSeaLevel:"Altitudine dell'osservatore sul livello del mare — il suolo del luogo inserito ne fissa il minimo: un osservatore sulle Alpi non è a 0 m.",groundAt:"suolo a {m} m",headingPlaceholder:"sconosciuto",edtfInvalid:"Data/ora EDTF non valida (es. 1965-07-01T05:00, 2025-06?, 2025~).",edtfPlaceholder:"AAAA-MM-GGThh:mm[?~%] o hh:mm",observationTimeHint:"EDTF — es. 1965-07-01T05:00, 2025-06? (incerto), 2025~ (approssimativo), o solo 05:00 se la data non è nota",observationEndTimeHint:"EDTF — es. 1965-07-01T05:10, 2025-06? (incerto), 2025~ (approssimativo), o solo 05:10 se la data non è nota",presetsGroupLabel:"Forma dell'UFO",description:"Descrizione",tagsPlaceholder:"separati da virgole",weather:"Meteo",shapeGroup:"Fenomeno",shapesSubgroup:"Forme",bodiesSubgroup:"Corpi",launchesSubgroup:"Lanci",sky:"Cielo",dataSources:"Fonti dei dati",beamsSubgroup:"Fasci",soundGroup:"Suono",close:"Chiudi",editorKicker:"Editor di avvistamento",witnessError:e,expandTracks:"Espandi le tracce",collapseTracks:"Comprimi le tracce",addKeyframeHere:"Aggiungi un fotogramma chiave qui",keyframeHere:"Qui c'è un fotogramma chiave: modificarlo lo cambia",overlayHorizon:"Orizzonte · inclinazione {deg}°",overlayFov:"Campo visivo {v}° × {h}°",overlayWind:"Soffia verso {point} · {speed} m/s",sectionIdentity:"Identità",sectionProfile:"Profilo",sectionTestimony:"Testimonianza",sectionVision:"Visione",sectionPerception:"Percezione",sectionCoordinates:"Coordinate",sectionGaze:"Sguardo",sectionNightSky:"Cielo notturno",sectionPeriod:"Periodo",sectionSurvey:"Scenario da un rilievo",sectionHeard:"Ciò che è stato udito",sectionSoundRecording:"Registrazione",sectionPicture:"Foto",sectionPose:"Posa",sectionAppearance:"Aspetto",sectionSize:"Dimensioni e distanza",sectionPath:"Traiettoria",moreSettings:"Altre impostazioni ({n})",lessSettings:"Meno impostazioni",showSettings:"Mostra ({n} impostazioni)",showSettingsOne:"Mostra (1 impostazione)",showSettingsAny:"Mostra",hideSettings:"Nascondi",save:"Salva",stateNew:"Nuova registrazione",panelIntroObservation:"Cosa è successo, in poche righe, e cosa resta da completare.",panelIntroObserver:"Chi ha visto, e con cosa. Ogni osservatore ha il proprio punto di vista nella scena.",panelIntroLocation:"Da dove guardava l'osservatore, e in quale direzione.",panelIntroTemporal:"Quando è iniziato, quanto è durato, e i momenti del racconto.",panelIntroDecor:"Ciò che circondava l'osservatore: veicoli, edifici, vegetazione.",panelIntroWeather:"Il tempo che faceva, e ciò che attraversava il cielo senza essere il fenomeno: lanci, fasci.",panelIntroShape:"Ciò che è stato visto, disegnato nella scena dal punto di vista dell'osservatore.",panelIntroSound:"Ciò che è stato udito.",panelIntroReference:"Foto e schizzi, allineati alla scena per confrontarla.",panelIntroFile:"La registrazione completa, da salvare o ricaricare.",temporalGroup:"Data",fileGroup:"File",fileLoading:"Caricamento dell'editor…",weatherEditedAsk:"Questa modifica tocca il meteo, un dato letto dinamicamente da {source}. Vuoi smettere di leggerlo da {source}?",weatherEditedStop:"Smetti di leggerlo",weatherEditedKeep:"Continua a leggerlo (annulla la mia modifica)",fileEditorLabel:"La registrazione come testo JSON",fileSearchPhrases:{Find:"Cerca",Replace:"Sostituisci",next:"successivo",previous:"precedente",all:"tutti","match case":"maiuscole","by word":"parola intera",regexp:"regexp",replace:"sostituisci","replace all":"sostituisci tutto",close:"chiudi","current match":"corrispondenza corrente","on line":"alla riga","replaced $ matches":"$ corrispondenze sostituite","replaced match on line $":"corrispondenza sostituita alla riga $","Go to line":"Vai alla riga",go:"vai"},timeQualifierExact:"Esatta",durationPrecise:"precisa",durationIso:"imprecisa",durationModeTitle:"Dire la durata esattamente, o come è stata enunciata: circa, tra due durate",durationInvalid:"Non è una durata: PT10M, PT1H30M, PT5M/PT10M…",durationHelpTitle:"Che cosa accetta il testo (EDTF)",durationHelpLines:`PT45S — 45 secondi
2
- PT10M — 10 minuti
3
- PT1H30M — 1 ora 30 minuti
4
- PT5M/PT10M — tra 5 e 10 minuti
5
- Terminare con ? se incerto, ~ se approssimativo, % per entrambi
6
- 1965-?07 — il dubbio può riguardare anche una parte`,durationChosen:"(simulata: {value})",accountView:"Resoconto",accountView2d:"2D · forme",accountView3d:"3D · corpi",accountViewHint:"Ciò che mostra il render e ciò che si modifica: le forme che l'osservatore ha disegnato, o i corpi che ha detto che fossero",datePrecise:"precisa",dateEdtf:"imprecisa",dateHelpTitle:"Che cosa accetta il testo (EDTF)",dateHelpLines:`1965 — un anno
7
- 1965-07 — un mese
8
- 1965-21 — una stagione (21 primavera, 22 estate, 23 autunno, 24 inverno)
9
- 1965-07-01 — un giorno
10
- 1965-07-01T05:00 — un giorno e un'ora
11
- 05:00 — un'ora, data sconosciuta
12
- Terminare con ? se incerto, ~ se approssimativo, % per entrambi`,edtfModeTitle:"Scrivi invece una data imprecisa: solo un anno, un mese, un'ora senza data",locationGroup:"Luogo",observerTab:"Testimone",observationGroup:"Riepilogo",weatherWhilePlaying:"Metti in pausa la registrazione per indicare il tempo — mentre scorre, l'istante in cui verrebbe scritto si sposta",weatherInferred:"Fonte",weatherInferredTitle:"Il meteo non è un resoconto: è un fatto misurabile, rilevato per la data, l'ora e il luogo dell'osservazione. Deseleziona per indicare le condizioni riferite dall'osservatore, che allora prevalgono sul rilevamento.",weatherLookingUp:"Ricerca del rilevamento…",weatherNeedsDateAndPlace:"Servono una data completa e un luogo per cercare il rilevamento",weatherNeedsDate:"Serve una data completa (anno, mese e giorno) per cercare i rilevamenti meteo",weatherNeedsPlace:"Serve un luogo con coordinate per cercare i rilevamenti meteo",weatherNoRecord:"Nessun rilevamento per questa data e questo luogo",weatherLookupFailed:"Rilevamenti meteo momentaneamente irraggiungibili",lightPollutionLookingUp:"Consultazione dell'atlante…",lightPollutionFound:"{artificial} µcd/m² di luce artificiale,",lightPollutionNatural:"Nessuna luce artificiale qui,",lightPollutionOutside:"Fuori dall'atlante (da 85°N a 60°S),",lightPollutionFailed:"Atlante al momento irraggiungibile",lightPollutionTooEarly:"L'atlante descrive il {atlasYear}; il cielo del {year} era più buio, indicarlo se è noto",instrumentOutOfPeriod:"{name} — non di quest'epoca",instrumentCategoryEye:"Occhio nudo",instrumentCategoryCamera:"Fotocamere",instrumentCategoryDslr:"Reflex digitali",instrumentCategoryPhone:"Telefoni",instrumentCategoryBinoculars:"Binocoli",instrumentCategoryTelescope:"Telescopi",instrumentNotYetOnSale:"Non esisteva ancora nel {year} (in vendita dal {from})",instrumentNoLongerOnSale:"Non esisteva più nel {year} (in vendita fino al {to})",filterNotForInstrument:"Non utilizzabile con questo strumento",unitMillimetres:"mm",unitDegrees:"°",fieldOfViewReadout:"{deg}° di campo",soundSrcPlaceholder:"URL di una registrazione reale",referenceGroup:"Foto",reference:"Foto",referenceTitle:"Nome",referenceSrc:"Immagine",referenceSrcPlaceholder:"https://…/photo.jpg",referenceKind:"Tipo",referencePhoto:"Foto",referencePanorama:"Panorama (360°)",referenceCredit:"Crediti",referenceCreditUrl:"Link dei crediti",referenceT:"Scattata a",referenceDrawing:"Disegno sopra",referenceOpacity:"Opacità",referenceHeading:"Direzione",referencePitch:"Beccheggio",referenceRoll:"Rollio",referenceFov:"Campo verticale",referenceUsePose:"Usa la posa dell'osservatore",addReferenceUrl:"Da un indirizzo",addReferenceFile:"Da un file",deleteReference:"Elimina foto",referenceEmbedded:"{kb} kB incorporati nella registrazione — un indirizzo la terrebbe leggera",referenceUnreachable:"Impossibile caricare la foto: controlla l'indirizzo e che il suo sito permetta ad altri siti di leggerla",referenceRegisterHint:"Trascina per ruotare la foto, rotellina per cambiarne il campo; «Aggiungi un punto di riferimento» per indicare un dettaglio sulla foto, poi lo stesso nel rendering",referenceLandmarkPicture:"Punto di riferimento {n}: clicca il punto sulla foto",referenceLandmarkScene:"Punto di riferimento {n}: clicca lo stesso punto nel rendering",referenceLandmarkOffPicture:"Questo clic non cade sulla foto",referenceNotLoaded:"La foto non è ancora arrivata",referenceLandmarksFit:"{n} punti di riferimento — scarto medio di {deg}°",referenceLandmarks:"Punti di riferimento",addReferenceLandmark:"Aggiungi un punto di riferimento",deleteReferenceLandmark:"Elimina punto di riferimento",referenceLandmarkLabel:"Nome",referenceLandmarkLabelPlaceholder:"Albero che copre, recinzione…",referenceAdoptPose:"Adotta come posa dell'osservatore",referenceAdoptRationale:"Misurato sulla foto «{title}»: {n} punti di riferimento allineati, {deg}° di scarto residuo",referenceStreetSearch:"Foto stradali nei dintorni",referenceStreetNoPlace:"Dai prima un luogo alla registrazione: le foto si cercano intorno",referenceStreetSearching:"Ricerca di foto scattate nei dintorni…",referenceStreetNone:"Nessuna foto stradale entro {m} m (Panoramax)",referenceStreetFailed:"Impossibile raggiungere Panoramax",referenceStreetAdd:"Aggiungi",traceImport:"Tracciati dell'investigatore (KML, KMZ)",trace:"Tracciato",deleteTrace:"Elimina il tracciato",traceTitle:"Nome",traceSource:"Fonte",traceImported:"{n} importato/i da {name}.",traceSkipped:"Escluso: {what}.",traceNone:"Nessuna linea, luogo o contorno in questo file.",traceFailed:"Impossibile leggere questo file.",traceKindPoint:"luogo",traceKindLine:"linea",traceKindPolygon:"contorno",referenceStreetItem:"{distance} m a {bearing}°, {date}{panorama}",referenceStreetPanorama:" — 360°",referenceStreetTitle:"Foto stradale a {distance} m a {bearing}°, {date}",skyLine:"Cielo: {parts}",skyStarsEye:"stelle fino alla magnitudine {limit}, il limite che un occhio raggiungeva sotto questo cielo",skyStarsDeeper:"stelle fino alla magnitudine {limit} attraverso un {device} — {gain} magnitudini oltre le {eye} raggiunte dagli occhi dell'osservatore",skyStarsShallower:"stelle fino alla magnitudine {limit} attraverso un {device} — {gain} magnitudini al di qua delle {eye} raggiunte dagli occhi dell'osservatore",skyStarsCatalogue:", disegnate fino a {catalogue}, dove si ferma il catalogo di questo progetto",skyStarsNone:"nessuna stella si distingueva in un cielo così chiaro",skyDetails:"Mostra i rilevamenti completi",skyDetailsHide:"Nascondi i rilevamenti",skyShowerActive:"{name} — radiante a {altitude}° sopra l'orizzonte, {bearing} — circa {rate}/h sotto questo cielo, su un fondo sporadico di {sporadic}/h",skyShowerBelowHorizon:"{name} è attivo, ma il suo radiante è sotto l'orizzonte — non ha potuto produrre nulla",skyNothingActive:"nessuno sciame meteorico attivo in questa data — un fondo sporadico di circa {sporadic}/h",showMeteor:"Mostrami una meteora",skyComet:"La {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing}, coda lunga {tail}°",skyCometNoTail:"La {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing}",skyCometBelowHorizon:"La {name} c'era, di magnitudine {magnitude}, ma sotto l'orizzonte — nessuno qui l'ha vista",skyCometInDaylight:"La {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing} — ma a soli {elongation}° dal Sole",showComet:"Mostrami la cometa",skyNova:"La {name}, una stella nuova di magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing}",skyNovaBelowHorizon:"La {name} brillava di magnitudine {magnitude}, ma sotto l'orizzonte: nessuno qui l'ha vista",showNova:"Mostrami la stella nuova",skyEclipsePartial:"Eclissi di Sole: la Luna nasconde il {percent} % del Sole alle {time}, a {altitude}° sopra l'orizzonte {bearing}",skyEclipseTotal:"Eclissi totale di Sole: il Sole è interamente nascosto dalle {time} per {duration}, a {altitude}° sopra l'orizzonte {bearing}",skySupermoon:"Luna piena a {distance} km: {diameter}° di larghezza, il {percent} % in più che alla distanza media — una «superluna», e non più grande all'orizzonte che in alto",skyMicromoon:"Luna piena a {distance} km: {diameter}° di larghezza, il {percent} % in meno che alla distanza media — una «microluna», e non più piccola all'orizzonte che in alto",skyRedMoon:"La «lune rousse»: la Luna piena della lunazione che segue la Pasqua, a {altitude}° sopra l'orizzonte {bearing} — bassa, quindi arrossata dall'aria che attraversa, e né più grande né più luminosa di un'altra",skySatellitePasses:"{count} satelliti hanno attraversato questo cielo abbastanza luminosi da essere visti, il più luminoso {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing} alle {time}",skySatellitePassesOne:"un satellite ha attraversato questo cielo abbastanza luminoso da essere visto: {name}, magnitudine {magnitude}, a {altitude}° sopra l'orizzonte {bearing} alle {time}",skySatelliteTrain:"tra cui un treno di {count} Starlink lanciati il {date}",skySatellitePassesNone:"secondo gli elementi orbitali archiviati per quella data, nessun satellite illuminato ha attraversato questo cielo abbastanza luminoso da essere visto",skySatelliteElementsGap:"nessun elemento orbitale archiviato vicino a quella data",skyReentries:"rientri registrati: {list}",skyReentriesMore:"altri {count}",skyReentrySeen:"{name} è ricaduto alle {time}, visto da {place} (a {distance} km)",skyReentryObserved:"{name} è ricaduto alle {time}, visto",skyReentryOffset:", a {minutes} min dall'osservazione",skyReentryPredicted:"{name} è ricaduto verso le {time} ± {hours} h, non si sa dove",skyReentryDay:"{name} è ricaduto il {date} (UTC), senza ora né luogo noti",skyFireballs:"{count} bolidi registrati dalla Global Meteor Network, il più luminoso di magnitudine {magnitude} alle {time}, a {altitude}° di altezza {bearing}, a {distance} km ({stations} stazioni)",skyFireballsOne:"un bolide registrato dalla Global Meteor Network: magnitudine {magnitude} alle {time}, a {altitude}° di altezza {bearing}, a {distance} km ({stations} stazioni)",showFireball:"Mostrami il bolide",showSatellite:"Mostrami un satellite",skyOpticsPossible:"nubi di ghiaccio sufficienti, intorno {source}, per {forms}",skyOpticsAlignment:" — tutto tranne gli anelli richiede cristalli che cadono orizzontali, qui supposti allineati al {alignment}%, poiché nessun rilevamento lo indica",skyOpticsHalo22:"un anello di {angle}°",skyOpticsHalo46:"un anello di {angle}°",skyOpticsParhelia:"pareli a {angle}° da entrambi i lati",skyOpticsTangentArc:"un arco tangente sopra",skyOpticsParhelicCircle:"un cerchio bianco che fa il giro del cielo alla sua stessa altezza",skyOpticsCircumzenithal:"un arco circumzenitale a {angle}° di altezza",skyOpticsCircumhorizontal:"un arco circumorizzontale molto più in basso",skyOpticsPillar:"una colonna eretta sopra",skyOpticsNoIce:"nessuna nube di ghiaccio: né alone né pareli",skyOpticsHidden:"nubi di ghiaccio in quota, ma uno strato più basso tra loro e l'osservatore",skyOpticsSun:"al Sole",skyOpticsMoon:"alla Luna",skyBowPossible:"pioggia e sole sufficienti per {forms}",skyBowMoon:"pioggia sotto una Luna illuminata al {lit}%, sufficiente per {forms} — un arcobaleno lunare, che l'occhio vede come un arco bianco",skyGlowBand:"la Via Lattea a {contrast}× il fondo del cielo, a {altitude}° di altezza {bearing}",skyGlowCone:"la luce zodiacale a {contrast}× il fondo del cielo, a {altitude}° di altezza {bearing}, a {elongation}° dal Sole — un tenue cono di luce inclinato, dai bordi sfumati, svanito entro un'ora",skyGlowZodiacalBand:"la banda zodiacale a {contrast}× il fondo del cielo, a {altitude}° di altezza {bearing} — tutta l'eclittica debolmente accesa, che non è ciò che la gente riferisce",skyGlowMoon:"né Via Lattea né luce zodiacale: una Luna illuminata al {lit}% teneva il cielo a {sky} magnitudini per secondo d'arco quadrato, dove ne servono 22",skyGlowTwilight:"né Via Lattea né luce zodiacale: il crepuscolo teneva ancora il cielo a {sky} magnitudini per secondo d'arco quadrato, dove ne servono 22",skyGlowTowns:"né Via Lattea né luce zodiacale: il bagliore delle città teneva il cielo a {sky} magnitudini per secondo d'arco quadrato, dove ne servono 22",skyGlowNothingUp:"cielo abbastanza buio ({sky} magnitudini per secondo d'arco quadrato), ma né il piano galattico né l'eclittica vi stavano abbastanza in alto",skyBowPrimary:"un arco di {radius}° di raggio, con la sommità a {top}° di altezza",skyBowSecondary:"un secondo, più tenue, a {radius}°, con i colori invertiti",skyBowSourceTooHigh:"pioggia, ma con l'astro a {altitude}° di altezza nessun arco poteva superare l'orizzonte: si trovano a {radius}° dal punto opposto",skyBowHidden:"pioggia, ma uno strato continuo tra essa e la luce: nessun arco",skyBowNoSource:"pioggia, e niente di illuminato per farne un arco",skySatellitesLit:"l'ombra della Terra era a {height} km sopra l'osservatore, quindi l'orbita bassa era ancora al sole — {count} oggetti catalogati erano in orbita quel mese",skySatellitesLitWith:"l'ombra della Terra era a {height} km sopra l'osservatore, quindi l'orbita bassa era ancora al sole — {count} oggetti catalogati erano in orbita quel mese, tra cui {eras}",skySatellitesShadowed:"l'ombra della Terra era a {height} km sopra l'osservatore: dei {count} oggetti catalogati in orbita quel mese, niente in orbita bassa era illuminato",skySatellitesNotYet:"non era ancora stato messo niente in orbita",skySatellitesDaylight:"tutto ciò che era in orbita era illuminato, come sempre di giorno, e {eras} potevano superare in luminosità persino questo cielo",skySatellitesDaylightOne:"tutto ciò che era in orbita era illuminato, come sempre di giorno, e {eras} poteva superare in luminosità persino questo cielo",skyUnknown:"non determinabile senza una data e un luogo",lookAtDecor:"Guardalo",addDecor:"Aggiungi",deleteDecor:"Elimina elemento della scenografia",undo:"Annulla",redo:"Ripristina",viewAccount:"Vedi il resoconto",noObserverRecording:"Nessun URL di registrazione per questo osservatore",masks:"Nasconde",masksNone:"Nessun fenomeno da nascondere per ora",masksBodyFully:"nascosto da questo oggetto",masksBodyPartly:"nascosto al {share} % da questo oggetto",masksBodyNot:"non nascosto da questo oggetto",modelPickerTitle:"Scegliere un modello 3D",modelPickerClose:"Chiudere",modelPickerChoose:"Scegliere un modello 3D",modelPickerUse:"Usa questo modello",modelPickerIncomplete:"Non disegnato finché non sono indicati il nome e la licenza del modello",addObserver:"Aggiungi osservatore",surveyLabel:"Scenografia ricavata da un rilievo",surveySource:"Scenografia da",surveyDated:"Rilevato il: {dates}.",surveyLaserLabel:"laser",surveyPhotoLabel:"foto aerea",surveyMapLabel:"carta",surveyLampsLabel:"OpenStreetMap",surveyWarning:"⚠ Questa scenografia viene da rilievi del {survey}, successivi all'osservazione ({observation}): non è ciò che c'era allora. Teneteli come riferimento, o eliminateli.",surveyRadius:"Raggio",surveyRadiusTitle:"Fino a dove intorno all'osservatore si interroga il rilievo, in metri. Un raggio più ampio porta edifici, ponti e linee più lontani; gli alberi vengono dal laser, che si interroga solo entro 150 m.",surveySourceTitle:"Il rilievo da cui sono ricavati, da soli, gli alberi, gli edifici, i ponti e le linee aeree attorno al luogo quando date un luogo alla registrazione: sono messi nell'elenco, al loro posto, con altezza e larghezza misurate. Le coordinate del luogo sono inviate a quel servizio. Nessuno lascia la scenografia a voi soli. Ciò che avete collocato voi non viene mai toccato.",surveySourceNone:"Nessuno (tutto a mano)",surveyBusy:"Ricerca della scenografia attorno all'osservatore…",surveyDone:"Da {source}: alberi {trees}, edifici {buildings}, ponti {bridges}, linee elettriche {lines}. Sono quelli del giorno del rilievo, non della registrazione: teneteli, spostateli o eliminateli.",surveyNone:"Nessun albero, edificio, ponte né linea elettrica trovato entro {radius} m.",surveyKept:"Ciò che avete collocato voi resta com'è.",surveyUnreachable:"Impossibile raggiungere il rilievo. Riprovate più tardi.",surveyFurniturePending:"Illuminazione pubblica e semafori: in attesa di OpenStreetMap…",surveyFurnitureDone:"Da {source}: lampioni {lamps}, semafori {signals}, attraversamenti {crossings}, segnali {signs}.",surveyFurnitureUnavailable:"Illuminazione pubblica e semafori non disponibili per ora: OpenStreetMap non risponde.",surveyFurnitureRetry:"Riprova",narrativePlaceholder:"Ciò che l'osservatore ha riferito, con parole sue",narrativeSource:"Redatto da",narrativeNeedsSetting:'Compila "{setting}" ({source}) per generare una ricostruzione dal resoconto',narrativeNeedsAsk:"Ancora niente da inviare",narrativeRemember:"Ricorda su questo dispositivo",narrativeDraft:"Genera ricostruzione",narrativeStop:"Ferma",narrativeWorking:"Lettura del resoconto…",narrativeApplied:"{count} campi scritti nell'editor",narrativeUnchanged:"Il resoconto non dice ancora nulla che la registrazione possa contenere",narrativeStated:"Ciò che l'osservatore ha detto",narrativeDerived:"Ricavato dal resoconto",narrativeAssumed:"Supposto, perché la ricostruzione funzioni — da verificare",narrativeGaps:"Ciò che niente ha potuto stabilire",narrativeErrorCredential:"Nessuna chiave, o una chiave rifiutata — controllala su console.anthropic.com",narrativeErrorRateLimited:"Troppe richieste sul tuo account: aspetta un momento e richiedi",narrativeErrorRefused:"Il resoconto non ha avuto risposta. Riformularlo può aiutare; richiederlo no",narrativeErrorMalformed:"La risposta non era una bozza utilizzabile — vale la pena richiederla ancora una volta",narrativeErrorUnreachable:"Nulla ha risposto: controlla la connessione",narrativeErrorRejected:"Rifiutato: {detail}",observerAge:"Età allora",observerBirth:"Nato il",observerPerception:{"color-vision":"Visione dei colori","color-vision.hint":"Come appaiono i colori a chi ha coni diversi (Machado et al. 2009). Ricolora soltanto: luminosità e risoluzione restano uguali.","color-vision.type":"Tipo","color-vision.type.normal":"Tipica","color-vision.type.protan":"Protan (rosso debole o cieco)","color-vision.type.deutan":"Deutan (verde debole o cieco)","color-vision.type.tritan":"Tritan (blu debole o cieco)","color-vision.severity":"Gravità",intoxication:"Alcol","intoxication.hint":"Riduce la sensibilità al contrasto di circa 0,9 dB a 0,08 % di alcol nel sangue (uno studio controllato; i risultati variano), mostrato fino a 0,1 % al massimo: un livello più alto viene registrato ma mostrato come 0,1 %, poiché oltre non è stato misurato nulla. Visione doppia, campo ristretto e altre droghe non sono modellati: nessuna fonte li quantifica.","intoxication.bloodAlcohol":"Alcolemia",fatigue:"Stanchezza","fatigue.hint":"Solo dichiarata: non è dimostrato che la mancanza di sonno cambi ciò che riceve un occhio sano, quindi l'immagine non cambia. Riguarda attenzione e memoria, non la vista.","fatigue.hoursAwake":"Sveglio da"},observerOccupation:"Professione",accountSource:"Resoconto raccolto",accountUrl:"Fonte (URL)",accountSourceUnknown:"sconosciuto",accountSourceOnSite:"indagine sul posto",accountSourceInterview:"colloquio di persona",accountSourceTelephone:"per telefono",accountSourceQuestionnaire:"questionario",accountSourceLetter:"l'ha scritto l'osservatore",accountSourceSocialMedia:"l'ha pubblicato l'osservatore in rete",accountSourcePress:"stampa o radiotelevisione",accountFollowedUp:"Ricontattato",accountUnknown:"sconosciuto",accountYes:"sì",accountNo:"no",questionUnanswered:"Nulla in questa registrazione risponde a una delle domande che una ricostruzione deve risolvere",durationRequired:"L'osservazione ha bisogno di una durata per poter essere riprodotta — indicala, o un'ora di fine, che può essere approssimativa",questionsUnanswered:"{count} delle domande a cui risponde una ricostruzione completa restano qui senza risposta",emptyDecor:"Nessun elemento della scenografia",emptyMilestones:"Nessun momento",emptyReferences:"Nessuna foto",emptyReferenceLandmarks:"Nessun punto di riferimento",emptyTraces:"Nessun tracciato dell'investigatore",emptyShapes:"Nessuna forma",addReference:"Aggiungi una foto",principalObserver:"Osservatore di questo resoconto",deleteObserver:"Elimina l'osservatore"};export{a as sightingEditorMessages_it};