worldorbit 2.5.17 → 2.6.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.
@@ -1,17 +1,17 @@
1
- "use strict";var WorldOrbitMarkdown=(()=>{var Ue=Object.defineProperty;var In=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var kn=Object.prototype.hasOwnProperty;var jn=(e,t)=>{for(var n in t)Ue(e,n,{get:t[n],enumerable:!0})},Sn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of xn(t))!kn.call(e,o)&&o!==n&&Ue(e,o,{get:()=>t[o],enumerable:!(r=In(t,o))||r.enumerable});return e};var On=e=>Sn(Ue({},"__esModule",{value:!0}),e);var ka={};jn(ka,{rehypeWorldOrbit:()=>mn,remarkWorldOrbit:()=>fn,renderWorldOrbitBlock:()=>ae,renderWorldOrbitError:()=>ct});var u=class e extends Error{line;column;constructor(t,n,r){let o=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var se=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],F=se.filter(e=>e!=="system"),An=["star","planet","moon","asteroid","comet","structure","phenomenon"],ft=["structure","phenomenon"],Y=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Ln=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function y(e,t){return{key:e,...t}}var xe=new Set(se),pt=new Map([y("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:Y}),y("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"distance"}),y("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"distance"}),y("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:Y}),y("period",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"duration"}),y("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"angle"}),y("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"angle"}),y("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"angle"}),y("at",{kind:"string",placement:!0,arity:"single",objectTypes:ft}),y("surface",{kind:"string",placement:!0,arity:"single",objectTypes:ft}),y("free",{kind:"string",placement:!0,arity:"single",objectTypes:Ln}),y("kind",{kind:"string",placement:!1,arity:"single",objectTypes:F}),y("class",{kind:"string",placement:!1,arity:"single",objectTypes:F}),y("culture",{kind:"string",placement:!1,arity:"single",objectTypes:F}),y("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:se}),y("color",{kind:"string",placement:!1,arity:"single",objectTypes:se}),y("image",{kind:"string",placement:!1,arity:"single",objectTypes:An}),y("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:se}),y("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"radius"}),y("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"mass"}),y("density",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),y("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),y("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),y("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:F}),y("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),y("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("on",{kind:"string",placement:!1,arity:"single",objectTypes:F}),y("source",{kind:"string",placement:!1,arity:"single",objectTypes:F}),y("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"duration"})].map(e=>[e.key,e])),Tn=new Set(pt.keys());function E(e){return pt.get(e)}function mt(e){return Tn.has(e)}function ht(e,t){return e.objectTypes.includes(t)}function ke(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function le(e,t={}){let n=[],r=t.columnOffset??0,o="",i=null,a=!1,l=!1,s=null,c=()=>{i!==null&&(n.push({value:o,column:i,quoted:a}),o="",i=null,a=!1)};for(let d=0;d<e.length;d++){let f=e[d],m=r+d+1;if(l&&f==="\\"){let h=e[d+1];if(h==='"'||h==="\\"){o+=h,d++;continue}}if(f==='"'){l?l=!1:(i===null&&(i=m),a=!0,s=m,l=!0);continue}if(!l&&/\s/.test(f)){c();continue}i===null&&(i=m),o+=f}if(l)throw new u("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function je(e){return e.match(/^\s*/)?.[0].length??0}function ce(e){let t=e.split(/\r?\n/),n=[],r=null,o=!1,i=null;for(let a=0;a<t.length;a++){let l=t[a],s=a+1;if(!l.trim())continue;let c=je(l),d=le(l.slice(c),{line:s,columnOffset:c});if(d.length!==0){if(c===0){o=!1,i=null;let f=Mn(d,s);n.push(f),r=f;continue}if(!r)throw new u("Indented line without parent object",s,c+1);if(d.length===1&&d[0].value==="info"){o=!0,i=c;continue}o&&c<=(i??0)&&(o=!1),o?r.infoEntries.push(Fn(d,s)):r.blockFields.push(Dn(d,s))}}return{type:"document",objects:n}}function Mn(e,t){if(e.length<2)throw new u("Invalid object declaration",t,e[0]?.column??1);let[n,r,...o]=e;if(!xe.has(n.value))throw new u(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:En(o,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function En(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r],i=E(o.value);if(!i)throw new u(`Unknown field "${o.value}"`,t,o.column);r++;let a=[];if(i.arity==="multiple")for(;r<e.length&&!mt(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new u(`Missing value for field "${o.value}"`,t,o.column);n.push({type:"field",key:o.value,values:a.map(l=>l.value),location:{line:t,column:o.column}})}return n}function Dn(e,t){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);if(!E(e[0].value))throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function Fn(e,t){if(e.length<2)throw new u("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var gt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Pn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Vn=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ue(e){let t=null,n=[];for(let r of e.objects){let o=Cn(r);if(r.objectType==="system"){if(t)throw u.fromLocation("Only one system object is allowed",r.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function Cn(e){let t=[...e.inlineFields,...e.blockFields];Rn(e.objectType,t);let n=Bn(t),r=_n(e.objectType,n),o=zn(n),i=Wn(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof o.title=="string"?o.title:null,description:null,epoch:null,referencePlane:null,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:r,info:i}}function Rn(e,t){for(let n of t){let r=E(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!ht(r,e))throw u.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Bn(e){let t=new Map;for(let n of e){if(t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function _n(e,t){let n=t.has("orbit"),r=t.has("at"),o=t.has("surface"),i=t.has("free"),a=[n,r,o,i].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw u.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw u.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Se(t,"orbit"),distance:ne(t,"distance"),semiMajor:ne(t,"semiMajor"),eccentricity:qn(t,"eccentricity"),period:ne(t,"period"),angle:ne(t,"angle"),inclination:ne(t,"inclination"),phase:ne(t,"phase")};if(r){let l=Oe(t,"at"),s=Se(t,"at");return{mode:"at",target:s,reference:Yn(s,l.location)}}if(o)return{mode:"surface",target:Se(t,"surface")};if(i){let l=Se(t,"free"),s=Hn(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function zn(e){let t={};for(let[n,r]of e.entries()){let o=E(n);if(!(!o||o.placement))switch(o.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Gn(r);break;case"number":t[n]=yt(re(r),n,r.location);break;case"unit":t[n]=bt(re(r),r.location,n);break;case"string":t[n]=Nn(n,r);break}}return t}function Nn(e,t){let n=t.values.join(" ").trim();return e==="image"&&Un(n,t.location),n}function Un(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Vn);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Wn(e){let t={};for(let n of e){if(n.key in t)throw u.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Yn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function bt(e,t,n){let r=e.match(gt);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=E(n);if(i?.unitFamily&&!ke(i.unitFamily,o.unit))throw u.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function Hn(e){let t=e.match(gt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ne(e,t){if(!e.has(t))return;let n=Oe(e,t);return bt(re(n),n.location,t)}function qn(e,t){if(!e.has(t))return;let n=Oe(e,t);return yt(re(n),t,n.location)}function yt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Gn(e){let t=re(e).toLowerCase(),n=Pn.get(t);if(n===void 0)throw u.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Oe(e,t){let n=e.get(t);if(!n)throw new u(`Missing value for key "${t}"`);return n}function Se(e,t){return re(Oe(e,t))}function re(e){if(e.values.length!==1)throw u.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Xn=new Set(["star","planet","moon","asteroid","comet"]);function de(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new u(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new u(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let o=n.get(r.placement.target);if(!o||!Xn.has(o.type))throw new u(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Kn(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Zn(r,r.placement.reference,t))}}function Kn(e,t,n){if(!n.has(t.primary))throw new u(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new u(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Zn(e,t,n){if(!n.has(t.objectId))throw new u(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Q(e,t,n=`${t}.failed`){return e instanceof u?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}var fe=1495978707e-1,Jn=6371,Qn=71492,er=695700,tr=63241.077,nr=206264.806,rr=206264806,kt=.68,or=.2,jt=28;function H(e,t={}){let n=sr(t),r=n.width,o=n.height,i=n.padding,a=ar(e),l=cr(e,t.projection),s=ur(a,t.scaleModel),c=fr(a),d=e.system?.id??null,f=t.activeEventId??null,m=ir(e.objects,e.events??[],f),h=new Map(m.map(g=>[g.id,g])),b=Zr(m,h),v=new Map,x=[],k=[],p=[],I=[],V=[],K=new Map,C=new Map;for(let g of m){let D=g.placement;if(!D){p.push(g);continue}if(D.mode==="orbit"){$t(C,D.target,g);continue}if(D.mode==="surface"){$t(K,D.target,g);continue}if(D.mode==="at"){V.push(g);continue}I.push(g)}let U=I.length>0?r*.42:r/2,W=o/2,B={orbitChildren:C,surfaceChildren:K,objectMap:h,spacingFactor:c,projection:l,scaleModel:s},A=p.find(g=>g.type==="star")??p[0]??null;A&&We(A,U,W,0,v,x,k,B);let Z=p.filter(g=>g.id!==A?.id);if(Z.length>0){let g=Math.min(r,o)*.28*c*s.orbitDistanceMultiplier;Z.forEach((D,j)=>{let Ne=ge(j,Z.length,-Math.PI/2),J=be(Ne,g,l,1);We(D,U+J.x,W+J.y,0,v,x,k,B)})}I.forEach((g,D)=>{let j=r-i-140-ro(g.placement?.mode==="free"?g.placement.distance:void 0,s),Ne=Math.max(76,(o-i*2-180)/Math.max(1,I.length)*c)*s.freePlacementMultiplier,J=i+92+D*Ne;v.set(g.id,{object:g,x:j,y:J,radius:Me(g,0,s),sortKey:De(j,J,0)}),k.push({object:g,groupId:b.groupIds.get(g.id)??null,x1:j-60,y1:J,x2:j-18,y2:J,mode:"free"}),Le(g,v,x,k,B,1)}),V.forEach((g,D)=>{if(v.has(g.id)||!g.placement||g.placement.mode!=="at")return;let j=Xr(g.placement.reference,v,h,D,V.length,r,o,i,B);v.set(g.id,{object:g,x:j.x,y:j.y,radius:Me(g,2,s),sortKey:De(j.x,j.y,2),anchorX:j.anchorX,anchorY:j.anchorY}),j.anchorX!==void 0&&j.anchorY!==void 0&&k.push({object:g,groupId:b.groupIds.get(g.id)??null,x1:j.anchorX,y1:j.anchorY,x2:j.x,y2:j.y,mode:"at"}),Le(g,v,x,k,B,2)});let M=[...v.values()].map(g=>pr(g,s,b)),_=x.map(g=>mr(g,b.groupIds.get(g.object.id)??null)),N=k.map(g=>hr(g)),Ie=gr(M,r,o,s.labelMultiplier),ut=kr(e,M),dt=jr(e.events??[],M,f),bn=$r(_,ut,dt,N,M,Ie),yn=Ir(M,_,N,Ie,b,s.labelMultiplier),wn=xr(e,M),vn=Sr(e,l,n.preset,b,h),$n=_r(r,o,M,_,N,Ie,s.labelMultiplier);return{width:r,height:o,padding:i,renderPreset:n.preset,projection:l,scaleModel:s,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${It(l)} view - ${It(a)} layout`,systemId:d,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:$n,layers:bn,groups:yn,semanticGroups:wn,viewpoints:vn,events:dt,activeEventId:f,objects:M,orbitVisuals:_,relations:ut,leaders:N,labels:Ie}}function ir(e,t,n){let r=e.map(a=>structuredClone(a));if(!n)return r;let o=t.find(a=>a.id===n);if(!o)return r;let i=new Map(r.map(a=>[a.id,a]));for(let a of o.positions){let l=i.get(a.objectId);l&&(l.placement=a.placement?structuredClone(a.placement):null,a.inner?l.properties.inner={...a.inner}:delete l.properties.inner,a.outer?l.properties.outer={...a.outer}:delete l.properties.outer)}return r}function ar(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function sr(e){let t=lr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function lr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function cr(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function ur(e,t){return{...dr(e),...t}}function dr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function fr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function pr(e,t,n){let{object:r,x:o,y:i,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,d=r.renderHints?.renderPriority??0;return{renderId:oe(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:o,y:i,radius:a,visualRadius:no(r,a,t),sortKey:l+d*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:io(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function mr(e,t){return{renderId:`${oe(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function hr(e){return{renderId:`${oe(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function gr(e,t,n,r){let o=[],i=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(br);for(let s of l){let c=yr(s,a,i,t,n,r)??Ot(s,St(s,a.get(s.parentId??"")??null,n),0,r);i.push(Dt(s,c,r)),o.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return o}function br(e,t){let n=wt(e)-wt(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function wt(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function yr(e,t,n,r,o,i){for(let a of wr(e,t,r,o)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=Ot(e,a,s,i),d=Dt(e,c,i);if(!n.some(f=>eo(f,d)))return c}}return null}function wr(e,t,n,r){let o=e.parentId?t.get(e.parentId)??null:null,i=St(e,o,r),a=i==="below"?"above":"below",l=vr(e,o,n),s=l==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[l,i,s,a]:[i,l,a,s]}function St(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function vr(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function Ot(e,t,n,r){let o=14*r;switch(t){case"above":{let i=e.y-(e.radius+18*r+n*o);return{x:e.x,labelY:i,secondaryY:i-16*r,textAnchor:"middle",direction:t}}case"below":{let i=e.y+e.radius+18*r+n*o;return{x:e.x,labelY:i,secondaryY:i+16*r,textAnchor:"middle",direction:t}}case"left":{let i=e.x-(e.visualRadius+16*r+n*o),a=e.y-4*r;return{x:i,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let i=e.x+e.visualRadius+16*r+n*o,a=e.y-4*r;return{x:i,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function $r(e,t,n,r,o,i){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Ir(e,t,n,r,o,i){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let d=o.groupRoots.get(s)??null,f={renderId:s,rootObjectId:d,label:d??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:he(0,0,0,0)};return a.set(s,f),f};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=Jr(s,e,t,n,r,i);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function xr(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function kr(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let o=n.get(r.from),i=n.get(r.to);return{renderId:`${oe(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:o?.x??0,y1:o?.y??0,x2:i?.x??0,y2:i?.y??0,hidden:r.hidden||!o||!i||o.hidden||i.hidden}}).sort((r,o)=>r.relation.id.localeCompare(o.relation.id))}function jr(e,t,n){let r=new Map(t.map(o=>[o.objectId,o]));return e.map(o=>{let i=[...new Set([...o.targetObjectId?[o.targetObjectId]:[],...o.participantObjectIds])],a=i.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,d)=>c+d.x,0)/a.length:0,s=a.length>0?a.reduce((c,d)=>c+d.y,0)/a.length:0;return{renderId:`${oe(o.id)}-event`,eventId:o.id,event:o,objectIds:i,participantIds:[...o.participantObjectIds],targetObjectId:o.targetObjectId,x:l,y:s,hidden:o.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&o.id!==n}}).sort((o,i)=>o.event.id.localeCompare(i.event.id))}function Sr(e,t,n,r,o){let i=Or(e,t,n),a=new Map;for(let[c,d]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,m,...h]=c.split(".");if(f!=="viewpoint"||!m||h.length===0)continue;let b=Cr(m);if(!b)continue;let v=h.join(".").toLowerCase(),x=a.get(b)??{id:b};Ar(x,v,d,e,t,n,r,o),a.set(b,x)}let l=[...a.values()].map(c=>Lr(c,t,n,o)).filter(Boolean),s=l.findIndex(c=>c.id===i.id);return s>=0?l.splice(s,1,{...i,...l[s],layers:{...i.layers,...l[s].layers},filter:l[s].filter??i.filter,generated:!1}):l.unshift(i),l.sort((c,d)=>c.id==="overview"?-1:d.id==="overview"?1:c.label.localeCompare(d.label))}function Or(e,t,n){let r=e.system?.title??e.system?.properties.title;return{id:"overview",label:r?`${String(r)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Ar(e,t,n,r,o,i,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=me(s);return;case"projection":case"view":e.projection=Mr(s)??o;return;case"preset":e.preset=Er(s)??i;return;case"rotation":case"angle":e.rotationDeg=At(s)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Dr(s);return;case"layers":e.layers=Fr(s);return;case"query":e.filter={...e.filter??Ae(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Ae(),objectTypes:Pr(s)};return;case"tags":e.filter={...e.filter??Ae(),tags:me(s)};return;case"groups":e.filter={...e.filter??Ae(),groupIds:Vr(s,r,a,l)};return}}function Lr(e,t,n,r){let o=e.focus&&r.has(e.focus)?e.focus:null,i=e.select&&r.has(e.select)?e.select:o,a=Tr(e.filter),l=e.label?.trim()||Rr(e.id);return{id:e.id,label:l,summary:e.summary?.trim()||Br(l,o,a),objectId:o,selectedObjectId:i,eventIds:[...new Set(e.eventIds??[])],projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function Ae(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Tr(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function Mr(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Er(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function At(e){let t=Number(e);return Number.isFinite(t)?t:null}function Dr(e){let t=At(e);return t!==null&&t>0?t:null}function Fr(e){let t={};for(let n of me(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),o=n.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="relations"||o==="events"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=r)}return t}function Pr(e){return me(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Vr(e,t,n,r){return me(e).map(o=>t.schemaVersion==="2.1"||t.groups.some(i=>i.id===o)||o.startsWith("wo-")&&o.endsWith("-group")?o:n.groupIds.has(o)?n.groupIds.get(o)??pe(o):(r.has(o),pe(o)))}function me(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Cr(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Rr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Br(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function _r(e,t,n,r,o,i,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,f=(m,h)=>{l=Math.min(l,m),s=Math.min(s,h),c=Math.max(c,m),d=Math.max(d,h)};for(let m of r)m.hidden||Lt(m,f);for(let m of o)m.hidden||(f(m.x1,m.y1),f(m.x2,m.y2));for(let m of n)m.hidden||Tt(m,f);for(let m of i)m.hidden||Mt(m,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?he(0,0,e,t):he(l,s,c,d)}function Lt(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,o=e.ry??e.radius??0,i=Pt(e.cx,e.cy,r,o,e.rotationDeg,0,Math.PI*2,jt*2);for(let a of i)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function he(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function Tt(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function Mt(e,t,n){let r=Ft(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function We(e,t,n,r,o,i,a,l){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:n,radius:Me(e,r,l.scaleModel),sortKey:De(t,n,r)}),Le(e,o,i,a,l,r+1))}function Le(e,t,n,r,o,i){let a=t.get(e.id);if(!a)return;let l=[...o.orbitChildren.get(e.id)??[]].sort(zr),s=Nr(l,a.radius,o.spacingFactor,o.scaleModel),c=Yr(l,s);l.forEach((f,m)=>{let h=Ur(f,m,l.length,a,s,c[m]??s.innerPx,o);n.push({object:f,parentId:e.id,kind:h.kind,cx:h.cx,cy:h.cy,radius:h.radius,rx:h.rx,ry:h.ry,rotationDeg:h.rotationDeg,band:h.band,bandThickness:h.bandThickness,frontArcPath:h.frontArcPath,backArcPath:h.backArcPath}),We(f,h.objectX,h.objectY,i,t,n,r,o)});let d=[...o.surfaceChildren.get(e.id)??[]];d.forEach((f,m)=>{let h=ge(m,d.length,-Math.PI/3),b=28*o.spacingFactor,v=be(h,a.radius,o.projection,o.projection==="isometric"?.9:1),x=be(h,a.radius+b,o.projection,o.projection==="isometric"?.9:1),k=a.x+v.x,p=a.y+v.y,I=a.x+x.x,V=a.y+x.y;t.set(f.id,{object:f,x:I,y:V,radius:Me(f,i+1,o.scaleModel),sortKey:De(I,V,i+1),anchorX:k,anchorY:p}),r.push({object:f,groupId:o.objectMap.has(f.id)?pe(Qr(f,o.objectMap)):null,x1:k,y1:p,x2:I,y2:V,mode:"surface"}),Le(f,t,n,r,o,i+1)})}function zr(e,t){let n=Te(e),r=Te(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Nr(e,t,n,r){let o=e.map(f=>Te(f)),i=o.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42};let s=Math.min(...i),c=Math.max(...i),d=c-s;return{metrics:o,minMetric:s,maxMetric:c,metricSpread:d,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42}}function Ur(e,t,n,r,o,i,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let W=o.innerPx+t*o.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:W,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-W}}let c=S(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),d=i,f=Math.max(d*Math.sqrt(1-c*c),d*.18),m=He(l.inclination)??0,h=a.projection==="isometric"?Math.max(or,Math.cos(qe(m)))*kt:1,b=Math.max(f*h,d*.14),v=He(l.angle)??0,x=d*c,k=Ct(-x,0,v),p=r.x+k.x,I=r.y+k.y,V=qr(l.phase,t,n),K=Vt(p,I,d,b,v,V),C=a.projection==="topdown"&&c<=1e-4&&Math.abs(v)<=1e-4,U=s?Gr(e,d,o,a.scaleModel):void 0;return{kind:C?"circle":"ellipse",cx:C?r.x:p,cy:C?r.y:I,radius:C?d:void 0,rx:C?void 0:d,ry:C?void 0:b,rotationDeg:v,band:s,bandThickness:U,frontArcPath:a.projection==="isometric"||s?vt(p,I,d,b,v,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?vt(p,I,d,b,v,Math.PI,Math.PI*2):void 0,objectX:K.x,objectY:K.y}}function Wr(e,t){return t.innerPx+t.stepPx*Hr(Math.max(e,0)+1)}function Yr(e,t){let n=[];return e.forEach((r,o)=>{let i=Te(r),a=t.innerPx+o*t.stepPx,l=i===null?a:Wr(i,t),s=o===0?t.innerPx:(n[o-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Te(e){return!e.placement||e.placement.mode!=="orbit"?null:Ee(e.placement.semiMajor??e.placement.distance??null)}function Hr(e){return Math.log(e)/Math.log(2)}function qr(e,t,n){let r=e?He(e):null;return r!==null?qe(r-90):ge(t,n,-Math.PI/2)}function Gr(e,t,n,r){let o=Ee(Ye(e.properties.inner)),i=Ee(Ye(e.properties.outer));if(o!==null&&i!==null){let l=Math.abs(i-o);if(n.metricSpread>0)return S(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(o,i),1e-4);return S(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Xr(e,t,n,r,o,i,a,l,s){if(e.kind==="lagrange")return Kr(e,t,n,i,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let d=ge(r,o,Math.PI/5),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=be(d,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let d=ge(r,o,Math.PI/6),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=be(d,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:i-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Kr(e,t,n,r,o){let i=e.secondary?t.get(e.primary):to(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!i||!a)return{x:r*.7,y:o*.25};let l=a.x-i.x,s=a.y-i.y,c=Math.hypot(l,s)||1,d=l/c,f=s/c,m=-f,h=d,b=S(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-d*b,y:a.y-f*b,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+d*b,y:a.y+f*b,anchorX:a.x,anchorY:a.y};case"L3":return{x:i.x-d*b,y:i.y-f*b,anchorX:i.x,anchorY:i.y};case"L4":return{x:a.x+(d*.5-m*.8660254)*b,y:a.y+(f*.5-h*.8660254)*b,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(d*.5+m*.8660254)*b,y:a.y+(f*.5+h*.8660254)*b,anchorX:a.x,anchorY:a.y}}}function Zr(e,t){let n=new Map,r=new Map;for(let c of e){let d=Et(c,t);if(n.set(c.id,d),d){let f=r.get(d);f?f.push(c.id):r.set(d,[c.id])}r.has(c.id)||r.set(c.id,[])}let o=new Map,i=new Map,a=new Map,l=c=>{let d=o.get(c);if(d)return d;let f=new Set,m=[],h=n.get(c)??null;for(;h&&!f.has(h);)m.push(h),f.add(h),h=n.get(h)??null;return o.set(c,m),m},s=c=>{let d=a.get(i.get(c)??"");if(d)return d;let f=n.get(c)??null,m=t.get(c),h=c;return m?.placement&&m.placement.mode!=="free"&&f&&(h=s(f)),h};for(let c of e){l(c.id);let d=s(c.id),f=pe(d);i.set(c.id,f),a.set(f,d)}return{parentIds:n,childIds:r,ancestorIds:o,groupIds:i,groupRoots:a}}function Et(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function Jr(e,t,n,r,o,i){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,d=(f,m)=>{a=Math.min(a,f),l=Math.min(l,m),s=Math.max(s,f),c=Math.max(c,m)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&Tt(f,d);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Lt(f,d);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(d(f.x1,f.y1),d(f.x2,f.y2));for(let f of o)!f.hidden&&e.labelIds.includes(f.objectId)&&Mt(f,d,i);return!Number.isFinite(a)||!Number.isFinite(l)?he(0,0,0,0):he(a,l,s,c)}function Qr(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let o=Et(n,t);if(!o)break;let i=t.get(o);if(!i)break;n=i}return n.id}function Dt(e,t,n){return Ft(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Ft(e,t,n,r,o,i,a,l){let s=ao(i,a,l),c=s*2,d=o==="above"?18:12,f=o==="above"?8:12,m=e-s,h=e+s;return r==="start"?(m=e,h=e+c):r==="end"&&(m=e-c,h=e),{left:m,right:h,top:Math.min(t,n)-d,bottom:Math.max(t,n)+f}}function eo(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function to(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Me(e,t,n){let r=oo(e.properties.radius,n);if(r!==null)return r;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return S((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return S(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return S(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return S(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return S(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return S(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return S(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return S(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return S(8*o,n.minBodyRadius,n.maxBodyRadius)}}function no(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Ee(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/fe;case"m":return e.value/1e3/fe;case"ly":return e.value*tr;case"pc":return e.value*nr;case"kpc":return e.value*rr;case"re":return e.value*Jn/fe;case"rj":return e.value*Qn/fe;case"sol":return e.value*er/fe;default:return e.value}}function ro(e,t){let n=Ee(e??null);return n===null||n<=0?0:S(n*96*t.freePlacementMultiplier,0,420)}function oo(e,t){let n=Ye(e);if(!n)return null;let r;switch(n.unit){case"sol":r=S(n.value*22,14,40);break;case"re":r=S(n.value*10,6,18);break;case"km":r=S(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=S(n.value*4,4,20);break}return S(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Ye(e){return!e||typeof e!="object"||!("value"in e)?null:e}function He(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ge(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function vt(e,t,n,r,o,i,a){let l=Pt(e,t,n,r,o,i,a,jt);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${xt(s.x)} ${xt(s.y)}`).join(" ")}function Pt(e,t,n,r,o,i,a,l){let s=[];for(let c=0;c<=l;c+=1){let d=i+(a-i)*c/l;s.push(Vt(e,t,n,r,o,d))}return s}function Vt(e,t,n,r,o,i){let a=n*Math.cos(i),l=r*Math.sin(i),s=Ct(a,l,o);return{x:e+s.x,y:t+s.y}}function Ct(e,t,n){let r=qe(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function be(e,t,n,r){let o=n==="isometric"?kt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function De(e,t,n){return t*1e3+e+n*.01}function S(e,t,n){return Math.min(Math.max(e,t),n)}function $t(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function oe(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function pe(e){return`${oe(e)}-group`}function io(e){return typeof e=="string"&&e.trim()?e:void 0}function ao(e,t,n){let r=e.length*4.6*n+18,o=t.length*3.9*n+18;return Math.max(r,o,24)}function It(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function qe(e){return e*Math.PI/180}function xt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function Ge(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:po(e.system),info:mo(e.system)}:null,r=e.objects.map(so);return uo(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(lo),objects:r}}function so(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:fo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function lo(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(co)}}function co(e){return{objectId:e.objectId,placement:Rt(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0}}function Rt(e){return e?structuredClone(e):null}function uo(e,t,n){if(!n)return;let r=t.find(i=>i.id===n);if(!r)return;let o=new Map(e.map(i=>[i.id,i]));for(let i of r.positions){let a=o.get(i.objectId);a&&(a.placement=Rt(i.placement),i.inner?a.properties.inner={...i.inner}:delete a.properties.inner,i.outer?a.properties.outer={...i.outer}:delete a.properties.outer)}}function fo(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function po(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function mo(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let o=ho(n.layers);o&&(t[`${r}.layers`]=o),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function ho(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","events","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}var Bt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,yo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),wo=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ie(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function we(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Xe(e,t,n){let r=e.match(Bt);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=E(n);if(i?.unitFamily&&!ke(i.unitFamily,o.unit))throw u.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function Ke(e){let t=e.match(Bt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Fe(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function q(e,t,n){let r=yo.get(e.toLowerCase());if(r===void 0)throw u.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function _t(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function vo(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(wo);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function zt(e,t,n){let r=E(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw u.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return q(ye(t,e,n),e,n);case"number":return Fe(ye(t,e,n),e,n);case"unit":return Xe(ye(t,e,n),n,e);case"string":{let o=t.join(" ").trim();return e==="image"&&vo(o,n),o}}}function Ze(e,t,n){let r=E(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw u.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function ye(e,t,n){if(e.length!==1)throw u.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Ut=new Set(["star","planet","moon","asteroid","comet"]),$o=332946.0487,Io=1047.3486,Pe=1495978707e-1,xo=6371,ko=695700,jo=63241.077,So=206264.806,Oo=206264806;function Ve(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),o=new Set(e.groups.map(l=>l.id)),i=new Set(e.events.map(l=>l.id));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let d=a.get(c);d?n.push(w("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${d}.`)):a.set(c,l)}for(let l of e.relations)Ao(l,r,n);for(let l of e.system?.viewpoints??[])Lo(l.filter,l.events??[],o,i,t,n,l.id);for(let l of e.objects)To(l,e.system,r,o,n);for(let l of e.events)Mo(l,r,n);return n}function Ao(e,t,n){e.from?t.has(e.from)||n.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Lo(e,t,n,r,o,i,a){if(o==="2.1"){if(e)for(let l of e.groupIds)n.has(l)||i.push(T("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${a}".`,void 0,`viewpoint.${a}.groups`));for(let l of t)r.has(l)||i.push(T("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${a}".`,void 0,`viewpoint.${a}.events`))}}function To(e,t,n,r,o){let i=e.placement,a=i?.mode==="orbit"?i:null,l=i?.mode==="orbit"?n.get(i.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||o.push(T("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(a&&(n.has(a.target)||o.push(w("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&o.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&o.push(T("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(T("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!Wt(l?.properties.mass)&&o.push(T("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),i?.mode==="surface"){let s=n.get(i.target);s?Ut.has(s.type)||o.push(w("validate.surface.target.invalid",`Surface target "${i.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(w("validate.surface.target.unknown",`Unknown placement target "${i.target}" on "${e.id}".`,e.id,"surface"))}if(i?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&o.push(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Do(e,n,o)||o.push(w("validate.at.target.unknown",`Unknown at-reference target "${i.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&o.push(T("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(w("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){o.push(T("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=Nt(e,l);if(c===null){o.push(T("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||o.push(Co("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Vo(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){o.push(T("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=Yt(a?.period),d=Nt(e,l);if(c===null||d===null)continue;let f=Po(e,"period");Math.abs(c-d)>f&&o.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Mo(e,t,n){let r=`event.${e.id}`,o=new Set;e.kind.trim()||n.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${r}.kind`)),!e.targetObjectId&&e.participantObjectIds.length===0&&n.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${r}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),t.has(e.targetObjectId)||n.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${r}.target`)));let i=new Set;for(let l of e.participantObjectIds){if(o.add(l),i.has(l)){n.push(T("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${r}.participants`));continue}i.add(l),t.has(l)||n.push(w("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${r}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&n.push(T("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${r}.target`)),e.positions.length===0&&n.push(T("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${r}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&n.push(T("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${r}.participants`));let a=new Set;for(let l of e.positions){let s=`${r}.pose.${l.objectId}`;if(a.has(l.objectId)){n.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,s));continue}a.add(l.objectId);let c=t.get(l.objectId);if(!c){n.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,s));continue}o.has(l.objectId)||n.push(T("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,s)),Eo(l,c,t,n,s,e.id)}}function Eo(e,t,n,r,o,i){let a=e.placement;if(!a){r.push(w("validate.event.pose.placement.required",`Event "${i}" pose "${e.objectId}" is missing a placement mode.`,void 0,o));return}if(a.mode==="orbit"){n.has(a.target)||r.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.orbit`)),a.distance&&a.semiMajor&&r.push(w("validate.event.pose.orbit.distanceConflict",`Event "${i}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${o}.distance`));return}if(a.mode==="surface"){let l=n.get(a.target);l?Ut.has(l.type)||r.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${a.target}" on "${i}:${e.objectId}" is not surface-capable.`,void 0,`${o}.surface`)):r.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.surface`));return}if(a.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&r.push(w("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${i}:${e.objectId}".`,void 0,`${o}.at`));let l=a.reference;l.kind==="named"&&!n.has(l.name)?r.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):l.kind==="anchor"&&!n.has(l.objectId)?r.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):l.kind==="lagrange"&&(n.has(l.primary)?l.secondary&&!n.has(l.secondary)&&r.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):r.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)))}}function Do(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(w("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Nt(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Fo(n.semiMajor??n.distance),o=Wt(t?.properties.mass);return r===null||o===null||o<=0?null:Math.sqrt(r**3/o)*365.25}function Fo(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Pe;case"m":return e.value/(Pe*1e3);case"ly":return e.value*jo;case"pc":return e.value*So;case"kpc":return e.value*Oo;case"re":return e.value*xo/Pe;case"sol":return e.value*ko/Pe;default:return null}}function Wt(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/$o;case"mj":return t.value/Io;default:return null}}function Yt(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Po(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Yt(n)??0:0}function Vo(e){return`${Math.round(e*100)/100}d`}function w(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function T(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Co(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Ro=new Set(["climate","habitability","settlement"]),Ce=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=E(e);t&&Ce.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Ce.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Bo=new Set(Ce.keys()),_o=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer"]);function Je(e){return zo(e)}function zo(e,t){let n=Si(e),r=n.source.split(/\r?\n/),o=[],i=!1,a="2.0",l=null,s=null,c=[],d=[],f=[],m=[],h=new Map,b=!1,v=!1,x=new Set,k=new Set,p=new Set,I=new Set,V=new Set;for(let A=0;A<r.length;A++){let Z=r[A],M=A+1;if(!Z.trim())continue;let _=je(Z),N=le(Z.slice(_),{line:M,columnOffset:_});if(N.length!==0){if(!i){a=No(N,M),i=!0,n.comments.length>0&&a!=="2.1"&&o.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(_===0){s=Uo(N,M,a,o,l,c,d,f,m,h,x,k,p,I,V,{sawDefaults:b,sawAtlas:v}),s.kind==="system"?l=s.system:s.kind==="defaults"?b=!0:s.kind==="atlas"&&(v=!0);continue}if(!s)throw new u("Indented line without parent atlas section",M,_+1);Zo(s,_,N,M)}}if(!i)throw new u('Missing required atlas schema header "schema 2.0"');let K=c.map(A=>hi(A,a,o)),C=m.map(A=>gi(A,h.get(A.id)??[])),U=t??(a==="2.0-draft"?"2.0":a),W={format:"worldorbit",sourceVersion:"1.0",system:l,groups:d,relations:f,events:C,objects:K,diagnostics:o};if(U==="2.0-draft"){let A={...W,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...Ve(A,a)),A}let B={...W,version:U,schemaVersion:U};return a==="2.0-draft"&&B.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),B.diagnostics.push(...Ve(B,a)),B}function No(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new u('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Uo(e,t,n,r,o,i,a,l,s,c,d,f,m,h,b,v){switch(e[0]?.value.toLowerCase()){case"system":if(o)throw new u('Atlas section "system" may only appear once',t,e[0].column);return Wo(e,t,n,r);case"defaults":if(!o)throw new u('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(v.sawDefaults)throw new u('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:o,seenFields:new Set};case"atlas":if(!o)throw new u('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(v.sawAtlas)throw new u('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:o,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!o)throw new u('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Yo(e,t,o,d,n,r);case"annotation":if(!o)throw new u('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Ho(e,t,o,f);case"group":return P(n,r,"group",{line:t,column:e[0].column}),qo(e,t,a,m);case"relation":return P(n,r,"relation",{line:t,column:e[0].column}),Go(e,t,l,h);case"event":return P(n,r,"event",{line:t,column:e[0].column}),Xo(e,t,s,c,b,n,r);case"object":return Ko(e,t,n,r,i);default:throw new u(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Wo(e,t,n,r){if(e.length!==2)throw new u("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function Yo(e,t,n,r,o,i){if(e.length!==2)throw new u("Invalid viewpoint declaration",t,e[0]?.column??1);let a=ie(e[1].value);if(!a)throw new u("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new u(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:we(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:o,diagnostics:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function Ho(e,t,n,r){if(e.length!==2)throw new u("Invalid annotation declaration",t,e[0]?.column??1);let o=ie(e[1].value);if(!o)throw new u("Annotation id must not be empty",t,e[1].column);if(r.has(o))throw new u(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:we(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(i),r.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function qo(e,t,n,r){if(e.length!==2)throw new u("Invalid group declaration",t,e[0]?.column??1);let o=ie(e[1].value);if(!o)throw new u("Group id must not be empty",t,e[1].column);if(r.has(o))throw new u(`Duplicate group id "${o}"`,t,e[1].column);let i={id:o,label:we(o),summary:"",color:null,tags:[],hidden:!1};return n.push(i),r.add(o),{kind:"group",group:i,seenFields:new Set}}function Go(e,t,n,r){if(e.length!==2)throw new u("Invalid relation declaration",t,e[0]?.column??1);let o=ie(e[1].value);if(!o)throw new u("Relation id must not be empty",t,e[1].column);if(r.has(o))throw new u(`Duplicate relation id "${o}"`,t,e[1].column);let i={id:o,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(i),r.add(o),{kind:"relation",relation:i,seenFields:new Set}}function Xo(e,t,n,r,o,i,a){if(e.length!==2)throw new u("Invalid event declaration",t,e[0]?.column??1);let l=ie(e[1].value);if(!l)throw new u("Event id must not be empty",t,e[1].column);if(o.has(l))throw new u(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:we(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),o.add(l),{kind:"event",event:s,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Ko(e,t,n,r,o){if(e.length<3)throw new u("Invalid atlas object declaration",t,e[0]?.column??1);let i=e[1],a=e[2],l=i.value;if(!xe.has(l)||l==="system")throw new u(`Unknown object type "${i.value}"`,t,i.column);let s={objectType:l,id:a.value,fields:pi(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:i.column}};return o.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Zo(e,t,n,r){switch(e.kind){case"system":Jo(e,n,r);return;case"defaults":Qo(e,n,r);return;case"atlas":ei(e,t,n,r);return;case"viewpoint":ti(e,t,n,r);return;case"annotation":ri(e,n,r);return;case"group":oi(e,n,r);return;case"relation":ii(e,n,r);return;case"event":ai(e,t,n,r);return;case"object":li(e,t,n,r);return}}function Jo(e,t,n){let r=X(t,e.seenFields,n),o=$(t,n);switch(r){case"title":e.system.title=o;return;case"description":P(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=o;return;case"epoch":P(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=o;return;case"referenceplane":P(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=o;return;default:throw new u(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Qo(e,t,n){let r=X(t,e.seenFields,n),o=$(t,n);switch(r){case"view":e.system.defaults.view=qt(o,n,t[0].column);return;case"scale":e.system.defaults.scale=o;return;case"units":e.system.defaults.units=o;return;case"preset":e.system.defaults.preset=Gt(o,n,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new u(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function ei(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let o=Kt(n,r,"Invalid atlas metadata entry");if(o.key in e.system.atlasMetadata)throw new u(`Duplicate atlas metadata key "${o.key}"`,r,n[0].column);e.system.atlasMetadata[o.key]=o.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new u(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function ti(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){ni(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new u('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=X(n,e.seenFields,r),i=$(n,r);switch(o){case"label":e.viewpoint.label=i;return;case"summary":e.viewpoint.summary=i;return;case"focus":e.viewpoint.focusObjectId=i;return;case"select":e.viewpoint.selectedObjectId=i;return;case"projection":e.viewpoint.projection=qt(i,r,n[0].column);return;case"preset":e.viewpoint.preset=Gt(i,r,n[0].column);return;case"zoom":e.viewpoint.zoom=di(i,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Xt(i,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=ui(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":P(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=z(n.slice(1),r,"events");return;default:throw new u(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function ni(e,t,n){let r=X(t,e.seenFilterFields,n),o=e.viewpoint.filter??fi();switch(r){case"query":o.query=$(t,n);break;case"objecttypes":o.objectTypes=ci(t.slice(1),n);break;case"tags":o.tags=z(t.slice(1),n,"tags");break;case"groups":o.groupIds=z(t.slice(1),n,"groups");break;default:throw new u(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=o}function ri(e,t,n){switch(X(t,e.seenFields,n)){case"label":e.annotation.label=$(t,n);return;case"target":e.annotation.targetObjectId=$(t,n);return;case"body":e.annotation.body=$(t,n);return;case"tags":e.annotation.tags=z(t.slice(1),n,"tags");return;default:throw new u(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function oi(e,t,n){switch(X(t,e.seenFields,n)){case"label":e.group.label=$(t,n);return;case"summary":e.group.summary=$(t,n);return;case"color":e.group.color=$(t,n);return;case"tags":e.group.tags=z(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=q($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function ii(e,t,n){switch(X(t,e.seenFields,n)){case"from":e.relation.from=$(t,n);return;case"to":e.relation.to=$(t,n);return;case"kind":e.relation.kind=$(t,n);return;case"label":e.relation.label=$(t,n);return;case"summary":e.relation.summary=$(t,n);return;case"tags":e.relation.tags=z(t.slice(1),n,"tags");return;case"color":e.relation.color=$(t,n);return;case"hidden":e.relation.hidden=q($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function ai(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){e.activePose.fields.push(si(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new u(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let i=n[1].value;if(!i.trim())throw new u("Event pose object id must not be empty",r,n[1].column);let a={objectId:i,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new u('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(X(n,e.seenFields,r)){case"kind":e.event.kind=$(n,r);return;case"label":e.event.label=$(n,r);return;case"summary":e.event.summary=$(n,r);return;case"target":e.event.targetObjectId=$(n,r);return;case"participants":e.event.participantObjectIds=z(n.slice(1),r,"participants");return;case"timing":e.event.timing=$(n,r);return;case"visibility":e.event.visibility=$(n,r);return;case"tags":e.event.tags=z(n.slice(1),r,"tags");return;case"color":e.event.color=$(n,r);return;case"hidden":e.event.hidden=q($(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new u(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function si(e,t,n){if(e.length<2)throw new u("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!_o.has(r))throw new u(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new u(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(o=>o.value),location:{line:t,column:e[0].column}}}function li(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let o=n[0].value.toLowerCase();if(o==="info"||Ro.has(o)){o!=="info"&&P(e.sourceSchemaVersion,e.diagnostics,o,{line:r,column:n[0].column}),e.activeBlock=o,e.blockIndent=t;return}}if(e.activeBlock){let o=Kt(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(o.key))throw new u(`Duplicate info key "${o.key}"`,r,n[0].column);e.seenInfoKeys.add(o.key),e.objectNode.infoEntries.push(o);return}let i=e.activeBlock,a=e.seenTypedBlockKeys[i]??(e.seenTypedBlockKeys[i]=new Set);if(a.has(o.key))throw new u(`Duplicate ${i} key "${o.key}"`,r,n[0].column);a.add(o.key),(e.objectNode.typedBlockEntries[i]??(e.objectNode.typedBlockEntries[i]=[])).push(o);return}e.objectNode.fields.push(mi(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function X(e,t,n){if(e.length<2)throw new u("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new u(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function $(e,t){if(e.length<2)throw new u("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function ci(e,t){return z(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function ui(e,t,n,r){let o={};for(let i of z(e,t,"layers")){let a=!i.startsWith("-")&&!i.startsWith("!"),l=i.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){o["orbits-back"]=a,o["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&P(n,r,"layers.events",{line:t,column:e[0]?.column??1}),o[l]=a)}return o}function z(e,t,n){if(e.length===0)throw new u(`Missing value for atlas field "${n}"`,t,1);let r=e.map(o=>o.value).filter(Boolean);if(r.length===0)throw new u(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function qt(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new u(`Unknown projection "${e}"`,t,n);return r}function Gt(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new u(`Unknown render preset "${e}"`,t,n)}function di(e,t,n,r){let o=Xt(e,t,n,r);if(o<=0)throw new u(`Field "${r}" must be greater than zero`,t,n);return o}function Xt(e,t,n,r){let o=Number(e);if(!Number.isFinite(o))throw new u(`Invalid numeric value "${e}" for "${r}"`,t,n);return o}function fi(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function pi(e,t,n,r,o){let i=[],a=0;for(;a<e.length;){let l=e[a],s=ve(l.value);if(!s)throw new u(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&P(r,o,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let d=e[a];d&&(c.push(d),a++)}else if(s.inlineMode==="pair")for(let d=0;d<2;d++){let f=e[a];if(!f)break;c.push(f),a++}else for(;a<e.length&&!Bo.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new u(`Missing value for field "${l.value}"`,t,l.column);i.push({type:"field",key:l.value,values:c.map(d=>d.value),location:{line:t,column:l.column}})}return en(i,n),i}function mi(e,t,n,r,o){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);let i=ve(e[0].value);if(!i)throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);i.version==="2.1"&&P(r,o,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return en([a],n),a}function Kt(e,t,n){if(e.length<2)throw new u(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function hi(e,t,n){let r=Zt(e.fields),o=Jt(r),i=yi(e.objectType,r),a=ki(r.get("groups")?.[0]),l=Ht(r.get("epoch")?.[0]),s=Ht(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?q(R(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,d=r.has("resonance")?$i(r.get("resonance")[0]):void 0,f=vi(r),m=r.get("derive")?.map(I=>Ii(I)),h=r.get("validate")?.map(I=>({rule:R(I)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap(I=>I.values))]:void 0,v=r.get("tolerance")?.map(I=>xi(I)),x=wi(e.typedBlockEntries),k=Qt(e.infoEntries,"info"),p={type:e.objectType,id:e.id,properties:i,placement:o,info:k};return a.length>0&&(p.groups=a),l&&(p.epoch=l),s&&(p.referencePlane=s),c!==void 0&&(p.tidalLock=c),d&&(p.resonance=d),f&&(p.renderHints=f),m?.length&&(p.deriveRules=m),h?.length&&(p.validationRules=h),b?.length&&(p.lockedFields=b),v?.length&&(p.tolerances=v),x&&Object.keys(x).length>0&&(p.typedBlocks=x),t!=="2.1"&&(p.groups||p.epoch||p.referencePlane||p.tidalLock!==void 0||p.resonance||p.renderHints||p.deriveRules?.length||p.validationRules?.length||p.lockedFields?.length||p.tolerances?.length||p.typedBlocks)&&P(t,n,e.id,e.location),p}function gi(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>bi(n))}}function bi(e){let t=Zt(e.fields),n=Jt(t);return{objectId:e.objectId,placement:n,inner:G(t.get("inner")?.[0],"inner"),outer:G(t.get("outer")?.[0],"outer")}}function Zt(e){let t=new Map;for(let n of e){let r=ve(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);let o=t.get(n.key)??[];o.push(n),t.set(n.key,o)}return t}function Jt(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],o=e.get("free")?.[0];if([t,n,r,o].filter(Boolean).length>1){let a=t??n??r??o;throw u.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:R(t),distance:G(e.get("distance")?.[0],"distance"),semiMajor:G(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:ji(e.get("eccentricity")?.[0],"eccentricity"),period:G(e.get("period")?.[0],"period"),angle:G(e.get("angle")?.[0],"angle"),inclination:G(e.get("inclination")?.[0],"inclination"),phase:G(e.get("phase")?.[0],"phase")};if(n){let a=R(n);return{mode:"at",target:a,reference:_t(a,n.location)}}if(r)return{mode:"surface",target:R(r)};if(o){let a=R(o),l=Ke(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function yi(e,t){let n={};for(let[r,o]of t.entries()){let i=o[0],a=ve(r);!i||!a?.legacySchema||a.legacySchema.placement||(Ze(r,e,i.location),n[r]=zt(r,i.values,i.location))}return n}function Qt(e,t){let n={};for(let r of e){if(r.key in n)throw u.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function wi(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Qt(r,n))}return t}function vi(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],o=e.get("renderPriority")?.[0];return n&&(t.renderLabel=q(R(n),"renderLabel",n.location)),r&&(t.renderOrbit=q(R(r),"renderOrbit",r.location)),o&&(t.renderPriority=Fe(R(o),"renderPriority",o.location)),Object.keys(t).length>0?t:void 0}function $i(e){if(e.values.length!==2)throw u.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw u.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Ii(e){if(e.values.length!==2)throw u.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function xi(e){if(e.values.length!==2)throw u.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Ke(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ki(e){return e?[...new Set(e.values)]:[]}function Ht(e){return e&&e.values.join(" ").trim()||null}function G(e,t){return e?Xe(R(e),e.location,t):void 0}function ji(e,t){return e?Fe(R(e),t,e.location):void 0}function R(e){return ye(e.values,e.key,e.location)}function ve(e){return Ce.get(e)}function en(e,t){for(let n of e){let r=ve(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Ze(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function P(e,t,n,r){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Si(e){let t=[...e],n=[],r=!1,o=!1,i=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],d=t[s+1];if(o){if(c==="*"&&d==="/"){t[s]=" ",t[s+1]=" ",o=!1,i=null,s++,l+=2;continue}c!==`
1
+ "use strict";var WorldOrbitMarkdown=(()=>{var Je=Object.defineProperty;var zn=Object.getOwnPropertyDescriptor;var Bn=Object.getOwnPropertyNames;var _n=Object.prototype.hasOwnProperty;var Nn=(e,t)=>{for(var n in t)Je(e,n,{get:t[n],enumerable:!0})},Un=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Bn(t))!_n.call(e,i)&&i!==n&&Je(e,i,{get:()=>t[i],enumerable:!(r=zn(t,i))||r.enumerable});return e};var Wn=e=>Un(Je({},"__esModule",{value:!0}),e);var Ya={};Nn(Ya,{rehypeWorldOrbit:()=>Mn,remarkWorldOrbit:()=>Ln,renderWorldOrbitBlock:()=>ce,renderWorldOrbitError:()=>jt});var d=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var ue=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],C=ue.filter(e=>e!=="system"),Yn=["star","planet","moon","asteroid","comet","structure","phenomenon"],At=["structure","phenomenon"],q=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Hn=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function w(e,t){return{key:e,...t}}var Le=new Set(ue),Lt=new Map([w("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:q}),w("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"distance"}),w("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"distance"}),w("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:q}),w("period",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"duration"}),w("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"angle"}),w("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"angle"}),w("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:q,unitFamily:"angle"}),w("at",{kind:"string",placement:!0,arity:"single",objectTypes:At}),w("surface",{kind:"string",placement:!0,arity:"single",objectTypes:At}),w("free",{kind:"string",placement:!0,arity:"single",objectTypes:Hn}),w("kind",{kind:"string",placement:!1,arity:"single",objectTypes:C}),w("class",{kind:"string",placement:!1,arity:"single",objectTypes:C}),w("culture",{kind:"string",placement:!1,arity:"single",objectTypes:C}),w("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:ue}),w("color",{kind:"string",placement:!1,arity:"single",objectTypes:ue}),w("image",{kind:"string",placement:!1,arity:"single",objectTypes:Yn}),w("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:ue}),w("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"radius"}),w("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"mass"}),w("density",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"generic"}),w("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"generic"}),w("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"generic"}),w("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:C}),w("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),w("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("on",{kind:"string",placement:!1,arity:"single",objectTypes:C}),w("source",{kind:"string",placement:!1,arity:"single",objectTypes:C}),w("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"duration"})].map(e=>[e.key,e])),qn=new Set(Lt.keys());function P(e){return Lt.get(e)}function Tt(e){return qn.has(e)}function Mt(e,t){return e.objectTypes.includes(t)}function Te(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function de(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,l=!1,s=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let f=e[u],m=r+u+1;if(l&&f==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(f==='"'){l?l=!1:(o===null&&(o=m),a=!0,s=m,l=!0);continue}if(!l&&/\s/.test(f)){c();continue}o===null&&(o=m),i+=f}if(l)throw new d("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Me(e){return e.match(/^\s*/)?.[0].length??0}function fe(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,o=null;for(let a=0;a<t.length;a++){let l=t[a],s=a+1;if(!l.trim())continue;let c=Me(l),u=de(l.slice(c),{line:s,columnOffset:c});if(u.length!==0){if(c===0){i=!1,o=null;let f=Gn(u,s);n.push(f),r=f;continue}if(!r)throw new d("Indented line without parent object",s,c+1);if(u.length===1&&u[0].value==="info"){i=!0,o=c;continue}i&&c<=(o??0)&&(i=!1),i?r.infoEntries.push(Zn(u,s)):r.blockFields.push(Kn(u,s))}}return{type:"document",objects:n}}function Gn(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Le.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Xn(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Xn(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=P(i.value);if(!o)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!Tt(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(l=>l.value),location:{line:t,column:i.column}})}return n}function Kn(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!P(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function Zn(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var Pt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Jn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Qn=/^[A-Za-z][A-Za-z0-9+.-]*:/;function pe(e){let t=null,n=[];for(let r of e.objects){let i=er(r);if(r.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function er(e){let t=[...e.inlineFields,...e.blockFields];tr(e.objectType,t);let n=nr(t),r=rr(e.objectType,n),i=ir(n),o=sr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function tr(e,t){for(let n of t){let r=P(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Mt(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function nr(e){let t=new Map;for(let n of e){if(t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function rr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Pe(t,"orbit"),distance:oe(t,"distance"),semiMajor:oe(t,"semiMajor"),eccentricity:ur(t,"eccentricity"),period:oe(t,"period"),angle:oe(t,"angle"),inclination:oe(t,"inclination"),phase:oe(t,"phase")};if(r){let l=Ee(t,"at"),s=Pe(t,"at");return{mode:"at",target:s,reference:lr(s,l.location)}}if(i)return{mode:"surface",target:Pe(t,"surface")};if(o){let l=Pe(t,"free"),s=cr(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function ir(e){let t={};for(let[n,r]of e.entries()){let i=P(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=dr(r);break;case"number":t[n]=Dt(ae(r),n,r.location);break;case"unit":t[n]=Et(ae(r),r.location,n);break;case"string":t[n]=or(n,r);break}}return t}function or(e,t){let n=t.values.join(" ").trim();return e==="image"&&ar(n,t.location),n}function ar(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Qn);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function sr(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function lr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Et(e,t,n){let r=e.match(Pt);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=P(n);if(o?.unitFamily&&!Te(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function cr(e){let t=e.match(Pt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function oe(e,t){if(!e.has(t))return;let n=Ee(e,t);return Et(ae(n),n.location,t)}function ur(e,t){if(!e.has(t))return;let n=Ee(e,t);return Dt(ae(n),t,n.location)}function Dt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function dr(e){let t=ae(e).toLowerCase(),n=Jn.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Ee(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function Pe(e,t){return ae(Ee(e,t))}function ae(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var fr=new Set(["star","planet","moon","asteroid","comet"]);function me(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!fr.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&pr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&mr(r,r.placement.reference,t))}}function pr(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function mr(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function te(e,t,n=`${t}.failed`){return e instanceof d?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}var he=1495978707e-1,hr=6371,gr=71492,br=695700,yr=63241.077,wr=206264.806,vr=206264806,_t=.68,$r=.2,Nt=28;function G(e,t={}){let n=kr(t),r=n.width,i=n.height,o=n.padding,a=xr(e),l=Sr(e,t.projection),s=it(t.camera??null),c=rt(l,s),u=Lr(a,t.scaleModel),f=Mr(a),m=e.system?.id??null,h=t.activeEventId??null,b=Ir(e.objects,e.events??[],h),I=new Map(b.map(g=>[g.id,g])),k=mi(b,I),j=new Map,p=[],$=[],E=[],B=[],D=[],Y=new Map,H=new Map;for(let g of b){let F=g.placement;if(!F){E.push(g);continue}if(F.mode==="orbit"){Rt(H,F.target,g);continue}if(F.mode==="surface"){Rt(Y,F.target,g);continue}if(F.mode==="at"){D.push(g);continue}B.push(g)}let Q=B.length>0?r*.42:r/2,L=i/2,_={orbitChildren:H,surfaceChildren:Y,objectMap:I,spacingFactor:f,projection:c,scaleModel:u},N=E.find(g=>g.type==="star")??E[0]??null;N&&et(N,Q,L,0,j,p,$,_);let U=E.filter(g=>g.id!==N?.id);if(U.length>0){let g=Math.min(r,i)*.28*f*u.orbitDistanceMultiplier;U.forEach((F,S)=>{let Ze=ve(S,U.length,-Math.PI/2),ee=$e(Ze,g,c,1);et(F,Q+ee.x,L+ee.y,0,j,p,$,_)})}B.forEach((g,F)=>{let S=r-o-140-vi(g.placement?.mode==="free"?g.placement.distance:void 0,u),Ze=Math.max(76,(i-o*2-180)/Math.max(1,B.length)*f)*u.freePlacementMultiplier,ee=o+92+F*Ze;j.set(g.id,{object:g,x:S,y:ee,radius:Re(g,0,u),sortKey:Be(S,ee,0)}),$.push({object:g,groupId:k.groupIds.get(g.id)??null,x1:S-60,y1:ee,x2:S-18,y2:ee,mode:"free"}),Ce(g,j,p,$,_,1)}),D.forEach((g,F)=>{if(j.has(g.id)||!g.placement||g.placement.mode!=="at")return;let S=fi(g.placement.reference,j,I,F,D.length,r,i,o,_);j.set(g.id,{object:g,x:S.x,y:S.y,radius:Re(g,2,u),sortKey:Be(S.x,S.y,2),anchorX:S.anchorX,anchorY:S.anchorY}),S.anchorX!==void 0&&S.anchorY!==void 0&&$.push({object:g,groupId:k.groupIds.get(g.id)??null,x1:S.anchorX,y1:S.anchorY,x2:S.x,y2:S.y,mode:"at"}),Ce(g,j,p,$,_,2)});let M=[...j.values()].map(g=>Pr(g,u,k)),Se=p.map(g=>Er(g,k.groupIds.get(g.object.id)??null)),Oe=$.map(g=>Dr(g)),Ae=Fr(M,r,i,u.labelMultiplier),St=Ur(e,M),Ot=Wr(e.events??[],M,h),Dn=Br(Se,St,Ot,Oe,M,Ae),Fn=_r(M,Se,Oe,Ae,k,u.labelMultiplier),Cn=Nr(e,M),Vn=Yr(e,l,n.preset,k,I),Rn=ri(r,i,M,Se,Oe,Ae,u.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:u,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:Ar(l,c,a,s),systemId:m,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:Rn,layers:Dn,groups:Fn,semanticGroups:Cn,viewpoints:Vn,events:Ot,activeEventId:h,objects:M,orbitVisuals:Se,relations:St,leaders:Oe,labels:Ae}}function Ir(e,t,n){let r=e.map(l=>structuredClone(l));if(!n)return r;let i=t.find(l=>l.id===n);if(!i)return r;let o=new Map(r.map(l=>[l.id,l])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(l=>l.objectId)]);for(let l of a){let s=o.get(l);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let l of i.positions){let s=o.get(l.objectId);s&&(l.placement&&(s.placement=structuredClone(l.placement)),l.inner&&(s.properties.inner={...l.inner}),l.outer&&(s.properties.outer={...l.outer}),l.epoch&&(s.epoch=l.epoch),l.referencePlane&&(s.referencePlane=l.referencePlane))}return r}function xr(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function kr(e){let t=jr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function jr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Sr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return Yt(n)??"topdown"}function rt(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function it(e){if(!e)return null;let t={azimuth:Qe(e.azimuth),elevation:Qe(e.elevation),roll:Qe(e.roll),distance:Or(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function Qe(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Or(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Ar(e,t,n,r){let i=[`${zt(e)} view`,`${zt(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function Lr(e,t){return{...Tr(e),...t}}function Tr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Mr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Pr(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:se(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:o,radius:a,visualRadius:wi(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Ii(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Er(e,t){return{renderId:`${se(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function Dr(e){return{renderId:`${se(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Fr(e,t,n,r){let i=[],o=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(Cr);for(let s of l){let c=Vr(s,a,o,t,n,r)??Wt(s,Ut(s,a.get(s.parentId??"")??null,n),0,r);o.push(Kt(s,c,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return i}function Cr(e,t){let n=Ft(e)-Ft(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function Ft(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function Vr(e,t,n,r,i,o){for(let a of Rr(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=Wt(e,a,s,o),u=Kt(e,c,o);if(!n.some(f=>bi(f,u)))return c}}return null}function Rr(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=Ut(e,i,r),a=o==="below"?"above":"below",l=zr(e,i,n),s=l==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[l,o,s,a]:[o,l,a,s]}function Ut(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function zr(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function Wt(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function Br(e,t,n,r,i,o){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function _r(e,t,n,r,i,o){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let u=i.groupRoots.get(s)??null,f={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:we(0,0,0,0)};return a.set(s,f),f};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=hi(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function Nr(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function Ur(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${se(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Wr(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=o.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,s=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${se(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:l,y:s,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function Yr(e,t,n,r,i){let o=Hr(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,m,...h]=c.split(".");if(f!=="viewpoint"||!m||h.length===0)continue;let b=ei(m);if(!b)continue;let I=h.join(".").toLowerCase(),k=a.get(b)??{id:b};qr(k,I,u,e,t,n,r,i),a.set(b,k)}let l=[...a.values()].map(c=>Gr(c,t,n,i)).filter(Boolean),s=l.findIndex(c=>c.id===o.id);return s>=0?l.splice(s,1,{...o,...l[s],layers:{...o.layers,...l[s].layers},filter:l[s].filter??o.filter,generated:!1}):l.unshift(o),l.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function Hr(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=it(null),a=rt(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:a,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function qr(e,t,n,r,i,o,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=ye(s);return;case"projection":case"view":e.projection=Yt(s)??i;return;case"preset":e.preset=Kr(s)??o;return;case"rotation":case"angle":e.rotationDeg=ge(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Fe(),azimuth:ge(s)};return;case"camera.elevation":e.camera={...e.camera??Fe(),elevation:ge(s)};return;case"camera.roll":e.camera={...e.camera??Fe(),roll:ge(s)};return;case"camera.distance":e.camera={...e.camera??Fe(),distance:Ct(s)};return;case"zoom":case"scale":e.scale=Ct(s);return;case"layers":e.layers=Zr(s);return;case"query":e.filter={...e.filter??De(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??De(),objectTypes:Jr(s)};return;case"tags":e.filter={...e.filter??De(),tags:ye(s)};return;case"groups":e.filter={...e.filter??De(),groupIds:Qr(s,r,a,l)};return}}function Gr(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,a=Xr(e.filter),l=e.label?.trim()||ti(e.id),s=e.projection??t,c=it(e.camera??null),u=rt(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||ni(l,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function De(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Fe(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Xr(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function Yt(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function Kr(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function ge(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ct(e){let t=ge(e);return t!==null&&t>0?t:null}function Zr(e){let t={};for(let n of ye(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Jr(e){return ye(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Qr(e,t,n,r){return ye(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??be(i):(r.has(i),be(i)))}function ye(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function ei(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ti(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ni(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function ri(e,t,n,r,i,o,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(m,h)=>{l=Math.min(l,m),s=Math.min(s,h),c=Math.max(c,m),u=Math.max(u,h)};for(let m of r)m.hidden||Ht(m,f);for(let m of i)m.hidden||(f(m.x1,m.y1),f(m.x2,m.y2));for(let m of n)m.hidden||qt(m,f);for(let m of o)m.hidden||Gt(m,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?we(0,0,e,t):we(l,s,c,u)}function Ht(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,o=Jt(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Nt*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function we(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function qt(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function Gt(e,t,n){let r=Zt(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function et(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Re(e,r,l.scaleModel),sortKey:Be(t,n,r)}),Ce(e,i,o,a,l,r+1))}function Ce(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(ii),s=oi(l,a.radius,i.spacingFactor,i.scaleModel),c=li(l,s);l.forEach((f,m)=>{let h=ai(f,m,l.length,a,s,c[m]??s.innerPx,i);n.push({object:f,parentId:e.id,kind:h.kind,cx:h.cx,cy:h.cy,radius:h.radius,rx:h.rx,ry:h.ry,rotationDeg:h.rotationDeg,band:h.band,bandThickness:h.bandThickness,frontArcPath:h.frontArcPath,backArcPath:h.backArcPath}),et(f,h.objectX,h.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,m)=>{let h=ve(m,u.length,-Math.PI/3),b=28*i.spacingFactor,I=$e(h,a.radius,i.projection,i.projection==="isometric"?.9:1),k=$e(h,a.radius+b,i.projection,i.projection==="isometric"?.9:1),j=a.x+I.x,p=a.y+I.y,$=a.x+k.x,E=a.y+k.y;t.set(f.id,{object:f,x:$,y:E,radius:Re(f,o+1,i.scaleModel),sortKey:Be($,E,o+1),anchorX:j,anchorY:p}),r.push({object:f,groupId:i.objectMap.has(f.id)?be(gi(f,i.objectMap)):null,x1:j,y1:p,x2:$,y2:E,mode:"surface"}),Ce(f,t,n,r,i,o+1)})}function ii(e,t){let n=Ve(e),r=Ve(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function oi(e,t,n,r){let i=e.map(f=>Ve(f)),o=i.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42};let s=Math.min(...o),c=Math.max(...o),u=c-s;return{metrics:i,minMetric:s,maxMetric:c,metricSpread:u,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42}}function ai(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let H=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:H,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-H}}let c=O(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,f=Math.max(u*Math.sqrt(1-c*c),u*.18),m=nt(l.inclination)??0,h=a.projection==="isometric"?Math.max($r,Math.cos(ot(m)))*_t:1,b=Math.max(f*h,u*.14),I=nt(l.angle)??0,k=u*c,j=en(-k,0,I),p=r.x+j.x,$=r.y+j.y,E=ui(l.phase,t,n),B=Qt(p,$,u,b,I,E),D=a.projection==="topdown"&&c<=1e-4&&Math.abs(I)<=1e-4,Y=s?di(e,u,i,a.scaleModel):void 0;return{kind:D?"circle":"ellipse",cx:D?r.x:p,cy:D?r.y:$,radius:D?u:void 0,rx:D?void 0:u,ry:D?void 0:b,rotationDeg:I,band:s,bandThickness:Y,frontArcPath:a.projection==="isometric"||s?Vt(p,$,u,b,I,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Vt(p,$,u,b,I,Math.PI,Math.PI*2):void 0,objectX:B.x,objectY:B.y}}function si(e,t){return t.innerPx+t.stepPx*ci(Math.max(e,0)+1)}function li(e,t){let n=[];return e.forEach((r,i)=>{let o=Ve(r),a=t.innerPx+i*t.stepPx,l=o===null?a:si(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Ve(e){return!e.placement||e.placement.mode!=="orbit"?null:ze(e.placement.semiMajor??e.placement.distance??null)}function ci(e){return Math.log(e)/Math.log(2)}function ui(e,t,n){let r=e?nt(e):null;return r!==null?ot(r-90):ve(t,n,-Math.PI/2)}function di(e,t,n,r){let i=ze(tt(e.properties.inner)),o=ze(tt(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.metricSpread>0)return O(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return O(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function fi(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return pi(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=ve(r,i,Math.PI/5),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=$e(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=ve(r,i,Math.PI/6),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=$e(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function pi(e,t,n,r,i){let o=e.secondary?t.get(e.primary):yi(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let l=a.x-o.x,s=a.y-o.y,c=Math.hypot(l,s)||1,u=l/c,f=s/c,m=-f,h=u,b=O(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*b,y:a.y-f*b,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*b,y:a.y+f*b,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*b,y:o.y-f*b,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-m*.8660254)*b,y:a.y+(f*.5-h*.8660254)*b,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+m*.8660254)*b,y:a.y+(f*.5+h*.8660254)*b,anchorX:a.x,anchorY:a.y}}}function mi(e,t){let n=new Map,r=new Map;for(let c of e){let u=Xt(c,t);if(n.set(c.id,u),u){let f=r.get(u);f?f.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,o=new Map,a=new Map,l=c=>{let u=i.get(c);if(u)return u;let f=new Set,m=[],h=n.get(c)??null;for(;h&&!f.has(h);)m.push(h),f.add(h),h=n.get(h)??null;return i.set(c,m),m},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let f=n.get(c)??null,m=t.get(c),h=c;return m?.placement&&m.placement.mode!=="free"&&f&&(h=s(f)),h};for(let c of e){l(c.id);let u=s(c.id),f=be(u);o.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function Xt(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function hi(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(f,m)=>{a=Math.min(a,f),l=Math.min(l,m),s=Math.max(s,f),c=Math.max(c,m)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&qt(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Ht(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&Gt(f,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?we(0,0,0,0):we(a,l,s,c)}function gi(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=Xt(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function Kt(e,t,n){return Zt(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Zt(e,t,n,r,i,o,a,l){let s=xi(o,a,l),c=s*2,u=i==="above"?18:12,f=i==="above"?8:12,m=e-s,h=e+s;return r==="start"?(m=e,h=e+c):r==="end"&&(m=e-c,h=e),{left:m,right:h,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function bi(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function yi(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Re(e,t,n){let r=$i(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return O((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return O(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return O(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return O(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return O(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return O(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return O(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return O(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return O(8*i,n.minBodyRadius,n.maxBodyRadius)}}function wi(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function ze(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/he;case"m":return e.value/1e3/he;case"ly":return e.value*yr;case"pc":return e.value*wr;case"kpc":return e.value*vr;case"re":return e.value*hr/he;case"rj":return e.value*gr/he;case"sol":return e.value*br/he;default:return e.value}}function vi(e,t){let n=ze(e??null);return n===null||n<=0?0:O(n*96*t.freePlacementMultiplier,0,420)}function $i(e,t){let n=tt(e);if(!n)return null;let r;switch(n.unit){case"sol":r=O(n.value*22,14,40);break;case"re":r=O(n.value*10,6,18);break;case"km":r=O(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=O(n.value*4,4,20);break}return O(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function tt(e){return!e||typeof e!="object"||!("value"in e)?null:e}function nt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ve(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Vt(e,t,n,r,i,o,a){let l=Jt(e,t,n,r,i,o,a,Nt);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Bt(s.x)} ${Bt(s.y)}`).join(" ")}function Jt(e,t,n,r,i,o,a,l){let s=[];for(let c=0;c<=l;c+=1){let u=o+(a-o)*c/l;s.push(Qt(e,t,n,r,i,u))}return s}function Qt(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=en(a,l,i);return{x:e+s.x,y:t+s.y}}function en(e,t,n){let r=ot(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function $e(e,t,n,r){let i=n==="isometric"?_t*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Be(e,t,n){return t*1e3+e+n*.01}function O(e,t,n){return Math.min(Math.max(e,t),n)}function Rt(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function se(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function be(e){return`${se(e)}-group`}function Ii(e){return typeof e=="string"&&e.trim()?e:void 0}function xi(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function zt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function ot(e){return e*Math.PI/180}function Bt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function at(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:Li(e.system),info:Ti(e.system)}:null,r=e.objects.map(ki);return Oi(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(ji),objects:r}}function ki(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:Ai(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function ji(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Si)}}function Si(e){return{objectId:e.objectId,placement:tn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function tn(e){return e?structuredClone(e):null}function Oi(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let l=i.get(a);l&&(r.epoch&&(l.epoch=r.epoch),r.referencePlane&&(l.referencePlane=r.referencePlane))}for(let a of r.positions){let l=i.get(a.objectId);l&&(a.placement&&(l.placement=tn(a.placement)),a.inner&&(l.properties.inner={...a.inner}),a.outer&&(l.properties.outer={...a.outer}),a.epoch&&(l.epoch=a.epoch),a.referencePlane&&(l.referencePlane=a.referencePlane))}}function Ai(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function Li(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function Ti(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=Mi(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function Mi(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}var nn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Di=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Fi=/^[A-Za-z][A-Za-z0-9+.-]*:/;function le(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function xe(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function st(e,t,n){let r=e.match(nn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=P(n);if(o?.unitFamily&&!Te(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function lt(e){let t=e.match(nn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function _e(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function X(e,t,n){let r=Di.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function rn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Ci(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Fi);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function on(e,t,n){let r=P(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw d.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return X(Ie(t,e,n),e,n);case"number":return _e(Ie(t,e,n),e,n);case"unit":return st(Ie(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Ci(i,n),i}}}function ct(e,t,n){let r=P(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw d.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function Ie(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var sn=new Set(["star","planet","moon","asteroid","comet"]),Vi=332946.0487,Ri=1047.3486,Ne=1495978707e-1,zi=6371,Bi=695700,_i=63241.077,Ni=206264.806,Ui=206264806;function Ue(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),i=new Set(e.groups.map(l=>l.id)),o=new Set(e.events.map(l=>l.id));e.system||n.push(y("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let u=a.get(c);u?n.push(y("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)Wi(l,r,n);for(let l of e.system?.viewpoints??[])Yi(l,i,o,t,n,r);for(let l of e.objects)Hi(l,e.system,r,i,n);for(let l of e.events)qi(l,e.system,r,n);return n}function Wi(e,t,n){e.from?t.has(e.from)||n.push(y("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(y("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(y("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(y("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(y("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Yi(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"){if(a)for(let l of a.groupIds)t.has(l)||i.push(x("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let l of e.events??[])n.has(l)||i.push(x("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Zi(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Ji(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function Hi(e,t,n,r,i){let o=e.placement,a=o?.mode==="orbit"?o:null,l=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(x("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(x("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(x("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(y("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(y("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(x("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(x("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!dt(l?.properties.mass)&&i.push(x("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let s=n.get(o.target);s?sn.has(s.type)||i.push(y("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(y("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(y("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Xi(e,n,i)||i.push(y("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(x("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(y("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(x("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=an(e,l);if(c===null){i.push(x("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(ut("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${no(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(x("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=ln(a?.period),u=an(e,l);if(c===null||u===null)continue;let f=to(e,"period");Math.abs(c-u)>f&&i.push(y("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function qi(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(y("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(x("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(x("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(y("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(y("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let c of e.participantObjectIds){if(o.add(c),a.has(c)){r.push(x("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(y("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(x("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(x("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(x("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let l=new Set;for(let c of e.positions){let u=`${i}.pose.${c.objectId}`;if(l.has(c.objectId)){r.push(y("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,u));continue}l.add(c.objectId);let f=n.get(c.objectId);if(!f){r.push(y("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(x("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),Gi(c,f,e,t,n,r,u,e.id)}let s=[...o].filter(c=>!l.has(c));e.positions.length>0&&s.length>0&&r.push(x("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function Gi(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(y("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(s.mode==="orbit"){i.has(s.target)||o.push(y("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.orbit`)),s.distance&&s.semiMajor&&o.push(y("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!Qi(r,t,n,e)&&o.push(x("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!eo(r,t,n,e)&&o.push(x("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!dt(i.get(s.target)?.properties.mass)&&o.push(x("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(s.mode==="surface"){let c=i.get(s.target);c?sn.has(c.type)||o.push(y("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):o.push(y("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(y("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${a}.at`));let c=s.reference;c.kind==="named"&&!i.has(c.name)?o.push(y("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="anchor"&&!i.has(c.objectId)?o.push(y("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="lagrange"&&(i.has(c.primary)?c.secondary&&!i.has(c.secondary)&&o.push(y("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(y("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function Xi(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(y("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(y("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(y("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function an(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Ki(n.semiMajor??n.distance),i=dt(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Ki(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ne;case"m":return e.value/(Ne*1e3);case"ly":return e.value*_i;case"pc":return e.value*Ni;case"kpc":return e.value*Ui;case"re":return e.value*zi/Ne;case"sol":return e.value*Bi/Ne;default:return null}}function dt(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Vi;case"mj":return t.value/Ri;default:return null}}function ln(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Zi(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(y("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Ji(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[f,m]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])m!==null&&(!Number.isFinite(m)||f==="distance"&&m<=0)&&r.push(y("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(m)}" in viewpoint "${i}".`,void 0,`${c}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(x("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${c}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(x("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,c)),t==="isometric"&&e.elevation!==null&&r.push(ut("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(x("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${c}.azimuth`)),o!==null&&s.has(o)||a!==null&&s.has(a)||l||r.push(ut("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function Qi(e,t,n,r){return K(r?.epoch)??K(n?.epoch)??K(t.epoch)??K(e?.epoch)??null}function eo(e,t,n,r){return K(r?.referencePlane)??K(n?.referencePlane)??K(t.referencePlane)??K(e?.referencePlane)??null}function K(e){return typeof e=="string"&&e.trim()?e.trim():null}function to(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?ln(n)??0:0}function no(e){return`${Math.round(e*100)/100}d`}function y(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function x(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function ut(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var ro=new Set(["climate","habitability","settlement"]),Ye=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=P(e);t&&Ye.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Ye.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var io=new Set(Ye.keys()),un=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function ft(e){return oo(e)}function oo(e,t){let n=Ho(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],f=[],m=[],h=new Map,b=!1,I=!1,k=new Set,j=new Set,p=new Set,$=new Set,E=new Set;for(let L=0;L<r.length;L++){let _=r[L],N=L+1;if(!_.trim())continue;let U=Me(_),M=de(_.slice(U),{line:N,columnOffset:U});if(M.length!==0){if(!o){a=ao(M,N),o=!0,n.comments.length>0&&He(a,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(U===0){s=so(M,N,a,i,l,c,u,f,m,h,k,j,p,$,E,{sawDefaults:b,sawAtlas:I}),s.kind==="system"?l=s.system:s.kind==="defaults"?b=!0:s.kind==="atlas"&&(I=!0);continue}if(!s)throw new d("Indented line without parent atlas section",N,U+1);go(s,U,M,N)}}if(!o)throw new d('Missing required atlas schema header "schema 2.0"');let B=c.map(L=>Fo(L,a,i)),D=m.map(L=>Co(L,h.get(L.id)??[])),Y=t??(a==="2.0-draft"?"2.0":a),H={format:"worldorbit",sourceVersion:"1.0",system:l,groups:u,relations:f,events:D,objects:B,diagnostics:i};if(Y==="2.0-draft"){let L={...H,version:"2.0-draft",schemaVersion:"2.0-draft"};return L.diagnostics.push(...Ue(L,a)),L}let Q={...H,version:Y,schemaVersion:Y};return a==="2.0-draft"&&Q.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),Q.diagnostics.push(...Ue(Q,a)),Q}function ao(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function so(e,t,n,r,i,o,a,l,s,c,u,f,m,h,b,I){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return lo(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(I.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(I.sawAtlas)throw new d('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return co(e,t,i,u,n,r);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return uo(e,t,i,f);case"group":return V(n,r,"group",{line:t,column:e[0].column}),fo(e,t,a,m);case"relation":return V(n,r,"relation",{line:t,column:e[0].column}),po(e,t,l,h);case"event":return V(n,r,"event",{line:t,column:e[0].column}),mo(e,t,s,c,b,n,r);case"object":return ho(e,t,n,r,o);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function lo(e,t,n,r){if(e.length!==2)throw new d("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function co(e,t,n,r,i,o){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let a=le(e[1].value);if(!a)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new d(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:xe(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function uo(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:xe(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function fo(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new d("Group id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:xe(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function po(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new d("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function mo(e,t,n,r,i,o,a){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let l=le(e[1].value);if(!l)throw new d("Event id must not be empty",t,e[1].column);if(i.has(l))throw new d(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:xe(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),i.add(l),{kind:"event",event:s,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function ho(e,t,n,r,i){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],l=o.value;if(!Le.has(l)||l==="system")throw new d(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:Eo(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function go(e,t,n,r){switch(e.kind){case"system":bo(e,n,r);return;case"defaults":yo(e,n,r);return;case"atlas":wo(e,t,n,r);return;case"viewpoint":vo(e,t,n,r);return;case"annotation":xo(e,n,r);return;case"group":ko(e,n,r);return;case"relation":jo(e,n,r);return;case"event":So(e,t,n,r);return;case"object":Ao(e,t,n,r);return}}function bo(e,t,n){let r=W(t,e.seenFields,n),i=v(t,n);switch(r){case"title":e.system.title=i;return;case"description":V(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":V(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":V(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function yo(e,t,n){let r=W(t,e.seenFields,n),i=v(t,n);switch(r){case"view":fn(i)&&ne(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=dn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=pn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function wo(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=mn(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new d(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function vo(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){$o(e,n,r);return}if(e.inFilter){Io(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(ne(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new d('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??mt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=W(n,e.seenFields,r),o=v(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":fn(o)&&ne(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=dn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=pn(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=pt(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=J(o,r,n[0].column,"rotation");return;case"camera":ne(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Po(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=To(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":V(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=z(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function $o(e,t,n){let r=W(t,e.seenCameraFields,n),i=v(t,n),o=e.viewpoint.camera??mt();switch(r){case"azimuth":o.azimuth=J(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=J(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=J(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=pt(i,n,t[0].column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function Io(e,t,n){let r=W(t,e.seenFilterFields,n),i=e.viewpoint.filter??Mo();switch(r){case"query":i.query=v(t,n);break;case"objecttypes":i.objectTypes=Lo(t.slice(1),n);break;case"tags":i.tags=z(t.slice(1),n,"tags");break;case"groups":i.groupIds=z(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function xo(e,t,n){switch(W(t,e.seenFields,n)){case"label":e.annotation.label=v(t,n);return;case"target":e.annotation.targetObjectId=v(t,n);return;case"body":e.annotation.body=v(t,n);return;case"tags":e.annotation.tags=z(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function ko(e,t,n){switch(W(t,e.seenFields,n)){case"label":e.group.label=v(t,n);return;case"summary":e.group.summary=v(t,n);return;case"color":e.group.color=v(t,n);return;case"tags":e.group.tags=z(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=X(v(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function jo(e,t,n){switch(W(t,e.seenFields,n)){case"from":e.relation.from=v(t,n);return;case"to":e.relation.to=v(t,n);return;case"kind":e.relation.kind=v(t,n);return;case"label":e.relation.label=v(t,n);return;case"summary":e.relation.summary=v(t,n);return;case"tags":e.relation.tags=z(t.slice(1),n,"tags");return;case"color":e.relation.color=v(t,n);return;case"hidden":e.relation.hidden=X(v(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function So(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&ne(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(Oo(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new d(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new d("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new d('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(W(n,e.seenFields,r)){case"kind":e.event.kind=v(n,r);return;case"label":e.event.label=v(n,r);return;case"summary":e.event.summary=v(n,r);return;case"target":e.event.targetObjectId=v(n,r);return;case"participants":e.event.participantObjectIds=z(n.slice(1),r,"participants");return;case"timing":e.event.timing=v(n,r);return;case"visibility":e.event.visibility=v(n,r);return;case"epoch":ne(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=v(n,r);return;case"referenceplane":ne(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=v(n,r);return;case"tags":e.event.tags=z(n.slice(1),r,"tags");return;case"color":e.event.color=v(n,r);return;case"hidden":e.event.hidden=X(v(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Oo(e,t,n){if(e.length<2)throw new d("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!un.has(r))throw new d(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new d(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function Ao(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||ro.has(i)){i!=="info"&&V(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=mn(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new d(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new d(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(Do(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function W(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function v(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function Lo(e,t){return z(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function To(e,t,n,r){let i={};for(let o of z(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),l=o.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&V(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function z(e,t,n){if(e.length===0)throw new d(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new d(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function dn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new d(`Unknown projection "${e}"`,t,n);return r}function fn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function pn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function pt(e,t,n,r){let i=J(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function J(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function Mo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function mt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Po(e,t,n){if(e.length===0||e.length%2!==0)throw new d('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:mt(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],l=e[o+1],s=a.value.toLowerCase();if(i.has(s))throw new d(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(s);let c=l.value;switch(s){case"azimuth":r.azimuth=J(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=J(c,t,a.column,"camera.elevation");break;case"roll":r.roll=J(c,t,a.column,"camera.roll");break;case"distance":r.distance=pt(c,t,a.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function Eo(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=ke(l.value);if(!s)throw new d(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&V(r,i,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[a];if(!f)break;c.push(f),a++}else for(;a<e.length&&!io.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new d(`Missing value for field "${l.value}"`,t,l.column);o.push({type:"field",key:l.value,values:c.map(u=>u.value),location:{line:t,column:l.column}})}return yn(o,n),o}function Do(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let o=ke(e[0].value);if(!o)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&V(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return yn([a],n),a}function mn(e,t,n){if(e.length<2)throw new d(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function Fo(e,t,n){let r=hn(e.fields),i=gn(r),o=Ro(e.objectType,r),a=Wo(r.get("groups")?.[0]),l=We(r.get("epoch")?.[0]),s=We(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?X(R(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?_o(r.get("resonance")[0]):void 0,f=Bo(r),m=r.get("derive")?.map($=>No($)),h=r.get("validate")?.map($=>({rule:R($)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap($=>$.values))]:void 0,I=r.get("tolerance")?.map($=>Uo($)),k=zo(e.typedBlockEntries),j=bn(e.infoEntries,"info"),p={type:e.objectType,id:e.id,properties:o,placement:i,info:j};return a.length>0&&(p.groups=a),l&&(p.epoch=l),s&&(p.referencePlane=s),c!==void 0&&(p.tidalLock=c),u&&(p.resonance=u),f&&(p.renderHints=f),m?.length&&(p.deriveRules=m),h?.length&&(p.validationRules=h),b?.length&&(p.lockedFields=b),I?.length&&(p.tolerances=I),k&&Object.keys(k).length>0&&(p.typedBlocks=k),He(t,"2.1")&&(p.groups||p.epoch||p.referencePlane||p.tidalLock!==void 0||p.resonance||p.renderHints||p.deriveRules?.length||p.validationRules?.length||p.lockedFields?.length||p.tolerances?.length||p.typedBlocks)&&V(t,n,e.id,e.location),p}function Co(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Vo(n))}}function Vo(e){let t=hn(e.fields,"event-pose"),n=gn(t);return{objectId:e.objectId,placement:n,inner:Z(t.get("inner")?.[0],"inner"),outer:Z(t.get("outer")?.[0],"outer"),epoch:We(t.get("epoch")?.[0]),referencePlane:We(t.get("referencePlane")?.[0])}}function hn(e,t="object"){let n=new Map;for(let r of e){let i=ke(r.key);if(!i&&!un.has(r.key))throw d.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw d.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function gn(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let a=t??n??r??i;throw d.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:R(t),distance:Z(e.get("distance")?.[0],"distance"),semiMajor:Z(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Yo(e.get("eccentricity")?.[0],"eccentricity"),period:Z(e.get("period")?.[0],"period"),angle:Z(e.get("angle")?.[0],"angle"),inclination:Z(e.get("inclination")?.[0],"inclination"),phase:Z(e.get("phase")?.[0],"phase")};if(n){let a=R(n);return{mode:"at",target:a,reference:rn(a,n.location)}}if(r)return{mode:"surface",target:R(r)};if(i){let a=R(i),l=lt(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function Ro(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=ke(r);!o||!a?.legacySchema||a.legacySchema.placement||(ct(r,e,o.location),n[r]=on(r,o.values,o.location))}return n}function bn(e,t){let n={};for(let r of e){if(r.key in n)throw d.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function zo(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=bn(r,n))}return t}function Bo(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=X(R(n),"renderLabel",n.location)),r&&(t.renderOrbit=X(R(r),"renderOrbit",r.location)),i&&(t.renderPriority=_e(R(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function _o(e){if(e.values.length!==2)throw d.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw d.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function No(e){if(e.values.length!==2)throw d.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Uo(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=lt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Wo(e){return e?[...new Set(e.values)]:[]}function We(e){return e&&e.values.join(" ").trim()||null}function Z(e,t){return e?st(R(e),e.location,t):void 0}function Yo(e,t){return e?_e(R(e),t,e.location):void 0}function R(e){return Ie(e.values,e.key,e.location)}function ke(e){return Ye.get(e)}function yn(e,t){for(let n of e){let r=ke(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){ct(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function V(e,t,n,r){He(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function ne(e,t,n,r){He(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function He(e,t){return cn(e)<cn(t)}function cn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function Ho(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],u=t[s+1];if(i){if(c==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,o=null,s++,l+=2;continue}c!==`
2
2
  `&&c!=="\r"&&(t[s]=" "),c===`
3
- `?(a++,l=1):l++;continue}if(!r&&c==="/"&&d==="*"){n.push({kind:"block",line:a,column:l}),t[s]=" ",t[s+1]=" ",o=!0,i={line:a,column:l},s++,l+=2;continue}if(!r&&c==="#"&&!Oi(t,s)){n.push({kind:"line",line:a,column:l}),t[s]=" ";let f=s+1;for(;f<t.length&&t[f]!==`
3
+ `?(a++,l=1):l++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:a,column:l}),t[s]=" ",t[s+1]=" ",i=!0,o={line:a,column:l},s++,l+=2;continue}if(!r&&c==="#"&&!qo(t,s)){n.push({kind:"line",line:a,column:l}),t[s]=" ";let f=s+1;for(;f<t.length&&t[f]!==`
4
4
  `&&t[f]!=="\r";)t[f]=" ",f++;l+=f-s,s=f-1;continue}c==='"'&&t[s-1]!=="\\"&&(r=!r),c===`
5
- `?(a++,l=1):l++}if(o)throw u.fromLocation("Unclosed block comment",i??void 0);return{source:t.join(""),comments:n}}function Oi(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let o=e[n];return o===void 0||o===" "||o===" "||o==="\r"||o===`
6
- `}var Ai=/^schema\s+2(?:\.0|\.1)?$/i,Li=/^schema\s+2\.1$/i,Ti=/^schema\s+2\.0-draft$/i;function tn(e){for(let t of Mi(e).split(/\r?\n/)){let n=t.trim();if(n)return Ti.test(n)?"2.0-draft":Li.test(n)?"2.1":Ai.test(n)?"2.0":"1.0"}return"1.0"}function Mi(e){let t=[...e],n=!1,r=!1;for(let o=0;o<t.length;o++){let i=t[o],a=t[o+1];if(r){if(i==="*"&&a==="/"){t[o]=" ",t[o+1]=" ",r=!1,o++;continue}i!==`
7
- `&&i!=="\r"&&(t[o]=" ");continue}if(!n&&i==="/"&&a==="*"){t[o]=" ",t[o+1]=" ",r=!0,o++;continue}if(!n&&i==="#"){t[o]=" ";let l=o+1;for(;l<t.length&&t[l]!==`
8
- `&&t[l]!=="\r";)t[l]=" ",l++;o=l-1;continue}i==='"'&&t[o-1]!=="\\"&&(n=!n)}return t.join("")}function ee(e){let t=nn(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new u(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function nn(e){let t=tn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return Ei(e,t);let n;try{n=ce(e)}catch(o){return{ok:!1,value:null,diagnostics:[Q(o,"parse")]}}let r;try{r=ue(n)}catch(o){return{ok:!1,value:null,diagnostics:[Q(o,"normalize")]}}try{de(r)}catch(o){return{ok:!1,value:null,diagnostics:[Q(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ei(e,t){let n;try{n=Je(e)}catch(a){return{ok:!1,value:null,diagnostics:[Q(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let o;try{o=Ge(n)}catch(a){return{ok:!1,value:null,diagnostics:[Q(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:o,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Pi={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Re={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function Qe(e){return e?typeof e=="string"?Re[e]??Re.atlas:{...Re.atlas,...e}:Re.atlas}function et(e){return{...Pi,...e}}function Be(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:tt(e.objectTypes??[]),tags:tt((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:tt((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Vi(t)?t:null}function Vi(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function nt(e,t){let n=Be(t),r=new Set;for(let o of e.objects)if(!o.hidden&&Ci(o,n)&&(r.add(o.objectId),n?.includeAncestors!==!1))for(let i of o.ancestorIds)r.add(i);return n?r:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function Ci(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(o=>e.semanticGroupIds.includes(o)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=Ri(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>n.includes(o)))return!1}return!0}function Ri(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(o=>Array.isArray(o)?o:typeof o=="object"&&o&&"value"in o?[String(o.value),String(o.unit??"")]:[String(o)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function tt(e){return[...new Set(e)]}var rt="worldorbit-camera-root";function te(e,t={}){let n=Qe(t.theme),r=ea(t.preset??e.renderPreset??void 0),o=et({...r.layers,...t.layers}),i=t.subtitle??e.subtitle,a=nt(e,t.filter??null),l=e.objects.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>o.structures||!_e(p.object)).sort((p,I)=>p.sortKey-I.sortKey),s=e.labels.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>o.structures||!_e(p.object)),c=zi(l),d=o.orbits?_i(e,a,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>o.structures||!_e(p.object)).map(p=>`<line class="wo-leader wo-leader-${p.mode}" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-group-id="${L(p.groupId??"")}" />`).join(""):"",m=o.relations?e.relations.filter(p=>!p.hidden).filter(p=>a.has(p.fromObjectId)&&a.has(p.toObjectId)).map(p=>`<line class="wo-relation" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-relation-id="${L(p.relationId)}" />`).join(""):"",h=o.events?e.events.filter(p=>!p.hidden).map(p=>Bi(e,p,a,n)).join(""):"",b=o.objects?l.map(p=>Ni(p,t.selectedObjectId??null,n)).join(""):"",v=o.labels?s.map(p=>Ui(e,p,t.selectedObjectId??null)).join(""):"",x=o.metadata?`<text class="wo-title" x="56" y="64">${O(e.title)}</text>
9
- <text class="wo-subtitle" x="56" y="88">${O(i)}</text>
10
- <text class="wo-meta" x="56" y="${e.height-42}">${O(na(e))}</text>`:"",k=o.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
5
+ `?(a++,l=1):l++}if(i)throw d.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function qo(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
6
+ `}var Go=/^schema\s+2(?:\.0|\.1|\.5)?$/i,Xo=/^schema\s+2\.1$/i,Ko=/^schema\s+2\.5$/i,Zo=/^schema\s+2\.0-draft$/i;function wn(e){for(let t of Jo(e).split(/\r?\n/)){let n=t.trim();if(n)return Zo.test(n)?"2.0-draft":Xo.test(n)?"2.1":Ko.test(n)?"2.5":Go.test(n)?"2.0":"1.0"}return"1.0"}function Jo(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],a=t[i+1];if(r){if(o==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
7
+ `&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let l=i+1;for(;l<t.length&&t[l]!==`
8
+ `&&t[l]!=="\r";)t[l]=" ",l++;i=l-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function re(e){let t=vn(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function vn(e){let t=wn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return Qo(e,t);let n;try{n=fe(e)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"parse")]}}let r;try{r=pe(n)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"normalize")]}}try{me(r)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Qo(e,t){let n;try{n=ft(e)}catch(a){return{ok:!1,value:null,diagnostics:[te(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=at(n)}catch(a){return{ok:!1,value:null,diagnostics:[te(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var na={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},qe={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function ht(e){return e?typeof e=="string"?qe[e]??qe.atlas:{...qe.atlas,...e}:qe.atlas}function gt(e){return{...na,...e}}function Ge(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:bt(e.objectTypes??[]),tags:bt((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:bt((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return ra(t)?t:null}function ra(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function yt(e,t){let n=Ge(t),r=new Set;for(let i of e.objects)if(!i.hidden&&ia(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function ia(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=oa(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function oa(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function bt(e){return[...new Set(e)]}var wt="worldorbit-camera-root";function ie(e,t={}){let n=ht(t.theme),r=$a(t.preset??e.renderPreset??void 0),i=gt({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,a=yt(e,t.filter??null),l=e.objects.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!Xe(p.object)).sort((p,$)=>p.sortKey-$.sortKey),s=e.labels.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!Xe(p.object)),c=la(l),u=i.orbits?sa(e,a,i.structures):{back:"",front:""},f=i.guides?e.leaders.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!Xe(p.object)).map(p=>`<line class="wo-leader wo-leader-${p.mode}" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${A(p.renderId)}" data-group-id="${T(p.groupId??"")}" />`).join(""):"",m=i.relations?e.relations.filter(p=>!p.hidden).filter(p=>a.has(p.fromObjectId)&&a.has(p.toObjectId)).map(p=>`<line class="wo-relation" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${A(p.renderId)}" data-relation-id="${T(p.relationId)}" />`).join(""):"",h=i.events?e.events.filter(p=>!p.hidden).map(p=>aa(e,p,a,n)).join(""):"",b=i.objects?l.map(p=>ca(p,t.selectedObjectId??null,n)).join(""):"",I=i.labels?s.map(p=>ua(e,p,t.selectedObjectId??null)).join(""):"",k=i.metadata?`<text class="wo-title" x="56" y="64">${A(e.title)}</text>
9
+ <text class="wo-subtitle" x="56" y="88">${A(o)}</text>
10
+ <text class="wo-meta" x="56" y="${e.height-42}">${A(xa(e))}</text>`:"",j=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
11
11
  <rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
12
- ${o.guides?ta(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
13
- <title id="worldorbit-title">${O(e.title)}</title>
14
- <desc id="worldorbit-desc">A ${O(e.viewMode)} WorldOrbit render with ${l.length} visible objects.</desc>
12
+ ${i.guides?Ia(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
13
+ <title id="worldorbit-title">${A(e.title)}</title>
14
+ <desc id="worldorbit-desc">A ${A(e.viewMode)} WorldOrbit render with ${l.length} visible objects.</desc>
15
15
  <defs>
16
16
  <linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
17
17
  <stop offset="0%" stop-color="${n.backgroundStart}" />
@@ -65,39 +65,39 @@
65
65
  .wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
66
66
  .wo-object-image { pointer-events: none; }
67
67
  </style>
68
+ ${j}
68
69
  ${k}
69
- ${x}
70
70
  <g data-worldorbit-world="true">
71
- <g data-worldorbit-camera-root="${rt}" id="${rt}">
71
+ <g data-worldorbit-camera-root="${wt}" id="${wt}">
72
72
  <g data-worldorbit-world-content="true">
73
- ${o.orbits?`<g data-layer-id="orbits-back">${d.back}</g>`:""}
74
- ${o.guides?`<g data-layer-id="guides">${f}</g>`:""}
75
- ${o.relations?`<g data-layer-id="relations">${m}</g>`:""}
76
- ${o.events?`<g data-layer-id="events">${h}</g>`:""}
77
- ${o.objects?`<g data-layer-id="objects">${b}</g>`:""}
78
- ${o.orbits?`<g data-layer-id="orbits-front">${d.front}</g>`:""}
79
- ${o.labels?`<g data-layer-id="labels">${v}</g>`:""}
73
+ ${i.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
74
+ ${i.guides?`<g data-layer-id="guides">${f}</g>`:""}
75
+ ${i.relations?`<g data-layer-id="relations">${m}</g>`:""}
76
+ ${i.events?`<g data-layer-id="events">${h}</g>`:""}
77
+ ${i.objects?`<g data-layer-id="objects">${b}</g>`:""}
78
+ ${i.orbits?`<g data-layer-id="orbits-front">${u.front}</g>`:""}
79
+ ${i.labels?`<g data-layer-id="labels">${I}</g>`:""}
80
80
  </g>
81
81
  </g>
82
82
  </g>
83
- </svg>`}function Bi(e,t,n,r){let o=t.objectIds.filter(s=>n.has(s)).map(s=>e.objects.find(c=>c.objectId===s&&!c.hidden)).filter(Boolean);if(o.length===0)return"";let i=t.event.color||r.accent,a=t.event.label||t.event.id,l=o.map(s=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${s.x}" y2="${s.y}" stroke="${L(i)}" data-event-id="${L(t.eventId)}" data-object-id="${L(s.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${O(t.renderId)}" data-event-id="${L(t.eventId)}">
83
+ </svg>`}function aa(e,t,n,r){let i=t.objectIds.filter(s=>n.has(s)).map(s=>e.objects.find(c=>c.objectId===s&&!c.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||r.accent,a=t.event.label||t.event.id,l=i.map(s=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${s.x}" y2="${s.y}" stroke="${T(o)}" data-event-id="${T(t.eventId)}" data-object-id="${T(s.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${A(t.renderId)}" data-event-id="${T(t.eventId)}">
84
84
  ${l}
85
- <circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${L(i)}" />
86
- <text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${O(a)}</text>
87
- </g>`}function _i(e,t,n){let r=[],o=[];for(let i of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!_e(a.object)))){let a=i.bandThickness??(i.band?10:1.5),l=i.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${O(i.renderId)}" data-orbit-object-id="${L(i.objectId)}" data-parent-id="${L(i.parentId)}" data-group-id="${L(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&r.push(`<path class="${l} wo-orbit-back" d="${i.backArcPath}" stroke-width="${a}" ${s} />`),i.frontArcPath&&o.push(`<path class="${l} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${a}" ${s} />`);continue}if(i.kind==="ellipse"){let c=i.rx??i.radius??0,d=i.ry??i.radius??0;o.push(`<ellipse class="${l} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" rx="${c}" ry="${d}" transform="rotate(${i.rotationDeg} ${i.cx} ${i.cy})" stroke-width="${a}" ${s} />`);continue}o.push(`<circle class="${l} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${a}" ${s} />`)}return{back:r.join(""),front:o.join("")}}function zi(e){return e.filter(t=>!!t.imageHref).map(t=>Hi(t)).join("")}function Ni(e,t,n){let{object:r,x:o,y:i,radius:a,visualRadius:l}=e,s=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",d=Gi(e,n),f=Yi(e),m=f?on(r,o,i,a,d,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${s}" data-object-id="${O(e.objectId)}" data-parent-id="${L(e.parentId??"")}" data-group-id="${L(e.groupId??"")}" data-render-id="${O(e.renderId)}" tabindex="0" role="button" aria-label="${O(`${r.type} ${e.objectId}`)}">
88
- <circle class="wo-selection-ring" cx="${o}" cy="${i}" r="${l+8}" />
89
- ${Wi(e,d)}
90
- ${on(r,o,i,a,d)}
85
+ <circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${T(o)}" />
86
+ <text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${A(a)}</text>
87
+ </g>`}function sa(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!Xe(a.object)))){let a=o.bandThickness??(o.band?10:1.5),l=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${A(o.renderId)}" data-orbit-object-id="${T(o.objectId)}" data-parent-id="${T(o.parentId)}" data-group-id="${T(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${l} wo-orbit-back" d="${o.backArcPath}" stroke-width="${a}" ${s} />`),o.frontArcPath&&i.push(`<path class="${l} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${a}" ${s} />`);continue}if(o.kind==="ellipse"){let c=o.rx??o.radius??0,u=o.ry??o.radius??0;i.push(`<ellipse class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${c}" ry="${u}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${a}" ${s} />`);continue}i.push(`<circle class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${a}" ${s} />`)}return{back:r.join(""),front:i.join("")}}function la(e){return e.filter(t=>!!t.imageHref).map(t=>pa(t)).join("")}function ca(e,t,n){let{object:r,x:i,y:o,radius:a,visualRadius:l}=e,s=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=ha(e,n),f=fa(e),m=f?In(r,i,o,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${s}" data-object-id="${A(e.objectId)}" data-parent-id="${T(e.parentId??"")}" data-group-id="${T(e.groupId??"")}" data-render-id="${A(e.renderId)}" tabindex="0" role="button" aria-label="${A(`${r.type} ${e.objectId}`)}">
88
+ <circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${l+8}" />
89
+ ${da(e,u)}
90
+ ${In(r,i,o,a,u)}
91
91
  ${f}
92
92
  ${m}
93
- </g>`}function Ui(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",o=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${O(t.objectId)}" data-group-id="${L(t.groupId??"")}" data-render-id="${O(t.renderId)}">
94
- <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${O(t.label)}</text>
95
- <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${O(t.secondaryLabel)}</text>
96
- </g>`}function on(e,t,n,r,o,i={}){let a=i.outlineOnly?"transparent":o.fill,l=o.tail??o.fill;switch(e.type){case"star":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${o.glow??"url(#wo-star-glow)"}" opacity="0.84" />
97
- <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="${i.outlineOnly?1.5:1.4}" />`;case"comet":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${l}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
98
- <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${cn(t,n,r)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":{let s=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return i.outlineOnly?s==="black-hole"||s==="nebula"||s==="galaxy"||s==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<polygon points="${ot(t,n,r)}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:s==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${o.accentRing??o.stroke}" stroke-width="3.5" />
99
- <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`:s==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${o.halo??"none"}" stroke="none" />
100
- <ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${o.stroke}" stroke-width="1.2" />
101
- <circle cx="${t}" cy="${n}" r="${r*.28}" fill="${o.core??"#fff"}" stroke="none" />`:s==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />
102
- <circle cx="${t}" cy="${n}" r="${r*.25}" fill="${o.core??"#fff"}" stroke="none" />`:s==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${o.halo??"none"}" stroke="none" />
103
- <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${ot(t,n,r)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`}}}function Wi(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:o,radius:i}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${o}" r="${i+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Yi(e){if(!e.imageHref)return"";let t=qi(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${L(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${L(ln(e))})" />`}function Hi(e){let{x:t,y:n,radius:r}=e,o="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":o=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":o=`<polygon points="${cn(t,n,r)}" />`;break;case"phenomenon":o=`<polygon points="${ot(t,n,r)}" />`;break;default:return""}return`<clipPath id="${L(ln(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function qi(e){let{object:t,x:n,y:r,radius:o}=e;switch(t.type){case"structure":return{x:n-o,y:r-o,width:o*2,height:o*2};case"phenomenon":return{x:n-o*1.2,y:r-o*1.2,width:o*2.4,height:o*2.4};default:return{x:n-o,y:r-o,width:o*2,height:o*2}}}function Gi(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Xi(e.object.type,n,t),o=e.fillColor&&oa(e.fillColor)?e.fillColor:r.fill,i=an(e.object.properties.albedo),a=an(e.object.properties.temperature),l=Zi(o,a,i,e.object.type),s=$e(l,"#ffffff",.4)??r.stroke,c=Qi(e.object.properties.atmosphere),d=e.object.type==="star"?sn($e(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:d,atmosphere:c,tail:e.object.type==="comet"?sn($e(l,"#ffffff",.5)??l,.72):void 0}}function Xi(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return Ki(t)}}function Ki(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function Zi(e,t,n,r){let o=e;if(t!==null){let i=Ji(t,r);o=$e(o,i,r==="star"?.42:.2)??o}if(n!==null){let i=Math.min(Math.max(n,0),1);o=$e(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function Ji(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Qi(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function ea(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function an(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function ln(e){return`${e.renderId}-clip`}function cn(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function ot(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function ta(e,t){let n=Array.from({length:10},(o,i)=>{let a=90+i*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(o,i)=>{let a=150+i*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function na(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function _e(e){return e.type==="structure"||e.type==="phenomenon"}function $e(e,t,n){let r=it(e),o=it(t);if(!r||!o)return;let i=Math.min(Math.max(n,0),1);return ra({r:Math.round(r.r+(o.r-r.r)*i),g:Math.round(r.g+(o.g-r.g)*i),b:Math.round(r.b+(o.b-r.b)*i)})}function sn(e,t){let n=it(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function it(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function ra(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function oa(e){return!!e.trim()}function O(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function L(e){return O(e)}function un(e){return encodeURIComponent(JSON.stringify(e))}function st(e,t,n={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function lt(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=te(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${ze(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${ze(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${ze(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${ze(un(n))}">${r}</div>`}function ze(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function ae(e,t={}){try{let n=ee(e),r=H(n.document,$a(n,t));return(t.mode??"static")==="interactive"?lt(st(r,"interactive",{initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}):`<figure class="${va(t.className??"worldorbit-block worldorbit-static")}">${te(r,t)}</figure>`}catch(n){if(t.strict)throw n;return ct(n instanceof Error?n.message:String(n))}}function ct(e){return`<pre class="worldorbit-error">WorldOrbit error: ${dn(e)}</pre>`}function dn(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function va(e){return dn(e).replaceAll('"',"&quot;")}function $a(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function fn(e={}){return function(n){pn(n,(r,o,i)=>{!i||o===-1||r.type!=="code"||!Ia(r.lang)||(i.children[o]={type:"html",value:ae(r.value??"",e)})})}}function pn(e,t,n=null){let r=e.children??[];for(let o=0;o<r.length;o+=1){let i=r[o];t(i,o,e),pn(i,t,e)}n||t(e,-1,null)}function Ia(e){return(e??"").trim().toLowerCase()==="worldorbit"}function mn(e={}){return function(n){hn(n,(r,o,i)=>{if(!i||o===-1||r.type!=="element"||r.tagName!=="pre")return;let a=r.children?.[0];if(!a||a.type!=="element"||a.tagName!=="code"||!xa(a.properties?.className).includes("language-worldorbit"))return;let s=gn(a);i.children[o]={type:"raw",value:ae(s,e)}})}}function hn(e,t,n=null){let r=e.children??[];for(let o=0;o<r.length;o+=1){let i=r[o];t(i,o,e),hn(i,t,e)}n||t(e,-1,null)}function xa(e){return Array.isArray(e)?e.map(t=>String(t)):typeof e=="string"?e.split(/\s+/).filter(Boolean):[]}function gn(e){return e.type==="text"?e.value??"":(e.children??[]).map(t=>gn(t)).join("")}return On(ka);})();
93
+ </g>`}function ua(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${A(t.objectId)}" data-group-id="${T(t.groupId??"")}" data-render-id="${A(t.renderId)}">
94
+ <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${A(t.label)}</text>
95
+ <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${A(t.secondaryLabel)}</text>
96
+ </g>`}function In(e,t,n,r,i,o={}){let a=o.outlineOnly?"transparent":i.fill,l=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
97
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${l}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
98
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Sn(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let s=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?s==="black-hole"||s==="nebula"||s==="galaxy"||s==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${vt(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:s==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
99
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`:s==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
100
+ <ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${i.stroke}" stroke-width="1.2" />
101
+ <circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:s==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />
102
+ <circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:s==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
103
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${vt(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function da(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function fa(e){if(!e.imageHref)return"";let t=ma(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${T(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${T(jn(e))})" />`}function pa(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Sn(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${vt(t,n,r)}" />`;break;default:return""}return`<clipPath id="${T(jn(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function ma(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function ha(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=ga(e.object.type,n,t),i=e.fillColor&&ja(e.fillColor)?e.fillColor:r.fill,o=xn(e.object.properties.albedo),a=xn(e.object.properties.temperature),l=ya(i,a,o,e.object.type),s=je(l,"#ffffff",.4)??r.stroke,c=va(e.object.properties.atmosphere),u=e.object.type==="star"?kn(je(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:u,atmosphere:c,tail:e.object.type==="comet"?kn(je(l,"#ffffff",.5)??l,.72):void 0}}function ga(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return ba(t)}}function ba(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function ya(e,t,n,r){let i=e;if(t!==null){let o=wa(t,r);i=je(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=je(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function wa(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function va(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function $a(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function xn(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function jn(e){return`${e.renderId}-clip`}function Sn(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function vt(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function Ia(e,t){let n=Array.from({length:10},(i,o)=>{let a=90+o*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let a=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function xa(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Xe(e){return e.type==="structure"||e.type==="phenomenon"}function je(e,t,n){let r=$t(e),i=$t(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return ka({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function kn(e,t){let n=$t(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function $t(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function ka(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function ja(e){return!!e.trim()}function A(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function T(e){return A(e)}function On(e){return encodeURIComponent(JSON.stringify(e))}function xt(e,t,n={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function kt(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=ie(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${Ke(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${Ke(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${Ke(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${Ke(On(n))}">${r}</div>`}function Ke(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function ce(e,t={}){try{let n=re(e),r=G(n.document,Na(n,t));return(t.mode??"static")==="interactive"?kt(xt(r,"interactive",{initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}):`<figure class="${_a(t.className??"worldorbit-block worldorbit-static")}">${ie(r,t)}</figure>`}catch(n){if(t.strict)throw n;return jt(n instanceof Error?n.message:String(n))}}function jt(e){return`<pre class="worldorbit-error">WorldOrbit error: ${An(e)}</pre>`}function An(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function _a(e){return An(e).replaceAll('"',"&quot;")}function Na(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function Ln(e={}){return function(n){Tn(n,(r,i,o)=>{!o||i===-1||r.type!=="code"||!Ua(r.lang)||(o.children[i]={type:"html",value:ce(r.value??"",e)})})}}function Tn(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),Tn(o,t,e)}n||t(e,-1,null)}function Ua(e){return(e??"").trim().toLowerCase()==="worldorbit"}function Mn(e={}){return function(n){Pn(n,(r,i,o)=>{if(!o||i===-1||r.type!=="element"||r.tagName!=="pre")return;let a=r.children?.[0];if(!a||a.type!=="element"||a.tagName!=="code"||!Wa(a.properties?.className).includes("language-worldorbit"))return;let s=En(a);o.children[i]={type:"raw",value:ce(s,e)}})}}function Pn(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),Pn(o,t,e)}n||t(e,-1,null)}function Wa(e){return Array.isArray(e)?e.map(t=>String(t)):typeof e=="string"?e.split(/\s+/).filter(Boolean):[]}function En(e){return e.type==="text"?e.value??"":(e.children??[]).map(t=>En(t)).join("")}return Wn(Ya);})();