worldorbit 3.0.7 → 3.2.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.
- package/dist/browser/core/dist/atlas-edit.js +5 -1
- package/dist/browser/core/dist/atlas-validate.js +1 -1
- package/dist/browser/core/dist/draft-parse.js +16 -9
- package/dist/browser/core/dist/draft.d.ts +1 -0
- package/dist/browser/core/dist/draft.js +4 -2
- package/dist/browser/core/dist/format.js +5 -3
- package/dist/browser/core/dist/load.js +7 -2
- package/dist/browser/core/dist/normalize.js +36 -0
- package/dist/browser/core/dist/parse.js +54 -0
- package/dist/browser/core/dist/scene.js +1 -0
- package/dist/browser/core/dist/types.d.ts +21 -1
- package/dist/unpkg/core/dist/atlas-edit.js +5 -1
- package/dist/unpkg/core/dist/atlas-validate.js +1 -1
- package/dist/unpkg/core/dist/draft-parse.js +16 -9
- package/dist/unpkg/core/dist/draft.d.ts +1 -0
- package/dist/unpkg/core/dist/draft.js +4 -2
- package/dist/unpkg/core/dist/format.js +5 -3
- package/dist/unpkg/core/dist/load.js +7 -2
- package/dist/unpkg/core/dist/normalize.js +36 -0
- package/dist/unpkg/core/dist/parse.js +54 -0
- package/dist/unpkg/core/dist/scene.js +1 -0
- package/dist/unpkg/core/dist/types.d.ts +21 -1
- package/dist/unpkg/worldorbit-core.min.js +9 -9
- package/dist/unpkg/worldorbit-editor.min.js +219 -219
- package/dist/unpkg/worldorbit-markdown.min.js +19 -19
- package/dist/unpkg/worldorbit-viewer.min.js +203 -203
- package/dist/unpkg/worldorbit.js +118 -14
- package/dist/unpkg/worldorbit.min.js +191 -191
- package/package.json +1 -1
- package/packages/core/dist/atlas-edit.js +5 -1
- package/packages/core/dist/atlas-validate.js +1 -1
- package/packages/core/dist/draft-parse.js +16 -9
- package/packages/core/dist/draft.d.ts +1 -0
- package/packages/core/dist/draft.js +4 -2
- package/packages/core/dist/format.js +5 -3
- package/packages/core/dist/load.js +7 -2
- package/packages/core/dist/normalize.js +36 -0
- package/packages/core/dist/parse.js +54 -0
- package/packages/core/dist/scene.js +1 -0
- package/packages/core/dist/types.d.ts +21 -1
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
"use strict";var WorldOrbitMarkdown=(()=>{var ot=Object.defineProperty;var tr=Object.getOwnPropertyDescriptor;var nr=Object.getOwnPropertyNames;var rr=Object.prototype.hasOwnProperty;var ir=(e,t)=>{for(var n in t)ot(e,n,{get:t[n],enumerable:!0})},or=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of nr(t))!rr.call(e,i)&&i!==n&&ot(e,i,{get:()=>t[i],enumerable:!(r=tr(t,i))||r.enumerable});return e};var ar=e=>or(ot({},"__esModule",{value:!0}),e);var gs={};ir(gs,{rehypeWorldOrbit:()=>qn,remarkWorldOrbit:()=>Yn,renderWorldOrbitBlock:()=>ue,renderWorldOrbitError:()=>Et});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 de=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],E=de.filter(e=>e!=="system"),sr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Bt=["structure","phenomenon"],X=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],lr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function v(e,t){return{key:e,...t}}var Le=new Set(de),Rt=new Map([v("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:X}),v("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),v("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),v("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:X}),v("period",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"duration"}),v("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),v("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),v("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),v("at",{kind:"string",placement:!0,arity:"single",objectTypes:Bt}),v("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Bt}),v("free",{kind:"string",placement:!0,arity:"single",objectTypes:lr}),v("kind",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("class",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("culture",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:de}),v("color",{kind:"string",placement:!1,arity:"single",objectTypes:de}),v("image",{kind:"string",placement:!1,arity:"single",objectTypes:sr}),v("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:de}),v("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"radius"}),v("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"mass"}),v("density",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),v("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),v("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),v("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:E}),v("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),v("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),v("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),v("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("on",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("source",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"duration"})].map(e=>[e.key,e])),cr=new Set(Rt.keys());function D(e){return Rt.get(e)}function _t(e){return cr.has(e)}function Nt(e,t){return e.objectTypes.includes(t)}function Pe(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 fe(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 De(e){return e.match(/^\s*/)?.[0].length??0}function pe(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=De(l),u=fe(l.slice(c),{line:s,columnOffset:c});if(u.length!==0){if(c===0){i=!1,o=null;let f=ur(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(pr(u,s)):r.blockFields.push(fr(u,s))}}return{type:"document",objects:n}}function ur(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:dr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function dr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=D(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&&!_t(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 fr(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!D(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 pr(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 Ut=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,mr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),hr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function me(e){let t=null,n=[];for(let r of e.objects){let i=gr(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 gr(e){let t=[...e.inlineFields,...e.blockFields];br(e.objectType,t);let n=yr(t),r=wr(e.objectType,n),i=vr(n),o=xr(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 br(e,t){for(let n of t){let r=D(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Nt(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 yr(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 wr(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:Te(t,"orbit"),distance:oe(t,"distance"),semiMajor:oe(t,"semiMajor"),eccentricity:kr(t,"eccentricity"),period:oe(t,"period"),angle:oe(t,"angle"),inclination:oe(t,"inclination"),phase:oe(t,"phase")};if(r){let l=Fe(t,"at"),s=Te(t,"at");return{mode:"at",target:s,reference:jr(s,l.location)}}if(i)return{mode:"surface",target:Te(t,"surface")};if(o){let l=Te(t,"free"),s=Sr(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function vr(e){let t={};for(let[n,r]of e.entries()){let i=D(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Mr(r);break;case"number":t[n]=Yt(ae(r),n,r.location);break;case"unit":t[n]=Wt(ae(r),r.location,n);break;case"string":t[n]=Ir(n,r);break}}return t}function Ir(e,t){let n=t.values.join(" ").trim();return e==="image"&&$r(n,t.location),n}function $r(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(hr);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 xr(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 jr(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 Wt(e,t,n){let r=e.match(Ut);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=D(n);if(o?.unitFamily&&!Pe(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Sr(e){let t=e.match(Ut);return t?{value:Number(t[1]),unit:t[2]??null}:null}function oe(e,t){if(!e.has(t))return;let n=Fe(e,t);return Wt(ae(n),n.location,t)}function kr(e,t){if(!e.has(t))return;let n=Fe(e,t);return Yt(ae(n),t,n.location)}function Yt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Mr(e){let t=ae(e).toLowerCase(),n=mr.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Fe(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function Te(e,t){return ae(Fe(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 Or=new Set(["star","planet","moon","asteroid","comet"]);function he(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||!Or.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"&&Ar(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Lr(r,r.placement.reference,t))}}function Ar(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 Lr(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 ge=1495978707e-1,Pr=6371,Dr=71492,Tr=695700,Fr=63241.077,Cr=206264.806,Er=206264806,Jt=.68,Vr=.2,Qt=28;function B(e,t={}){let n=Rr(t),r=n.width,i=n.height,o=n.padding,a=Br(e),l=Nr(e,t.projection),s=dt(t.camera??null),c=ut(l,s),u=Yr(a,t.scaleModel),f=qr(a),m=e.system?.id??null,h=t.activeEventId??null,y=zr(e.objects,e.events??[],h),g=new Map(y.map(b=>[b.id,b])),x=Li(y,g),S=new Map,p=[],$=[],T=[],_=[],F=[],G=new Map,q=new Map;for(let b of y){let C=b.placement;if(!C){T.push(b);continue}if(C.mode==="orbit"){Ht(q,C.target,b);continue}if(C.mode==="surface"){Ht(G,C.target,b);continue}if(C.mode==="at"){F.push(b);continue}_.push(b)}let Q=_.length>0?r*.42:r/2,A=i/2,N={orbitChildren:q,surfaceChildren:G,objectMap:g,spacingFactor:f,projection:c,scaleModel:u},U=T.find(b=>b.type==="star")??T[0]??null;U&&st(U,Q,A,0,S,p,$,N);let W=T.filter(b=>b.id!==U?.id);if(W.length>0){let b=Math.min(r,i)*.28*f*u.orbitDistanceMultiplier;W.forEach((C,k)=>{let it=Ie(k,W.length,-Math.PI/2),ee=$e(it,b,c,1);st(C,Q+ee.x,A+ee.y,0,S,p,$,N)})}_.forEach((b,C)=>{let k=r-o-140-Ei(b.placement?.mode==="free"?b.placement.distance:void 0,u),it=Math.max(76,(i-o*2-180)/Math.max(1,_.length)*f)*u.freePlacementMultiplier,ee=o+92+C*it;S.set(b.id,{object:b,x:k,y:ee,radius:Be(b,0,u),sortKey:_e(k,ee,0)}),$.push({object:b,groupId:x.groupIds.get(b.id)??null,x1:k-60,y1:ee,x2:k-18,y2:ee,mode:"free"}),Ve(b,S,p,$,N,1)}),F.forEach((b,C)=>{if(S.has(b.id)||!b.placement||b.placement.mode!=="at")return;let k=Oi(b.placement.reference,S,g,C,F.length,r,i,o,N);S.set(b.id,{object:b,x:k.x,y:k.y,radius:Be(b,2,u),sortKey:_e(k.x,k.y,2),anchorX:k.anchorX,anchorY:k.anchorY}),k.anchorX!==void 0&&k.anchorY!==void 0&&$.push({object:b,groupId:x.groupIds.get(b.id)??null,x1:k.anchorX,y1:k.anchorY,x2:k.x,y2:k.y,mode:"at"}),Ve(b,S,p,$,N,2)});let P=[...S.values()].map(b=>Xr(b,u,x)),Me=p.map(b=>Hr(b,x.groupIds.get(b.object.id)??null)),Oe=$.map(b=>Kr(b)),Ae=Zr(P,r,i,u.labelMultiplier),Vt=oi(e,P),zt=ai(e.events??[],P,h),Kn=ni(Me,Vt,zt,Oe,P,Ae),Zn=ri(P,Me,Oe,Ae,x,u.labelMultiplier),Jn=ii(e,P),Qn=si(e,l,n.preset,x,g),er=wi(r,i,P,Me,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:Wr(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:er,layers:Kn,groups:Zn,semanticGroups:Jn,viewpoints:Qn,events:zt,activeEventId:h,objects:P,orbitVisuals:Me,relations:Vt,leaders:Oe,labels:Ae}}function zr(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 Br(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 Rr(e){let t=_r(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function _r(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 Nr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return nn(n)??"topdown"}function ut(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 dt(e){if(!e)return null;let t={azimuth:at(e.azimuth),elevation:at(e.elevation),roll:at(e.roll),distance:Ur(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function at(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Ur(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Wr(e,t,n,r){let i=[`${Kt(e)} view`,`${Kt(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 Yr(e,t){return{...Gr(e),...t}}function Gr(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 qr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Xr(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:Ci(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:zi(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Hr(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 Kr(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 Zr(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(Jr);for(let s of l){let c=Qr(s,a,o,t,n,r)??tn(s,en(s,a.get(s.parentId??"")??null,n),0,r);o.push(ln(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 Jr(e,t){let n=Gt(e)-Gt(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 Gt(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 Qr(e,t,n,r,i,o){for(let a of ei(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=tn(e,a,s,o),u=ln(e,c,o);if(!n.some(f=>Ti(f,u)))return c}}return null}function ei(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=en(e,i,r),a=o==="below"?"above":"below",l=ti(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 en(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 ti(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 tn(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 ni(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 ri(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:ve(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=Pi(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function ii(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 oi(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 ai(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 si(e,t,n,r,i){let o=li(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 y=gi(m);if(!y)continue;let g=h.join(".").toLowerCase(),x=a.get(y)??{id:y};ci(x,g,u,e,t,n,r,i),a.set(y,x)}let l=[...a.values()].map(c=>ui(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 li(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=dt(null),a=ut(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 ci(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=we(s);return;case"projection":case"view":e.projection=nn(s)??i;return;case"preset":e.preset=fi(s)??o;return;case"rotation":case"angle":e.rotationDeg=be(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ee(),azimuth:be(s)};return;case"camera.elevation":e.camera={...e.camera??Ee(),elevation:be(s)};return;case"camera.roll":e.camera={...e.camera??Ee(),roll:be(s)};return;case"camera.distance":e.camera={...e.camera??Ee(),distance:qt(s)};return;case"zoom":case"scale":e.scale=qt(s);return;case"layers":e.layers=pi(s);return;case"query":e.filter={...e.filter??Ce(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Ce(),objectTypes:mi(s)};return;case"tags":e.filter={...e.filter??Ce(),tags:we(s)};return;case"groups":e.filter={...e.filter??Ce(),groupIds:hi(s,r,a,l)};return}}function ui(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=di(e.filter),l=e.label?.trim()||bi(e.id),s=e.projection??t,c=dt(e.camera??null),u=ut(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||yi(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 Ce(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ee(){return{azimuth:null,elevation:null,roll:null,distance:null}}function di(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 nn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function fi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function be(e){let t=Number(e);return Number.isFinite(t)?t:null}function qt(e){let t=be(e);return t!==null&&t>0?t:null}function pi(e){let t={};for(let n of we(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 mi(e){return we(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function hi(e,t,n,r){return we(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)??ye(i):(r.has(i),ye(i)))}function we(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function gi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function bi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function yi(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 wi(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||rn(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||on(m,f);for(let m of o)m.hidden||an(m,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?ve(0,0,e,t):ve(l,s,c,u)}function rn(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=un(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Qt*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function ve(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 on(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 an(e,t,n){let r=cn(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 st(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Be(e,r,l.scaleModel),sortKey:_e(t,n,r)}),Ve(e,i,o,a,l,r+1))}function Ve(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(vi),s=Ii(l,a.radius,i.spacingFactor,i.scaleModel),c=ji(l,s);l.forEach((f,m)=>{let h=$i(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}),st(f,h.objectX,h.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,m)=>{let h=Ie(m,u.length,-Math.PI/3),y=28*i.spacingFactor,g=$e(h,a.radius,i.projection,i.projection==="isometric"?.9:1),x=$e(h,a.radius+y,i.projection,i.projection==="isometric"?.9:1),S=a.x+g.x,p=a.y+g.y,$=a.x+x.x,T=a.y+x.y;t.set(f.id,{object:f,x:$,y:T,radius:Be(f,o+1,i.scaleModel),sortKey:_e($,T,o+1),anchorX:S,anchorY:p}),r.push({object:f,groupId:i.objectMap.has(f.id)?ye(Di(f,i.objectMap)):null,x1:S,y1:p,x2:$,y2:T,mode:"surface"}),Ve(f,t,n,r,i,o+1)})}function vi(e,t){let n=ze(e),r=ze(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 Ii(e,t,n,r){let i=e.map(f=>ze(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 $i(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let q=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:q,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-q}}let c=M(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,f=Math.max(u*Math.sqrt(1-c*c),u*.18),m=ct(l.inclination)??0,h=a.projection==="isometric"?Math.max(Vr,Math.cos(ft(m)))*Jt:1,y=Math.max(f*h,u*.14),g=ct(l.angle)??0,x=u*c,S=fn(-x,0,g),p=r.x+S.x,$=r.y+S.y,T=ki(l.phase,t,n),_=dn(p,$,u,y,g,T),F=a.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,G=s?Mi(e,u,i,a.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:p,cy:F?r.y:$,radius:F?u:void 0,rx:F?void 0:u,ry:F?void 0:y,rotationDeg:g,band:s,bandThickness:G,frontArcPath:a.projection==="isometric"||s?Xt(p,$,u,y,g,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Xt(p,$,u,y,g,Math.PI,Math.PI*2):void 0,objectX:_.x,objectY:_.y}}function xi(e,t){return t.innerPx+t.stepPx*Si(Math.max(e,0)+1)}function ji(e,t){let n=[];return e.forEach((r,i)=>{let o=ze(r),a=t.innerPx+i*t.stepPx,l=o===null?a:xi(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function ze(e){return!e.placement||e.placement.mode!=="orbit"?null:Re(e.placement.semiMajor??e.placement.distance??null)}function Si(e){return Math.log(e)/Math.log(2)}function ki(e,t,n){let r=e?ct(e):null;return r!==null?ft(r-90):Ie(t,n,-Math.PI/2)}function Mi(e,t,n,r){let i=Re(lt(e.properties.inner)),o=Re(lt(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.metricSpread>0)return M(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return M(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Oi(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return Ai(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=Ie(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=Ie(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 Ai(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Fi(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,y=M(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*y,y:a.y-f*y,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*y,y:a.y+f*y,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*y,y:o.y-f*y,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-m*.8660254)*y,y:a.y+(f*.5-h*.8660254)*y,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+m*.8660254)*y,y:a.y+(f*.5+h*.8660254)*y,anchorX:a.x,anchorY:a.y}}}function Li(e,t){let n=new Map,r=new Map;for(let c of e){let u=sn(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=ye(u);o.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function sn(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 Pi(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)&&on(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&rn(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)&&an(f,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?ve(0,0,0,0):ve(a,l,s,c)}function Di(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=sn(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function ln(e,t,n){return cn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function cn(e,t,n,r,i,o,a,l){let s=Bi(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 Ti(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Fi(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Be(e,t,n){let r=Vi(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return M((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return M(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return M(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return M(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return M(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return M(8*i,n.minBodyRadius,n.maxBodyRadius)}}function Ci(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 Re(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ge;case"m":return e.value/1e3/ge;case"ly":return e.value*Fr;case"pc":return e.value*Cr;case"kpc":return e.value*Er;case"re":return e.value*Pr/ge;case"rj":return e.value*Dr/ge;case"sol":return e.value*Tr/ge;default:return e.value}}function Ei(e,t){let n=Re(e??null);return n===null||n<=0?0:M(n*96*t.freePlacementMultiplier,0,420)}function Vi(e,t){let n=lt(e);if(!n)return null;let r;switch(n.unit){case"sol":r=M(n.value*22,14,40);break;case"re":r=M(n.value*10,6,18);break;case"km":r=M(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=M(n.value*4,4,20);break}return M(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function lt(e){return!e||typeof e!="object"||!("value"in e)?null:e}function ct(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ie(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Xt(e,t,n,r,i,o,a){let l=un(e,t,n,r,i,o,a,Qt);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Zt(s.x)} ${Zt(s.y)}`).join(" ")}function un(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(dn(e,t,n,r,i,u))}return s}function dn(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=fn(a,l,i);return{x:e+s.x,y:t+s.y}}function fn(e,t,n){let r=ft(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"?Jt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function _e(e,t,n){return t*1e3+e+n*.01}function M(e,t,n){return Math.min(Math.max(e,t),n)}function Ht(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 ye(e){return`${se(e)}-group`}function zi(e){return typeof e=="string"&&e.trim()?e:void 0}function Bi(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 Kt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function ft(e){return e*Math.PI/180}function Zt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var hn=86400,Ne=hn*365.25,Ue=18,pn=180;function Ge(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,activeEventId:t.activeEventId},r=B(e,n),i=Wi(r.layoutPreset,t.spatialScaleModel),o={x:r.contentBounds.centerX,y:r.contentBounds.centerY},a=new Map(r.objects.map(g=>[g.objectId,g])),l=new Map(r.orbitVisuals.map(g=>[g.objectId,g])),s=new Map;for(let g of r.objects){let x=g.object.placement;!x||x.mode!=="orbit"||s.set(g.objectId,mt(x))}let c=Math.min(...[...s.values()].filter(g=>Number.isFinite(g)&&g>0))||1,u=new Map,f=r.objects.map(g=>Ri(g,r,o,a,l,i,u,c)),m=new Map(f.map(g=>[g.objectId,g])),h=r.orbitVisuals.map(g=>_i(g,m,c,r.activeEventId!==null)),y=f.map(g=>({objectId:g.objectId,center:{...g.position},radius:g.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:Gi(f),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:f,orbits:h,focusTargets:y}}function Ri(e,t,n,r,i,o,a,l){let s=We(e,t,n,r,i,a),c=ht(e.object,i.get(e.objectId),l,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:s,radius:le(e.radius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius),visualRadius:le(e.visualRadius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:c}}function _i(e,t,n,r){let i=t.get(e.objectId),o=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:o?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??Ye(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??ht(e.object,e,n,r)}}function We(e,t,n,r,i,o){let a=o.get(e.objectId);if(a)return a;let l=e.object.placement,s;if(l?.mode==="orbit"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=i.get(e.objectId),m=ht(e.object,f,1,t.activeEventId!==null),h=m?Ni(m,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=qi(u,h)}else if(l?.mode==="surface"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=c?.visualRadius??16,m=Xi(e.objectId),h=m*Math.PI*2;s={x:u.x+Math.cos(h)*(f+e.visualRadius*.9),y:u.y+Math.sin(m*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(h)*(f+e.visualRadius*.9)}}else if(l?.mode==="at"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=e.anchorX??c?.x??n.x,m=e.anchorY??c?.y??n.y;s={x:u.x+(e.x-f),y:u.y,z:u.z+(e.y-m)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return o.set(e.objectId,s),s}function Ni(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=pt(n),i=pt(e.rotationDeg),o=pt(e.inclinationDeg),a=Math.cos(r)*e.semiMajor,l=Math.sin(r)*e.semiMinor,s=a*Math.cos(i)-l*Math.sin(i),c=a*Math.sin(i)+l*Math.cos(i);return{x:s,y:c*Math.sin(o),z:c*Math.cos(o)}}function ht(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let o=t?.radius??t?.rx??le(mt(i)*48,24,1200),a=t?.radius??t?.ry??o,l=Ui(i.period),s=mt(i),c=le(s/Math.max(n,1e-4),1,20),u=le(l?Ue*c:Ue*Math.pow(c,.75),Ue,pn);return{phase0Deg:Ye(i.phase)??0,rotationDeg:Ye(i.angle)??t?.rotationDeg??0,inclinationDeg:Ye(i.inclination)??0,semiMajor:o,semiMinor:a,eccentricity:i.eccentricity??0,periodSeconds:l,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:l===null,frozen:r}}function mt(e){let t=mn(e.semiMajor)??mn(e.distance)??1;return Math.max(t,.01)}function mn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function Ui(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*hn;case"y":return e.value*Ne;case"ky":return e.value*Ne*1e3;case"my":return e.value*Ne*1e6;case"gy":return e.value*Ne*1e9;default:return null}}function Ye(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Wi(e,t){return{...Yi(e),...t}}function Yi(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function Gi(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l of e)t=Math.min(t,l.position.x-l.visualRadius),n=Math.min(n,l.position.y-l.visualRadius),r=Math.min(r,l.position.z-l.visualRadius),i=Math.max(i,l.position.x+l.visualRadius),o=Math.max(o,l.position.y+l.visualRadius),a=Math.max(a,l.position.z+l.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:a,width:i-t,height:o-n,depth:a-r,center:{x:(t+i)/2,y:(n+o)/2,z:(r+a)/2}}}function qi(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Xi(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function le(e,t,n){return Math.min(Math.max(e,t),n)}function pt(e){return e*Math.PI/180}function gt(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:eo(e.system),info:to(e.system)}:null,r=e.objects.map(Hi);return Ji(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(Ki),objects:r}}function Hi(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:Qi(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Ki(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Zi)}}function Zi(e){return{objectId:e.objectId,placement:gn(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 gn(e){return e?structuredClone(e):null}function Ji(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=gn(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 Qi(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 eo(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 to(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=no(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 no(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 bn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,oo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ao=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ce(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function je(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function bt(e,t,n){let r=e.match(bn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=D(n);if(o?.unitFamily&&!Pe(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function yt(e){let t=e.match(bn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function qe(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function H(e,t,n){let r=oo.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function yn(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 so(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(ao);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 wn(e,t,n){let r=D(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 H(xe(t,e,n),e,n);case"number":return qe(xe(t,e,n),e,n);case"unit":return bt(xe(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&so(i,n),i}}}function wt(e,t,n){let r=D(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 xe(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var In=new Set(["star","planet","moon","asteroid","comet"]),lo=332946.0487,co=1047.3486,Xe=1495978707e-1,uo=6371,fo=695700,po=63241.077,mo=206264.806,ho=206264806;function He(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(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 u=a.get(c);u?n.push(w("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)go(l,r,n);for(let l of e.system?.viewpoints??[])bo(l,i,o,t,n,r);for(let l of e.objects)yo(l,e.system,r,i,n);for(let l of e.events)wo(l,e.system,r,n);return n}function go(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 bo(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(j("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(j("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}xo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),jo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function yo(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(j("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(j("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(j("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(w("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(j("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(j("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!It(l?.properties.mass)&&i.push(j("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?In.has(s.type)||i.push(w("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(w("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(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Io(e,n,i)||i.push(w("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(j("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.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"){i.push(j("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=vn(e,l);if(c===null){i.push(j("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(vt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Oo(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(j("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=$n(a?.period),u=vn(e,l);if(c===null||u===null)continue;let f=Mo(e,"period");Math.abs(c-u)>f&&i.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function wo(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(w("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(j("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(j("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(w("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(w("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(j("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(w("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(j("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(j("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(j("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(w("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(w("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(j("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),vo(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(j("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function vo(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(w("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(w("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(w("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!So(r,t,n,e)&&o.push(j("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!ko(r,t,n,e)&&o.push(j("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!It(i.get(s.target)?.properties.mass)&&o.push(j("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?In.has(c.type)||o.push(w("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(w("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(w("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(w("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(w("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(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function Io(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 vn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=$o(n.semiMajor??n.distance),i=It(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function $o(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Xe;case"m":return e.value/(Xe*1e3);case"ly":return e.value*po;case"pc":return e.value*mo;case"kpc":return e.value*ho;case"re":return e.value*uo/Xe;case"sol":return e.value*fo/Xe;default:return null}}function It(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/lo;case"mj":return t.value/co;default:return null}}function $n(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 xo(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function jo(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(w("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(m)}" in viewpoint "${i}".`,void 0,`${c}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(j("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(j("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(vt("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(j("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(vt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function So(e,t,n,r){return K(r?.epoch)??K(n?.epoch)??K(t.epoch)??K(e?.epoch)??null}function ko(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 Mo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?$n(n)??0:0}function Oo(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 j(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function vt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Ao=new Set(["climate","habitability","settlement"]),Ze=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=D(e);t&&Ze.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}])Ze.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Lo=new Set(Ze.keys()),jn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function $t(e){return Po(e)}function Po(e,t){let n=ba(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],f=[],m=[],h=new Map,y=!1,g=!1,x=new Set,S=new Set,p=new Set,$=new Set,T=new Set;for(let A=0;A<r.length;A++){let N=r[A],U=A+1;if(!N.trim())continue;let W=De(N),P=fe(N.slice(W),{line:U,columnOffset:W});if(P.length!==0){if(!o){a=Do(P,U),o=!0,n.comments.length>0&&Je(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(W===0){s=To(P,U,a,i,l,c,u,f,m,h,x,S,p,$,T,{sawDefaults:y,sawAtlas:g}),s.kind==="system"?l=s.system:s.kind==="defaults"?y=!0:s.kind==="atlas"&&(g=!0);continue}if(!s)throw new d("Indented line without parent atlas section",U,W+1);_o(s,W,P,U)}}if(!o)throw new d('Missing required atlas schema header "schema 2.0"');let _=c.map(A=>aa(A,a,i)),F=m.map(A=>sa(A,h.get(A.id)??[])),G=t??(a==="2.0-draft"?"2.0":a),q={format:"worldorbit",sourceVersion:"1.0",system:l,groups:u,relations:f,events:F,objects:_,diagnostics:i};if(G==="2.0-draft"){let A={...q,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...He(A,a)),A}let Q={...q,version:G,schemaVersion:G};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(...He(Q,a)),Q}function Do(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 To(e,t,n,r,i,o,a,l,s,c,u,f,m,h,y,g){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return Fo(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(g.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(g.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 Eo(e,t,i,f);case"group":return V(n,r,"group",{line:t,column:e[0].column}),Vo(e,t,a,m);case"relation":return V(n,r,"relation",{line:t,column:e[0].column}),zo(e,t,l,h);case"event":return V(n,r,"event",{line:t,column:e[0].column}),Bo(e,t,s,c,y,n,r);case"object":return Ro(e,t,n,r,o);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Fo(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=ce(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:je(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 Eo(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=ce(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:je(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function Vo(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=ce(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:je(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function zo(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=ce(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 Bo(e,t,n,r,i,o,a){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let l=ce(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:je(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 Ro(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:ia(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 _o(e,t,n,r){switch(e.kind){case"system":No(e,n,r);return;case"defaults":Uo(e,n,r);return;case"atlas":Wo(e,t,n,r);return;case"viewpoint":Yo(e,t,n,r);return;case"annotation":Xo(e,n,r);return;case"group":Ho(e,n,r);return;case"relation":Ko(e,n,r);return;case"event":Zo(e,t,n,r);return;case"object":Qo(e,t,n,r);return}}function No(e,t,n){let r=Y(t,e.seenFields,n),i=I(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 Uo(e,t,n){let r=Y(t,e.seenFields,n),i=I(t,n);switch(r){case"view":kn(i)&&ne(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Sn(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=Mn(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=On(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 Yo(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){Go(e,n,r);return}if(e.inFilter){qo(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??jt();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=Y(n,e.seenFields,r),o=I(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":kn(o)&&ne(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Sn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=Mn(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=xt(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=ra(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=ta(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=R(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Go(e,t,n){let r=Y(t,e.seenCameraFields,n),i=I(t,n),o=e.viewpoint.camera??jt();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=xt(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 qo(e,t,n){let r=Y(t,e.seenFilterFields,n),i=e.viewpoint.filter??na();switch(r){case"query":i.query=I(t,n);break;case"objecttypes":i.objectTypes=ea(t.slice(1),n);break;case"tags":i.tags=R(t.slice(1),n,"tags");break;case"groups":i.groupIds=R(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(Y(t,e.seenFields,n)){case"label":e.annotation.label=I(t,n);return;case"target":e.annotation.targetObjectId=I(t,n);return;case"body":e.annotation.body=I(t,n);return;case"tags":e.annotation.tags=R(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Ho(e,t,n){switch(Y(t,e.seenFields,n)){case"label":e.group.label=I(t,n);return;case"summary":e.group.summary=I(t,n);return;case"color":e.group.color=I(t,n);return;case"tags":e.group.tags=R(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=H(I(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 Ko(e,t,n){switch(Y(t,e.seenFields,n)){case"from":e.relation.from=I(t,n);return;case"to":e.relation.to=I(t,n);return;case"kind":e.relation.kind=I(t,n);return;case"label":e.relation.label=I(t,n);return;case"summary":e.relation.summary=I(t,n);return;case"tags":e.relation.tags=R(t.slice(1),n,"tags");return;case"color":e.relation.color=I(t,n);return;case"hidden":e.relation.hidden=H(I(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 Zo(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(Jo(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(Y(n,e.seenFields,r)){case"kind":e.event.kind=I(n,r);return;case"label":e.event.label=I(n,r);return;case"summary":e.event.summary=I(n,r);return;case"target":e.event.targetObjectId=I(n,r);return;case"participants":e.event.participantObjectIds=R(n.slice(1),r,"participants");return;case"timing":e.event.timing=I(n,r);return;case"visibility":e.event.visibility=I(n,r);return;case"epoch":ne(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=I(n,r);return;case"referenceplane":ne(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=I(n,r);return;case"tags":e.event.tags=R(n.slice(1),r,"tags");return;case"color":e.event.color=I(n,r);return;case"hidden":e.event.hidden=H(I(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 Jo(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(!jn.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 Qo(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"||Ao.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=On(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(oa(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function Y(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 I(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 ea(e,t){return R(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function ta(e,t,n,r){let i={};for(let o of R(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 R(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 Sn(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 kn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function Mn(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 xt(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 na(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function jt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ra(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}:jt(),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=xt(c,t,a.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function ia(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=Se(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&&!Lo.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 Dn(o,n),o}function oa(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let o=Se(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 Dn([a],n),a}function On(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 aa(e,t,n){let r=An(e.fields),i=Ln(r),o=ca(e.objectType,r),a=ha(r.get("groups")?.[0]),l=Ke(r.get("epoch")?.[0]),s=Ke(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?H(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?fa(r.get("resonance")[0]):void 0,f=da(r),m=r.get("derive")?.map($=>pa($)),h=r.get("validate")?.map($=>({rule:z($)})),y=r.has("locked")?[...new Set(r.get("locked").flatMap($=>$.values))]:void 0,g=r.get("tolerance")?.map($=>ma($)),x=ua(e.typedBlockEntries),S=Pn(e.infoEntries,"info"),p={type:e.objectType,id:e.id,properties:o,placement:i,info:S};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),y?.length&&(p.lockedFields=y),g?.length&&(p.tolerances=g),x&&Object.keys(x).length>0&&(p.typedBlocks=x),Je(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 sa(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>la(n))}}function la(e){let t=An(e.fields,"event-pose"),n=Ln(t);return{objectId:e.objectId,placement:n,inner:Z(t.get("inner")?.[0],"inner"),outer:Z(t.get("outer")?.[0],"outer"),epoch:Ke(t.get("epoch")?.[0]),referencePlane:Ke(t.get("referencePlane")?.[0])}}function An(e,t="object"){let n=new Map;for(let r of e){let i=Se(r.key);if(!i&&!jn.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 Ln(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:z(t),distance:Z(e.get("distance")?.[0],"distance"),semiMajor:Z(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:ga(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=z(n);return{mode:"at",target:a,reference:yn(a,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let a=z(i),l=yt(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function ca(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=Se(r);!o||!a?.legacySchema||a.legacySchema.placement||(wt(r,e,o.location),n[r]=wn(r,o.values,o.location))}return n}function Pn(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 ua(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Pn(r,n))}return t}function da(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=H(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=H(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=qe(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function fa(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 pa(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 ma(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=yt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ha(e){return e?[...new Set(e.values)]:[]}function Ke(e){return e&&e.values.join(" ").trim()||null}function Z(e,t){return e?bt(z(e),e.location,t):void 0}function ga(e,t){return e?qe(z(e),t,e.location):void 0}function z(e){return xe(e.values,e.key,e.location)}function Se(e){return Ze.get(e)}function Dn(e,t){for(let n of e){let r=Se(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){wt(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){Je(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){Je(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 Je(e,t){return xn(e)<xn(t)}function xn(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 ba(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!==`
|
|
1
|
+
"use strict";var WorldOrbitMarkdown=(()=>{var ot=Object.defineProperty;var nr=Object.getOwnPropertyDescriptor;var rr=Object.getOwnPropertyNames;var ir=Object.prototype.hasOwnProperty;var or=(e,t)=>{for(var n in t)ot(e,n,{get:t[n],enumerable:!0})},ar=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of rr(t))!ir.call(e,i)&&i!==n&&ot(e,i,{get:()=>t[i],enumerable:!(r=nr(t,i))||r.enumerable});return e};var sr=e=>ar(ot({},"__esModule",{value:!0}),e);var vs={};or(vs,{rehypeWorldOrbit:()=>Xn,remarkWorldOrbit:()=>Gn,renderWorldOrbitBlock:()=>ue,renderWorldOrbitError:()=>Et});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 de=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],E=de.filter(e=>e!=="system"),lr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Bt=["structure","phenomenon"],X=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],cr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function v(e,t){return{key:e,...t}}var Le=new Set(de),Rt=new Map([v("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:X}),v("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),v("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),v("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:X}),v("period",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"duration"}),v("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),v("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),v("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),v("at",{kind:"string",placement:!0,arity:"single",objectTypes:Bt}),v("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Bt}),v("free",{kind:"string",placement:!0,arity:"single",objectTypes:cr}),v("kind",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("class",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("culture",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:de}),v("color",{kind:"string",placement:!1,arity:"single",objectTypes:de}),v("image",{kind:"string",placement:!1,arity:"single",objectTypes:lr}),v("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:de}),v("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"radius"}),v("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"mass"}),v("density",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),v("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),v("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),v("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:E}),v("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),v("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),v("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),v("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),v("on",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("source",{kind:"string",placement:!1,arity:"single",objectTypes:E}),v("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"duration"})].map(e=>[e.key,e])),ur=new Set(Rt.keys());function T(e){return Rt.get(e)}function _t(e){return ur.has(e)}function Nt(e,t){return e.objectTypes.includes(t)}function Pe(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 fe(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],p=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=p),a=!0,s=p,l=!0);continue}if(!l&&/\s/.test(f)){c();continue}o===null&&(o=p),i+=f}if(l)throw new d("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Te(e){return e.match(/^\s*/)?.[0].length??0}function pe(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,o=!1,a=!1,l=null,s=null,c=null,u=null;for(let f=0;f<t.length;f++){let p=t[f],h=f+1;if(!p.trim())continue;let b=Te(p),g=fe(p.slice(b),{line:h,columnOffset:b});if(g.length!==0){if(b===0){if(o=!1,a=!1,l=null,s=null,c=null,u=null,g.length>=1&&g[0].value==="theme"){a=!0,s=0,r={type:"theme",preset:g.length>=2?g[1].value:null,blocks:[],location:{line:h,column:g[0].column}};continue}let I=dr(g,h);n.push(I),i=I;continue}if(a){if(g.length>=2&&g[0].value==="preset"&&(!c||b<=c)){r&&(r.preset=g[1].value);continue}u&&c!==null&&b>c?u.fields.push(mr(g,h)):(c=b,u={type:"theme-block",target:g[0].value,fields:[],location:{line:h,column:g[0].column}},r?.blocks.push(u));continue}if(!i)throw new d("Indented line without parent object",h,b+1);if(g.length===1&&g[0].value==="info"){o=!0,l=b;continue}o&&b<=(l??0)&&(o=!1),o?i.infoEntries.push(hr(g,h)):i.blockFields.push(pr(g,h))}}return{type:"document",theme:r,objects:n}}function dr(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:fr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function fr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=T(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&&!_t(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 pr(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!T(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 mr(e,t){if(e.length<2)throw new d("Invalid theme field line",t,e[0]?.column??1);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function hr(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 Ut=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,gr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),br=/^[A-Za-z][A-Za-z0-9+.-]*:/;function me(e){let t=null,n=[],r=e.theme?yr(e.theme):null;for(let i of e.objects){let o=vr(i);if(i.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",i.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],objects:n}}function yr(e){let t={};for(let n of e.blocks){let r=Wt(n.fields);t[n.target]=wr(r)}return{preset:e.preset,styles:t}}function wr(e){let t={};for(let[n,r]of e.entries()){if(r.values.length===1){let i=r.values[0];if(i==="true"){t[n]=!0;continue}if(i==="false"){t[n]=!1;continue}let o=Number(i);if(!Number.isNaN(o)&&i.trim()!==""){t[n]=o;continue}}t[n]=r.values.join(" ")}return t}function vr(e){let t=[...e.inlineFields,...e.blockFields];Ir(e.objectType,t);let n=Wt(t),r=$r(e.objectType,n),i=xr(n),o=kr(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 Ir(e,t){for(let n of t){let r=T(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Nt(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 Wt(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 $r(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:De(t,"orbit"),distance:oe(t,"distance"),semiMajor:oe(t,"semiMajor"),eccentricity:Ar(t,"eccentricity"),period:oe(t,"period"),angle:oe(t,"angle"),inclination:oe(t,"inclination"),phase:oe(t,"phase")};if(r){let l=Fe(t,"at"),s=De(t,"at");return{mode:"at",target:s,reference:Mr(s,l.location)}}if(i)return{mode:"surface",target:De(t,"surface")};if(o){let l=De(t,"free"),s=Or(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function xr(e){let t={};for(let[n,r]of e.entries()){let i=T(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Lr(r);break;case"number":t[n]=Gt(ae(r),n,r.location);break;case"unit":t[n]=Yt(ae(r),r.location,n);break;case"string":t[n]=jr(n,r);break}}return t}function jr(e,t){let n=t.values.join(" ").trim();return e==="image"&&Sr(n,t.location),n}function Sr(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(br);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 kr(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 Mr(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 Yt(e,t,n){let r=e.match(Ut);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=T(n);if(o?.unitFamily&&!Pe(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Or(e){let t=e.match(Ut);return t?{value:Number(t[1]),unit:t[2]??null}:null}function oe(e,t){if(!e.has(t))return;let n=Fe(e,t);return Yt(ae(n),n.location,t)}function Ar(e,t){if(!e.has(t))return;let n=Fe(e,t);return Gt(ae(n),t,n.location)}function Gt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Lr(e){let t=ae(e).toLowerCase(),n=gr.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Fe(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function De(e,t){return ae(Fe(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 Pr=new Set(["star","planet","moon","asteroid","comet"]);function he(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||!Pr.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"&&Tr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Dr(r,r.placement.reference,t))}}function Tr(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 Dr(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 ge=1495978707e-1,Fr=6371,Cr=71492,Er=695700,Vr=63241.077,zr=206264.806,Br=206264806,Qt=.68,Rr=.2,en=28;function B(e,t={}){let n=Ur(t),r=n.width,i=n.height,o=n.padding,a=Nr(e),l=Yr(e,t.projection),s=dt(t.camera??null),c=ut(l,s),u=Xr(a,t.scaleModel),f=Kr(a),p=e.system?.id??null,h=t.activeEventId??null,b=_r(e.objects,e.events??[],h),g=new Map(b.map(y=>[y.id,y])),I=Di(b,g),S=new Map,m=[],x=[],D=[],_=[],F=[],G=new Map,q=new Map;for(let y of b){let C=y.placement;if(!C){D.push(y);continue}if(C.mode==="orbit"){Kt(q,C.target,y);continue}if(C.mode==="surface"){Kt(G,C.target,y);continue}if(C.mode==="at"){F.push(y);continue}_.push(y)}let Q=_.length>0?r*.42:r/2,A=i/2,N={orbitChildren:q,surfaceChildren:G,objectMap:g,spacingFactor:f,projection:c,scaleModel:u},U=D.find(y=>y.type==="star")??D[0]??null;U&&st(U,Q,A,0,S,m,x,N);let W=D.filter(y=>y.id!==U?.id);if(W.length>0){let y=Math.min(r,i)*.28*f*u.orbitDistanceMultiplier;W.forEach((C,k)=>{let it=Ie(k,W.length,-Math.PI/2),ee=$e(it,y,c,1);st(C,Q+ee.x,A+ee.y,0,S,m,x,N)})}_.forEach((y,C)=>{let k=r-o-140-Bi(y.placement?.mode==="free"?y.placement.distance:void 0,u),it=Math.max(76,(i-o*2-180)/Math.max(1,_.length)*f)*u.freePlacementMultiplier,ee=o+92+C*it;S.set(y.id,{object:y,x:k,y:ee,radius:Be(y,0,u),sortKey:_e(k,ee,0)}),x.push({object:y,groupId:I.groupIds.get(y.id)??null,x1:k-60,y1:ee,x2:k-18,y2:ee,mode:"free"}),Ve(y,S,m,x,N,1)}),F.forEach((y,C)=>{if(S.has(y.id)||!y.placement||y.placement.mode!=="at")return;let k=Pi(y.placement.reference,S,g,C,F.length,r,i,o,N);S.set(y.id,{object:y,x:k.x,y:k.y,radius:Be(y,2,u),sortKey:_e(k.x,k.y,2),anchorX:k.anchorX,anchorY:k.anchorY}),k.anchorX!==void 0&&k.anchorY!==void 0&&x.push({object:y,groupId:I.groupIds.get(y.id)??null,x1:k.anchorX,y1:k.anchorY,x2:k.x,y2:k.y,mode:"at"}),Ve(y,S,m,x,N,2)});let P=[...S.values()].map(y=>Zr(y,u,I)),Me=m.map(y=>Jr(y,I.groupIds.get(y.object.id)??null)),Oe=x.map(y=>Qr(y)),Ae=ei(P,r,i,u.labelMultiplier),Vt=li(e,P),zt=ci(e.events??[],P,h),Zn=oi(Me,Vt,zt,Oe,P,Ae),Jn=ai(P,Me,Oe,Ae,I,u.labelMultiplier),Qn=si(e,P),er=ui(e,l,n.preset,I,g),tr=$i(r,i,P,Me,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:qr(l,c,a,s),systemId:p,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:tr,layers:Zn,groups:Jn,semanticGroups:Qn,viewpoints:er,events:zt,activeEventId:h,objects:P,orbitVisuals:Me,relations:Vt,leaders:Oe,labels:Ae}}function _r(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 Nr(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 Ur(e){let t=Wr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Wr(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 Yr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return rn(n)??"topdown"}function ut(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 dt(e){if(!e)return null;let t={azimuth:at(e.azimuth),elevation:at(e.elevation),roll:at(e.roll),distance:Gr(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function at(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Gr(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function qr(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 Xr(e,t){return{...Hr(e),...t}}function Hr(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 Kr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Zr(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:zi(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:_i(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Jr(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 Qr(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 ei(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(ti);for(let s of l){let c=ni(s,a,o,t,n,r)??nn(s,tn(s,a.get(s.parentId??"")??null,n),0,r);o.push(cn(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 ti(e,t){let n=qt(e)-qt(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 qt(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 ni(e,t,n,r,i,o){for(let a of ri(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=nn(e,a,s,o),u=cn(e,c,o);if(!n.some(f=>Ei(f,u)))return c}}return null}function ri(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=tn(e,i,r),a=o==="below"?"above":"below",l=ii(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 tn(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 ii(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 nn(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 oi(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 ai(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:ve(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=Fi(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function si(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 li(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 ci(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 ui(e,t,n,r,i){let o=di(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,p,...h]=c.split(".");if(f!=="viewpoint"||!p||h.length===0)continue;let b=wi(p);if(!b)continue;let g=h.join(".").toLowerCase(),I=a.get(b)??{id:b};fi(I,g,u,e,t,n,r,i),a.set(b,I)}let l=[...a.values()].map(c=>pi(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 di(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=dt(null),a=ut(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 fi(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=we(s);return;case"projection":case"view":e.projection=rn(s)??i;return;case"preset":e.preset=hi(s)??o;return;case"rotation":case"angle":e.rotationDeg=be(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ee(),azimuth:be(s)};return;case"camera.elevation":e.camera={...e.camera??Ee(),elevation:be(s)};return;case"camera.roll":e.camera={...e.camera??Ee(),roll:be(s)};return;case"camera.distance":e.camera={...e.camera??Ee(),distance:Xt(s)};return;case"zoom":case"scale":e.scale=Xt(s);return;case"layers":e.layers=gi(s);return;case"query":e.filter={...e.filter??Ce(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Ce(),objectTypes:bi(s)};return;case"tags":e.filter={...e.filter??Ce(),tags:we(s)};return;case"groups":e.filter={...e.filter??Ce(),groupIds:yi(s,r,a,l)};return}}function pi(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=mi(e.filter),l=e.label?.trim()||vi(e.id),s=e.projection??t,c=dt(e.camera??null),u=ut(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||Ii(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 Ce(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ee(){return{azimuth:null,elevation:null,roll:null,distance:null}}function mi(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 rn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function hi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function be(e){let t=Number(e);return Number.isFinite(t)?t:null}function Xt(e){let t=be(e);return t!==null&&t>0?t:null}function gi(e){let t={};for(let n of we(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 bi(e){return we(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function yi(e,t,n,r){return we(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??ye(i):(r.has(i),ye(i)))}function we(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function wi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function vi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ii(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 $i(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=(p,h)=>{l=Math.min(l,p),s=Math.min(s,h),c=Math.max(c,p),u=Math.max(u,h)};for(let p of r)p.hidden||on(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||an(p,f);for(let p of o)p.hidden||sn(p,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?ve(0,0,e,t):ve(l,s,c,u)}function on(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=dn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,en*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function ve(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 an(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 sn(e,t,n){let r=un(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 st(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Be(e,r,l.scaleModel),sortKey:_e(t,n,r)}),Ve(e,i,o,a,l,r+1))}function Ve(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(xi),s=ji(l,a.radius,i.spacingFactor,i.scaleModel),c=Mi(l,s);l.forEach((f,p)=>{let h=Si(f,p,l.length,a,s,c[p]??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}),st(f,h.objectX,h.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,p)=>{let h=Ie(p,u.length,-Math.PI/3),b=28*i.spacingFactor,g=$e(h,a.radius,i.projection,i.projection==="isometric"?.9:1),I=$e(h,a.radius+b,i.projection,i.projection==="isometric"?.9:1),S=a.x+g.x,m=a.y+g.y,x=a.x+I.x,D=a.y+I.y;t.set(f.id,{object:f,x,y:D,radius:Be(f,o+1,i.scaleModel),sortKey:_e(x,D,o+1),anchorX:S,anchorY:m}),r.push({object:f,groupId:i.objectMap.has(f.id)?ye(Ci(f,i.objectMap)):null,x1:S,y1:m,x2:x,y2:D,mode:"surface"}),Ve(f,t,n,r,i,o+1)})}function xi(e,t){let n=ze(e),r=ze(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 ji(e,t,n,r){let i=e.map(f=>ze(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 Si(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let q=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:q,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-q}}let c=M(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,f=Math.max(u*Math.sqrt(1-c*c),u*.18),p=ct(l.inclination)??0,h=a.projection==="isometric"?Math.max(Rr,Math.cos(ft(p)))*Qt:1,b=Math.max(f*h,u*.14),g=ct(l.angle)??0,I=u*c,S=pn(-I,0,g),m=r.x+S.x,x=r.y+S.y,D=Ai(l.phase,t,n),_=fn(m,x,u,b,g,D),F=a.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,G=s?Li(e,u,i,a.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:m,cy:F?r.y:x,radius:F?u:void 0,rx:F?void 0:u,ry:F?void 0:b,rotationDeg:g,band:s,bandThickness:G,frontArcPath:a.projection==="isometric"||s?Ht(m,x,u,b,g,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Ht(m,x,u,b,g,Math.PI,Math.PI*2):void 0,objectX:_.x,objectY:_.y}}function ki(e,t){return t.innerPx+t.stepPx*Oi(Math.max(e,0)+1)}function Mi(e,t){let n=[];return e.forEach((r,i)=>{let o=ze(r),a=t.innerPx+i*t.stepPx,l=o===null?a:ki(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function ze(e){return!e.placement||e.placement.mode!=="orbit"?null:Re(e.placement.semiMajor??e.placement.distance??null)}function Oi(e){return Math.log(e)/Math.log(2)}function Ai(e,t,n){let r=e?ct(e):null;return r!==null?ft(r-90):Ie(t,n,-Math.PI/2)}function Li(e,t,n,r){let i=Re(lt(e.properties.inner)),o=Re(lt(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.metricSpread>0)return M(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return M(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Pi(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return Ti(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=Ie(r,i,Math.PI/5),f=(c.radius+36)*s.scaleModel.labelMultiplier,p=$e(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=Ie(r,i,Math.PI/6),f=(c.radius+36)*s.scaleModel.labelMultiplier,p=$e(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Ti(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Vi(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,p=-f,h=u,b=M(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-p*.8660254)*b,y:a.y+(f*.5-h*.8660254)*b,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+p*.8660254)*b,y:a.y+(f*.5+h*.8660254)*b,anchorX:a.x,anchorY:a.y}}}function Di(e,t){let n=new Map,r=new Map;for(let c of e){let u=ln(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,p=[],h=n.get(c)??null;for(;h&&!f.has(h);)p.push(h),f.add(h),h=n.get(h)??null;return i.set(c,p),p},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let f=n.get(c)??null,p=t.get(c),h=c;return p?.placement&&p.placement.mode!=="free"&&f&&(h=s(f)),h};for(let c of e){l(c.id);let u=s(c.id),f=ye(u);o.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function ln(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 Fi(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,p)=>{a=Math.min(a,f),l=Math.min(l,p),s=Math.max(s,f),c=Math.max(c,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&an(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&on(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)&&sn(f,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?ve(0,0,0,0):ve(a,l,s,c)}function Ci(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=ln(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function cn(e,t,n){return un(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function un(e,t,n,r,i,o,a,l){let s=Ni(o,a,l),c=s*2,u=i==="above"?18:12,f=i==="above"?8:12,p=e-s,h=e+s;return r==="start"?(p=e,h=e+c):r==="end"&&(p=e-c,h=e),{left:p,right:h,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function Ei(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Vi(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Be(e,t,n){let r=Ri(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return M((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return M(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return M(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return M(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return M(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return M(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return M(8*i,n.minBodyRadius,n.maxBodyRadius)}}function zi(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 Re(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ge;case"m":return e.value/1e3/ge;case"ly":return e.value*Vr;case"pc":return e.value*zr;case"kpc":return e.value*Br;case"re":return e.value*Fr/ge;case"rj":return e.value*Cr/ge;case"sol":return e.value*Er/ge;default:return e.value}}function Bi(e,t){let n=Re(e??null);return n===null||n<=0?0:M(n*96*t.freePlacementMultiplier,0,420)}function Ri(e,t){let n=lt(e);if(!n)return null;let r;switch(n.unit){case"sol":r=M(n.value*22,14,40);break;case"re":r=M(n.value*10,6,18);break;case"km":r=M(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=M(n.value*4,4,20);break}return M(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function lt(e){return!e||typeof e!="object"||!("value"in e)?null:e}function ct(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ie(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Ht(e,t,n,r,i,o,a){let l=dn(e,t,n,r,i,o,a,en);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Jt(s.x)} ${Jt(s.y)}`).join(" ")}function dn(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(fn(e,t,n,r,i,u))}return s}function fn(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=pn(a,l,i);return{x:e+s.x,y:t+s.y}}function pn(e,t,n){let r=ft(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"?Qt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function _e(e,t,n){return t*1e3+e+n*.01}function M(e,t,n){return Math.min(Math.max(e,t),n)}function Kt(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 ye(e){return`${se(e)}-group`}function _i(e){return typeof e=="string"&&e.trim()?e:void 0}function Ni(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 ft(e){return e*Math.PI/180}function Jt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var gn=86400,Ne=gn*365.25,Ue=18,mn=180;function Ge(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,activeEventId:t.activeEventId},r=B(e,n),i=qi(r.layoutPreset,t.spatialScaleModel),o={x:r.contentBounds.centerX,y:r.contentBounds.centerY},a=new Map(r.objects.map(g=>[g.objectId,g])),l=new Map(r.orbitVisuals.map(g=>[g.objectId,g])),s=new Map;for(let g of r.objects){let I=g.object.placement;!I||I.mode!=="orbit"||s.set(g.objectId,mt(I))}let c=Math.min(...[...s.values()].filter(g=>Number.isFinite(g)&&g>0))||1,u=new Map,f=r.objects.map(g=>Ui(g,r,o,a,l,i,u,c)),p=new Map(f.map(g=>[g.objectId,g])),h=r.orbitVisuals.map(g=>Wi(g,p,c,r.activeEventId!==null)),b=f.map(g=>({objectId:g.objectId,center:{...g.position},radius:g.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:Hi(f),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:f,orbits:h,focusTargets:b}}function Ui(e,t,n,r,i,o,a,l){let s=We(e,t,n,r,i,a),c=ht(e.object,i.get(e.objectId),l,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:s,radius:le(e.radius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius),visualRadius:le(e.visualRadius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:c}}function Wi(e,t,n,r){let i=t.get(e.objectId),o=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:o?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??Ye(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??ht(e.object,e,n,r)}}function We(e,t,n,r,i,o){let a=o.get(e.objectId);if(a)return a;let l=e.object.placement,s;if(l?.mode==="orbit"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=i.get(e.objectId),p=ht(e.object,f,1,t.activeEventId!==null),h=p?Yi(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=Ki(u,h)}else if(l?.mode==="surface"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=c?.visualRadius??16,p=Zi(e.objectId),h=p*Math.PI*2;s={x:u.x+Math.cos(h)*(f+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(h)*(f+e.visualRadius*.9)}}else if(l?.mode==="at"&&e.parentId){let c=r.get(e.parentId),u=c?We(c,t,n,r,i,o):{x:0,y:0,z:0},f=e.anchorX??c?.x??n.x,p=e.anchorY??c?.y??n.y;s={x:u.x+(e.x-f),y:u.y,z:u.z+(e.y-p)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return o.set(e.objectId,s),s}function Yi(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=pt(n),i=pt(e.rotationDeg),o=pt(e.inclinationDeg),a=Math.cos(r)*e.semiMajor,l=Math.sin(r)*e.semiMinor,s=a*Math.cos(i)-l*Math.sin(i),c=a*Math.sin(i)+l*Math.cos(i);return{x:s,y:c*Math.sin(o),z:c*Math.cos(o)}}function ht(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let o=t?.radius??t?.rx??le(mt(i)*48,24,1200),a=t?.radius??t?.ry??o,l=Gi(i.period),s=mt(i),c=le(s/Math.max(n,1e-4),1,20),u=le(l?Ue*c:Ue*Math.pow(c,.75),Ue,mn);return{phase0Deg:Ye(i.phase)??0,rotationDeg:Ye(i.angle)??t?.rotationDeg??0,inclinationDeg:Ye(i.inclination)??0,semiMajor:o,semiMinor:a,eccentricity:i.eccentricity??0,periodSeconds:l,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:l===null,frozen:r}}function mt(e){let t=hn(e.semiMajor)??hn(e.distance)??1;return Math.max(t,.01)}function hn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function Gi(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*gn;case"y":return e.value*Ne;case"ky":return e.value*Ne*1e3;case"my":return e.value*Ne*1e6;case"gy":return e.value*Ne*1e9;default:return null}}function Ye(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function qi(e,t){return{...Xi(e),...t}}function Xi(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function Hi(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l of e)t=Math.min(t,l.position.x-l.visualRadius),n=Math.min(n,l.position.y-l.visualRadius),r=Math.min(r,l.position.z-l.visualRadius),i=Math.max(i,l.position.x+l.visualRadius),o=Math.max(o,l.position.y+l.visualRadius),a=Math.max(a,l.position.z+l.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:a,width:i-t,height:o-n,depth:a-r,center:{x:(t+i)/2,y:(n+o)/2,z:(r+a)/2}}}function Ki(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Zi(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function le(e,t,n){return Math.min(Math.max(e,t),n)}function pt(e){return e*Math.PI/180}function gt(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:ro(e.system),info:io(e.system)}:null,r=e.objects.map(Ji);return to(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,theme:e.theme??null,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(Qi),objects:r}}function Ji(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:no(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Qi(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(eo)}}function eo(e){return{objectId:e.objectId,placement:bn(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 bn(e){return e?structuredClone(e):null}function to(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=bn(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 no(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 ro(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 io(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=oo(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 oo(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 yn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,lo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),co=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ce(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function je(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function bt(e,t,n){let r=e.match(yn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=T(n);if(o?.unitFamily&&!Pe(o.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function yt(e){let t=e.match(yn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function qe(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function H(e,t,n){let r=lo.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function wn(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 uo(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(co);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 vn(e,t,n){let r=T(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 H(xe(t,e,n),e,n);case"number":return qe(xe(t,e,n),e,n);case"unit":return bt(xe(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&uo(i,n),i}}}function wt(e,t,n){let r=T(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 xe(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var $n=new Set(["star","planet","moon","asteroid","comet"]),fo=332946.0487,po=1047.3486,Xe=1495978707e-1,mo=6371,ho=695700,go=63241.077,bo=206264.806,yo=206264806;function He(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(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 u=a.get(c);u?n.push(w("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)wo(l,r,n);for(let l of e.system?.viewpoints??[])vo(l,i,o,t,n,r);for(let l of e.objects)Io(l,e.system,r,i,n);for(let l of e.events)$o(l,e.system,r,n);return n}function wo(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 vo(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(a)for(let l of a.groupIds)t.has(l)||i.push(j("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(j("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}ko(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Mo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function Io(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(j("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(j("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(j("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(w("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(j("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(j("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!It(l?.properties.mass)&&i.push(j("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?$n.has(s.type)||i.push(w("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(w("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(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),jo(e,n,i)||i.push(w("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(j("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.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"){i.push(j("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=In(e,l);if(c===null){i.push(j("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(vt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Po(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(j("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=xn(a?.period),u=In(e,l);if(c===null||u===null)continue;let f=Lo(e,"period");Math.abs(c-u)>f&&i.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function $o(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(w("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(j("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(j("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(w("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(w("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(j("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(w("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(j("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(j("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(j("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(w("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(w("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(j("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),xo(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(j("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function xo(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(w("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(w("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(w("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!Oo(r,t,n,e)&&o.push(j("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!Ao(r,t,n,e)&&o.push(j("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!It(i.get(s.target)?.properties.mass)&&o.push(j("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?$n.has(c.type)||o.push(w("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(w("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(w("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(w("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(w("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(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function jo(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 In(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=So(n.semiMajor??n.distance),i=It(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function So(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Xe;case"m":return e.value/(Xe*1e3);case"ly":return e.value*go;case"pc":return e.value*bo;case"kpc":return e.value*yo;case"re":return e.value*mo/Xe;case"sol":return e.value*ho/Xe;default:return null}}function It(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/fo;case"mj":return t.value/po;default:return null}}function xn(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 ko(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Mo(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[f,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||f==="distance"&&p<=0)&&r.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(p)}" in viewpoint "${i}".`,void 0,`${c}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(j("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(j("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(vt("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(j("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(vt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function Oo(e,t,n,r){return K(r?.epoch)??K(n?.epoch)??K(t.epoch)??K(e?.epoch)??null}function Ao(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 Lo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?xn(n)??0:0}function Po(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 j(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function vt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var To=new Set(["climate","habitability","settlement"]),Ze=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=T(e);t&&Ze.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}])Ze.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Do=new Set(Ze.keys()),Sn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function $t(e){return Fo(e)}function Fo(e,t){let n=va(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],f=[],p=[],h=new Map,b=!1,g=!1,I=new Set,S=new Set,m=new Set,x=new Set,D=new Set;for(let A=0;A<r.length;A++){let N=r[A],U=A+1;if(!N.trim())continue;let W=Te(N),P=fe(N.slice(W),{line:U,columnOffset:W});if(P.length!==0){if(!o){a=Co(P,U),o=!0,n.comments.length>0&&Je(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(W===0){s=Eo(P,U,a,i,l,c,u,f,p,h,I,S,m,x,D,{sawDefaults:b,sawAtlas:g}),s.kind==="system"?l=s.system:s.kind==="defaults"?b=!0:s.kind==="atlas"&&(g=!0);continue}if(!s)throw new d("Indented line without parent atlas section",U,W+1);Wo(s,W,P,U)}}if(!o)throw new d('Missing required atlas schema header "schema 2.0"');let _=c.map(A=>ca(A,a,i)),F=p.map(A=>ua(A,h.get(A.id)??[])),G=t??(a==="2.0-draft"?"2.0":a),q={format:"worldorbit",sourceVersion:"1.0",theme:null,system:l,groups:u,relations:f,events:F,objects:_,diagnostics:i};if(G==="2.0-draft"){let A={...q,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...He(A,a)),A}let Q={...q,version:G,schemaVersion:G};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(...He(Q,a)),Q}function Co(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Eo(e,t,n,r,i,o,a,l,s,c,u,f,p,h,b,g){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return Vo(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(g.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(g.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 zo(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 Bo(e,t,i,f);case"group":return V(n,r,"group",{line:t,column:e[0].column}),Ro(e,t,a,p);case"relation":return V(n,r,"relation",{line:t,column:e[0].column}),_o(e,t,l,h);case"event":return V(n,r,"event",{line:t,column:e[0].column}),No(e,t,s,c,b,n,r);case"object":return Uo(e,t,n,r,o);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Vo(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 zo(e,t,n,r,i,o){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let a=ce(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:je(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 Bo(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=ce(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:je(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function Ro(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=ce(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:je(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function _o(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=ce(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 No(e,t,n,r,i,o,a){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let l=ce(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:je(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 Uo(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:sa(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 Wo(e,t,n,r){switch(e.kind){case"system":Yo(e,n,r);return;case"defaults":Go(e,n,r);return;case"atlas":qo(e,t,n,r);return;case"viewpoint":Xo(e,t,n,r);return;case"annotation":Zo(e,n,r);return;case"group":Jo(e,n,r);return;case"relation":Qo(e,n,r);return;case"event":ea(e,t,n,r);return;case"object":na(e,t,n,r);return}}function Yo(e,t,n){let r=Y(t,e.seenFields,n),i=$(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 Go(e,t,n){let r=Y(t,e.seenFields,n),i=$(t,n);switch(r){case"view":Mn(i)&&ne(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=kn(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=On(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 qo(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=An(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 Xo(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){Ho(e,n,r);return}if(e.inFilter){Ko(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??jt();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=Y(n,e.seenFields,r),o=$(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":Mn(o)&&ne(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=kn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=On(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=xt(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=aa(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=ia(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=R(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Ho(e,t,n){let r=Y(t,e.seenCameraFields,n),i=$(t,n),o=e.viewpoint.camera??jt();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=xt(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 Ko(e,t,n){let r=Y(t,e.seenFilterFields,n),i=e.viewpoint.filter??oa();switch(r){case"query":i.query=$(t,n);break;case"objecttypes":i.objectTypes=ra(t.slice(1),n);break;case"tags":i.tags=R(t.slice(1),n,"tags");break;case"groups":i.groupIds=R(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 Zo(e,t,n){switch(Y(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=R(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Jo(e,t,n){switch(Y(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=R(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=H($(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 Qo(e,t,n){switch(Y(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=R(t.slice(1),n,"tags");return;case"color":e.relation.color=$(t,n);return;case"hidden":e.relation.hidden=H($(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 ea(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(ta(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(Y(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=R(n.slice(1),r,"participants");return;case"timing":e.event.timing=$(n,r);return;case"visibility":e.event.visibility=$(n,r);return;case"epoch":ne(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=$(n,r);return;case"referenceplane":ne(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=$(n,r);return;case"tags":e.event.tags=R(n.slice(1),r,"tags");return;case"color":e.event.color=$(n,r);return;case"hidden":e.event.hidden=H($(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 ta(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(!Sn.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 na(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"||To.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=An(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(la(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function Y(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 $(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 ra(e,t){return R(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function ia(e,t,n,r){let i={};for(let o of R(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 R(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 kn(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 Mn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function On(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 xt(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 oa(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function jt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function aa(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}:jt(),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=xt(c,t,a.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function sa(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=Se(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&&!Do.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 Dn(o,n),o}function la(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let o=Se(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 Dn([a],n),a}function An(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 ca(e,t,n){let r=Ln(e.fields),i=Pn(r),o=fa(e.objectType,r),a=ya(r.get("groups")?.[0]),l=Ke(r.get("epoch")?.[0]),s=Ke(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?H(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?ha(r.get("resonance")[0]):void 0,f=ma(r),p=r.get("derive")?.map(x=>ga(x)),h=r.get("validate")?.map(x=>({rule:z(x)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap(x=>x.values))]:void 0,g=r.get("tolerance")?.map(x=>ba(x)),I=pa(e.typedBlockEntries),S=Tn(e.infoEntries,"info"),m={type:e.objectType,id:e.id,properties:o,placement:i,info:S};return a.length>0&&(m.groups=a),l&&(m.epoch=l),s&&(m.referencePlane=s),c!==void 0&&(m.tidalLock=c),u&&(m.resonance=u),f&&(m.renderHints=f),p?.length&&(m.deriveRules=p),h?.length&&(m.validationRules=h),b?.length&&(m.lockedFields=b),g?.length&&(m.tolerances=g),I&&Object.keys(I).length>0&&(m.typedBlocks=I),Je(t,"2.1")&&(m.groups||m.epoch||m.referencePlane||m.tidalLock!==void 0||m.resonance||m.renderHints||m.deriveRules?.length||m.validationRules?.length||m.lockedFields?.length||m.tolerances?.length||m.typedBlocks)&&V(t,n,e.id,e.location),m}function ua(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>da(n))}}function da(e){let t=Ln(e.fields,"event-pose"),n=Pn(t);return{objectId:e.objectId,placement:n,inner:Z(t.get("inner")?.[0],"inner"),outer:Z(t.get("outer")?.[0],"outer"),epoch:Ke(t.get("epoch")?.[0]),referencePlane:Ke(t.get("referencePlane")?.[0])}}function Ln(e,t="object"){let n=new Map;for(let r of e){let i=Se(r.key);if(!i&&!Sn.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 Pn(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:z(t),distance:Z(e.get("distance")?.[0],"distance"),semiMajor:Z(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:wa(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=z(n);return{mode:"at",target:a,reference:wn(a,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let a=z(i),l=yt(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function fa(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=Se(r);!o||!a?.legacySchema||a.legacySchema.placement||(wt(r,e,o.location),n[r]=vn(r,o.values,o.location))}return n}function Tn(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 pa(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Tn(r,n))}return t}function ma(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=H(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=H(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=qe(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function ha(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 ga(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 ba(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=yt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ya(e){return e?[...new Set(e.values)]:[]}function Ke(e){return e&&e.values.join(" ").trim()||null}function Z(e,t){return e?bt(z(e),e.location,t):void 0}function wa(e,t){return e?qe(z(e),t,e.location):void 0}function z(e){return xe(e.values,e.key,e.location)}function Se(e){return Ze.get(e)}function Dn(e,t){for(let n of e){let r=Se(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){wt(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){Je(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){Je(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 Je(e,t){return jn(e)<jn(t)}function jn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3;case"2.6":return 4;default:return 5}}function va(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==="/"&&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==="#"&&!
|
|
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==="#"&&!Ia(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(i)throw d.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function
|
|
6
|
-
`}var
|
|
5
|
+
`?(a++,l=1):l++}if(i)throw d.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function Ia(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 $a=/^schema\s+2(?:\.0|\.1|\.5|\.6)?$/i,xa=/^schema\s+2\.1$/i,ja=/^schema\s+2\.5$/i,Sa=/^schema\s+2\.6$/i,ka=/^schema\s+2\.0-draft$/i;function Fn(e){for(let t of Ma(e).split(/\r?\n/)){let n=t.trim();if(n)return ka.test(n)?"2.0-draft":xa.test(n)?"2.1":ja.test(n)?"2.5":Sa.test(n)?"2.6":$a.test(n)?"2.0":"1.0"}return"1.0"}function Ma(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
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=
|
|
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=Cn(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 Cn(e){let t=Fn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6")return Oa(e,t);let n;try{n=pe(e)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"parse")]}}let r;try{r=me(n)}catch(i){return{ok:!1,value:null,diagnostics:[te(i,"normalize")]}}try{he(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 Oa(e,t){let n;try{n=$t(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=gt(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 Ta={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",spaceFog:"#07131d",starfield:"rgba(226, 239, 255, 0.9)",starfieldDim:"rgba(164, 194, 228, 0.45)",objectSpecular:"#f5f8ff",orbitOpacity:.34,orbitBandOpacity:.24,selectionHalo:"rgba(255, 214, 139, 0.9)",atmosphere:"rgba(143, 202, 255, 0.4)",cometTail:"rgba(193, 243, 255, 0.7)",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",spaceFog:"#071723",starfield:"rgba(220, 255, 245, 0.9)",starfieldDim:"rgba(124, 212, 195, 0.42)",objectSpecular:"#ecfffb",orbitOpacity:.3,orbitBandOpacity:.22,selectionHalo:"rgba(120, 255, 215, 0.85)",atmosphere:"rgba(120, 255, 215, 0.32)",cometTail:"rgba(181, 255, 236, 0.68)",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",spaceFog:"#1c0d12",starfield:"rgba(255, 232, 214, 0.88)",starfieldDim:"rgba(255, 176, 138, 0.38)",objectSpecular:"#fff0e6",orbitOpacity:.3,orbitBandOpacity:.24,selectionHalo:"rgba(255, 178, 125, 0.85)",atmosphere:"rgba(255, 190, 140, 0.26)",cometTail:"rgba(255, 214, 173, 0.62)",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function et(e){return e?typeof e=="string"?Qe[e]??Qe.atlas:{...Qe.atlas,...e}:Qe.atlas}function St(e){return{...Ta,...e}}function tt(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:kt(e.objectTypes??[]),tags:kt((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:kt((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Da(t)?t:null}function Da(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Mt(e,t){let n=tt(t),r=new Set;for(let i of e.objects)if(!i.hidden&&Fa(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 Fa(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=Ca(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function Ca(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 kt(e){return[...new Set(e)]}var Ot="worldorbit-camera-root";function ie(e,t={}){let n=et(t.theme),r=Za(t.preset??e.renderPreset??void 0),i=St({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,a=Mt(e,t.filter??null),l=e.objects.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>i.structures||!nt(m.object)).sort((m,x)=>m.sortKey-x.sortKey),s=e.labels.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>i.structures||!nt(m.object)),c=za(l),u=i.orbits?Va(e,a,i.structures):{back:"",front:""},f=i.guides?e.leaders.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>i.structures||!nt(m.object)).map(m=>`<line class="wo-leader wo-leader-${m.mode}" x1="${m.x1}" y1="${m.y1}" x2="${m.x2}" y2="${m.y2}" data-render-id="${O(m.renderId)}" data-group-id="${L(m.groupId??"")}" />`).join(""):"",p=i.relations?e.relations.filter(m=>!m.hidden).filter(m=>a.has(m.fromObjectId)&&a.has(m.toObjectId)).map(m=>`<line class="wo-relation" x1="${m.x1}" y1="${m.y1}" x2="${m.x2}" y2="${m.y2}" data-render-id="${O(m.renderId)}" data-relation-id="${L(m.relationId)}" />`).join(""):"",h=i.events?e.events.filter(m=>!m.hidden).map(m=>Ea(e,m,a,n)).join(""):"",b=i.objects?l.map(m=>Ba(m,t.selectedObjectId??null,n)).join(""):"",g=i.labels?s.map(m=>Ra(e,m,t.selectedObjectId??null)).join(""):"",I=i.metadata?`<text class="wo-title" x="56" y="64">${O(e.title)}</text>
|
|
9
9
|
<text class="wo-subtitle" x="56" y="88">${O(o)}</text>
|
|
10
|
-
<text class="wo-meta" x="56" y="${e.height-42}">${O(
|
|
10
|
+
<text class="wo-meta" x="56" y="${e.height-42}">${O(Qa(e))}</text>`:"",S=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
|
-
${i.guides?
|
|
12
|
+
${i.guides?Ja(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
13
|
<title id="worldorbit-title">${O(e.title)}</title>
|
|
14
14
|
<desc id="worldorbit-desc">A ${O(e.viewMode)} WorldOrbit render with ${l.length} visible objects.</desc>
|
|
15
15
|
<defs>
|
|
@@ -66,38 +66,38 @@
|
|
|
66
66
|
.wo-object-image { pointer-events: none; }
|
|
67
67
|
</style>
|
|
68
68
|
${S}
|
|
69
|
-
${
|
|
69
|
+
${I}
|
|
70
70
|
<g data-worldorbit-world="true">
|
|
71
71
|
<g data-worldorbit-camera-root="${Ot}" id="${Ot}">
|
|
72
72
|
<g data-worldorbit-world-content="true">
|
|
73
73
|
${i.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
|
|
74
74
|
${i.guides?`<g data-layer-id="guides">${f}</g>`:""}
|
|
75
|
-
${i.relations?`<g data-layer-id="relations">${
|
|
75
|
+
${i.relations?`<g data-layer-id="relations">${p}</g>`:""}
|
|
76
76
|
${i.events?`<g data-layer-id="events">${h}</g>`:""}
|
|
77
|
-
${i.objects?`<g data-layer-id="objects">${
|
|
77
|
+
${i.objects?`<g data-layer-id="objects">${b}</g>`:""}
|
|
78
78
|
${i.orbits?`<g data-layer-id="orbits-front">${u.front}</g>`:""}
|
|
79
79
|
${i.labels?`<g data-layer-id="labels">${g}</g>`:""}
|
|
80
80
|
</g>
|
|
81
81
|
</g>
|
|
82
82
|
</g>
|
|
83
|
-
</svg>`}function
|
|
83
|
+
</svg>`}function Ea(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="${L(o)}" 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)}">
|
|
84
84
|
${l}
|
|
85
85
|
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${L(o)}" />
|
|
86
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
|
|
87
|
+
</g>`}function Va(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!nt(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="${O(o.renderId)}" data-orbit-object-id="${L(o.objectId)}" data-parent-id="${L(o.parentId)}" data-group-id="${L(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 za(e){return e.filter(t=>!!t.imageHref).map(t=>Ua(t)).join("")}function Ba(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=Ya(e,n),f=Na(e),p=f?Vn(r,i,o,a,u,{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
88
|
<circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${l+8}" />
|
|
89
|
-
${
|
|
90
|
-
${
|
|
89
|
+
${_a(e,u)}
|
|
90
|
+
${Vn(r,i,o,a,u)}
|
|
91
91
|
${f}
|
|
92
|
-
${
|
|
93
|
-
</g>`}function
|
|
92
|
+
${p}
|
|
93
|
+
</g>`}function Ra(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="${O(t.objectId)}" data-group-id="${L(t.groupId??"")}" data-render-id="${O(t.renderId)}">
|
|
94
94
|
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${O(t.label)}</text>
|
|
95
95
|
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${O(t.secondaryLabel)}</text>
|
|
96
|
-
</g>`}function
|
|
96
|
+
</g>`}function Vn(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
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="${
|
|
98
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${_n(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="${At(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
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
100
|
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${i.stroke}" stroke-width="1.2" />
|
|
101
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
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="${At(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function
|
|
103
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${At(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function _a(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 Na(e){if(!e.imageHref)return"";let t=Wa(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(Rn(e))})" />`}function Ua(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="${_n(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${At(t,n,r)}" />`;break;default:return""}return`<clipPath id="${L(Rn(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function Wa(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 Ya(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Ga(e.object.type,n,t),i=e.fillColor&&ts(e.fillColor)?e.fillColor:r.fill,o=zn(e.object.properties.albedo),a=zn(e.object.properties.temperature),l=Xa(i,a,o,e.object.type),s=ke(l,"#ffffff",.4)??r.stroke,c=Ka(e.object.properties.atmosphere),u=e.object.type==="star"?Bn(ke(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:u,atmosphere:c,tail:e.object.type==="comet"?Bn(ke(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 qa(t)}}function qa(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 Xa(e,t,n,r){let i=e;if(t!==null){let o=Ha(t,r);i=ke(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=ke(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function Ha(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Ka(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 Za(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 zn(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Rn(e){return`${e.renderId}-clip`}function _n(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function At(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 Ja(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 Qa(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function nt(e){return e.type==="structure"||e.type==="phenomenon"}function ke(e,t,n){let r=Lt(e),i=Lt(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return es({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 Bn(e,t){let n=Lt(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Lt(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 es(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function ts(e){return!!e.trim()}function O(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function L(e){return O(e)}function Nn(e){return encodeURIComponent(JSON.stringify(e))}function Ft(e,t,n={}){return{version:"2.0",mode:Tt(t),scene:e,spatialScene:n.spatialScene,options:{viewMode:n.viewMode??Un(Tt(t)),initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function Ct(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,viewMode:t.viewMode??e.options?.viewMode??Un(Tt(e.mode)),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="${rt(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${n.mode}" data-worldorbit-preset="${rt(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${rt(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${rt(Nn(n))}">${r}</div>`}function rt(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Tt(e){return!e||e==="interactive"?"interactive-2d":e}function Un(e){return e==="interactive-3d"?"3d":"2d"}function ue(e,t={}){try{let n=re(e),r=B(n.document,Wn(n,t)),i=t.mode??"static";if(i==="interactive"||i==="interactive-2d"||i==="interactive-3d"){let o=i==="interactive"?"interactive-2d":i;return Ct(Ft(r,o,{spatialScene:o==="interactive-3d"?Ge(n.document,Wn(n,t)):void 0,viewMode:o==="interactive-3d"?"3d":"2d",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,viewMode:o==="interactive-3d"?"3d":"2d",initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap})}return`<figure class="${bs(t.className??"worldorbit-block worldorbit-static")}">${ie(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Et(n instanceof Error?n.message:String(n))}}function Et(e){return`<pre class="worldorbit-error">WorldOrbit error: ${Yn(e)}</pre>`}function Yn(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}function bs(e){return Yn(e).replaceAll('"',""")}function Wn(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function Gn(e={}){return function(n){qn(n,(r,i,o)=>{!o||i===-1||r.type!=="code"||!ys(r.lang)||(o.children[i]={type:"html",value:ue(r.value??"",e)})})}}function qn(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),qn(o,t,e)}n||t(e,-1,null)}function ys(e){return(e??"").trim().toLowerCase()==="worldorbit"}function Xn(e={}){return function(n){Hn(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"||!ws(a.properties?.className).includes("language-worldorbit"))return;let s=Kn(a);o.children[i]={type:"raw",value:ue(s,e)}})}}function Hn(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),Hn(o,t,e)}n||t(e,-1,null)}function ws(e){return Array.isArray(e)?e.map(t=>String(t)):typeof e=="string"?e.split(/\s+/).filter(Boolean):[]}function Kn(e){return e.type==="text"?e.value??"":(e.children??[]).map(t=>Kn(t)).join("")}return sr(vs);})();
|