@es3d/es3d 1.1.2 → 1.2.1
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/README.md +24 -0
- package/browser/es3d-stage.min.js +243 -10232
- package/browser/es3d.min.js +534 -0
- package/docs/STAGE.md +95 -0
- package/package.json +6 -3
- package/src/browser.js +16 -0
- package/src/cache/geometry-store.js +56 -18
- package/src/geometry/geometry-cache.js +93 -8
- package/src/io/compression.js +4 -1
- package/src/io/convert.js +14 -1
- package/src/pipeline.js +2 -1
- package/src/render/compile-worker.js +143 -0
- package/src/render/frame-builder.js +114 -77
- package/src/render/geometry-pool.js +103 -41
- package/src/render/renderer.js +28 -2
- package/src/render/stage.js +305 -50
- package/src/render/webgl2/webgl2-backend.js +68 -16
- package/src/render/webgpu/webgpu-backend.js +42 -11
- package/src/render/worker-boot.js +14 -0
- package/src/scene/fragments.js +527 -0
- package/src/scene/picking.js +31 -2
- package/src/scene/prepared.js +398 -0
- package/src/scene/scene-graph.js +1 -1
- package/src/scene/scene-set.js +251 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
var e=class{constructor(e,t,n=-1,r=-1,i=-1,a=-1,o=`"`){this.name=e,this.value=t,this.nameStart=n,this.nameEnd=r,this.valueStart=i,this.valueEnd=a,this.quote=o,this.decoded=!1,this.typed=void 0}},t=class{constructor(e,t=-1,n=-1){this.type=`comment`,this.text=e,this.start=t,this.end=n,this.parent=null}},n=class{constructor(e,t=-1){this.type=`element`,this.name=e,this.attrs=[],this.children=[],this.text=null,this.textStart=-1,this.textEnd=-1,this.start=t,this.end=t,this.nameStart=t,this.nameEnd=t,this.openEnd=t,this.closeStart=-1,this.selfClosing=!0,this.uid=0,this.parent=null,this.values=null,this.attrIndex=null}attr(e){for(let t=0;t<this.attrs.length;t++)if(this.attrs[t].name===e)return this.attrs[t].value}attrNode(e){for(let t=0;t<this.attrs.length;t++)if(this.attrs[t].name===e)return this.attrs[t];return null}setAttr(t,n){let r=this.attrNode(t);return r?r.value=String(n):this.attrs.push(new e(t,String(n))),this}removeAttr(e){let t=this.attrs.findIndex(t=>t.name===e);return t>=0&&this.attrs.splice(t,1),this}appendChild(e){return e.parent=this,this.children.push(e),this.selfClosing=!1,e}get elementChildren(){return this.children.filter(e=>e.type===`element`)}get id(){return this.values&&this.values.id!==void 0?this.values.id:this.attr(`id`)}},r=class{constructor({root:e,syntax:t,source:n=null,leading:r=[],trailing:i=[]}){this.root=e,this.syntax=t,this.source=n,this.leading=r,this.trailing=i,this.lineIndex=null,this.diagnostics=[],this.ids=new Map,this.byUid=new Map,this.elementCount=0}get errors(){return this.diagnostics.filter(e=>e.severity===`error`)}get warnings(){return this.diagnostics.filter(e=>e.severity===`warning`)}get ok(){return!this.diagnostics.some(e=>e.severity===`error`)}};function i(e,t,n=null,r=0){if(t(e,n,r)===!1)return;let a=e.children;for(let n=0;n<a.length;n++){let o=a[n];o.type===`element`&&i(o,t,e,r+1)}}function a(e){let t=0;e.byUid.clear();let n=(r,i)=>{r.uid=++t,r.parent=i,e.byUid.set(r.uid,r);for(let e of r.children)e.type===`element`?n(e,r):e.parent=r};return e.root&&n(e.root,null),e.elementCount=t,t}function o(r,i=!1){let a=new n(r.name,i?r.start:-1);for(let t of r.attrs)a.attrs.push(i?Object.assign(new e(t.name,t.value),t):new e(t.name,t.value));a.text=r.text,a.selfClosing=r.selfClosing;for(let e of r.children)e.type===`element`?a.appendChild(o(e,i)):a.appendChild(new t(e.text));return a.selfClosing=r.children.length===0,a}function s(t,r={},...i){let a=new n(t);for(let[t,n]of Object.entries(r))n!=null&&a.attrs.push(new e(t,String(n)));for(let e of i.flat())e!=null&&e!==!1&&(typeof e==`string`?a.text=(a.text||``)+e:a.appendChild(e));return a.selfClosing=a.children.length===0&&a.text===null,a}var c=class{constructor(e){this.text=e,this.lineStarts=null}get starts(){if(!this.lineStarts){let e=[0];for(let t=this.text.indexOf(`
|
|
2
|
+
`);t>=0;t=this.text.indexOf(`
|
|
3
|
+
`,t+1))e.push(t+1);this.lineStarts=e}return this.lineStarts}position(e){let t=this.starts,n=0,r=t.length-1;for(;n<r;){let i=n+r+1>>1;t[i]<=e?n=i:r=i-1}return{line:n+1,column:e-t[n]+1}}lineText(e){let t=this.starts[e-1];if(t===void 0)return``;let n=e<this.starts.length?this.starts[e]-1:this.text.length;return this.text.slice(t,n).replace(/\r$/,``)}offsetOf(e,t){return this.starts[Math.max(0,Math.min(e-1,this.starts.length-1))]+t-1}},l={parse:`Parse`,reference:`Reference`,geometry:`Geometry`,render:`Render`,io:`File`},u=class{constructor(e){this.severity=e.severity||`error`,this.phase=e.phase||`parse`,this.code=e.code||`E_GENERIC`,this.message=e.message,this.offset=e.offset??-1,this.length=e.length??0,this.suggestion=e.suggestion||null,this.hint=e.hint||null,this.path=e.path||null,this.line=e.line??0,this.column=e.column??0,this.uid=e.uid??0}locate(e){if(e&&this.offset>=0){let t=e.position(this.offset);this.line=t.line,this.column=t.column}return this}get title(){let e=l[this.phase]||`Parse`;return this.severity===`warning`?`ES3D ${e} Warning`:this.severity===`info`?`ES3D ${e} Note`:`ES3D ${e} Error`}format(e){let t=[this.title];if(this.line>0?t.push(`line ${this.line}, column ${this.column}`):this.path&&t.push(`at ${this.path}`),t.push(``,this.message),this.suggestion&&t.push(``,`Did you mean: ${this.suggestion}?`),this.hint&&t.push(``,this.hint),e&&this.line>0){let n=e.lineText(this.line);if(n.length<400){let e=String(this.line).padStart(5)+` | `,r=Math.max(1,Math.min(this.length||1,n.length-this.column+1));t.push(``,e+n,` `.repeat(e.length+this.column-1)+`^`.repeat(Math.max(1,r)))}}return t.join(`
|
|
4
|
+
`)}toJSON(){return{severity:this.severity,phase:this.phase,code:this.code,message:this.message,line:this.line,column:this.column,offset:this.offset,length:this.length,suggestion:this.suggestion,hint:this.hint,path:this.path}}},d=class extends Error{constructor(e,t){let n=Array.isArray(e)?e:[e];super(n.length?n[0].format(t):`ES3D Error`),this.name=`ES3DError`,this.diagnostics=n}};function f(e,t,n=1/0){if(e===t)return 0;let r=e.length,i=t.length;if(Math.abs(r-i)>n)return n+1;let a=Array(i+1),o=Array(i+1);for(let e=0;e<=i;e++)a[e]=e;for(let s=1;s<=r;s++){o[0]=s;let r=o[0],c=e.charCodeAt(s-1);for(let e=1;e<=i;e++){let n=c===t.charCodeAt(e-1)?0:1,i=Math.min(a[e]+1,o[e-1]+1,a[e-1]+n);o[e]=i,i<r&&(r=i)}if(r>n)return n+1;let l=a;a=o,o=l}return a[i]}function p(e,t){if(!e)return null;let n=e.toLowerCase(),r=null,i=1/0,a=Math.max(1,Math.min(3,Math.floor(e.length/3)+1));for(let e of t){if(!e)continue;let t=e.toLowerCase();if(t===n)return e;let o=f(n,t,a);o===2&&n.length===t.length&&m(n,t)&&(o=1),o>a&&(t.startsWith(n)&&n.length>=3||n.startsWith(t)&&t.length>=3)&&(o=a),o<=a&&o<i&&(r=e,i=o)}return r}function m(e,t){let n=-1;for(let r=0;r<e.length;r++)if(e[r]!==t[r]){if(n<0)n=r;else return r===n+1&&e[n]===t[r]&&e[r]===t[n]&&e.slice(r+1)===t.slice(r+1)}return!1}var h=class{constructor(e=null){this.lineIndex=e,this.items=[]}add(e){let t=e instanceof u?e:new u(e);return t.locate(this.lineIndex),this.items.push(t),t}error(e,t,n,r,i={}){return this.add({severity:`error`,code:e,message:t,offset:n,length:r,...i})}warning(e,t,n,r,i={}){return this.add({severity:`warning`,code:e,message:t,offset:n,length:r,...i})}get errors(){return this.items.filter(e=>e.severity===`error`)}get warnings(){return this.items.filter(e=>e.severity===`warning`)}get hasErrors(){return this.items.some(e=>e.severity===`error`)}sorted(){return[...this.items].sort((e,t)=>e.offset-t.offset||(e.severity===`error`?-1:1))}},g=Object.freeze({OPEN:`open`,ATTR:`attr`,OPEN_END:`openEnd`,CLOSE:`close`,TEXT:`text`,COMMENT:`comment`,CDATA:`cdata`,PI:`pi`,DOCTYPE:`doctype`,EOF:`eof`}),_=60,v=62,y=47,b=61,x=34,S=39,C=33,w=63;function T(e){return e===32||e===10||e===9||e===13}function E(e){return e>=65&&e<=90||e>=97&&e<=122||e===95||e===58||e>127}function D(e){return E(e)||e>=48&&e<=57||e===45||e===46}var O={lt:`<`,gt:`>`,amp:`&`,quot:`"`,apos:`'`};function k(e,t,n){if(e.indexOf(`&`)<0)return e;let r=``,i=0;for(;i<e.length;){let a=e.indexOf(`&`,i);if(a<0){r+=e.slice(i);break}r+=e.slice(i,a);let o=e.indexOf(`;`,a);(o<0||o-a>12)&&n(`E_BAD_ENTITY`,`Unescaped '&'. Write '&' for a literal ampersand.`,t+a,1);let s=e.slice(a+1,o),c;if(s[0]===`#`){let e=s[1]===`x`||s[1]===`X`?parseInt(s.slice(2),16):parseInt(s.slice(1),10);(!Number.isFinite(e)||e<0||e>1114111)&&n(`E_BAD_ENTITY`,`Invalid character reference '&${s};'.`,t+a,o-a+1),c=String.fromCodePoint(e)}else c=O[s],c===void 0&&n(`E_BAD_ENTITY`,`Unknown entity '&${s};'. Only < > & " ' and numeric references are allowed.`,t+a,o-a+1);r+=c,i=o+1}return r}var A=class{constructor(e,t=null){this.s=e,this.i=0,this.inTag=!1,this.lineIndex=t,this.n=e.length,e.charCodeAt(0)===65279&&(this.i=1)}fail(e,t,n,r=1,i={}){let a=new u({code:e,message:t,offset:n,length:r,...i});throw a.locate(this.lineIndex),new d([a],this.lineIndex)}next(){return this.inTag?this.nextInTag():this.nextContent()}nextContent(){let e=this.s,t=this.i;if(t>=this.n)return{type:g.EOF,start:t,end:t};if(e.charCodeAt(t)!==_){let n=e.indexOf(`<`,t);n<0&&(n=this.n),this.i=n;let r=e.slice(t,n);return{type:g.TEXT,raw:r,text:null,start:t,end:n}}let n=e.charCodeAt(t+1);if(n===C){if(e.startsWith(`<!--`,t)){let n=e.indexOf(`-->`,t+4);return n<0&&this.fail(`E_UNTERMINATED_COMMENT`,`Unterminated comment: missing '-->'.`,t,4),this.i=n+3,{type:g.COMMENT,text:e.slice(t+4,n),start:t,end:n+3}}if(e.startsWith(`<![CDATA[`,t)){let n=e.indexOf(`]]>`,t+9);return n<0&&this.fail(`E_UNTERMINATED_CDATA`,`Unterminated CDATA section: missing ']]>'.`,t,9),this.i=n+3,{type:g.CDATA,text:e.slice(t+9,n),start:t,end:n+3}}if(e.startsWith(`<!DOCTYPE`,t)||e.startsWith(`<!doctype`,t)){let n=e.indexOf(`>`,t);return n<0&&this.fail(`E_UNTERMINATED_DOCTYPE`,`Unterminated DOCTYPE: missing '>'.`,t,9),this.i=n+1,{type:g.DOCTYPE,start:t,end:n+1}}this.fail(`E_SYNTAX`,`Unexpected '<!'. Comments are written <!-- like this -->.`,t,2)}if(n===w){let n=e.indexOf(`?>`,t+2);n<0&&this.fail(`E_UNTERMINATED_PI`,`Unterminated processing instruction: missing '?>'.`,t,2),this.i=n+2;let r=t+2;for(;r<n&&D(e.charCodeAt(r));)r++;return{type:g.PI,target:e.slice(t+2,r),start:t,end:n+2}}if(n===y){let n=t+2,r=n;for(E(e.charCodeAt(r))||this.fail(`E_SYNTAX`,`Expected an element name after '</'.`,r,1);r<this.n&&D(e.charCodeAt(r));)r++;let i=r;for(;r<this.n&&T(e.charCodeAt(r));)r++;return e.charCodeAt(r)!==v&&this.fail(`E_SYNTAX`,`Expected '>' to finish closing tag </${e.slice(n,i)}>.`,r,1),this.i=r+1,{type:g.CLOSE,name:e.slice(n,i),start:t,end:r+1,nameStart:n,nameEnd:i}}let r=t+1;E(n)||this.fail(`E_SYNTAX`,`Unexpected '<'. Element names must start with a letter; write '<' for a literal '<'.`,t,1);let i=r+1;for(;i<this.n&&D(e.charCodeAt(i));)i++;return this.i=i,this.inTag=!0,{type:g.OPEN,name:e.slice(r,i),start:t,nameStart:r,nameEnd:i}}nextInTag(){let e=this.s,t=this.i,n=t<this.n&&T(e.charCodeAt(t));for(;t<this.n&&T(e.charCodeAt(t));)t++;t>=this.n&&this.fail(`E_UNEXPECTED_EOF`,`Unexpected end of file inside a tag: missing '>'.`,t,0);let r=e.charCodeAt(t);if(r===v)return this.i=t+1,this.inTag=!1,{type:g.OPEN_END,selfClosing:!1,start:t,end:t+1};if(r===y)return e.charCodeAt(t+1)!==v&&this.fail(`E_SYNTAX`,`Expected '/>' to close the tag.`,t,1),this.i=t+2,this.inTag=!1,{type:g.OPEN_END,selfClosing:!0,start:t,end:t+2};E(r)||((r===x||r===S)&&this.fail(`E_SYNTAX`,`Unexpected quoted value: an attribute name is missing.`,t,1),r===_&&this.fail(`E_SYNTAX`,`Unexpected '<': the previous tag is missing its '>'.`,t,1),this.fail(`E_SYNTAX`,`Unexpected character '${e[t]}' in tag.`,t,1)),n||this.fail(`E_SYNTAX`,`Attributes must be separated by whitespace.`,t,1);let i=t;for(;t<this.n&&D(e.charCodeAt(t));)t++;let a=t,o=e.slice(i,a);for(;t<this.n&&T(e.charCodeAt(t));)t++;for(e.charCodeAt(t)!==b&&this.fail(`E_SYNTAX`,`Attribute '${o}' has no value. Write ${o}="...".`,i,a-i),t++;t<this.n&&T(e.charCodeAt(t));)t++;let s=e.charCodeAt(t);s!==x&&s!==S&&this.fail(`E_UNQUOTED_ATTRIBUTE`,`The value of attribute '${o}' must be quoted.`,t,1,{hint:`Write ${o}="value".`});let c=t+1,l=e.indexOf(s===x?`"`:`'`,c);l<0&&this.fail(`E_UNTERMINATED_ATTRIBUTE`,`Unterminated value for attribute '${o}': missing closing quote.`,t,1);let u=e.indexOf(`<`,c);u>=0&&u<l&&this.fail(`E_UNTERMINATED_ATTRIBUTE`,`Unterminated value for attribute '${o}': found '<' before the closing quote.`,t,1),this.i=l+1;let d=e.slice(c,l),f=d,p=!1;return d.indexOf(`&`)>=0&&(f=k(d,c,(e,t,n,r)=>this.fail(e,t,n,r)),p=!0),{type:g.ATTR,name:o,nameStart:i,nameEnd:a,value:f,valueStart:c,valueEnd:l,quote:s===x?`"`:`'`,decoded:p}}};A.shapeKeeper=new A(``,null);function j(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n!==32&&n!==10&&n!==9&&n!==13)return!1}return!0}function ee(i,a=new c(i)){let o=new A(i,a),s=(e,t,n,r=1,i={})=>{let o=new u({code:e,message:t,offset:n,length:r,...i});throw o.locate(a),new d([o],a)},l=e=>{let t=a.position(e);return`line ${t.line}, column ${t.column}`},f=[],p=null,m=[],h=[];for(;;){let c=o.next();switch(c.type){case g.EOF:{if(f.length){let e=f[f.length-1];s(`E_UNCLOSED_ELEMENT`,`Unclosed element <${e.name}> (opened at ${l(e.start)}).`,e.start,e.nameEnd-e.start,{hint:`Add </${e.name}> or write <${e.name} ... /> for an element without children.`})}p||s(`E_EMPTY_DOCUMENT`,`Empty document: expected an <es3d> root element.`,c.start,0);let e=new r({root:p,syntax:`xml`,source:i,leading:m,trailing:h});return e.lineIndex=a,e}case g.PI:(p||f.length)&&s(`E_SYNTAX`,`Processing instructions (<?...?>) are only allowed before the root element.`,c.start,2);break;case g.DOCTYPE:(p||f.length)&&s(`E_SYNTAX`,`A DOCTYPE is only allowed before the root element.`,c.start,2);break;case g.COMMENT:{let e=new t(c.text,c.start,c.end);f.length?f[f.length-1].appendChild(e):p?h.push(e):m.push(e);break}case g.TEXT:case g.CDATA:{let e=c.type===g.TEXT?c.raw:c.text;if(j(e))break;if(!f.length){let e=c.start;for(;e<c.end&&/\s/.test(i[e]);)e++;s(`E_TEXT_OUTSIDE_ROOT`,`Text is not allowed outside the root element.`,e,1)}let t=f[f.length-1],n=c.type===g.TEXT?k(e,c.start,(e,t,n,r)=>s(e,t,n,r)):e;t.text===null?(t.text=n,t.textStart=c.start):t.text+=n,t.textEnd=c.end;break}case g.OPEN:{!f.length&&p&&s(`E_MULTIPLE_ROOTS`,`Only one root element is allowed; found a second root <${c.name}>.`,c.start,c.nameEnd-c.start);let t=new n(c.name,c.start);t.nameStart=c.nameStart,t.nameEnd=c.nameEnd;let r=o.next();for(;r.type===g.ATTR;){for(let e of t.attrs)e.name===r.name&&s(`E_DUPLICATE_ATTRIBUTE`,`Duplicate attribute '${r.name}' on <${t.name}>.`,r.nameStart,r.nameEnd-r.nameStart);let n=new e(r.name,r.value,r.nameStart,r.nameEnd,r.valueStart,r.valueEnd,r.quote);n.decoded=r.decoded,t.attrs.push(n),r=o.next()}t.openEnd=r.end,f.length?f[f.length-1].appendChild(t):p=t,r.selfClosing?(t.selfClosing=!0,t.end=r.end):(t.selfClosing=!1,f.push(t));break}case g.CLOSE:{f.length||s(`E_UNEXPECTED_CLOSE`,`Unexpected closing tag </${c.name}>: no element is open.`,c.start,c.end-c.start);let e=f[f.length-1];if(e.name!==c.name){let t=f.findIndex(e=>e.name===c.name);s(`E_MISMATCHED_TAG`,`Mismatched closing tag: expected </${e.name}> (opened at ${l(e.start)}) but found </${c.name}>.`,c.start,c.end-c.start,t>=0?{hint:`<${e.name}> is not closed before </${c.name}>.`}:{})}f.pop(),e.closeStart=c.start,e.end=c.end;break}default:s(`E_SYNTAX`,`Unexpected token.`,c.start,1)}}}var M=Object.freeze({NAME:`name`,ID:`id`,REF:`ref`,EQ:`eq`,VALUE:`value`,STRING:`string`,LBRACE:`lbrace`,RBRACE:`rbrace`,SEMI:`semi`,COMMENT:`comment`,EOF:`eof`});function N(e){return e===32||e===10||e===9||e===13}function te(e){return e>=65&&e<=90||e>=97&&e<=122||e===95}function ne(e){return te(e)||e>=48&&e<=57||e===45||e===46||e===58}function re(e){return N(e)||e===123||e===125||e===59||e===34}var ie=class{constructor(e,t=null){this.s=e,this.n=e.length,this.i=+(e.charCodeAt(0)===65279),this.lineIndex=t,this.afterEq=!1}fail(e,t,n,r=1,i={}){let a=new u({code:e,message:t,offset:n,length:r,...i});throw a.locate(this.lineIndex),new d([a],this.lineIndex)}readQuoted(e){let t=this.s,n=e+1,r=``,i=n;for(;;){n>=this.n&&this.fail(`E_UNTERMINATED_STRING`,`Unterminated string: missing closing quote.`,e,1);let a=t.charCodeAt(n);if(a===34)break;if(a===92){r+=t.slice(i,n);let e=t[n+1];e===`"`||e===`\\`?r+=e:e===`n`?r+=`
|
|
5
|
+
`:e===`t`?r+=` `:this.fail(`E_BAD_ESCAPE`,`Unknown escape sequence '\\${e??``}'. Use \\" \\\\ \\n or \\t.`,n,2),n+=2,i=n}else n++}return r+=t.slice(i,n),{value:r,end:n+1,escaped:i!==e+1}}next(){let e=this.s,t=this.i;for(;t<this.n&&N(e.charCodeAt(t));)t++;if(t>=this.n)return this.i=t,this.afterEq&&this.fail(`E_MISSING_VALUE`,`Expected a value after '='.`,t,0),{type:M.EOF,start:t,end:t};let n=e.charCodeAt(t),r=t;if(this.afterEq){if(this.afterEq=!1,n===34){let e=this.readQuoted(t);return this.i=e.end,{type:M.VALUE,value:e.value,start:r,end:e.end,valueStart:r+1,valueEnd:e.end-1,quote:`"`,escaped:e.escaped}}for((n===123||n===125||n===59)&&this.fail(`E_MISSING_VALUE`,`Expected a value after '='.`,t,1);t<this.n&&!re(e.charCodeAt(t));)t++;return this.i=t,{type:M.VALUE,value:e.slice(r,t),start:r,end:t,valueStart:r,valueEnd:t,quote:``}}if(n===47){let n=e.charCodeAt(t+1);if(n===47){let n=e.indexOf(`
|
|
6
|
+
`,t);return n<0&&(n=this.n),this.i=n,{type:M.COMMENT,text:e.slice(t+2,n).replace(/\r$/,``),start:r,end:n,line:!0}}if(n===42){let n=e.indexOf(`*/`,t+2);return n<0&&this.fail(`E_UNTERMINATED_COMMENT`,`Unterminated comment: missing '*/'.`,t,2),this.i=n+2,{type:M.COMMENT,text:e.slice(t+2,n),start:r,end:n+2,line:!1}}}switch(n){case 123:return this.i=t+1,{type:M.LBRACE,start:r,end:t+1};case 125:return this.i=t+1,{type:M.RBRACE,start:r,end:t+1};case 59:return this.i=t+1,{type:M.SEMI,start:r,end:t+1};case 61:return this.i=t+1,this.afterEq=!0,{type:M.EQ,start:r,end:t+1};case 34:{let e=this.readQuoted(t);return this.i=e.end,{type:M.STRING,value:e.value,start:r,end:e.end,valueStart:r+1,valueEnd:e.end-1}}case 35:case 64:{let i=t+1;for(te(e.charCodeAt(i))||this.fail(`E_SYNTAX`,n===35?`Expected an id after '#'.`:`Expected a reference id after '@'.`,t,1);i<this.n&&ne(e.charCodeAt(i));)i++;return this.i=i,{type:n===35?M.ID:M.REF,value:e.slice(t+1,i),start:r,end:i}}}if(te(n)){let n=t+1;for(;n<this.n&&ne(e.charCodeAt(n));)n++;return this.i=n,{type:M.NAME,value:e.slice(t,n),start:r,end:n}}this.fail(`E_SYNTAX`,`Unexpected character '${e[t]}'.`,t,1)}},ae=new Set([`es3d`,`v3d`]);function oe(i,a=new c(i)){let o=new ie(i,a),s=[],l=(e=0)=>{for(;s.length<=e;)s.push(o.next());return s[e]},f=()=>s.length?s.shift():o.next(),p=(e,t,n,r=1,i={})=>{let o=new u({code:e,message:t,offset:n,length:r,...i});throw o.locate(a),new d([o],a)},m=e=>{let t=a.position(e);return`line ${t.line}, column ${t.column}`};function h(t){let n=t.nameEnd;for(;;){let r=l();if(r.type===M.ID||r.type===M.REF){f();let i=r.type===M.ID?`id`:`ref`;t.attrNode(i)&&p(`E_DUPLICATE_ATTRIBUTE`,`Duplicate attribute '${i}' on ${t.name}.`,r.start,r.end-r.start),t.attrs.push(new e(i,r.value,r.start,r.start+1,r.start+1,r.end,r.type===M.ID?`#`:`@`)),n=r.end}else if(r.type===M.STRING)f(),t.text!==null&&p(`E_SYNTAX`,`${t.name} already has text content.`,r.start,r.end-r.start),t.text=r.value,t.textStart=r.start,t.textEnd=r.end,n=r.end;else if(r.type===M.NAME&&l(1).type===M.EQ){f(),f();let i=f();i.type!==M.VALUE&&p(`E_MISSING_VALUE`,`Expected a value for attribute '${r.value}'.`,i.start,1);for(let e of t.attrs)e.name===r.value&&p(`E_DUPLICATE_ATTRIBUTE`,`Duplicate attribute '${r.value}' on ${t.name}.`,r.start,r.end-r.start);let a=new e(r.value,i.value,r.start,r.end,i.valueStart,i.valueEnd,i.quote);a.decoded=!!i.escaped,t.attrs.push(a),n=i.end}else break}t.openEnd=n}function g(e,n){for(;;){let r=l();if(r.type===M.EOF){n&&p(`E_UNCLOSED_ELEMENT`,`Unclosed block of '${e.name}' (opened at ${m(n.start)}): missing '}'.`,n.start,1);return}if(r.type===M.RBRACE){n||p(`E_UNEXPECTED_CLOSE`,`Unexpected '}': no block is open.`,r.start,1),f(),e.closeStart=r.start,e.end=r.end;return}r.type===M.SEMI?f():r.type===M.COMMENT?(f(),e.appendChild(new t(r.text,r.start,r.end))):r.type===M.NAME?(l(1).type===M.EQ&&p(`E_SYNTAX`,`Attribute '${r.value}' must follow an element name.`,r.start,r.end-r.start,{hint:`Attributes belong to the element written before them on the same statement.`}),e.appendChild(_())):(r.type===M.LBRACE&&p(`E_SYNTAX`,`Unexpected '{': a block must follow an element name.`,r.start,1),(r.type===M.STRING||r.type===M.ID||r.type===M.REF)&&p(`E_SYNTAX`,`Expected an element name.`,r.start,r.end-r.start),p(`E_SYNTAX`,`Unexpected token.`,r.start,Math.max(1,r.end-r.start)))}}function _(){let e=f(),t=new n(e.value,e.start);if(t.nameStart=e.start,t.nameEnd=e.end,h(t),t.end=t.openEnd,l().type===M.LBRACE){let e=f();t.selfClosing=!1,g(t,e)}else t.selfClosing=!0;return t}let v=[];for(;l().type===M.COMMENT||l().type===M.SEMI;){let e=f();e.type===M.COMMENT&&v.push(new t(e.text,e.start,e.end))}let y=l();y.type===M.EOF&&p(`E_EMPTY_DOCUMENT`,`Empty document: expected 'es3d version=1'.`,y.start,0),y.type===M.NAME&&ae.has(y.value)||p(`E_COMPACT_ROOT`,`An ES3D compact document must start with the root element 'es3d'.`,y.start,Math.max(1,y.end-y.start),{hint:`Begin the file with: es3d version=1`});let b=f(),x=new n(b.value,b.start);x.nameStart=b.start,x.nameEnd=b.end,h(x),x.end=x.openEnd;let S=[];if(l().type===M.LBRACE){let e=f();for(x.selfClosing=!1,g(x,e);;){let e=l();if(e.type===M.EOF)break;e.type===M.COMMENT?(f(),S.push(new t(e.text,e.start,e.end))):e.type===M.SEMI?f():p(`E_MULTIPLE_ROOTS`,`Content after the end of the root block.`,e.start,Math.max(1,e.end-e.start))}}else x.headerForm=!0,g(x,null),x.selfClosing=x.children.length===0,x.end=i.length;let C=new r({root:x,syntax:`compact`,source:i,leading:v,trailing:S});return C.lineIndex=a,C}var se=1e5,ce=1e6,le={id:{type:`id`,desc:`Unique identifier, referenced by <use ref>, material="…" and path="…".`},name:{type:`string`,desc:`Human readable label shown in tools.`}},ue={transform:{type:`transform`,alias:`t`,desc:`SVG-style transform list; applied outside position/rotation/scale.`},position:{type:`vec3`,alias:`p`,default:[0,0,0],desc:`Translation x,y,z.`},rotation:{type:`vec3`,alias:`rot`,default:[0,0,0],desc:`Euler angles in degrees, applied about X, then Y, then Z.`},scale:{type:`scale3`,alias:`sc`,default:[1,1,1],desc:`Uniform scale or x,y,z.`},visible:{type:`bool`,default:!0,desc:`When false the element and its children are not rendered.`}},de={material:{type:`ref`,ref:`material`,alias:`m`,desc:`Material id. Inherited by descendants, like SVG fill.`},color:{type:`color`,alias:`c`,desc:`Base colour override. Inherited by descendants.`}},P={...le,...ue,...de,collide:{type:`bool`,default:!0,desc:`When false the camera may pass through the element and its children (see <controls collide>).`}},fe={d:{type:`path2d`,desc:`SVG path data in the local XY plane (y up): M L H V C S Q T A Z.`},path:{type:`ref`,ref:`path`,desc:`Id of a <path> element whose d is used.`},fillRule:{type:`enum`,values:[`nonzero`,`evenodd`],default:`nonzero`,desc:`How nested contours become holes (SVG fill-rule).`}},pe={exclusiveMin:0};function me(e,t,n,r=t=>e[t]!==void 0){!r(`d`)&&!r(`path`)?t(null,`Missing path data: give either d="…" or path="id".`,`E_MISSING_ATTRIBUTE`):r(`d`)&&r(`path`)&&t(`path`,`Give either d or path, not both.`,`E_CONFLICTING_ATTRIBUTES`)}var he=[`box`,`sphere`,`cylinder`,`cone`,`capsule`,`plane`,`torus`,`line`,`polyline`,`polygon`,`path`,`extrude`,`revolve`,`sweep`,`gear`,`mesh`],ge=[`group`,`repeat`,`scatter`,`lod`],_e=[...he,...ge,`use`,`light`,`camera`,`material`],ve={es3d:{category:`root`,children:[`title`,`desc`,`defs`,`scene`,`environment`,`controls`,..._e],desc:`Root element of an ES3D document.`,attrs:{version:{type:`string`,required:!0,desc:`Format version; this implementation reads version 1.`},unit:{type:`enum`,values:[`m`,`cm`,`mm`,`km`,`in`,`ft`],default:`m`,desc:`Length unit (informative).`},xmlns:{type:`string`,desc:`Optional. Ignored if present. A namespace is not required.`},name:le.name},check(e,t){e.version!==void 0&&!/^1(\.\d+)?$/.test(String(e.version).trim())&&t(`version`,`Unsupported ES3D version '${e.version}'. This reader supports version 1.`,`E_VERSION`)}},title:{category:`meta`,children:`text`,desc:`Document title.`,attrs:{}},desc:{category:`meta`,children:`text`,desc:`Free text description.`,attrs:{}},defs:{category:`defs`,children:[..._e],desc:`Definitions that are not rendered directly; referenced with <use ref>.`,attrs:{}},scene:{category:`container`,children:[..._e,`environment`,`controls`],desc:`Optional wrapper for scene content; behaves like a group.`,attrs:{...P}},environment:{category:`meta`,children:[],desc:`Background and ambient (hemisphere) lighting.`,attrs:{background:{type:`color`,default:[.09,.1,.12,1],desc:`Clear colour.`},sky:{type:`color`,default:[.8,.86,.95,1],desc:`Ambient light colour from above.`},ground:{type:`color`,default:[.25,.22,.2,1],desc:`Ambient light colour from below.`},intensity:{type:`number`,min:0,default:.5,desc:`Ambient / environment intensity.`},exposure:{type:`number`,exclusiveMin:0,default:1,desc:`Tone mapping exposure.`}}},controls:{category:`meta`,children:[],desc:`How a viewer lets people move the camera: orbit limits, collision with the scene, or a camera driven by page scroll.`,attrs:{mode:{type:`enum`,values:[`orbit`,`scroll`,`none`],default:`orbit`,desc:`orbit: drag to orbit, pan and zoom. scroll: the first camera follows its scroll-timeline animations and dragging is off. none: a fixed view.`},zoom:{type:`bool`,default:!0,desc:`Allow zooming (orbit mode).`},pan:{type:`bool`,default:!0,desc:`Allow panning (orbit mode).`},minDistance:{type:`number`,...pe,desc:`Closest the camera may get to its target.`},maxDistance:{type:`number`,...pe,desc:`Farthest the camera may get from its target.`},minPolar:{type:`angle`,min:0,max:180,default:0,desc:`Smallest angle between the view from the target and straight up, in degrees (0 = from directly above).`},maxPolar:{type:`angle`,min:0,max:180,default:180,desc:`Largest angle from straight up, in degrees (90 = never below the target).`},targetMin:{type:`vec3`,desc:`Lower corner of the box the orbit target must stay in (limits panning).`},targetMax:{type:`vec3`,desc:`Upper corner of the box the orbit target must stay in.`},collide:{type:`bool`,default:!1,desc:`Stop the camera at surfaces instead of letting it pass into objects. Elements with collide="false" are ignored.`}},check(e,t,n,r=t=>e[t]!==void 0){e.minDistance!==void 0&&e.maxDistance!==void 0&&e.maxDistance<e.minDistance&&t(`maxDistance`,`maxDistance must not be smaller than minDistance.`,`E_RANGE`),e.minPolar!==void 0&&e.maxPolar!==void 0&&e.maxPolar<e.minPolar&&t(`maxPolar`,`maxPolar must not be smaller than minPolar.`,`E_RANGE`),r(`targetMin`)!==r(`targetMax`)&&t(r(`targetMin`)?`targetMin`:`targetMax`,`Give both targetMin and targetMax.`,`E_MISSING_ATTRIBUTE`),e.targetMin&&e.targetMax&&e.targetMin.some((t,n)=>t>e.targetMax[n])&&t(`targetMax`,`targetMax must not be smaller than targetMin on any axis.`,`E_RANGE`)}},material:{category:`resource`,children:[],desc:`Minimal physically based material (metallic/roughness).`,attrs:{...le,color:{type:`color`,alias:`c`,default:[.8,.8,.8,1],desc:`Base colour (sRGB).`},metallic:{type:`number`,min:0,max:1,default:0,desc:`0 = dielectric, 1 = metal.`},roughness:{type:`number`,min:0,max:1,default:.5,desc:`0 = mirror, 1 = fully rough.`},opacity:{type:`number`,min:0,max:1,default:1,desc:`Alpha; values below 1 are blended.`},emissive:{type:`color`,default:[0,0,0,1],desc:`Emitted colour.`},emissiveIntensity:{type:`number`,min:0,default:1,desc:`Multiplier for emissive.`},map:{type:`texture`,desc:`Base colour texture: image URL or checker(), grid(), stripes(), noise(), bricks().`},normalMap:{type:`normalTexture`,desc:`Normal map: image URL or bumps(), tiles(), noise(), waves(), bricks().`},normalScale:{type:`number`,default:1,desc:`Normal map strength.`},uvScale:{type:`vec2`,default:[1,1],desc:`Texture repeat in u and v.`},doubleSided:{type:`bool`,default:!1,desc:`Render back faces too.`},unlit:{type:`bool`,default:!1,desc:`Ignore lighting; output the base colour.`},occlusionMap:{type:`texture`,desc:`Occlusion texture. The red channel darkens indirect light. Image URL or a procedural texture.`},occlusionStrength:{type:`number`,min:0,max:1,default:1,desc:`Strength of occlusionMap. 0 disables it, 1 uses the texture as stored.`},metallicRoughnessMap:{type:`texture`,desc:`Packed texture: green multiplies roughness, blue multiplies metallic.`},emissiveMap:{type:`texture`,desc:`sRGB texture multiplied with emissive.`},alphaMode:{type:`enum`,values:[`auto`,`opaque`,`mask`,`blend`],default:`auto`,desc:`auto blends when opacity is below 1 and is opaque otherwise. mask discards fragments below alphaCutoff. blend uses opacity as coverage. opaque ignores alpha.`},alphaCutoff:{type:`number`,min:0,max:1,default:.5,desc:`Mask threshold.`}}},group:{category:`container`,children:[..._e,`animate`],desc:`Groups children under a common transform and style.`,attrs:{...P}},use:{category:`instance`,children:[`animate`],desc:`Instantiates the element with the given id (like SVG <use>).`,attrs:{...P,ref:{type:`ref`,ref:`node`,required:!0,alias:`href`,desc:`Id of the element to instantiate.`}}},repeat:{category:`container`,children:[..._e,`animate`],desc:`Repeats its children count times; copy i is transformed by step applied i times.`,attrs:{...P,count:{type:`int`,alias:`n`,required:!0,min:0,max:ce,desc:`Number of copies.`},step:{type:`transform`,required:!0,desc:`Transform applied cumulatively between copies.`}}},scatter:{category:`container`,children:[..._e,`animate`],desc:`Deterministic pseudo-random or grid placement of its children (seeded mulberry32).`,attrs:{...P,count:{type:`int`,alias:`n`,min:0,max:ce,desc:`Number of random copies (random layout).`},grid:{type:`count2`,desc:`Grid layout nx,nz (instead of count).`},spacing:{type:`vec2`,default:[1,1],desc:`Grid cell size x,z.`},area:{type:`size2`,desc:`Random layout: rectangle width,depth centred at the origin (XZ plane).`},radius:{type:`number`,...pe,desc:`Random layout: disc radius (XZ plane).`},seed:{type:`int`,default:1,min:0,desc:`Random seed.`},jitter:{type:`number`,min:0,max:1,default:0,desc:`Grid layout: random offset as a fraction of the cell.`},randomScale:{type:`range3`,desc:`Per-copy scale: a range (uniform, e.g. 0.8..1.2) or x,y,z ranges.`},randomRotation:{type:`range3`,uniform:!1,desc:`Per-copy Euler ranges in degrees, e.g. 0,0..360,0.`},randomMaterial:{type:`idlist`,ref:`material`,desc:`Per-copy material chosen from this list of ids.`}},check(e,t,n,r=t=>e[t]!==void 0){let i=r(`grid`),a=r(`count`);i&&a?t(`grid`,`Give either count (random layout) or grid (grid layout), not both.`,`E_CONFLICTING_ATTRIBUTES`):!i&&!a&&t(null,`scatter needs count="…" (random layout) or grid="nx,nz" (grid layout).`,`E_MISSING_ATTRIBUTE`),a&&!r(`area`)&&!r(`radius`)&&t(null,`Random scatter needs area="w,d" or radius="r".`,`E_MISSING_ATTRIBUTE`),r(`area`)&&r(`radius`)&&t(`radius`,`Give either area or radius, not both.`,`E_CONFLICTING_ATTRIBUTES`),e.area&&(e.area[0]<0||e.area[1]<0)&&t(`area`,`area must not be negative.`,`E_RANGE`),e.randomScale&&e.randomScale.ranges.some(e=>e[0]<0)&&t(`randomScale`,`Scale ranges must not be negative.`,`E_RANGE`)}},lod:{category:`container`,children:[..._e,`animate`],desc:`Level of detail switch: child i is shown while the camera distance is below distances[i].`,attrs:{...P,distances:{type:`numbers`,required:!0,desc:`Increasing switch distances; one fewer than the number of children.`}},check(e,t,n){let r=e.distances;if(!r)return;for(let e=1;e<r.length;e++)r[e]<=r[e-1]&&t(`distances`,`distances must be strictly increasing.`,`E_RANGE`);r.some(e=>e<=0)&&t(`distances`,`distances must be positive.`,`E_RANGE`);let i=n.children.filter(e=>e.type===`element`&&e.name!==`animate`).length;i!==r.length+1&&t(`distances`,`lod has ${i} children but ${r.length} distances; it needs exactly one distance fewer than children.`,`E_LOD_CHILDREN`)}},animate:{category:`anim`,children:[],desc:`Animates a transform of its parent (position, rotation, scale; target and fov of a camera) over time or over page scroll.`,attrs:{attr:{type:`enum`,values:[`position`,`rotation`,`scale`,`target`,`fov`],required:!0,desc:`Animated attribute. target and fov apply to <camera> only.`},from:{type:`animValue`,desc:`Start value (defaults to the parent value).`},to:{type:`animValue`,desc:`End value.`},values:{type:`keyframes`,desc:`Key values separated by semicolons, e.g. 0,1,0; 2,1,0; 2,3,0 (instead of from/to).`},keyTimes:{type:`numbers`,desc:`Progress (0 to 1) at which each of values is reached; evenly spaced when omitted.`},along:{type:`spine`,desc:`Path to move along at constant speed (position and target): x,y,z points, 3D path data or helix().`},smooth:{type:`bool`,default:!1,desc:`Pass through values or along points on a smooth (centripetal Catmull-Rom) curve.`},dur:{type:`duration`,desc:`Duration of one cycle, e.g. 4s or 500ms (required unless timeline="scroll").`},begin:{type:`duration`,default:0,min:0,desc:`Delay before the animation starts.`},repeat:{type:`repeatCount`,default:1/0,desc:`Number of cycles or 'indefinite'.`},alternate:{type:`bool`,default:!1,desc:`Play every second cycle backwards.`},easing:{type:`enum`,values:[`linear`,`ease-in`,`ease-out`,`ease-in-out`],default:`linear`,desc:`Timing function.`},timeline:{type:`enum`,values:[`time`,`scroll`],default:`time`,desc:`time: plays by the clock. scroll: progress follows page scroll from 0 to 1 (dur, begin, repeat and alternate are not used).`}},check(e,t,n,r=t=>e[t]!==void 0){let i=[`to`,`values`,`along`].filter(e=>r(e));i.length?i.length>1&&t(i[1],`Give only one of to, values and along (found ${i.join(` and `)}).`,`E_CONFLICTING_ATTRIBUTES`):t(null,`animate needs to="…", values="…" or along="…".`,`E_MISSING_ATTRIBUTE`),r(`from`)&&(r(`values`)||r(`along`))&&t(`from`,`from is only used with to.`,`E_CONFLICTING_ATTRIBUTES`),e.timeline!==`scroll`&&!r(`dur`)&&t(null,`animate requires the attribute 'dur' (or timeline="scroll").`,`E_MISSING_ATTRIBUTE`),e.dur!==void 0&&e.dur<=0&&t(`dur`,`dur must be positive.`,`E_RANGE`);let a=n&&n.parent;(e.attr===`target`||e.attr===`fov`)&&a&&a.name!==`camera`&&t(`attr`,`attr="${e.attr}" can only animate a <camera>.`,`E_INVALID_VALUE`),e.attr===`target`&&a&&a.name===`camera`&&a.attrIndex&&a.attrIndex.rotation&&t(`attr`,`This camera is oriented by rotation; give it a target instead to animate the target.`,`E_CONFLICTING_ATTRIBUTES`),r(`along`)&&e.attr&&e.attr!==`position`&&e.attr!==`target`&&t(`along`,`along can only move position or target.`,`E_INVALID_VALUE`);let o=e.attr===`scale`?[1,3]:e.attr===`fov`?[1,1]:[3,3],s=`${e.attr||`value`} animation values need ${o[0]===o[1]?o[0]:`1 or 3`} number${o[1]===1?``:`s`}`;for(let n of[`from`,`to`])e[n]!==void 0&&!o.includes(e[n].length)&&t(n,`${s}.`,`E_TYPE`);if(e.values){e.values.length<2&&t(`values`,`values needs at least 2 key values.`,`E_RANGE`);let n=e.values.findIndex(e=>!o.includes(e.length));n>=0&&t(`values`,`${s}; key value ${n+1} has ${e.values[n].length}.`,`E_TYPE`)}r(`keyTimes`)&&!r(`values`)&&t(`keyTimes`,`keyTimes needs values.`,`E_MISSING_ATTRIBUTE`);let c=e.keyTimes;c&&e.values&&(c.length===e.values.length?c[0]!==0||c[c.length-1]!==1?t(`keyTimes`,`keyTimes must start at 0 and end at 1.`,`E_RANGE`):c.some((e,t)=>t>0&&e<c[t-1])&&t(`keyTimes`,`keyTimes must not decrease.`,`E_RANGE`):t(`keyTimes`,`keyTimes has ${c.length} entries but values has ${e.values.length}.`,`E_RANGE`))}},camera:{category:`camera`,children:[`animate`],desc:`Perspective or orthographic camera. The first camera is the initial view.`,attrs:{...le,transform:ue.transform,position:{type:`vec3`,alias:`p`,default:[0,0,10],desc:`Eye position.`},rotation:{type:`vec3`,alias:`rot`,desc:`Euler orientation (used when no target is given; the camera looks down -Z).`},target:{type:`vec3`,desc:`Point the camera looks at.`},up:{type:`vec3`,default:[0,1,0],desc:`Up vector.`},type:{type:`enum`,values:[`perspective`,`orthographic`],default:`perspective`,desc:`Projection.`},fov:{type:`angle`,min:1,max:179,default:45,desc:`Vertical field of view in degrees (perspective).`},height:{type:`number`,...pe,default:10,desc:`Visible height (orthographic).`},near:{type:`number`,...pe,desc:`Near clip distance (automatic when omitted).`},far:{type:`number`,...pe,desc:`Far clip distance (automatic when omitted).`},aspect:{type:`number`,...pe,default:1,desc:`Width / height of the view the author framed (e.g. 1.778 for 16:9). fov is the vertical angle at this aspect ratio.`},fit:{type:`enum`,values:[`contain`,`cover`,`width`,`height`],default:`contain`,desc:`How the framed view adapts to other screens: contain keeps all of it visible, cover fills the screen, width and height keep that extent fixed.`}},check(e,t){e.near!==void 0&&e.far!==void 0&&e.far<=e.near&&t(`far`,`far must be greater than near.`,`E_RANGE`),e.target!==void 0&&e.rotation!==void 0&&t(`rotation`,`Give either target or rotation, not both.`,`E_CONFLICTING_ATTRIBUTES`)}},light:{category:`light`,children:[`animate`],desc:`Directional, point, spot, ambient or hemisphere light.`,attrs:{...le,transform:ue.transform,position:{type:`vec3`,alias:`p`,default:[0,0,0],desc:`Light position (point/spot).`},rotation:ue.rotation,visible:ue.visible,type:{type:`enum`,values:[`directional`,`point`,`spot`,`ambient`,`hemisphere`],required:!0,desc:`Light kind.`},color:{type:`color`,alias:`c`,default:[1,1,1,1],desc:`Light colour.`},intensity:{type:`number`,min:0,default:1,desc:`Intensity multiplier.`},direction:{type:`vec3`,alias:`dir`,desc:`Direction the light travels (directional/spot).`},target:{type:`vec3`,desc:`Point the light aims at (alternative to direction).`},range:{type:`number`,min:0,default:0,desc:`Point/spot cut-off distance (0 = unlimited).`},angle:{type:`angle`,min:1,max:179,default:45,desc:`Spot cone angle in degrees.`},penumbra:{type:`number`,min:0,max:1,default:.2,desc:`Spot edge softness.`},groundColor:{type:`color`,default:[.25,.22,.2,1],desc:`Hemisphere light colour from below.`}},check(e,t){e.direction&&Math.hypot(...e.direction)<1e-12&&t(`direction`,`direction must not be the zero vector.`,`E_RANGE`),e.direction!==void 0&&e.target!==void 0&&t(`target`,`Give either direction or target, not both.`,`E_CONFLICTING_ATTRIBUTES`)}},box:{category:`shape`,children:[`animate`],desc:`Axis aligned box centred at the origin, optionally with rounded edges.`,attrs:{...P,size:{type:`size3`,alias:`s`,default:[1,1,1],desc:`Edge lengths (one value for a cube).`},radius:{type:`number`,alias:`r`,min:0,default:0,desc:`Edge rounding radius.`},segments:{type:`int`,min:1,max:32,desc:`Rounding segments (automatic when omitted).`}},check(e,t){e.size&&e.size.some(e=>e<=0)&&t(`size`,`size must be positive.`,`E_RANGE`),e.size&&e.radius>0&&e.radius*2>Math.min(...e.size)+1e-12&&t(`radius`,`radius ${e.radius} is larger than half the smallest edge (${Math.min(...e.size)/2}).`,`E_RANGE`)}},sphere:{category:`shape`,children:[`animate`],desc:`Sphere centred at the origin.`,attrs:{...P,radius:{type:`number`,alias:`r`,...pe,default:.5,desc:`Radius.`},segments:{type:`int`,min:3,max:512,desc:`Fixed tessellation (automatic level of detail when omitted).`}}},cylinder:{category:`shape`,children:[`animate`],desc:`Cylinder (or truncated cone) along Y, centred at the origin.`,attrs:{...P,radius:{type:`number`,alias:`r`,...pe,default:.5,desc:`Bottom radius (and top radius unless radiusTop is set).`},radiusTop:{type:`number`,min:0,desc:`Top radius.`},height:{type:`number`,alias:`h`,...pe,default:1,desc:`Height.`},segments:{type:`int`,min:3,max:512,desc:`Fixed number of sides, e.g. 6 for a hexagonal prism.`},caps:{type:`bool`,default:!0,desc:`Close the ends.`}}},cone:{category:`shape`,children:[`animate`],desc:`Cone along Y with its base at -height/2 and apex at +height/2.`,attrs:{...P,radius:{type:`number`,alias:`r`,...pe,default:.5,desc:`Base radius.`},height:{type:`number`,alias:`h`,...pe,default:1,desc:`Height.`},segments:{type:`int`,min:3,max:512,desc:`Fixed number of sides.`},caps:{type:`bool`,default:!0,desc:`Close the base.`}}},capsule:{category:`shape`,children:[`animate`],desc:`Capsule along Y; height is the total height including both caps.`,attrs:{...P,radius:{type:`number`,alias:`r`,...pe,default:.25,desc:`Radius.`},height:{type:`number`,alias:`h`,...pe,default:1,desc:`Total height (at least 2 × radius).`},segments:{type:`int`,min:3,max:512,desc:`Fixed tessellation.`}},check(e,t){let n=e.radius??.25,r=e.height??1;r<2*n-1e-12&&t(`height`,`capsule height (${r}) must be at least twice the radius (${2*n}).`,`E_RANGE`)}},plane:{category:`shape`,children:[`animate`],desc:`Flat rectangle in the XZ plane facing +Y (rendered double sided).`,attrs:{...P,size:{type:`size2`,alias:`s`,default:[1,1],desc:`Width (x) and depth (z).`}},check(e,t){e.size&&e.size.some(e=>e<=0)&&t(`size`,`size must be positive.`,`E_RANGE`)}},torus:{category:`shape`,children:[`animate`],desc:`Torus around the Y axis.`,attrs:{...P,radius:{type:`number`,alias:`r`,...pe,default:.35,desc:`Distance from the centre to the tube centre.`},tube:{type:`number`,...pe,default:.15,desc:`Tube radius.`},arc:{type:`angle`,exclusiveMin:0,max:360,default:360,desc:`Swept angle in degrees (partial torus / pipe elbow).`},segments:{type:`int`,min:3,max:1024,desc:`Fixed segments around the ring.`},tubeSegments:{type:`int`,min:3,max:512,desc:`Fixed segments around the tube.`}}},line:{category:`shape`,children:[`animate`],desc:`Straight line segment; rendered as a tube when radius > 0.`,attrs:{...P,from:{type:`vec3`,required:!0,desc:`Start point.`},to:{type:`vec3`,required:!0,desc:`End point.`},radius:{type:`number`,alias:`r`,min:0,default:0,desc:`Tube radius (0 = hairline).`},segments:{type:`int`,min:3,max:256,desc:`Tube sides.`}},check(e,t){e.from&&e.to&&Math.hypot(e.to[0]-e.from[0],e.to[1]-e.from[1],e.to[2]-e.from[2])<1e-12&&t(`to`,`A line needs two distinct points.`,`E_DEGENERATE`)}},polyline:{category:`shape`,children:[`animate`],desc:`3D polyline or 2D path outline; rendered as a tube when radius > 0.`,attrs:{...P,points:{type:`points3`,desc:`x,y,z x,y,z …`},d:{type:`path2d`,desc:`Outline of 2D path data in the XY plane (alternative to points).`},closed:{type:`bool`,default:!1,desc:`Connect the last point to the first.`},smooth:{type:`bool`,default:!1,desc:`Interpolate the points with a Catmull-Rom spline.`},radius:{type:`number`,alias:`r`,min:0,default:0,desc:`Tube radius (0 = hairline).`},segments:{type:`int`,min:3,max:256,desc:`Tube sides.`}},check(e,t,n,r=t=>e[t]!==void 0){!r(`points`)&&!r(`d`)&&t(null,`polyline needs points="…" or d="…".`,`E_MISSING_ATTRIBUTE`),r(`points`)&&r(`d`)&&t(`d`,`Give either points or d, not both.`,`E_CONFLICTING_ATTRIBUTES`),e.points&&e.points.length<6&&t(`points`,`A polyline needs at least 2 points.`,`E_DEGENERATE`)}},polygon:{category:`shape`,children:[`animate`],desc:`Filled flat polygon in the XY plane (rendered double sided).`,attrs:{...P,points:{type:`points2`,required:!0,desc:`x,y x,y … (at least 3 points).`}},check(e,t){e.points&&e.points.length<6&&t(`points`,`A polygon needs at least 3 points.`,`E_DEGENERATE`)}},path:{category:`shape`,children:[`animate`],desc:`Filled flat 2D path in the XY plane (rendered double sided). In <defs> it is a reusable outline.`,attrs:{...P,...fe},check:me},extrude:{category:`shape`,children:[`animate`],desc:`Extrudes a 2D path along +Z, optionally with a rounded bevel.`,attrs:{...P,...fe,depth:{type:`number`,...pe,default:1,desc:`Extrusion depth along Z.`},bevel:{type:`number`,min:0,default:0,desc:`Bevel radius on the front and back edges.`},bevelSegments:{type:`int`,min:1,max:16,default:3,desc:`Segments per bevel.`},center:{type:`bool`,default:!1,desc:`Centre the extrusion on z = 0.`}},check(e,t,n,r){me(e,t,n,r);let i=e.depth??1;e.bevel&&e.bevel*2>i+1e-12&&t(`bevel`,`bevel (${e.bevel}) must be at most half the depth (${i/2}).`,`E_RANGE`)}},revolve:{category:`shape`,children:[`animate`],desc:`Revolves (lathes) a 2D profile around the Y axis; x is the distance from the axis.`,attrs:{...P,...fe,angle:{type:`angle`,exclusiveMin:0,max:360,default:360,desc:`Revolution angle in degrees.`},segments:{type:`int`,min:3,max:1024,desc:`Fixed number of radial segments.`}},check:me},sweep:{category:`shape`,children:[`animate`],desc:`Sweeps a profile (circle or 2D path) along a 3D spine with rotation minimising frames.`,attrs:{...P,...fe,radius:{type:`number`,alias:`r`,...pe,desc:`Circular profile radius (alternative to d/path).`},along:{type:`spine`,required:!0,desc:`Spine: x,y,z points, 3D path data (M L C S Q T Z) or helix(r,pitch,turns).`},smooth:{type:`bool`,default:!1,desc:`Interpolate spine points with a Catmull-Rom spline.`},twist:{type:`angle`,default:0,desc:`Profile rotation in degrees from start to end.`},taper:{type:`number`,min:0,default:1,desc:`Profile scale at the end (1 = constant).`},caps:{type:`bool`,default:!0,desc:`Close open ends.`},segments:{type:`int`,min:3,max:256,desc:`Circle profile sides.`}},check(e,t,n,r=t=>e[t]!==void 0){let i=r(`d`)||r(`path`);!i&&!r(`radius`)&&t(null,`sweep needs a profile: radius="…" or d="…" / path="…".`,`E_MISSING_ATTRIBUTE`),i&&r(`radius`)&&t(`radius`,`Give either radius or a path profile, not both.`,`E_CONFLICTING_ATTRIBUTES`),r(`d`)&&r(`path`)&&t(`path`,`Give either d or path, not both.`,`E_CONFLICTING_ATTRIBUTES`)}},gear:{category:`shape`,children:[`animate`],desc:`Involute spur gear in the XY plane, extruded along Z.`,attrs:{...P,teeth:{type:`int`,min:5,max:400,default:24,desc:`Number of teeth.`},module:{type:`number`,...pe,default:.04,desc:`Module: pitch diameter / teeth.`},pressureAngle:{type:`angle`,min:10,max:35,default:20,desc:`Pressure angle in degrees.`},depth:{type:`number`,...pe,default:.2,desc:`Face width (extrusion depth).`},bore:{type:`number`,min:0,default:0,desc:`Radius of the centre hole.`},bevel:{type:`number`,min:0,default:0,desc:`Edge bevel radius.`},center:{type:`bool`,default:!0,desc:`Centre the gear on z = 0.`}},check(e,t){let n=e.teeth??24,r=e.module??.04,i=r*n/2-1.25*r;e.bore&&e.bore>=i*.95&&t(`bore`,`bore (${e.bore}) must be smaller than the root radius (${(i*.95).toFixed(4)}).`,`E_RANGE`);let a=e.depth??.2;e.bevel&&e.bevel*2>a+1e-12&&t(`bevel`,`bevel must be at most half the depth (${a/2}).`,`E_RANGE`)}},mesh:{category:`shape`,children:[`animate`],desc:`Explicit indexed triangle mesh (escape hatch for data that is not procedural).`,attrs:{...P,positions:{type:`floats`,required:!0,desc:`x y z for every vertex.`},indices:{type:`indices`,desc:`Triangle vertex indices (3 per triangle); omitted = non-indexed triangles.`},normals:{type:`floats`,desc:`Optional x y z normal per vertex (computed when omitted).`},uvs:{type:`floats`,desc:`Optional u v per vertex.`},smooth:{type:`angle`,min:0,max:180,default:30,desc:`Crease angle for computed normals (0 = flat).`}},check(e,t){let n=e.positions;if(!n)return;n.length%3!=0&&t(`positions`,`positions needs 3 numbers per vertex; found ${n.length} numbers.`,`E_MESH`);let r=Math.floor(n.length/3);if(r<3&&t(`positions`,`A mesh needs at least 3 vertices.`,`E_MESH`),e.indices){e.indices.length%3!=0&&t(`indices`,`indices must contain 3 entries per triangle; found ${e.indices.length}.`,`E_MESH`);for(let n=0;n<e.indices.length;n++)if(e.indices[n]>=r){t(`indices`,`Index ${e.indices[n]} at position ${n} is out of range (the mesh has ${r} vertices).`,`E_MESH`);break}}else r%3!=0&&t(`positions`,`Without indices the vertex count must be a multiple of 3.`,`E_MESH`);e.normals&&e.normals.length!==n.length&&t(`normals`,`normals must have one x y z per vertex (${n.length} numbers); found ${e.normals.length}.`,`E_MESH`),e.uvs&&e.uvs.length!==r*2&&t(`uvs`,`uvs must have one u v per vertex (${r*2} numbers); found ${e.uvs.length}.`,`E_MESH`);for(let e=0;e<n.length;e++)if(!Number.isFinite(n[e])){t(`positions`,`Non-finite coordinate at position ${e}.`,`E_MESH`);break}}}},ye=[`es3d`,`v3d`],be=new Map;function xe(e){let t=be.get(e);if(t)return t;t=new Map;let n=ve[e===`v3d`?`es3d`:e];if(n)for(let[e,r]of Object.entries(n.attrs))t.set(e,e),r.alias&&t.set(r.alias,e);return be.set(e,t),t}function Se(e){return ve[e===`v3d`?`es3d`:e]||null}function Ce(e,t){let n=Se(e);return n&&n.attrs[t]||null}function F(e,t){let n=e.values?e.values[t]:void 0;if(n!==void 0)return n;let r=Ce(e.name,t);return r?r.default:void 0}var we=Object.keys(ve),I=class extends Error{constructor(e,t=0,n=0,r={}){super(e),this.name=`ValueError`,this.offset=t,this.length=n,this.hint=r.hint||null,this.suggestion=r.suggestion||null,this.code=r.code||null}},Te=new Map(`aliceblue:f0f8ff,antiquewhite:faebd7,aqua:00ffff,aquamarine:7fffd4,azure:f0ffff,beige:f5f5dc,bisque:ffe4c4,black:000000,blanchedalmond:ffebcd,blue:0000ff,blueviolet:8a2be2,brown:a52a2a,burlywood:deb887,cadetblue:5f9ea0,chartreuse:7fff00,chocolate:d2691e,coral:ff7f50,cornflowerblue:6495ed,cornsilk:fff8dc,crimson:dc143c,cyan:00ffff,darkblue:00008b,darkcyan:008b8b,darkgoldenrod:b8860b,darkgray:a9a9a9,darkgreen:006400,darkgrey:a9a9a9,darkkhaki:bdb76b,darkmagenta:8b008b,darkolivegreen:556b2f,darkorange:ff8c00,darkorchid:9932cc,darkred:8b0000,darksalmon:e9967a,darkseagreen:8fbc8f,darkslateblue:483d8b,darkslategray:2f4f4f,darkslategrey:2f4f4f,darkturquoise:00ced1,darkviolet:9400d3,deeppink:ff1493,deepskyblue:00bfff,dimgray:696969,dimgrey:696969,dodgerblue:1e90ff,firebrick:b22222,floralwhite:fffaf0,forestgreen:228b22,fuchsia:ff00ff,gainsboro:dcdcdc,ghostwhite:f8f8ff,gold:ffd700,goldenrod:daa520,gray:808080,green:008000,greenyellow:adff2f,grey:808080,honeydew:f0fff0,hotpink:ff69b4,indianred:cd5c5c,indigo:4b0082,ivory:fffff0,khaki:f0e68c,lavender:e6e6fa,lavenderblush:fff0f5,lawngreen:7cfc00,lemonchiffon:fffacd,lightblue:add8e6,lightcoral:f08080,lightcyan:e0ffff,lightgoldenrodyellow:fafad2,lightgray:d3d3d3,lightgreen:90ee90,lightgrey:d3d3d3,lightpink:ffb6c1,lightsalmon:ffa07a,lightseagreen:20b2aa,lightskyblue:87cefa,lightslategray:778899,lightslategrey:778899,lightsteelblue:b0c4de,lightyellow:ffffe0,lime:00ff00,limegreen:32cd32,linen:faf0e6,magenta:ff00ff,maroon:800000,mediumaquamarine:66cdaa,mediumblue:0000cd,mediumorchid:ba55d3,mediumpurple:9370db,mediumseagreen:3cb371,mediumslateblue:7b68ee,mediumspringgreen:00fa9a,mediumturquoise:48d1cc,mediumvioletred:c71585,midnightblue:191970,mintcream:f5fffa,mistyrose:ffe4e1,moccasin:ffe4b5,navajowhite:ffdead,navy:000080,oldlace:fdf5e6,olive:808000,olivedrab:6b8e23,orange:ffa500,orangered:ff4500,orchid:da70d6,palegoldenrod:eee8aa,palegreen:98fb98,paleturquoise:afeeee,palevioletred:db7093,papayawhip:ffefd5,peachpuff:ffdab9,peru:cd853f,pink:ffc0cb,plum:dda0dd,powderblue:b0e0e6,purple:800080,rebeccapurple:663399,red:ff0000,rosybrown:bc8f8f,royalblue:4169e1,saddlebrown:8b4513,salmon:fa8072,sandybrown:f4a460,seagreen:2e8b57,seashell:fff5ee,sienna:a0522d,silver:c0c0c0,skyblue:87ceeb,slateblue:6a5acd,slategray:708090,slategrey:708090,snow:fffafa,springgreen:00ff7f,steelblue:4682b4,tan:d2b48c,teal:008080,thistle:d8bfd8,tomato:ff6347,turquoise:40e0d0,violet:ee82ee,wheat:f5deb3,white:ffffff,whitesmoke:f5f5f5,yellow:ffff00,yellowgreen:9acd32`.split(`,`).map(e=>e.split(`:`))),Ee=/^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;function De(e){let t=e.trim();if(t[0]===`#`){if(!Ee.test(t))return null;let e=t.slice(1);e.length<=4&&(e=[...e].map(e=>e+e).join(``));let n=e.length===6?e+`ff`:e;return[0,2,4,6].map(e=>parseInt(n.slice(e,e+2),16)/255)}let n=t.toLowerCase();if(n===`transparent`)return[0,0,0,0];let r=Te.get(n);if(r)return De(`#`+r);let i=/^rgba?\(\s*([^)]*)\)$/i.exec(t);if(i){let e=i[1].split(/\s*,\s*|\s+/).filter(Boolean);if(e.length!==3&&e.length!==4)return null;let t=[];for(let n=0;n<e.length;n++){let r=e[n],i;if(i=r.endsWith(`%`)?Number(r.slice(0,-1))/100:n<3?Number(r)/255:Number(r),!Number.isFinite(i)||i<0||i>1)return null;t.push(i)}return t.length===3&&t.push(1),t}return null}function Oe(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function ke(e){return e<=.0031308?e*12.92:1.055*e**(1/2.4)-.055}function Ae(e){return[Oe(e[0]),Oe(e[1]),Oe(e[2]),e[3]]}function je(e){let t=e=>Math.round(Math.max(0,Math.min(1,e))*255).toString(16).padStart(2,`0`),n=`#`+t(e[0])+t(e[1])+t(e[2]);return e[3]!==void 0&&e[3]<1?n+t(e[3]):n}function Me(e){let t=je(e);return t.length===7&&t[1]===t[2]&&t[3]===t[4]&&t[5]===t[6]?`#`+t[1]+t[3]+t[5]:t}var Ne=class extends Error{constructor(e,t,n=1,r=null){super(e),this.name=`PathError`,this.offset=t,this.length=n,this.code=r}},Pe={M:2,L:2,H:1,V:1,C:6,S:4,Q:4,T:2,A:7,Z:0},Fe={M:3,L:3,C:9,S:6,Q:6,T:3,Z:0};function Ie(e){return e===32||e===9||e===10||e===13||e===12}var Le=Array.from({length:23},(e,t)=>Number(`1e${t}`)),Re=0;function ze(e,t){let n=t,r=e.charCodeAt(t),i=r===45;(r===43||r===45)&&(r=e.charCodeAt(++t));let a=0,o=t;for(;r>=48&&r<=57;)a=a*10+(r-48),r=e.charCodeAt(++t);let s=t-o,c=0;if(r===46){let n=++t;for(r=e.charCodeAt(t);r>=48&&r<=57;)a=a*10+(r-48),r=e.charCodeAt(++t);c=t-n,s+=c}if(!s)return-1;let l=0;if(r===101||r===69){let n=t+1,r=e.charCodeAt(n),i=r===45;if((r===43||r===45)&&(r=e.charCodeAt(++n)),r>=48&&r<=57){for(;r>=48&&r<=57;)l=l*10+(r-48),r=e.charCodeAt(++n);i&&(l=-l),t=n}}if(l-=c,a>9007199254740992||l>22||l<-22)Re=Number(e.slice(n,t));else{let e=l>=0?a*Le[l]:a/Le[-l];Re=i?-e:e}return t}function Be(e,t=2){let n=t===3?Fe:Pe,r=e.length,i=0,a=[],o=0,s=0,c=0,l=0,u=0,d=0,f=0,p=0,m=0,h=``,g=``,_=0,v=!1,y=()=>{for(;i<r&&Ie(e.charCodeAt(i));)i++},b=()=>{y(),e.charCodeAt(i)===44&&(i++,y())},x=()=>{b();let t=ze(e,i);if(t<0)throw i>=r?new Ne(`Command '${g}' expects ${n[g.toUpperCase()]} numbers but the path data ended.`,Math.max(0,r-1),1):new Ne(`Expected a number in '${g}' command but found '${e[i]}'.`,i,1);return i=t,Re},S=()=>{b();let t=e.charCodeAt(i);if(t!==48&&t!==49)throw new Ne(`Arc flags must be '0' or '1'.`,i,1);return i++,+(t===49)},C=()=>{let t=i;for(;t<r&&Ie(e.charCodeAt(t));)t++;if(e.charCodeAt(t)===44)for(t++;t<r&&Ie(e.charCodeAt(t));)t++;let n=e.charCodeAt(t);return n>=48&&n<=57||n===45||n===43||n===46};if(y(),i>=r)return{segments:a,subpaths:0};for(;y(),!(i>=r);){if(a.length>=1e5)throw new Ne(`Path data has more than ${se.toLocaleString(`en-US`)} commands.`,i,1,`E_PATH_LIMIT`);let b=e[i],w=e.charCodeAt(i),T=w>=65&&w<=90||w>=97&&w<=122,E=i;if(T){let e=b.toUpperCase();if(!(e in Pe))throw new Ne(`Unknown path command '${b}'. Valid commands: M L H V C S Q T A Z.`,i,1);if(!(e in n))throw new Ne(`Command '${b}' is not available in 3D path data (use M L C S Q T Z).`,i,1);if(!g&&e!==`M`)throw new Ne(`Path data must begin with a moveto command (M or m).`,i,1);if(g=b,i++,e===`Z`){a.push({c:`Z`,o:E}),o=l,s=u,c=d,h=`Z`,v=!0;continue}if(!C())throw y(),new Ne(`Command '${b}' expects ${n[e]} numbers.`,Math.min(i,r-1),1)}else{if(!g)throw new Ne(`Path data must begin with a moveto command (M or m).`,i,1);if(g===`Z`||g===`z`)throw new Ne(`Unexpected '${b}' after closepath; start a new command.`,i,1);if(!C())throw new Ne(`Unexpected character '${b}' in path data.`,i,1);g===`M`?g=`L`:g===`m`&&(g=`l`)}let D=g===g.toLowerCase(),O=g.toUpperCase();v&&O!==`M`&&(a.push({c:`M`,x:l,y:u,z:d,o:E,implicit:!0}),_++),v=!1;let k=D?o:0,A=D?s:0,j=D?c:0;switch(O){case`M`:{let e=x()+k,n=x()+A,r=t===3?x()+j:0;a.push({c:`M`,x:e,y:n,z:r,o:E}),o=l=e,s=u=n,c=d=r,_++;break}case`L`:{let e=x()+k,n=x()+A,r=t===3?x()+j:0;a.push({c:`L`,x:e,y:n,z:r,o:E}),o=e,s=n,c=r;break}case`H`:{let e=x()+k;a.push({c:`L`,x:e,y:s,z:0,o:E}),o=e;break}case`V`:{let e=x()+A;a.push({c:`L`,x:o,y:e,z:0,o:E}),s=e;break}case`C`:{let e=x()+k,n=x()+A,r=t===3?x()+j:0,i=x()+k,l=x()+A,u=t===3?x()+j:0,d=x()+k,h=x()+A,g=t===3?x()+j:0;a.push({c:`C`,x1:e,y1:n,z1:r,x2:i,y2:l,z2:u,x:d,y:h,z:g,o:E}),f=i,p=l,m=u,o=d,s=h,c=g;break}case`S`:{let e=o,n=s,r=c;(h===`C`||h===`S`)&&(e=2*o-f,n=2*s-p,r=2*c-m);let i=x()+k,l=x()+A,u=t===3?x()+j:0,d=x()+k,g=x()+A,_=t===3?x()+j:0;a.push({c:`C`,x1:e,y1:n,z1:r,x2:i,y2:l,z2:u,x:d,y:g,z:_,o:E}),f=i,p=l,m=u,o=d,s=g,c=_;break}case`Q`:{let e=x()+k,n=x()+A,r=t===3?x()+j:0,i=x()+k,l=x()+A,u=t===3?x()+j:0;a.push({c:`Q`,x1:e,y1:n,z1:r,x:i,y:l,z:u,o:E}),f=e,p=n,m=r,o=i,s=l,c=u;break}case`T`:{let e=o,n=s,r=c;(h===`Q`||h===`T`)&&(e=2*o-f,n=2*s-p,r=2*c-m);let i=x()+k,l=x()+A,u=t===3?x()+j:0;a.push({c:`Q`,x1:e,y1:n,z1:r,x:i,y:l,z:u,o:E}),f=e,p=n,m=r,o=i,s=l,c=u;break}case`A`:{let e=x(),t=x(),n=x(),r=S(),c=S(),l=x()+k,u=x()+A;if(e<0||t<0)throw new Ne(`Arc radii must not be negative.`,E,i-E);a.push({c:`A`,rx:e,ry:t,rot:n,large:r,sweep:c,x0:o,y0:s,x:l,y:u,z:0,o:E}),o=l,s=u;break}default:throw new Ne(`Unsupported command '${g}'.`,E,1)}h=O}return{segments:a,subpaths:_}}function Ve(e){let t=1/0,n=1/0,r=-1/0,i=-1/0,a=(e,a)=>{e<t&&(t=e),a<n&&(n=a),e>r&&(r=e),a>i&&(i=a)};for(let t of e)if(t.c!==`Z`){if(a(t.x,t.y),t.c===`C`)a(t.x1,t.y1),a(t.x2,t.y2);else if(t.c===`Q`)a(t.x1,t.y1);else if(t.c===`A`){let e=Math.max(t.rx,t.ry);a(t.x-e,t.y-e),a(t.x+e,t.y+e),a(t.x0-e,t.y0-e),a(t.x0+e,t.y0+e)}}return{minX:t,minY:n,maxX:r,maxY:i}}var He=Math.PI,Ue=He*2,We=He*.5,Ge=He*.25,Ke=-.16666666666666632,qe=.00833333333332249,Je=-.0001984126982985795,Ye=27557313707070068e-22,Xe=-2.5050760253406863e-8,Ze=158969099521155e-24,Qe=.0416666666666666,$e=-.001388888888887411,et=2480158728947673e-20,tt=-2.7557314351390663e-7,nt=2.087572321298175e-9,rt=-11359647557788195e-27;function it(e){let t=e*e;return e+t*e*(Ke+t*(qe+t*(Je+t*(Ye+t*(Xe+t*Ze)))))}function at(e){let t=e*e,n=t*(Qe+t*($e+t*(et+t*(tt+t*(nt+t*rt)))));return 1-.5*t+t*n}function ot(e){if(!Number.isFinite(e))return e;let t=e-Ue*Math.round(e/Ue),n=1;t<0&&(n=-1,t=-t),t>We&&(t=He-t),t<0&&(t=0);let r=t>Ge?at(We-t):it(t);return n<0?-r:r}function st(e){return ot(e+We)}var ct=Math.PI/180;function lt(){let e=new Float32Array(16);return e[0]=e[5]=e[10]=e[15]=1,e}function L(){let e=new Float64Array(16);return e[0]=e[5]=e[10]=e[15]=1,e}function ut(e){return e.fill(0),e[0]=e[5]=e[10]=e[15]=1,e}function dt(e,t=1e-12){for(let n=0;n<16;n++){let r=+(n%5==0);if(Math.abs(e[n]-r)>t)return!1}return!0}function R(e,t,n){let r=t[0],i=t[1],a=t[2],o=t[3],s=t[4],c=t[5],l=t[6],u=t[7],d=t[8],f=t[9],p=t[10],m=t[11],h=t[12],g=t[13],_=t[14],v=t[15],y=n[0],b=n[1],x=n[2],S=n[3];return e[0]=y*r+b*s+x*d+S*h,e[1]=y*i+b*c+x*f+S*g,e[2]=y*a+b*l+x*p+S*_,e[3]=y*o+b*u+x*m+S*v,y=n[4],b=n[5],x=n[6],S=n[7],e[4]=y*r+b*s+x*d+S*h,e[5]=y*i+b*c+x*f+S*g,e[6]=y*a+b*l+x*p+S*_,e[7]=y*o+b*u+x*m+S*v,y=n[8],b=n[9],x=n[10],S=n[11],e[8]=y*r+b*s+x*d+S*h,e[9]=y*i+b*c+x*f+S*g,e[10]=y*a+b*l+x*p+S*_,e[11]=y*o+b*u+x*m+S*v,y=n[12],b=n[13],x=n[14],S=n[15],e[12]=y*r+b*s+x*d+S*h,e[13]=y*i+b*c+x*f+S*g,e[14]=y*a+b*l+x*p+S*_,e[15]=y*o+b*u+x*m+S*v,e}function ft(e,t,n,r){return ut(e),e[12]=t,e[13]=n,e[14]=r,e}function pt(e,t,n,r){return ut(e),e[0]=t,e[5]=n,e[10]=r,e}function mt(e,t){let n=st(t),r=ot(t);return ut(e),e[5]=n,e[6]=r,e[9]=-r,e[10]=n,e}function ht(e,t){let n=st(t),r=ot(t);return ut(e),e[0]=n,e[2]=-r,e[8]=r,e[10]=n,e}function gt(e,t){let n=st(t),r=ot(t);return ut(e),e[0]=n,e[1]=r,e[4]=-r,e[5]=n,e}function _t(e,t,n,r){let i=t*ct,a=n*ct,o=r*ct,s=st(i),c=ot(i),l=st(a),u=ot(a),d=st(o),f=ot(o);return e[0]=d*l,e[1]=f*l,e[2]=-u,e[3]=0,e[4]=d*u*c-f*s,e[5]=f*u*c+d*s,e[6]=l*c,e[7]=0,e[8]=d*u*s+f*c,e[9]=f*u*s-d*c,e[10]=l*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function vt(e,t,n,r,i){let a=Math.hypot(t,n,r);if(a<1e-12)return ut(e);a=1/a;let o=t*a,s=n*a,c=r*a,l=ot(i),u=st(i),d=1-u;return e[0]=o*o*d+u,e[1]=s*o*d+c*l,e[2]=c*o*d-s*l,e[3]=0,e[4]=o*s*d-c*l,e[5]=s*s*d+u,e[6]=c*s*d+o*l,e[7]=0,e[8]=o*c*d+s*l,e[9]=s*c*d-o*l,e[10]=c*c*d+u,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function yt(e,t,n,r,i){let a=Math.hypot(t,n,r,i)||1;t/=a,n/=a,r/=a,i/=a;let o=t+t,s=n+n,c=r+r,l=t*o,u=n*o,d=n*s,f=r*o,p=r*s,m=r*c,h=i*o,g=i*s,_=i*c;return e[0]=1-d-m,e[1]=u+_,e[2]=f-g,e[3]=0,e[4]=u-_,e[5]=1-l-m,e[6]=p+h,e[7]=0,e[8]=f+g,e[9]=p-h,e[10]=1-l-d,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function bt(e,t,n,r){_t(e,n[0],n[1],n[2]);let i=r[0],a=r[1],o=r[2];return e[0]*=i,e[1]*=i,e[2]*=i,e[4]*=a,e[5]*=a,e[6]*=a,e[8]*=o,e[9]*=o,e[10]*=o,e[12]=t[0],e[13]=t[1],e[14]=t[2],e}function xt(e,t){let n=t[0],r=t[1],i=t[2],a=t[3],o=t[4],s=t[5],c=t[6],l=t[7],u=t[8],d=t[9],f=t[10],p=t[11],m=t[12],h=t[13],g=t[14],_=t[15],v=n*s-r*o,y=n*c-i*o,b=n*l-a*o,x=r*c-i*s,S=r*l-a*s,C=i*l-a*c,w=u*h-d*m,T=u*g-f*m,E=u*_-p*m,D=d*g-f*h,O=d*_-p*h,k=f*_-p*g,A=v*k-y*O+b*D+x*E-S*T+C*w;return A?(A=1/A,e[0]=(s*k-c*O+l*D)*A,e[1]=(i*O-r*k-a*D)*A,e[2]=(h*C-g*S+_*x)*A,e[3]=(f*S-d*C-p*x)*A,e[4]=(c*E-o*k-l*T)*A,e[5]=(n*k-i*E+a*T)*A,e[6]=(g*b-m*C-_*y)*A,e[7]=(u*C-f*b+p*y)*A,e[8]=(o*O-s*E+l*w)*A,e[9]=(r*E-n*O-a*w)*A,e[10]=(m*S-h*b+_*v)*A,e[11]=(d*b-u*S-p*v)*A,e[12]=(s*T-o*D-c*w)*A,e[13]=(n*D-r*T+i*w)*A,e[14]=(h*y-m*x-g*v)*A,e[15]=(u*x-d*y+f*v)*A,e):null}function St(e){return e[0]*(e[5]*e[10]-e[6]*e[9])-e[4]*(e[1]*e[10]-e[2]*e[9])+e[8]*(e[1]*e[6]-e[2]*e[5])}function Ct(e,t,n,r,i){let a=t[3]*n+t[7]*r+t[11]*i+t[15]||1;return e[0]=(t[0]*n+t[4]*r+t[8]*i+t[12])/a,e[1]=(t[1]*n+t[5]*r+t[9]*i+t[13])/a,e[2]=(t[2]*n+t[6]*r+t[10]*i+t[14])/a,e}function wt(e,t,n,r,i){return e[0]=t[0]*n+t[4]*r+t[8]*i,e[1]=t[1]*n+t[5]*r+t[9]*i,e[2]=t[2]*n+t[6]*r+t[10]*i,e}function Tt(e,t,n,r,i,a=!1){let o=1/Math.tan(t/2);return e.fill(0),e[0]=o/n,e[5]=o,e[11]=-1,a?(e[10]=i/(r-i),e[14]=i*r/(r-i)):(e[10]=(i+r)/(r-i),e[14]=2*i*r/(r-i)),e}function Et(e,t,n,r,i,a,o,s=!1){let c=1/(t-n),l=1/(r-i),u=1/(a-o);return e.fill(0),e[0]=-2*c,e[5]=-2*l,e[12]=(t+n)*c,e[13]=(i+r)*l,s?(e[10]=u,e[14]=a*u):(e[10]=2*u,e[14]=(o+a)*u),e[15]=1,e}function Dt(e,t,n,r){let i=t[0]-n[0],a=t[1]-n[1],o=t[2]-n[2],s=Math.hypot(i,a,o);if(s<1e-12)return ut(e);i/=s,a/=s,o/=s;let c=r[1]*o-r[2]*a,l=r[2]*i-r[0]*o,u=r[0]*a-r[1]*i;if(s=Math.hypot(c,l,u),s<1e-12){let e=Math.abs(a)<.9?[0,1,0]:[0,0,1];c=e[1]*o-e[2]*a,l=e[2]*i-e[0]*o,u=e[0]*a-e[1]*i,s=Math.hypot(c,l,u)}c/=s,l/=s,u/=s;let d=a*u-o*l,f=o*c-i*u,p=i*l-a*c;return e[0]=c,e[1]=d,e[2]=i,e[3]=0,e[4]=l,e[5]=f,e[6]=a,e[7]=0,e[8]=u,e[9]=p,e[10]=o,e[11]=0,e[12]=-(c*t[0]+l*t[1]+u*t[2]),e[13]=-(d*t[0]+f*t[1]+p*t[2]),e[14]=-(i*t[0]+a*t[1]+o*t[2]),e[15]=1,e}function Ot(e,t=1e-5){let n=[e[12],e[13],e[14]],r=Math.hypot(e[0],e[1],e[2]),i=Math.hypot(e[4],e[5],e[6]),a=Math.hypot(e[8],e[9],e[10]);if(St(e)<0&&(r=-r),Math.abs(r)<1e-20||i<1e-20||a<1e-20)return null;let o=[e[0]/r,e[1]/r,e[2]/r,e[4]/i,e[5]/i,e[6]/i,e[8]/a,e[9]/a,e[10]/a],s=o[0]*o[3]+o[1]*o[4]+o[2]*o[5],c=o[0]*o[6]+o[1]*o[7]+o[2]*o[8],l=o[3]*o[6]+o[4]*o[7]+o[5]*o[8];return Math.abs(s)>t||Math.abs(c)>t||Math.abs(l)>t?null:{translation:n,rotation:kt(o),scale:[r,i,a]}}function kt(e){let t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8],u=t+a+l,d,f,p,m;if(u>0){let e=.5/Math.sqrt(u+1);m=.25/e,d=(o-c)*e,f=(s-r)*e,p=(n-i)*e}else if(t>a&&t>l){let e=2*Math.sqrt(1+t-a-l);m=(o-c)/e,d=.25*e,f=(i+n)/e,p=(s+r)/e}else if(a>l){let e=2*Math.sqrt(1+a-t-l);m=(s-r)/e,d=(i+n)/e,f=.25*e,p=(c+o)/e}else{let e=2*Math.sqrt(1+l-t-a);m=(n-i)/e,d=(s+r)/e,f=(c+o)/e,p=.25*e}let h=Math.hypot(d,f,p,m)||1;return[d/h,f/h,p/h,m/h]}function At(e,t,n=1e-9){for(let r=0;r<16;r++)if(Math.abs(e[r]-t[r])>n*Math.max(1,Math.abs(e[r]),Math.abs(t[r])))return!1;return!0}var jt={translate:[1,3],rotate:[3,4],rotateX:[1,1],rotateY:[1,1],rotateZ:[1,1],scale:[1,3],matrix:[16,16],quat:[4,4]};function Mt(e){return e===32||e===9||e===10||e===13||e===44}function Nt(e){let t=[],n=e.length,r=0;for(;;){for(;r<n&&Mt(e.charCodeAt(r));)r++;if(r>=n)break;let i=r;for(;r<n&&/[A-Za-z0-9]/.test(e[r]);)r++;let a=e.slice(i,r);if(!a)throw new I(`Unexpected character '${e[r]}' in transform.`,r,1);if(!(a in jt))throw new I(`Unknown transform function '${a}'.`,i,a.length,{suggestion:p(a,Object.keys(jt)),hint:`Valid functions: translate, rotate, rotateX, rotateY, rotateZ, scale, matrix, quat.`});for(;r<n&&(e[r]===` `||e[r]===` `);)r++;if(e[r]!==`(`)throw new I(`Expected '(' after '${a}'.`,r,1);r++;let o=[];for(;;){for(;r<n&&/[\s,]/.test(e[r]);)r++;if(e[r]===`)`){r++;break}if(r>=n)throw new I(`Missing ')' to close '${a}('.`,i,a.length+1);let t=ze(e,r);if(t<0)throw new I(`Expected a number in '${a}()' but found '${e[r]}'.`,r,1);o.push(Re),r=t}let[s,c]=jt[a];if(o.length<s||o.length>c){let e;throw a===`rotate`&&o.length===1&&(e=`rotate() takes Euler angles rotate(x,y,z) or an axis-angle rotate(a,ax,ay,az); use rotateY(a) for a single angle.`),a===`rotate`&&o.length===2&&(e=`rotate() takes 3 Euler angles in degrees, e.g. rotate(0,45,0).`),new I(`${a}() takes ${s===c?s:`${s} to ${c}`} numbers but ${o.length} ${o.length===1?`was`:`were`} given.`,i,r-i,{hint:e})}if(a===`rotate`&&o.length===4&&Math.hypot(o[1],o[2],o[3])<1e-12)throw new I(`rotate(angle, ax, ay, az): the rotation axis must not be zero.`,i,r-i);if(a===`scale`&&o.length===2)throw new I(`scale() takes 1 (uniform) or 3 numbers.`,i,r-i);t.push({fn:a,args:o,offset:i})}return t}function Pt(e,t=L()){let n=e.args;switch(e.fn){case`translate`:return ft(t,n[0],n[1]||0,n[2]||0);case`rotate`:return n.length===4?vt(t,n[1],n[2],n[3],n[0]*ct):_t(t,n[0],n[1],n[2]);case`rotateX`:return mt(t,n[0]*ct);case`rotateY`:return ht(t,n[0]*ct);case`rotateZ`:return gt(t,n[0]*ct);case`scale`:return n.length===1?pt(t,n[0],n[0],n[0]):pt(t,n[0],n[1],n[2]);case`matrix`:for(let e=0;e<16;e++)t[e]=n[e];return t;case`quat`:return yt(t,n[0],n[1],n[2],n[3]);default:throw Error(`unknown transform ${e.fn}`)}}function Ft(e){let t=L(),n=L();for(let r of e)Pt(r,n),R(t,t,n);return t}function It(e){let t=Nt(e);return{ops:t,matrix:Ft(t)}}var Lt=[0,0,0],Rt=[1,1,1];function zt(e,t=L(),n=null){bt(t,n&&n.position||e.position||Lt,n&&n.rotation||e.rotation||Lt,n&&n.scale||e.scale||Rt);let r=e.transform;return r&&r.ops.length&&R(t,r.matrix,t),t}function Bt(e,t){let n=Ot(e);if(n){let e=[],[r,i,a]=n.translation;(Math.abs(r)>1e-9||Math.abs(i)>1e-9||Math.abs(a)>1e-9)&&e.push(`translate(${t(r)},${t(i)},${t(a)})`);let[o,s,c,l]=n.rotation;(Math.abs(o)>1e-9||Math.abs(s)>1e-9||Math.abs(c)>1e-9)&&e.push(`quat(${t(o)},${t(s)},${t(c)},${t(l)})`);let[u,d,f]=n.scale;return(Math.abs(u-1)>1e-9||Math.abs(d-1)>1e-9||Math.abs(f-1)>1e-9)&&(Math.abs(u-d)<1e-9&&Math.abs(d-f)<1e-9?e.push(`scale(${t(u)})`):e.push(`scale(${t(u)},${t(d)},${t(f)})`)),e.join(` `)}return`matrix(${Array.from(e,t).join(`,`)})`}function Vt(e){let t=Ot(e);if(!t)return null;let[n,r,i]=t.scale,a=[e[0]/n,e[1]/n,e[2]/n,e[4]/r,e[5]/r,e[6]/r,e[8]/i,e[9]/i,e[10]/i],o=Math.max(-1,Math.min(1,-a[2])),s=Math.asin(o),c,l;Math.abs(o)<.9999999?(c=Math.atan2(a[5],a[8]),l=Math.atan2(a[1],a[0])):(c=0,l=Math.atan2(-a[3],a[4]));let u=e=>e*180/Math.PI;return{translation:t.translation,rotation:[u(c),u(s),u(l)],scale:t.scale}}var Ht=`AGFzbQEAAAABsgEYYAJ8fAF8YAJ/fwF8YAF8AXxgA3x8fAF8YAV/f39/fwF/YAV/f398fwF/YAN/fH8Bf2AEf39/fwF/YAJ/fwF/YAZ/fHx8f38AYAR/fHx/AX9gB398fHx8fHwBf2AHf39/f398fAF/YAF/AX9gA3x/fwF/YAJ8fwF/YAR8fH9/AX9gBXx8fHx/AX9gBH98f38Bf2AAAGABfwBgAX8BfGAJfHx8fHx8fHx8AXxgA398fAF/Al0IA2VudgZoeXBvdDIAAANlbnYGbnVtYmVyAAEDZW52A3NpbgACA2VudgNjb3MAAgNlbnYGaHlwb3QzAAMDZW52A3RhbgACA2VudgRhY29zAAIDZW52BWF0YW4yAAADHx4EBQYEBwgICAkKBwcLDAcNDg8QEQcSEw0UAAMVFhcEBQFwAQEBBQMBAAIGCAF/AUGwjAQLB9cBEwZtZW1vcnkCAAVhbGxvYwAfBmh5cG90MgAhC3RyaWFuZ3VsYXRlABMHZXh0cnVkZQAUB25vcm1hbHMAFQdudW1iZXJzABYGc3BoZXJlABcIY3lsaW5kZXIAGAZoeXBvdDMAIgdjYXBzdWxlABkFdG9ydXMAGgtyb3VuZGVkX2JveAAbC2NhdG11bGxfcm9tABwMZ2Vhcl9vdXRsaW5lAB0FcmVzZXQAHhBzZXRfbmF0aXZlX2h5cG90ACAQc3BoZXJlX2RldmlhdGlvbgAjBXN3ZWVwACUKloUDHtYJBAt/A3wDfwJ8QQAhBSABIAFBf2oiBiADGyIHQQEgB0EBShtBBHQQn4CAgAAhCCABQQEgAUEBShsiCUEEdCIKEJ+AgIAAIQsgChCfgICAACEMIAkQn4CAgAAhDSABQQN0QQhqEJ+AgIAAIQ4CQCAIRQ0AIAtFDQAgDEUNACANRQ0AIA5FDQACQCAHQQFIDQAgCCEFIAAhCUEAIQoDQCAAIApBAWoiCiABb0EEdGoiD0EIaisDACAJQQhqKwMAoSEQIA8rAwAgCSsDAKEhEQJAAkBBACgC/IuAgABFDQAgESAQEKGAgIAAIRIMAQsgESAQEICAgIAAIRILIAVBCGogEZogEkQAAAAAAADwPyASRAAAAAAAAAAAZCASRAAAAAAAAAAAY3IbIhKjOQMAIAUgECASozkDACAFQRBqIQUgCUEQaiEJIAcgCkcNAAsLAkACQCABQQBKDQAgDkIANwMADAELIAdBf2ohEyAMIQkgCyEKQQAhBQNAIANBAEcgBSAGSHIhFEF/IQ8CQCAFIANyRQ0AIBMgBWogB28hDwtBfyEVAkAgFEUNACAFIAdvIRULRAAAAAAAAAAAIRFEAAAAAAAAAAAhFkQAAAAAAAAAACESAkAgD0EASCIUDQAgCCAPQQR0aiIPKwMAIRYgD0EIaisDACESC0QAAAAAAAAAACEQAkAgFUEASCIPDQAgCCAVQQR0aiIVKwMAIREgFUEIaisDACEQCyAQIBIgFBsiEiASIBAgDxugIRcgESAWIBQbIhAgECARIA8boCERAkACQEEAKAL8i4CAAEUNACARIBcQoYCAgAAhFgwBCyARIBcQgICAgAAhFgsgCkEIaiASIBcgFkSV1iboCy4RPmMiDxtEAAAAAAAA8D8gFiAPGyIWoyIXOQMAIAogECARIA8bIBajIhE5AwAgCUEIaiAXIBAgEaIgEiAXoqBEAAAAAAAA0D+lIhKjOQMAIAkgESASozkDAAJAAkAgAg0AQQAhDwwBCyACIAVqLQAAQQBHIQ8LIA0gBWogD0EBczoAACAJQRBqIQkgCkEQaiEKIAEgBUEBaiIFRw0ACyAOQgA3AwACQCADRQ0AIA5BCGohCUQAAAAAAAAAACESQQIhCiAAIQUgASEPA0AgAEEAIAogD0EBRhtBA3RqIhVBCGorAwAgBUEIaisDAKEhECAVKwMAIAUrAwChIRECQAJAQQAoAvyLgIAARQ0AIBEgEBChgICAACEQDAELIBEgEBCAgICAACEQCyAJIBIgEKAiEjkDACAJQQhqIQkgCkECaiEKIAVBEGohBSAPQX9qIg8NAAwCCwsCQCABQQFGDQAgAUF/aiEJIA5BCGohBUQAAAAAAAAAACESA0AgAEEYaisDACAAQQhqKwMAoSEQIABBEGoiCisDACAAKwMAoSERAkACQEEAKAL8i4CAAEUNACARIBAQoYCAgAAhEAwBCyARIBAQgICAgAAhEAsgBSASIBCgIhI5AwAgBUEIaiEFIAohACAJQX9qIgkNAAsLIA4gAUEDdGoiBSAFQXhqKwMAOQMACyAEIA02AhggBCAMNgIQIAQgCzYCDCAEIAg2AgggBCAHNgIEIAQgATYCACAEIA42AhQgBCAOIAdBA3RqKwMAOQMgQQEhBQsgBQvWCQMJfwR8AX8jgICAgABBEGsiBSSAgICAACAAKAIAQQF0IQYCQCACQQFIDQAgAkEDcSEHAkACQCACQQRPDQBBACEIDAELIAJB/P///wdxIQlBACEIIAEhCgNAIAooAgAgCkEQaigCAGogCkEgaigCAGogCkEwaigCAGpBAXQgBmohBiAKQcAAaiEKIAkgCEEEaiIIRw0ACwsgB0UNACABIAhBBHRqIQoDQCAKKAIAQQF0IAZqIQYgCkEQaiEKIAdBf2oiBw0ACwtBACELIAZBASAGQQFKG0EDdBCfgICAACEJIAJBASACQQFKG0ECdBCfgICAACEMAkAgCUUNACAMRQ0AIAAgAyAJEIqAgIAARQ0AAkAgAkEBSA0AIAAoAgBBAXQhCiAMIQcgAiEIA0AgByAKQQF1NgIAIAEgAyAJIApBA3RqEIqAgIAARQ0CIAdBBGohByABKAIAQQF0IApqIQogAUEQaiEBIAhBf2oiCA0ACwtBACELIAVBADYCDCAJIAYgDCACIAVBDGoQi4CAgAAiAUUNACAEIAE2AgggBCAGNgIEIAQgCTYCACAEIAUoAgwiDTYCDCAGIQoCQCACRQ0AIAwoAgBBAXQhCgsCQAJAIApBAU4NAEQAAAAAAAAAACEDDAELIApBf2ohACAJIApBA3RqIgdBeGorAwAhDiAHQXBqKwMAIQ8CQAJAIApBA08NAEQAAAAAAAAAACEDQQAhBwwBCyAAQQF2QQFqQX5xIQhEAAAAAAAAAAAhA0EAIQcgCSEKIA4hECAPIREDQCADIBEgCisDACIOoSAQIApBCGorAwAiEaCioCAOIApBEGorAwAiD6EgESAKQRhqKwMAIg6goqAhAyAKQSBqIQogB0EEaiEHIA4hECAPIREgCEF+aiIIDQALCwJAIABBAnENACADIA8gCSAHQQN0aiIKKwMAoSAOIApBCGorAwCgoqAhAwsgA0QAAAAAAADgP6IhAwsgA5khEQJAIAJBAUgNACACQX9qIRJBACEAA0AgDCAAQQJ0aiIKKAIAIgtBAXQhByAGIQgCQCAAIBJODQAgCkEEaigCAEEBdCEIC0QAAAAAAAAAACEDAkAgByAITg0AIAkgC0EEdGohCiAJIAhBA3RqIgtBeGorAwAhDiALQXBqKwMAIQ9EAAAAAAAAAAAhAwNAIAMgDyAKKwMAIhChIA4gCkEIaisDACIPoKKgIQMgCkEQaiEKIA8hDiAQIQ8gB0ECaiIHIAhIDQALIANEAAAAAAAA4D+iIQMLIBEgA5mhIREgAEEBaiIAIAJHDQALC0QAAAAAAAAAACEQRAAAAAAAAAAAIQMCQCANQQFIDQBEAAAAAAAAAAAhA0EAIQoDQCADIAkgASgCAEEEdGoiBysDACIOIAkgAUEIaigCAEEEdGoiBisDAKEgCSABQQRqKAIAQQR0aiIIQQhqKwMAIAdBCGorAwAiD6GiIA4gCCsDAKEgBkEIaisDACAPoaKhmUQAAAAAAADgP6KgIQMgAUEMaiEBIApBA2oiCiANSA0ACwsCQAJAIBFEAAAAAAAAAABiDQAgA0QAAAAAAAAAAGENAQsgESADoZkgEZlEEeotgZmXcT2loyEQCyAEIBA5AxBBASELCyAFQRBqJICAgIAAIAsL3QMBCH8jgICAgABBMGsiAySAgICAAEEBIQQCQAJAAkAgAUQAAAAAAAAAAGQgAUQAAAAAAAAAAGNyQQFHDQAgACgCDA0BCyAAKAIAIgVBAUgNAUEBIQQgBUEBdCIFQQEgBUEBShsiBkEDcSEHIAAoAgQhCEEAIQkCQCAFQQRIDQAgBkH8////B3EhCkEAIQBBACEJA0AgAiAAaiIFIAggAGoiBisDADkDACAFQQhqIAZBCGorAwA5AwAgBUEQaiAGQRBqKwMAOQMAIAVBGGogBkEYaisDADkDACAAQSBqIQAgCiAJQQRqIglHDQALCyAHRQ0BIAggCUEDdCIFaiEAIAIgBWohAgNAIAIgACsDADkDACAAQQhqIQAgAkEIaiECIAdBf2oiBw0ADAILC0EBIQQCQCAAKAIEIAAoAgAgACgCCEEBIANBCGoQiICAgAANAEEAIQQMAQsgACgCACIFQQFIDQAgBUEBdCEHIAAoAgQhAEEAIQYgAygCGCEFA0AgAiAAKwMAIAUrAwAgAaKhOQMAIAJBCGogAEEIaisDACAFQQhqKwMAIAGioTkDACAAQRBqIQAgBUEQaiEFIAJBEGohAiAGQQJqIgYgB0gNAAsLIANBMGokgICAgAAgBAuLEgYLfwF8AX8BfAF/CnxBACEFQQBBADYC1IqAgABBAEEANgLQioCAAEEAQQA2AtiKgIAAQQBBADYC3IqAgABBAEEANgLgioCAAEEAQQA2AuSKgIAAQQBBADoA6IqAgAAgASEGAkAgA0UNACACKAIAQQF0IQYLIABBACAGQQEQjICAgAAhBwJAQQAtAOiKgIAADQACQAJAIAdBAEgNAEEAKALQioCAACAHQTBsaiIFKAIcIAUoAhhHDQELIARBADYCAEHsioCAAA8LAkAgA0UNAAJAIANBAnQQn4CAgAAiCA0AQQAPCyADQQFIDQAgA0F/aiEJQQAhCkEAIQsDQCACIAtBAnRqIgUoAgBBAXQhDCABIQ0CQCALIAlODQAgBUEEaigCAEEBdCENC0EAIQUgACAMIA1BABCMgICAACEOQQAtAOiKgIAADQICQCAOQQBIDQACQCAOQQAoAtCKgIAAIgwgDkEwbGoiBSgCHEcNACAFQQE2AigLIA4hBSAOIQ8DQAJAAkAgDCAFQTBsaiINKwMAIhAgDCAPQTBsaiIRKwMAIhJjDQAgECASYg0BIA0rAwggESsDCGNFDQELIAUhDwsgDSgCHCIFIA5HDQALIAggCkECdGogDzYCACAKQQFqIQoLIAtBAWoiCyADRw0ACyAKQQFIDQAgCEEEaiEDIApBf2ohC0EAIQVBACgC0IqAgAAhEUEAIQ4DQCARIAggDkECdGooAgBBMGxqIg0rAwAiECAQoUQAAAAAAAAAAGINAiANKwMIIhIgEqFEAAAAAAAAAABiDQICQCAOQQFqIg4gCk4NACADIQ0gCyEMA0ACQCAQIBEgDSgCAEEwbGoiDysDAGINACASIA8rAwhhDQULIA1BBGohDSAMQX9qIgwNAAsLIANBBGohAyALQX9qIQsgDiAKRw0ACwJAIApBAUYNAEEAKALQioCAACEOIAghAkECIQlBASELA0AgDiAIIAtBAnRqKAIAIhNBMGxqIgVBCGohAyAFKwMAIRAgAiEFIAkhDCALIQ0CQAJAA0ACQCAOIAUoAgAiD0EwbGoiESsDACISIBBkDQAgEiAQYg0CIBErAwggAysDAGRFDQMLIAVBBGogDzYCACANQX9qIQ0gBUF8aiEFIAxBf2oiDEEBSg0AC0EAIQ0MAQsgDEF/aiENCyAIIA1BAnRqIBM2AgAgAkEEaiECIAlBAWohCSALQQFqIgsgCkcNAAsLIApBAUgNAEEAKALQioCAACENQQAhAwNAIA0gCCADQQJ0aigCACILQTBsaiIFKwMIIRACQAJAAkAgBSsDACISIA0gB0EwbGoiBSsDAGINACAHIQ8gECAFKwMIYQ0BC0QAAAAAAADw/yEUQX8hDiAHIQUDQAJAIBIgDSANIAUiEUEwbGoiDCgCHCIFQTBsaiIPKwMAIhViDQAgECAPKwMIYg0AIAUhDwwCCwJAIBAgDCsDCCIWZUUNACAQIA8rAwgiF2ZFDQAgFyAWYQ0AIAwrAwAiGCAQIBahIBUgGKGiIBcgFqGjoCIWIBJlRQ0AIBYgFGRFDQAgFiEUIBEgBSAYIBVjGyIOIQ8gFiASYQ0CCyAFIAdHDQALIA5BAEgNASAUIBIgECANIA5BMGxqIgUrAwgiGWMiDBshGiASIBQgDBshGyAFKwMAIRdEAAAAAAAA8H8hHCAOIQ8gDiEMA0ACQCASIA0gDEEwbGoiBSsDACIWYQ0AIBIgFmZFDQAgFiAXZkUNACAaIBahIh0gECAFKwMIIhihIhWiIBsgFqEiFCAVomZFDQAgFCAZIBihIhiiIBcgFqEgFaIiFGZFDQAgFCAdIBiiZkUNACAMIAsQjYCAgABFDQACQCAVmSASIBahoyIVIBxjDQAgFSAcYg0BIBYgDSAPQTBsaiIRKwMAIhhkDQAgFiAYYg0BIBErAwgiFiANIBEoAhhBMGxqIgIrAwihIA0gBSgCGEEwbGoiCSsDACAYoaIgGCACKwMAoSAJKwMIIBahoqFEAAAAAAAAAABjRQ0BIBYgDSAFKAIcQTBsaiICKwMIoSANIBEoAhxBMGxqIhErAwAgGKGiIBggAisDAKEgESsDCCAWoaKhRAAAAAAAAAAAY0UNAQsgDCEPIBUhHAsgBSgCHCIMIA5HDQALCyAPQQBIDQBBACEFIA8gCxCOgICAACENQQAtAOiKgIAADQMgDUEAKALQioCAACIFIA1BMGxqKAIcEI+AgIAAGiAPIAUgD0EwbGooAhwQj4CAgAAhB0EAKALQioCAACENC0EAIQVBAC0A6IqAgAANAiADQQFqIgMgCkcNAAsLRAAAAAAAAAAAIRZEAAAAAAAAAAAhFUQAAAAAAAAAACEQAkAgAUGhAUgNAAJAAkAgBkEBTg0ARAAAAAAAAPD/IRdEAAAAAAAA8H8hFkQAAAAAAADwfyEVRAAAAAAAAPD/IRgMAQsgBkF/aiEPAkACQCAGQQNPDQBEAAAAAAAA8H8hFUQAAAAAAADw/yEYQQAhDUQAAAAAAADw/yEXRAAAAAAAAPB/IRYMAQsgD0EBdkEBakF+cSEMRAAAAAAAAPB/IRVEAAAAAAAA8P8hGEEAIQ0gACEFRAAAAAAAAPD/IRdEAAAAAAAA8H8hFgNAIAVBGGorAwAiECAFQQhqKwMAIhIgGCASIBhkGyIYIBAgGGQbIRggECASIBUgEiAVYxsiEiAQIBJjGyEVIAVBEGorAwAiECAFKwMAIhIgFyASIBdkGyIXIBAgF2QbIRcgECASIBYgEiAWYxsiEiAQIBJjGyEWIAVBIGohBSANQQRqIQ0gDEF+aiIMDQALCyAPQQJxDQAgACANQQN0aiIFKwMAIhAgFyAQIBdkGyEXIBAgFiAQIBZjGyEWIAVBCGorAwAiECAYIBAgGGQbIRggECAVIBAgFWMbIRULRAAAAADA/99AIBcgFqEgGCAVoaUiEKNEAAAAAAAAAAAgEEQAAAAAAAAAAGIbIRALQQAhBSAHIBYgFSAQQQBBABCQgICAAEEALQDoioCAAA0AIARBACgC5IqAgAAiBTYCAEEAKALcioCAAEHsioCAACAFGw8LIAULqwQDA38EfAF/AkACQAJAAkAgASACTiIEDQAgACABQQN0aiEFIAAgAkEDdGoiBkF4aisDACEHIAZBcGorAwAhCEQAAAAAAAAAACEJIAEhBgNAIAkgCCAFKwMAIgqhIAcgBUEIaisDACIIoKKgIQkgBUEQaiEFIAghByAKIQggBkECaiIGIAJIDQALIAlEAAAAAAAAAABkIANGDQJBfyELIAJBfmoiBiABTg0BDAMLQX8hCyADRQ0CIAJBfmoiBiABSA0CCyAAIAZBA3RqIQVBfyELA0AgBkECbSAFKwMAIAVBCGorAwAgCxCRgICAACELIAVBcGohBSAGQX5qIgIhBiACIAFODQAMAgsLQX8hCyAEDQAgACABQQN0aiEFQX8hCwNAIAFBAm0gBSsDACAFQQhqKwMAIAsQkYCAgAAhCyAFQRBqIQUgAUECaiIGIQEgBiACSA0ACwtBfyEFAkBBAC0A6IqAgAANAAJAIAtBAE4NACALDwsCQEEAKALQioCAACIFIAtBMGxqIgYrAwAgBSAGKAIcIgJBMGxqIgErAwBhDQAgCw8LAkAgBisDCCABKwMIYQ0AIAsPCyAFIAJBMGxqIAUgC0EwbGoiASgCGCILNgIYIAUgC0EwbGogAjYCHCABKAIkIQsCQCABKAIgIgFBAEgNACAFIAFBMGxqIAs2AiQLIAZBHGohBgJAIAtBAEgNACAFIAtBMGxqIAE2AiALIAYoAgAhBQsgBQudAgICfwx8QQAhAkEAKALQioCAACIDIAFBMGxqIgErAwAiBCADIABBMGxqIgArAwAiBaEhBiABKwMIIgcgACsDCCIIoSEJAkACQCAIIAMgACgCGEEwbGoiASsDCCIKoSADIAAoAhxBMGxqIgMrAwAiCyAFoSIMoiAFIAErAwAiDaEgAysDCCIOIAihIg+ioUQAAAAAAAAAAGNFDQAgCSALIAShoiAOIAehIAaioUQAAAAAAAAAAGZFDQEgCiAIoSAEIA2hoiANIAWhIAcgCqGioUQAAAAAAAAAAGYPC0EBIQIgCSANIAShoiAKIAehIAaioUQAAAAAAAAAAGMNACAPIAQgC6GiIAwgByAOoaKhRAAAAAAAAAAAYyECCyACC8oOAwJ/AnwKf0EAKALQioCAACICIABBMGxqIgMrAwghBCADKwMAIQUgAygCECEGAkACQAJAQQAoAtiKgIAAIgdBACgC1IqAgAAiCEcNACAHQQF0QRBqIghBMGwQn4CAgAAiAkUNAQJAQQAoAtiKgIAAIgdBAUgNACAHQQNxIQlBACgC0IqAgAAhCkEAIQsCQCAHQQRJDQAgB0H8////B3EhDEEAIQ1BACELA0AgAiANaiIDIAogDWoiDikDADcDACADQShqIA5BKGopAwA3AwAgA0EgaiAOQSBqKQMANwMAIANBGGogDkEYaikDADcDACADQRBqIA5BEGopAwA3AwAgA0EIaiAOQQhqKQMANwMAIANBMGogDkEwaikDADcDACADQThqIA5BOGopAwA3AwAgA0HAAGogDkHAAGopAwA3AwAgA0HIAGogDkHIAGopAwA3AwAgA0HQAGogDkHQAGopAwA3AwAgA0HYAGogDkHYAGopAwA3AwAgA0GIAWogDkGIAWopAwA3AwAgA0GAAWogDkGAAWopAwA3AwAgA0H4AGogDkH4AGopAwA3AwAgA0HwAGogDkHwAGopAwA3AwAgA0HoAGogDkHoAGopAwA3AwAgA0HgAGogDkHgAGopAwA3AwAgA0GQAWogDkGQAWopAwA3AwAgA0GYAWogDkGYAWopAwA3AwAgA0GgAWogDkGgAWopAwA3AwAgA0GoAWogDkGoAWopAwA3AwAgA0GwAWogDkGwAWopAwA3AwAgA0G4AWogDkG4AWopAwA3AwAgDUHAAWohDSAMIAtBBGoiC0cNAAsLIAlFDQAgAiALQTBsIg5qIQMgCiAOaiEOA0AgAyAOKQMANwMAIANBKGogDkEoaikDADcDACADQSBqIA5BIGopAwA3AwAgA0EYaiAOQRhqKQMANwMAIANBEGogDkEQaikDADcDACADQQhqIA5BCGopAwA3AwAgA0EwaiEDIA5BMGohDiAJQX9qIgkNAAsLQQAgCDYC1IqAgABBACACNgLQioCAAAsgAiAHQTBsaiIDIAY2AhAgAyAEOQMIIAMgBTkDACADQv////8PNwIkIANCfzcCHCADQoCAgIBwNwIUQQAgB0EBaiIKNgLYioCAAAwBC0EAIQdBAEEBOgDoioCAAEEAKALUioCAACEIQQAoAtiKgIAAIQpBACgC0IqAgAAhAgsgAiABQTBsaiIDKwMIIQQgAysDACEFIAMoAhAhBgJAAkAgCiAIRw0AIAhBAXRBEGoiD0EwbBCfgICAACICRQ0BAkBBACgC2IqAgAAiCkEBSA0AIApBA3EhCUEAKALQioCAACEIQQAhCwJAIApBBEkNACAKQfz///8HcSEMQQAhDUEAIQsDQCACIA1qIgMgCCANaiIOKQMANwMAIANBKGogDkEoaikDADcDACADQSBqIA5BIGopAwA3AwAgA0EYaiAOQRhqKQMANwMAIANBEGogDkEQaikDADcDACADQQhqIA5BCGopAwA3AwAgA0EwaiAOQTBqKQMANwMAIANBOGogDkE4aikDADcDACADQcAAaiAOQcAAaikDADcDACADQcgAaiAOQcgAaikDADcDACADQdAAaiAOQdAAaikDADcDACADQdgAaiAOQdgAaikDADcDACADQYgBaiAOQYgBaikDADcDACADQYABaiAOQYABaikDADcDACADQfgAaiAOQfgAaikDADcDACADQfAAaiAOQfAAaikDADcDACADQegAaiAOQegAaikDADcDACADQeAAaiAOQeAAaikDADcDACADQZABaiAOQZABaikDADcDACADQZgBaiAOQZgBaikDADcDACADQaABaiAOQaABaikDADcDACADQagBaiAOQagBaikDADcDACADQbABaiAOQbABaikDADcDACADQbgBaiAOQbgBaikDADcDACANQcABaiENIAwgC0EEaiILRw0ACwsgCUUNACACIAtBMGwiDmohAyAIIA5qIQ4DQCADIA4pAwA3AwAgA0EoaiAOQShqKQMANwMAIANBIGogDkEgaikDADcDACADQRhqIA5BGGopAwA3AwAgA0EQaiAOQRBqKQMANwMAIANBCGogDkEIaikDADcDACADQTBqIQMgDkEwaiEOIAlBf2oiCQ0ACwtBACAPNgLUioCAAEEAIAI2AtCKgIAACyACIApBMGxqIgMgBjYCECADIAQ5AwggAyAFOQMAIANC/////w83AiQgA0J/NwIcIANCgICAgHA3AhRBACAKQQFqNgLYioCAAEF/IQ4CQEEALQDoioCAAA0AIAIgAEEwbGoiDSgCHCEOIA0gATYCHCACIAFBMGxqIgkoAhghDSAJIAA2AhggAiAHQTBsaiIJIA42AhwgAiAOQTBsaiAHNgIYIANBHGogBzYCACAJIAo2AhggAiANQTBsaiAKNgIcIANBGGogDTYCACAKIQ4LIA4PC0EAQQE6AOiKgIAAQX8LugIDBX8EfAF/AkAgAEEATg0AIAAPCyAAIAEgAUEASBshAkEAKALQioCAACEDAkADQCADIABBMGxqIgEoAhwhAEEAIQQCQCABKAIoDQAgASgCGCEFIAMgAEEwbGoiBisDCCEHIAErAwghCAJAAkAgASsDACIJIAYrAwAiCmINACAIIAdhDQELIAogCaEgCCADIAVBMGxqIgsrAwihoiAJIAsrAwChIAcgCKGioUQAAAAAAAAAAGINAQsgAyAFQTBsaiAANgIcIAYgBTYCGCABKAIkIQACQCABKAIgIgRBAEgNACADIARBMGxqIAA2AiQLIAFBGGohAQJAIABBAEgNACADIABBMGxqIAQ2AiALQQEhBCABKAIAIgIhACACIAMgAkEwbGooAhxGDQILIAQNACAAIAJHDQALCyACC7gqCQV/AXwBfwF8CX8CfAF/DXwEfwJAA0AgAEEASA0BQQAtAOiKgIAAQQFxDQEgBUGRAyAFQZEDShshBgNAAkAgBSAGRw0AQQBBAToA6IqAgAAPC0EAKALQioCAACEHAkAgA0QAAAAAAAAAAGQgA0QAAAAAAAAAAGNyQQFHIggNACAEDQAg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gICAAJohFkEAKAL8i4CAAEUNASAVIA4gFhCigICAACERDAILIAUgA0EMbCIXaiAVIACitjgCACAFIBdBBGoiGGpBgICA+AM2AgAgBSAXQQhqIh5qIBEgAKK2OAIAIAggGGogGTgCACAIIBdqIBo4AgAgCCAeaiAbOAIAIBQgAzYCACAJIANBA3RqIgNBBGpBgICA/AM2AgAgAyAcOAIAIAFBAmohASAEIAZGDQMMAgsgFSAOIBYQhICAgAAhEQsgBSADQQxsIhdqQoCAgICAgICAPzcCACAFIBdBCGoiGGpBADYCACAIIBdqIhdBBGogDiARo7Y4AgAgFyAVIBGjtjgCACAIIBhqIBYgEaO2OAIAIBQgAzYCACAJIANBA3RqIgNBBGpBgICA/AM2AgAgAyAdtjgCACABQQJqIQEgBCAGRw0AIARB/v///wdxIQYgBEEBcSESQQAhDyAKIQMDQCAHKQIAIR8gA0EIaiANKAIANgIAIAMgHzcCACAHQQRqKQIAIR8gA0EUaiANQQRqKAIANgIAIANBDGogHzcCACADQRhqIQMgDUEIaiENIAdBCGohByAPQQZqIQ8gBkF+aiIGDQALIBJFDQMgBykCACEfIANBCGogDSgCADYCACADIB83AgAgD0EDaiEPDAMLIA9BCGohDyASQQhqIRIgE0EEaiETIBRBBGohFCAGQQFqIQYMAQsLIARBBmwhDyAKIQMgBCESA0AgB0EEaiITKAIAIRQgDUEEaiIXKAIAIQYgBygCACEHIANBFGogDSgCADYCACADQRBqIAY2AgAgA0EMaiAHNgIAIANBCGogBjYCACADQQRqIBQ2AgAgAyAHNgIAIANBGGohAyATIQcgFyENIBJBf2oiEg0ACwsCQAJAIAINACABIR4MAQsgBSABQQxsIgNqIhRBADYCACAFIANBBHIiBmpBgICA+Hs2AgAgBSADQQhqIgdqQQA2AgAgCCAGakGAgID8ezYCACAIIANqIhdBADYCACAIIAdqQQA2AgAgCSABQQN0aiIDQoCAgPiDgICAPzcCACAEQX9zIRggAUEBciECIANBFGohAyALIQYgDCENQQAhE0EAIQcDQCAUIAdqIhJBFGogDSsDACIRtjgCACASQRBqQYCAgPh7NgIAIBJBDGogBisDACIVtjgCACAXIAdqIhJBFGpBADYCACAS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IAFvQRhsaiIfKwMAIRQgACASQQFqIhIgAW8gAWogAW9BGGxqIiArAwAhHiAYQRBqKwMAIRkgGEEIaisDACEaIBNBEGorAwAhFSATQQhqKwMAIRYgH0EQaisDACEhIB9BCGorAwAhIiAgQRBqKwMAIRwgIEEIaisDACEdDAILIAAgGEEYbGoiEysDACEeIBNBEGorAwAhHCATQQhqKwMAIR0LAkACQCASQQJqIhIgAUgNACAKKwMAIhQgFKAgCSsDAKEhISAMKwMAIhQgFKAgCysDAKEhIiAOKwMAIhQgFKAgDSsDAKEhFAwBCyAAIBJBGGxqIhIrAwAhFCASQRBqKwMAISEgEkEIaisDACEiCyAYIRILIBkgFaEhIyAaIBahISQgGyAXoSElAkACQEEAKAL8i4CAAEUNACAlICQgIxCigICAACEmDAELICUgJCAjEISAgIAAISYLIBwgGaEhJyAdIBqhISggHiAboSEpAkACQEEAKAL8i4CAAEUNACApICggJxCigICAACEqDAELICkgKCAnEISAgIAAISoLICEgHKEhKyAiIB2hISwgFCAeoSEtAkACQEEAKAL8i4CAAEUNACAtICwgKxCigICAACEUDAELIC0gLCArEISAgIAAIRQLAkAgA0EBSA0AIAggBmohEyAmn0SN7bWg98awPqVEAAAAAAAAAACgIiIgKp9Eje21oPfGsD6loCIuICKhIS8gByAGQQN0aiEGIC4gFJ9Eje21oPfGsD6loCIUICKhITAgFCAuoSExRAAAAAAAAAAAISYgAyEYA0AgBkEQaiAVICMgIiAvICaiIA+joCIhICKjIiqioCIyICEgLqMiMyAZICcgISAioSI0IC+jIhSioCI1IDKhoqAiNiAUIDUgNCAwoyIyIBwgKyAhIC6hIDGjIiGioCA1oaKgIDahoqA5AwAgBkEIaiAWICQgKqKgIjQgMyAaICggFKKgIjUgNKGioCI0IBQgNSAyIB0gLCAhoqAgNaGioCA0oaKgOQMAIAYgFyAlICqioCI1IDMgGyApIBSioCIqIDWhoqAiMyAUICogMiAeIC0gIaKgICqhoqAgM6GioDkDACAGQRhqIQYgJkQAAAAAAADwP6AhJiAYQX9qIhgNAAsgEyEGCyASIAVIDQALCwJAIAINAAJAAkAgAUEASg0AIAArAxAiFCAUoCAA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`,Ut=`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DP0AADAief3yAf3wASAP/QoDECJ6IAz9AABQInz98gH98AEgDP0AAHD98AEidyAP/QoDGCKEASB1/ewB/fIBIA/9CgMgIoUBIHn97AH98gH98AEgD/0KAygieSB8/ewB/fIB/fABInX98AEifCAbIHwgG/1K/VIhGyAZIAz9AAAAInz98gEgdiAM/QAAICKGAf3yAf3wASB6IAz9AABAInb98gH98AEgDP0AAGD98AEiGSCEASB8/ewB/fIBIIUBIIYB/ewB/fIB/fABIHkgdv3sAf3yAf3wASJ2/fABInkgJSB5ICX9Sv1SISUgdyB1/fEBInkgHCB5IBz9Sf1SIRwgGSB2/fEBInkgJiB5ICb9Sf1SISYgdyB2IHb98gEidv0hACB2/SEBoCB1IHX98gH9IQCgn/0iASF1CyAOIGNBBHRqIBn9XiB1/V79DQABAgMEBQYHEBESExQVFhf9CwAAIGNBAWohYwsgggFBEGohggEggQFBBGoigQEgB0gNAAsLAkAgMg0AICEgUv3yASEZICMgU/3yASF1IB8gUf3yASF2ICIgUv3yASF3ICQgU/3yASF5ICAgUf3yASF6ICEgVv3yASF8ICMgV/3yASGEASAiIFb98gEhhQEgJCBX/fIBIYYBICMgW/3yASGHASAkIFv98gEhiAEgIyBf/fIBICEgXv3yAf3wASAfIF398gH98AEgHSBc/fIB/fABISMgJCBf/fIBICIgXv3yAf3wASAgIF398gH98AEgHiBc/fIB/fABISQgiAEgIiBa/fIB/fABICAgWf3yAf3wASAeIFj98gH98AEhIiCHASAhIFr98gH98AEgHyBZ/fIB/fABIB0gWP3yAf3wASEhIIYBIIUB/fABICAgVf3yAf3wASAeIFT98gH98AEhICCEASB8/fABIB8gVf3yAf3wASAdIFT98gH98AEhHyB6IHkgd/3wAf3wASAeIFD98gH98AEhHiB2IHUgGf3wAf3wASAdIFD98gH98AEhHQsgZEEBaiJkIApHDQALCyABICX9CwCoBCABICb9CwCQBCABIB39CwPwASABIB79CwPgASABIB/9CwPQASABICD9CwPAASABICH9CwOwASABICL9CwOgASABICP9CwOQASABICT9CwOAASABIBz9IQA5A6AEIAAgGjYCDCABIBv9IQA5A7gECyAWCxEAQQBBkIiEgAA2AoCIgIAAC2sBAn8CQEEAKAKAiICAACIBDQBBkIiEgAAhAUEAQZCIhIAANgKAiICAAAsCQCABQQdqQXhxIgIgAGoiAT8AQRB0IgBNDQAgASAAa0H//wNqQRB2QABBf0cNAEEADwtBACABNgKAiICAACACCw0AQQAgADYChIiAgAALhQIDAX8CfAF/AkACQCAAIABiIgJFDQBEAAAAAAAAAAAhA0QAAAAAAAAAACEEDAELRAAAAAAAAAAAIQQgAJkhAyAARAAAAAAAAAAAZCAARAAAAAAAAAAAY3JBAUcNACADIQQLAkAgASABYQ0ARAAAAAAAAPB/RAAAAAAAAPh/IAREAAAAAAAA8H9hGw8LRAAAAAAAAPB/RAAAAAAAAPh/IAGZIgEgBCABIARkGyIERAAAAAAAAPB/YSIFGyEAAkAgBQ0AIAINAEQAAAAAAAAAACEAIAREAAAAAAAAAABhDQAgBCADIASjIgAgAKIiACABIASjIgEgAaIgACAAoaCgn6IhAAsgAAvMAgQCfAF/AXwBf0QAAAAAAAAAACEDRAAAAAAAAAAAIQRBASEFRAAAAAAAAAAAIQYCQCAAIABiDQBEAAAAAAAAAAAhBiAAmSEEQQAhBSAARAAAAAAAAAAAZCAARAAAAAAAAAAAY3JBAUcNACAEIQYLAkACQCABIAFhDQBBASEFDAELIAGZIgMgBmRFDQAgAyEGCwJAIAIgAmENAEQAAAAAAADwf0QAAAAAAAD4fyAGRAAAAAAAAPB/YRsPC0QAAAAAAADwf0QAAAAAAAD4fyACmSICIAYgAiAGZBsiAEQAAAAAAADwf2EiBxshBgJAIAcNACAFDQBEAAAAAAAAAAAhBiAARAAAAAAAAAAAYQ0AIAAgBCAAoyIGIAaiIgYgAyAAoyIBIAGiIAYgBqGgIgGgIgQgAiAAoyICIAKiIAEgBiAEoaCgoJ+iIQYLIAYL`,Wt=``,Gt=null,Kt={env:{sin:Math.sin,cos:Math.cos,atan2:Math.atan2,tan:Math.tan,acos:Math.acos,hypot2:Math.hypot,hypot3:Math.hypot,number:(e,t)=>Number(Wt.slice(e,t)),material:e=>Gt(e)}};function qt(e){if(typeof Uint8Array.fromBase64==`function`)return Uint8Array.fromBase64(e);if(typeof Buffer==`function`)return Buffer.from(e,`base64`);let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}async function Jt(e){try{if(typeof WebAssembly!=`object`)return null;let{instance:t}=await WebAssembly.instantiate(qt(e),Kt);return t.exports}catch{return null}}var[z,Yt]=await Promise.all([Jt(Ht),Jt(Ut)]),Xt=z!==null;function Zt(){let e=[0,-0,3,-4,5e-324,1e308,1/0,NaN];for(let t of e)for(let n of e)if(!Object.is(z.hypot2(t,n),Math.hypot(t,n)))return!1;let t=12345,n=()=>(t=Math.imul(t,1103515245)+12345>>>0,(t/4294967296-.5)*10**(t%41-20));for(let e=0;e<100;e++){let e=n(),t=n(),r=n();if(!Object.is(z.hypot3(e,t,r),Math.hypot(e,t,r))||!Object.is(z.hypot2(e,t),Math.hypot(e,t)))return!1}return!0}z&&z.set_native_hypot(+!!Zt());function Qt(){return Xt&&Yt!==null}var B=()=>z.memory.buffer;function V(e,t=z){let n=t.alloc(Math.max(1,e.byteLength));return n&&new Uint8Array(t.memory.buffer,n,e.byteLength).set(new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),n}var $t=new TextEncoder,en={f64:[0,Float64Array],f32:[1,Float32Array],index:[2,Uint32Array]};function tn(e,t){if(!Xt)return null;let[n,r]=en[t],i=e.length;z.reset();let a=z.alloc(Math.max(1,i)),o=a&&z.alloc((Math.floor(i/2)+1)*r.BYTES_PER_ELEMENT);if(!o)return null;let s=$t.encodeInto(e,new Uint8Array(B(),a,i));if(s.read!==i||s.written!==i)return null;Wt=e;let c=z.numbers(a,i,o,n);return Wt=``,c<0?null:new r(B(),o,c).slice()}function nn(e,t,n,r,i){if(!Xt||!(e instanceof Float32Array)||!(t instanceof Uint32Array)||i&&!(i instanceof Float32Array))return null;z.reset();let a=V(e),o=V(t),s=i?V(i):0;if(!a||!o||i&&!s)return null;let c=z.normals(a,e.length/3,o,t.length,s,n,r);if(!c)return null;let[l,u,d,f,p,m]=new Uint32Array(B(),c,6);return{positions:new Float32Array(B(),d,l*3).slice(),normals:new Float32Array(B(),f,l*3).slice(),uvs:new Float32Array(B(),p,l*2).slice(),indices:new Uint32Array(B(),m,u).slice()}}var rn=e=>e instanceof Float64Array?e:Float64Array.from(e),an=e=>e instanceof Uint8Array?e:Uint8Array.from(e);function on(e){let t=new Int32Array(e.length*4);for(let n=0;n<e.length;n++){let r=e[n],i=V(rn(r.points)),a=r.smooth?V(an(r.smooth)):0;if(!i||r.smooth&&!a)return 0;t[n*4]=r.points.length/2,t[n*4+1]=i,t[n*4+2]=a,t[n*4+3]=r.isWall===!1?0:1}return V(t)}function sn(e,t){let n=new Int32Array(Math.max(1,e.length*2));return e.forEach((e,r)=>{n[r*2]=t.length,n[r*2+1]=1+e.holes.length,t.push(e.outer,...e.holes)}),n}var cn=(e,t)=>{let[n,r,i,a,o,s]=new Uint32Array(B(),e,6),c=new ArrayBuffer((n*8+r)*4),l=new Float32Array(c,0,n*3),u=new Float32Array(c,n*12,n*3),d=new Float32Array(c,n*24,n*2),f=new Uint32Array(c,n*32,r);return l.set(new Float32Array(B(),i,n*3)),u.set(new Float32Array(B(),a,n*3)),d.set(new Float32Array(B(),o,n*2)),f.set(new Uint32Array(B(),s,r)),{positions:l,normals:u,uvs:d,indices:f,...t}};function ln(e,t,n,r,i,a,o){if(!Xt)return null;z.reset();let s=[...t],c=n?null:sn(r,s),l=on(s),u=new Int32Array(Math.max(1,e.length*3));for(let t=0;t<e.length;t++)if(u[t*3]=V(rn(e[t].points)),u[t*3+1]=e[t].points.length/3,u[t*3+2]=+!!e[t].closed,!u[t*3])return null;let d=V(Int32Array.from(t,(e,t)=>t)),f=V(u),p=V(n?rn(n):c),m=V(Int32Array.of(e.length,f,s.length,l,t.length,d,n?1:2,n?n.length/2:r.length,p,+!!o));if(!l||!d||!f||!p||!m)return null;let h=z.sweep(m,i,a);if(!h)return null;let[g,_,v]=new Uint32Array(B(),h+24,3);return cn(h,{open:g!==0,degenerate:Array.from(new Uint8Array(B(),_,e.length),e=>e!==0),errors:n?[]:Array.from(new Float64Array(B(),v,r.length))})}function un(e,t){if(!Xt)return null;z.reset();let n=V(rn(e)),r=t&&t.length?Int32Array.from(t):null,i=r?V(r):0;if(!n||r&&!i)return null;let a;try{a=z.triangulate(n,e.length,i,r?r.length:0)}catch{return null}if(!a)return null;let[o,s]=new Uint32Array(B(),a,2);return o?Array.from(new Uint32Array(B(),s,o)):[]}function dn(e,t,n,r,i,a,o,s){if(!Xt)return null;z.reset();let c=[],l=V(sn(e.regions,c)),u=V(Int32Array.from(e.walls,(e,t)=>c.length+t));c.push(...e.walls);let d=on(c),f=new Float64Array(Math.max(1,n.length*4));n.forEach((e,t)=>f.set([e.inset,e.z,e.nr,e.nz],t*4));let p=V(f),m=V(Int32Array.of(c.length,d,e.regions.length,l,e.walls.length,u,n.length,p));if(!l||!u||!d||!p||!m)return null;let h=z.extrude(m,t,r,i,a,o,s);if(!h)return null;let g=new Uint32Array(B(),h+24,1)[0];return cn(h,{errors:Array.from(new Float64Array(B(),g,e.regions.length))})}function fn(e){if(!Xt)return null;z.reset();let t=z.sphere_deviation(e);return t<0?null:t}var pn=(...e)=>e.every(e=>Number.isInteger(e)&&e>=0&&e<2**30),mn=e=>e?cn(e):null,hn={sphere:e=>Xt&&pn(e)?(z.reset(),mn(z.sphere(e))):null,cylinder:(e,t,n)=>Xt&&pn(t)?(z.reset(),mn(z.cylinder(e,t,+!!n))):null,capsule:(e,t)=>Xt&&pn(t)?(z.reset(),mn(z.capsule(e,t))):null,torus:(e,t,n,r)=>Xt&&pn(n,r)?(z.reset(),mn(z.torus(e,t,n,r))):null,roundedBox:(e,t,n,r,i)=>Xt&&pn(i)&&i>=1?(z.reset(),mn(z.rounded_box(e,t,n,r,i))):null};function gn(e,t,n){if(!Xt||!pn(n)||e.length<6||e.length%3)return null;z.reset();let r=V(rn(e)),i=r&&z.catmull_rom(r,e.length/3,+!!t,n);if(!i)return null;let[a,o]=new Uint32Array(B(),i,2);return new Float64Array(B(),o,a*3).slice()}function _n(e,t,n,r){if(!Xt||!pn(e,n,r)||e<1)return null;z.reset();let i=z.gear_outline(e,t,n,r);if(!i)return null;let[a,o,s,c]=new Uint32Array(B(),i,4),[l,u]=new Float64Array(B(),c,2);return{outline:{points:new Float64Array(B(),o,a*2).slice(),smooth:new Uint8Array(B(),s,a).slice(),closed:!0},outerRadius:l,rootRadius:u}}var vn={KIND:0,FIRST:1,COUNT:2,STATE:3,MODE:4,NX:5,NZ:6,RANDOM:7,CHOICES:8,OPS:9,NOPS:10,MATS:11,ROWS:12,NROWS:13,BOUNDS:14,MATERIALS:15,LODS:16,OUTER_LOD:17,SWITCH:18,SLOTS:19,OUT:20,SIZE:29},yn={WORLD:0,ACC:16,STEP:32,SPACING:48,JITTER:50,RADIUS:51,AREA:52,ROTATION:54,SCALE:60,BOUNDS:66,SIZE:72};function bn(e,t,n,r,i){if(!Xt||!Yt)return null;Yt.reset();let a=vn;e[a.OPS]=V(n.ops,Yt),e[a.MATS]=V(n.mats,Yt),e[a.ROWS]=V(n.table,Yt),e[a.BOUNDS]=V(n.bounds,Yt),e[a.MATERIALS]=V(r,Yt);let o=V(e,Yt),s=V(t,Yt);if(!e[a.OPS]||!e[a.MATS]||!e[a.ROWS]||!e[a.BOUNDS]||!e[a.MATERIALS]||!o||!s)return null;Gt=i;try{if(!Yt.instances(o,s))return null}finally{Gt=null}let c=Yt.memory.buffer;e.set(new Int32Array(c,o,a.SIZE)),t.set(new Float64Array(c,s,yn.SIZE)),r.set(new Int32Array(c,e[a.MATERIALS],r.length));let l=e[a.COUNT]*e[a.NROWS],u=a.OUT;return{matrices:new Float32Array(c,e[u],l*16),spheres:new Float32Array(c,e[u+1],l*4),geom:new Uint32Array(c,e[u+2],l),mat:new Uint32Array(c,e[u+3],l),uid:new Uint32Array(c,e[u+4],l),lodNode:new Int32Array(c,e[u+5],l),lodChild:new Uint16Array(c,e[u+6],l),flags:new Uint8Array(c,e[u+7],l),switches:new Float64Array(c,e[u+8],e[a.COUNT]*e[a.LODS]*4)}}function xn(e){return e===32||e===9||e===10||e===13}function Sn(e){return`'${e.length>24?e.slice(0,24)+`…`:e}'`}function Cn(e){let t=0,n=e.length;for(;t<n&&xn(e.charCodeAt(t));)t++;if(t>=n)throw new I(`Expected a number but the value is empty.`,0,0);let r=ze(e,t);if(r<0)throw new I(`Expected a number but found ${Sn(e.trim())}.`,t,Math.max(1,e.trim().length));let i=Re,a=r;for(;a<n&&xn(e.charCodeAt(a));)a++;if(a<n)throw e[a]===`,`||xn(e.charCodeAt(r))?new I(`Expected a single number but found a list ${Sn(e.trim())}.`,a,1):new I(`Unexpected '${e[a]}' after number.`,a,1);return i}var wn=1024,Tn=(e,t)=>e.length>=wn?tn(e,t):null,En=new Float64Array(64);function Dn(e){let t=e.length,n=En,r=0,i=0;for(;i<t&&xn(e.charCodeAt(i));)i++;for(;i<t;){let a=ze(e,i);if(a<0){let n=i;for(;n<t&&!xn(e.charCodeAt(n))&&e[n]!==`,`;)n++;throw new I(`Expected a number but found ${Sn(e.slice(i,n)||e[i])}.`,i,Math.max(1,n-i))}if(r===n.length){let e=new Float64Array(n.length*2);e.set(n),n=e}n[r++]=Re,i=a;let o=!1;for(;i<t&&xn(e.charCodeAt(i));)i++,o=!0;if(i<t&&e.charCodeAt(i)===44){for(i++,o=!0;i<t&&xn(e.charCodeAt(i));)i++;if(i>=t)throw new I(`Trailing comma in number list.`,i-1,1)}if(i<t&&!o)throw new I(`Expected a separator (space or comma) but found '${e[i]}'.`,i,1)}return n.length<=4096&&(En=n),n.subarray(0,r)}function On(e,t=[]){let n=Dn(e);for(let e=0;e<n.length;e++)t.push(n[e]);return t}function kn(e){let t=Cn(e);if(!Number.isInteger(t))throw new I(`Expected a whole number but found ${Sn(e.trim())}.`,0,e.length);return t}function An(e){let t=e.trim();if(t===`true`)return!0;if(t===`false`)return!1;throw new I(`Expected 'true' or 'false' but found ${Sn(t)}.`,0,e.length,{suggestion:p(t,[`true`,`false`])||null})}function jn(e,t,n){let r=On(e);if(r.length!==t)throw new I(`${n} needs ${t} numbers (e.g. ${Array.from({length:t},(e,t)=>t+1).join(`,`)}) but ${r.length} ${r.length===1?`was`:`were`} given.`,0,e.length);return r}var Mn=/^[A-Za-z_][A-Za-z0-9_.:-]*$/;function Nn(e){let t=e.trim();if(!Mn.test(t))throw new I(`Invalid id ${Sn(t)}: ids start with a letter or '_' and contain letters, digits, '_', '-', '.' or ':'.`,0,e.length);return t}function Pn(e){let t=e.trim();return t.startsWith(`url(#`)&&t.endsWith(`)`)&&(t=t.slice(5,-1)),t[0]===`#`&&(t=t.slice(1)),Nn(t)}function Fn(e){let t=e.trim(),n=t.indexOf(`..`);if(n<0){let e=Cn(t);return[e,e]}let r=Cn(t.slice(0,n)),i;try{i=Cn(t.slice(n+2))}catch(e){throw new I(e.message,n+2+e.offset,e.length)}if(i<r)throw new I(`Range ${Sn(t)} is reversed: the lower bound must come first.`,0,e.length);return[r,i]}function In(e,t){let n=e.split(`,`);if(n.length===1){if(!t)throw new I(`Expected three comma-separated components, e.g. 0,0..360,0.`,0,e.length);return{uniform:!0,ranges:[Fn(n[0])]}}if(n.length!==3)throw new I(`Expected three comma-separated components but found ${n.length}.`,0,e.length);let r=[],i=0;for(let e of n){try{r.push(Fn(e))}catch(t){throw new I(t.message,i+(t.offset||0),t.length||e.length)}i+=e.length+1}return{uniform:!1,ranges:r}}function Ln(e){let t=e.split(/[\s,]+/).filter(Boolean);if(!t.length)throw new I(`Expected at least one id.`,0,e.length);let n=0;return t.map(t=>{let r=e.indexOf(t,n);n=r+t.length;try{return Pn(t)}catch(e){throw new I(e.message,r,t.length)}})}function Rn(e){let t=De(e);if(t)return t;let n=e.trim(),r=null;throw/^[a-z]+$/i.test(n)&&(r=p(n.toLowerCase(),[...Te.keys()])),new I(`Invalid color ${Sn(n)}.`,0,e.length,{suggestion:r,hint:`Colors are written #rgb, #rrggbb, #rrggbbaa, rgb(r,g,b), rgba(r,g,b,a) or as a CSS color name.`})}function zn(e){let t=e.trim(),n=1,r=t;return t.endsWith(`ms`)?(n=.001,r=t.slice(0,-2)):t.endsWith(`s`)&&(r=t.slice(0,-1)),Cn(r)*n}function Bn(e){let t=e.trim(),n=/^([A-Za-z][A-Za-z0-9_-]*)\s*\(([\s\S]*)\)$/.exec(t);if(!n)return null;let r=n[2].trim(),i=r?r.split(/\s*,\s*/):[];return{name:n[1],args:i,argOffset:e.indexOf(`(`)+1}}var Vn={checker:[[`count`,`number`,8],[`color1`,`color`,`#ffffff`],[`color2`,`color`,`#1a1a1a`]],grid:[[`count`,`number`,8],[`width`,`number`,.06],[`line`,`color`,`#222222`],[`background`,`color`,`#ffffff`]],stripes:[[`count`,`number`,8],[`color1`,`color`,`#ffffff`],[`color2`,`color`,`#1a1a1a`]],noise:[[`scale`,`number`,8],[`color1`,`color`,`#ffffff`],[`color2`,`color`,`#000000`],[`seed`,`number`,1]],bricks:[[`count`,`number`,6],[`brick`,`color`,`#b5543a`],[`mortar`,`color`,`#d8d0c4`]]},Hn={bumps:[[`count`,`number`,8],[`strength`,`number`,1]],tiles:[[`count`,`number`,4],[`strength`,`number`,1],[`gap`,`number`,.06]],noise:[[`scale`,`number`,8],[`strength`,`number`,1],[`seed`,`number`,1]],waves:[[`count`,`number`,6],[`strength`,`number`,1]],bricks:[[`count`,`number`,6],[`strength`,`number`,1]]};function Un(e,t,n){let r=Bn(e);if(r){let i=t[r.name];if(!i)throw new I(`Unknown procedural ${n} '${r.name}'.`,0,r.name.length,{suggestion:p(r.name,Object.keys(t)),hint:`Available: ${Object.keys(t).map(e=>e+`()`).join(`, `)}. Any other value is treated as an image URL.`});if(r.args.length>i.length)throw new I(`${r.name}() takes at most ${i.length} arguments but ${r.args.length} were given.`,0,e.length);let a={};return i.forEach(([t,n,i],o)=>{let s=r.args[o],c=s===void 0||s===``?i:s;try{a[t]=n===`number`?Cn(String(c)):Rn(String(c))}catch(n){throw new I(`${r.name}(): argument '${t}': ${n.message}`,r.argOffset,e.length-r.argOffset-1)}}),{kind:`procedural`,fn:r.name,params:a,key:e.trim()}}let i=e.trim();if(!i)throw new I(`Expected an image URL or a procedural texture such as checker(8).`,0,0);if(/\s/.test(i)&&!i.startsWith(`data:`))throw new I(`Image URLs must not contain spaces (escape them as %20).`,i.search(/\s/),1);return{kind:`url`,url:i,key:i}}function Wn(e){let t=e.trim(),n=Bn(t);if(n){if(n.name!==`helix`)throw new I(`Unknown spine function '${n.name}'.`,0,n.name.length,{suggestion:p(n.name,[`helix`])});if(n.args.length<3||n.args.length>4)throw new I(`helix() takes (radius, pitch, turns[, segmentsPerTurn]).`,0,t.length);let e=n.args.map(e=>Cn(e));if(e[0]<=0)throw new I(`helix(): radius must be positive.`,n.argOffset,n.args[0].length);if(e[2]<=0)throw new I(`helix(): turns must be positive.`,n.argOffset,t.length-n.argOffset);if(e[3]!==void 0&&(!Number.isInteger(e[3])||e[3]<3))throw new I(`helix(): segmentsPerTurn must be an integer of at least 3.`,n.argOffset,t.length-n.argOffset);return{kind:`helix`,radius:e[0],pitch:e[1],turns:e[2],segmentsPerTurn:e[3]||0}}if(/^[Mm]/.test(t))try{let t=Be(e,3);if(!t.segments.length)throw new I(`Empty 3D path.`,0,e.length);return{kind:`path`,segments:t.segments}}catch(e){throw e instanceof Ne?new I(e.message,e.offset,e.length,{code:e.code}):e}let r=On(e);if(r.length%3!=0)throw new I(`Point lists need 3 numbers per point; found ${r.length} numbers.`,0,e.length);if(r.length<6)throw new I(`A spine needs at least 2 points.`,0,e.length);return{kind:`points`,points:Float64Array.from(r)}}function Gn(e){let t=[],n=0;for(let r of e.split(`;`)){if(r.trim()===``){if(n+r.length<e.length||!t.length)throw new I(`Empty key value between semicolons.`,n,Math.max(1,r.length))}else try{t.push(On(r))}catch(e){throw e instanceof I?new I(e.message,n+e.offset,e.length,{suggestion:e.suggestion,hint:e.hint}):e}n+=r.length+1}return t}function Kn(e,t){switch(e.type){case`number`:case`angle`:return Cn(t);case`int`:return kn(t);case`bool`:return An(t);case`string`:return t;case`id`:return Nn(t);case`ref`:return Pn(t);case`vec2`:return jn(t,2,`A 2D vector`);case`vec3`:return jn(t,3,`A 3D vector`);case`vec4`:return jn(t,4,`A 4D vector`);case`size2`:{let e=On(t);if(e.length===1)return[e[0],e[0]];if(e.length===2)return e;throw new I(`Expected 1 or 2 numbers but found ${e.length}.`,0,t.length)}case`size3`:case`scale3`:{let e=On(t);if(e.length===1)return[e[0],e[0],e[0]];if(e.length===3)return e;throw new I(`Expected 1 or 3 numbers but found ${e.length}.`,0,t.length)}case`count2`:{let e=On(t);if(e.length!==2||!e.every(e=>Number.isInteger(e)&&e>=1))throw new I(`Expected two positive whole numbers, e.g. 10,10.`,0,t.length);return e}case`numbers`:return On(t);case`color`:return Rn(t);case`enum`:{let n=t.trim();if(e.values.includes(n))return n;throw new I(`Invalid value ${Sn(n)}. Expected one of: ${e.values.join(`, `)}.`,0,t.length,{suggestion:p(n,e.values)})}case`transform`:return It(t);case`path2d`:try{let e=Be(t,2);if(!e.segments.length)throw new I(`Empty path data.`,0,t.length);return{segments:e.segments,subpaths:e.subpaths}}catch(e){throw e instanceof Ne?new I(e.message,e.offset,e.length,{code:e.code}):e}case`spine`:return Wn(t);case`points2`:case`points3`:{let n=e.type===`points2`?2:3,r=Tn(t,`f64`),i=r||Dn(t);if(i.length%n!==0)throw new I(`Point lists need ${n} numbers per point; found ${i.length} numbers.`,0,t.length);return r||i.slice()}case`floats`:{let e=Tn(t,`f32`);if(e)return e;let n=Dn(t),r=new Float32Array(n.length);return r.set(n),r}case`indices`:{let e=Tn(t,`index`);if(e)return e;let n=Dn(t),r=new Uint32Array(n.length);for(let e=0;e<n.length;e++){let i=n[e];if(!Number.isInteger(i)||i<0)throw new I(`Indices must be non-negative whole numbers; found ${i} at position ${e}.`,0,t.length);r[e]=i}return r}case`range`:return Fn(t);case`range3`:return In(t,e.uniform!==!1);case`idlist`:return Ln(t);case`texture`:return Un(t,Vn,`texture`);case`normalTexture`:return Un(t,Hn,`normal map`);case`duration`:return zn(t);case`repeatCount`:{let e=t.trim();if(e===`indefinite`)return 1/0;let n=Cn(e);if(n<=0)throw new I(`repeat must be positive or 'indefinite'.`,0,t.length);return n}case`animValue`:return On(t);case`keyframes`:return Gn(t);case`text`:return t;default:throw Error(`Unknown schema type '${e.type}'`)}}var qn=new Set([...he,...ge,`use`,`light`]);function Jn(e){let t=[];for(let n=e;n;n=n.parent){let e=n.name;if(n.parent){let t=-1,r=0;for(let e of n.parent.children)e.type===`element`&&e.name===n.name&&(e===n&&(t=r),r++);r>1&&(e+=`[${t}]`)}let r=n.attr&&n.attr(`id`);r&&(e+=`#${r}`),t.unshift(e)}return t.join(` > `)}function Yn(e){let t=[];return e.exclusiveMin===void 0?e.min!==void 0&&t.push(`at least ${e.min}`):t.push(`greater than ${e.exclusiveMin}`),e.max!==void 0&&t.push(`at most ${e.max}`),t.join(` and `)}function Xn(e,t){return typeof t==`number`&&(e.exclusiveMin!==void 0&&!(t>e.exclusiveMin)||e.min!==void 0&&t<e.min||e.max!==void 0&&t>e.max)?Yn(e):null}var Zn=new WeakMap;function Qn(e){let t=Zn.get(e);return t||(t=Object.entries(e.attrs).filter(([,e])=>e.required).map(([e])=>e),Zn.set(e,t)),t}function $n(e){let t=new h(e.lineIndex);a(e),e.ids=new Map;let n=[],r=e=>e.nameStart>=0?{offset:e.nameStart,length:e.nameEnd-e.nameStart}:{offset:-1,length:0,path:Jn(e)},i=(e,t)=>t&&t.nameStart>=0?{offset:t.nameStart,length:t.nameEnd-t.nameStart}:r(e),o=(e,t,n)=>{if(!t||t.valueStart<0)return r(e);if(n&&!t.decoded&&n.offset!==void 0){let e=Math.min(t.valueStart+n.offset,t.valueEnd);return{offset:e,length:Math.max(1,Math.min(n.length||1,t.valueEnd-e))}}return{offset:t.valueStart,length:Math.max(1,t.valueEnd-t.valueStart)}},s=(e,n,r,i,a={},o=null)=>{t.add({severity:e,code:n,message:r,offset:i.offset,length:i.length,path:i.path||(i.offset<0&&o?Jn(o):null),uid:o?o.uid:0,...a})},c=e.root;if(!ye.includes(c.name))return s(`error`,`E_ROOT`,`The root element must be <es3d> but found <${c.name}>.`,r(c),{suggestion:`es3d`},c),e.diagnostics=t.sorted(),e;c.name===`v3d`&&s(`warning`,`W_LEGACY_ROOT`,`The root element <v3d> is a legacy alias; write <es3d>.`,r(c),{},c);let l=0,u=0,d=0,f=(t,a,c)=>{let m=Se(t.name);if(!m){t.name.startsWith(`x-`)?s(`warning`,`W_EXTENSION`,`Extension element <${t.name}> is not supported by this reader; it and its children are not rendered.`,r(t),{},t):s(`error`,`E_UNKNOWN_ELEMENT`,`Unknown element: ${t.name}`,r(t),{suggestion:p(t.name,we.concat([`es3d`]))},t),t.values={},t.attrIndex={},t.unknown=!0;return}t.unknown=!1,t.name===`scene`&&++l>1&&s(`error`,`E_MULTIPLE_SCENES`,`Only one <scene> element is allowed.`,r(t),{},t),t.name===`environment`&&++u>1&&s(`warning`,`W_MULTIPLE_ENVIRONMENTS`,`More than one <environment>: only the first one is used.`,r(t),{},t),t.name===`controls`&&++d>1&&s(`warning`,`W_MULTIPLE_CONTROLS`,`More than one <controls>: only the first one is used.`,r(t),{},t);let h=xe(t.name),g={},_={};for(let r of t.attrs){let a=h.get(r.name);if(!a){if(r.name===`xmlns`||r.name.startsWith(`xmlns:`))continue;let e=[...h.keys()],n=p(r.name,e),a=null;if(!n){let e=Object.keys(m.attrs).filter(e=>![`id`,`name`,`transform`,`position`,`rotation`,`scale`,`visible`,`material`,`color`].includes(e));e.length&&(a=`<${t.name}> accepts: ${e.join(`, `)} (plus id, name, transform, position, rotation, scale, material, color).`)}s(`error`,`E_UNKNOWN_ATTRIBUTE`,`Unknown attribute: ${r.name}`,i(t,r),{suggestion:n,hint:a},t);continue}if(_[a]){s(`error`,`E_DUPLICATE_ATTRIBUTE`,`Attribute '${a}' is given twice (as '${_[a].name}' and '${r.name}').`,i(t,r),{},t);continue}_[a]=r;let c=m.attrs[a],l;try{l=r.typed===void 0?Kn(c,r.value):r.typed}catch(e){if(!(e instanceof I))throw e;s(`error`,e.code||`E_INVALID_VALUE`,`Invalid value for '${r.name}': ${e.message}`,o(t,r,e),{suggestion:e.suggestion,hint:e.hint},t);continue}let u=Xn(c,l);if(u)s(`error`,`E_RANGE`,`'${r.name}' must be ${u}; found ${l}.`,o(t,r),{},t);else{if(g[a]=l,c.type===`id`&&a===`id`){let n=e.ids.get(l);if(n){let i=``;n.nameStart>=0&&e.lineIndex&&(i=` (first defined at line ${e.lineIndex.position(n.nameStart).line})`),s(`error`,`E_DUPLICATE_ID`,`Duplicate id '${l}'${i}.`,o(t,r),{},t)}else e.ids.set(l,t)}if(c.type===`ref`&&n.push({el:t,attr:r,canonical:a,id:l,kind:c.ref}),c.type===`idlist`&&c.ref)for(let e of l)n.push({el:t,attr:r,canonical:a,id:e,kind:c.ref})}}t.values=g,t.attrIndex=_;for(let e of Qn(m))g[e]===void 0&&!_[e]&&s(`error`,`E_MISSING_ATTRIBUTE`,`<${t.name}> requires the attribute '${e}'.`,r(t),{hint:m.attrs[e].desc},t);if(m.check&&m.check(g,(e,n,i=`E_INVALID_VALUE`)=>{let a=e?_[e]:null;s(`error`,i,n,a?o(t,a):r(t),{},t)},t,e=>g[e]!==void 0||!!_[e]),t.text!==null&&t.text.trim()!==``&&m.children!==`text`){let e=t.textStart>=0?{offset:t.textStart,length:Math.max(1,Math.min(20,t.textEnd-t.textStart))}:r(t);s(`error`,`E_TEXT_NOT_ALLOWED`,`Text content is not allowed inside <${t.name}>.`,e,{},t)}c&&t.parent&&t.parent.name===`defs`&&g.id===void 0&&!_.id&&s(`warning`,`W_DEF_WITHOUT_ID`,`<${t.name}> inside <defs> has no id, so it can never be used.`,r(t),{},t),t.name===`material`&&g.id===void 0&&!_.id&&s(`warning`,`W_MATERIAL_WITHOUT_ID`,`<material> without an id can never be referenced.`,r(t),{},t);let v=m.children;for(let e of t.children)if(e.type===`element`){if(v===`text`||!Array.isArray(v)||!v.includes(e.name)){let n=Se(e.name);if((n||!e.name.startsWith(`x-`))&&n){let n=null;e.name===`animate`?n=`<animate> can only be placed inside an element with a transform (shapes, group, use, repeat, scatter, lod, light, camera).`:e.name===`scene`||e.name===`defs`?n=`<${e.name}> is only allowed directly inside <es3d>.`:e.name===`controls`?n=`<controls> is only allowed directly inside <es3d> or <scene>.`:m.category===`shape`&&(n=`Shapes cannot contain other shapes; wrap them in a <group>.`),s(`error`,`E_MISPLACED_ELEMENT`,`<${e.name}> is not allowed inside <${t.name}>.`,r(e),{hint:n},e)}}f(e,m,c||t.name===`defs`)}};f(c,null,!1);let m={material:`material`,path:`path`,node:`element`};for(let i of n){let n=e.ids.get(i.id),a=()=>i.attr.valueStart>=0?{offset:i.attr.valueStart,length:Math.max(1,i.attr.valueEnd-i.attr.valueStart)}:r(i.el);if(!n){let n=a(),r=[...e.ids.entries()].filter(([,e])=>i.kind===`material`?e.name===`material`:i.kind===`path`?e.name===`path`:qn.has(e.name)).map(([e])=>e);t.add({phase:`reference`,code:`E_UNKNOWN_REFERENCE`,message:`Unknown ${m[i.kind]} '${i.id}' referenced by ${i.attr.name}.`,offset:n.offset,length:n.length,path:n.path||null,suggestion:p(i.id,r),uid:i.el.uid});continue}let o=!0;if(i.kind===`material`?o=n.name===`material`:i.kind===`path`?o=n.name===`path`:i.kind===`node`&&(o=qn.has(n.name)),!o){let e=a();t.add({phase:`reference`,code:`E_REFERENCE_KIND`,message:`${i.attr.name}="${i.id}" refers to a <${n.name}>, but a ${i.kind===`node`?`shape, group, use, repeat, scatter, lod or light`:`<${i.kind}>`} is required.`,offset:e.offset,length:e.length,path:e.path||null,uid:i.el.uid})}else i.canonical===`ref`&&(i.el.target=n),i.kind===`path`&&(i.el.pathTarget=n)}let g=new Map,_=e=>{if(g.has(e))return g.get(e);let t=[],n=[e];for(;n.length;){let e=n.pop();e.name===`use`&&e.target&&t.push(e);for(let t of e.children)t.type===`element`&&n.push(t)}return g.set(e,t),t},v=new Map,y=new Set,b=(e,n)=>{v.set(e,1);for(let r of _(e)){let e=r.target,i=v.get(e);if(i===1){if(!y.has(r)){y.add(r);let i=[...n.map(e=>e.values.id||e.name),e.values.id||e.name],a=r.attrIndex.ref;t.add({phase:`reference`,code:`E_CIRCULAR_REFERENCE`,message:`Circular reference: ${i.join(` → `)}.`,offset:a&&a.valueStart>=0?a.valueStart:r.nameStart,length:a&&a.valueStart>=0?a.valueEnd-a.valueStart:r.nameEnd-r.nameStart,path:r.nameStart<0?Jn(r):null,hint:`An element cannot (directly or indirectly) contain a <use> of itself.`,uid:r.uid})}r.circular=!0}else i||b(e,[...n,e])}v.set(e,2)};for(let t of new Set([...e.ids.values()]))v.has(t)||b(t,[t]);return e.diagnostics=t.sorted(),e}function er(e,{comments:t=!1}={}){let n=e=>{let r={};for(let t of e.attrs)r[t.name]=t.value;let i=[e.name,r];e.text!==null&&e.text!==void 0&&e.text!==``&&i.push(e.text);for(let r of e.children)r.type===`element`?i.push(n(r)):t&&i.push([`#comment`,r.text]);return i};return n(e.root)}function tr(i){let a=(e,t)=>{throw new d([new u({code:`E_JSON_STRUCTURE`,message:e,path:t})])},o=(r,i)=>{if(Array.isArray(r)&&typeof r[0]==`string`||a(`Expected an element array ["name", {attributes}, ...children].`,i),r[0]===`#comment`)return new t(String(r[1]??``));let s=new n(r[0]),c=1;if(r.length>1&&r[1]!==null&&typeof r[1]==`object`&&!Array.isArray(r[1])){for(let[t,n]of Object.entries(r[1]))typeof n==`object`&&n&&a(`Attribute '${t}' must be a string or number.`,`${i} > @${t}`),s.attrs.push(new e(t,String(n)));c=2}for(;c<r.length;c++){let e=r[c];typeof e==`string`?s.text=(s.text||``)+e:s.appendChild(o(e,`${i} > ${Array.isArray(e)?e[0]:`?`}[${c}]`))}return s.selfClosing=s.children.length===0&&s.text===null,s},s=o(i,Array.isArray(i)?String(i[0]):`root`);return s.type!==`element`&&a(`The root must be an element.`,`root`),new r({root:s,syntax:`json`})}function nr(e){let t=0,n=e.length;for(e.charCodeAt(0)===65279&&(t=1);;){for(;t<n&&/\s/.test(e[t]);)t++;if(e.startsWith(`//`,t)){let r=e.indexOf(`
|
|
7
|
+
`,t);t=r<0?n:r+1}else if(e.startsWith(`/*`,t)){let r=e.indexOf(`*/`,t+2);t=r<0?n:r+2}else break}let r=e[t];return r===`<`?`xml`:r===`[`||r===`{`?`json`:`compact`}function rr(e,t,n,i){let a=new r({root:null,syntax:t,source:n});return a.lineIndex=i,a.diagnostics=e instanceof d?e.diagnostics:[new u({code:`E_INTERNAL`,message:String(e&&e.message?e.message:e)})],a}function ir(e,t={}){typeof e!=`string`&&(e=new TextDecoder(`utf-8`).decode(e instanceof Uint8Array?e:new Uint8Array(e)));let n=e,r=t.syntax||nr(n),i=new c(n),a;try{if(r===`xml`)a=ee(n,i);else if(r===`compact`)a=oe(n,i);else if(r===`json`){let e;try{e=JSON.parse(n)}catch(e){let t=/position (\d+)/.exec(e.message),n=new u({code:`E_JSON`,message:`Invalid JSON: ${e.message}`,offset:t?Number(t[1]):0,length:1});throw n.locate(i),new d([n],i)}a=tr(e),a.source=n}else throw Error(`Unknown syntax '${r}'`)}catch(e){return rr(e,r,n,i)}return!a.lineIndex&&r!==`json`&&(a.lineIndex=i),t.validate===!1?a:$n(a)}function ar(e,t={}){let n=ir(e,t);if(!n.ok)throw new d(n.errors,n.lineIndex);return n}function or(e){let t=/<([^<>\s]+)>/.exec(e||``);return t?t[1]:``}function sr(e,t){if(!e)return``;let n=Array.isArray(e)?e:e.diagnostics||[],r=t||e.lineIndex||e.doc&&e.doc.lineIndex||null,i=new Map,a=[];for(let e of n){if(!e||e.severity!==`warning`){a.push(e);continue}let t=`${e.code}\0${or(e.message)}\0${e.message}`,n=i.get(t);if(n){n.count++;continue}let r={d:e,count:1};i.set(t,r),a.push(r)}return a.map(e=>{if(!e||!e.d)return e.format(r);let t=e.d.format(r);return e.count<2?t:`${t}\n\nReported ${e.count} times. Showing the first.`}).join(`
|
|
8
|
+
|
|
9
|
+
`)}function H(e,t=null,n=!1){if(t!=null){let n=10**t;e=Math.round(e*n)/n}if(e===0||Object.is(e,-0))return`0`;let r=String(e);if(r.indexOf(`e`)>=0){r=r.replace(`e+`,`e`);let t=lr(e);t&&t.length<=r.length&&(r=t)}return n&&(r.startsWith(`0.`)?r=r.slice(1):r.startsWith(`-0.`)&&(r=`-`+r.slice(2))),r}function cr(e,t=null,n=!1){if(t!=null)return H(e,t,n);if(e===0||!Number.isFinite(e))return H(e,null,n);let r=1,i=9;for(;r<i;){let t=r+i>>1;Math.fround(Number(e.toPrecision(t)))===e?i=t:r=t+1}return H(Number(e.toPrecision(r)),null,n)}function lr(e){let t=Math.abs(e);if(t>=1e21||t<1e-12)return null;let n=t.toFixed(20).replace(/0+$/,``).replace(/\.$/,``);return Number(n)===t?(e<0?`-`:``)+n:null}function ur(e,t=null){let n=``,r=t;for(let t of e)r===null||t[0]===`-`||t[0]===`.`&&(r.includes(`.`)||r.includes(`e`))?n+=t:n+=` `+t,r=t;return n}function dr(e,{group:t=1,sep:n=`,`,precision:r=null,compact:i=!1}={}){let a=Array(e.length),o=e instanceof Float32Array?cr:H;for(let t=0;t<e.length;t++)a[t]=o(e[t],r,i);if(t<=1)return a.join(n);let s=[];for(let e=0;e<a.length;e+=t)s.push(a.slice(e,e+t).join(`,`));return s.join(` `)}function fr(e){return Me(e)}function pr(e,t=null,n=!1){return e.map(e=>`${e.fn}(${e.args.map(e=>H(e,t,n)).join(`,`)})`).join(` `)}var mr=1e-9;function hr(e,{precision:t=null,minify:n=!0,dim:r=2}={}){let i=e=>H(e,t,n),a=e=>t==null?e:Math.round(e*10**t)/10**t;if(!n)return gr(e,i,r);let o=``,s=``,c=null,l=0,u=0,d=0,f=0,p=0,m=0,h=null,g=null,_=``,v=(e,t)=>{let n=t.map(i);o+=e===s&&e!==`M`&&e!==`m`||s===`M`&&e===`L`||s===`m`&&e===`l`?ur(n,c):e+ur(n,null),n.length&&(c=n[n.length-1]),s=e},y=(e,t,n,r)=>{let a=e+t.map(i).join(` `);return(n+r.map(i).join(` `)).length<a.length?[n,r]:[e,t]};for(let t of e)switch(t.c){case`M`:{if(t.implicit)break;let e=a(t.x),n=a(t.y),i=a(t.z||0),s=r===3?[e,n,i]:[e,n],c=r===3?[a(e-l),a(n-u),a(i-d)]:[a(e-l),a(n-u)],[h,g]=o===``?[`M`,s]:y(`M`,s,`m`,c);v(h,g),h===`m`?(l+=g[0],u+=g[1],r===3&&(d+=g[2])):(l=e,u=n,d=i),f=l,p=u,m=d,_=`M`;break}case`L`:{let e=a(t.x),n=a(t.y),i=a(t.z||0),o,s;if(r===2&&Math.abs(n-u)<mr&&Math.abs(e-l)>=mr)[o,s]=y(`H`,[e],`h`,[a(e-l)]);else if(r===2&&Math.abs(e-l)<mr&&Math.abs(n-u)>=mr)[o,s]=y(`V`,[n],`v`,[a(n-u)]);else{let t=r===3?[e,n,i]:[e,n],c=r===3?[a(e-l),a(n-u),a(i-d)]:[a(e-l),a(n-u)];[o,s]=y(`L`,t,`l`,c)}v(o,s);let c=o.toUpperCase(),f=o!==c;c===`H`?l=f?l+s[0]:s[0]:c===`V`?u=f?u+s[0]:s[0]:f?(l+=s[0],u+=s[1],r===3&&(d+=s[2])):(l=s[0],u=s[1],r===3&&(d=s[2])),_=`L`;break}case`C`:{let e=[a(t.x1),a(t.y1),a(t.z1||0)],n=[a(t.x2),a(t.y2),a(t.z2||0)],i=[a(t.x),a(t.y),a(t.z||0)],o=r,s=e=>e.slice(0,o),c=e=>[a(e[0]-l),a(e[1]-u),a(e[2]-d)].slice(0,o),f=!1;if(h&&_===`C`){let t=2*l-h[0],n=2*u-h[1],r=2*d-h[2];f=Math.abs(t-e[0])<1e-7&&Math.abs(n-e[1])<1e-7&&(o===2||Math.abs(r-e[2])<1e-7)}else _!==`C`&&(f=Math.abs(l-e[0])<1e-7&&Math.abs(u-e[1])<1e-7&&(o===2||Math.abs(d-e[2])<1e-7));let p,m;f?[p,m]=y(`S`,[...s(n),...s(i)],`s`,[...c(n),...c(i)]):[p,m]=y(`C`,[...s(e),...s(n),...s(i)],`c`,[...c(e),...c(n),...c(i)]),v(p,m);let g=p===`c`||p===`s`,b=m.length,x=g?[l,u,d]:[0,0,0],S=[x[0]+m[b-o],x[1]+m[b-o+1],o===3?x[2]+m[b-1]:0];h=[x[0]+m[b-2*o],x[1]+m[b-2*o+1],o===3?x[2]+m[b-o-1]:0],l=S[0],u=S[1],d=S[2],_=`C`;break}case`Q`:{let e=[a(t.x1),a(t.y1),a(t.z1||0)],n=[a(t.x),a(t.y),a(t.z||0)],i=r,o=e=>e.slice(0,i),s=e=>[a(e[0]-l),a(e[1]-u),a(e[2]-d)].slice(0,i),c=!1;if(g&&_===`Q`){let t=2*l-g[0],n=2*u-g[1],r=2*d-g[2];c=Math.abs(t-e[0])<1e-7&&Math.abs(n-e[1])<1e-7&&(i===2||Math.abs(r-e[2])<1e-7)}let f,p;c?[f,p]=y(`T`,o(n),`t`,s(n)):[f,p]=y(`Q`,[...o(e),...o(n)],`q`,[...s(e),...s(n)]),v(f,p);let m=f===`q`||f===`t`?[l,u,d]:[0,0,0],h=p.length,b=[m[0]+p[h-i],m[1]+p[h-i+1],i===3?m[2]+p[h-1]:0];g=c?[2*l-g[0],2*u-g[1],2*d-g[2]]:[m[0]+p[0],m[1]+p[1],i===3?m[2]+p[2]:0],l=b[0],u=b[1],d=b[2],_=`Q`;break}case`A`:{let e=a(t.x),n=a(t.y),r=[t.rx,t.ry,t.rot,t.large,t.sweep,e,n],d=[t.rx,t.ry,t.rot,t.large,t.sweep,a(e-l),a(n-u)],f=`A`+r.map(i).join(` `),p=(`a`+d.map(i).join(` `)).length<f.length,m=p?`a`:`A`,h=p?d:r,g=ur([i(h[0]),i(h[1]),i(h[2])],m===s?c:null),v=ur([i(h[5]),i(h[6])],null),y=`${g} ${h[3]}${h[4]}${v}`;o+=m===s?y:m+y,s=m,c=i(h[6]),p?(l+=h[5],u+=h[6]):(l=e,u=n),_=`A`;break}case`Z`:o+=`Z`,s=`Z`,c=null,l=f,u=p,d=m,_=`Z`}return o}function gr(e,t,n){let r=[],i=(e,r,i)=>n===3?`${t(e)},${t(r)},${t(i||0)}`:`${t(e)},${t(r)}`;for(let n of e)switch(n.c){case`M`:n.implicit||r.push(`M`+i(n.x,n.y,n.z));break;case`L`:r.push(`L`+i(n.x,n.y,n.z));break;case`C`:r.push(`C${i(n.x1,n.y1,n.z1)} ${i(n.x2,n.y2,n.z2)} ${i(n.x,n.y,n.z)}`);break;case`Q`:r.push(`Q${i(n.x1,n.y1,n.z1)} ${i(n.x,n.y,n.z)}`);break;case`A`:r.push(`A${t(n.rx)},${t(n.ry)} ${t(n.rot)} ${n.large},${n.sweep} ${i(n.x,n.y)}`);break;case`Z`:r.push(`Z`)}return r.join(` `)}var _r={pretty:{pretty:!0,aliases:!1,precision:null,normalize:!1,comments:!0},minified:{pretty:!1,aliases:!0,precision:null,normalize:!0,comments:!1}};function vr(e={}){let t={syntax:`xml`,indent:` `,wrap:100,...e.pretty===!1?_r.minified:_r.pretty,...e};return t.precision!==null&&t.precision!==void 0&&(t.normalize=!0),t}function yr(e,t,n){if(!n.aliases)return t;let r=Ce(e,t);return r&&r.alias?r.alias:t}function br(e,t){if(e.attrIndex){for(let[n,r]of Object.entries(e.attrIndex))if(r===t)return n}let n=Se(e.name);if(!n||n.attrs[t.name])return t.name;for(let[e,r]of Object.entries(n.attrs))if(r.alias===t.name)return e;return t.name}var xr=e=>e.every(t=>t===e[0]);function Sr(e,t,n,r){if(!r.normalize)return n;let i=Ce(e.name,t),a=e.values?e.values[t]:void 0;if(!i||a===void 0)return n.trim();let o=r.precision,s=!r.pretty;switch(i.type){case`number`:case`angle`:return H(a,o,s);case`int`:return String(a);case`vec2`:case`vec3`:case`vec4`:case`numbers`:case`animValue`:return dr(a,{sep:`,`,precision:o,compact:s});case`keyframes`:return a.map(e=>dr(e,{sep:`,`,precision:o,compact:s})).join(s?`;`:`; `);case`size2`:case`size3`:case`scale3`:return xr(a)?H(a[0],o,s):dr(a,{sep:`,`,precision:o,compact:s});case`count2`:return a.join(`,`);case`points2`:return dr(a,{group:2,precision:o,compact:s});case`points3`:return dr(a,{group:3,precision:o,compact:s});case`floats`:return dr(a,{sep:` `,precision:o,compact:s});case`indices`:return Array.from(a).join(` `);case`color`:{let e=fr(a),t=n.trim();return t.length<e.length?t:e}case`ref`:case`id`:case`enum`:case`string`:return String(a);case`bool`:return a?`true`:`false`;case`transform`:return pr(a.ops,o,s);case`path2d`:return hr(a.segments,{precision:o,minify:s,dim:2});case`spine`:return a.kind===`path`?hr(a.segments,{precision:o,minify:s,dim:3}):a.kind===`points`?dr(a.points,{group:3,precision:o,compact:s}):`helix(${[a.radius,a.pitch,a.turns,...a.segmentsPerTurn?[a.segmentsPerTurn]:[]].map(e=>H(e,o,s)).join(`,`)})`;case`range`:{let[e,t]=a;return e===t?H(e,o,s):`${H(e,o,s)}..${H(t,o,s)}`}case`range3`:return a.ranges.map(([e,t])=>e===t?H(e,o,s):`${H(e,o,s)}..${H(t,o,s)}`).join(`,`);case`idlist`:return a.join(`,`);case`duration`:return H(a,o,s)+`s`;case`repeatCount`:return a===1/0?`indefinite`:H(a,o,s);default:return n.trim()}}function Cr(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/"/g,`"`)}function wr(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}function Tr(e){return`<!--${e.replace(/--/g,`- -`).replace(/-$/,`- `)}-->`}function Er(e,t){let n=[];for(let r of e.attrs){let i=br(e,r);n.push([yr(e.name,i,t),Sr(e,i,r.value,t),i])}return n}function Dr(e,t){let n=[],r=e=>t.indent.repeat(e);if(t.pretty){if(t.comments)for(let t of e.leading)n.push(Tr(t.text));let i=(e,a)=>{let o=Er(e,t),s=o.map(([e,t])=>` ${e}="${Cr(t)}"`).join(``),c=e.children.filter(e=>e.type===`element`||t.comments),l=e.text!==null&&e.text!==void 0&&e.text.trim()!==``,u=`${r(a)}<${e.name}${s}`;if(u.length+2>t.wrap&&o.length>1&&(u=`${r(a)}<${e.name}`+o.map(([e,t])=>`\n${r(a+2)}${e}="${Cr(t)}"`).join(``)),!c.length&&!l)n.push(u+`/>`);else if(l&&!c.length)n.push(`${u}>${wr(e.text.trim())}</${e.name}>`);else{n.push(u+`>`),l&&n.push(r(a+1)+wr(e.text.trim()));for(let e of c)e.type===`comment`?n.push(r(a+1)+Tr(e.text)):i(e,a+1);n.push(`${r(a)}</${e.name}>`)}};if(i(e.root,0),t.comments)for(let t of e.trailing)n.push(Tr(t.text));return n.join(`
|
|
10
|
+
`)+`
|
|
11
|
+
`}let i=``,a=e=>{i+=`<`+e.name;for(let[n,r]of Er(e,t))i+=` ${n}="${Cr(r)}"`;let n=e.children.filter(e=>e.type===`element`||t.comments),r=e.text!==null&&e.text!==void 0&&e.text.trim()!==``;if(!n.length&&!r)i+=`/>`;else{i+=`>`,r&&(i+=wr(e.text.trim()));for(let e of n)e.type===`comment`?i+=Tr(e.text):a(e);i+=`</${e.name}>`}};return a(e.root),i}var Or=/^[A-Za-z_][A-Za-z0-9_.:-]*$/;function kr(e){return e!==``&&!/[\s{};"\\]/.test(e)?e:`"`+e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`).replace(/\n/g,`\\n`).replace(/\t/g,`\\t`)+`"`}function Ar(e,t){return t&&!e.includes(`
|
|
12
|
+
`)?`//`+(e.startsWith(` `)?``:` `)+e.replace(/\s+$/,``):`/*`+e.replace(/\*\//g,`* /`)+`*/`}function jr(e,t){let n=e.name,r=[];for(let[i,a,o]of Er(e,t))o===`id`&&Or.test(a)?n+=`#`+a:o===`ref`&&Or.test(a)?r.unshift(`@`+a):r.push(`${i}=${kr(a)}`);if(e.text!==null&&e.text!==void 0&&e.text.trim()!==``){let t=e.text.trim();r.unshift(`"`+t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`).replace(/\n/g,`\\n`).replace(/\t/g,`\\t`)+`"`)}return r.length?n+` `+r.join(` `):n}function Mr(e,t){if(t.pretty){let n=[],r=e=>t.indent.repeat(e);if(t.comments)for(let t of e.leading)n.push(Ar(t.text,!0));let i=(e,a)=>{for(let o of e.children){if(o.type===`comment`){t.comments&&n.push(r(a)+Ar(o.text,!0));continue}let e=o.children.filter(e=>e.type===`element`||t.comments),s=r(a)+jr(o,t);e.length?(n.push(s+` {`),i(o,a+1),n.push(r(a)+`}`)):n.push(s)}};if(n.push(jr(e.root,t)),i(e.root,0),t.comments)for(let t of e.trailing)n.push(Ar(t.text,!0));return n.join(`
|
|
13
|
+
`)+`
|
|
14
|
+
`}let n=[],r=e=>{let n=jr(e,t),i=e.children.filter(e=>e.type===`element`||t.comments);if(i.length){let e=[];for(let t of i)e.push(t.type===`comment`?Ar(t.text,!1):r(t));n+=`{`+Nr(e)+`}`}return n};n.push(jr(e.root,t));for(let i of e.root.children)i.type===`comment`?t.comments&&n.push(Ar(i.text,!1)):n.push(r(i));return Nr(n)}function Nr(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];if(n>0){let r=e[n-1];!r.endsWith(`}`)&&!r.endsWith(`*/`)&&(t+=`;`)}t+=r}return t}function Pr(e,t={}){let n=vr(t);if(!e.root)throw Error(`Cannot serialize a document without a root element.`);if(n.syntax===`compact`)return Mr(e,n);if(n.syntax===`json`){let t=er(n.normalize?Fr(e,n):e,{comments:n.comments});return n.pretty?JSON.stringify(t,null,1)+`
|
|
15
|
+
`:JSON.stringify(t)}return Dr(e,n)}function Fr(e,t){let n=e=>{let r=Er(e,t);return{...e,attrs:r.map(([e,t])=>({name:e,value:t})),children:e.children.map(e=>e.type===`element`?n(e):e)}};return{...e,root:n(e.root)}}var Ir={"xml-pretty":{syntax:`xml`,pretty:!0},"xml-min":{syntax:`xml`,pretty:!1},"compact-pretty":{syntax:`compact`,pretty:!0},"compact-min":{syntax:`compact`,pretty:!1},"json-min":{syntax:`json`,pretty:!1}},Lr=Math.cos(8*Math.PI/180),Rr=256;function zr(e,t){let n=Math.hypot(e,t);return n>1e-12?[e/n,t/n,0]:null}function Br(e,t,n){let r=Math.hypot(e,t,n);return r>1e-12?[e/r,t/r,n/r]:null}var Vr=class{constructor(e){this.dim=e,this.pts=[],this.smooth=[],this.firstTan=null,this.lastTan=null,this.closed=!1}get count(){return this.smooth.length}lastPoint(){let e=this.dim,t=this.pts,n=t.length-e;return e===3?[t[n],t[n+1],t[n+2]]:[t[n],t[n+1],0]}start(e,t,n){this.pts.push(e,t),this.dim===3&&this.pts.push(n),this.smooth.push(0)}joint(e){if(e){if(this.lastTan){let t=this.lastTan[0]*e[0]+this.lastTan[1]*e[1]+this.lastTan[2]*e[2];this.smooth[this.smooth.length-1]=+(t>=Lr)}else this.firstTan=e}}push(e,t,n,r){let i=this.dim,a=this.pts,o=a.length-i;Math.abs(a[o]-e)<1e-12&&Math.abs(a[o+1]-t)<1e-12&&(i===2||Math.abs(a[o+2]-n)<1e-12)||(a.push(e,t),i===3&&a.push(n),this.smooth.push(+!!r))}end(e){e&&(this.lastTan=e)}};function Hr(e,t,n,r){return e===3?Br(t,n,r):zr(t,n)}function Ur(e,t){let n=t.dim||2,r=Math.max(t.tolerance,1e-9),i=t.maxSegments||Rr,a=[],o=null,s=()=>{if(o){if(o.closed){let e=n,t=o.pts,r=o.count;if(r>1){let i=(r-1)*e;if(Math.abs(t[i]-t[0])<1e-9&&Math.abs(t[i+1]-t[1])<1e-9&&(e===2||Math.abs(t[i+2]-t[2])<1e-9))t.length-=e,o.smooth.pop();else{let r=Hr(n,t[0]-t[i],t[1]-t[i+1],e===3?t[2]-t[i+2]:0);o.joint(r),o.end(r)}}if(o.firstTan&&o.lastTan){let e=o.lastTan[0]*o.firstTan[0]+o.lastTan[1]*o.firstTan[1]+o.lastTan[2]*o.firstTan[2];o.smooth[0]=+(e>=Lr)}}o.count>=(o.closed?3:2)?a.push({points:Float64Array.from(o.pts),smooth:Uint8Array.from(o.smooth),closed:o.closed}):o.count>=2&&a.push({points:Float64Array.from(o.pts),smooth:Uint8Array.from(o.smooth),closed:!1,degenerate:!0}),o=null}};for(let t of e){if(t.c===`M`){s(),o=new Vr(n),o.start(t.x,t.y,t.z||0);continue}if(!o)continue;let[e,a,c]=o.lastPoint();switch(t.c){case`L`:{let r=Hr(n,t.x-e,t.y-a,(t.z||0)-c);if(!r)break;o.joint(r),o.push(t.x,t.y,t.z||0,!1),o.end(r);break}case`Q`:{let s=e,l=a,u=c,d=s-2*t.x1+t.x,f=l-2*t.y1+t.y,p=n===3?u-2*t.z1+t.z:0,m=Math.max(1,Math.min(i,Math.ceil(Math.sqrt(.25*Math.hypot(d,f,p)/r)))),h=Hr(n,t.x1-s,t.y1-l,(t.z1||0)-u)||Hr(n,t.x-s,t.y-l,(t.z||0)-u),g=Hr(n,t.x-t.x1,t.y-t.y1,(t.z||0)-(t.z1||0))||h;if(!h)break;o.joint(h);for(let e=1;e<=m;e++){let n=e/m,r=1-n,i=r*r,a=2*r*n,c=n*n;o.push(i*s+a*t.x1+c*t.x,i*l+a*t.y1+c*t.y,i*u+a*(t.z1||0)+c*(t.z||0),e<m)}o.end(g);break}case`C`:{let s=e,l=a,u=c,d=t.z1||0,f=t.z2||0,p=t.z||0,m=Math.hypot(s-2*t.x1+t.x2,l-2*t.y1+t.y2,n===3?u-2*d+f:0),h=Math.hypot(t.x1-2*t.x2+t.x,t.y1-2*t.y2+t.y,n===3?d-2*f+p:0),g=Math.max(1,Math.min(i,Math.ceil(Math.sqrt(.75*Math.max(m,h)/r)))),_=Hr(n,t.x1-s,t.y1-l,d-u)||Hr(n,t.x2-s,t.y2-l,f-u)||Hr(n,t.x-s,t.y-l,p-u),v=Hr(n,t.x-t.x2,t.y-t.y2,p-f)||Hr(n,t.x-t.x1,t.y-t.y1,p-d)||_;if(!_)break;o.joint(_);for(let e=1;e<=g;e++){let n=e/g,r=1-n,i=r*r*r,a=3*r*r*n,c=3*r*n*n,m=n*n*n;o.push(i*s+a*t.x1+c*t.x2+m*t.x,i*l+a*t.y1+c*t.y2+m*t.y,i*u+a*d+c*f+m*p,e<g)}o.end(v);break}case`A`:{let n=Wr(e,a,t.rx,t.ry,t.rot,t.large,t.sweep,t.x,t.y);if(!n){let n=Hr(2,t.x-e,t.y-a,0);if(!n)break;o.joint(n),o.push(t.x,t.y,0,!1),o.end(n);break}let s=Math.max(n.rx,n.ry),c=r>=s?Math.PI/2:2*Math.acos(1-r/s),l=Math.max(1,Math.min(i,Math.ceil(Math.abs(n.dtheta)/c)));o.joint(n.tangentAt(n.theta1));for(let e=1;e<=l;e++){let r=n.theta1+n.dtheta*e/l;if(e===l)o.push(t.x,t.y,0,!1);else{let e=n.pointAt(r);o.push(e[0],e[1],0,!0)}}o.end(n.tangentAt(n.theta1+n.dtheta));break}case`Z`:o.closed=!0,s()}}return s(),a}function Wr(e,t,n,r,i,a,o,s,c){if(e===s&&t===c||(n=Math.abs(n),r=Math.abs(r),n<1e-12||r<1e-12))return null;let l=i*Math.PI/180,u=Math.cos(l),d=Math.sin(l),f=(e-s)/2,p=(t-c)/2,m=u*f+d*p,h=-d*f+u*p,g=m*m/(n*n)+h*h/(r*r);if(g>1){let e=Math.sqrt(g);n*=e,r*=e}let _=n*n,v=r*r,y=_*v-_*h*h-v*m*m,b=_*h*h+v*m*m,x=b>0?Math.sqrt(Math.max(0,y/b)):0;a===o&&(x=-x);let S=x*n*h/r,C=-x*r*m/n,w=u*S-d*C+(e+s)/2,T=d*S+u*C+(t+c)/2,E=(e,t,n,r)=>Math.atan2(e*r-t*n,e*n+t*r),D=(m-S)/n,O=(h-C)/r,k=(-m-S)/n,A=(-h-C)/r,j=Math.atan2(O,D),ee=E(D,O,k,A);!o&&ee>0?ee-=2*Math.PI:o&&ee<0&&(ee+=2*Math.PI);let M=ee>=0?1:-1;return{cx:w,cy:T,rx:n,ry:r,theta1:j,dtheta:ee,pointAt(e){let t=Math.cos(e),i=Math.sin(e);return[w+n*u*t-r*d*i,T+n*d*t+r*u*i]},tangentAt(e){let t=Math.cos(e),i=Math.sin(e);return zr(M*(-n*u*i-r*d*t),M*(-n*d*i+r*u*t))}}}function Gr(e,t){let n=new Float64Array(t*2);for(let r=0;r<t;r++){let i=r/t*Math.PI*2;n[r*2]=Math.cos(i)*e,n[r*2+1]=Math.sin(i)*e}return{points:n,smooth:new Uint8Array(t).fill(1),closed:!0}}function Kr(e){let t=0,n=e.length/2;for(let r=0,i=n-1;r<n;i=r++)t+=(e[i*2]-e[r*2])*(e[i*2+1]+e[r*2+1]);return t/2}function qr(e,t=2){let n=e.points.length/t,r=new Float64Array(e.points.length),i=new Uint8Array(n);for(let a=0;a<n;a++){let o=n-1-a;for(let n=0;n<t;n++)r[a*t+n]=e.points[o*t+n];i[a]=e.smooth[o]}return{...e,points:r,smooth:i}}function Jr(e,t=null){let n=un(e,t);if(n)return n;let r=t&&t.length,i=r?t[0]*2:e.length,a=Xr(e,0,i,2,!0),o=[];if(!a||a.next===a.prev)return o;r&&(a=ri(e,t,a,2));let s=0,c=0,l=0;if(e.length>160){s=1/0,c=1/0;let t=-1/0,n=-1/0;for(let r=0;r<i;r+=2){let i=e[r],a=e[r+1];i<s&&(s=i),a<c&&(c=a),i>t&&(t=i),a>n&&(n=a)}l=Math.max(t-s,n-c),l=l===0?0:32767/l}return Qr(a,o,2,s,c,l,0),o}var Yr=class{constructor(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}};Yr.shapeKeeper=new Yr(0,.5,.5);function Xr(e,t,n,r,i){let a=null;if(i===Ti(e,t,n,r)>0)for(let i=t;i<n;i+=r)a=Ci(i/r,e[i],e[i+1],a);else for(let i=n-r;i>=t;i-=r)a=Ci(i/r,e[i],e[i+1],a);return a&&hi(a,a.next)&&(wi(a),a=a.next),a}function Zr(e,t){if(!e)return e;t||=e;let n=e,r;do if(r=!1,!n.steiner&&(hi(n,n.next)||U(n.prev,n,n.next)===0)){if(wi(n),n=t=n.prev,n===n.next)break;r=!0}else n=n.next;while(r||n!==t);return t}function Qr(e,t,n,r,i,a,o){if(!e)return;!o&&a&&ci(e,r,i,a);let s=e;for(;e.prev!==e.next;){let c=e.prev,l=e.next;if(a?ei(e,r,i,a):$r(e))t.push(c.i,e.i,l.i),wi(e),e=l.next,s=l.next;else if(e=l,e===s){o?o===1?(e=ti(Zr(e),t),Qr(e,t,n,r,i,a,2)):o===2&&ni(e,t,n,r,i,a):Qr(Zr(e),t,n,r,i,a,1);break}}}function $r(e){let t=e.prev,n=e,r=e.next;if(U(t,n,r)>=0)return!1;let i=t.x,a=n.x,o=r.x,s=t.y,c=n.y,l=r.y,u=Math.min(i,a,o),d=Math.min(s,c,l),f=Math.max(i,a,o),p=Math.max(s,c,l),m=r.next;for(;m!==t;){if(m.x>=u&&m.x<=f&&m.y>=d&&m.y<=p&&pi(i,s,a,c,o,l,m.x,m.y)&&U(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function ei(e,t,n,r){let i=e.prev,a=e,o=e.next;if(U(i,a,o)>=0)return!1;let s=i.x,c=a.x,l=o.x,u=i.y,d=a.y,f=o.y,p=Math.min(s,c,l),m=Math.min(u,d,f),h=Math.max(s,c,l),g=Math.max(u,d,f),_=ui(p,m,t,n,r),v=ui(h,g,t,n,r),y=e.prevZ,b=e.nextZ;for(;y&&y.z>=_&&b&&b.z<=v;){if(y.x>=p&&y.x<=h&&y.y>=m&&y.y<=g&&y!==i&&y!==o&&pi(s,u,c,d,l,f,y.x,y.y)&&U(y.prev,y,y.next)>=0||(y=y.prevZ,b.x>=p&&b.x<=h&&b.y>=m&&b.y<=g&&b!==i&&b!==o&&pi(s,u,c,d,l,f,b.x,b.y)&&U(b.prev,b,b.next)>=0))return!1;b=b.nextZ}for(;y&&y.z>=_;){if(y.x>=p&&y.x<=h&&y.y>=m&&y.y<=g&&y!==i&&y!==o&&pi(s,u,c,d,l,f,y.x,y.y)&&U(y.prev,y,y.next)>=0)return!1;y=y.prevZ}for(;b&&b.z<=v;){if(b.x>=p&&b.x<=h&&b.y>=m&&b.y<=g&&b!==i&&b!==o&&pi(s,u,c,d,l,f,b.x,b.y)&&U(b.prev,b,b.next)>=0)return!1;b=b.nextZ}return!0}function ti(e,t){let n=e;do{let r=n.prev,i=n.next.next;!hi(r,i)&&gi(r,n,n.next,i)&&bi(r,i)&&bi(i,r)&&(t.push(r.i,n.i,i.i),wi(n),wi(n.next),n=e=i),n=n.next}while(n!==e);return Zr(n)}function ni(e,t,n,r,i,a){let o=e;do{let e=o.next.next;for(;e!==o.prev;){if(o.i!==e.i&&mi(o,e)){let s=Si(o,e);o=Zr(o,o.next),s=Zr(s,s.next),Qr(o,t,n,r,i,a,0),Qr(s,t,n,r,i,a,0);return}e=e.next}o=o.next}while(o!==e)}function ri(e,t,n,r){let i=[];for(let n=0,a=t.length;n<a;n++){let o=Xr(e,t[n]*r,n<a-1?t[n+1]*r:e.length,r,!1);o&&(o===o.next&&(o.steiner=!0),i.push(di(o)))}i.sort(ii);for(let e=0;e<i.length;e++)n=ai(i[e],n);return n}function ii(e,t){let n=e.x-t.x;return n===0&&(n=e.y-t.y,n===0&&(n=(e.next.y-e.y)/(e.next.x-e.x)-(t.next.y-t.y)/(t.next.x-t.x))),n}function ai(e,t){let n=oi(e,t);if(!n)return t;let r=Si(n,e);return Zr(r,r.next),Zr(n,n.next)}function oi(e,t){let n=t,r=e.x,i=e.y,a=-1/0,o=null;if(hi(e,n))return n;do{if(hi(e,n.next))return n.next;if(i<=n.y&&i>=n.next.y&&n.next.y!==n.y){let e=n.x+(i-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(e<=r&&e>a&&(a=e,o=n.x<n.next.x?n:n.next,e===r))return o}n=n.next}while(n!==t);if(!o)return null;let s=o,c=o.x,l=o.y,u=1/0;n=o;do{if(r>=n.x&&n.x>=c&&r!==n.x&&fi(i<l?r:a,i,c,l,i<l?a:r,i,n.x,n.y)){let t=Math.abs(i-n.y)/(r-n.x);bi(n,e)&&(t<u||t===u&&(n.x>o.x||n.x===o.x&&si(o,n)))&&(o=n,u=t)}n=n.next}while(n!==s);return o}function si(e,t){return U(e.prev,e,t.prev)<0&&U(t.next,e,e.next)<0}function ci(e,t,n,r){let i=e;do i.z===0&&(i.z=ui(i.x,i.y,t,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,li(i)}function li(e){let t,n=1;do{let r=e,i;e=null;let a=null;for(t=0;r;){t++;let o=r,s=0;for(let e=0;e<n&&(s++,o=o.nextZ,o);e++);let c=n;for(;s>0||c>0&&o;)s!==0&&(c===0||!o||r.z<=o.z)?(i=r,r=r.nextZ,s--):(i=o,o=o.nextZ,c--),a?a.nextZ=i:e=i,i.prevZ=a,a=i;r=o}a.nextZ=null,n*=2}while(t>1);return e}function ui(e,t,n,r,i){return e=(e-n)*i|0,t=(t-r)*i|0,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,e|t<<1}function di(e){let t=e,n=e;do(t.x<n.x||t.x===n.x&&t.y<n.y)&&(n=t),t=t.next;while(t!==e);return n}function fi(e,t,n,r,i,a,o,s){return(i-o)*(t-s)>=(e-o)*(a-s)&&(e-o)*(r-s)>=(n-o)*(t-s)&&(n-o)*(a-s)>=(i-o)*(r-s)}function pi(e,t,n,r,i,a,o,s){return(e!==o||t!==s)&&fi(e,t,n,r,i,a,o,s)}function mi(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!yi(e,t)&&(bi(e,t)&&bi(t,e)&&xi(e,t)&&(U(e.prev,e,t.prev)||U(e,t.prev,t))||hi(e,t)&&U(e.prev,e,e.next)>0&&U(t.prev,t,t.next)>0)}function U(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function hi(e,t){return e.x===t.x&&e.y===t.y}function gi(e,t,n,r){let i=vi(U(e,t,n)),a=vi(U(e,t,r)),o=vi(U(n,r,e)),s=vi(U(n,r,t));return!!(i!==a&&o!==s||i===0&&_i(e,n,t)||a===0&&_i(e,r,t)||o===0&&_i(n,e,r)||s===0&&_i(n,t,r))}function _i(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function vi(e){return e>0?1:e<0?-1:0}function yi(e,t){let n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&gi(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}function bi(e,t){return U(e.prev,e,e.next)<0?U(e,t,e.next)>=0&&U(e,e.prev,t)>=0:U(e,t,e.prev)<0||U(e,e.next,t)<0}function xi(e,t){let n=e,r=!1,i=(e.x+t.x)/2,a=(e.y+t.y)/2;do n.y>a!=n.next.y>a&&n.next.y!==n.y&&i<(n.next.x-n.x)*(a-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next;while(n!==e);return r}function Si(e,t){let n=new Yr(e.i,e.x,e.y),r=new Yr(t.i,t.x,t.y),i=e.next,a=t.prev;return e.next=t,t.prev=e,n.next=i,i.prev=n,r.next=n,n.prev=r,a.next=r,r.prev=a,r}function Ci(e,t,n,r){let i=new Yr(e,t,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function wi(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Ti(e,t,n,r){let i=0;for(let a=t,o=n-r;a<n;a+=r)i+=(e[o]-e[a])*(e[a+1]+e[o+1]),o=a;return i}function Ei(e,t,n){let r=(t,n)=>{let r=0;for(let i=t,a=n-2;i<n;i+=2)r+=(e[a]-e[i])*(e[i+1]+e[a+1]),a=i;return Math.abs(r/2)},i=r(0,t&&t.length?t[0]*2:e.length);if(t)for(let n=0;n<t.length;n++){let a=t[n]*2,o=n<t.length-1?t[n+1]*2:e.length;i-=r(a,o)}let a=0;for(let t=0;t<n.length;t+=3){let r=n[t]*2,i=n[t+1]*2,o=n[t+2]*2;a+=Math.abs((e[r]-e[o])*(e[i+1]-e[r+1])-(e[r]-e[i])*(e[o+1]-e[r+1]))/2}return i===0&&a===0?0:Math.abs(i-a)/Math.max(Math.abs(i),1e-12)}function Di(e,t,n){let r=!1,i=e.length/2;for(let a=0,o=i-1;a<i;o=a++){let i=e[a*2],s=e[a*2+1],c=e[o*2],l=e[o*2+1];s>n!=l>n&&t<(c-i)*(n-s)/(l-s)+i&&(r=!r)}return r}function Oi(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a=0;a<e.length;a+=2){let o=e[a],s=e[a+1];o<t&&(t=o),s<n&&(n=s),o>r&&(r=o),s>i&&(i=s)}return{minX:t,minY:n,maxX:r,maxY:i}}function ki(e){let t=e.length/2;for(let n=0;n<Math.min(t,8);n++){let r=(n-1+t)%t*2,i=n*2,a=(n+1)%t*2,o=(e[r]+e[i]+e[a])/3,s=(e[r+1]+e[i+1]+e[a+1])/3;if(Di(e,o,s))return[o,s]}return[e[0],e[1]]}function Ai(e,t=`nonzero`){let n=[];for(let t of e){if(t.points.length<6)continue;let e=Kr(t.points);Math.abs(e)<1e-14||n.push({c:t,area:e,abs:Math.abs(e),box:Oi(t.points),parent:-1,depth:0,winding:0,children:[]})}n.sort((e,t)=>t.abs-e.abs);for(let e=0;e<n.length;e++){let r=n[e],[i,a]=ki(r.c.points);for(let t=e-1;t>=0;t--){let e=n[t],o=e.box;if(!(i<o.minX||i>o.maxX||a<o.minY||a>o.maxY)&&Di(e.c.points,i,a)){r.parent=t;break}}let o=r.area>0?1:-1;if(r.parent>=0){let t=n[r.parent];r.depth=t.depth+1,r.winding=t.winding+o,t.children.push(e)}else r.depth=0,r.winding=o;r.filled=t===`evenodd`?r.depth%2==0:r.winding!==0}for(let e of n)e.isWall=e.filled!==(e.parent>=0&&n[e.parent].filled);let r=(e,t)=>({...Kr(e.c.points)>0===t?e.c:qr(e.c),isWall:e.isWall}),i=[],a=[];for(let e=0;e<n.length;e++){let t=n[e];t.filled&&i.push({outer:r(t,!0),holes:t.children.map(e=>r(n[e],!1))}),t.isWall&&a.push(r(t,t.filled))}return{regions:i,walls:a}}function ji(e){let t=e.outer.points.length;for(let n of e.holes)t+=n.points.length;let n=new Float64Array(t),r=new Uint8Array(t/2);n.set(e.outer.points,0),r.set(e.outer.smooth,0);let i=[],a=e.outer.points.length;for(let t of e.holes)i.push(a/2),n.set(t.points,a),r.set(t.smooth,a/2),a+=t.points.length;let o=Jr(n,i.length?i:null);return{positions:n,smooth:r,indices:o,holeIndices:i,error:Ei(n,i.length?i:null,o)}}var Mi=class e{constructor(e){this.positions=e.positions;let t=this.positions.length/3;this.normals=e.normals||new Float32Array(t*3),this.uvs=e.uvs||new Float32Array(t*2),this.indices=e.indices,this.kind=e.kind||`triangles`,this._bounds=null,this._edges=null,this._normalLines=null}get vertexCount(){return this.positions.length/3}get primitiveCount(){return this.kind===`lines`?this.indices.length/2:this.indices.length/3}get byteSize(){return this.positions.byteLength+this.normals.byteLength+this.uvs.byteLength+this.indices.byteLength}get bounds(){if(!this._bounds){let e=this.positions,t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let r=0;r<e.length;r+=3)for(let i=0;i<3;i++){let a=e[r+i];a<t[i]&&(t[i]=a),a>n[i]&&(n[i]=a)}e.length===0&&(t.fill(0),n.fill(0)),this._bounds={min:t,max:n}}return this._bounds}edges(){if(this._edges)return this._edges;if(this.kind===`lines`)return this._edges=this.indices;let e=Ni(this.positions),t=new Set,n=[],r=this.indices,i=this.vertexCount;for(let a=0;a<r.length;a+=3)for(let o=0;o<3;o++){let s=r[a+o],c=r[a+(o+1)%3],l=e[s],u=e[c];if(l===u)continue;let d=l<u?l*i+u:u*i+l;t.has(d)||(t.add(d),n.push(s,c))}return this._edges=Uint32Array.from(n),this._edges}normalLines(){if(this._normalLines)return this._normalLines;let t=this.vertexCount,n=new Float32Array(t*6),r=new Float32Array(t*6),i=new Float32Array(t*4),a=new Uint32Array(t*2);for(let e=0;e<t;e++){for(let t=0;t<3;t++)n[e*6+t]=this.positions[e*3+t],n[e*6+3+t]=this.positions[e*3+t],r[e*6+t]=this.normals[e*3+t],r[e*6+3+t]=this.normals[e*3+t];i[e*4+2]=1,a[e*2]=e*2,a[e*2+1]=e*2+1}return this._normalLines=new e({positions:n,normals:r,uvs:i,indices:a,kind:`lines`}),this._normalLines}};function Ni(e){let t=e.length/3,n=new Uint32Array(t),r=16;for(;r<t*2;)r*=2;let i=r-1,a=new Int32Array(r).fill(-1),o=new Float64Array(t*3);for(let n=0;n<t*3;n++)o[n]=Math.round(e[n]*1e6);for(let e=0;e<t;e++){let t=o[e*3],r=o[e*3+1],s=o[e*3+2],c=(Math.imul(t|0,73856093)^Math.imul(r|0,19349663)^Math.imul(s|0,83492791))&i;for(;;){let l=a[c];if(l<0){a[c]=e,n[e]=e;break}if(o[l*3]===t&&o[l*3+1]===r&&o[l*3+2]===s){n[e]=l;break}c=c+1&i}}return n}var Pi=class{constructor(e=`triangles`,t=256,n=768){this.kind=e,t=Math.max(1,t),n=Math.max(1,n),this.p=new Float32Array(t*3),this.n=new Float32Array(t*3),this.t=new Float32Array(t*2),this.i=new Uint32Array(n),this.vc=0,this.ic=0}growV(e){let t=this.vc+e;if(t*3<=this.p.length)return;let n=this.p.length/3;for(;n<t;)n*=2;let r=new Float32Array(n*3);r.set(this.p);let i=new Float32Array(n*3);i.set(this.n);let a=new Float32Array(n*2);a.set(this.t),this.p=r,this.n=i,this.t=a}growI(e){let t=this.ic+e;if(t<=this.i.length)return;let n=this.i.length;for(;n<t;)n*=2;let r=new Uint32Array(n);r.set(this.i),this.i=r}vertex(e,t,n,r=0,i=0,a=0,o=0,s=0){this.vc*3>=this.p.length&&this.growV(1);let c=this.vc;return this.p[c*3]=e,this.p[c*3+1]=t,this.p[c*3+2]=n,this.n[c*3]=r,this.n[c*3+1]=i,this.n[c*3+2]=a,this.t[c*2]=o,this.t[c*2+1]=s,this.vc++,c}tri(e,t,n){this.ic+3>this.i.length&&this.growI(3),this.i[this.ic++]=e,this.i[this.ic++]=t,this.i[this.ic++]=n}quad(e,t,n,r){this.tri(e,t,n),this.tri(e,n,r)}line(e,t){this.ic+2>this.i.length&&this.growI(2),this.i[this.ic++]=e,this.i[this.ic++]=t}get vertexCount(){return this.vc}build(){let e=(e,t)=>e.length===t?e:e.slice(0,t);return new Mi({positions:e(this.p,this.vc*3),normals:e(this.n,this.vc*3),uvs:e(this.t,this.vc*2),indices:e(this.i,this.ic),kind:this.kind})}};Pi.shapeKeeper=new Pi(`triangles`,1,1);function Fi(e,t,n=30,r=null){let i=Math.min(Math.max(n,0),180),a=Math.cos(i*Math.PI/180);if(i===i){let n=nn(e,t,i,a,r);if(n)return new Mi({...n,kind:`triangles`})}let o=t.length/3,s=new Float64Array(o*3),c=new Float64Array(o*3);for(let n=0;n<o;n++){let r=t[n*3]*3,i=t[n*3+1]*3,a=t[n*3+2]*3,o=e[i]-e[r],l=e[i+1]-e[r+1],u=e[i+2]-e[r+2],d=e[a]-e[r],f=e[a+1]-e[r+1],p=e[a+2]-e[r+2],m=l*p-u*f,h=u*d-o*p,g=o*f-l*d;s[n*3]=m,s[n*3+1]=h,s[n*3+2]=g;let _=Math.sqrt(m*m+h*h+g*g)||1;c[n*3]=m/_,c[n*3+1]=h/_,c[n*3+2]=g/_}let l=Ni(e),u=e.length/3,d=null,f=null;if(i>0&&i<180){d=new Uint32Array(u+1);for(let e=0;e<t.length;e++)d[l[t[e]]+1]++;for(let e=0;e<u;e++)d[e+1]+=d[e];f=new Uint32Array(t.length);let e=d.slice(0,u);for(let n=0;n<t.length;n++)f[e[l[t[n]]]++]=n/3|0}let p=null;if(i>=180){p=new Float64Array(u*3);for(let e=0;e<t.length;e++){let n=l[t[e]]*3,r=(e/3|0)*3;p[n]+=s[r],p[n+1]+=s[r+1],p[n+2]+=s[r+2]}for(let e=0;e<u*3;e+=3){let t=p[e],n=p[e+1],r=p[e+2],i=Math.sqrt(t*t+n*n+r*r)||1;p[e]=t/i,p[e+1]=n/i,p[e+2]=r/i}}let m=Math.max(1,u),h=new Float32Array(m*3),g=new Float32Array(m*3),_=new Float32Array(m*2),v=new Uint32Array(t.length),y=0,b=p!==null;for(let e=0;b&&e<u*3;e++)p[e]!==p[e]&&(b=!1);if(b){let n=new Int32Array(u).fill(-1);for(let i=0;i<t.length;i++){let a=t[i],o=n[a];if(o<0){o=n[a]=y++;let t=l[a]*3;h[o*3]=e[a*3],h[o*3+1]=e[a*3+1],h[o*3+2]=e[a*3+2],g[o*3]=p[t],g[o*3+1]=p[t+1],g[o*3+2]=p[t+2],r&&(_[o*2]=r[a*2],_[o*2+1]=r[a*2+1])}v[i]=o}}else{let n=new Int32Array(u).fill(-1),o=new Int32Array(m),b=new Int32Array(m*3);for(let u=0;u<t.length;u++){let x=u/3|0,S=t[u],C=l[S],w=0,T=0,E=0;if(i<=0)w=c[x*3],T=c[x*3+1],E=c[x*3+2];else if(p)w=p[C*3],T=p[C*3+1],E=p[C*3+2];else{let e=c[x*3],t=c[x*3+1],n=c[x*3+2];for(let r=d[C];r<d[C+1];r++){let i=f[r];(i===x||c[i*3]*e+c[i*3+1]*t+c[i*3+2]*n>=a)&&(w+=s[i*3],T+=s[i*3+1],E+=s[i*3+2])}let r=Math.sqrt(w*w+T*T+E*E)||1;w/=r,T/=r,E/=r}let D=Math.round(w*1e4),O=Math.round(T*1e4),k=Math.round(E*1e4),A=n[S];for(;A>=0&&(b[A*3]!==D||b[A*3+1]!==O||b[A*3+2]!==k);)A=o[A];if(A<0){if(A=y++,A>=m){m*=2;let e=(e,t)=>{let n=new e.constructor(m*t);return n.set(e),n};h=e(h,3),g=e(g,3),_=e(_,2),o=e(o,1),b=e(b,3)}h[A*3]=e[S*3],h[A*3+1]=e[S*3+1],h[A*3+2]=e[S*3+2],g[A*3]=w,g[A*3+1]=T,g[A*3+2]=E,r&&(_[A*2]=r[S*2],_[A*2+1]=r[S*2+1]),o[A]=n[S],n[S]=A,b[A*3]=D,b[A*3+1]=O,b[A*3+2]=k}v[u]=A}}let x=(e,t)=>e.length===t?e:e.slice(0,t);return new Mi({positions:x(h,y*3),normals:x(g,y*3),uvs:x(_,y*2),indices:v,kind:`triangles`})}var Ii=Math.PI*2;function W(e,t,n=1,r=3){return Math.max(r,Math.round(e*n/(1<<t)))}function Li(){let e=new Pi(`triangles`,24,36);for(let[t,n,r]of[[[1,0,0],[0,0,-1],[0,1,0]],[[-1,0,0],[0,0,1],[0,1,0]],[[0,1,0],[1,0,0],[0,0,-1]],[[0,-1,0],[1,0,0],[0,0,1]],[[0,0,1],[1,0,0],[0,1,0]],[[0,0,-1],[-1,0,0],[0,1,0]]]){let i=[];for(let[a,o,s,c]of[[-1,-1,0,0],[1,-1,1,0],[1,1,1,1],[-1,1,0,1]])i.push(e.vertex(t[0]*.5+n[0]*.5*a+r[0]*.5*o,t[1]*.5+n[1]*.5*a+r[1]*.5*o,t[2]*.5+n[2]*.5*a+r[2]*.5*o,t[0],t[1],t[2],s,c));e.quad(i[0],i[1],i[2],i[3])}return e.build()}function Ri(e,t,n,r,i){let a=hn.roundedBox(e,t,n,r,i);if(a)return new Mi({...a,kind:`triangles`});let o=[e/2,t/2,n/2],s=2*i+2,c=new Pi(`triangles`,6*s*s,6*(s-1)*(s-1)*6),l=new Float64Array(3),u=e=>{let t=e-r,n=[];for(let e=i;e>=1;e--)n.push(-t-r*Math.tan(e/i*Math.PI/4));n.push(-t,t);for(let e=1;e<=i;e++)n.push(t+r*Math.tan(e/i*Math.PI/4));return n};for(let[e,t,n,i]of[[0,1,[0,0,-1],[0,1,0]],[0,-1,[0,0,1],[0,1,0]],[1,1,[1,0,0],[0,0,-1]],[1,-1,[1,0,0],[0,0,1]],[2,1,[1,0,0],[0,1,0]],[2,-1,[-1,0,0],[0,1,0]]]){let a=n.findIndex(e=>e!==0),s=i.findIndex(e=>e!==0),d=u(o[a]).map(e=>e*n[a]),f=u(o[s]).map(e=>e*i[s]),p=d.length,m=c.vertexCount;for(let u=0;u<p;u++)for(let m=0;m<p;m++){l[e]=t*o[e],l[a]=d[m],l[s]=f[u];let p=Math.max(-(o[0]-r),Math.min(o[0]-r,l[0])),h=Math.max(-(o[1]-r),Math.min(o[1]-r,l[1])),g=Math.max(-(o[2]-r),Math.min(o[2]-r,l[2])),_=l[0]-p,v=l[1]-h,y=l[2]-g,b=Math.hypot(_,v,y);b>1e-12?(_/=b,v/=b,y/=b):(_=e===0?t:0,v=e===1?t:0,y=e===2?t:0),c.vertex(p+_*r,h+v*r,g+y*r,_,v,y,(d[m]/o[a]/n[a]+1)/2,(f[u]/o[s]/i[s]+1)/2)}for(let e=0;e<p-1;e++)for(let t=0;t<p-1;t++){let n=m+e*p+t;c.quad(n,n+1,n+p+1,n+p)}}return c.build()}function zi(e){let t=hn.sphere(e);if(t)return new Mi({...t,kind:`triangles`});let n=Math.max(3,e),r=Math.max(2,Math.round(n/2)),i=new Pi(`triangles`,(n+1)*(r+1),n*(r-1)*6);for(let e=0;e<=r;e++){let t=e/r*Math.PI,a=Math.sin(t),o=Math.cos(t);for(let t=0;t<=n;t++){let s=t%n/n*Ii,c=a*Math.cos(s),l=o,u=-a*Math.sin(s);i.vertex(c,l,u,c,l,u,t/n,1-e/r)}}let a=n+1;for(let e=0;e<r;e++)for(let t=0;t<n;t++){let n=e*a+t,o=(e+1)*a+t,s=o+1,c=n+1;e!==r-1&&i.tri(n,o,s),e!==0&&i.tri(n,s,c)}return i.build()}function Bi(e,t,n){let r=hn.cylinder(e,t,n);if(r)return new Mi({...r,kind:`triangles`});let i=Math.max(3,t),a=new Pi(`triangles`,(i+1)*2+(n?i+2+(e>0?i+2:0):0),i*(e>0?6:3)+(n?i*3*(e>0?2:1):0)),o=1-e,s=[];for(let e=0;e<=i;e++){let t=e%i/i*Ii;s.push([Math.cos(t),-Math.sin(t)])}let c=(e,t)=>{let n=Math.hypot(e,o,t);return[e/n,o/n,t/n]},l=[],u=[];for(let t=0;t<=i;t++){let[n,r]=s[t],o=c(n,r);if(l.push(a.vertex(n,-.5,r,o[0],o[1],o[2],t/i,0)),e>0)u.push(a.vertex(n*e,.5,r*e,o[0],o[1],o[2],t/i,1));else{let e=(t+.5)/i*Ii,n=c(Math.cos(e),-Math.sin(e));u.push(a.vertex(0,.5,0,n[0],n[1],n[2],(t+.5)/i,1))}}for(let t=0;t<i;t++)e>0?a.quad(l[t],l[t+1],u[t+1],u[t]):a.tri(l[t],l[t+1],u[t]);if(n){let t=a.vertex(0,-.5,0,0,-1,0,.5,.5),n=[];for(let e=0;e<=i;e++)n.push(a.vertex(s[e][0],-.5,s[e][1],0,-1,0,s[e][0]*.5+.5,s[e][1]*.5+.5));for(let e=0;e<i;e++)a.tri(t,n[e+1],n[e]);if(e>0){let t=a.vertex(0,.5,0,0,1,0,.5,.5),n=[];for(let t=0;t<=i;t++)n.push(a.vertex(s[t][0]*e,.5,s[t][1]*e,0,1,0,s[t][0]*.5+.5,s[t][1]*.5+.5));for(let e=0;e<i;e++)a.tri(t,n[e],n[e+1])}}return a.build()}function Vi(e,t){let n=hn.capsule(e,t);if(n)return new Mi({...n,kind:`triangles`});let r=Math.max(3,t),i=Math.max(1,Math.round(r/4)),a=[];for(let t=0;t<=i;t++)a.push([t/i*(Math.PI/2),e/2]);for(let t=0;t<=i;t++)a.push([Math.PI/2+t/i*(Math.PI/2),-e/2]);let o=e+2,s=a.length,c=new Pi(`triangles`,s*(r+1),r*3*(2*(s-1)-2));for(let e=0;e<a.length;e++){let[t,n]=a[e],i=Math.sin(t),s=Math.cos(t),l=s+n;for(let e=0;e<=r;e++){let t=e%r/r*Ii,n=i*Math.cos(t),a=-i*Math.sin(t);c.vertex(n,l,a,n,s,a,e/r,(l+o/2)/o)}}let l=r+1,u=a.length;for(let e=0;e<u-1;e++)for(let t=0;t<r;t++){let n=e*l+t,r=(e+1)*l+t,i=r+1,a=n+1;e!==u-2&&c.tri(n,r,i),e!==0&&c.tri(n,i,a)}return c.build()}function Hi(){let e=new Pi(`triangles`,4,6),t=e.vertex(-.5,0,.5,0,1,0,0,0),n=e.vertex(.5,0,.5,0,1,0,1,0),r=e.vertex(.5,0,-.5,0,1,0,1,1),i=e.vertex(-.5,0,-.5,0,1,0,0,1);return e.quad(t,n,r,i),e.build()}function Ui(e,t,n,r){let i=hn.torus(e,t,n,r);if(i)return new Mi({...i,kind:`triangles`});let a=t>=360-1e-9,o=Math.min(t,360)*Math.PI/180,s=Math.max(3,Math.round(n*(a?1:t/360))||3),c=Math.max(3,r),l=new Pi(`triangles`,(s+1)*(c+1)+(a?0:2*(c+2)),s*c*6+(a?0:2*c*3));for(let t=0;t<=s;t++){let n=a?t%s/s*Ii:t/s*o,r=Math.cos(n),i=Math.sin(n);for(let n=0;n<=c;n++){let a=n%c/c*Ii,o=Math.cos(a),u=Math.sin(a),d=1+e*o;l.vertex(d*r,e*u,-d*i,o*r,u,-o*i,t/s,n/c)}}let u=c+1;for(let e=0;e<s;e++)for(let t=0;t<c;t++){let n=e*u+t;l.quad(n,n+u,n+u+1,n+1)}if(!a)for(let[t,n]of[[0,1],[o,-1]]){let r=Math.cos(t),i=Math.sin(t),a=-i,o=-r,s=-a*n,u=-o*n,d=l.vertex(r,0,-i,s,0,u,.5,.5),f=[];for(let t=0;t<=c;t++){let n=t%c/c*Ii,a=1+e*Math.cos(n);f.push(l.vertex(a*r,e*Math.sin(n),-a*i,s,0,u,.5+Math.cos(n)*.5,.5+Math.sin(n)*.5))}for(let e=0;e<c;e++)n>0?l.tri(d,f[e],f[e+1]):l.tri(d,f[e+1],f[e])}return l.build()}function Wi(e,t){let n=e.length/3,r=new Pi(`lines`,n,2*(n-1)+(t&&n>2?2:0));for(let t=0;t<n;t++)r.vertex(e[t*3],e[t*3+1],e[t*3+2],0,0,0,t/Math.max(1,n-1),0);for(let e=0;e<n-1;e++)r.line(e,e+1);return t&&n>2&&r.line(n-1,0),r.build()}function Gi(e){return 1-Math.cos(Math.PI/Math.max(3,e))}function Ki(e,t,n,r,i,a,o,s,c){let l=r-e,u=i-t,d=a-n,f=o-e,p=s-t,m=c-n,h=u*m-d*p,g=d*f-l*m,_=l*p-u*f,v=Math.hypot(h,g,_);if(v<1e-14)return 1;h/=v,g/=v,_/=v;let y=e*h+t*g+n*_,b=y*h,x=y*g,S=y*_,C=f,w=p,T=m,E=l,D=u,O=d,k=b-e,A=x-t,j=S-n,ee=C*C+w*w+T*T,M=C*E+w*D+T*O,N=E*E+D*D+O*O,te=C*k+w*A+T*j,ne=E*k+D*A+O*j,re=ee*N-M*M;if(Math.abs(re)>1e-18){let e=1/re,t=(N*te-M*ne)*e,n=(ee*ne-M*te)*e;if(t>=-1e-5&&n>=-1e-5&&t+n<=1+1e-5)return Math.abs(y)}return Math.min(qi(e,t,n,r,i,a),qi(r,i,a,o,s,c),qi(o,s,c,e,t,n))}function qi(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n,l=o*o+s*s+c*c,u=l>0?-(e*o+t*s+n*c)/l:0;return u<0?u=0:u>1&&(u=1),Math.hypot(e+o*u,t+s*u,n+c*u)}var Ji=new Map;function Yi(e){let t=Math.max(3,e|0),n=Ji.get(t);return n===void 0&&(n=Xi(t),Ji.set(t,n)),n}function Xi(e){let t=fn(e);if(t!==null)return t;let n=Math.max(2,Math.round(e/2)),r=Math.PI*2,i=new Float64Array(n+1),a=new Float64Array(n+1);for(let e=0;e<=n;e++){let t=e/n*Math.PI;i[e]=Math.sin(t),a[e]=Math.cos(t)}let o=new Float64Array(e+1),s=new Float64Array(e+1);for(let t=0;t<=e;t++){let n=t%e/e*r;o[t]=Math.cos(n),s[t]=Math.sin(n)}let c=0;for(let t=0;t<n;t++)for(let r=0;r<e;r++){let e=i[t]*o[r],l=a[t],u=-i[t]*s[r],d=i[t+1]*o[r],f=a[t+1],p=-i[t+1]*s[r],m=i[t+1]*o[r+1],h=a[t+1],g=-i[t+1]*s[r+1],_=i[t]*o[r+1],v=a[t],y=-i[t]*s[r+1];if(t!==n-1){let t=1-Ki(e,l,u,d,f,p,m,h,g);t>c&&(c=t)}if(t!==0){let t=1-Ki(e,l,u,m,h,g,_,v,y);t>c&&(c=t)}}return c}function Zi(e,t){return Math.max(1,e,0)*Gi(t)}function Qi(e){let t=Math.max(3,e|0),n=Math.max(1,Math.round(t/4));return Math.max(Gi(t),1-Math.cos(Math.PI/(2*n)))}function $i(e,t,n,r){let i=Math.max(3,Math.round(n*(t>=360-1e-9?1:t/360))||3);return e*Gi(Math.max(3,r))+(1+e)*Gi(i)}function ea(e,t){return e*(1-Math.cos(Math.PI/(4*Math.max(1,t))))}function ta(e,t){return(e/2+1)*Gi(Math.max(3,t))}var na=[6e-4,.0025,.01,.035];function ra(e,t){return(e>0&&Number.isFinite(e)?e:1)*na[Math.min(na.length-1,Math.max(0,t))]}function ia(e,t){return e>0?e*(1-Math.cos(Math.PI/(2*Math.max(1,t)))):0}var aa=4;function oa(e,t,n=!0){let r=e.length/2,i=n?r:r-1,a=new Float64Array(i*2);for(let t=0;t<i;t++){let n=(t+1)%r,i=e[n*2]-e[t*2],o=e[n*2+1]-e[t*2+1],s=Math.hypot(i,o)||1;a[t*2]=o/s,a[t*2+1]=-i/s}let o=new Float64Array(r*2),s=new Float64Array(r*2),c=new Uint8Array(r);for(let e=0;e<r;e++){let l=n||e>0,u=n||e<r-1,d=l?(e-1+i)%i:-1,f=u?e%i:-1,p,m,h,g;d>=0&&(p=a[d*2],m=a[d*2+1]),f>=0&&(h=a[f*2],g=a[f*2+1]),d<0&&(p=h,m=g),f<0&&(h=p,g=m);let _=p+h,v=m+g,y=Math.hypot(_,v);y<1e-9&&(_=p,v=m,y=1),_/=y,v/=y,o[e*2]=_,o[e*2+1]=v;let b=Math.max(_*p+v*m,1/aa);s[e*2]=_/b,s[e*2+1]=v/b,c[e]=t&&t[e]?0:1}let l=new Float64Array(r+1);for(let t=1;t<=r;t++){if(!n&&t===r){l[t]=l[t-1];break}let i=(t-1)%r,a=t%r;l[t]=l[t-1]+Math.hypot(e[a*2]-e[i*2],e[a*2+1]-e[i*2+1])}return{n:r,edges:i,edgeN:a,vertN:o,miter:s,corner:c,arc:l,length:l[n?r:r-1]}}function sa(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)for(let e=0;e<a.length;e+=2){let o=a[e],s=a[e+1];o<t&&(t=o),s<n&&(n=s),o>r&&(r=o),s>i&&(i=s)}return{minX:t,minY:n,maxX:r,maxY:i,size:Math.max(r-t,i-n)||1}}function ca(e){let t=[];for(let n of e){t.push(n.outer.points);for(let e of n.holes)t.push(e.points)}return sa(t)}function la(e,t){e>.01&&t&&t(`warning`,`W_SELF_INTERSECTION`,`A filled contour appears to be self-intersecting; the triangulation covers ${(100*(1-e)).toFixed(1)}% of the expected area.`)}function ua(e,t){let n=[];for(let r of e){let e=ji(r);la(e.error,t),n.push({region:r,...e})}return n}function da(e,t){let n=ua(e,t),r=0,i=0;for(let e of n)r+=e.positions.length/2,i+=e.indices.length;let a=new Pi(`triangles`,r,i),o=ca(e);for(let e of n){let t=a.vertexCount,n=e.positions;for(let e=0;e<n.length;e+=2)a.vertex(n[e],n[e+1],0,0,0,1,(n[e]-o.minX)/o.size,(n[e+1]-o.minY)/o.size);let r=e.indices;for(let e=0;e<r.length;e+=3)a.tri(t+r[e],t+r[e+1],t+r[e+2])}return a.build()}function fa(e,t){let n=e.points;if(!t||e.isWall===!1)return n;let r=oa(n,e.smooth,!0),i=new Float64Array(n.length);for(let e=0;e<n.length;e+=2)i[e]=n[e]-r.miter[e]*t,i[e+1]=n[e+1]-r.miter[e+1]*t;return i}function pa(e,t,n){let r=[];if(!(t>0))return r.push({inset:0,z:0,nr:1,nz:0},{inset:0,z:e,nr:1,nz:0}),r;for(let e=0;e<=n;e++){let i=e/n*(Math.PI/2);r.push({inset:t*(1-Math.sin(i)),z:t*(1-Math.cos(i)),nr:Math.sin(i),nz:-Math.cos(i)})}for(let i=n;i>=0;i--){let a=i/n*(Math.PI/2),o={inset:t*(1-Math.sin(a)),z:e-t*(1-Math.cos(a)),nr:Math.sin(a),nz:Math.cos(a)};i===n&&Math.abs(o.z-r[r.length-1].z)<1e-12||r.push(o)}return r}function ma(e,t,n){let r=t.depth,i=Math.min(t.bevel||0,r/2),a=t.bevelSegments||3,o=t.center?-r/2:0,s=ca(e.regions),c=s.size,l=pa(r,i,a),u=dn(e,i,l,o,o+r,s.minX,s.minY,c);if(u){for(let e of u.errors)la(e,n);return new Mi({positions:u.positions,normals:u.normals,uvs:u.uvs,indices:u.indices,kind:`triangles`})}let d=ua(e.regions.map(e=>({outer:{...e.outer,points:fa(e.outer,i)},holes:e.holes.map(e=>({...e,points:fa(e,i)}))})),n),f=e.walls.map(e=>({pts:e.points,f:oa(e.points,e.smooth,!0)})),p=0,m=0;for(let e of d)p+=e.positions.length,m+=2*e.indices.length;for(let{f:e}of f)p+=e.n*l.length*2,m+=e.n*(l.length-1)*6;let h=new Pi(`triangles`,p,m);for(let e of d){let t=e.positions,n=e.indices;for(let[e,i]of[[o+r,1],[o,-1]]){let r=h.vertexCount;for(let n=0;n<t.length;n+=2)h.vertex(t[n],t[n+1],e,0,0,i,(t[n]-s.minX)/c,(t[n+1]-s.minY)/c);for(let e=0;e<n.length;e+=3)i>0?h.tri(r+n[e],r+n[e+1],r+n[e+2]):h.tri(r+n[e],r+n[e+2],r+n[e+1])}}for(let{pts:e,f:t}of f){let n=t.n;for(let r=0;r<n;r++){let i=r,a=(r+1)%n,s=t.corner[i]?t.edgeN[r*2]:t.vertN[i*2],u=t.corner[i]?t.edgeN[r*2+1]:t.vertN[i*2+1],d=t.corner[a]?t.edgeN[r*2]:t.vertN[a*2],f=t.corner[a]?t.edgeN[r*2+1]:t.vertN[a*2+1],p=t.arc[r]/c,m=t.arc[r+1]/c,g=-1,_=-1;for(let n of l){let r=e[i*2]-t.miter[i*2]*n.inset,l=e[i*2+1]-t.miter[i*2+1]*n.inset,v=e[a*2]-t.miter[a*2]*n.inset,y=e[a*2+1]-t.miter[a*2+1]*n.inset,b=o+n.z,x=h.vertex(r,l,b,s*n.nr,u*n.nr,n.nz,p,n.z/c),S=h.vertex(v,y,b,d*n.nr,f*n.nr,n.nz,m,n.z/c);g>=0&&h.quad(g,_,S,x),g=x,_=S}}}return h.build()}function ha(e){let t=e.points,n=t.length/2,r=new Float64Array(t.length+4);return r.set(t),r[t.length]=0,r[t.length+1]=t[(n-1)*2+1],r[t.length+2]=0,r[t.length+3]=t[1],Kr(r)>=0?e:qr(e)}function ga(e,t,n){let r=t.angle>=360-1e-9,i=Math.min(t.angle,360)*Math.PI/180,a=Math.max(2,t.segments),o=!1,s=[];for(let t of e){let e=t.points;for(let t=0;t<e.length;t+=2)if(e[t]<-1e-9){n&&n(`error`,`E_REVOLVE_AXIS`,`The revolve profile crosses the axis: point (${e[t]}, ${e[t+1]}) has x < 0. Profiles must stay at x ≥ 0.`);break}let i=t.closed;i||(o=!0);let a=i?Kr(t.points)>0?t:qr(t):ha(t),c=a.points,l=c.length/2;if(l<2)continue;let u=oa(c,a.smooth,i),d=u.length||1,f=[],p=new Int32Array(l).fill(-1),m=new Int32Array(l).fill(-1),h=(e,t,n,r,i)=>f.push(e,t,n,r,i)/5-1;for(let e=0;e<l;e++){let t=i?(e-1+l)%l:e-1,n=i||e<l-1?e:-1,r=Math.max(0,c[e*2]),a=c[e*2+1],o=u.arc[e]/d;if(t>=0&&n>=0&&u.corner[e])p[e]=h(r,a,u.edgeN[t*2],u.edgeN[t*2+1],o),m[e]=h(r,a,u.edgeN[n*2],u.edgeN[n*2+1],o);else{let i=n>=0?n:t,s=u.corner[e]?h(r,a,u.edgeN[i*2],u.edgeN[i*2+1],o):h(r,a,u.vertN[e*2],u.vertN[e*2+1],o);p[e]=s,m[e]=s}}let g=!r&&i?Jr(c):null;s.push({closed:i,pts:c,n:l,entries:f,entryIn:p,entryOut:m,tri:g})}let c=0,l=0;for(let e of s)c+=e.entries.length/5*(a+1),l+=(e.closed?e.n:e.n-1)*a*6,e.tri&&(c+=2*e.n,l+=2*e.tri.length);let u=new Pi(`triangles`,c,l),d=new Float64Array(a+1),f=new Float64Array(a+1);for(let e=0;e<=a;e++){let t=i*e/a;d[e]=Math.cos(t),f[e]=Math.sin(t)}for(let{closed:e,pts:t,n,entries:r,entryIn:o,entryOut:c,tri:l}of s){let s=u.vertexCount,p=a+1;for(let e=0;e<r.length;e+=5){let t=r[e],n=r[e+1],i=r[e+2],o=r[e+3],s=r[e+4];for(let e=0;e<=a;e++){let r=d[e],c=f[e];u.vertex(t*r,n,-t*c,i*r,o,-i*c,e/a,s)}}let m=e?n:n-1;for(let e=0;e<m;e++){let t=c[e],r=o[(e+1)%n];for(let e=0;e<a;e++){let n=s+t*p+e,i=s+r*p+e;u.quad(n,n+1,i+1,i)}}if(l)for(let[e,r]of[[0,1],[i,-1]]){let i=Math.cos(e),a=Math.sin(e),o=u.vertexCount;for(let e=0;e<n;e++){let n=Math.max(0,t[e*2]),o=t[e*2+1];u.vertex(n*i,o,-n*a,r>0?0:-a,0,r>0?1:-i,n,o)}for(let e=0;e<l.length;e+=3)r>0?u.tri(o+l[e],o+l[e+1],o+l[e+2]):u.tri(o+l[e],o+l[e+2],o+l[e+1])}}return{mesh:u.build(),doubleSided:o}}var _a=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]];function va(e){let t=Math.hypot(e[0],e[1],e[2]);return t>1e-20?[e[0]/t,e[1]/t,e[2]/t]:[0,0,0]}function ya(e){let t=Math.abs(e[0]),n=Math.abs(e[1]),r=Math.abs(e[2]);return va(_a(e,t<=n&&t<=r?[1,0,0]:n<=r?[0,1,0]:[0,0,1]))}var ba=Math.PI*2;function xa(e,t,n,r){let i=Math.max(2,Math.ceil(n*r)),a=new Float64Array((i+1)*3),o=n*ba;for(let n=0;n<=i;n++){let r=n/i*o;a[n*3]=e*Math.cos(r),a[n*3+1]=t*r/ba,a[n*3+2]=-e*Math.sin(r)}return a}function Sa(e,t,n){let r=e.length/3;if(r<2)return Float64Array.from(e);let i=gn(e,t,n);if(i)return i;let a=n=>{if(t){let t=(n%r+r)%r;return[e[t*3],e[t*3+1],e[t*3+2]]}if(n<0){let e=a(0),t=a(1);return[2*e[0]-t[0],2*e[1]-t[1],2*e[2]-t[2]]}if(n>r-1){let e=a(r-1),t=a(r-2);return[2*e[0]-t[0],2*e[1]-t[1],2*e[2]-t[2]]}return[e[n*3],e[n*3+1],e[n*3+2]]},o=[],s=t?r:r-1,c=(e,t)=>Math.max(Math.sqrt(Math.hypot(t[0]-e[0],t[1]-e[1],t[2]-e[2])),1e-6);for(let e=0;e<s;e++){let t=a(e-1),r=a(e),i=a(e+1),s=a(e+2),l=0+c(t,r),u=l+c(r,i),d=u+c(i,s);for(let e=0;e<n;e++){let a=l+(u-l)*e/n,c=(e,t,n,r)=>{let i=(a-n)/(r-n);return[e[0]+(t[0]-e[0])*i,e[1]+(t[1]-e[1])*i,e[2]+(t[2]-e[2])*i]},f=c(t,r,0,l),p=c(r,i,l,u),m=c(i,s,u,d),h=c(c(f,p,0,u),c(p,m,l,d),l,u);o.push(h[0],h[1],h[2])}}if(!t){let e=a(r-1);o.push(e[0],e[1],e[2])}return Float64Array.from(o)}function Ca(e,{tolerance:t,segmentsPerTurn:n,smooth:r,subdivisions:i}){if(e.kind===`helix`)return[{points:xa(e.radius,e.pitch,e.turns,e.segmentsPerTurn||n),closed:!1}];if(e.kind===`path`)return Ur(e.segments,{dim:3,tolerance:t}).map(e=>({points:e.points,closed:e.closed}));let a=e.points,o=a.length/3,s=!1;return o>2&&Math.hypot(a[0]-a[(o-1)*3],a[1]-a[(o-1)*3+1],a[2]-a[(o-1)*3+2])<1e-12&&(s=!0,a=a.slice(0,(o-1)*3)),r&&(a=Sa(a,s,i)),[{points:a,closed:s}]}function wa(e,t){let n=[],r=e.length/3;for(let t=0;t<r;t++){let r=e[t*3],i=e[t*3+1],a=e[t*3+2],o=n.length;o&&Math.hypot(n[o-3]-r,n[o-2]-i,n[o-1]-a)<1e-9||n.push(r,i,a)}if(t&&n.length>6){let e=n.length;Math.hypot(n[0]-n[e-3],n[1]-n[e-2],n[2]-n[e-1])<1e-9&&(n.length-=3)}return n}function Ta(e,t){let n=wa(e,t),r=n.length/3;if(r<2)return null;let i=t?r+1:r,a=new Float64Array(i*3);for(let e=0;e<i;e++){let t=e%r*3;a[e*3]=n[t],a[e*3+1]=n[t+1],a[e*3+2]=n[t+2]}let o=i-1,s=new Float64Array(o*3);for(let e=0;e<o;e++)Ea(s,e*3,a[e*3+3]-a[e*3],a[e*3+4]-a[e*3+1],a[e*3+5]-a[e*3+2]);let c=new Float64Array(i*3),l=new Float64Array(i*3),u=new Float64Array(i);for(let e=0;e<i;e++){let n=3*(t?(e-1+o)%o:Math.max(0,e-1)),r=3*(t?e%o:Math.min(o-1,e)),i=e*3;Ea(c,i,s[n]+s[r],s[n+1]+s[r+1],s[n+2]+s[r+2]),c[i]===0&&c[i+1]===0&&c[i+2]===0&&(c[i]=s[r],c[i+1]=s[r+1],c[i+2]=s[r+2]);let a=Math.max(c[i]*s[r]+c[i+1]*s[r+1]+c[i+2]*s[r+2],.25);Ea(l,i,s[r]-s[n],s[r+1]-s[n+1],s[r+2]-s[n+2]),u[e]=1/a}let d=new Float64Array(i*3),f=c[0],p=c[1],m=c[2],h=Math.abs(p)<.99?0:1,g=+(Math.abs(p)<.99),_=p*0-m*g,v=m*h-f*0,y=f*g-p*h;Ea(d,0,v*m-y*p,y*f-_*m,_*p-v*f),d[0]===0&&d[1]===0&&d[2]===0&&d.set(ya([f,p,m]));for(let e=0;e<i-1;e++){let t=e*3,n=a[t+3]-a[t],r=a[t+4]-a[t+1],i=a[t+5]-a[t+2],o=n*n+r*r+i*i,s=d[t],l=d[t+1],u=d[t+2],f=c[t],p=c[t+1],m=c[t+2];if(o>0){let e=2/o*(n*s+r*l+i*u);s-=n*e,l-=r*e,u-=i*e;let t=2/o*(n*f+r*p+i*m);f-=n*t,p-=r*t,m-=i*t}let h=c[t+3]-f,g=c[t+4]-p,_=c[t+5]-m,v=h*h+g*g+_*_;if(v>1e-20){let e=2/v*(h*s+g*l+_*u);s-=h*e,l-=g*e,u-=_*e}Ea(d,t+3,s,l,u)}if(t){let e=(i-1)*3,t=d[e+1]*d[2]-d[e+2]*d[1],n=d[e+2]*d[0]-d[e]*d[2],r=d[e]*d[1]-d[e+1]*d[0],a=Math.atan2(t*c[0]+n*c[1]+r*c[2],d[e]*d[0]+d[e+1]*d[1]+d[e+2]*d[2]);for(let e=0;e<i;e++){let t=a*e/(i-1),n=Math.cos(t),r=Math.sin(t),o=e*3,s=d[o],l=d[o+1],u=d[o+2],f=c[o],p=c[o+1],m=c[o+2],h=p*u-m*l,g=m*s-f*u,_=f*l-p*s,v=(f*s+p*l+m*u)*(1-n);d[o]=s*n+h*r+f*v,d[o+1]=l*n+g*r+p*v,d[o+2]=u*n+_*r+m*v}d[e]=d[0],d[e+1]=d[1],d[e+2]=d[2]}let b=new Float64Array(i*3);for(let e=0;e<i*3;e+=3)b[e]=c[e+1]*d[e+2]-c[e+2]*d[e+1],b[e+1]=c[e+2]*d[e]-c[e]*d[e+2],b[e+2]=c[e]*d[e+1]-c[e+1]*d[e];let x=new Float64Array(i);for(let e=1;e<i;e++)x[e]=x[e-1]+Math.hypot(a[e*3]-a[e*3-3],a[e*3+1]-a[e*3-2],a[e*3+2]-a[e*3-1]);return{count:i,pos:a,T:c,N:d,B:b,K:l,stretch:u,arc:x,length:x[i-1],closed:t}}function Ea(e,t,n,r,i){let a=Math.hypot(n,r,i);a>1e-20?(e[t]=n/a,e[t+1]=r/a,e[t+2]=i/a):e[t]=e[t+1]=e[t+2]=0}function Da(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=a[n],m=o[n],h=s[n],g=(r*m-i*h)*p,_=(r*h+i*m)*p,v=n*3,y=c[v]*g+l[v]*_,b=c[v+1]*g+l[v+1]*_,x=c[v+2]*g+l[v+2]*_,S=f[n];if(S>1.0001){let e=(y*d[v]+b*d[v+1]+x*d[v+2])*(S-1);y+=d[v]*e,b+=d[v+1]*e,x+=d[v+2]*e}e[t]=u[v]+y,e[t+1]=u[v+1]+b,e[t+2]=u[v+2]+x}function Oa(e,t,n,r,i,a,o,s,c,l,u,d){let f=o[t],p=s[t],m=i*f-a*p,h=i*p+a*f,g=t*3,_=c[g]*m+l[g]*h,v=c[g+1]*m+l[g+1]*h,y=c[g+2]*m+l[g+2]*h;if(d!==0){let e=d*(n*i+r*a),t=_-u[g]*e,o=v-u[g+1]*e,s=y-u[g+2]*e,c=Math.hypot(t,o,s);c>1e-20?(_=t/c,v=o/c,y=s/c):_=v=y=0}e[0]=_,e[1]=v,e[2]=y}function ka(e,t,n,r,i,a,o,s,c,l,u,d){for(let f=0;f<r;f++)for(let r=0;r<n;r++)Da(e,(f*n+r)*3,f,t[r*2],t[r*2+1],i,a,o,s,c,l,u,d)}function Aa(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=n.n,m=n.length||1;for(let h=0;h<p;h++){let g=h,_=(h+1)%p,v=n.corner[g],y=n.corner[_],b=v?n.edgeN[h*2]:n.vertN[g*2],x=v?n.edgeN[h*2+1]:n.vertN[g*2+1],S=y?n.edgeN[h*2]:n.vertN[_*2],C=y?n.edgeN[h*2+1]:n.vertN[_*2+1],w=n.arc[h]/m,T=n.arc[h+1]/m,E=r[g*2],D=r[g*2+1],O=r[_*2],k=r[_*2+1],A=-1,j=-1;for(let n=0;n<i;n++){let r=a[n]/m;Oa(f,n,E,D,b,x,o,s,c,l,u,d);let i=(n*p+g)*3,h=e.vertex(t[i],t[i+1],t[i+2],f[0],f[1],f[2],w,r);Oa(f,n,O,k,S,C,o,s,c,l,u,d),i=(n*p+_)*3;let v=e.vertex(t[i],t[i+1],t[i+2],f[0],f[1],f[2],T,r);A>=0&&e.quad(A,j,v,h),A=h,j=v}}}function ja(e,t,n,r){let i=(n.twist||0)*Math.PI/180,a=n.taper===void 0?1:n.taper,o=n.caps!==!1,s=!1,c,l=null;if(e.kind===`circle`){let t=Math.max(3,e.segments),n=new Float64Array(t*2);for(let r=0;r<t;r++){let i=r/t*ba;n[r*2]=Math.cos(i)*e.radius,n[r*2+1]=Math.sin(i)*e.radius}c=[{points:n,smooth:new Uint8Array(t).fill(1),closed:!0}],l={circle:!0,pts:n}}else c=e.walls;let u=t.every(e=>e.points.length%3==0)?ln(t,c,l&&l.pts,e.regions,i,a,o):null;if(u){for(let e of u.errors)la(e,r);for(let e of u.degenerate)e&&r&&r(`error`,`E_DEGENERATE_SPINE`,`The sweep spine needs at least two distinct points.`);return{mesh:new Mi({positions:u.positions,normals:u.normals,uvs:u.uvs,indices:u.indices,kind:`triangles`}),doubleSided:u.open}}l||=ua(e.regions,r);let d=c.map(e=>({pts:e.points,f:oa(e.points,e.smooth,!0)})),f=[],p=0,m=0;for(let e of t){let t=Ta(e.points,e.closed);if(!t)r&&r(`error`,`E_DEGENERATE_SPINE`,`The sweep spine needs at least two distinct points.`);else{f.push(t);for(let{f:e}of d)p+=e.n*t.count*2,m+=e.n*(t.count-1)*6;if(!t.closed&&o){if(l.circle){let e=l.pts.length/2;p+=2*(e+1),m+=2*e*3}else for(let e of l)p+=e.positions.length,m+=2*e.indices.length}}}let h=new Pi(`triangles`,p,m),g=new Float64Array(3);for(let e of f){let t=e.count,n=e.length||1,r=(a-1)/n,c=e.N,u=e.B,f=e.T,p=e.pos,m=e.K,_=e.stretch,v=e.arc,y=new Float64Array(t),b=new Float64Array(t),x=new Float64Array(t);for(let e=0;e<t;e++){let t=v[e]/n;y[e]=1+(a-1)*t;let r=i*t;b[e]=Math.cos(r),x[e]=Math.sin(r)}for(let{pts:e,f:n}of d){let i=new Float64Array(t*n.n*3);ka(i,e,n.n,t,y,b,x,c,u,p,m,_),Aa(h,i,n,e,t,v,b,x,c,u,f,r,g)}if(!e.closed){if(!o)s=!0;else for(let[e,n]of[[0,-1],[t-1,1]]){let t=f[e*3]*n,r=f[e*3+1]*n,i=f[e*3+2]*n;if(l.circle){Da(g,0,e,0,0,y,b,x,c,u,p,m,_);let a=h.vertex(g[0],g[1],g[2],t,r,i,.5,.5),o=l.pts.length/2,s=h.vertexCount;for(let n=0;n<o;n++)Da(g,0,e,l.pts[n*2],l.pts[n*2+1],y,b,x,c,u,p,m,_),h.vertex(g[0],g[1],g[2],t,r,i,.5+Math.cos(n/o*ba)/2,.5+Math.sin(n/o*ba)/2);for(let e=0;e<o;e++){let t=s+e,r=s+(e+1)%o;n>0?h.tri(a,t,r):h.tri(a,r,t)}}else for(let a of l){let o=h.vertexCount,s=a.positions;for(let n=0;n<s.length;n+=2)Da(g,0,e,s[n],s[n+1],y,b,x,c,u,p,m,_),h.vertex(g[0],g[1],g[2],t,r,i,s[n],s[n+1]);let l=a.indices;for(let e=0;e<l.length;e+=3)n>0?h.tri(o+l[e],o+l[e+1],o+l[e+2]):h.tri(o+l[e],o+l[e+2],o+l[e+1])}}}}return{mesh:h.build(),doubleSided:s}}var Ma=Math.PI*2;function Na(e){return Math.tan(e)-e}function Pa(e,t,n=6,r=3){let i=_n(e,t,n,r);if(i)return i;let a=e,o=t*Math.PI/180,s=a/2,c=s*Math.cos(o),l=s+1,u=s-1.25,d=Math.PI/(2*a),f=Na(o),p=e=>{let t=Math.acos(Math.min(1,c/e));return d+f-Na(t)};if(p(l)<d*.15){let e=Math.max(c,u),t=l;for(let n=0;n<40;n++){let n=(e+t)/2;p(n)>d*.15?e=n:t=n}l=e}let m=Math.max(c,u),h=[],g=[],_=(e,t,n)=>{h.push(e*Math.cos(t),e*Math.sin(t)),g.push(+!!n)},v=Ma/a;for(let e=0;e<a;e++){let t=e*v,i=t-p(m),a=t+p(m),o=t-v+p(m);for(let e=1;e<r;e++)_(u,o+(i-o)*e/r,!0);_(u,i,!1),u<m-1e-9&&_(m,i,!1);for(let e=1;e<=n;e++){let r=m+(l-m)*e/n;_(r,t-p(r),e<n)}let s=t-p(l),c=t+p(l);for(let e=1;e<r;e++)_(l,s+(c-s)*e/r,!0);for(let e=n;e>=1;e--){let r=m+(l-m)*e/n;_(r,t+p(r),e<n)}u<m-1e-9&&_(m,a,!1),_(u,a,!1)}return{outline:{points:Float64Array.from(h),smooth:Uint8Array.from(g),closed:!0},outerRadius:l,rootRadius:u}}function Fa(e){let t=[,,,,];for(let n=0;n<4;n++)t[n]=e(n);return t}function Ia(e,t,n){return n?[n]:Fa(n=>W(e,n,1,t))}var La=new Map,Ra=null;function za(e,t){La.set(e,t),Ra&&Ra.delete(e)}function Ba(e){return La.has(e)}var Va=null;function Ha(e,t){let n=La.get(e.name);if(!n)return null;Va=Ra&&Ra.has(e.name)?[]:null;try{let r=n(e,t);return r&&Va&&(r.identity=[r.key,...Va].map(e=>`${e.length}:${e}`).join(``)),r}finally{Va=null}}var Ua=(e,t,n,r,i,a)=>({min:[e,t,n],max:[r,i,a]}),Wa=(e,t,n)=>pt(L(),e,t,n);function Ga(e){Va&&Va.push(e);let t=2166136261,n=16777619;for(let r=0;r<e.length;r++){let i=e.charCodeAt(r);t=Math.imul(t^i,16777619),n=Math.imul(n^i,1540483477)}return(t>>>0).toString(36)+(n>>>0).toString(36)+`:`+e.length}function Ka(e){if(Va=null,!e)return``;let t=new Uint32Array(e.buffer,e.byteOffset,e.byteLength>>2),n=2538058380,r=16777619;for(let e=0;e<t.length;e++){let i=Math.imul(t[e],3432918353);i=Math.imul(i<<15|i>>>17,461845907),n^=i,n=Math.imul(n<<13|n>>>19,5)+3864292196|0,r=Math.imul(r^t[e],2246822507),r^=r>>>13}return(n>>>0).toString(36)+(r>>>0).toString(36)+`:`+e.length}function qa(e,t){let n=e.attrIndex&&e.attrIndex[t];return n?n.value.trim():``}function Ja(e){if(e.values.d)return{path:e.values.d,raw:qa(e,`d`),fillRule:F(e,`fillRule`)};let t=e.pathTarget;if(t&&t.values&&t.values.d){let n=e.values.fillRule===void 0?F(t,`fillRule`):e.values.fillRule;return{path:t.values.d,raw:qa(t,`d`),fillRule:n}}return null}function Ya(e){let t=Ve(e);return Math.hypot(t.maxX-t.minX,t.maxY-t.minY)||1}function Xa(e,t,n){return ra(Ya(e),t)/n}function Za(e){let t=!1,n=!1,r=!1;for(let i of e)i.c===`M`?(n&&!r&&(t=!0),n=!0,r=!1):i.c===`Z`&&(r=!0);return n&&!r&&(t=!0),t}function Qa(e,t,n,r){let i=Ur(e.path.segments,{tolerance:Xa(e.path.segments,t,n)});for(let e of i)e.degenerate&&r&&r(`warning`,`W_DEGENERATE_CONTOUR`,`A subpath has fewer than three distinct points and encloses no area.`);let a=Ai(i,e.fillRule);return!a.regions.length&&r&&r(`warning`,`W_EMPTY_FILL`,`The path encloses no area; nothing is filled.`),a}za(`box`,e=>{let t=F(e,`size`),n=F(e,`radius`);if(n>0){let r=e.values.segments;return{key:`rbox:${t.join(`,`)}:${n}:${r||``}`,unit:null,lods:r?1:4,kind:`triangles`,doubleSided:!1,bounds:Ua(-t[0]/2,-t[1]/2,-t[2]/2,t[0]/2,t[1]/2,t[2]/2),lodDeviation:Ia(4,1,r).map(e=>ea(n,e)),generate:(e,i)=>Ri(t[0],t[1],t[2],n,r||W(4,e,i,1))}}return{key:`box`,unit:Wa(t[0],t[1],t[2]),lods:1,kind:`triangles`,doubleSided:!1,bounds:Ua(-.5,-.5,-.5,.5,.5,.5),lodDeviation:[0],generate:()=>Li()}}),za(`sphere`,e=>{let t=F(e,`radius`),n=e.values.segments;return{key:`sphere:${n||``}`,unit:Wa(t,t,t),lods:n?1:4,kind:`triangles`,doubleSided:!1,bounds:Ua(-1,-1,-1,1,1,1),lodDeviation:Ia(48,8,n).map(Yi),generate:(e,t)=>zi(n||W(48,e,t,8))}});function $a(e,t){let n=F(e,`radius`),r=F(e,`height`),i=F(e,`caps`),a=e.values.segments,o=t/n,s=Math.max(1,o);return{key:`cyl:${o}:${i}:${a||``}`,unit:Wa(n,r,n),lods:a?1:4,kind:`triangles`,doubleSided:!i,bounds:Ua(-s,-.5,-s,s,.5,s),lodDeviation:Ia(48,8,a).map(e=>Zi(o,e)),generate:(e,t)=>Bi(o,a||W(48,e,t,8),i)}}za(`cylinder`,e=>{let t=F(e,`radius`);return $a(e,e.values.radiusTop===void 0?t:e.values.radiusTop)}),za(`cone`,e=>$a(e,0)),za(`capsule`,e=>{let t=F(e,`radius`),n=F(e,`height`),r=Math.max(0,n/t-2),i=e.values.segments;return{key:`capsule:${r}:${i||``}`,unit:Wa(t,t,t),lods:i?1:4,kind:`triangles`,doubleSided:!1,bounds:Ua(-1,-(r/2+1),-1,1,r/2+1,1),lodDeviation:Ia(32,8,i).map(Qi),generate:(e,t)=>Vi(r,i||W(32,e,t,8))}}),za(`plane`,e=>{let t=F(e,`size`);return{key:`plane`,unit:Wa(t[0],1,t[1]),lods:1,kind:`triangles`,doubleSided:!0,bounds:Ua(-.5,0,-.5,.5,0,.5),lodDeviation:[0],generate:()=>Hi()}}),za(`torus`,e=>{let t=F(e,`radius`),n=F(e,`tube`),r=F(e,`arc`),i=n/t,a=e.values.segments,o=e.values.tubeSegments;return{key:`torus:${i}:${r}:${a||``}:${o||``}`,unit:Wa(t,t,t),lods:a&&o?1:4,kind:`triangles`,doubleSided:!1,bounds:Ua(-(1+i),-i,-(1+i),1+i,i,1+i),lodDeviation:(a&&o?[0]:Fa(e=>0)).map((e,t)=>$i(i,r,a||W(64,t,1,8),o||W(24,t,1,6))),generate:(e,t)=>Ui(i,r,a||W(64,e,t,8),o||W(24,e,t,6))}});function eo(e,t,n=0){let r=Ua(1/0,1/0,1/0,-1/0,-1/0,-1/0);for(let n=0;n<e.length;n+=t)for(let i=0;i<3;i++){let a=i<t?e[n+i]:0;a<r.min[i]&&(r.min[i]=a),a>r.max[i]&&(r.max[i]=a)}for(let e=0;e<3;e++)r.min[e]-=n,r.max[e]+=n;return r}za(`line`,e=>{let t=e.values.from,n=e.values.to,r=F(e,`radius`);if(r>0){let i=[n[0]-t[0],n[1]-t[1],n[2]-t[2]],a=Math.hypot(i[0],i[1],i[2]),o=[i[0]/a,i[1]/a,i[2]/a],s=Math.abs(o[1])<.99?[0,1,0]:[1,0,0],c=[s[1]*o[2]-s[2]*o[1],s[2]*o[0]-s[0]*o[2],s[0]*o[1]-s[1]*o[0]],l=Math.hypot(...c);c=c.map(e=>e/l);let u=[c[1]*o[2]-c[2]*o[1],c[2]*o[0]-c[0]*o[2],c[0]*o[1]-c[1]*o[0]],d=L();d.set([c[0]*r,c[1]*r,c[2]*r,0,o[0]*a,o[1]*a,o[2]*a,0,u[0]*r,u[1]*r,u[2]*r,0,(t[0]+n[0])/2,(t[1]+n[1])/2,(t[2]+n[2])/2,1]);let f=e.values.segments;return{key:`cyl:1:true:${f||``}`,unit:d,lods:f?1:4,kind:`triangles`,doubleSided:!1,bounds:Ua(-1,-.5,-1,1,.5,1),lodDeviation:Ia(48,8,f).map(e=>Zi(1,e)),generate:(e,t)=>Bi(1,f||W(48,e,t,8),!0)}}return{key:`line:${t.join(`,`)}:${n.join(`,`)}`,unit:null,lods:1,kind:`lines`,doubleSided:!1,bounds:eo([...t,...n],3),lodDeviation:[0],generate:()=>Wi([...t,...n],!1)}}),za(`polyline`,e=>{let t=F(e,`radius`),n=F(e,`closed`),r=F(e,`smooth`),i=e.values.segments,a=e.values.points,o=e.values.d,s=a?`pts:${Ga(qa(e,`points`))}`:`d:${Ga(qa(e,`d`))}`,c=(e,t)=>{if(a){let i=a;return r&&(i=Sa(a,n,W(12,e,t,2))),[{points:i,closed:n}]}let i=Xa(o.segments,e,t);return Ur(o.segments,{tolerance:i}).map(e=>{let t=e.points.length/2,r=new Float64Array(t*3);for(let n=0;n<t;n++)r[n*3]=e.points[n*2],r[n*3+1]=e.points[n*2+1];return{points:r,closed:e.closed||n}})},l;if(a){let e=eo(a,3),n=Math.hypot(e.max[0]-e.min[0],e.max[1]-e.min[1],e.max[2]-e.min[2]);l=eo(a,3,t+(r?.1*n:0))}else{let e=Ve(o.segments);l=Ua(e.minX-t,e.minY-t,-t,e.maxX+t,e.maxY+t,t)}return t>0?{key:`tube:${s}:${t}:${n}:${r}:${i||``}`,unit:null,lods:4,kind:`triangles`,doubleSided:!1,bounds:l,lodDeviation:Fa(e=>(a?Math.hypot(l.max[0]-l.min[0],l.max[1]-l.min[1],l.max[2]-l.min[2])*(r?.05/W(12,e,1,2):0):ra(Ya(o.segments),e))+t*Gi(i||W(24,e,1,6))),generate:(e,n,r)=>ja({kind:`circle`,radius:t,segments:i||W(24,e,n,6)},c(e,n),{caps:!0},r).mesh}:{key:`polyline:${s}:${n}:${r}`,unit:null,lods:r||o?4:1,kind:`lines`,doubleSided:!1,bounds:l,lodDeviation:r||o?Fa(e=>a?Math.hypot(l.max[0]-l.min[0],l.max[1]-l.min[1],l.max[2]-l.min[2])*(r?.05/W(12,e,1,2):0):ra(Ya(o.segments),e)):[0],generate:(e,t)=>{let n=c(e,t);if(n.length===1)return Wi(n[0].points,n[0].closed);let r=n.map(e=>Wi(e.points,e.closed)),i=0,a=0;for(let e of r)i+=e.vertexCount,a+=e.indices.length;let o=new Float32Array(i*3),s=new Uint32Array(a),l=0,u=0;for(let e of r){o.set(e.positions,l*3);for(let t=0;t<e.indices.length;t++)s[u+t]=e.indices[t]+l;l+=e.vertexCount,u+=e.indices.length}return new Mi({positions:o,indices:s,kind:`lines`})}}}),za(`polygon`,e=>{let t=e.values.points,n={points:Float64Array.from(t),smooth:new Uint8Array(t.length/2),closed:!0};return{key:`polygon:${Ga(qa(e,`points`))}`,unit:null,lods:1,kind:`triangles`,doubleSided:!0,bounds:eo(t,2),lodDeviation:[0],generate:(e,t,r)=>da(Ai([n],`nonzero`).regions,r)}}),za(`path`,e=>{let t=Ja(e);if(!t)return null;let n=Ve(t.path.segments);return{key:`path:${Ga(t.raw)}:${t.fillRule}`,unit:null,lods:4,kind:`triangles`,doubleSided:!0,bounds:Ua(n.minX,n.minY,0,n.maxX,n.maxY,0),lodDeviation:Fa(e=>ra(Ya(t.path.segments),e)),generate:(e,n,r)=>da(Qa(t,e,n,r).regions,r)}}),za(`extrude`,e=>{let t=Ja(e);if(!t)return null;let n=F(e,`depth`),r=F(e,`bevel`),i=F(e,`bevelSegments`),a=F(e,`center`),o=Ve(t.path.segments),s=a?-n/2:0;return{key:`extrude:${Ga(t.raw)}:${t.fillRule}:${n}:${r}:${i}:${a}`,unit:null,lods:4,kind:`triangles`,doubleSided:!1,bounds:Ua(o.minX,o.minY,s,o.maxX,o.maxY,s+n),lodDeviation:Fa(e=>ra(Ya(t.path.segments),e)+ia(r,Math.max(1,Math.round(i/(e>=2?2:1))))),generate:(e,o,s)=>ma(Qa(t,e,o,s),{depth:n,bevel:r,bevelSegments:Math.max(1,Math.round(i/(e>=2?2:1))),center:a},s)}}),za(`revolve`,e=>{let t=Ja(e);if(!t)return null;let n=F(e,`angle`),r=e.values.segments,i=Ve(t.path.segments),a=Math.max(Math.abs(i.maxX),Math.abs(i.minX));return{key:`revolve:${Ga(t.raw)}:${n}:${r||``}`,unit:null,lods:4,kind:`triangles`,doubleSided:Za(t.path.segments),bounds:Ua(-a,i.minY,-a,a,i.maxY,a),lodDeviation:Fa(e=>{let i=r||Math.max(3,Math.round(W(48,e,1,8)*Math.min(1,n/360)+ +(n<360)));return ra(Ya(t.path.segments),e)+a*Gi(i)}),generate:(e,i,a)=>{let o=Ur(t.path.segments,{tolerance:Xa(t.path.segments,e,i)}),s=r||Math.max(3,Math.round(W(48,e,i,8)*Math.min(1,n/360)+ +(n<360)));return ga(o,{angle:n,segments:s},a).mesh}}});function to(e){if(e.kind===`helix`)return Ua(-e.radius,Math.min(0,e.pitch*e.turns),-e.radius,e.radius,Math.max(0,e.pitch*e.turns),e.radius);if(e.kind===`points`){let t=eo(e.points,3),n=.15*Math.hypot(t.max[0]-t.min[0],t.max[1]-t.min[1],t.max[2]-t.min[2]);return eo(e.points,3,n)}let t=Ua(1/0,1/0,1/0,-1/0,-1/0,-1/0);for(let n of e.segments){if(n.c===`Z`)continue;let e=[[n.x,n.y,n.z]];n.c===`C`&&e.push([n.x1,n.y1,n.z1],[n.x2,n.y2,n.z2]),n.c===`Q`&&e.push([n.x1,n.y1,n.z1]);for(let n of e)for(let e=0;e<3;e++)t.min[e]=Math.min(t.min[e],n[e]||0),t.max[e]=Math.max(t.max[e],n[e]||0)}return t}za(`sweep`,e=>{let t=e.values.along,n=e.values.radius,r=n===void 0?Ja(e):null;if(n===void 0&&!r)return null;let i=F(e,`smooth`),a=F(e,`twist`),o=F(e,`taper`),s=F(e,`caps`),c=e.values.segments,l=n;if(r){let e=Ve(r.path.segments);l=Math.max(Math.abs(e.minX),Math.abs(e.maxX),Math.abs(e.minY),Math.abs(e.maxY))}let u=to(t),d=l*Math.max(1,o)*1.5,f=t.kind===`helix`||(t.kind===`path`?Za(t.segments):!(t.points.length>6&&t.points[0]===t.points[t.points.length-3]&&t.points[1]===t.points[t.points.length-2]&&t.points[2]===t.points[t.points.length-1])),p=Math.hypot(u.max[0]-u.min[0],u.max[1]-u.min[1],u.max[2]-u.min[2])||1;return{key:`sweep:${r?Ga(r.raw)+`:`+r.fillRule:`r`+n}:${Ga(qa(e,`along`))}:${i}:${a}:${o}:${s}:${c||``}`,unit:null,lods:4,kind:`triangles`,doubleSided:!s&&f,bounds:Ua(u.min[0]-d,u.min[1]-d,u.min[2]-d,u.max[0]+d,u.max[1]+d,u.max[2]+d),lodDeviation:Fa(e=>{let t=r?ra(Ya(r.path.segments),e):(n||0)*Gi(c||W(24,e,1,6));return ra(p,e)+t}),generate:(e,l,u)=>{let d=Ca(t,{tolerance:ra(p,e)/l,segmentsPerTurn:W(48,e,l,8),smooth:i,subdivisions:W(12,e,l,2)});return ja(r?{kind:`shape`,...Qa(r,e,l,u)}:{kind:`circle`,radius:n,segments:c||W(24,e,l,6)},d,{twist:a,taper:o,caps:s},u).mesh}}}),za(`gear`,e=>{let t=F(e,`teeth`),n=F(e,`module`),r=F(e,`pressureAngle`),i=F(e,`depth`)/n,a=F(e,`bore`)/n,o=F(e,`bevel`)/n,s=F(e,`center`),c=t/2+1,l=s?-i/2:0;return{key:`gear:${t}:${r}:${i}:${a}:${o}:${s}`,unit:Wa(n,n,n),lods:4,kind:`triangles`,doubleSided:!1,bounds:Ua(-c,-c,l,c,c,l+i),lodDeviation:Fa(e=>ta(t,W(8,e,1,2))+ia(o,e>=2?1:2)),generate:(e,n,c)=>{let l=W(8,e,n,2),u=W(4,e,n,2),d={...Pa(t,r,l,u).outline,isWall:!0},f=[];if(a>0){let t=Gr(a,W(48,e,n,8)),r=t.points.length/2,i=new Float64Array(t.points.length);for(let e=0;e<r;e++)i[e*2]=t.points[(r-1-e)*2],i[e*2+1]=t.points[(r-1-e)*2+1];f.push({points:i,smooth:t.smooth,closed:!0,isWall:!0})}return ma({regions:[{outer:d,holes:f}],walls:[d,...f]},{depth:i,bevel:o,bevelSegments:e>=2?1:2,center:s},c)}}}),za(`mesh`,e=>{let t=e.values.positions,n=e.values.indices||Uint32Array.from({length:t.length/3},(e,t)=>t),r=e.values.normals,i=e.values.uvs,a=F(e,`smooth`);return{key:`mesh:${Ka(t)}:${Ka(e.values.indices)}:${Ka(r)}:${Ka(i)}:${a}`,unit:null,lods:1,kind:`triangles`,doubleSided:!1,bounds:eo(t,3),lodDeviation:[0],generate:()=>r?new Mi({positions:Float32Array.from(t),normals:Float32Array.from(r),uvs:i?Float32Array.from(i):null,indices:Uint32Array.from(n)}):Fi(t,n,a,i)}}),Ra=new Set(La.keys());var no={color:[.8,.8,.8,1],metallic:0,roughness:.5,opacity:1,emissive:[0,0,0,1],emissiveIntensity:1,map:null,normalMap:null,normalScale:1,occlusionMap:null,occlusionStrength:1,metallicRoughnessMap:null,emissiveMap:null,alphaMode:`auto`,alphaCutoff:.5,uvScale:[1,1],doubleSided:!1,unlit:!1},ro=class{constructor(e,t,n=null){this.index=t,this.name=n,this.params=e,this.baseColor=Ae(e.color),this.baseColorSrgb=e.color,this.metallic=e.metallic,this.roughness=e.roughness,this.opacity=e.opacity*e.color[3];let r=Ae(e.emissive);this.emissive=[r[0]*e.emissiveIntensity,r[1]*e.emissiveIntensity,r[2]*e.emissiveIntensity],this.map=e.map,this.normalMap=e.normalMap,this.normalScale=e.normalScale,this.occlusionMap=e.occlusionMap,this.occlusionStrength=e.occlusionStrength,this.metallicRoughnessMap=e.metallicRoughnessMap,this.emissiveMap=e.emissiveMap,this.alphaCutoff=e.alphaCutoff;let i=e.opacity*e.color[3],a=e.alphaMode||`auto`;this.alphaMode=a===`auto`?i<.999?`blend`:`opaque`:a,this.uvScale=e.uvScale,this.doubleSided=e.doubleSided,this.unlit=e.unlit,this.key=io(e)}get transparent(){return this.alphaMode===`blend`&&this.opacity<.999}};function io(e){return[je(e.color),e.metallic,e.roughness,e.opacity,je(e.emissive),e.emissiveIntensity,e.map?e.map.key:``,e.normalMap?e.normalMap.key:``,e.normalScale,e.occlusionMap?e.occlusionMap.key:``,e.occlusionStrength,e.metallicRoughnessMap?e.metallicRoughnessMap.key:``,e.emissiveMap?e.emissiveMap.key:``,e.alphaMode,e.alphaCutoff,e.uvScale.join(`,`),+!!e.doubleSided,+!!e.unlit].join(`|`)}function ao(e){let t={};for(let n of Object.keys(no)){let r=F(e,n);t[n]=r===void 0?no[n]:r}return t}var oo=class{constructor(){this.list=[],this.byKey=new Map,this.defs=new Map,this.resolved=new Map,this.fast=new Map}define(e,t){this.defs.set(e,t)}intern(e,t){let n=io(e),r=this.byKey.get(n);return r===void 0&&(r=this.list.length,this.list.push(new ro(e,r,t)),this.byKey.set(n,r)),r}resolve(e,t){let n=this.fast.get(e);n===void 0&&(n=new Map,this.fast.set(e,n));let r=n.get(t);return r===void 0&&(r=this.resolveSlow(e,t),n.set(t,r)),r}resolveSlow(e,t){let n=t?je(t):``,r=(e||``)+`|`+n,i=this.resolved.get(r);if(i!==void 0)return i;let a=e&&this.defs.get(e)||no,o=t?{...a,color:t}:a;return i=this.intern(o,e||(t?n:`default`)),this.resolved.set(r,i),i}},so={linear:e=>e,"ease-in":e=>e*e,"ease-out":e=>1-(1-e)*(1-e),"ease-in-out":e=>e<.5?2*e*e:1-2*(1-e)*(1-e)},co=e=>e<0?0:e>1?1:e;function lo(e,t){let n=F(e,`attr`),r=e=>n===`scale`&&e.length===1?[e[0],e[0],e[0]]:e.slice(),i=e.values,a={attr:n,dur:F(e,`dur`)||1,begin:F(e,`begin`),repeat:F(e,`repeat`),alternate:F(e,`alternate`),ease:so[F(e,`easing`)]||so.linear,timeline:F(e,`timeline`),smooth:F(e,`smooth`),from:null,to:null,keys:null,keyTimes:null,path:null};if(i.along)a.path=ho(i.along,a.smooth);else if(i.values){a.keys=i.values.map(r);let e=a.keys.length;a.keyTimes=i.keyTimes&&i.keyTimes.length===e?i.keyTimes.slice():a.keys.map((t,n)=>n/(e-1))}else a.from=i.from===void 0?t[n]:r(i.from),a.to=r(i.to);return a}function uo(e,t,n=0){if(e.timeline===`scroll`)return e.ease(co(n));let r=t-e.begin;if(r<0)return-1;let i=r/e.dur,a;if(i>=e.repeat){let t=Math.ceil(e.repeat)-1;a=e.repeat-t,e.alternate&&t%2==1&&(a=1-a)}else{let t=Math.floor(i);a=i-t,e.alternate&&t%2==1&&(a=1-a)}return e.ease(a)}function fo(e,t,n=0){let r=uo(e,t,n);if(r<0)return null;if(e.path)return go(e.path,r);if(e.keys)return po(e,r);let i=Array(e.from.length);for(let t=0;t<i.length;t++)i[t]=e.from[t]+(e.to[t]-e.from[t])*r;return i}function po(e,t){let n=e.keys,r=e.keyTimes,i=n.length,a=0;for(;a<i-2&&t>=r[a+1];)a++;let o=r[a+1]-r[a],s=o>0?co((t-r[a])/o):1,c=n[a],l=n[a+1];return!e.smooth||i<3?c.map((e,t)=>e+(l[t]-e)*s):mo(a>0?n[a-1]:c.map((e,t)=>2*e-l[t]),c,l,a+2<i?n[a+2]:l.map((e,t)=>2*e-c[t]),s)}function mo(e,t,n,r,i){let a=(e,t)=>{let n=0;for(let r=0;r<e.length;r++)n+=(t[r]-e[r])**2;return Math.max(Math.sqrt(Math.sqrt(n)),1e-9)},o=0+a(e,t),s=o+a(t,n),c=s+a(n,r),l=o+(s-o)*i,u=(e,t,n,r)=>e.map((e,i)=>e+(t[i]-e)*(l-n)/(r-n)),d=u(e,t,0,o),f=u(t,n,o,s),p=u(n,r,s,c);return u(u(d,f,0,s),u(f,p,o,c),o,s)}function ho(e,t){let n=e=>({tolerance:e,segmentsPerTurn:64,smooth:t,subdivisions:24}),r=Ca(e,n(.01));if(e.kind===`path`){let t=0;for(let e of r)for(let n=0;n<e.points.length;n++)t=Math.max(t,Math.abs(e.points[n]));r=Ca(e,n(Math.max(t,1e-6)*1e-4))}let i=[];for(let e of r){for(let t=0;t<e.points.length;t++)i.push(e.points[t]);e.closed&&e.points.length>=3&&i.push(e.points[0],e.points[1],e.points[2])}let a=i.length/3,o=new Float64Array(Math.max(a,1));for(let e=1;e<a;e++)o[e]=o[e-1]+Math.hypot(i[e*3]-i[e*3-3],i[e*3+1]-i[e*3-2],i[e*3+2]-i[e*3-1]);return{points:Float64Array.from(i),lengths:o,total:a?o[a-1]:0}}function go(e,t){let n=e.points,r=e.lengths,i=n.length/3;if(i===0)return[0,0,0];if(i===1||e.total<=0)return[n[0],n[1],n[2]];let a=co(t)*e.total,o=0,s=i-1;for(;s-o>1;){let e=o+s>>1;r[e]<=a?o=e:s=e}let c=r[s]-r[o],l=c>0?(a-r[o])/c:0;return[n[o*3]+(n[s*3]-n[o*3])*l,n[o*3+1]+(n[s*3+1]-n[o*3+1])*l,n[o*3+2]+(n[s*3+2]-n[o*3+2])*l]}var _o=class{constructor(e,t){this.el=e,this.uid=e.uid,this.kind=t,this.local=null,this.visible=!0,this.material=null,this.color=null,this.anims=[],this.children=[],this.geometry=null,this.unit=null,this.target=null,this.count=0,this.step=null,this.params=null,this.scriptLocal=null,this.place=null,this.parent=null}get animated(){return this.anims.length>0}},vo={background:[.09,.1,.12,1],sky:[.8,.86,.95,1],ground:[.25,.22,.2,1],intensity:.5,exposure:1};function yo(e){return dt(e,1e-15)}function bo(e,t,n={}){let r=n.maxInstances||2e6,i=[],a=new oo,o=new Map,s=new Map,c={...vo,explicit:!1},l=!1,u=null,d={time:!1,scroll:!1},f={nodes:0,shapes:0,uses:0,defs:0,lights:0,cameras:0,materials:0},p=(e,t,n,r,a=`reference`)=>{i.push({severity:t,code:n,message:r,element:e,phase:a})},m=e=>{if(!e.unknown){e.name===`material`&&e.values&&e.values.id!==void 0&&(a.define(e.values.id,ao(e)),f.materials++),e.name===`environment`&&!l&&(l=!0,c={background:F(e,`background`),sky:F(e,`sky`),ground:F(e,`ground`),intensity:F(e,`intensity`),exposure:F(e,`exposure`),explicit:!0,uid:e.uid}),e.name===`controls`&&!u&&(u=xo(e)),e.name===`defs`&&(f.defs+=e.children.filter(e=>e.type===`element`).length);for(let t of e.children)t.type===`element`&&m(t)}};m(e.root),t.beginBuild(n.owner);let h=(e,n=0)=>{if(o.has(e))return o.get(e);if(n>64)return p(e,`error`,`E_TOO_DEEP`,`Nesting is deeper than 64. Flatten the tree or shorten the use chain.`),o.set(e,null),null;if(e.unknown||!Se(e.name))return o.set(e,null),null;let r=e.name,a;if(r===`es3d`||r===`v3d`||r===`scene`||r===`group`)a=`group`;else if(r===`use`)a=`use`;else if(r===`repeat`)a=`repeat`;else if(r===`scatter`)a=`scatter`;else if(r===`lod`)a=`lod`;else if(r===`light`)a=`light`;else if(r===`camera`)a=`camera`;else if(Ba(r))a=`shape`;else return o.set(e,null),null;let c=new _o(e,a);o.set(e,c),f.nodes++;let l=e.values||{};if(l.id!==void 0&&s.set(l.id,c),a!==`camera`&&a!==`light`){let e=zt(l);c.local=yo(e)?null:e}c.visible=F(e,`visible`)!==!1,c.collide=l.collide!==!1,c.material=l.material===void 0?null:l.material,c.color=l.color===void 0?null:l.color;let u=F(e,`position`)||[0,0,0];c.base={position:u,rotation:F(e,`rotation`)||[0,0,0],scale:F(e,`scale`)||[1,1,1]},a===`camera`&&(c.base.target=l.target||[u[0],u[1],u[2]-1],c.base.fov=[F(e,`fov`)]);for(let t of e.children){if(t.type!==`element`)continue;if(t.name===`animate`){if(!t.unknown&&t.values&&t.values.attr){let e=lo(t,c.base);c.anims.push(e),d[e.timeline===`scroll`?`scroll`:`time`]=!0}continue}if((r===`es3d`||r===`v3d`)&&(t.name===`defs`||t.name===`title`||t.name===`desc`||t.name===`environment`||t.name===`material`)||t.name===`material`||t.name===`environment`||t.name===`controls`)continue;let e=h(t,n+1);e&&(e.parent=c,c.children.push(e))}switch(a){case`shape`:{f.shapes++;let n=null;try{n=Ha(e,{})}catch(t){p(e,`error`,`E_GEOMETRY`,`Cannot describe <${r}>: ${t.message}`,`geometry`)}n?(c.geometry=t.acquire(n,e),c.unit=n.unit&&!yo(n.unit)?n.unit:null):i.some(t=>t.element===e)||p(e,`error`,`E_GEOMETRY`,`<${r}> has no usable geometry source.`,`geometry`);break}case`use`:f.uses++,e.target&&!e.circular&&(c.target=h(e.target,n+1));break;case`repeat`:c.count=l.count||0,c.step=l.step?l.step.matrix:L();break;case`scatter`:c.params={grid:l.grid||null,count:l.grid?l.grid[0]*l.grid[1]:l.count||0,spacing:F(e,`spacing`),area:l.area||null,radius:l.radius||null,seed:F(e,`seed`),jitter:F(e,`jitter`),randomScale:l.randomScale||null,randomRotation:l.randomRotation||null,randomMaterial:l.randomMaterial||null};break;case`lod`:c.params={distances:l.distances||[]};break;case`light`:{f.lights++;let t=L();l.transform&&t.set(l.transform.matrix),c.params={type:l.type,color:F(e,`color`),intensity:F(e,`intensity`),position:F(e,`position`),rotation:l.rotation||null,direction:l.direction||null,target:l.target||null,range:F(e,`range`),angle:F(e,`angle`),penumbra:F(e,`penumbra`),groundColor:F(e,`groundColor`),transform:l.transform?t:null};break}case`camera`:f.cameras++,c.params={type:F(e,`type`),position:F(e,`position`),target:l.target||null,rotation:l.rotation||null,up:F(e,`up`),fov:F(e,`fov`),height:F(e,`height`),near:l.near||null,far:l.far||null,aspect:F(e,`aspect`),fit:F(e,`fit`),transform:l.transform?l.transform.matrix:null,name:l.name||l.id||`camera ${f.cameras}`}}return c},g=e.root?h(e.root):null;t.endBuild();let _=new Map,v=e=>{if(!e)return 0;if(_.has(e))return _.get(e);_.set(e,0);let t=0,n=()=>e.children.reduce((e,t)=>e+v(t),0);switch(e.kind){case`shape`:t=+!!e.geometry;break;case`use`:t=v(e.target);break;case`repeat`:t=e.count*n();break;case`scatter`:t=e.params.count*n();break;case`light`:case`camera`:t=0;break;default:t=n()}return e.visible||(t=0),_.set(e,t),t},y=v(g);return f.expandedInstances=y,y>r&&p(e.root,`error`,`E_TOO_MANY_INSTANCES`,`The scene expands to ${y.toLocaleString(`en-US`)} instances, more than the limit of ${r.toLocaleString(`en-US`)}. Reduce repeat or scatter counts.`,`render`),{doc:e,root:g,materials:a,environment:c,controls:u,animation:d,cache:t,diagnostics:i,stats:f,tooLarge:y>r,expanded:y,byId:s}}function xo(e){let t=e.values||{};return{mode:F(e,`mode`),zoom:F(e,`zoom`),pan:F(e,`pan`),minDistance:t.minDistance??null,maxDistance:t.maxDistance??null,minPolar:F(e,`minPolar`),maxPolar:F(e,`maxPolar`),targetMin:t.targetMin&&t.targetMax?t.targetMin:null,targetMax:t.targetMin&&t.targetMax?t.targetMax:null,collide:F(e,`collide`),uid:e.uid}}function So(e){let t=e>>>0;return function(){t=t+1831565813>>>0;let e=t;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}}function Co(e,t,n){let r=Math.imul(e|0,668265261)^Math.imul(t|0,374761393)^Math.imul(n|0,2654435769);return r=Math.imul(r^r>>>15,2246822507),r=Math.imul(r^r>>>13,3266489909),((r^r>>>16)>>>0)/4294967296}var wo=1,To=2,Eo=class{constructor(e=256){this.count=0,this.capacity=0,this.geometries=[],this.geomIndex=new Map,this.materials=[],this.lights=[],this.cameras=[],this.lodSwitches=[],this.environment=null,this.controls=null,this.animation={time:!1,scroll:!1},this.dynamic=[],this.bounds={min:[1/0,1/0,1/0],max:[-1/0,-1/0,-1/0]},this.version=0,this.templates=new Map,this.alloc(e)}alloc(e){let t=(t,n,r)=>{let i=new t(e*r);return n&&i.set(n.subarray(0,Math.min(n.length,i.length))),i};this.matrices=t(Float32Array,this.matrices,16),this.geom=t(Uint32Array,this.geom,1),this.mat=t(Uint32Array,this.mat,1),this.uid=t(Uint32Array,this.uid,1),this.lodNode=t(Int32Array,this.lodNode,1),this.lodChild=t(Uint16Array,this.lodChild,1),this.flags=t(Uint8Array,this.flags,1),this.spheres=t(Float32Array,this.spheres,4),this.capacity=e}geometryIndex(e){let t=this.geomIndex.get(e);return t===void 0&&(t=this.geometries.length,this.geometries.push(e),this.geomIndex.set(e,t)),t}setInstance(e,t,n,r,i,a,o,s=0){e>=this.capacity&&this.alloc(Math.max(this.capacity*2,e+1));let c=this.matrices,l=e*16;for(let e=0;e<16;e++)c[l+e]=r[e];this.geom[e]=t,this.mat[e]=n,this.uid[e]=i,this.lodNode[e]=a,this.lodChild[e]=o;let u=St(r);this.flags[e]=+(u<0)|s;let d=this.geometries[t].bounds,f=0,p=0,m=0,h=0;if(d){let e=(d.min[0]+d.max[0])/2,t=(d.min[1]+d.max[1])/2,n=(d.min[2]+d.max[2])/2;f=r[0]*e+r[4]*t+r[8]*n+r[12],p=r[1]*e+r[5]*t+r[9]*n+r[13],m=r[2]*e+r[6]*t+r[10]*n+r[14];let i=(d.max[0]-d.min[0])/2,a=(d.max[1]-d.min[1])/2,o=(d.max[2]-d.min[2])/2,s=Math.abs(r[0])*i+Math.abs(r[4])*a+Math.abs(r[8])*o,c=Math.abs(r[1])*i+Math.abs(r[5])*a+Math.abs(r[9])*o,l=Math.abs(r[2])*i+Math.abs(r[6])*a+Math.abs(r[10])*o;h=Math.sqrt(s*s+c*c+l*l);let u=this.bounds;f-s<u.min[0]&&(u.min[0]=f-s),p-c<u.min[1]&&(u.min[1]=p-c),m-l<u.min[2]&&(u.min[2]=m-l),f+s>u.max[0]&&(u.max[0]=f+s),p+c>u.max[1]&&(u.max[1]=p+c),m+l>u.max[2]&&(u.max[2]=m+l)}let g=this.spheres;g[e*4]=f,g[e*4+1]=p,g[e*4+2]=m,g[e*4+3]=h}reserve(e){let t=this.capacity;for(;t<e;)t=Math.max(t*2,t+1);t!==this.capacity&&this.alloc(t)}trim(){this.capacity>this.count*2+64&&this.alloc(Math.max(this.count,1))}get empty(){return this.count===0}},Do=L(),Oo=class{constructor(e,t,n,r=0){this.scene=e,this.graph=t,this.time=n,this.progress=r,this.noCollide=0,this.cursor=0,this.lightCursor=0,this.cameraCursor=0,this.switchCursor=0,this.overwrite=!1,this.stack=[],this.tmp=L(),this.segmentDepth=0}mat(e){for(;this.stack.length<=e;)this.stack.push(new Float64Array(16));return this.stack[e]}notePlace(e,t,n,r,i,a,o){if(e.place===`many`)return;if(e.place){e.place=`many`;return}let s=new Float64Array(16);s.set(t),e.place={parent:s,material:n,color:r,sel:i,lodNode:a,lodChild:o,noCollide:this.noCollide,rowStart:this.cursor,lightStart:this.lightCursor,cameraStart:this.cameraCursor,switchStart:this.switchCursor}}localOf(e,t){if(!e.anims.length)return e.local?t.set(e.local):ut(t),t;let n={};for(let t of e.anims){let e=fo(t,this.time,this.progress);e&&(n[t.attr]=e)}return zt(e.el.values,t,n)}walk(e,t,n,r,i,a,o,s){if(!e||!e.visible)return;this.overwrite||this.notePlace(e,t,n,r,i,a,o);let c=e.anims.length>0&&this.segmentDepth===0&&!this.overwrite,l=null;c&&(l={node:e,parent:new Float64Array(t),material:n,color:r,sel:i,lodNode:a,lodChild:o,noCollide:this.noCollide,start:this.cursor,end:0,lightStart:this.lightCursor,cameraStart:this.cameraCursor,switchStart:this.switchCursor}),e.anims.length&&this.segmentDepth++,e.collide===!1&&this.noCollide++;let u=n,d=r;if(e.material!==null&&(u=e.material,d=null),e.color!==null&&(d=e.color),e.kind===`light`)this.emitLight(e,t);else if(e.kind===`camera`)this.emitCamera(e,t);else{let n,r=e.scriptLocal;if(!r&&!e.local&&!e.anims.length)n=t;else{n=this.mat(s);let i=r||(e.anims.length?this.localOf(e,this.tmp):e.local);R(n,t,i)}switch(e.kind){case`shape`:this.emitShape(e,n,u,d,i===0?e.uid:i,a,o,s);break;case`group`:for(let t of e.children)this.walk(t,n,u,d,i,a,o,s+1);break;case`use`:e.target&&this.walk(e.target,n,u,d,i===0?e.uid:i,a,o,s+1);for(let t of e.children)this.walk(t,n,u,d,i,a,o,s+1);break;case`repeat`:this.emitRepeat(e,n,u,d,i,a,o,s);break;case`scatter`:this.emitScatter(e,n,u,d,i,a,o,s);break;case`lod`:this.emitLod(e,n,u,d,i,a,o,s)}}e.anims.length&&this.segmentDepth--,e.collide===!1&&this.noCollide--,l&&(l.end=this.cursor,l.lightEnd=this.lightCursor,l.cameraEnd=this.cameraCursor,l.switchEnd=this.switchCursor,this.scene.dynamic.push(l)),!this.overwrite&&e.place&&e.place!==`many`&&(e.place.rowEnd=this.cursor,e.place.lightEnd=this.lightCursor,e.place.cameraEnd=this.cameraCursor,e.place.switchEnd=this.switchCursor)}emitShape(e,t,n,r,i,a,o,s){if(!e.geometry)return;let c=this.scene,l=t;e.unit&&(l=this.mat(s+1),R(l,t,e.unit));let u=c.geometryIndex(e.geometry),d=this.graph.materials.resolve(n,r);c.setInstance(this.cursor++,u,d,l,i,a,o,this.noCollide?2:0)}emitRepeat(e,t,n,r,i,a,o,s){if(this.expand(e,e.count,t,n,r,i,a,o))return;let c=L(),l=L(),u=this.mat(s+1);for(let d=0;d<e.count;d++){R(u,t,c);for(let t of e.children)this.walk(t,u,n,r,i,a,o,s+2);R(l,c,e.step),c.set(l)}}emitScatter(e,t,n,r,i,a,o,s){let c=e.params;if(this.expand(e,c.count,t,n,r,i,a,o))return;let l=So(c.seed),u=L(),d=new Float64Array(9),f=(e,t)=>e[0]+(e[1]-e[0])*t,p=c.grid?c.grid[0]:0,m=c.grid?c.grid[1]:0,h=new Float64Array(16),g=[0,0,0],_=[0,0,0],v=[1,1,1];for(let y=0;y<c.count;y++){for(let e=0;e<9;e++)d[e]=l();if(c.grid){let e=y%p,t=Math.floor(y/p);g[0]=(e-(p-1)/2)*c.spacing[0]+(d[0]-.5)*c.jitter*c.spacing[0],g[2]=(t-(m-1)/2)*c.spacing[1]+(d[1]-.5)*c.jitter*c.spacing[1]}else if(c.radius){let e=c.radius*Math.sqrt(d[0]),t=d[1]*Math.PI*2;g[0]=e*st(t),g[2]=e*ot(t)}else g[0]=(d[0]-.5)*c.area[0],g[2]=(d[1]-.5)*c.area[1];if(c.randomRotation){let e=c.randomRotation.ranges;_[0]=f(e[0],d[2]),_[1]=f(e[1],d[3]),_[2]=f(e[2],d[4])}if(c.randomScale){let e=c.randomScale.ranges;c.randomScale.uniform?v[0]=v[1]=v[2]=f(e[0],d[5]):(v[0]=f(e[0],d[5]),v[1]=f(e[1],d[6]),v[2]=f(e[2],d[7]))}bt(u,g,_,v),R(h,t,u);let b=n,x=r;c.randomMaterial&&(b=c.randomMaterial[Math.min(c.randomMaterial.length-1,Math.floor(d[8]*c.randomMaterial.length))],x=null);for(let t of e.children)this.walk(t,h,b,x,i,a,o,s+1)}}expand(e,t,n,r,i,a,o,s){if(!Qt()||!Number.isInteger(t)||t<1)return!1;let c=this.template(e,a,s);if(!c||c.rows.length*t<ko)return!1;let l=e.kind===`scatter`,u=e.params,d=new Int32Array(vn.SIZE),f=new Float64Array(yn.SIZE);if(l&&!Wo(u,d,f))return!1;let p=this.scene,m=c.rows.length,h=c.lods.length;c.geometries||(c.geometries=!0,c.rows.forEach((e,t)=>{let n=e.entry.bounds;if(c.table.set([p.geometryIndex(e.entry),e.uid,e.lod,e.child,e.flags,+!!n],t*6),n){let e=[(n.max[0]-n.min[0])/2,(n.max[1]-n.min[1])/2,(n.max[2]-n.min[2])/2];c.bounds.set([(n.min[0]+n.max[0])/2,(n.min[1]+n.max[1])/2,(n.min[2]+n.max[2])/2,...e],t*6)}})),d[vn.KIND]=l?Lo:Io,d[vn.NOPS]=c.ops.length,d[vn.NROWS]=m,d[vn.LODS]=h,d[vn.OUTER_LOD]=o,d[vn.SLOTS]=c.slots,f.set(n,yn.WORLD),l||(f.set(Do,yn.ACC),f.set(e.step,yn.STEP));let g=p.bounds;f.set(g.min,yn.BOUNDS),f.set(g.max,yn.BOUNDS+3);let _=l&&u.randomMaterial,v=new Int32Array(m*(_?_.length:1)).fill(-1),y=e=>{let t=Math.floor(e/m),n=c.rows[e-t*m],a=_?_[t]:r,o=_?null:i;return this.graph.materials.resolve(n.material===Uo?a:n.material,n.color===Uo?o:n.color)},b=Math.max(1,Math.floor(Ao/m)),x=this.cursor,S=this.switchCursor;for(let e=0;e<t;e+=b){d[vn.FIRST]=e,d[vn.COUNT]=Math.min(b,t-e),d[vn.SWITCH]=S;let n=bn(d,f,c,v,y);if(!n){if(e>0)throw Error(`WebAssembly memory ran out while expanding instances`);return!1}let r=n.mat.length;p.reserve(x+r),p.matrices.set(n.matrices,x*16),p.spheres.set(n.spheres,x*4),p.geom.set(n.geom,x),p.mat.set(n.mat,x),p.uid.set(n.uid,x),p.lodNode.set(n.lodNode,x),p.lodChild.set(n.lodChild,x),p.flags.set(n.flags,x);let i=n.switches;for(let e=0;e<i.length/4;e++){let t=c.lods[e%h],n=Math.cbrt(Math.abs(i[e*4+3])||1);p.lodSwitches[S+e]={pos:[i[e*4],i[e*4+1],i[e*4+2]],distances:t.distances.map(e=>e*n),parent:t.ref>=0?S+e-e%h+t.ref:o,parentChild:t.child}}x+=r,S+=i.length/4}for(let e=0;e<3;e++)g.min[e]=f[yn.BOUNDS+e],g.max[e]=f[yn.BOUNDS+3+e];return this.cursor=x,this.switchCursor=S,Xo(e),!0}template(e,t,n){let r=this.noCollide>0,i=this.scene.templates.get(e);return i&&i.sel===t&&i.lodChild===n&&i.noCollide===r||(i={sel:t,lodChild:n,noCollide:r,template:Go(e.children,t,n,r)},this.scene.templates.set(e,i)),i.template}emitLod(e,t,n,r,i,a,o,s){let c=this.scene,l={pos:[t[12],t[13],t[14]],distances:e.params.distances.map(e=>e*Math.cbrt(Math.abs(St(t))||1)),parent:a,parentChild:o},u=this.switchCursor++;c.lodSwitches[u]=l,e.children.forEach((e,a)=>this.walk(e,t,n,r,i,u,a,s+1))}emitLight(e,t){let n=e.params,r=L();r.set(t),n.transform&&R(r,r,n.transform);let i=e.anims.length?Jo(e,this,`position`,n.position):n.position,a=e.anims.length?Jo(e,this,`rotation`,n.rotation||[0,0,0]):n.rotation,o=L();bt(o,i,a||[0,0,0],[1,1,1]),R(o,r,o);let s=[o[12],o[13],o[14]],c=n.direction,l=o;if(!c&&n.target){let e=[0,0,0];Ct(e,r,n.target[0],n.target[1],n.target[2]),c=[e[0]-s[0],e[1]-s[1],e[2]-s[2]],l=Do}c||=[0,-1,0];let u=[0,0,0];wt(u,l,c[0],c[1],c[2]);let d=Math.hypot(u[0],u[1],u[2])||1,f=Ae(n.color),p={type:n.type,color:[f[0]*n.intensity,f[1]*n.intensity,f[2]*n.intensity],position:s,direction:[u[0]/d,u[1]/d,u[2]/d],range:n.range,outer:Math.cos(n.angle/2*Math.PI/180),inner:Math.cos(n.angle/2*(1-n.penumbra)*Math.PI/180),ground:Ae(n.groundColor).map(e=>e*n.intensity),uid:e.uid};this.scene.lights[this.lightCursor++]=p}emitCamera(e,t){let n=e.params,r=L();r.set(t),n.transform&&R(r,r,n.transform);let i=e.anims.length>0,a=i?Jo(e,this,`position`,n.position):n.position,o=[0,0,0];Ct(o,r,a[0],a[1],a[2]);let s,c=[0,0,0],l=i?Jo(e,this,`target`,n.target):n.target;if(l)s=[0,0,0],Ct(s,r,l[0],l[1],l[2]),wt(c,r,n.up[0],n.up[1],n.up[2]);else{let t=L(),a=i?Jo(e,this,`rotation`,n.rotation||[0,0,0]):n.rotation||[0,0,0];_t(t,a[0],a[1],a[2]),R(t,r,t);let l=[0,0,0];wt(l,t,0,0,-1),s=[o[0]+l[0],o[1]+l[1],o[2]+l[2]],wt(c,t,n.up[0],n.up[1],n.up[2])}this.scene.cameras[this.cameraCursor++]={type:n.type,position:o,target:s,up:c.map(e=>e/(Math.hypot(c[0],c[1],c[2])||1)),fov:i?Jo(e,this,`fov`,[n.fov])[0]:n.fov,height:n.height,near:n.near,far:n.far,aspect:n.aspect,fit:n.fit,name:n.name,uid:e.uid}}};Oo.shapeKeeper=new Oo(null,null,.5,.5);var ko=16,Ao=16384,jo=4096,Mo=4*jo,No=0,Po=1,Fo=2,Io=0,Lo=1,Ro=0,zo=1,Bo=2,Vo=1,Ho=2,Uo=Symbol(`inherit`);function Wo(e,t,n){if(t[vn.STATE]=e.seed>>>0,e.grid){let[r,i]=e.grid;if(!Number.isInteger(r)||!Number.isInteger(i)||r<1||!e.spacing)return!1;t[vn.MODE]=Ro,t[vn.NX]=r,t[vn.NZ]=i,n[yn.SPACING]=e.spacing[0],n[yn.SPACING+1]=e.spacing[1],n[yn.JITTER]=e.jitter}else if(e.radius)t[vn.MODE]=zo,n[yn.RADIUS]=e.radius;else{if(!e.area)return!1;t[vn.MODE]=Bo,n[yn.AREA]=e.area[0],n[yn.AREA+1]=e.area[1]}let r=(e,t)=>{for(let r=0;r<e.length;r++)n.set(e[r],t+r*2)};if(e.randomRotation){if(e.randomRotation.ranges.length!==3)return!1;t[vn.RANDOM]|=Vo,r(e.randomRotation.ranges,yn.ROTATION)}if(e.randomScale){let n=e.randomScale;if(n.ranges.length<(n.uniform?1:3))return!1;t[vn.RANDOM]|=n.uniform?6:Ho,r(n.uniform?n.ranges.slice(0,1):n.ranges.slice(0,3),yn.SCALE)}return t[vn.CHOICES]=e.randomMaterial?e.randomMaterial.length:0,!0}function Go(e,t,n,r){let i={ops:[],matrices:[],index:new Map,slots:1,rows:[],lods:[],geometries:!1};for(let a of e)if(!qo(i,a,0,Uo,Uo,t,-1,n,r))return null;return i.ops=Int32Array.from(i.ops),i.mats=new Float64Array(Math.max(1,i.matrices.length)*16),i.matrices.forEach((e,t)=>i.mats.set(e,t*16)),i.table=new Int32Array(i.rows.length*6),i.bounds=new Float64Array(Math.max(1,i.rows.length*6)),i}function Ko(e,t,n){let r=e.index.get(n);r===void 0&&(r=e.matrices.length,e.matrices.push(n),e.index.set(n,r));let i=e.slots++;return e.ops.push(No,i,t,r),i}function qo(e,t,n,r,i,a,o,s,c){if(!t||!t.visible)return!0;let l=t.kind;if(t.anims.length||l===`light`||l===`camera`||l===`scatter`||e.rows.length>jo||e.slots>Mo)return!1;t.collide===!1&&(c=!0);let u=r,d=i;t.material!==null&&(u=t.material,d=null),t.color!==null&&(d=t.color);let f=t.local?Ko(e,n,t.local):n,p=t=>qo(e,t,f,u,d,a,o,s,c);switch(l){case`shape`:if(t.geometry){let n=t.unit?Ko(e,f,t.unit):f;e.ops.push(Po,e.rows.length,n,0),e.rows.push({entry:t.geometry,uid:a===0?t.uid:a,lod:o,child:s,flags:c?2:0,material:u,color:d})}return!0;case`group`:return t.children.every(p);case`use`:return t.target&&!qo(e,t.target,f,u,d,a===0?t.uid:a,o,s,c)?!1:t.children.every(p);case`repeat`:{let n=L(),r=L();for(let i=0;i<t.count;i++){if(e.slots>Mo)return!1;let i=Ko(e,f,new Float64Array(n));if(!t.children.every(t=>qo(e,t,i,u,d,a,o,s,c)))return!1;R(r,n,t.step),n.set(r)}return!0}case`lod`:{let n=e.lods.length;return e.lods.push({ref:o,child:s,distances:t.params.distances}),e.ops.push(Fo,n,f,0),t.children.every((t,r)=>qo(e,t,f,u,d,a,n,r,c))}default:return!0}}function Jo(e,t,n,r){let i=r;for(let r of e.anims){if(r.attr!==n)continue;let e=fo(r,t.time,t.progress);e&&(i=e)}return i}function Yo(e,t={}){let n=new Eo(Math.min(Math.max(64,e.expanded||64),1<<20));if(n.environment=e.environment,n.controls=e.controls||null,e.animation&&(n.animation={...e.animation}),e.tooLarge||!e.root)return n.materials=e.materials.list,n;let r=new Oo(n,e,t.time||0,t.progress||0);return r.walk(e.root,Do,null,null,0,-1,0,0),n.count=r.cursor,n.lights.length=r.lightCursor,n.cameras.length=r.cameraCursor,n.lodSwitches.length=r.switchCursor,n.materials=e.materials.list,n.trim(),n.bounds.min[0]<=n.bounds.max[0]||(n.bounds={min:[-1,-1,-1],max:[1,1,1]}),n.version++,n}function Xo(e){let t=e=>{if(e&&e.place!==`many`&&(e.place=`many`,e.target&&t(e.target),e.children))for(let n of e.children)t(n)};if(e.target&&t(e.target),e.children)for(let n of e.children)t(n)}function Zo(e,t){for(let n of e.dynamic)for(let e=t;e;e=e.parent)if(e===n.node)return n;return null}function Qo(e){if(!e||e.length<16)return!1;for(let t=0;t<16;t++)if(!Number.isFinite(+e[t]))return!1;return!0}function $o(e,t){let n=e.scriptLocal;n||=e.scriptLocal=new Float64Array(16);for(let e=0;e<16;e++)n[e]=+t[e]}function es(e,t){for(let n=e;n;n=n.parent)if(n===t)return!0;return!1}function ts(e){for(let t=e[0];t;t=t.parent)if(e.every(e=>e===t||es(e,t)))return t;return null}function ns(e,t){if(e.length<=1)return e.slice();let n=ts(e);if(n&&n!==t&&n.place&&n.place!==`many`)return[n];let r=new Map;for(let n of e){let e=n;for(let r=n.parent;r&&r!==t&&r.place&&r.place!==`many`;r=r.parent)e=r;let i=r.get(e);i||r.set(e,i=[]),i.push(n)}let i=[];for(let[n,a]of r)if(a.length>1&&n.place&&n.place!==`many`&&n!==t)i.push(n);else if(a.length===e.length)for(let e of a)i.push(e);else i.push(...ns(a,t));return i}function rs(e,t,n,r,i,a,o,s,c,l,u,d,f){e.cursor=t,e.lightCursor=n,e.cameraCursor=r,e.switchCursor=i,e.segmentDepth=0,e.noCollide=a,e.walk(o,s,c,l,u,d,f,0)}function is(e,t,n,r,i=0,a=0){let o=n||[],s=Array(o.length),c=[],l=new Set;for(let n=0;n<o.length;n++){let i=o[n],a=r&&r[n];!e||!t||!i||!i.place||i.place===`many`||!Qo(a)?s[n]=!1:($o(i,a),s[n]=!0,l.has(i)||(l.add(i),c.push(i)))}if(!c.length)return s;let u=[],d=[],f=new Set;for(let t of c){let n=Zo(e,t);n?f.has(n)||(f.add(n),u.push(n)):d.push(t)}let p=ns(d,t.root),m=new Oo(e,t,i,a);m.overwrite=!0;for(let e of p){let t=e.place;rs(m,t.rowStart,t.lightStart,t.cameraStart,t.switchStart,t.noCollide,e,t.parent,t.material,t.color,t.sel,t.lodNode,t.lodChild)}for(let e of u)p.some(t=>es(e.node,t))||rs(m,e.start,e.lightStart,e.cameraStart,e.switchStart,e.noCollide,e.node,e.parent,e.material,e.color,e.sel,e.lodNode,e.lodChild);return e.version++,s}function as(e,t,n,r,i=0,a=0){return is(e,t,[n],[r],i,a)[0]===!0}function os(e,t,n,r=0){if(!e.dynamic.length)return!1;let i=new Oo(e,t,n,r);i.overwrite=!0;for(let t of e.dynamic)i.cursor=t.start,i.lightCursor=t.lightStart,i.cameraCursor=t.cameraStart,i.switchCursor=t.switchStart,i.segmentDepth=0,i.noCollide=t.noCollide,i.walk(t.node,t.parent,t.material,t.color,t.sel,t.lodNode,t.lodChild,0);return e.version++,!0}var ss=1,cs=class{constructor(e,t){this.id=ss++,this.key=e.key,this.identity=e.identity||null,this.desc=e,this.kind=e.kind,this.lods=e.lods,this.doubleSided=e.doubleSided,this.bounds=e.bounds,this.lodDeviation=e.lodDeviation||[0],this.meshes=Array(e.lods).fill(null),this.reports=Array(e.lods).fill(null),this.owner=t,this.owners=new Set,this.epoch=0,this.useCount=0,this.failed=!1,this.failedLods=0}},ls=`document`,us=class{constructor(){this.entries=new Map,this.held=new Map,this.building=null,this.buildSet=null,this.onGenerate=null,this.quality=1,this.epoch=0,this.version=0,this.stats={generated:0,generateMs:0,triangles:0,restored:0},this.diagnostics=[],this.onDiagnostic=null}beginBuild(e=ls){if(this.epoch++,this.building=e,this.buildSet=new Set,e===`document`)for(let e of this.entries.values())e.useCount=0}acquire(e,t){let n=this.entries.get(e.key);return n?n.epoch!==this.epoch&&!this.heldByOthers(n)&&(n.desc=e,n.identity=e.identity||null,n.owner=t,n.bounds=e.bounds,n.doubleSided=e.doubleSided):(n=new cs(e,t),this.entries.set(e.key,n)),n.epoch=this.epoch,n.useCount++,this.buildSet&&this.buildSet.add(n),n}heldByOthers(e){for(let t of e.owners)if(t!==this.building)return!0;return!1}endBuild(){let e=this.building===null?ls:this.building,t=this.buildSet||new Set,n=this.held.get(e);this.held.set(e,t);for(let n of t)n.owners.add(e);let r=[];if(n)for(let i of n)t.has(i)||(i.owners.delete(e),r.push(i));if(this.building=null,this.buildSet=null,e===`document`)return this.evictUnheld();let i=[];for(let e of r)e.owners.size===0&&this.entries.get(e.key)===e&&(this.entries.delete(e.key),i.push(e));return i}release(e){let t=this.held.get(e);if(!t)return[];this.held.delete(e);for(let n of t)n.owners.delete(e);let n=[];for(let e of t)e.owners.size===0&&this.entries.get(e.key)===e&&(this.entries.delete(e.key),n.push(e));return n}owned(e=ls){return this.held.get(e)||new Set}evictUnheld(){let e=[];for(let[t,n]of this.entries)n.owners.size===0&&(this.entries.delete(t),e.push(n));return e}setQuality(e){if(e!==this.quality){this.quality=e;for(let e of this.entries.values())e.meshes.fill(null),e.reports.fill(null),e.failedLods=0;this.version++}}mesh(e,t=0){let n=Math.min(Math.max(t,0),e.lods-1),r=e.meshes[n];if(r)return r;let i=typeof performance<`u`?performance.now():Date.now(),a=[],o=(t,n,r)=>{a.push({severity:t,code:n,message:r}),this.emit(e,t,n,r)};try{r=e.desc.generate(n,this.quality,o)}catch(e){o(`error`,`E_GEOMETRY`,`Geometry generation failed: ${e&&e.message?e.message:e}`),r=null}r||=(e.failed=!0,e.failedLods|=1<<n,ds(e.kind));let s=typeof performance<`u`?performance.now():Date.now();return this.stats.generated++,this.stats.generateMs+=s-i,e.meshes[n]=r,e.reports[n]=a.length?a:null,this.onGenerate&&this.onGenerate(e),r}emit(e,t,n,r){let i={severity:t,code:n,message:r,element:e.owner,phase:`geometry`};this.diagnostics.push(i),this.onDiagnostic&&this.onDiagnostic(i)}adopt(e,t,n,r=null){if(t<0||t>=e.lods||e.meshes[t])return!1;if(e.meshes[t]=n,e.reports[t]=r&&r.length?r:null,r)for(let t of r)this.emit(e,t.severity,t.code,t.message);return this.stats.restored++,!0}generateAll(e=0){for(let t of this.entries.values())for(let n=0;n<=Math.min(e,t.lods-1);n++)this.mesh(t,n)}takeDiagnostics(){let e=this.diagnostics;return this.diagnostics=[],e}};function ds(e){return new Mi({positions:new Float32Array,indices:new Uint32Array,kind:e})}var fs=()=>typeof performance<`u`?performance.now():Date.now();function ps(e,t){let n=t.element,r=new u({severity:t.severity,phase:t.phase||`geometry`,code:t.code,message:n?`<${n.name}${n.values&&n.values.id?` id="${n.values.id}"`:``}>: ${t.message}`:t.message,offset:n&&n.nameStart>=0?n.nameStart:-1,length:n&&n.nameStart>=0?n.nameEnd-n.nameStart:0,uid:n?n.uid:0});return r.locate(e&&e.lineIndex),r}function ms(e,t={}){let n=fs(),r=ir(e),i=fs(),a={parse:i-n,build:0,flatten:0};if(!r.ok)return{ok:!1,doc:r,graph:null,scene:null,cache:t.cache||null,diagnostics:r.diagnostics,timings:a};let o=t.cache||new us,s=bo(r,o,t),c=fs(),l=Yo(s,{time:t.time||0,progress:t.progress||0}),u=fs();a.build=c-i,a.flatten=u-c;let d=s.diagnostics.map(e=>ps(r,e)),f=[...r.diagnostics,...d];return{ok:!f.some(e=>e.severity===`error`),doc:r,graph:s,scene:l,cache:o,diagnostics:f,timings:a}}function hs(e,t=0){let n=fs(),{scene:r,cache:i}=e,a=0,o=0;for(let e of r.geometries){let n=i.mesh(e,t);o+=n.vertexCount,a+=n.kind===`triangles`?n.primitiveCount:0}return{ms:fs()-n,uniqueVertices:o,uniqueTriangles:a}}var gs=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),_s=new Uint32Array(64),vs=new TextEncoder;function ys(e){let t=typeof e==`string`?vs.encode(e):e instanceof Uint8Array?e:new Uint8Array(e.buffer||e,e.byteOffset||0,e.byteLength),n=t.length,r=n+9+63&-64,i=new Uint8Array(r);i.set(t),i[n]=128;let a=new DataView(i.buffer);a.setUint32(r-8,Math.floor(n/536870912),!1),a.setUint32(r-4,n<<3>>>0,!1);let o=1779033703,s=3144134277,c=1013904242,l=2773480762,u=1359893119,d=2600822924,f=528734635,p=1541459225;for(let e=0;e<r;e+=64){for(let t=0;t<16;t++)_s[t]=a.getUint32(e+t*4,!1);for(let e=16;e<64;e++){let t=_s[e-15],n=_s[e-2],r=(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3,i=(n>>>17|n<<15)^(n>>>19|n<<13)^n>>>10;_s[e]=_s[e-16]+r+_s[e-7]+i|0}let t=o,n=s,r=c,i=l,m=u,h=d,g=f,_=p;for(let e=0;e<64;e++){let a=(m>>>6|m<<26)^(m>>>11|m<<21)^(m>>>25|m<<7),o=_+a+(m&h^~m&g)+gs[e]+_s[e]|0,s=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+(t&n^t&r^n&r)|0;_=g,g=h,h=m,m=i+o|0,i=r,r=n,n=t,t=o+s|0}o=o+t|0,s=s+n|0,c=c+r|0,l=l+i|0,u=u+m|0,d=d+h|0,f=f+g|0,p=p+_|0}let m=``;for(let e of[o,s,c,l,u,d,f,p])m+=(e>>>0).toString(16).padStart(8,`0`);return m}var bs=1194545989,xs=new Uint8Array(new Uint16Array([1]).buffer)[0]===1,Ss=new TextEncoder,Cs=new TextDecoder,ws=e=>e+3&-4;function Ts(e,t){let n=[],r=0,i={key:e,entries:[]};for(let e of t){let t=[];for(let{lod:i,mesh:a,reports:o}of e){let e=a.positions.length/3,s=a.indices.length,c=e<=65536?2:4;t.push({lod:i,kind:a.kind,v:e,i:s,w:c,at:r,reports:o?o.map(e=>[e.severity,e.code,e.message]):[]}),n.push({mesh:a,at:r,w:c}),r+=e*32+ws(s*c)}i.entries.push(t)}let a=Ss.encode(JSON.stringify(i)),o=12+ws(a.length),s=new ArrayBuffer(o+r),c=new Uint8Array(s),l=new DataView(s);l.setUint32(0,bs,!0),l.setUint32(4,1,!0),l.setUint32(8,o-12,!0),c.set(a,12),c.fill(32,12+a.length,o);for(let{mesh:e,at:t,w:r}of n){let n=e.positions.length/3,i=o+t;new Float32Array(s,i,n*3).set(e.positions),new Float32Array(s,i+n*12,n*3).set(e.normals),new Float32Array(s,i+n*24,n*2).set(e.uvs),new(r===2?Uint16Array:Uint32Array)(s,i+n*32,e.indices.length).set(e.indices)}return s}var Es=e=>Number.isInteger(e)&&e>=0;function Ds(e){if(!xs||!(e instanceof ArrayBuffer)||e.byteLength<12)return null;let t=new DataView(e);if(t.getUint32(0,!0)!==bs||t.getUint32(4,!0)!==1)return null;let n=t.getUint32(8,!0);if(n%4||12+n>e.byteLength)return null;let r;try{r=JSON.parse(Cs.decode(new Uint8Array(e,12,n)))}catch{return null}if(!r||typeof r.key!=`string`||!Array.isArray(r.entries))return null;let i=12+n,a=[];for(let t of r.entries){if(!Array.isArray(t))return null;let n=[];for(let r of t){if(!r||!Es(r.lod)||!Es(r.v)||!Es(r.i)||!Es(r.at)||r.at%4||r.kind!==`triangles`&&r.kind!==`lines`||r.w!==2&&r.w!==4||r.w===2&&r.v>65536||r.i%(r.kind===`lines`?2:3))return null;let t=i+r.at;if(t+r.v*32+r.i*r.w>e.byteLength)return null;let a=r.w===2?new Uint32Array(new Uint16Array(e,t+r.v*32,r.i)):new Uint32Array(e,t+r.v*32,r.i),o=new Mi({positions:new Float32Array(e,t,r.v*3),normals:new Float32Array(e,t+r.v*12,r.v*3),uvs:new Float32Array(e,t+r.v*24,r.v*2),indices:a,kind:r.kind}),s=Array.isArray(r.reports)?r.reports.filter(e=>Array.isArray(e)&&e.length===3).map(([e,t,n])=>({severity:String(e),code:String(t),message:String(n)})):[];n.push({lod:r.lod,mesh:o,reports:s})}a.push(n)}return{key:r.key,entries:a}}var Os=1,ks=()=>typeof performance<`u`?performance.now():Date.now(),As=null;function js(){if(As)return As;let e=new Float64Array(216),t=0;for(let n=0;n<24;n++){let r=(n-11.5)*.8284271247461902;e[t++]=Math.sin(r),e[t++]=Math.cos(r),e[t++]=Math.tan(r),e[t++]=Math.atan2(r,1.7-n*.11),e[t++]=Math.acos(Math.max(-1,Math.min(1,r/10))),e[t++]=Math.hypot(r,n*.3),e[t++]=Math.hypot(r,n*.3,1/(n+1)),e[t++]=Math.cbrt(r),e[t++]=Math.sqrt(n+.1)}return As=new Uint8Array(e.buffer),As}var Ms=typeof crypto<`u`&&crypto.subtle&&typeof crypto.subtle.digest==`function`?crypto.subtle:null,Ns=new TextEncoder;async function Ps(e,t){if(t&&Ms)try{let t=new Uint8Array(await Ms.digest(`SHA-256`,e)),n=``;for(let e of t)n+=(e<16?`0`:``)+e.toString(16);return n}catch{}return ys(e)}async function Fs(e,t={}){let n=[];for(let r of t.entries||e.entries.values())r.identity&&n.push(r);if(!n.length)return{key:null,entries:n};n.sort((e,t)=>e.identity<t.identity?-1:+(e.identity>t.identity));let r=Ns.encode(`es3d-geometry:1:${e.quality}:${n.length}:${n.map(e=>e.identity).join(``)}`),i=js(),a=new Uint8Array(r.length+i.length);return a.set(r),a.set(i,r.length),{key:await Ps(a,t.native!==!1),entries:n}}function Is(e){let t=[];for(let n=0;n<e.lods;n++){let r=e.meshes[n];r&&!(e.failedLods&1<<n)&&t.push({lod:n,mesh:r,reports:e.reports[n]})}return t}var Ls=(e,t)=>t>0&&t<1/0?Promise.race([e,new Promise(e=>setTimeout(()=>e(void 0),t))]):e;async function Rs(e,t,n={}){let r=ks(),i=e=>({hit:!1,key:null,levels:0,bytes:0,...e,ms:ks()-r}),a=await Ls(Promise.resolve(t),n.timeout??250);if(!a)return i({reason:a===void 0?`store timed out`:`no store`});let{key:o,entries:s}=await Fs(e,{entries:n.entries});if(!o)return i({reason:`nothing cacheable`});let c;try{c=await Ls(a.get(o),n.timeout??250)}catch{c=null}if(c===void 0)return i({key:o,reason:`store timed out`});if(!c)return e.persisted=null,i({key:o,reason:`miss`});let l=Ds(c);if(!l||l.key!==o||l.entries.length!==s.length)return Promise.resolve(a.delete(o)).catch(()=>{}),i({key:o,reason:`invalid record`});let u=0,d=0;for(let t=0;t<s.length;t++){let n=l.entries[t];d+=n.length;for(let{lod:r,mesh:i,reports:a}of n)e.adopt(s[t],r,i,a)&&u++}return Bs(e,`${o}:${d}`),{hit:!0,key:o,levels:u,bytes:c.byteLength,ms:ks()-r}}function zs(e){let t=0;for(let n of e)t+=Is(n).length;return t}function Bs(e,t){e.persisted=t,e.persistedSet||=new Set,e.persistedSet.size>4096&&e.persistedSet.clear(),e.persistedSet.add(t)}async function Vs(e,t,n={}){let r=await t;if(!r)return{saved:!1,key:null,bytes:0,reason:`no store`};let{key:i,entries:a}=await Fs(e,{entries:n.entries});if(!i)return{saved:!1,key:null,bytes:0,reason:`nothing cacheable`};let o=`${i}:${zs(a)}`;if(e.persisted===o||e.persistedSet&&e.persistedSet.has(o))return{saved:!1,key:i,bytes:0,reason:`up to date`};let s=a.map(Is);if(!s.some(e=>e.length))return{saved:!1,key:i,bytes:0,reason:`nothing generated`};let c=Ts(i,s);if(r.maxBytes&&c.byteLength>r.maxBytes/4)return{saved:!1,key:i,bytes:c.byteLength,reason:`too large`};try{await r.put(i,c)}catch(e){return{saved:!1,key:i,bytes:c.byteLength,reason:`store failed: ${e&&e.message?e.message:e}`}}return Bs(e,o),{saved:!0,key:i,bytes:c.byteLength}}function Hs(e,t={}){let n=t.delay??1500,r=typeof requestIdleCallback==`function`?e=>requestIdleCallback(e,{timeout:5e3}):e=>setTimeout(e,0),i=0,a=null,o=-1,s=new Map,c=()=>{let t=a;a=null;let n=[...s.values()];s.clear(),t&&Vs(t,e).catch(()=>{}),n.reduce((t,n)=>t.then(()=>Vs(n.cache,e,{entries:n.entries()}).catch(()=>{})),Promise.resolve())};return{store:e,restore(t,n){return e?Rs(t,e,n):Promise.resolve(null)},changed(t,l){if(e){if(l)s.set(l.owner,{cache:t,entries:l.entries});else{if(t===a&&t.stats.generated===o)return;a=t,o=t.stats.generated}clearTimeout(i),i=setTimeout(()=>r(c),n)}},forget(e){s.delete(e)}}}var Us={maxBytes:67108864,maxRecords:256};function Ws(e={}){let{maxBytes:t,maxRecords:n}={...Us,...e},r=new Map,i=0,a=()=>{let e=0;for(let t of r.values())e+=t.data.byteLength;let i=[...r].sort((e,t)=>e[1].used-t[1].used);for(;i.length&&(e>t||r.size>n);){let[t,n]=i.shift();r.delete(t),e-=n.data.byteLength}};return{kind:`memory`,maxBytes:t,async get(e){let t=r.get(e);return t?(t.used=++i,t.data.slice(0)):null},async put(e,t){r.set(e,{data:t.slice(0),used:++i}),a()},async delete(e){r.delete(e)},async clear(){r.clear()},get size(){return r.size}}}var Gs=e=>new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)}),Ks=e=>new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error||Error(`transaction aborted`))});async function qs(e={}){let{name:t,maxBytes:n,maxRecords:r,timeout:i}={name:`es3d-geometry`,timeout:2e3,...Us,...e},a=typeof indexedDB<`u`?indexedDB:null;if(!a)return null;let o;try{o=await Ls(new Promise((e,n)=>{let r=a.open(t,1);r.onupgradeneeded=()=>{let e=r.result;e.objectStoreNames.contains(`data`)||e.createObjectStore(`data`),e.objectStoreNames.contains(`meta`)||e.createObjectStore(`meta`,{keyPath:`key`}).createIndex(`used`,`used`)},r.onsuccess=()=>e(r.result),r.onerror=()=>n(r.error),r.onblocked=()=>e(null)}),i)}catch{return null}if(!o)return null;o.onversionchange=()=>o.close();let s=e=>{try{let t=o.transaction(`meta`,`readwrite`).objectStore(`meta`),n=t.get(e);n.onsuccess=()=>{n.result&&t.put({...n.result,used:Date.now()})}}catch{}};return{kind:`indexeddb`,maxBytes:n,async get(e){let t=await Gs(o.transaction(`data`,`readonly`).objectStore(`data`).get(e));return t instanceof ArrayBuffer?((typeof requestIdleCallback==`function`?requestIdleCallback:setTimeout)(()=>s(e)),t):null},async put(e,t){let i=o.transaction([`data`,`meta`],`readwrite`),a=i.objectStore(`data`),s=i.objectStore(`meta`);a.put(t,e),s.put({key:e,bytes:t.byteLength,used:Date.now(),revision:1});let c=await Gs(s.getAll());c.sort((e,t)=>(e.revision===1)-(t.revision===1)||e.used-t.used);let l=c.reduce((e,t)=>e+t.bytes,0),u=c.length;for(let t of c)if(t.key!==e){if(t.revision===1&&l<=n&&u<=r)break;a.delete(t.key),s.delete(t.key),l-=t.bytes,u--}await Ks(i)},async delete(e){let t=o.transaction([`data`,`meta`],`readwrite`);t.objectStore(`data`).delete(e),t.objectStore(`meta`).delete(e),await Ks(t)},async clear(){let e=o.transaction([`data`,`meta`],`readwrite`);e.objectStore(`data`).clear(),e.objectStore(`meta`).clear(),await Ks(e)},close(){o.close()}}}async function Js(e={}){let t=await qs(e).catch(()=>null);return t&&e.persist&&typeof navigator<`u`&&navigator.storage&&navigator.storage.persist&&navigator.storage.persist().catch(()=>{}),t}function Ys(e,t,n,r,i,a,o,s,c,l){let u=o-e,d=s-t,f=c-n,p=u*r+d*i+f*a,m=u*u+d*d+f*f-p*p;if(m>l*l)return 1/0;let h=Math.sqrt(l*l-m),g=p-h;return p+h<0?1/0:g<0?0:g}function Xs(e,t,n){let r=-1/0,i=1/0;for(let a=0;a<3;a++){let o=1e-6+(n.max[a]-n.min[a])*1e-4,s=n.min[a]-o,c=n.max[a]+o;if(Math.abs(t[a])<1e-20){if(e[a]<s||e[a]>c)return!1}else{let n=(s-e[a])/t[a],o=(c-e[a])/t[a];if(n>o&&([n,o]=[o,n]),r=Math.max(r,n),i=Math.min(i,o),r>i)return!1}}return i>=0}var Zs=-1;function Qs(e,t,n,r,i=0){let a=n.positions,o=n.indices,s=r;Zs=-1;for(let n=0;n<o.length;n+=3){let r=o[n]*3,c=o[n+1]*3,l=o[n+2]*3,u=a[c]-a[r],d=a[c+1]-a[r+1],f=a[c+2]-a[r+2],p=a[l]-a[r],m=a[l+1]-a[r+1],h=a[l+2]-a[r+2],g=t[1]*h-t[2]*m,_=t[2]*p-t[0]*h,v=t[0]*m-t[1]*p,y=u*g+d*_+f*v;if(Math.abs(y)<1e-18||i&&y*i<0)continue;let b=1/y,x=e[0]-a[r],S=e[1]-a[r+1],C=e[2]-a[r+2],w=(x*g+S*_+C*v)*b;if(w<0||w>1)continue;let T=S*f-C*d,E=C*u-x*f,D=x*d-S*u,O=(t[0]*T+t[1]*E+t[2]*D)*b;if(O<0||w+O>1)continue;let k=(p*T+m*E+h*D)*b;k>1e-9&&k<s&&(s=k,Zs=n)}return s}function $s(e,t,n,r,i={}){if(e&&e.parts)return ec(e,t,n,r,i);let{isVisible:a=null,maxDistance:o=1/0,skipFlags:s=0,facing:c=!1}=i,l=[],u=e.spheres;for(let t=0;t<e.count;t++){if(s&&e.flags[t]&s||a&&!a(t)||e.geometries[e.geom[t]].kind!==`triangles`)continue;let i=Ys(n[0],n[1],n[2],r[0],r[1],r[2],u[t*4],u[t*4+1],u[t*4+2],u[t*4+3]);i<o&&l.push([i,t])}l.sort((e,t)=>e[0]-t[0]);let d=o,f=-1,p=-1,m=[0,0,0],h=new Float64Array(16),g=new Float64Array(16),_=[0,0,0],v=[0,0,0];for(let[i,a]of l){if(i>d)break;for(let t=0;t<16;t++)h[t]=e.matrices[a*16+t];if(!xt(g,h))continue;Ct(_,g,n[0],n[1],n[2]),wt(v,g,r[0],r[1],r[2]);let o=e.geometries[e.geom[a]];if(o.bounds&&!Xs(_,v,o.bounds))continue;let s=t(o,0),l=e.materials[e.mat[a]],u=o.doubleSided||l&&l.doubleSided,y=c&&!u?e.flags[a]&1?-1:1:0,b=Qs(_,v,s,d,y);if(b<d){d=b,f=a,p=Zs;let e=s.positions,t=s.indices,n=t[p]*3,r=t[p+1]*3,i=t[p+2]*3,o=[e[r]-e[n],e[r+1]-e[n+1],e[r+2]-e[n+2]],c=[e[i]-e[n],e[i+1]-e[n+1],e[i+2]-e[n+2]],l=[o[1]*c[2]-o[2]*c[1],o[2]*c[0]-o[0]*c[2],o[0]*c[1]-o[1]*c[0]];for(let e=0;e<3;e++)m[e]=g[e*4]*l[0]+g[e*4+1]*l[1]+g[e*4+2]*l[2]}}if(f<0)return null;let y=Math.hypot(m[0],m[1],m[2])||1,b=m[0]*r[0]+m[1]*r[1]+m[2]*r[2]>0?-1:1;return{index:f,uid:e.uid[f],distance:d,point:[n[0]+r[0]*d,n[1]+r[1]*d,n[2]+r[2]*d],normal:[m[0]/y*b,m[1]/y*b,m[2]/y*b]}}function ec(e,t,n,r,i){let a=null;for(let o of e.parts){if(!o.scene||!o.visible)continue;let e=o.scene,s=i.isVisible?t=>i.isVisible(t,e):null,c=a?a.distance:i.maxDistance??1/0,l=$s(e,t,n,r,{...i,isVisible:s,maxDistance:c});l&&(!a||l.distance<a.distance)&&(a={...l,part:o})}return a}function tc(e,t,n,r,i=null){return $s(e,t,n,r,{isVisible:i})}function nc(e,t){let n=[],r=e&&e.byUid.get(t);for(;r;){let e=r.values&&(r.values.name||r.values.id);e&&n.push(e),r=r.parent}return n}var rc=Math.PI/180,ic=.001;function ac(e,t){if(!t)return;let n=e.position,r=e.target;if(t.targetMin&&t.targetMax)for(let e=0;e<3;e++){let i=Math.min(t.targetMax[e],Math.max(t.targetMin[e],r[e]));n[e]+=i-r[e],r[e]=i}let i=[n[0]-r[0],n[1]-r[1],n[2]-r[2]],a=Math.hypot(i[0],i[1],i[2]);if(a<1e-12)return;let o=Math.acos(Math.max(-1,Math.min(1,i[1]/a))),s=Math.atan2(i[0],i[2]),c=t.minPolar??0,l=t.maxPolar??180,u=c>0||l<180;u&&(o=Math.min(Math.min(l*rc,Math.PI-ic),Math.max(Math.max(c*rc,ic),o)));let d=a;if(t.minDistance!=null&&(d=Math.max(d,t.minDistance)),t.maxDistance!=null&&(d=Math.min(d,t.maxDistance)),!u&&d===a)return;let f=Math.sin(o);n[0]=r[0]+d*f*Math.sin(s),n[1]=r[1]+d*Math.cos(o),n[2]=r[2]+d*f*Math.cos(s)}function oc(e,t){let n=t.bounds,r=Math.hypot(n.max[0]-n.min[0],n.max[1]-n.min[1],n.max[2]-n.min[2])/2||1;return Math.max((e.currentNear||0)*2,r*.01)}function sc(e,t,n){let{scene:r,meshOf:i}=n;if(!r||!r.count)return!1;let a=n.margin??oc(t,r),o=[t.target[0]-e.target[0],t.target[1]-e.target[1],t.target[2]-e.target[2]],s=e.position.slice(),c=[t.position[0]-s[0],t.position[1]-s[1],t.position[2]-s[2]],l=Math.hypot(c[0],c[1],c[2]);if(l<1e-12)return!1;let u=!1,d=0;for(let e=0;e<2;e++){let t=Math.hypot(c[0],c[1],c[2]);if(t<1e-12)break;let o=[c[0]/t,c[1]/t,c[2]/t],l=$s(r,i,s,o,{isVisible:n.isVisible,maxDistance:t+a*4,skipFlags:2,facing:!0}),f=l?Math.abs(o[0]*l.normal[0]+o[1]*l.normal[1]+o[2]*l.normal[2]):0,p=l?Math.max(0,l.distance-a/Math.max(f,.25)):t,m=Math.min(1,p/t);for(let e=0;e<3;e++)s[e]+=c[e]*m;if(e===0&&(d=m),m>=1)break;u=!0;let h=c.map(e=>e*(1-m)),g=h[0]*l.normal[0]+h[1]*l.normal[1]+h[2]*l.normal[2];c=h.map((e,t)=>e-l.normal[t]*g)}if(!u)return!1;let f=Math.hypot(o[0]-(t.position[0]-e.position[0]),o[1]-(t.position[1]-e.position[1]),o[2]-(t.position[2]-e.position[2]))<l*1e-6;for(let n=0;n<3;n++)t.target[n]=e.target[n]+(f?s[n]-e.position[n]:o[n]*d),t.position[n]=s[n];return!0}function cc(e,t,n,r){return ac(t,n),n&&n.collide&&r?sc(e,t,r):!1}var lc=class{constructor(e,t,n){this.Type=e,this.stride=t,this.chunks=[{start:0,length:n,data:new e(n*t)}],this.capacity=n}reserve(e){if(e<=this.capacity)return!1;let t=Math.max(1,this.capacity);for(;t<e;)t*=2;let n=t-this.capacity;return this.chunks.push({start:this.capacity,length:n,data:new this.Type(n*this.stride)}),this.capacity=t,!0}forEach(e,t,n){let r=this.stride;for(let i of this.chunks){let a=Math.max(e,i.start),o=Math.min(t,i.start+i.length);a<o&&n(a,i.data.subarray((a-i.start)*r,(o-i.start)*r))}}},uc=class{constructor(e=65536,t=1<<17){this.vertexStore=new lc(Float32Array,8,e),this.indexStore=new lc(Uint32Array,1,t),this.vertexCount=0,this.indexCount=0,this.ranges=new Map,this.edgeRanges=new Map,this.normalRanges=new Map,this.generation=0,this.uploadedVertices=0,this.uploadedIndices=0}get vertexCapacity(){return this.vertexStore.capacity}get indexCapacity(){return this.indexStore.capacity}get vertexCapacityBytes(){return this.vertexStore.capacity*32}get indexCapacityBytes(){return this.indexStore.capacity*4}reset(){this.vertexCount=0,this.indexCount=0,this.ranges.clear(),this.edgeRanges.clear(),this.normalRanges.clear(),this.generation++,this.uploadedVertices=0,this.uploadedIndices=0}get byteSize(){return this.vertexCount*32+this.indexCount*4}ensure(e,t){this.vertexStore.reserve(this.vertexCount+e),this.indexStore.reserve(this.indexCount+t)}appendVertices(e){let t=e.vertexCount,n=this.vertexCount,r=e.positions,i=e.normals,a=e.uvs;return this.vertexStore.forEach(n,n+t,(e,t)=>{let o=t.length/8,s=0;for(let c=e-n,l=c+o;c<l;c++)t[s]=r[c*3],t[s+1]=r[c*3+1],t[s+2]=r[c*3+2],t[s+3]=i[c*3],t[s+4]=i[c*3+1],t[s+5]=i[c*3+2],t[s+6]=a[c*2],t[s+7]=a[c*2+1],s+=8}),this.vertexCount+=t,n}appendIndices(e,t){let n=this.indexCount;return this.indexStore.forEach(n,n+e.length,(r,i)=>{let a=r-n;for(let n=0;n<i.length;n++)i[n]=e[a+n]+t}),this.indexCount+=e.length,n}forEachVertices(e,t,n){this.vertexStore.forEach(e,t,n)}forEachIndices(e,t,n){this.indexStore.forEach(e,t,n)}meshRange(e){let t=this.ranges.get(e);if(t)return t;this.ensure(e.vertexCount,e.indices.length);let n=this.appendVertices(e);return t={firstIndex:this.appendIndices(e.indices,n),indexCount:e.indices.length,baseVertex:n,kind:e.kind},this.ranges.set(e,t),t}edgeRange(e){let t=this.edgeRanges.get(e);if(t)return t;let n=this.meshRange(e).baseVertex,r=e.edges();return this.ensure(0,r.length),t={firstIndex:this.appendIndices(r,n),indexCount:r.length,kind:`lines`},this.edgeRanges.set(e,t),t}normalRange(e){let t=this.normalRanges.get(e);if(t)return t;let n=e.normalLines();return t=this.meshRange(n),this.normalRanges.set(e,t),t}pending(){return{full:this.uploadedVertices===0&&this.uploadedIndices===0,vertexStart:this.uploadedVertices,vertexEnd:this.vertexCount,indexStart:this.uploadedIndices,indexEnd:this.indexCount}}markUploaded(){this.uploadedVertices=this.vertexCount,this.uploadedIndices=this.indexCount}};function dc(e,t,n){return Math.sqrt(e*e+t*t+n*n)}function fc(e,t){let n=e.aspect||1,r=Math.tan(e.verticalFov(n)/2);return{orthographic:e.type===`orthographic`,ppuFactor:e.pixelsPerUnit(1,t),view:e.view,cornerStretch:1+r*r*(1+n*n)}}function pc(e,t,n,r,i){if(e.orthographic)return e.ppuFactor;let a=e.view,o=-(a[2]*t+a[6]*n+a[10]*r+a[14]),s=o>0?Math.min(i*i/(o*o),e.cornerStretch):e.cornerStretch;return e.ppuFactor*s/Math.max(i,1e-6)}function mc(e,t){for(let n=t+1;n<e.length;n++)if(e[n])return n;for(let n=t-1;n>=0;n--)if(e[n])return n;return e.length-1}function hc(e,t){let n=t*16,r=0;for(let t=0;t<3;t++){let i=dc(e[n+t*4],e[n+t*4+1],e[n+t*4+2]);i>r&&(r=i)}return r||1}function gc(e,t,n,r,i){if(!(t>1)||!e)return 0;let a=1/(i>0?i:1),o=n*r,s=0,c=Math.min(t,e.length)-1;for(let t=c;t>=1;t--)if(e[t]*o<=a){s=t;break}return s}function _c(e){let t=t=>[e[t],e[4+t],e[8+t],e[12+t]],n=t(0),r=t(1),i=t(3),a=t(2),o=[[i[0]+n[0],i[1]+n[1],i[2]+n[2],i[3]+n[3]],[i[0]-n[0],i[1]-n[1],i[2]-n[2],i[3]-n[3]],[i[0]+r[0],i[1]+r[1],i[2]+r[2],i[3]+r[3]],[i[0]-r[0],i[1]-r[1],i[2]-r[2],i[3]-r[3]],[i[0]-a[0],i[1]-a[1],i[2]-a[2],i[3]-a[3]]];for(let e of o){let t=Math.hypot(e[0],e[1],e[2])||1;e[0]/=t,e[1]/=t,e[2]/=t,e[3]/=t}return o}var vc=class{constructor(){this.instanceData=new Float32Array(16384),this.keys=new Int32Array(1024),this.lods=new Uint8Array(1024),this.last=null,this.lastSignature=``}ensure(e){if(this.instanceData.length<e*16){let t=this.instanceData.length/16;for(;t<e;)t*=2;this.instanceData=new Float32Array(t*16)}if(this.keys.length<e){let t=this.keys.length;for(;t<e;)t*=2;this.keys=new Int32Array(t),this.lods=new Uint8Array(t)}}lodStates(e,t,n){let r=e.lodSwitches,i=new Int32Array(r.length),a=new Uint8Array(r.length);for(let e=0;e<r.length;e++){let t=r[e],o=n(t.pos),s=0;for(;s<t.distances.length&&o>=t.distances[s];)s++;i[e]=s,a[e]=t.parent<0||a[t.parent]&&i[t.parent]===t.parentChild?1:0}return{active:i,visible:a}}build(e){let{scene:t,camera:n,pool:r,meshOf:i,options:a}=e,o=t.parts?t.drawnParts():[{scene:t,geomMap:null,matMap:null,selectable:!0}],s=0;for(let e of o)s+=e.scene.count;let c=0;if(a.selection&&a.selection.size)for(let e of o){if(!e.selectable)continue;let t=e.scene;for(let e=0;e<t.count;e++)a.selection.has(t.uid[e])&&c++}this.ensure(s+(a.bbox?s:0)+c+64);let l=n.position,u=e=>Math.hypot(e[0]-l[0],e[1]-l[1],e[2]-l[2]),d=a.culling===!1?null:_c(n.viewProj),f=this.keys,p=this.lods,m=new Map,h=[],g=t.geometries,_=t.materials,v=Math.max(1,_.length),y=[0,0,0,0],b=0,x=0,S=e.viewportHeight,C=a.lodBias||1,w=a.autoLod===!1?a.fixedLod||0:-1,T=fc(n,S),E=0;for(let e of o){let t=e.scene,n=e.geomMap,r=e.matMap,i=t.count,a=this.lodStates(t,l,u),o=t.spheres;for(let e=0;e<i;e++){let i=E+e;f[i]=-1;let s=t.lodNode[e];if(s>=0&&!(a.visible[s]&&a.active[s]===t.lodChild[e]))continue;let c=o[e*4],u=o[e*4+1],S=o[e*4+2],D=o[e*4+3];if(d){let e=!1;for(let t=0;t<5;t++){let n=d[t];if(n[0]*c+n[1]*u+n[2]*S+n[3]<-D){e=!0;break}}if(e){x++;continue}}let O=n?n[t.geom[e]]:t.geom[e],k=g[O],A=0;if(k.lods>1){if(w>=0)A=Math.min(w,k.lods-1);else{let n=pc(T,c,u,S,dc(c-l[0],u-l[1],S-l[2]));A=gc(k.lodDeviation,k.lods,hc(t.matrices,e),n,C)}}p[i]=A,y[A]++;let j=t.flags[e]&1,ee=r?r[t.mat[e]]:t.mat[e],M=((O*4+A)*v+ee)*2+j,N=m.get(M);if(N===void 0){N=h.length,m.set(M,N);let e=_[ee];h.push({gi:O,entry:k,lod:A,mi:ee,material:e,mirrored:!!j,count:0,firstInstance:0,depth:0,instances:null})}h[N].count++,f[i]=N,b++}E+=i}let D=a.tessellationBudget,O=D>=0&&D<1/0,k=O?performance.now():0,A=0,j=0,ee=0;for(let e of h){let t=e.lod,n=e.entry.meshes;O&&n&&!n[t]&&(A&&performance.now()-k>=D?(t=mc(n,t),j++):A++);let a=i(e.entry,t);e.mesh=a,e.kind=a.kind,e.range=r.meshRange(a),e.doubleSided=!!(e.entry.doubleSided||e.material.doubleSided),e.transparent=e.material.transparent,e.kind===`triangles`&&(ee+=e.range.indexCount/3*e.count)}let M=0,N=h.slice().sort((e,t)=>e.transparent===t.transparent?e.kind===t.kind?e.doubleSided===t.doubleSided?e.mirrored===t.mirrored?e.mi-t.mi:e.mirrored?1:-1:e.doubleSided?1:-1:e.kind===`triangles`?-1:1:e.transparent?1:-1);for(let e of N)e.firstInstance=M,M+=e.count,e.cursor=e.firstInstance;let te=this.instanceData,ne=[];E=0;for(let e of o){let t=e.scene,n=t.matrices,r=t.spheres;for(let e=0;e<t.count;e++){let t=f[E+e];if(t<0)continue;let i=h[t];if(i.transparent){ne.push({M:n,r:e,b:i,depth:-dc(r[e*4]-l[0],r[e*4+1]-l[1],r[e*4+2]-l[2])});continue}let a=i.cursor++*16;for(let t=0;t<16;t++)te[a+t]=n[e*16+t]}E+=t.count}if(ne.length){ne.sort((e,t)=>e.depth-t.depth);for(let e of ne){let t=e.b,n=t.cursor++*16;for(let t=0;t<16;t++)te[n+t]=e.M[e.r*16+t];t.depth=Math.max(t.depth,-e.depth)}let e=N.filter(e=>!e.transparent),t=N.filter(e=>e.transparent).sort((e,t)=>t.depth-e.depth);N.length=0,N.push(...e,...t)}let re={wireframe:[],normals:[],bbox:null,selection:null};if(a.wireframe||a.normals)for(let e of N)e.kind===`triangles`&&(a.wireframe&&re.wireframe.push({range:r.edgeRange(e.mesh),firstInstance:e.firstInstance,count:e.count,mirrored:e.mirrored}),a.normals&&re.normals.push({range:r.normalRange(e.mesh),firstInstance:e.firstInstance,count:e.count}));let ie=(e,t,n)=>{let r=e.scene,i=g[e.geomMap?e.geomMap[r.geom[t]]:r.geom[t]].bounds,a=(i.min[0]+i.max[0])/2,o=(i.min[1]+i.max[1])/2,s=(i.min[2]+i.max[2])/2,c=Math.max(i.max[0]-i.min[0],1e-4),l=Math.max(i.max[1]-i.min[1],1e-4),u=Math.max(i.max[2]-i.min[2],1e-4),d=r.matrices.subarray(t*16,t*16+16);for(let e=0;e<3;e++)te[n+e]=d[e]*c,te[n+4+e]=d[4+e]*l,te[n+8+e]=d[8+e]*u,te[n+12+e]=d[e]*a+d[4+e]*o+d[8+e]*s+d[12+e];te[n+3]=0,te[n+7]=0,te[n+11]=0,te[n+15]=1};if(a.bbox){let e=M;E=0;for(let e of o){for(let t=0;t<e.scene.count;t++)f[E+t]<0||(ie(e,t,M*16),M++);E+=e.scene.count}re.bbox={firstInstance:e,count:M-e}}if(c){let e=M,t=a.selection;E=0;for(let e of o){let n=e.scene;if(e.selectable)for(let r=0;r<n.count;r++)t.has(n.uid[r])&&(f[E+r]<0&&n.lodNode[r]>=0||(ie(e,r,M*16),M++));E+=n.count}re.selection={firstInstance:e,count:M-e}}let ae={batches:N,overlays:re,instanceData:this.instanceData,instanceCount:M,lights:t.lights,environment:t.environment,stats:{instances:s,visible:b,culled:x,batches:N.length,drawCalls:N.length+re.wireframe.length+re.normals.length+ +!!re.bbox+ +!!re.selection,triangles:ee,lodHistogram:y,refining:j}};return this.last=ae,ae}},yc=256;function bc(e){return[Math.round(e[0]*255),Math.round(e[1]*255),Math.round(e[2]*255),Math.round((e[3]??1)*255)]}function xc(e,t,n){let r=Math.max(0,Math.min(1,(n-e)/(t-e)));return r*r*(3-2*r)}function Sc(e,t,n,r){let i=e*n,a=t*n,o=Math.floor(i),s=Math.floor(a),c=i-o,l=a-s,u=c*c*(3-2*c),d=l*l*(3-2*l),f=(e,t)=>Co((e%n+n)%n,(t%n+n)%n,r),p=f(o,s),m=f(o+1,s),h=f(o,s+1),g=f(o+1,s+1);return p+(m-p)*u+(h-p)*d+(p-m-h+g)*u*d}function Cc(e,t,n,r){let i=0,a=.5,o=Math.max(1,Math.round(n)),s=0;for(let n=0;n<5;n++)i+=Sc(e,t,o,r+n*17)*a,s+=a,a*=.5,o*=2;return i/s}function wc(e,t){let n=new Uint8ClampedArray(e*e*4);for(let r=0;r<e;r++)for(let i=0;i<e;i++){let a=t((i+.5)/e,(r+.5)/e),o=(r*e+i)*4;n[o]=a[0],n[o+1]=a[1],n[o+2]=a[2],n[o+3]=a[3]}return{width:e,height:e,data:n}}function Tc(e,t,n){return[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n,e[3]+(t[3]-e[3])*n]}function Ec(e,t=yc){let n=e.params;switch(e.fn){case`checker`:{let e=bc(n.color1),r=bc(n.color2),i=Math.max(1,Math.round(n.count));return wc(t,(t,n)=>(Math.floor(t*i)+Math.floor(n*i))%2==0?e:r)}case`stripes`:{let e=bc(n.color1),r=bc(n.color2),i=Math.max(1,Math.round(n.count));return wc(t,t=>Math.floor(t*i*2)%2==0?e:r)}case`grid`:{let e=bc(n.line),r=bc(n.background),i=Math.max(1,Math.round(n.count)),a=n.width/2;return wc(t,(t,n)=>{let o=t*i%1,s=n*i%1,c=Math.min(o,1-o,s,1-s);return Tc(e,r,xc(a*.6,a,c))})}case`noise`:{let e=bc(n.color1),r=bc(n.color2);return wc(t,(t,i)=>Tc(r,e,Cc(t,i,n.scale,n.seed)))}case`bricks`:{let e=bc(n.brick),r=bc(n.mortar),i=Math.max(1,Math.round(n.count));return wc(t,(t,n)=>{let a=Math.floor(n*i),o=(t*i*.5+a%2*.5)%1,s=n*i%1,c=Math.min(o,1-o,s,1-s),l=.88+.24*Co(Math.floor(t*i*.5+a%2*.5),a,7),u=[e[0]*l,e[1]*l,e[2]*l,255];return Tc(r,u,xc(.03,.06,c))})}default:throw Error(`unknown procedural texture ${e.fn}`)}}function Dc(e){let t=e.params;switch(e.fn){case`bumps`:{let e=Math.max(1,Math.round(t.count));return(t,n)=>{let r=t*e%1-.5,i=n*e%1-.5,a=Math.hypot(r,i)*2.4;return a<1?Math.sqrt(1-a*a):0}}case`tiles`:{let e=Math.max(1,Math.round(t.count));return(n,r)=>{let i=n*e%1,a=r*e%1,o=Math.min(i,1-i,a,1-a);return xc(t.gap*.5,t.gap*1.5,o)}}case`noise`:return(e,n)=>Cc(e,n,t.scale,t.seed);case`waves`:{let e=Math.max(1,Math.round(t.count));return t=>.5+.5*Math.sin(t*e*Math.PI*2)}case`bricks`:{let e=Math.max(1,Math.round(t.count));return(t,n)=>{let r=Math.floor(n*e),i=(t*e*.5+r%2*.5)%1,a=n*e%1;return xc(.02,.07,Math.min(i,1-i,a,1-a))}}default:throw Error(`unknown procedural normal map ${e.fn}`)}}function Oc(e,t=yc){let n=Dc(e),r=e.params.strength??1,i=new Float32Array(t*t);for(let e=0;e<t;e++)for(let r=0;r<t;r++)i[e*t+r]=n((r+.5)/t,(e+.5)/t);let a=new Uint8ClampedArray(t*t*4),o=r*t*.02;for(let e=0;e<t;e++)for(let n=0;n<t;n++){let r=(e,n)=>i[(n+t)%t*t+(e+t)%t],s=(r(n+1,e)-r(n-1,e))*o,c=(r(n,e+1)-r(n,e-1))*o,l=-s,u=-c,d=1,f=Math.hypot(l,u,d);l/=f,u/=f,d/=f;let p=(e*t+n)*4;a[p]=Math.round((l*.5+.5)*255),a[p+1]=Math.round((u*.5+.5)*255),a[p+2]=Math.round((d*.5+.5)*255),a[p+3]=255}return{width:t,height:t,data:a}}function kc(e){let t=[e],n=e;for(;n.width>1||n.height>1;){let e=Math.max(1,n.width>>1),r=Math.max(1,n.height>>1),i=new Uint8ClampedArray(e*r*4);for(let t=0;t<r;t++)for(let r=0;r<e;r++)for(let a=0;a<4;a++){let o=0,s=0;for(let e=0;e<2;e++)for(let i=0;i<2;i++){let c=Math.min(n.width-1,r*2+i),l=Math.min(n.height-1,t*2+e);o+=n.data[(l*n.width+c)*4+a],s++}i[(t*e+r)*4+a]=o/s}n={width:e,height:r,data:i},t.push(n)}return t}async function Ac(e){let t=await fetch(e);if(!t.ok)throw Error(`HTTP ${t.status} for ${e}`);let n=await t.blob(),r=await createImageBitmap(n),i=e=>Math.min(2048,2**Math.round(Math.log2(Math.max(1,e)))),a=i(r.width),o=i(r.height),s=(typeof OffscreenCanvas<`u`?new OffscreenCanvas(a,o):Object.assign(document.createElement(`canvas`),{width:a,height:o})).getContext(`2d`);return s.drawImage(r,0,0,a,o),{width:a,height:o,data:s.getImageData(0,0,a,o).data}}function jc(e,t){return e.kind===`procedural`?Promise.resolve(t===`normal`?Oc(e):Ec(e)):Ac(e.url)}var Mc=class{constructor(){this.entries=new Map,this.onReady=null,this.onError=null}get(e,t){let n=`${t}:${e.key}`,r=this.entries.get(n);return r||(r={id:n,spec:e,kind:t,status:`pending`,pixels:null,error:null,gpu:null},this.entries.set(n,r),jc(e,t).then(e=>{r.pixels=e,r.status=`ready`,this.onReady&&this.onReady(r)},e=>{r.status=`failed`,r.error=e,this.onError&&this.onError(r,e)}),r)}clear(e){for(let t of this.entries.values())t.gpu&&e&&e(t.gpu);this.entries.clear()}},Nc=1216,Pc={directional:0,point:1,spot:2,ambient:3,hemisphere:4},Fc=[{type:`directional`,color:[1.1,1.08,1.04],direction:Ic([-.45,-.85,-.35]),position:[0,0,0],range:0,outer:0,inner:0,ground:[0,0,0]},{type:`directional`,color:[.22,.25,.32],direction:Ic([.6,-.2,.75]),position:[0,0,0],range:0,outer:0,inner:0,ground:[0,0,0]}];function Ic(e){let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]}function Lc(e,{viewProj:t,view:n,cameraPos:r,time:i,environment:a,lights:o,normalLength:s=.1,lineBias:c=.0015,viewportHeight:l=1}){e.fill(0),e.set(t,0),e.set(n,16),e[32]=r[0],e[33]=r[1],e[34]=r[2],e[35]=i||0;let u=Ae(a.sky),d=Ae(a.ground);e[36]=u[0],e[37]=u[1],e[38]=u[2],e[39]=a.intensity,e[40]=d[0],e[41]=d[1],e[42]=d[2],e[43]=a.exposure;let f=o&&o.length?o:Fc,p=Math.min(f.length,16);e[44]=p,e[45]=s,e[46]=c,e[47]=l;for(let t=0;t<p;t++){let n=f[t],r=48+t*4,i=112+t*4,a=176+t*4,o=240+t*4;e[r]=n.position[0],e[r+1]=n.position[1],e[r+2]=n.position[2],e[r+3]=Pc[n.type]??0,e[i]=n.direction[0],e[i+1]=n.direction[1],e[i+2]=n.direction[2],e[i+3]=n.range||0,e[a]=n.color[0],e[a+1]=n.color[1],e[a+2]=n.color[2],e[a+3]=n.outer||0,e[o]=Math.max(n.inner||0,(n.outer||0)+1e-4),e[o+1]=n.ground?n.ground[0]:0,e[o+2]=n.ground?n.ground[1]:0,e[o+3]=n.ground?n.ground[2]:0}return{data:e,lightCount:p,truncated:Math.max(0,f.length-16),usedDefaults:!(o&&o.length)}}function Rc(e){let t=Math.round(e[44]),n=``;for(let r=0;r<t;r++)n+=(r?`,`:``)+Math.round(e[48+r*4+3]);return n}function zc(e,t,{hasMap:n=!1,hasNormalMap:r=!1,hasMrMap:i=!1,hasOcclusionMap:a=!1,hasEmissiveMap:o=!1,doubleSided:s=!1}={}){return e.fill(0),e[0]=t.baseColor[0],e[1]=t.baseColor[1],e[2]=t.baseColor[2],e[3]=t.alphaMode===`opaque`?1:t.opacity,e[4]=t.emissive[0],e[5]=t.emissive[1],e[6]=t.emissive[2],e[7]=t.normalScale,e[8]=t.metallic,e[9]=t.roughness,e[10]=!!n|(r?2:0)|(s?4:0)|(t.unlit?8:0)|(i?32:0)|(a?64:0)|(o?128:0)|(t.alphaMode===`mask`?256:0),e[11]=t.alphaCutoff??.5,e[12]=t.uvScale[0],e[13]=t.uvScale[1],e[14]=t.occlusionStrength??1,e}function Bc(e,t){return e.fill(0),e[16]=t[0],e[17]=t[1],e[18]=t[2],e[19]=t[3],e[10]=16,e[12]=1,e[13]=1,e}var Vc=`
|
|
16
|
+
layout(std140) uniform Frame {
|
|
17
|
+
mat4 uViewProj;
|
|
18
|
+
mat4 uView;
|
|
19
|
+
vec4 uCameraPos;
|
|
20
|
+
vec4 uSky;
|
|
21
|
+
vec4 uGround;
|
|
22
|
+
vec4 uParams;
|
|
23
|
+
vec4 uLightPos[16];
|
|
24
|
+
vec4 uLightDir[16];
|
|
25
|
+
vec4 uLightColor[16];
|
|
26
|
+
vec4 uLightExtra[16];
|
|
27
|
+
};
|
|
28
|
+
`,Hc=`
|
|
29
|
+
layout(std140) uniform Material {
|
|
30
|
+
vec4 mBaseColor;
|
|
31
|
+
vec4 mEmissive;
|
|
32
|
+
vec4 mParams;
|
|
33
|
+
vec4 mUv;
|
|
34
|
+
vec4 mOverlay;
|
|
35
|
+
};
|
|
36
|
+
`,Uc=`
|
|
37
|
+
layout(location = 0) in vec3 aPosition;
|
|
38
|
+
layout(location = 1) in vec3 aNormal;
|
|
39
|
+
layout(location = 2) in vec2 aUv;
|
|
40
|
+
layout(location = 3) in vec4 iM0;
|
|
41
|
+
layout(location = 4) in vec4 iM1;
|
|
42
|
+
layout(location = 5) in vec4 iM2;
|
|
43
|
+
layout(location = 6) in vec4 iM3;
|
|
44
|
+
`,Wc=`
|
|
45
|
+
const float PI = 3.14159265359;
|
|
46
|
+
vec3 linearToSrgb(vec3 c) {
|
|
47
|
+
c = max(c, vec3(0.0));
|
|
48
|
+
return mix(c * 12.92, 1.055 * pow(c, vec3(1.0 / 2.4)) - 0.055, step(vec3(0.0031308), c));
|
|
49
|
+
}
|
|
50
|
+
vec3 aces(vec3 x) {
|
|
51
|
+
return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
|
|
52
|
+
}
|
|
53
|
+
`,Gc=e=>`#version 300 es
|
|
54
|
+
precision highp float;
|
|
55
|
+
${Vc}
|
|
56
|
+
${Uc}
|
|
57
|
+
out vec3 vWorld;
|
|
58
|
+
out vec3 vNormal;
|
|
59
|
+
${e?`out vec2 vUv;`:``}
|
|
60
|
+
void main() {
|
|
61
|
+
mat4 M = mat4(iM0, iM1, iM2, iM3);
|
|
62
|
+
vec4 wp = M * vec4(aPosition, 1.0);
|
|
63
|
+
vec3 c0 = iM0.xyz;
|
|
64
|
+
vec3 c1 = iM1.xyz;
|
|
65
|
+
vec3 c2 = iM2.xyz;
|
|
66
|
+
mat3 cof = mat3(cross(c1, c2), cross(c2, c0), cross(c0, c1));
|
|
67
|
+
float det = dot(c0, cross(c1, c2));
|
|
68
|
+
vNormal = cof * aNormal * (det < 0.0 ? -1.0 : 1.0);
|
|
69
|
+
vWorld = wp.xyz;
|
|
70
|
+
${e?`vUv = aUv;`:``}
|
|
71
|
+
gl_Position = uViewProj * wp;
|
|
72
|
+
}
|
|
73
|
+
`,Kc=227;function qc(e,t){let n=t=>(e&t)!==0,r=n(1),i=n(2),a=n(32),o=n(64),s=n(128),c=r||i||a||o||s,l=n(256),u=e=>l?`textureGrad(${e}, uv, duv1, duv2)`:`texture(${e}, uv)`,d=[];return d.push(`#version 300 es
|
|
74
|
+
precision highp float;
|
|
75
|
+
precision highp int;
|
|
76
|
+
${Vc}
|
|
77
|
+
${Hc}`),r&&d.push(`uniform sampler2D uMap;`),i&&d.push(`uniform sampler2D uNormalMap;`),a&&d.push(`uniform sampler2D uMrMap;`),o&&d.push(`uniform sampler2D uOcclusionMap;`),s&&d.push(`uniform sampler2D uEmissiveMap;`),d.push(`in vec3 vWorld;
|
|
78
|
+
in vec3 vNormal;
|
|
79
|
+
${c?`in vec2 vUv;`:``}
|
|
80
|
+
out vec4 outColor;
|
|
81
|
+
${Wc}`),n(8)||d.push(Jc),d.push(`void main() {`),c&&d.push(` vec2 uv = vUv * mUv.xy;`),(c&&l||i)&&d.push(` vec2 duv1 = dFdx(uv);`,` vec2 duv2 = dFdy(uv);`),d.push(` vec4 base = mBaseColor;`),r&&d.push(` base *= ${u(`uMap`)};`),n(256)&&d.push(` if (base.a < mParams.w) discard;`),d.push(` vec3 emitted = mEmissive.rgb;`),s&&d.push(` emitted *= ${u(`uEmissiveMap`)}.rgb;`),n(8)?(d.push(` outColor = vec4(linearToSrgb(base.rgb + emitted), base.a);`,`}`),d.join(`
|
|
82
|
+
`)):(d.push(` vec3 N = normalize(vNormal);`),n(4)&&d.push(` N = gl_FrontFacing ? N : -N;`),i&&d.push(` vec3 dp1 = dFdx(vWorld);
|
|
83
|
+
vec3 dp2 = dFdy(vWorld);
|
|
84
|
+
vec3 dp2perp = cross(dp2, N);
|
|
85
|
+
vec3 dp1perp = cross(N, dp1);
|
|
86
|
+
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
|
|
87
|
+
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
|
|
88
|
+
float invmax = inversesqrt(max(max(dot(T, T), dot(B, B)), 1e-20));
|
|
89
|
+
vec3 n = ${u(`uNormalMap`)}.xyz * 2.0 - 1.0;
|
|
90
|
+
n.xy *= mEmissive.w;
|
|
91
|
+
N = normalize(mat3(T * invmax, B * invmax, N) * n);`),d.push(` vec3 V = normalize(uCameraPos.xyz - vWorld);
|
|
92
|
+
float NdotV = max(dot(N, V), 1e-4);
|
|
93
|
+
float rough = clamp(mParams.y, 0.045, 1.0);
|
|
94
|
+
float metal = clamp(mParams.x, 0.0, 1.0);`),a&&d.push(` vec4 mr = ${u(`uMrMap`)};
|
|
95
|
+
rough = clamp(rough * mr.g, 0.045, 1.0);
|
|
96
|
+
metal = clamp(metal * mr.b, 0.0, 1.0);`),d.push(` float a = rough * rough;
|
|
97
|
+
vec3 f0 = mix(vec3(0.04), base.rgb, metal);
|
|
98
|
+
vec3 diffuse = base.rgb * (1.0 - metal);
|
|
99
|
+
vec3 color = vec3(0.0);
|
|
100
|
+
vec3 ambient = vec3(0.0);`),t&&t.split(`,`).forEach((e,t)=>d.push(Yc(Number(e),t))),d.push(` float envI = uSky.w;
|
|
101
|
+
vec3 hemi = mix(uGround.rgb, uSky.rgb, N.y * 0.5 + 0.5) * envI + ambient;
|
|
102
|
+
vec3 R = reflect(-V, N);
|
|
103
|
+
vec3 envSpec = mix(uGround.rgb, uSky.rgb, smoothstep(-0.25 - rough, 0.25 + rough, R.y)) * envI;
|
|
104
|
+
envSpec = mix(envSpec, hemi, rough * rough);`),o&&d.push(` float ao = mix(1.0, ${u(`uOcclusionMap`)}.r, mUv.z);
|
|
105
|
+
hemi *= ao;
|
|
106
|
+
envSpec *= ao;`),d.push(` color += diffuse * hemi + envSpec * envBRDF(f0, rough, NdotV);
|
|
107
|
+
color += emitted;
|
|
108
|
+
color *= uGround.w;
|
|
109
|
+
outColor = vec4(linearToSrgb(aces(color)), base.a);
|
|
110
|
+
}`),d.join(`
|
|
111
|
+
`))}var Jc=`
|
|
112
|
+
float D_GGX(float NdotH, float a) {
|
|
113
|
+
float a2 = a * a;
|
|
114
|
+
float d = NdotH * NdotH * (a2 - 1.0) + 1.0;
|
|
115
|
+
return a2 / (PI * d * d);
|
|
116
|
+
}
|
|
117
|
+
float V_Smith(float NdotV, float NdotL, float a) {
|
|
118
|
+
float a2 = a * a;
|
|
119
|
+
float gv = NdotL * sqrt(NdotV * NdotV * (1.0 - a2) + a2);
|
|
120
|
+
float gl = NdotV * sqrt(NdotL * NdotL * (1.0 - a2) + a2);
|
|
121
|
+
return 0.5 / max(gv + gl, 1e-5);
|
|
122
|
+
}
|
|
123
|
+
vec3 F_Schlick(vec3 f0, float VdotH) {
|
|
124
|
+
return f0 + (vec3(1.0) - f0) * pow(1.0 - VdotH, 5.0);
|
|
125
|
+
}
|
|
126
|
+
vec3 envBRDF(vec3 f0, float roughness, float NdotV) {
|
|
127
|
+
const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
|
|
128
|
+
const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
|
|
129
|
+
vec4 r = roughness * c0 + c1;
|
|
130
|
+
float a004 = min(r.x * r.x, exp2(-9.28 * NdotV)) * r.x + r.y;
|
|
131
|
+
vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw;
|
|
132
|
+
return f0 * AB.x + AB.y;
|
|
133
|
+
}
|
|
134
|
+
// one light's contribution, zero when it is behind the surface
|
|
135
|
+
vec3 shade(vec3 N, vec3 V, vec3 L, vec3 radiance, float NdotV, vec3 f0, vec3 diffuse, float a) {
|
|
136
|
+
float NdotL = dot(N, L);
|
|
137
|
+
if (NdotL <= 0.0) return vec3(0.0);
|
|
138
|
+
vec3 H = normalize(V + L);
|
|
139
|
+
float NdotH = max(dot(N, H), 0.0);
|
|
140
|
+
float VdotH = max(dot(V, H), 0.0);
|
|
141
|
+
vec3 F = F_Schlick(f0, VdotH);
|
|
142
|
+
vec3 spec = D_GGX(NdotH, a) * V_Smith(NdotV, NdotL, a) * F;
|
|
143
|
+
vec3 kd = (vec3(1.0) - F) * diffuse / PI;
|
|
144
|
+
return (kd + spec) * radiance * NdotL;
|
|
145
|
+
}
|
|
146
|
+
`;function Yc(e,t){return e===3?` ambient += uLightColor[${t}].rgb;`:e===4?` ambient += mix(uLightExtra[${t}].yzw, uLightColor[${t}].rgb, N.y * 0.5 + 0.5);`:e===0?` color += shade(N, V, -uLightDir[${t}].xyz, uLightColor[${t}].rgb * PI, NdotV, f0, diffuse, a);`:` {
|
|
147
|
+
vec3 Lv = uLightPos[${t}].xyz - vWorld;
|
|
148
|
+
float d = length(Lv);
|
|
149
|
+
vec3 L = Lv / max(d, 1e-5);
|
|
150
|
+
float att = 1.0 / max(d * d, 1e-4);
|
|
151
|
+
float range = uLightDir[${t}].w;
|
|
152
|
+
if (range > 0.0) {
|
|
153
|
+
float x = d / range;
|
|
154
|
+
float w = clamp(1.0 - x * x * x * x, 0.0, 1.0);
|
|
155
|
+
att *= w * w;
|
|
156
|
+
}${e===2?`\n att *= smoothstep(uLightColor[${t}].w, uLightExtra[${t}].x, dot(-L, uLightDir[${t}].xyz));`:``}
|
|
157
|
+
color += shade(N, V, L, uLightColor[${t}].rgb * PI * att, NdotV, f0, diffuse, a);
|
|
158
|
+
}`}var Xc=`#version 300 es
|
|
159
|
+
precision highp float;
|
|
160
|
+
${Vc}
|
|
161
|
+
${Uc}
|
|
162
|
+
void main() {
|
|
163
|
+
mat4 M = mat4(iM0, iM1, iM2, iM3);
|
|
164
|
+
vec4 wp = M * vec4(aPosition, 1.0);
|
|
165
|
+
// pull lines slightly toward the camera so they win the depth test against
|
|
166
|
+
// the surfaces they outline (a relative offset works at every distance)
|
|
167
|
+
wp.xyz = mix(wp.xyz, uCameraPos.xyz, uParams.z);
|
|
168
|
+
gl_Position = uViewProj * wp;
|
|
169
|
+
}
|
|
170
|
+
`,Zc=`#version 300 es
|
|
171
|
+
precision highp float;
|
|
172
|
+
${Vc}
|
|
173
|
+
${Uc}
|
|
174
|
+
void main() {
|
|
175
|
+
mat4 M = mat4(iM0, iM1, iM2, iM3);
|
|
176
|
+
vec4 wp = M * vec4(aPosition, 1.0);
|
|
177
|
+
vec3 c0 = iM0.xyz;
|
|
178
|
+
vec3 c1 = iM1.xyz;
|
|
179
|
+
vec3 c2 = iM2.xyz;
|
|
180
|
+
mat3 cof = mat3(cross(c1, c2), cross(c2, c0), cross(c0, c1));
|
|
181
|
+
float det = dot(c0, cross(c1, c2));
|
|
182
|
+
vec3 n = normalize(cof * aNormal * (det < 0.0 ? -1.0 : 1.0));
|
|
183
|
+
wp.xyz += n * aUv.x * uParams.y;
|
|
184
|
+
wp.xyz = mix(wp.xyz, uCameraPos.xyz, uParams.z);
|
|
185
|
+
gl_Position = uViewProj * wp;
|
|
186
|
+
}
|
|
187
|
+
`,Qc=`#version 300 es
|
|
188
|
+
precision highp float;
|
|
189
|
+
precision highp int;
|
|
190
|
+
${Vc}
|
|
191
|
+
${Hc}
|
|
192
|
+
out vec4 outColor;
|
|
193
|
+
${Wc}
|
|
194
|
+
void main() {
|
|
195
|
+
int flags = int(mParams.z + 0.5);
|
|
196
|
+
if ((flags & 16) != 0) {
|
|
197
|
+
outColor = mOverlay;
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
outColor = vec4(linearToSrgb(mBaseColor.rgb + mEmissive.rgb), mBaseColor.a);
|
|
201
|
+
}
|
|
202
|
+
`,$c=8;function el(e,t,n,r){let i=e.createShader(t);if(e.shaderSource(i,n),e.compileShader(i),!e.getShaderParameter(i,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(i);throw e.deleteShader(i),Error(`WebGL2 ${r} shader compile error: ${t}`)}return i}function tl(e,t,n,r){let i=e.createProgram();if(e.attachShader(i,el(e,e.VERTEX_SHADER,t,r+` vertex`)),e.attachShader(i,el(e,e.FRAGMENT_SHADER,n,r+` fragment`)),e.linkProgram(i),!e.getProgramParameter(i,e.LINK_STATUS))throw Error(`WebGL2 ${r} link error: ${e.getProgramInfoLog(i)}`);let a=e.getUniformBlockIndex(i,`Frame`);a!==e.INVALID_INDEX&&e.uniformBlockBinding(i,a,0);let o=e.getUniformBlockIndex(i,`Material`);o!==e.INVALID_INDEX&&e.uniformBlockBinding(i,o,1),e.useProgram(i);let s=(t,n)=>{let r=e.getUniformLocation(i,t);r&&e.uniform1i(r,n)};return s(`uMap`,0),s(`uNormalMap`,1),s(`uMrMap`,2),s(`uOcclusionMap`,3),s(`uEmissiveMap`,4),i}var nl=class{constructor(e){this.canvas=e,this.kind=`webgl2`,this.zeroToOne=!1,this.gl=null,this.vertexCapacity=0,this.indexCapacity=0,this.instanceCapacity=0,this.poolGeneration=-1,this.materialUbos=new Map,this.overlayUbos=new Map,this.gpuBytes=0,this.lost=!1,this.resourceEpoch=0,this.info=``}async init(){let e=this.canvas.getContext(`webgl2`,{antialias:!0,alpha:!1,depth:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!1,powerPreference:`high-performance`});if(!e)throw Error(`WebGL2 is not available in this browser.`);if(this.gl=e,e.isContextLost()){let t=e.getExtension(`WEBGL_lose_context`);if(!t||(await new Promise((e,n)=>{let r=t=>{this.canvas.removeEventListener(`webglcontextrestored`,i),this.canvas.removeEventListener(`webglcontextlost`,a),t?n(t):e()},i=()=>r(),a=()=>r(Error(`WebGL2 context is lost.`));this.canvas.addEventListener(`webglcontextrestored`,i),this.canvas.addEventListener(`webglcontextlost`,a);try{t.restoreContext()}catch(e){r(e)}}),e.isContextLost()))throw Error(`WebGL2 context is lost.`)}this._onLost=e=>{e.preventDefault(),this.lost=!0},this._onRestored=()=>{try{this.rebuildResources(),this.lost=!1,this.resourceEpoch++}catch{this.lost=!0}},this.canvas.addEventListener(`webglcontextlost`,this._onLost),this.canvas.addEventListener(`webglcontextrestored`,this._onRestored),this.rebuildResources()}rebuildResources(){let e=this.gl;`drawingBufferColorSpace`in e&&(e.drawingBufferColorSpace=`srgb`);let t=e.getParameter(e.SAMPLES)||0;this.direct=t>=4,this.samples=this.direct?t:Math.min(4,e.getParameter(e.MAX_SAMPLES)||0),this.direct?this.fbo=this.colorRb=this.depthRb=this.resolveFbo=this.resolveRb=null:(this.fbo=e.createFramebuffer(),this.colorRb=e.createRenderbuffer(),this.depthRb=e.createRenderbuffer(),this.resolveFbo=e.createFramebuffer(),this.resolveRb=e.createRenderbuffer()),this.targetSize=[0,0];let n=e.getExtension(`WEBGL_debug_renderer_info`);this.info=n?e.getParameter(n.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER),this.aniso=e.getExtension(`EXT_texture_filter_anisotropic`),this.poolGeneration=-1,this.vertexCapacity=0,this.indexCapacity=0,this.instanceCapacity=0,this.materialUbos=new Map,this.overlayUbos=new Map,this.meshPrograms=new Map,this.gpuBytes=0,this.lineProgram=tl(e,Xc,Qc,`line`),this.normalProgram=tl(e,Zc,Qc,`normals`),this.vertexBuffer=e.createBuffer(),this.indexBuffer=e.createBuffer(),this.instanceBuffer=e.createBuffer(),this.frameUbo=e.createBuffer(),e.bindBuffer(e.UNIFORM_BUFFER,this.frameUbo),e.bufferData(e.UNIFORM_BUFFER,Nc,e.DYNAMIC_DRAW),this.vao=e.createVertexArray(),e.bindVertexArray(this.vao),e.bindBuffer(e.ARRAY_BUFFER,this.vertexBuffer);for(let t=0;t<3;t++)e.enableVertexAttribArray(t);this.bindVertexAttributes(),e.bindBuffer(e.ARRAY_BUFFER,this.instanceBuffer);for(let t=0;t<4;t++)e.enableVertexAttribArray(3+t),e.vertexAttribPointer(3+t,4,e.FLOAT,!1,64,t*16),e.vertexAttribDivisor(3+t,1);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,this.indexBuffer),e.bindVertexArray(null),this.whiteTex=this.createTexture({width:1,height:1,data:new Uint8Array([255,255,255,255])},!0),this.flatNormalTex=this.createTexture({width:1,height:1,data:new Uint8Array([128,128,255,255])},!1),this.matData=new Float32Array(20)}createTexture(e,t){let n=this.gl,r=n.createTexture();return n.bindTexture(n.TEXTURE_2D,r),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,!1),n.texImage2D(n.TEXTURE_2D,0,t?n.SRGB8_ALPHA8:n.RGBA8,e.width,e.height,0,n.RGBA,n.UNSIGNED_BYTE,e.data instanceof Uint8Array?e.data:new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength)),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.REPEAT),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.REPEAT),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.LINEAR),e.width>1?(n.generateMipmap(n.TEXTURE_2D),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR_MIPMAP_LINEAR),this.aniso&&n.texParameterf(n.TEXTURE_2D,this.aniso.TEXTURE_MAX_ANISOTROPY_EXT,$c)):n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR),this.gpuBytes+=e.width*e.height*4*(e.width>1?1.33:1),r}destroyTexture(e){this.gl.deleteTexture(e)}bindVertexAttributes(){let e=this.gl;e.vertexAttribPointer(0,3,e.FLOAT,!1,32,0),e.vertexAttribPointer(1,3,e.FLOAT,!1,32,12),e.vertexAttribPointer(2,2,e.FLOAT,!1,32,24)}syncPool(e){let t=this.gl,n=e.vertexCapacityBytes,r=e.indexCapacityBytes,i=0;if(e.generation!==this.poolGeneration)t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,n,t.STATIC_DRAW),t.bindVertexArray(this.vao),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,r,t.STATIC_DRAW),t.bindVertexArray(null),this.vertexCapacity=n,this.indexCapacity=r,this.poolGeneration=e.generation,e.uploadedVertices=0,e.uploadedIndices=0;else{if(n>this.vertexCapacity){let r=this.vertexBuffer,i=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,i),t.bufferData(t.ARRAY_BUFFER,n,t.STATIC_DRAW),t.bindVertexArray(this.vao),this.bindVertexAttributes(),t.bindVertexArray(null),this.copyBuffer(r,i,e.uploadedVertices*32),t.deleteBuffer(r),this.vertexBuffer=i,this.vertexCapacity=n}if(r>this.indexCapacity){let n=this.indexBuffer,i=t.createBuffer();t.bindVertexArray(this.vao),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,i),t.bufferData(t.ELEMENT_ARRAY_BUFFER,r,t.STATIC_DRAW),t.bindVertexArray(null),this.copyBuffer(n,i,e.uploadedIndices*4),t.deleteBuffer(n),this.indexBuffer=i,this.indexCapacity=r}}let a=e.pending();return a.vertexEnd>a.vertexStart&&(t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),e.forEachVertices(a.vertexStart,a.vertexEnd,(e,n)=>{t.bufferSubData(t.ARRAY_BUFFER,e*32,n),i+=n.byteLength})),a.indexEnd>a.indexStart&&(t.bindVertexArray(this.vao),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),e.forEachIndices(a.indexStart,a.indexEnd,(e,n)=>{t.bufferSubData(t.ELEMENT_ARRAY_BUFFER,e*4,n),i+=n.byteLength}),t.bindVertexArray(null)),e.markUploaded(),i}copyBuffer(e,t,n){if(n<=0)return;let r=this.gl;r.bindBuffer(r.COPY_READ_BUFFER,e),r.bindBuffer(r.COPY_WRITE_BUFFER,t),r.copyBufferSubData(r.COPY_READ_BUFFER,r.COPY_WRITE_BUFFER,0,0,n),r.bindBuffer(r.COPY_READ_BUFFER,null),r.bindBuffer(r.COPY_WRITE_BUFFER,null)}uploadInstances(e,t){let n=this.gl,r=t*64;if(n.bindBuffer(n.ARRAY_BUFFER,this.instanceBuffer),r>this.instanceCapacity){let e=Math.max(this.instanceCapacity,16384);for(;e<r;)e*=2;n.bufferData(n.ARRAY_BUFFER,e,n.DYNAMIC_DRAW),this.instanceCapacity=e}return r&&n.bufferSubData(n.ARRAY_BUFFER,0,e.subarray(0,t*16)),r}readyTexture(e,t){return e&&e.status===`ready`&&!e.gpu&&(e.gpu=this.createTexture(e.pixels,t)),e&&e.gpu?e.gpu:null}materialBinding(e,t){let n=this.gl,r=this.materialUbos.get(e);r||(r={ubo:n.createBuffer(),map:null,normalMap:null,mrMap:null,occlusionMap:null,emissiveMap:null,key:``},this.materialUbos.set(e,r));let i=this.readyTexture(e.map?t.get(e.map,`color`):null,!0),a=this.readyTexture(e.normalMap?t.get(e.normalMap,`normal`):null,!1),o=this.readyTexture(e.metallicRoughnessMap?t.get(e.metallicRoughnessMap,`linear`):null,!1),s=this.readyTexture(e.occlusionMap?t.get(e.occlusionMap,`linear`):null,!1),c=this.readyTexture(e.emissiveMap?t.get(e.emissiveMap,`color`):null,!0),l=!!i,u=!!a,d=!!o,f=!!s,p=!!c,m=`${l}|${u}|${d}|${f}|${p}`;return r.key!==m&&(zc(this.matData,e,{hasMap:l,hasNormalMap:u,hasMrMap:d,hasOcclusionMap:f,hasEmissiveMap:p,doubleSided:e.doubleSided}),n.bindBuffer(n.UNIFORM_BUFFER,r.ubo),n.bufferData(n.UNIFORM_BUFFER,this.matData,n.STATIC_DRAW),r.key=m,r.flags=this.matData[10]),r.map=i||this.whiteTex,r.normalMap=a||this.flatNormalTex,r.mrMap=o||this.whiteTex,r.occlusionMap=s||this.whiteTex,r.emissiveMap=c||this.whiteTex,r}doubleSidedBinding(e,t){let n=this.materialBinding(e,t),r=n.doubleSidedUbo,i=n.key;if(!r||n.dsKey!==i){r||=n.doubleSidedUbo=this.gl.createBuffer();let t=n.map!==this.whiteTex,a=n.normalMap!==this.flatNormalTex,o=n.mrMap!==this.whiteTex,s=n.occlusionMap!==this.whiteTex,c=n.emissiveMap!==this.whiteTex;zc(this.matData,e,{hasMap:t,hasNormalMap:a,hasMrMap:o,hasOcclusionMap:s,hasEmissiveMap:c,doubleSided:!0}),this.gl.bindBuffer(this.gl.UNIFORM_BUFFER,r),this.gl.bufferData(this.gl.UNIFORM_BUFFER,this.matData,this.gl.STATIC_DRAW),n.dsKey=i,n.dsFlags=this.matData[10]}let a=n.dsBinding||={};return a.ubo=r,a.flags=n.dsFlags,a.map=n.map,a.normalMap=n.normalMap,a.mrMap=n.mrMap,a.occlusionMap=n.occlusionMap,a.emissiveMap=n.emissiveMap,a}overlayUbo(e,t){let n=this.overlayUbos.get(e);return n||(n=this.gl.createBuffer(),this.overlayUbos.set(e,n),Bc(this.matData,t),this.gl.bindBuffer(this.gl.UNIFORM_BUFFER,n),this.gl.bufferData(this.gl.UNIFORM_BUFFER,this.matData,this.gl.STATIC_DRAW)),n}releaseMaterials(e){for(let[t,n]of this.materialUbos)e.has(t)||(this.gl.deleteBuffer(n.ubo),n.doubleSidedUbo&&this.gl.deleteBuffer(n.doubleSidedUbo),this.materialUbos.delete(t))}setInstanceOffset(e){let t=this.gl;t.bindBuffer(t.ARRAY_BUFFER,this.instanceBuffer);let n=e*64;for(let e=0;e<4;e++)t.vertexAttribPointer(3+e,4,t.FLOAT,!1,64,n+e*16)}resize(e,t){(this.canvas.width!==e||this.canvas.height!==t)&&(this.canvas.width=e,this.canvas.height=t)}get caps(){let e=this.gl;return{msaaSamples:this.samples,anisotropy:this.aniso?Math.min($c,e.getParameter(this.aniso.MAX_TEXTURE_MAX_ANISOTROPY_EXT)):1,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),colorSpace:e.drawingBufferColorSpace||`srgb`}}meshProgram(e,t){let n=`${e}|${t}`,r=this.meshPrograms.get(n);return r||(r=tl(this.gl,Gc((e&Kc)!==0),qc(e,t),`mesh`),this.meshPrograms.set(n,r)),r}ensureTarget(){if(this.direct)return;let e=this.gl,t=this.canvas.width,n=this.canvas.height;(this.targetSize[0]!==t||this.targetSize[1]!==n)&&(this.targetSize=[t,n],e.bindRenderbuffer(e.RENDERBUFFER,this.colorRb),e.renderbufferStorageMultisample(e.RENDERBUFFER,this.samples,e.RGBA8,t,n),e.bindRenderbuffer(e.RENDERBUFFER,this.depthRb),e.renderbufferStorageMultisample(e.RENDERBUFFER,this.samples,e.DEPTH_COMPONENT24,t,n),e.bindRenderbuffer(e.RENDERBUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,this.fbo),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.RENDERBUFFER,this.colorRb),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,this.depthRb),e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindRenderbuffer(e.RENDERBUFFER,this.resolveRb),e.renderbufferStorage(e.RENDERBUFFER,e.RGBA8,t,n),e.bindRenderbuffer(e.RENDERBUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,this.resolveFbo),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.RENDERBUFFER,this.resolveRb),e.bindFramebuffer(e.FRAMEBUFFER,null))}present(e,t){if(this.direct)return;let n=this.gl,r=(r,i)=>{n.bindFramebuffer(n.READ_FRAMEBUFFER,r),n.bindFramebuffer(n.DRAW_FRAMEBUFFER,i),n.blitFramebuffer(0,0,e,t,0,0,e,t,n.COLOR_BUFFER_BIT,n.NEAREST)};r(this.fbo,this.resolveFbo),r(this.resolveFbo,null),n.bindFramebuffer(n.FRAMEBUFFER,null)}render(e,t,n){let r=this.gl;if(this.lost)return;let i=this.canvas.width,a=this.canvas.height;this.ensureTarget(),r.bindFramebuffer(r.FRAMEBUFFER,this.direct?null:this.fbo),r.viewport(0,0,i,a),r.clearColor(n.background[0],n.background[1],n.background[2],1),r.clearDepth(1),r.depthMask(!0),r.clear(r.COLOR_BUFFER_BIT|r.DEPTH_BUFFER_BIT),r.enable(r.DEPTH_TEST),r.depthFunc(r.LEQUAL),r.disable(r.BLEND),r.bindBuffer(r.UNIFORM_BUFFER,this.frameUbo),r.bufferSubData(r.UNIFORM_BUFFER,0,t),r.bindBufferBase(r.UNIFORM_BUFFER,0,this.frameUbo),this.uploadInstances(e.instanceData,e.instanceCount),r.bindVertexArray(this.vao);let o=Rc(t),s=null,c=e=>{s!==e&&(r.useProgram(e),s=e)},l=!1,u=-1,d=null;r.cullFace(r.BACK);for(let t of e.batches){let e=t.kind===`lines`,i=t.doubleSided&&!t.material.doubleSided?this.doubleSidedBinding(t.material,n.textures):this.materialBinding(t.material,n.textures);c(e?this.lineProgram:this.meshProgram(i.flags,o));let a=t.doubleSided||e?0:t.mirrored?2:1;a!==u&&(a===0?r.disable(r.CULL_FACE):(u<=0&&r.enable(r.CULL_FACE),r.frontFace(a===2?r.CW:r.CCW)),u=a),t.transparent!==l&&(l=t.transparent,l?(r.enable(r.BLEND),r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.depthMask(!1)):(r.disable(r.BLEND),r.depthMask(!0))),i!==d&&(d=i,r.bindBufferBase(r.UNIFORM_BUFFER,1,i.ubo),r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,i.map),r.activeTexture(r.TEXTURE1),r.bindTexture(r.TEXTURE_2D,i.normalMap),r.activeTexture(r.TEXTURE2),r.bindTexture(r.TEXTURE_2D,i.mrMap),r.activeTexture(r.TEXTURE3),r.bindTexture(r.TEXTURE_2D,i.occlusionMap),r.activeTexture(r.TEXTURE4),r.bindTexture(r.TEXTURE_2D,i.emissiveMap)),this.setInstanceOffset(t.firstInstance),r.drawElementsInstanced(e?r.LINES:r.TRIANGLES,t.range.indexCount,r.UNSIGNED_INT,t.range.firstIndex*4,t.count)}let f=e.overlays;r.disable(r.CULL_FACE),r.enable(r.BLEND),r.blendFunc(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA),r.depthMask(!1);let p=(e,t,n,i)=>{if(i.length){c(e),r.bindBufferBase(r.UNIFORM_BUFFER,1,this.overlayUbo(t,n));for(let e of i)this.setInstanceOffset(e.firstInstance),r.drawElementsInstanced(r.LINES,e.range.indexCount,r.UNSIGNED_INT,e.range.firstIndex*4,e.count)}};p(this.lineProgram,`wireframe`,n.overlayColors.wireframe,f.wireframe),p(this.normalProgram,`normals`,n.overlayColors.normals,f.normals),f.bbox&&f.bbox.count&&p(this.lineProgram,`bbox`,n.overlayColors.bbox,[{...f.bbox,range:n.cubeRange}]),f.selection&&f.selection.count&&(r.disable(r.DEPTH_TEST),p(this.lineProgram,`selection`,n.overlayColors.selection,[{...f.selection,range:n.cubeRange}]),r.enable(r.DEPTH_TEST)),r.depthMask(!0),r.disable(r.BLEND),r.bindVertexArray(null),this.present(i,a)}async finish(){this.gl.finish();let e=new Uint8Array(4);this.gl.readPixels(0,0,1,1,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e)}dispose(){let e=this.gl;if(e&&(this._onLost&&this.canvas.removeEventListener(`webglcontextlost`,this._onLost),this._onRestored&&this.canvas.removeEventListener(`webglcontextrestored`,this._onRestored),this._onLost=this._onRestored=null,!e.isContextLost())){e.deleteBuffer(this.vertexBuffer),e.deleteBuffer(this.indexBuffer),e.deleteBuffer(this.instanceBuffer),e.deleteBuffer(this.frameUbo);for(let t of this.materialUbos.values())e.deleteBuffer(t.ubo),t.doubleSidedUbo&&e.deleteBuffer(t.doubleSidedUbo);for(let t of this.overlayUbos.values())e.deleteBuffer(t);for(let t of this.meshPrograms.values())e.deleteProgram(t);this.lineProgram&&e.deleteProgram(this.lineProgram),this.normalProgram&&e.deleteProgram(this.normalProgram),this.whiteTex&&e.deleteTexture(this.whiteTex),this.flatNormalTex&&e.deleteTexture(this.flatNormalTex),e.deleteVertexArray(this.vao),this.direct||(e.deleteFramebuffer(this.fbo),e.deleteRenderbuffer(this.colorRb),e.deleteRenderbuffer(this.depthRb),e.deleteFramebuffer(this.resolveFbo),e.deleteRenderbuffer(this.resolveRb))}}},rl=`
|
|
203
|
+
struct Frame {
|
|
204
|
+
viewProj: mat4x4f,
|
|
205
|
+
view: mat4x4f,
|
|
206
|
+
cameraPos: vec4f,
|
|
207
|
+
sky: vec4f,
|
|
208
|
+
ground: vec4f,
|
|
209
|
+
params: vec4f,
|
|
210
|
+
lightPos: array<vec4f, 16>,
|
|
211
|
+
lightDir: array<vec4f, 16>,
|
|
212
|
+
lightColor: array<vec4f, 16>,
|
|
213
|
+
lightExtra: array<vec4f, 16>,
|
|
214
|
+
};
|
|
215
|
+
struct Material {
|
|
216
|
+
baseColor: vec4f,
|
|
217
|
+
emissive: vec4f,
|
|
218
|
+
params: vec4f,
|
|
219
|
+
uvScale: vec4f,
|
|
220
|
+
overlay: vec4f,
|
|
221
|
+
};
|
|
222
|
+
@group(0) @binding(0) var<uniform> frame: Frame;
|
|
223
|
+
@group(1) @binding(0) var<uniform> material: Material;
|
|
224
|
+
@group(1) @binding(1) var samp: sampler;
|
|
225
|
+
@group(1) @binding(2) var baseTex: texture_2d<f32>;
|
|
226
|
+
@group(1) @binding(3) var normalTex: texture_2d<f32>;
|
|
227
|
+
@group(1) @binding(4) var mrTex: texture_2d<f32>;
|
|
228
|
+
@group(1) @binding(5) var occlusionTex: texture_2d<f32>;
|
|
229
|
+
@group(1) @binding(6) var emissiveTex: texture_2d<f32>;
|
|
230
|
+
|
|
231
|
+
struct VSIn {
|
|
232
|
+
@location(0) position: vec3f,
|
|
233
|
+
@location(1) normal: vec3f,
|
|
234
|
+
@location(2) uv: vec2f,
|
|
235
|
+
@location(3) m0: vec4f,
|
|
236
|
+
@location(4) m1: vec4f,
|
|
237
|
+
@location(5) m2: vec4f,
|
|
238
|
+
@location(6) m3: vec4f,
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
const PI = 3.14159265359;
|
|
242
|
+
|
|
243
|
+
fn linearToSrgb(c0: vec3f) -> vec3f {
|
|
244
|
+
let c = max(c0, vec3f(0.0));
|
|
245
|
+
return select(1.055 * pow(c, vec3f(1.0 / 2.4)) - 0.055, c * 12.92, c <= vec3f(0.0031308));
|
|
246
|
+
}
|
|
247
|
+
fn aces(x: vec3f) -> vec3f {
|
|
248
|
+
return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), vec3f(0.0), vec3f(1.0));
|
|
249
|
+
}
|
|
250
|
+
fn worldNormal(inp: VSIn) -> vec3f {
|
|
251
|
+
let c0 = inp.m0.xyz;
|
|
252
|
+
let c1 = inp.m1.xyz;
|
|
253
|
+
let c2 = inp.m2.xyz;
|
|
254
|
+
let cof = mat3x3f(cross(c1, c2), cross(c2, c0), cross(c0, c1));
|
|
255
|
+
let det = dot(c0, cross(c1, c2));
|
|
256
|
+
return cof * inp.normal * select(1.0, -1.0, det < 0.0);
|
|
257
|
+
}
|
|
258
|
+
`,il=e=>`
|
|
259
|
+
struct VSOut {
|
|
260
|
+
@builtin(position) pos: vec4f,
|
|
261
|
+
@location(0) world: vec3f,
|
|
262
|
+
@location(1) normal: vec3f,
|
|
263
|
+
${e?`@location(2) uv: vec2f,`:``}
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
@vertex
|
|
267
|
+
fn vs_main(inp: VSIn) -> VSOut {
|
|
268
|
+
let M = mat4x4f(inp.m0, inp.m1, inp.m2, inp.m3);
|
|
269
|
+
let wp = M * vec4f(inp.position, 1.0);
|
|
270
|
+
var out: VSOut;
|
|
271
|
+
out.pos = frame.viewProj * wp;
|
|
272
|
+
out.world = wp.xyz;
|
|
273
|
+
out.normal = worldNormal(inp);
|
|
274
|
+
${e?`out.uv = inp.uv;`:``}
|
|
275
|
+
return out;
|
|
276
|
+
}
|
|
277
|
+
`,al=`
|
|
278
|
+
fn D_GGX(NdotH: f32, a: f32) -> f32 {
|
|
279
|
+
let a2 = a * a;
|
|
280
|
+
let d = NdotH * NdotH * (a2 - 1.0) + 1.0;
|
|
281
|
+
return a2 / (PI * d * d);
|
|
282
|
+
}
|
|
283
|
+
fn V_Smith(NdotV: f32, NdotL: f32, a: f32) -> f32 {
|
|
284
|
+
let a2 = a * a;
|
|
285
|
+
let gv = NdotL * sqrt(NdotV * NdotV * (1.0 - a2) + a2);
|
|
286
|
+
let gl = NdotV * sqrt(NdotL * NdotL * (1.0 - a2) + a2);
|
|
287
|
+
return 0.5 / max(gv + gl, 1e-5);
|
|
288
|
+
}
|
|
289
|
+
fn F_Schlick(f0: vec3f, VdotH: f32) -> vec3f {
|
|
290
|
+
return f0 + (vec3f(1.0) - f0) * pow(1.0 - VdotH, 5.0);
|
|
291
|
+
}
|
|
292
|
+
fn envBRDF(f0: vec3f, roughness: f32, NdotV: f32) -> vec3f {
|
|
293
|
+
let c0 = vec4f(-1.0, -0.0275, -0.572, 0.022);
|
|
294
|
+
let c1 = vec4f(1.0, 0.0425, 1.04, -0.04);
|
|
295
|
+
let r = roughness * c0 + c1;
|
|
296
|
+
let a004 = min(r.x * r.x, exp2(-9.28 * NdotV)) * r.x + r.y;
|
|
297
|
+
let AB = vec2f(-1.04, 1.04) * a004 + r.zw;
|
|
298
|
+
return f0 * AB.x + AB.y;
|
|
299
|
+
}
|
|
300
|
+
// one light's contribution, zero when it is behind the surface
|
|
301
|
+
fn shade(N: vec3f, V: vec3f, L: vec3f, radiance: vec3f, NdotV: f32, f0: vec3f, diffuse: vec3f, a: f32) -> vec3f {
|
|
302
|
+
let NdotL = dot(N, L);
|
|
303
|
+
if (NdotL <= 0.0) {
|
|
304
|
+
return vec3f(0.0);
|
|
305
|
+
}
|
|
306
|
+
let H = normalize(V + L);
|
|
307
|
+
let NdotH = max(dot(N, H), 0.0);
|
|
308
|
+
let VdotH = max(dot(V, H), 0.0);
|
|
309
|
+
let F = F_Schlick(f0, VdotH);
|
|
310
|
+
let spec = D_GGX(NdotH, a) * V_Smith(NdotV, NdotL, a) * F;
|
|
311
|
+
let kd = (vec3f(1.0) - F) * diffuse / PI;
|
|
312
|
+
return (kd + spec) * radiance * NdotL;
|
|
313
|
+
}
|
|
314
|
+
`;function ol(e,t){let n=t=>(e&t)!==0,r=n(1),i=n(2),a=n(32),o=n(64),s=n(128),c=r||i||a||o||s,l=n(256),u=e=>l?`textureSampleGrad(${e}, samp, uv, ddx, ddy)`:`textureSample(${e}, samp, uv)`,d=[rl,il(c)];return n(8)||d.push(al),d.push(`@fragment`,`fn fs_main(inp: VSOut, @builtin(front_facing) frontFacing: bool) -> @location(0) vec4f {`),c&&d.push(` let uv = inp.uv * material.uvScale.xy;`),(c&&l||i)&&d.push(` let ddx = dpdx(uv);`,` let ddy = dpdy(uv);`),i&&d.push(` let dp1 = dpdx(inp.world);`,` let dp2 = -dpdy(inp.world);`,` let duv1 = ddx;`,` let duv2 = -ddy;`),d.push(` var base = material.baseColor;`),r&&d.push(` base = base * ${u(`baseTex`)};`),l&&d.push(` if (base.a < material.params.w) {`,` discard;`,` }`),d.push(` var emitted = material.emissive.rgb;`),s&&d.push(` emitted = emitted * ${u(`emissiveTex`)}.rgb;`),n(8)?(d.push(` return vec4f(linearToSrgb(base.rgb + emitted), base.a);`,`}`),d.join(`
|
|
315
|
+
`)):(d.push(` var N = normalize(inp.normal);`),n(4)&&d.push(` N = select(-N, N, frontFacing);`),i&&d.push(` let dp2perp = cross(dp2, N);
|
|
316
|
+
let dp1perp = cross(N, dp1);
|
|
317
|
+
let T = dp2perp * duv1.x + dp1perp * duv2.x;
|
|
318
|
+
let B = dp2perp * duv1.y + dp1perp * duv2.y;
|
|
319
|
+
let invmax = inverseSqrt(max(max(dot(T, T), dot(B, B)), 1e-20));
|
|
320
|
+
let n0 = ${u(`normalTex`)}.xyz * 2.0 - 1.0;
|
|
321
|
+
let n = vec3f(n0.xy * material.emissive.w, n0.z);
|
|
322
|
+
N = normalize(mat3x3f(T * invmax, B * invmax, N) * n);`),d.push(` let V = normalize(frame.cameraPos.xyz - inp.world);
|
|
323
|
+
let NdotV = max(dot(N, V), 1e-4);
|
|
324
|
+
var rough = clamp(material.params.y, 0.045, 1.0);
|
|
325
|
+
var metal = clamp(material.params.x, 0.0, 1.0);`),a&&d.push(` let mr = ${u(`mrTex`)};
|
|
326
|
+
rough = clamp(rough * mr.g, 0.045, 1.0);
|
|
327
|
+
metal = clamp(metal * mr.b, 0.0, 1.0);`),d.push(` let a = rough * rough;
|
|
328
|
+
let f0 = mix(vec3f(0.04), base.rgb, metal);
|
|
329
|
+
let diffuse = base.rgb * (1.0 - metal);
|
|
330
|
+
var color = vec3f(0.0);
|
|
331
|
+
var ambient = vec3f(0.0);`),t&&t.split(`,`).forEach((e,t)=>d.push(sl(Number(e),t))),d.push(` let envI = frame.sky.w;
|
|
332
|
+
var hemi = mix(frame.ground.rgb, frame.sky.rgb, N.y * 0.5 + 0.5) * envI + ambient;
|
|
333
|
+
let R = reflect(-V, N);
|
|
334
|
+
var envSpec = mix(frame.ground.rgb, frame.sky.rgb, smoothstep(-0.25 - rough, 0.25 + rough, R.y)) * envI;
|
|
335
|
+
envSpec = mix(envSpec, hemi, rough * rough);`),o&&d.push(` let ao = mix(1.0, ${u(`occlusionTex`)}.r, material.uvScale.z);
|
|
336
|
+
hemi = hemi * ao;
|
|
337
|
+
envSpec = envSpec * ao;`),d.push(` color = color + diffuse * hemi + envSpec * envBRDF(f0, rough, NdotV);
|
|
338
|
+
color = color + emitted;
|
|
339
|
+
color = color * frame.ground.w;
|
|
340
|
+
return vec4f(linearToSrgb(aces(color)), base.a);
|
|
341
|
+
}`),d.join(`
|
|
342
|
+
`))}function sl(e,t){return e===3?` ambient = ambient + frame.lightColor[${t}].rgb;`:e===4?` ambient = ambient + mix(frame.lightExtra[${t}].yzw, frame.lightColor[${t}].rgb, N.y * 0.5 + 0.5);`:e===0?` color = color + shade(N, V, -frame.lightDir[${t}].xyz, frame.lightColor[${t}].rgb * PI, NdotV, f0, diffuse, a);`:` {
|
|
343
|
+
let Lv = frame.lightPos[${t}].xyz - inp.world;
|
|
344
|
+
let d = length(Lv);
|
|
345
|
+
let L = Lv / max(d, 1e-5);
|
|
346
|
+
var att = 1.0 / max(d * d, 1e-4);
|
|
347
|
+
let range = frame.lightDir[${t}].w;
|
|
348
|
+
if (range > 0.0) {
|
|
349
|
+
let x = d / range;
|
|
350
|
+
let w = clamp(1.0 - x * x * x * x, 0.0, 1.0);
|
|
351
|
+
att = att * w * w;
|
|
352
|
+
}${e===2?`\n att = att * smoothstep(frame.lightColor[${t}].w, frame.lightExtra[${t}].x, dot(-L, frame.lightDir[${t}].xyz));`:``}
|
|
353
|
+
color = color + shade(N, V, L, frame.lightColor[${t}].rgb * PI * att, NdotV, f0, diffuse, a);
|
|
354
|
+
}`}var cl=`
|
|
355
|
+
${rl}
|
|
356
|
+
@vertex
|
|
357
|
+
fn vs_line(inp: VSIn) -> @builtin(position) vec4f {
|
|
358
|
+
let M = mat4x4f(inp.m0, inp.m1, inp.m2, inp.m3);
|
|
359
|
+
let wp = M * vec4f(inp.position, 1.0);
|
|
360
|
+
return frame.viewProj * vec4f(mix(wp.xyz, frame.cameraPos.xyz, frame.params.z), 1.0);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
@vertex
|
|
364
|
+
fn vs_normals(inp: VSIn) -> @builtin(position) vec4f {
|
|
365
|
+
let M = mat4x4f(inp.m0, inp.m1, inp.m2, inp.m3);
|
|
366
|
+
var wp = M * vec4f(inp.position, 1.0);
|
|
367
|
+
let n = normalize(worldNormal(inp));
|
|
368
|
+
wp = vec4f(wp.xyz + n * inp.uv.x * frame.params.y, 1.0);
|
|
369
|
+
return frame.viewProj * vec4f(mix(wp.xyz, frame.cameraPos.xyz, frame.params.z), 1.0);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
@fragment
|
|
373
|
+
fn fs_line() -> @location(0) vec4f {
|
|
374
|
+
let flags = u32(material.params.z + 0.5);
|
|
375
|
+
if ((flags & 16u) != 0u) {
|
|
376
|
+
return material.overlay;
|
|
377
|
+
}
|
|
378
|
+
return vec4f(linearToSrgb(material.baseColor.rgb + material.emissive.rgb), material.baseColor.a);
|
|
379
|
+
}
|
|
380
|
+
`,ll=4,ul=[{arrayStride:32,stepMode:`vertex`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32x3`},{shaderLocation:2,offset:24,format:`float32x2`}]},{arrayStride:64,stepMode:`instance`,attributes:[{shaderLocation:3,offset:0,format:`float32x4`},{shaderLocation:4,offset:16,format:`float32x4`},{shaderLocation:5,offset:32,format:`float32x4`},{shaderLocation:6,offset:48,format:`float32x4`}]}],dl=(e,t)=>{let n=t;for(;n<e;)n*=2;return n},fl=class{constructor(e,t={}){this.canvas=e,this.present=t.present||`canvas`,this.kind=`webgpu`,this.zeroToOne=!0,this.pipelines=new Map,this.meshModules=new Map,this.materialBindings=new Map,this.overlayBindings=new Map,this.poolGeneration=-1,this.vertexBuffer=null,this.indexBuffer=null,this.instanceBuffer=null,this.gpuBytes=0,this.lost=!1,this.info=``,this.errors=[]}async init(){if(!navigator.gpu)throw Error(`WebGPU is not available in this browser.`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`No WebGPU adapter is available.`);this.adapter=e;let t=e.info||{};this.info=[t.vendor,t.architecture,t.description].filter(Boolean).join(` `)||`WebGPU adapter`;let n=await e.requestDevice();if(this.device=n,n.lost.then(e=>{this.lost=!0,this.errors.push(`WebGPU device lost: ${e.message}`)}),n.onuncapturederror=e=>{this.errors.push(e.error&&e.error.message?e.error.message:String(e))},this.present===`readback`){if(this.format=`rgba8unorm`,this.ctx2d=this.canvas.getContext(`2d`),!this.ctx2d)throw Error(`Cannot create a 2D context for WebGPU readback presentation.`);this.canvasUsed=!0}else{let e=this.canvas.getContext(`webgpu`);if(!e)throw Error(`Cannot create a WebGPU canvas context.`);this.canvasUsed=!0,this.context=e,this.format=navigator.gpu.getPreferredCanvasFormat(),e.configure({device:n,format:this.format,alphaMode:`opaque`,colorSpace:`srgb`,toneMapping:{mode:`standard`}})}this.frameLayout=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}}]}),this.materialLayout=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:`filtering`}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:4,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:5,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}},{binding:6,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`float`}}]}),this.pipelineLayout=n.createPipelineLayout({bindGroupLayouts:[this.frameLayout,this.materialLayout]}),n.pushErrorScope(`validation`),this.lineModule=n.createShaderModule({code:cl,label:`es3d lines`});for(let[e,t]of[[`mesh`,this.meshModule(0,`0`)],[`lines`,this.lineModule]]){let n=(await t.getCompilationInfo()).messages.filter(e=>e.type===`error`);if(n.length)throw Error(`WGSL ${e} shader error: ${n.map(e=>`${e.lineNum}:${e.linePos} ${e.message}`).join(`; `)}`)}let r=await n.popErrorScope();if(r)throw Error(`WebGPU initialisation error: ${r.message}`);this.frameBuffer=n.createBuffer({size:Nc,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.frameBindGroup=n.createBindGroup({layout:this.frameLayout,entries:[{binding:0,resource:{buffer:this.frameBuffer}}]}),this.sampler=n.createSampler({addressModeU:`repeat`,addressModeV:`repeat`,magFilter:`linear`,minFilter:`linear`,mipmapFilter:`linear`,maxAnisotropy:8}),this.whiteTex=this.createTexture({width:1,height:1,data:new Uint8Array([255,255,255,255])},!0),this.flatNormalTex=this.createTexture({width:1,height:1,data:new Uint8Array([128,128,255,255])},!1),this.matData=new Float32Array(20)}createTexture(e,t){let n=e.width>1||e.height>1?kc(e):[e],r=this.device.createTexture({size:[e.width,e.height],format:t?`rgba8unorm-srgb`:`rgba8unorm`,mipLevelCount:n.length,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});return n.forEach((e,t)=>{let n=e.data instanceof Uint8Array?e.data:new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);this.device.queue.writeTexture({texture:r,mipLevel:t},n,{bytesPerRow:e.width*4,rowsPerImage:e.height},[e.width,e.height]),this.gpuBytes+=e.width*e.height*4}),{texture:r,view:r.createView()}}destroyTexture(e){e.texture.destroy()}meshModule(e,t){let n=`${e}|${t}`,r=this.meshModules.get(n);return r||(r=this.device.createShaderModule({code:ol(e,t),label:`es3d mesh ${n}`}),this.meshModules.set(n,r)),r}pipeline(e,{cull:t=`back`,frontFace:n=`ccw`,blend:r=!1,depthWrite:i=!0,depthCompare:a=`less-equal`,flags:o=0,lights:s=``}={}){let c=e===`mesh`,l=`${e}|${t}|${n}|${r}|${i}|${a}${c?`|${o}|${s}`:``}`,u=this.pipelines.get(l);if(u)return u;let d=c?this.meshModule(o,s):this.lineModule,f=c?`vs_main`:e===`normals`?`vs_normals`:`vs_line`;return u=this.device.createRenderPipeline({label:l,layout:this.pipelineLayout,vertex:{module:d,entryPoint:f,buffers:ul},fragment:{module:d,entryPoint:c?`fs_main`:`fs_line`,targets:[{format:this.format,blend:r?{color:{srcFactor:`src-alpha`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}}:void 0}]},primitive:{topology:c?`triangle-list`:`line-list`,cullMode:c?t:`none`,frontFace:n},depthStencil:{format:`depth24plus`,depthWriteEnabled:i,depthCompare:a},multisample:{count:ll}}),this.pipelines.set(l,u),u}ensureTargets(){let e=this.canvas.width,t=this.canvas.height;this.targetW===e&&this.targetH===t&&this.msaa||(this.msaa&&this.msaa.destroy(),this.depth&&this.depth.destroy(),this.msaa=this.device.createTexture({size:[e,t],sampleCount:ll,format:this.format,usage:GPUTextureUsage.RENDER_ATTACHMENT}),this.depth=this.device.createTexture({size:[e,t],sampleCount:ll,format:`depth24plus`,usage:GPUTextureUsage.RENDER_ATTACHMENT}),this.msaaView=this.msaa.createView(),this.depthView=this.depth.createView(),this.present===`readback`&&(this.offscreen&&this.offscreen.destroy(),this.readBuffer&&!this.readPending&&this.readBuffer.destroy(),this.offscreen=this.device.createTexture({size:[e,t],format:this.format,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC}),this.offscreenView=this.offscreen.createView(),this.readStride=Math.ceil(e*4/256)*256,this.readBuffer=this.device.createBuffer({size:this.readStride*t,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})),this.targetW=e,this.targetH=t)}readback(e){if(this.readPending)return!1;let t=this.targetW,n=this.targetH;return e.copyTextureToBuffer({texture:this.offscreen},{buffer:this.readBuffer,bytesPerRow:this.readStride},[t,n]),!0}startReadback(){let e=this.readBuffer,t=this.targetW,n=this.targetH,r=this.readStride;this.readPending=e.mapAsync(GPUMapMode.READ).then(()=>{let i=new Uint8Array(e.getMappedRange()),a=new Uint8ClampedArray(t*n*4);for(let e=0;e<n;e++)a.set(i.subarray(e*r,e*r+t*4),e*t*4);if(e.unmap(),this.ctx2d.putImageData(new ImageData(a,t,n),0,0),this.readPending=null,!this.lastFrameCopied&&this.offscreen&&!this.lost){let e=this.device.createCommandEncoder();this.readback(e),this.device.queue.submit([e.finish()]),this.lastFrameCopied=!0,this.startReadback()}})}syncPool(e){let t=this.device,n=e.vertexCapacityBytes,r=e.indexCapacityBytes,i=GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,a=GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,o=0;if(e.generation!==this.poolGeneration||!this.vertexBuffer)this.vertexBuffer&&this.vertexBuffer.destroy(),this.indexBuffer&&this.indexBuffer.destroy(),this.vertexBuffer=t.createBuffer({size:dl(n,65536),usage:i}),this.indexBuffer=t.createBuffer({size:dl(r,65536),usage:a}),this.poolGeneration=e.generation,e.uploadedVertices=0,e.uploadedIndices=0;else{let o=null,s=(e,n,r,i)=>{let a=t.createBuffer({size:dl(n,65536),usage:r});return i>0&&(o||=t.createCommandEncoder(),o.copyBufferToBuffer(e,0,a,0,i)),a},c=this.vertexBuffer.size<n?this.vertexBuffer:null,l=this.indexBuffer.size<r?this.indexBuffer:null;c&&(this.vertexBuffer=s(c,n,i,e.uploadedVertices*32)),l&&(this.indexBuffer=s(l,r,a,e.uploadedIndices*4)),o&&t.queue.submit([o.finish()]),c&&c.destroy(),l&&l.destroy()}let s=e.pending();return s.vertexEnd>s.vertexStart&&e.forEachVertices(s.vertexStart,s.vertexEnd,(e,n)=>{t.queue.writeBuffer(this.vertexBuffer,e*32,n.buffer,n.byteOffset,n.byteLength),o+=n.byteLength}),s.indexEnd>s.indexStart&&e.forEachIndices(s.indexStart,s.indexEnd,(e,n)=>{t.queue.writeBuffer(this.indexBuffer,e*4,n.buffer,n.byteOffset,n.byteLength),o+=n.byteLength}),e.markUploaded(),o}uploadInstances(e,t){let n=Math.max(64,t*64);return(!this.instanceBuffer||this.instanceBuffer.size<n)&&(this.instanceBuffer&&this.instanceBuffer.destroy(),this.instanceBuffer=this.device.createBuffer({size:dl(n,16384),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})),t&&this.device.queue.writeBuffer(this.instanceBuffer,0,e.buffer,e.byteOffset,t*64),t*64}readyTexture(e,t){return e&&e.status===`ready`&&!e.gpu&&(e.gpu=this.createTexture(e.pixels,t)),e&&e.gpu?e.gpu:null}materialEntries(e,t,n,r,i,a){return[{binding:0,resource:{buffer:e}},{binding:1,resource:this.sampler},{binding:2,resource:t.view},{binding:3,resource:n.view},{binding:4,resource:r.view},{binding:5,resource:i.view},{binding:6,resource:a.view}]}materialBinding(e,t,n){let r=n?`ds`:`ss`,i=this.materialBindings.get(e);i||(i={},this.materialBindings.set(e,i));let a=this.readyTexture(e.map?t.get(e.map,`color`):null,!0),o=this.readyTexture(e.normalMap?t.get(e.normalMap,`normal`):null,!1),s=this.readyTexture(e.metallicRoughnessMap?t.get(e.metallicRoughnessMap,`linear`):null,!1),c=this.readyTexture(e.occlusionMap?t.get(e.occlusionMap,`linear`):null,!1),l=this.readyTexture(e.emissiveMap?t.get(e.emissiveMap,`color`):null,!0),u=!!a,d=!!o,f=!!s,p=!!c,m=!!l,h=`${u}|${d}|${f}|${p}|${m}`,g=i[r];if(!g||g.key!==h){g&&g.buffer.destroy(),zc(this.matData,e,{hasMap:u,hasNormalMap:d,hasMrMap:f,hasOcclusionMap:p,hasEmissiveMap:m,doubleSided:n||e.doubleSided});let t=this.device.createBuffer({size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(t,0,this.matData);let _=this.device.createBindGroup({layout:this.materialLayout,entries:this.materialEntries(t,a||this.whiteTex,o||this.flatNormalTex,s||this.whiteTex,c||this.whiteTex,l||this.whiteTex)});g=i[r]={key:h,buffer:t,bindGroup:_,flags:this.matData[10]}}return g}overlayBinding(e,t){let n=this.overlayBindings.get(e);if(n)return n;Bc(this.matData,t);let r=this.device.createBuffer({size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return this.device.queue.writeBuffer(r,0,this.matData),n=this.device.createBindGroup({layout:this.materialLayout,entries:this.materialEntries(r,this.whiteTex,this.flatNormalTex,this.whiteTex,this.whiteTex,this.whiteTex)}),this.overlayBindings.set(e,n),n}releaseMaterials(e){for(let[t,n]of this.materialBindings)if(!e.has(t)){for(let e of Object.values(n))e.buffer.destroy();this.materialBindings.delete(t)}}get caps(){return{msaaSamples:ll,anisotropy:8,maxTextureSize:this.device?this.device.limits.maxTextureDimension2D:0,colorSpace:`srgb`}}resize(e,t){(this.canvas.width!==e||this.canvas.height!==t)&&(this.canvas.width=e,this.canvas.height=t)}render(e,t,n){if(this.lost)return;let r=this.device;this.ensureTargets(),r.queue.writeBuffer(this.frameBuffer,0,t.buffer,t.byteOffset,t.byteLength),this.uploadInstances(e.instanceData,e.instanceCount);let i=r.createCommandEncoder(),a=i.beginRenderPass({colorAttachments:[{view:this.msaaView,resolveTarget:this.present===`readback`?this.offscreenView:this.context.getCurrentTexture().createView(),clearValue:{r:n.background[0],g:n.background[1],b:n.background[2],a:1},loadOp:`clear`,storeOp:`discard`}],depthStencilAttachment:{view:this.depthView,depthClearValue:1,depthLoadOp:`clear`,depthStoreOp:`discard`}});a.setBindGroup(0,this.frameBindGroup),this.vertexBuffer&&(a.setVertexBuffer(0,this.vertexBuffer),a.setIndexBuffer(this.indexBuffer,`uint32`)),a.setVertexBuffer(1,this.instanceBuffer);let o=null,s=e=>{e!==o&&(a.setPipeline(e),o=e)};if(this.vertexBuffer){let r=null,i=Rc(t);for(let t of e.batches){let e=t.kind===`lines`,o=this.materialBinding(t.material,n.textures,t.doubleSided&&!t.material.doubleSided);s(e?this.pipeline(`lines`,{blend:t.transparent,depthWrite:!t.transparent}):this.pipeline(`mesh`,{cull:t.doubleSided?`none`:`back`,frontFace:t.mirrored?`cw`:`ccw`,blend:t.transparent,depthWrite:!t.transparent,flags:o.flags,lights:i}));let c=o.bindGroup;c!==r&&(a.setBindGroup(1,c),r=c),a.drawIndexed(t.range.indexCount,t.count,t.range.firstIndex,0,t.firstInstance)}let o=e.overlays,c=(e,t,n,r,i=`less-equal`)=>{if(r.length){s(this.pipeline(e,{blend:!0,depthWrite:!1,depthCompare:i})),a.setBindGroup(1,this.overlayBinding(t,n));for(let e of r)a.drawIndexed(e.range.indexCount,e.count,e.range.firstIndex,0,e.firstInstance)}};c(`lines`,`wireframe`,n.overlayColors.wireframe,o.wireframe),c(`normals`,`normals`,n.overlayColors.normals,o.normals),o.bbox&&o.bbox.count&&c(`lines`,`bbox`,n.overlayColors.bbox,[{...o.bbox,range:n.cubeRange}]),o.selection&&o.selection.count&&c(`lines`,`selection`,n.overlayColors.selection,[{...o.selection,range:n.cubeRange}],`always`)}a.end();let c=this.present===`readback`&&this.readback(i);r.queue.submit([i.finish()]),c&&this.startReadback(),this.lastFrameCopied=c}async finish(){if(await this.device.queue.onSubmittedWorkDone(),this.readPending&&await this.readPending,this.present===`readback`&&!this.lastFrameCopied&&this.offscreen){let e=this.device.createCommandEncoder();this.readback(e),this.device.queue.submit([e.finish()]),this.startReadback(),await this.readPending,this.lastFrameCopied=!0}}dispose(){if(this.device){for(let e of[this.vertexBuffer,this.indexBuffer,this.instanceBuffer,this.frameBuffer])e&&e.destroy();for(let e of this.materialBindings.values())for(let t of Object.values(e))t.buffer.destroy();this.msaa&&this.msaa.destroy(),this.depth&&this.depth.destroy(),this.device.destroy()}}},pl=()=>performance.now();function ml(){let e=[];for(let t=0;t<8;t++)e.push(t&1?.5:-.5,t&2?.5:-.5,t&4?.5:-.5);return new Mi({positions:Float32Array.from(e),indices:Uint32Array.from([0,1,2,3,4,5,6,7,0,2,1,3,4,6,5,7,0,4,1,5,2,6,3,7]),kind:`lines`})}var hl={wireframe:[.02,.03,.05,.55],normals:[1,.82,.15,.95],bbox:[.35,.78,1,.75],selection:[1,.55,.12,1]},gl=32<<20,_l=class{constructor(e){this.backend=e,this.kind=e.kind,this.pool=new uc,this.frames=new vc,this.textures=new Mc,this.frameData=new Float32Array(304),this.options={wireframe:!1,normals:!1,bbox:!1,autoLod:!0,fixedLod:0,culling:!0,lodBias:1,maxPixelRatio:2,lodPixels:`css`,tessellationBudget:1/0},this.selection=new Set,this.scene=null,this.meshOf=null,this.cube=ml(),this.cubeRange=this.pool.meshRange(this.cube),this.lastDraw=null,this.lightInfo={truncated:0,usedDefaults:!1},this.stats={cpuMs:0,uploadBytes:0,totalUploadBytes:0,drawCalls:0,triangles:0,visible:0,instances:0},this.gpuEpoch=0}get info(){return this.backend.info}get caps(){return{backend:this.kind,...this.backend.caps,maxPixelRatio:this.options.maxPixelRatio,lodPixels:this.options.lodPixels,lightsDropped:this.lightInfo.truncated||0}}pixelRatio(e){return Math.min(e||1,this.options.maxPixelRatio||1/0)}setScene(e,t,{keepGeometry:n=!0}={}){this.scene=e,this.meshOf=t,(!e||!n||!e.parts&&this.pool.byteSize>gl)&&(this.pool.reset(),this.pool.unusedBytes=0,this.cubeRange=this.pool.meshRange(this.cube)),this.backend.releaseMaterials(new Set(e?e.materials:[])),this.stats.totalUploadBytes=0}updateScene(e){for(let t of e.takeReleased())if(!e.geomIndex.has(t))for(let e of t.meshes){if(!e)continue;let t=this.pool.ranges.get(e);t&&(this.pool.unusedBytes=(this.pool.unusedBytes||0)+e.vertexCount*32+t.indexCount*4)}this.pool.byteSize>gl&&(this.pool.unusedBytes||0)*2>this.pool.byteSize&&(this.pool.reset(),this.pool.unusedBytes=0,this.cubeRange=this.pool.meshRange(this.cube)),(this.materialsSeen!==e.materials.length||e.freeMaterials.length)&&this.backend.releaseMaterials(new Set(e.materials)),this.materialsSeen=e.materials.length}render(e,t){let n=pl(),r=this.pixelRatio(t.dpr),i=Math.max(1,Math.round(t.width*r)),a=Math.max(1,Math.round(t.height*r));this.backend.resize(i,a);let o=this.scene,s=o?o.bounds:{min:[-1,-1,-1],max:[1,1,1]};e.update(i/a,this.backend.zeroToOne,s);let c=o&&o.environment?o.environment:{background:[.09,.1,.12,1],sky:[.8,.86,.95,1],ground:[.25,.22,.2,1],intensity:.5,exposure:1},l;l=o?this.buildFrame(e,t,a):{batches:[],overlays:{wireframe:[],normals:[],bbox:null,selection:null},instanceData:new Float32Array(16),instanceCount:0,stats:{instances:0,visible:0,culled:0,batches:0,drawCalls:0,triangles:0,lodHistogram:[0,0,0,0],refining:0}};let u=Math.hypot(s.max[0]-s.min[0],s.max[1]-s.min[1],s.max[2]-s.min[2])/2||1;this.lightInfo=Lc(this.frameData,{viewProj:e.viewProj,view:e.view,cameraPos:e.position,time:t.time||0,environment:c,lights:o?o.lights:[],normalLength:u*.025,lineBias:.0015,viewportHeight:a});let d=this.backend.syncPool(this.pool),f=this.backend.resourceEpoch||0;if(f!==this.gpuEpoch){this.gpuEpoch=f;for(let e of this.textures.entries.values())e.gpu=null}this.backend.render(l,this.frameData,{background:c.background,textures:this.textures,overlayColors:hl,cubeRange:this.cubeRange}),this.lastDraw=l;let p=this.stats;return p.cpuMs=pl()-n,p.uploadBytes=d+l.instanceCount*64,p.totalUploadBytes+=d,p.drawCalls=l.stats.drawCalls,p.triangles=l.stats.triangles,p.visible=l.stats.visible,p.instances=l.stats.instances,p.culled=l.stats.culled,p.batches=l.stats.batches,p.lodHistogram=l.stats.lodHistogram,p.refining=l.stats.refining||0,p.geometryBytes=this.pool.byteSize,p.instanceBytes=l.instanceCount*64,p.textureBytes=this.backend.gpuBytes,l}buildFrame(e,t,n,r=this.options.tessellationBudget){let i=this.options.lodPixels===`device`?n:Math.max(1,Math.round(t.height));return this.frames.build({scene:this.scene,camera:e,pool:this.pool,meshOf:this.meshOf,viewportHeight:i,options:{...this.options,selection:this.selection,tessellationBudget:r}})}prepare(e,t){if(!this.scene)return;let n=this.pixelRatio(t.dpr),r=Math.max(1,Math.round(t.width*n)),i=Math.max(1,Math.round(t.height*n)),a=e.clone();a.update(r/i,this.backend.zeroToOne,this.scene.bounds);let o=this.frames.last;this.buildFrame(a,t,i,1/0),this.frames.last=o}finish(){return this.backend.finish()}dispose(){this.textures.clear(e=>this.backend.destroyTexture(e)),this.backend.dispose()}};async function vl(e,t={}){let n=t.backend||`auto`,r=[],i=!1;if((n===`auto`||n===`webgpu`)&&typeof navigator<`u`&&navigator.gpu){let a=new fl(e,{present:t.present});try{return await a.init(),new _l(a)}catch(e){r.push(e.message),i=!!a.canvasUsed;try{a.dispose()}catch{}if(n===`webgpu`)throw e}}else if(n===`webgpu`)throw Error(`WebGPU is not available in this browser.`);let a=e;i&&e.getContext&&e.parentNode&&(a=e.cloneNode(!1),e.parentNode.replaceChild(a,e));let o=new nl(a);await o.init();let s=new _l(o);return s.fallbackReason=r.join(`; `),s.canvas=a,s}var yl=class e{constructor(){this.type=`perspective`,this.position=[6,4,8],this.target=[0,0,0],this.up=[0,1,0],this.fov=45,this.orthoHeight=10,this.near=null,this.far=null,this.refAspect=1,this.fit=`contain`,this.view=lt(),this.proj=lt(),this.viewProj=lt(),this.invViewProj=lt(),this.currentNear=.1,this.currentFar=1e3}fromSpec(e){return this.type=e.type||`perspective`,this.position=e.position.slice(),this.target=e.target.slice(),this.up=e.up.slice(),this.fov=e.fov||45,this.orthoHeight=e.height||10,this.near=e.near||null,this.far=e.far||null,this.refAspect=e.aspect||1,this.fit=e.fit||`contain`,this}clone(){let t=new e;return t.type=this.type,t.position=this.position.slice(),t.target=this.target.slice(),t.up=this.up.slice(),t.fov=this.fov,t.orthoHeight=this.orthoHeight,t.near=this.near,t.far=this.far,t.refAspect=this.refAspect,t.fit=this.fit,t}extentScale(e){let t=(this.refAspect>0?this.refAspect:1)/e;switch(this.fit){case`cover`:return Math.min(1,t);case`width`:return t;case`height`:return 1;default:return Math.max(1,t)}}get distance(){return Math.hypot(this.position[0]-this.target[0],this.position[1]-this.target[1],this.position[2]-this.target[2])}frame(e,t=[.62,.5,.75]){let n=[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],r=Math.max(.001,Math.hypot(e.max[0]-e.min[0],e.max[1]-e.min[1],e.max[2]-e.min[2])/2),i=Math.hypot(...t),a=this.type===`orthographic`?r*3:r/Math.sin(this.fov/2*Math.PI/180)*1.05;return this.target=n,this.position=[n[0]+t[0]/i*a,n[1]+t[1]/i*a,n[2]+t[2]/i*a],this.up=[0,1,0],this.orthoHeight=r*2.2,this.refAspect=1,this.fit=`contain`,this}update(e,t,n){Dt(this.view,this.position,this.target,this.up);let r=this.near,i=this.far;if(r===null||i===null){let e=.05,t=2e3;if(n){let r=[(n.min[0]+n.max[0])/2,(n.min[1]+n.max[1])/2,(n.min[2]+n.max[2])/2],i=Math.max(.001,Math.hypot(n.max[0]-n.min[0],n.max[1]-n.min[1],n.max[2]-n.min[2])/2),a=Math.hypot(this.position[0]-r[0],this.position[1]-r[1],this.position[2]-r[2]);t=(a+i)*1.5+.001,e=Math.max((a-i)*.5,i*.002,t/5e4,1e-4)}r===null&&(r=e),i===null&&(i=Math.max(t,r*10))}if(this.currentNear=r,this.currentFar=i,this.type===`orthographic`){let n=this.orthoHeight*this.extentScale(e)/2,a=n*e;Et(this.proj,-a,a,-n,n,this.near===null?-i:r,i,t)}else Tt(this.proj,this.verticalFov(e),e,r,i,t);this.aspect=e,R(this.viewProj,this.proj,this.view),xt(this.invViewProj,this.viewProj)}verticalFov(e){let t=this.fov*Math.PI/180,n=this.extentScale(e);return n===1?t:2*Math.atan(Math.tan(t/2)*n)}ray(e,t,n,r,i=!1){let a=e/n*2-1,o=1-t/r*2,s=i?0:-1,c=[0,0,0],l=[0,0,0];Ct(c,this.invViewProj,a,o,s),Ct(l,this.invViewProj,a,o,1);let u=[l[0]-c[0],l[1]-c[1],l[2]-c[2]],d=Math.hypot(u[0],u[1],u[2])||1;return{origin:c,dir:[u[0]/d,u[1]/d,u[2]/d]}}pixelsPerUnit(e,t){let n=this.aspect||1;return this.type===`orthographic`?t/(this.orthoHeight*this.extentScale(n)):t/(2*Math.max(e,1e-6)*Math.tan(this.verticalFov(n)/2))}},bl=class{constructor(e,t){this.el=e,this.camera=t,this.enabled=!0,this.enableZoom=!0,this.enablePan=!0,this.limits=null,this.world=null,this.rotateSpeed=.006,this.zoomSpeed=.0015,this.onChange=null,this.onClick=null,this.onDoubleClick=null,this.pointers=new Map,this.mode=null,this.moved=0,this.last=null,this.pinch=null,this._down=e=>this.pointerDown(e),this._move=e=>this.pointerMove(e),this._up=e=>this.pointerUp(e),this._wheel=e=>this.wheel(e),this._ctx=e=>e.preventDefault(),this._dbl=e=>{if(this.onDoubleClick){let t=this.el.getBoundingClientRect();this.onDoubleClick(e.clientX-t.left,e.clientY-t.top,e)}},e.addEventListener(`pointerdown`,this._down),e.addEventListener(`pointermove`,this._move),e.addEventListener(`pointerup`,this._up),e.addEventListener(`pointercancel`,this._up),e.addEventListener(`wheel`,this._wheel,{passive:!1}),e.addEventListener(`contextmenu`,this._ctx),e.addEventListener(`dblclick`,this._dbl),e.style.touchAction=`none`}dispose(){let e=this.el;e.removeEventListener(`pointerdown`,this._down),e.removeEventListener(`pointermove`,this._move),e.removeEventListener(`pointerup`,this._up),e.removeEventListener(`pointercancel`,this._up),e.removeEventListener(`wheel`,this._wheel),e.removeEventListener(`contextmenu`,this._ctx),e.removeEventListener(`dblclick`,this._dbl)}configure(e,t={}){this.limits=e,t.world&&(this.world=t.world);let n=e?e.mode:`orbit`;this.enabled=t.ignoreMode||n===`orbit`,this.enableZoom=!e||e.zoom!==!1,this.enablePan=!e||e.pan!==!1,this.el.style.touchAction=this.enabled?`none`:`auto`}changed(){this.onChange&&this.onChange()}snapshot(){return{position:this.camera.position.slice(),target:this.camera.target.slice()}}constrain(e){if(!this.limits)return;let t=this.limits.collide&&this.world?this.world():null;cc(e,this.camera,this.limits,t)}pointerDown(e){if(this.enabled){if(this.el.setPointerCapture(e.pointerId),this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),this.moved=0,this.pointers.size===2){let[e,t]=[...this.pointers.values()];this.pinch={d:Math.hypot(e.x-t.x,e.y-t.y),cx:(e.x+t.x)/2,cy:(e.y+t.y)/2},this.mode=`pinch`}else this.mode=e.button===2||e.button===1||e.shiftKey||e.ctrlKey||e.metaKey?`pan`:`orbit`,this.last={x:e.clientX,y:e.clientY}}}pointerMove(e){if(!this.enabled||!this.pointers.has(e.pointerId))return;this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});let t=this.snapshot();if(this.mode===`pinch`&&this.pointers.size>=2){let[e,n]=[...this.pointers.values()],r=Math.hypot(e.x-n.x,e.y-n.y),i=(e.x+n.x)/2,a=(e.y+n.y)/2;this.pinch.d>0&&this.enableZoom&&this.zoom(this.pinch.d/Math.max(r,1)),this.enablePan&&this.pan(i-this.pinch.cx,a-this.pinch.cy),this.pinch={d:r,cx:i,cy:a},this.moved+=10,this.constrain(t),this.changed();return}if(!this.last)return;let n=e.clientX-this.last.x,r=e.clientY-this.last.y;this.last={x:e.clientX,y:e.clientY},this.moved+=Math.abs(n)+Math.abs(r),this.mode===`orbit`?this.orbit(n,r):this.mode===`pan`&&this.enablePan&&this.pan(n,r),this.constrain(t),this.changed()}pointerUp(e){if(this.pointers.has(e.pointerId)){this.pointers.delete(e.pointerId);try{this.el.releasePointerCapture(e.pointerId)}catch{}if(this.pointers.size===0){if(this.moved<4&&this.onClick&&e.button===0){let t=this.el.getBoundingClientRect();this.onClick(e.clientX-t.left,e.clientY-t.top,e)}this.mode=null,this.last=null,this.pinch=null}else if(this.pointers.size===1){let e=[...this.pointers.values()][0];this.mode=`orbit`,this.last={x:e.x,y:e.y},this.pinch=null}}}wheel(e){if(!this.enabled||!this.enableZoom)return;e.preventDefault();let t=e.deltaMode===1?e.deltaY*33:e.deltaMode===2?e.deltaY*400:e.deltaY,n=this.snapshot();this.zoom(Math.exp(t*this.zoomSpeed)),this.constrain(n),this.changed()}orbit(e,t){let n=this.camera,r=[n.position[0]-n.target[0],n.position[1]-n.target[1],n.position[2]-n.target[2]],i=Math.hypot(r[0],r[1],r[2])||1e-6,a=Math.atan2(r[0],r[2]),o=Math.acos(Math.max(-1,Math.min(1,r[1]/i)));a-=e*this.rotateSpeed,o-=t*this.rotateSpeed,o=Math.max(.001,Math.min(Math.PI-.001,o)),n.position=[n.target[0]+i*Math.sin(o)*Math.sin(a),n.target[1]+i*Math.cos(o),n.target[2]+i*Math.sin(o)*Math.cos(a)],n.up=[0,1,0]}pan(e,t){let n=this.camera,r=this.el.clientHeight||1,i=n.distance,a=n.type===`orthographic`?n.orthoHeight/r:2*i*Math.tan(n.fov/2*Math.PI/180)/r,o=[n.target[0]-n.position[0],n.target[1]-n.position[1],n.target[2]-n.position[2]],s=Math.hypot(...o)||1;o[0]/=s,o[1]/=s,o[2]/=s;let c=[o[1]*n.up[2]-o[2]*n.up[1],o[2]*n.up[0]-o[0]*n.up[2],o[0]*n.up[1]-o[1]*n.up[0]],l=Math.hypot(...c)||1;c=c.map(e=>e/l);let u=[c[1]*o[2]-c[2]*o[1],c[2]*o[0]-c[0]*o[2],c[0]*o[1]-c[1]*o[0]],d=-e*a,f=t*a;for(let e=0;e<3;e++){let t=c[e]*d+u[e]*f;n.position[e]+=t,n.target[e]+=t}}zoom(e){let t=this.camera;if(t.type===`orthographic`){t.orthoHeight=Math.max(1e-4,t.orthoHeight*e);return}let n=[t.position[0]-t.target[0],t.position[1]-t.target[1],t.position[2]-t.target[2]],r=Math.hypot(...n),i=Math.max(1e-4,r*e);for(let e=0;e<3;e++)t.position[e]=t.target[e]+n[e]/(r||1)*i}focus(e){let t=this.camera,n=this.snapshot(),r=[e[0]-t.target[0],e[1]-t.target[1],e[2]-t.target[2]];for(let e=0;e<3;e++)t.target[e]+=r[e],t.position[e]+=r[e];this.constrain(n),this.changed()}},xl=()=>typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,Sl=class{constructor(e,t={}){this.section=e,this.smoothing=t.smoothing??.12,this.reducedMotion=t.reducedMotion??xl(),this.value=NaN,this.target=0,this.stale=!0,this.markStale=()=>{this.stale=!0},addEventListener(`scroll`,this.markStale,{passive:!0,capture:!0}),addEventListener(`resize`,this.markStale,{passive:!0})}dispose(){removeEventListener(`scroll`,this.markStale,{capture:!0}),removeEventListener(`resize`,this.markStale)}stops(){let e=[...this.section.querySelectorAll(`[data-es3d-stop]`)];return e.map((t,n)=>{let r=t.getAttribute(`data-es3d-stop`),i=r===null||r.trim()===``?e.length>1?n/(e.length-1):0:Number(r);return{el:t,value:Number.isFinite(i)?Math.min(1,Math.max(0,i)):0}})}measure(){let e=innerHeight||1,t=this.stops();if(!t.length){let t=this.section.getBoundingClientRect(),n=t.height-e;return n<=0?+(t.top<=0):Math.min(1,Math.max(0,-t.top/n))}let n=t.map(t=>{let n=t.el.getBoundingClientRect();return n.top+n.height/2-e/2});if(n[0]>=0)return t[0].value;let r=t.length-1;if(n[r]<=0)return t[r].value;let i=0;for(;i<r-1&&n[i+1]<=0;)i++;let a=n[i]===n[i+1]?0:-n[i]/(n[i+1]-n[i]);return this.reducedMotion?a<.5?t[i].value:t[i+1].value:t[i].value+(t[i+1].value-t[i].value)*a}update(e){if(this.stale&&(this.stale=!1,this.target=this.measure()),Number.isNaN(this.value)||this.reducedMotion||!(this.smoothing>0))return this.value!==this.target&&(this.value=this.target,!0);let t=this.target-this.value;return t!==0&&(Math.abs(t)<1e-4?this.value=this.target:this.value+=t*(1-Math.exp(-Math.max(e,0)/this.smoothing)),!0)}},Cl=typeof WorkerGlobalScope<`u`&&typeof self<`u`&&self instanceof WorkerGlobalScope,wl=[];Cl&&(self.onmessage=e=>wl.push(e));var Tl=()=>({min:[-1,-1,-1],max:[1,1,1]}),El=class{constructor(e,t=`fragment`){this.id=e,this.kind=t,this.scene=null,this.geomMap=null,this.matMap=null,this.visible=!0,this.selectable=t===`host`}get drawn(){return!!(this.scene&&this.visible)}},Dl=class{constructor(){this.parts=[],this.host=null,this.geometries=[],this.geomIndex=new Map,this.geomUsers=[],this.freeGeometries=[],this.materials=[],this.matIndex=new Map,this.matUsers=[],this.freeMaterials=[],this.released=[],this.version=0,this.boundsDirty=!0,this.cachedBounds=Tl()}insert(e){if(e.kind===`host`){if(this.host)throw Error(`A scene set has one host.`);this.host=e,this.parts.unshift(e)}else this.parts.push(e);return this.changed(),e}remove(e){let t=this.parts.indexOf(e);return t<0?!1:(this.unplace(e),this.parts.splice(t,1),e===this.host&&(this.host=null),this.changed(),!0)}place(e,t){let n=new Uint32Array(t.geometries.length);for(let e=0;e<t.geometries.length;e++)n[e]=this.useGeometry(t.geometries[e]);let r=new Uint32Array(t.materials.length);for(let e=0;e<t.materials.length;e++)r[e]=this.useMaterial(t.materials[e]);this.unplace(e),e.scene=t,e.geomMap=n,e.matMap=r,this.changed()}unplace(e){if(e.scene){for(let t of e.geomMap)this.dropGeometry(t);for(let t of e.matMap)this.dropMaterial(t);e.scene=null,e.geomMap=null,e.matMap=null,this.changed()}}setVisible(e,t){let n=!!t;e.visible!==n&&(e.visible=n,this.changed())}changed(){this.version++,this.boundsDirty=!0}invalidateBounds(){this.boundsDirty=!0}useGeometry(e){let t=this.geomIndex.get(e);return t===void 0&&(t=this.freeGeometries.length?this.freeGeometries.pop():this.geometries.length,this.geometries[t]=e,this.geomUsers[t]=0,this.geomIndex.set(e,t)),this.geomUsers[t]++,t}dropGeometry(e){if(--this.geomUsers[e]>0)return;let t=this.geometries[e];this.geomIndex.delete(t),this.geometries[e]=null,this.freeGeometries.push(e),this.released.push(t)}useMaterial(e){let t=this.matIndex.get(e.key);return t===void 0&&(t=this.freeMaterials.length?this.freeMaterials.pop():this.materials.length,this.materials[t]=new ro(e.params,t,e.name),this.matUsers[t]=0,this.matIndex.set(e.key,t)),this.matUsers[t]++,t}dropMaterial(e){--this.matUsers[e]>0||(this.matIndex.delete(this.materials[e].key),this.materials[e]=null,this.freeMaterials.push(e))}takeReleased(){let e=this.released;return this.released=[],e}drawnParts(){let e=[];for(let t of this.parts)t.scene&&t.visible&&e.push(t);return e}get count(){let e=0;for(let t of this.parts)t.scene&&t.visible&&(e+=t.scene.count);return e}get bounds(){if(!this.boundsDirty)return this.cachedBounds;let e=[1/0,1/0,1/0],t=[-1/0,-1/0,-1/0];for(let n of this.parts){if(!n.scene||!n.visible||!n.scene.count)continue;let r=n.scene.bounds;for(let n=0;n<3;n++)r.min[n]<e[n]&&(e[n]=r.min[n]),r.max[n]>t[n]&&(t[n]=r.max[n])}return this.cachedBounds=e[0]<=t[0]?{min:e,max:t}:Tl(),this.boundsDirty=!1,this.cachedBounds}get lights(){let e=this.parts;if(e.length===1&&e[0].scene&&e[0].visible)return e[0].scene.lights;let t=[];for(let n of e)if(n.scene&&n.visible)for(let e of n.scene.lights)t.push(e);return t}get animation(){let e={time:!1,scroll:!1};for(let t of this.parts)t.scene&&t.visible&&(t.scene.animation.time&&(e.time=!0),t.scene.animation.scroll&&(e.scroll=!0));return e}get environment(){return this.host&&this.host.scene?this.host.scene.environment:null}get controls(){return this.host&&this.host.scene?this.host.scene.controls:null}get cameras(){return this.host&&this.host.scene?this.host.scene.cameras:[]}},Ol=`STAGE_HOST_ONLY`,kl={environment:`the environment`,camera:`a camera`,controls:`the controls`};function Al(e){let t=e&&e.doc;if(!t||!t.root)return[];let n=[],r=e=>{if(e.unknown)return;let i=kl[e.name];i&&n.push(ps(t,{severity:`warning`,phase:`render`,code:Ol,message:`A fragment cannot set ${i}: the stage's document does. This element is ignored.`,element:e}));for(let t of e.children)t.type===`element`&&r(t)};return r(t.root),n}var jl=[`severity`,`phase`,`code`,`message`,`offset`,`length`,`suggestion`,`hint`,`path`,`line`,`column`,`uid`];function Ml(e){let t={};for(let n of jl)t[n]=e[n]===void 0?null:e[n];return t}function Nl(e){let t=new u(e);return t.line=e.line??0,t.column=e.column??0,t}var Pl=[`triangles`,`lines`],Fl=e=>Math.max(0,Pl.indexOf(e)),Il=(e,t)=>{if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0},Ll=(e,t)=>e.kind===t.kind&&Il(e.indices,t.indices)&&Il(e.positions,t.positions)&&Il(e.normals,t.normals)&&Il(e.uvs,t.uvs);function Rl(e,t,n){let r=e.length,i=e.reduce((e,t)=>Math.max(e,t.lods),1),a=Array(r),o=Array(r),s=new Uint8Array(r),c=new Uint8Array(r),l=new Uint8Array(r),u=new Float64Array(r*6),d=new Float64Array(r*i),f=new Uint8Array(r),p=new Int32Array(r*i).fill(-1),m=[],h=[],g=[];e.forEach((e,r)=>{a[r]=e.key,o[r]=e.identity,s[r]=e.lods,l[r]=Fl(e.kind),c[r]=+!!e.doubleSided|(e.bounds?2:0),e.bounds&&u.set([...e.bounds.min,...e.bounds.max],r*6),f[r]=Math.min(e.lodDeviation.length,i);for(let t=0;t<f[r];t++)d[r*i+t]=e.lodDeviation[t];let _=`${t.quality}:${e.key}`;if(n&&n.has(_))return;let v=null;for(let n=0;n<e.lods;n++){let a=t.mesh(e,n);e.reports[n]&&m.push([r,n,e.reports[n]]),e.failedLods&1<<n&&h.push([r,n]),v&&Ll(v,a)?p[r*i+n]=p[r*i+n-1]:(p[r*i+n]=g.length,g.push(a),v=a)}n&&n.add(_)});let _=new Uint32Array(g.length*8),v=new Uint8Array(g.length),y=[0,0,0,0];g.forEach((e,t)=>{[e.positions,e.normals,e.uvs,e.indices].forEach((e,n)=>{_[t*8+n*2]=y[n],_[t*8+n*2+1]=e.length,y[n]+=e.length}),v[t]=Fl(e.kind)});let b=new Float32Array(y[0]),x=new Float32Array(y[1]),S=new Float32Array(y[2]),C=new Uint32Array(y[3]);return g.forEach((e,t)=>{b.set(e.positions,_[t*8]),x.set(e.normals,_[t*8+2]),S.set(e.uvs,_[t*8+4]),C.set(e.indices,_[t*8+6])}),{columns:{keys:a,identities:o,lods:s,flags:c,kinds:l,bounds:u,deviation:d,devLength:f,levels:p,maxLods:i,reports:m,failed:h},packed:{table:_,meshKinds:v,positions:b,normals:x,uvs:S,indices:C},buffers:[s,c,l,u,d,f,p,_,v,b,x,S,C].map(e=>e.buffer)}}function zl(e){let{table:t,meshKinds:n,positions:r,normals:i,uvs:a,indices:o}=e,s=Array(n.length);for(let e=0;e<s.length;e++){let c=e*8;s[e]=new Mi({positions:r.subarray(t[c],t[c]+t[c+1]),normals:i.subarray(t[c+2],t[c+2]+t[c+3]),uvs:a.subarray(t[c+4],t[c+4]+t[c+5]),indices:o.subarray(t[c+6],t[c+6]+t[c+7]),kind:Pl[n[e]]})}return s}var Bl=e=>{let t=e.params;return!!(t.map||t.normalMap||t.occlusionMap||t.metallicRoughnessMap||t.emissiveMap)},Vl=e=>e.byteOffset===0&&e.byteLength===e.buffer.byteLength?e:e.slice();function Hl(e,t={}){let n=new us;t.quality&&(n.quality=t.quality);let r=ms(e,{cache:n,time:t.time||0,progress:t.progress||0}),i=r.doc&&r.doc.lineIndex,a={ok:r.ok,diagnostics:r.diagnostics.map(Ml),hostOnly:r.ok?Al(r).map(Ml):[],timings:r.timings,lineText:i&&typeof i.text==`string`&&i.text!==e?i.text:null,lineIndex:!!i};if(!r.ok)return{message:a,transfer:[]};let o=r.scene;if(o.dynamic.length||o.materials.some(Bl))return{message:{...a,main:!0},transfer:[]};let s=new Set,c=e=>{let t=Vl(e);return s.add(t.buffer),t},l=o.count,u={count:l,matrices:c(o.matrices.slice(0,l*16)),geom:c(o.geom.slice(0,l)),mat:c(o.mat.slice(0,l)),uid:c(o.uid.slice(0,l)),lodNode:c(o.lodNode.slice(0,l)),lodChild:c(o.lodChild.slice(0,l)),flags:c(o.flags.slice(0,l)),spheres:c(o.spheres.slice(0,l*4))},d=t.sent,f=Rl(o.geometries,n,d);for(let e of f.buffers)s.add(e);return{message:{...a,scene:{rows:u,geometries:f.columns,meshes:f.packed,materials:o.materials.map(e=>({params:e.params,name:e.name})),lights:o.lights,cameras:o.cameras,lodSwitches:o.lodSwitches,environment:o.environment,controls:o.controls,animation:o.animation,bounds:o.bounds}},transfer:[...s]}}var Ul=class{constructor(e){this.as=e.as||`fragment`,this.source=e.source,this.payload=e.payload||null,this.result=e.result||null,this.owner=e.owner??null,this.used=!1;let t=this.payload;t?(this.ok=t.ok,this.documentDiagnostics=t.diagnostics.map(Nl),this.hostOnly=t.hostOnly.map(Nl),this.timings=t.timings,this.lineText=t.lineText,this.hasLineIndex=t.lineIndex):(this.ok=this.result.ok,this.documentDiagnostics=this.result.diagnostics,this.hostOnly=e.hostOnly||[],this.timings=this.result.timings,this.lineText=null,this.hasLineIndex=!!(this.result.doc&&this.result.doc.lineIndex)),this.lineIndexCache=void 0}get diagnostics(){return this.as===`fragment`?[...this.documentDiagnostics,...this.hostOnly]:this.documentDiagnostics}get lineIndex(){if(this.lineIndexCache!==void 0)return this.lineIndexCache;if(this.result&&this.result.doc)return this.lineIndexCache=this.result.doc.lineIndex;let e=this.lineText||(typeof this.source==`string`?this.source:null);return this.lineIndexCache=this.hasLineIndex&&e?new c(e):null}};function Wl(e,t,n,r){let i=e.scene,a=new Eo(1),o=i.rows;a.count=o.count,a.capacity=o.count,a.matrices=o.matrices,a.geom=o.geom,a.mat=o.mat,a.uid=o.uid,a.lodNode=o.lodNode,a.lodChild=o.lodChild,a.flags=o.flags,a.spheres=o.spheres;let s=i.geometries,c=zl(i.meshes),l=s.maxLods,u=new Map(s.reports.map(([e,t,n])=>[e*l+t,n])),d=new Set(s.failed.map(([e,t])=>e*l+t));t.beginBuild(n);for(let e=0;e<s.keys.length;e++){let n=s.keys[e],i=Array.from(s.deviation.subarray(e*l,e*l+s.devLength[e])),o=s.bounds,f={key:n,identity:s.identities[e],kind:Pl[s.kinds[e]],lods:s.lods[e],doubleSided:!!(s.flags[e]&1),bounds:s.flags[e]&2?{min:[o[e*6],o[e*6+1],o[e*6+2]],max:[o[e*6+3],o[e*6+4],o[e*6+5]]}:null,lodDeviation:i,generate:(e,t,i)=>r(n).generate(e,t,i)},p=t.acquire(f,null);for(let n=0;n<f.lods;n++){let r=s.levels[e*l+n];r<0||p.meshes[n]||(d.has(e*l+n)&&(p.failed=!0,p.failedLods|=1<<n),t.adopt(p,n,c[r],u.get(e*l+n)||null))}a.geometryIndex(p)}return t.endBuild(),a.materials=i.materials.map((e,t)=>new ro(e.params,t,e.name)),a.lights=i.lights,a.cameras=i.cameras,a.lodSwitches=i.lodSwitches,a.environment=i.environment,a.controls=i.controls,a.animation=i.animation,a.bounds=i.bounds,a.version=1,a}var Gl=e=>!!e&&typeof e.then==`function`,Kl=class{constructor(e,t){this.stage=e,this.id=t,this.part=new El(t,`fragment`),this.result=null,this.owner=null,this.source=null,this.warnings=[],this.tasks=[],this.removed=!1,this.time=NaN,this.progress=NaN,this.ready=null}get placed(){return!!this.part.scene}get visible(){return this.part.visible}set visible(e){this.removed||(this.stage.set.setVisible(this.part,e),this.stage.changed=!0)}get diagnostics(){return this.result?[...this.result.diagnostics,...this.warnings]:[]}replace(e,t={}){return this.removed?Promise.resolve({ok:!1,diagnostics:[],fragment:this.id,removed:!0}):(this.ready=this.stage.enqueue(this,e,!!t.immediate),this.ready)}setTransforms(e){let t=Array.from(e||[]);if(this.removed||!this.result)return t.map(()=>!1);let n=this.stage.materialize(this),r=n.graph.byId,i=t.map(e=>r.get(Array.isArray(e)?e[0]:e&&e.id)),a=t.map(e=>Array.isArray(e)?e[1]:e&&e.matrix),{time:o,progress:s}=this.stage.clock(),c=is(n.scene,n.graph,i,a,o,s);return c.some(Boolean)&&(this.stage.set.invalidateBounds(),this.stage.changed=!0),c}setTransform(e,t){return this.setTransforms([[e,t]])[0]===!0}remove(){this.stage.removeFragment(this)}},ql=class{constructor(e={}){this.cache=e.cache||new us,this.clock=e.clock||(()=>({time:0,progress:0})),this.report=e.report||null,this.compiler=e.compiler||null,this.forget=e.forget||null,this.restore=e.restore||null,this.now=e.now||fs,this.set=new Dl,this.host=this.set.insert(new El(null,`host`)),this.hostResult=null,this.hostOwner=ls,this.byId=new Map,this.queue=[],this.waiting=0,this.nextId=1,this.changed=!1}get list(){return[...this.byId.values()]}get queued(){return this.queue.length}get pending(){return this.queue.length>0}takeChanged(){let e=this.changed;return this.changed=!1,e}newOwner(e){return{owner:e}}setHost(e,t){this.set.place(this.host,e.scene),this.adoptHost(e,t)}adoptHost(e,t){this.hostOwner!==t&&this.release(this.hostOwner),this.hostResult=e,this.hostOwner=t,this.changed=!0}release(e){e!=null&&(this.cache.release(e),this.forget&&e!==`document`&&this.forget(e))}fromPrepared(e,t=`fragment`){if(e.used)throw Error(`A prepared document can be shown or added once; prepare it again.`);if(e.used=!0,e.claimed=!0,!e.ok)return{result:{ok:!1,doc:null,graph:null,scene:null,cache:this.cache,diagnostics:e.documentDiagnostics,timings:e.timings,lineIndex:e.lineIndex},owner:null};if(e.result)return{result:e.result,owner:e.owner};let n=this.newOwner(t);if(e.payload.main){let{time:t,progress:r}=this.clock();return{result:ms(e.source,{cache:this.cache,owner:n,time:t,progress:r}),owner:n}}let r=e.source,i=this.cache,a=null,o=Wl(e.payload,i,n,e=>{a||(a=new us,a.quality=i.quality,ms(r,{cache:a}));let t=a.entries.get(e);if(!t)throw Error(`The document has no geometry ${e}.`);return t.desc});e.payload=null;let s=null;return{result:{ok:!0,scene:o,cache:i,graph:null,diagnostics:e.documentDiagnostics,timings:e.timings,prepared:!0,source:r,get doc(){return s||=ir(r),s}},owner:n}}add(e,t={}){let n=t.id==null?null:String(t.id);if(n===null){for(;this.byId.has(`fragment-${this.nextId}`);)this.nextId++;n=`fragment-${this.nextId++}`}if(this.byId.has(n))throw Error(`The stage has a fragment "${n}" already. Replace it, or remove it first.`);let r=new Kl(this,n);return this.byId.set(n,r),this.set.insert(r.part),r.ready=this.enqueue(r,e,!!t.immediate),r}enqueue(e,t,n){this.claim(t);let r,i=new Promise(e=>r=e),a={frag:e,input:t,ready:!Gl(t),cancelled:!1,finished:!1,immediate:n,placing:null,resolve:null};a.resolve=e=>{a.finished=!0,r(e)};for(let t of e.tasks)this.cancel(t),i.then(t.resolve);return e.tasks=[a],Gl(t)&&(this.waiting++,t.then(e=>{a.input=e},e=>{a.input=null,a.error=e}).then(()=>{this.waiting--,a.ready=!0,a.cancelled&&this.discard(a.input)})),n&&a.ready?this.run(a):this.queue.push(a),i}claim(e){if(e instanceof Ul){if(e.claimed)throw Error(`A prepared document can be shown or added once; prepare it again.`);e.claimed=!0}}cancel(e){e.cancelled=!0,e.finished=!0,e.placing&&this.release(e.placing.owner);let t=this.queue.indexOf(e);t>=0&&this.queue.splice(t,1),e.ready&&this.discard(e.input)}discard(e){e instanceof Ul&&!e.used&&e.owner&&(e.used=!0,this.release(e.owner))}applyQueued(e=1/0){let t=this.now(),n=0,r=0;for(;this.queue.length&&!(n&&this.now()-t>=e);){let e=this.queue.findIndex(e=>e.ready);if(e<0)break;let t=this.queue.splice(e,1)[0];r+=this.run(t),n++}return{applied:n,changeMs:n?this.now()-t:0,compileMs:r}}run(e){let t=e.frag;if(t.tasks=t.tasks.filter(t=>t!==e),e.cancelled||t.removed)return 0;if(e.placing){let n=e.placing;return e.placing=null,this.place(t,n.result,n.owner,n.warnings,n.input),e.resolve({ok:!0,diagnostics:t.diagnostics,fragment:t.id}),0}let n=this.now(),r,i,a,o,s=e.input;try{if(s instanceof Ul)({result:r,owner:i}=this.fromPrepared(s,`fragment`)),a=r.ok?s.hostOnly:[],o=s.lineIndex;else if(s==null)r={ok:!1,diagnostics:[],error:e.error};else{i=this.newOwner(`fragment`);let{time:e,progress:t}=this.clock();r=ms(s,{cache:this.cache,owner:i,time:e,progress:t}),a=r.ok?Al(r):[]}}catch(e){r={ok:!1,diagnostics:[],error:e}}let c=this.now()-n;if(!r.ok){i&&this.release(i);let n=r.error?String(r.error&&r.error.message?r.error.message:r.error):sr({diagnostics:r.diagnostics,lineIndex:o||r.doc&&r.doc.lineIndex});return this.report&&this.report(n,{...r,fragment:t.id}),e.resolve({ok:!1,diagnostics:r.diagnostics,fragment:t.id}),c}let l=this.restore&&!e.immediate&&!r.prepared?this.restore(this.cache,i):null;return l?(e.placing={result:r,owner:i,warnings:a,input:s},e.ready=!1,t.tasks.push(e),this.queue.push(e),this.waiting++,Promise.resolve(l).catch(()=>{}).then(()=>{this.waiting--,e.ready=!0}),c):(this.place(t,r,i,a,s),e.resolve({ok:!0,diagnostics:t.diagnostics,fragment:t.id}),c)}place(e,t,n,r,i,a=!1){let o=e.owner;this.set.place(e.part,t.scene),e.result=t,e.owner=n,e.source=i instanceof Ul?i.source:i,e.warnings=r||[];let{time:s,progress:c}=this.clock();e.time=s,e.progress=c,o&&o!==n&&this.release(o),this.changed=!0,!a&&e.warnings.length&&this.report&&this.report(sr({diagnostics:e.warnings,lineIndex:t.doc&&!t.prepared?t.doc.lineIndex:null}),{ok:!0,diagnostics:e.warnings,fragment:e.id})}materialize(e){let t=e.result;if(t.graph)return t;let n=this.newOwner(`fragment`),{time:r,progress:i}=this.clock(),a=ms(e.source,{cache:this.cache,owner:n,time:r,progress:i});return this.place(e,a,n,e.warnings,e.source,!0),a}removeFragment(e){if(!e.removed){e.removed=!0;for(let t of e.tasks)this.cancel(t),t.resolve({ok:!1,diagnostics:[],fragment:e.id,removed:!0});e.tasks=[],this.set.remove(e.part),this.release(e.owner),e.owner=null,this.byId.delete(e.id),this.changed=!0}}clear(){for(let e of this.list)this.removeFragment(e)}prepare(e,t={}){let n=t.as===`document`?`document`:`fragment`,{time:r,progress:i}=this.clock(),a=()=>{let t=this.newOwner(n),a=ms(e,{cache:this.cache,owner:t,time:r,progress:i});return a.ok||this.release(t),new Ul({as:n,source:e,result:a,owner:a.ok?t:null,hostOnly:a.ok?Al(a):[]})};return this.compiler?this.compiler.compile(e,{time:r,progress:i,quality:this.cache.quality}).then(t=>t?new Ul({as:n,source:e,payload:t}):a()):Promise.resolve(a())}updateDynamic(e,t){let n=!1;for(let r of this.byId.values()){let i=r.result;i&&r.part.drawn&&i.scene.dynamic.length&&i.graph&&(r.time!==e||r.progress!==t)&&(os(i.scene,i.graph,e,t),r.time=e,r.progress=t,n=!0)}return n&&this.set.invalidateBounds(),n}names(e,t){if(!e||e===this.host)return nc(this.hostResult&&this.hostResult.doc,t);let n=this.byId.get(e.id);return n&&n.result?nc(n.result.doc,t):[]}dispose(){this.clear(),this.compiler&&this.compiler.dispose&&this.compiler.dispose()}};function Jl(){return Cl}var Yl=1e4,Xl=2e5;function Zl(e){let t=new Set,n=n=>{let{id:r,input:i,time:a,progress:o,quality:s}=n.data||{};t.size>Xl&&t.clear();let c;try{c=Hl(i,{time:a,progress:o,quality:s,sent:t})}catch(t){e.postMessage({id:r,error:String(t&&t.message?t.message:t)});return}try{e.postMessage({id:r,...c.message},c.transfer)}catch{e.postMessage({id:r,ok:c.message.ok,diagnostics:c.message.diagnostics,hostOnly:c.message.hostOnly,timings:c.message.timings,lineText:c.message.lineText,lineIndex:c.message.lineIndex,main:!0})}};e.onmessage=n;for(let e of wl.splice(0))n(e)}function Ql(e){if(typeof Worker!=`function`||!e)return null;let t=typeof location>`u`||new URL(e).origin===location.origin;try{if(t)return new Worker(e,{type:`module`})}catch{}try{let t=new Blob([`import ${JSON.stringify(e)};`],{type:`text/javascript`});return new Worker(URL.createObjectURL(t),{type:`module`})}catch{return null}}var $l=class{constructor(e){if(this.worker=Ql(e),this.failed=!this.worker,this.pending=new Map,this.next=1,!this.worker)return;this.answered=!1,this.watchdog=0,this.worker.onmessage=e=>{let t=e.data;this.answered=!0,clearTimeout(this.watchdog);let n=this.pending.get(t.id);n&&(this.pending.delete(t.id),n(t.error?null:t))};let t=()=>{clearTimeout(this.watchdog),this.failed=!0;for(let e of this.pending.values())e(null);this.pending.clear();try{this.worker.terminate()}catch{}};this.worker.onerror=e=>{e&&e.preventDefault&&e.preventDefault(),t()},this.worker.onmessageerror=t,this.fail=t}compile(e,t){if(this.failed)return Promise.resolve(null);let n=this.next++;return new Promise(r=>{this.pending.set(n,r),!this.answered&&!this.watchdog&&(this.watchdog=setTimeout(()=>this.fail(),Yl));try{this.worker.postMessage({id:n,input:e,time:t.time,progress:t.progress,quality:t.quality})}catch{this.pending.delete(n),r(null)}})}dispose(){this.worker&&this.worker.terminate();for(let e of this.pending.values())e(null);this.pending.clear(),this.failed=!0}};Jl()&&Zl(self);var eu=()=>typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,tu=e=>typeof requestIdleCallback==`function`?requestIdleCallback(e,{timeout:500}):setTimeout(e,16),nu=()=>performance.now();function ru(e={},t=!1){let n=e.background===!0,r=e.clock===`always`||e.clock==null&&n,i=e.autoOrbit===void 0?!n:e.autoOrbit!==!1;return{clock:r?`always`:`document`,playing:e.playing!==!1&&!t,auto:i&&!t}}function iu(e,t,n){return!!(e.playing&&!n&&(e.clock===`always`||t.animation&&t.animation.time))}function au(e,t){return!(!e.auto||t)}var ou=24,su=50,cu=(e,t)=>Promise.race([e,new Promise(e=>setTimeout(e,t))]);async function lu(e,t={}){let n=Hs(t.geometryStore===!1?null:t.geometryStore||Js()),r=await vl(e,{backend:t.backend,present:t.present});r.options.tessellationBudget=4;let i=r.canvas||e,a=i.parentElement;i.style.display=`block`;let o=new yl,s=new bl(i,o),c=ru(t,eu()),l={result:null,cache:new us,setMode:!1,time:0,progress:0,last:0,disposed:!1,clock:c.clock,playing:c.playing,auto:c.auto,orbitSpeed:t.orbitSpeed??.22,onScreen:!0,dirty:!0,sceneTime:NaN,sceneProgress:NaN,width:0,height:0,dpr:r.pixelRatio(typeof devicePixelRatio==`number`?devicePixelRatio:1),gpuEpoch:r.backend.resourceEpoch||0,timeline:null,generation:0,holdUntil:0,changeBudget:t.changeBudget??4,workers:t.workers??1,compilerTried:!1,placedSinceDraw:!1,framesDrawn:0,waiters:[],since:{changeMs:0,compileMs:0},stats:{frameMs:0,changeMs:0,compileMs:0,tessellateMs:0,renderMs:0,instances:0,drawCalls:0,uploadBytes:0,refining:0,queued:0},storeOwners:new Set},u=()=>{l.dirty=!0};r.textures.onReady=u;let d=new ql({cache:l.cache,clock:()=>({time:l.time,progress:l.progress}),report:(e,n)=>{t.onError?t.onError(e,n):n.ok?console.warn(e):console.error(e)},forget:e=>{n.forget(e),l.storeOwners.delete(e)},restore:(e,t)=>n.store?cu(n.restore(e,{entries:e.owned(t)}),su):null}),f=new Float64Array(15).fill(NaN),p=!1,m=(e,t)=>{f[e]!==t&&(f[e]=t,p=!0)},h=()=>{let e=o;p=!1;for(let t=0;t<3;t++)m(t,e.position[t]),m(3+t,e.target[t]),m(6+t,e.up[t]);return m(9,e.fov),m(10,e.orthoHeight),m(11,+(e.type===`orthographic`)),m(12,e.near??-1),m(13,e.refAspect),m(14,e.fit===`cover`?1:e.fit===`width`?2:e.fit===`height`?3:0),p},g=(e,t)=>l.cache.mesh(e,t),_=()=>l.setMode?d.set:l.result&&l.result.scene,v=e=>{let t=r.frames.lodStates(e,o.position,e=>Math.hypot(e[0]-o.position[0],e[1]-o.position[1],e[2]-o.position[2]));return n=>{let r=e.lodNode[n];return r<0||t.visible[r]&&t.active[r]===e.lodChild[n]}},y=e=>{if(!e.parts)return v(e);let t=new Map;return(e,n)=>{let r=t.get(n);return r||t.set(n,r=v(n)),r(e)}},b=()=>{let e=_();return e?{scene:e,meshOf:g,isVisible:y(e)}:null};s.onChange=()=>{l.auto=!1,l.dirty=!0,t.onInteract&&t.onInteract()},s.onClick=(e,n)=>{let a=_();if(!a||!t.onPick)return;let s=i.clientWidth,c=i.clientHeight;if(!s||!c)return;o.update(s/c,r.backend.zeroToOne,a.bounds);let u=o.ray(e,n,s,c,r.backend.zeroToOne),f=tc(a,g,u.origin,u.dir,y(a));if(!f)return t.onPick(null);if(!a.parts)return t.onPick({...f,names:nc(l.result.doc,f.uid)});let{part:p,...m}=f,h={...m,names:d.names(p,f.uid)};p&&p!==d.host&&(h.fragment=p.id),t.onPick(h)};let x=new IntersectionObserver(([e])=>{l.onScreen=e.isIntersecting,l.onScreen&&(l.dirty=!0)},{threshold:.02});x.observe(a||i);let S=new ResizeObserver(([e])=>{let t=e.contentBoxSize&&e.contentBoxSize[0],n=Math.round(t?t.inlineSize:e.contentRect.width),r=Math.round(t?t.blockSize:e.contentRect.height);(n!==l.width||r!==l.height)&&(l.width=n,l.height=r,i.style.width=`${n}px`,i.style.height=`${r}px`,l.dirty=!0)});S.observe(a||i);let C=()=>l.result&&l.result.scene.controls?l.result.scene.controls.mode:`orbit`,w=()=>C()!==`orbit`&&l.result&&l.result.scene.cameras.length>0,T=()=>({width:l.width,height:l.height,dpr:typeof devicePixelRatio==`number`?devicePixelRatio:1}),E=()=>{let e=l.generation,t=0,n=()=>{let i=l.result;if(l.disposed||e!==l.generation||!i||t>ou)return;if(!l.width||!l.height)return void setTimeout(()=>tu(n),200);let a=t/ou;t++,os(i.scene,i.graph,l.time,a);let s=w()?new yl().fromSpec(i.scene.cameras[0]):o;r.prepare(s,T()),os(i.scene,i.graph,l.sceneTime,l.sceneProgress),O(),tu(n)};tu(n)},D=(e=!0)=>{let n=_();if(!n||!n.animation.scroll)l.timeline&&l.timeline.dispose(),l.timeline=null;else{if(!l.timeline){let n=t.scroll||document.scrollingElement||document.documentElement;l.timeline=new Sl(n),e=!0}e&&(l.timeline.update(0),l.progress=l.timeline.value)}},O=()=>{if(!l.setMode)l.result&&n.changed(l.result.cache);else{for(let e of l.storeOwners)n.changed(l.cache,{owner:e,entries:()=>l.cache.owned(e)});l.storeOwners.clear()}},k=()=>{l.setMode||(l.setMode=!0,l.result&&d.set.place(d.host,l.result.scene),r.setScene(d.set,g),l.cache.onGenerate=e=>{for(let t of e.owners)l.storeOwners.add(t)},l.dirty=!0)},A=()=>{let e=l.result;if(!e||e.graph||!e.prepared)return e;let t=d.newOwner(`document`),n=ms(e.source,{cache:l.cache,owner:t,time:l.time,progress:l.progress});return l.result=n,l.setMode?d.setHost(n,t):(d.adoptHost(n,t),r.setScene(n.scene,g)),l.dirty=!0,n},j=()=>{if(l.compilerTried||(l.compilerTried=!0,l.workers===0))return;let e=new $l(import.meta.url);e.failed||(d.compiler=e)},ee=()=>{l.waiters.length&&(l.placedSinceDraw||!l.framesDrawn||r.stats.refining||(l.waiters=l.waiters.filter(e=>{for(let t of e.tasks)if(!t.finished)return!0;return e.resolve(l.stats),!1})))},M={camera:o,renderer:r,controls:s,kind:r.kind,get time(){return l.time},set time(e){l.time=e},get progress(){return l.progress},set progress(e){l.timeline&&=(l.timeline.dispose(),null),l.progress=Math.min(1,Math.max(0,e))},get playing(){return l.playing},set playing(e){l.playing=!!e},get reducedMotion(){return eu()},get changeBudget(){return l.changeBudget},set changeBudget(e){l.changeBudget=Math.max(0,+e||0)},get stats(){return{...l.stats}},setTransforms(e){let t=Array.from(e||[]),n=A(),r=n&&n.graph,i=r&&r.byId,a=t.map(e=>i&&i.get(Array.isArray(e)?e[0]:e&&e.id)),o=t.map(e=>Array.isArray(e)?e[1]:e&&e.matrix),s=r&&n.scene?is(n.scene,r,a,o,l.time,l.progress):t.map(()=>!1);return s.some(Boolean)&&(l.dirty=!0,l.setMode&&d.set.invalidateBounds()),s},setTransform(e,t){return this.setTransforms([[e,t]])[0]===!0},invalidate:u,get result(){return A()},show(e,i={}){i.time!==void 0&&(l.time=i.time);let a,c;if(e instanceof Ul?{result:a,owner:c}=d.fromPrepared(e,`document`):(c=l.setMode?d.newOwner(`document`):ls,a=ms(e,{time:l.time,progress:l.progress,cache:l.cache,owner:c})),!a.ok){c&&c!==`document`&&d.release(c);let e=sr(a);return t.onError?t.onError(e,a):console.error(e),a}l.setMode&&i.keepFragments===!1&&d.clear(),l.result=a,l.generation++,l.setMode?(d.setHost(a,c),r.updateScene(d.set),l.placedSinceDraw=!0):(d.adoptHost(a,c),r.setScene(a.scene,g)),D(),l.progress!==0&&a.graph&&os(a.scene,a.graph,l.time,l.progress),l.sceneTime=l.time,l.sceneProgress=l.progress,l.dirty=!0;let u=a.scene.controls;s.configure(u,{world:b}),t.interactive===!1&&(s.enabled=!1),u&&u.mode!==`orbit`&&(l.auto=!1),(!i.keepCamera||w())&&(a.scene.cameras.length?o.fromSpec(a.scene.cameras[0]):o.frame(a.scene.bounds));let f=l.generation;return l.holdUntil=performance.now()+su,n.restore(l.cache,l.setMode?{entries:l.cache.owned(c)}:void 0).finally(()=>{f===l.generation&&(l.holdUntil=0,l.dirty=!0,a.scene.animation.scroll&&a.graph&&E())}),a},add(e,t={}){k();let n=d.add(e,t);return l.dirty=!0,n},fragment(e){return d.byId.get(String(e))},get fragments(){return d.list},prepare(e,t={}){return j(),d.prepare(e,t)},drawn(){return new Promise(e=>{l.waiters.push({resolve:e,tasks:new Set(d.queue)}),l.dirty=!0})},dispose(){l.disposed=!0,x.disconnect(),S.disconnect(),l.timeline&&l.timeline.dispose(),d.dispose(),s.dispose(),r.dispose()}},N=e=>{if(l.disposed)return;requestAnimationFrame(N);let n=nu(),i=l.last?Math.min(.05,(e-l.last)/1e3):0;if(l.last=e,l.setMode){if(d.queue.length){let e=d.applyQueued(l.changeBudget);l.since.changeMs+=e.changeMs,l.since.compileMs+=e.compileMs}d.takeChanged()&&(r.updateScene(d.set),D(!1),l.placedSinceDraw=!0,l.dirty=!0)}let a=_();if(!a||!l.onScreen||!l.width||!l.height)return;let c=l.result,u=eu();if(iu(l,a,u)&&(l.time+=i),l.timeline&&l.timeline.update(i)&&(l.progress=l.timeline.value),t.onFrame&&t.onFrame(i,M),au(l,u)){let e=s.snapshot(),t=o.position[0]-o.target[0],n=o.position[2]-o.target[2],r=l.orbitSpeed*i,a=Math.cos(r),c=Math.sin(r);o.position[0]=o.target[0]+t*a-n*c,o.position[2]=o.target[2]+t*c+n*a,s.constrain(e)}c&&c.graph&&c.scene.dynamic.length&&(l.time!==l.sceneTime||l.progress!==l.sceneProgress)&&(os(c.scene,c.graph,l.time,l.progress),l.sceneTime=l.time,l.sceneProgress=l.progress,w()&&o.fromSpec(c.scene.cameras[0]),l.setMode&&d.set.invalidateBounds(),l.dirty=!0),l.setMode&&d.updateDynamic(l.time,l.progress)&&(l.dirty=!0),h()&&(l.dirty=!0);let f=r.pixelRatio(typeof devicePixelRatio==`number`?devicePixelRatio:1);f!==l.dpr&&(l.dpr=f,l.dirty=!0);let p=r.backend.resourceEpoch||0;if(p!==l.gpuEpoch&&(l.gpuEpoch=p,l.dirty=!0),!l.dirty||l.holdUntil&&e<l.holdUntil){ee();return}l.dirty=!1;let m=l.cache.stats.generateMs,g=nu();r.render(o,{...T(),time:l.time});let v=nu()-g;r.stats.refining&&(l.dirty=!0),O();let y=l.cache.stats.generateMs-m,b=r.stats,x=l.stats;x.changeMs=l.since.changeMs,x.compileMs=l.since.compileMs,x.tessellateMs=y,x.renderMs=v-y,x.instances=b.instances,x.drawCalls=b.drawCalls,x.uploadBytes=b.uploadBytes,x.refining=b.refining,x.queued=d.queue.length,l.since.changeMs=0,l.since.compileMs=0,l.placedSinceDraw=!1,l.framesDrawn++,x.frameMs=nu()-n,ee()};return requestAnimationFrame(N),M}function uu(e){return typeof e==`string`?new TextEncoder().encode(e):e instanceof Uint8Array?e:new Uint8Array(e)}async function du(e,t){let n=new Blob([e]).stream().pipeThrough(t);return new Uint8Array(await new Response(n).arrayBuffer())}async function fu(e){return du(uu(e),new DecompressionStream(`gzip`))}function pu(e){return e.length>2&&e[0]===31&&e[1]===139}function mu(e){let t=e.lodSwitches,n=new Uint8Array(t.length);for(let e=0;e<t.length;e++){let r=t[e];n[e]=r.parent<0||n[r.parent]&&r.parentChild===0?1:0}let r=[];for(let t=0;t<e.count;t++){let i=e.lodNode[t];i>=0&&!(n[i]&&e.lodChild[t]===0)||r.push(t)}return r}function hu(e){let t=new Set;for(let n=0;n<e.count;n++){let r=e.materials[e.mat[n]];r&&(r.map||r.normalMap)&&t.add(e.geom[n])}return t}function gu(e){let t=new Set;return e.map((e,n)=>{let r=String(e.name||`material${n}`).replace(/[^A-Za-z0-9_.-]/g,`_`)||`material${n}`,i=r,a=1;for(;t.has(i);)i=`${r}_${a++}`;return t.add(i),i})}var _u=class{constructor(e=64){this.count=0,this.geom=new Int32Array(e),this.mat=new Int32Array(e),this.matrices=new Float64Array(e*16)}push(e,t,n){if(this.count===this.geom.length){let e=this.geom.length*2,t=new Int32Array(e),n=new Int32Array(e),r=new Float64Array(e*16);t.set(this.geom),n.set(this.mat),r.set(this.matrices),this.geom=t,this.mat=n,this.matrices=r}let r=this.count++;this.geom[r]=e,this.mat[r]=t;let i=r*16,a=this.matrices;for(let e=0;e<16;e++)a[i+e]=n[e]}};function vu(e){let t=e.instances,n=new Eo(Math.max(16,t.count));n.environment={background:[.09,.1,.12,1],sky:[.8,.86,.95,1],ground:[.25,.22,.2,1],intensity:.5,exposure:1},n.materials=e.materials.map((e,t)=>new ro({...no,...e},t,e.name||`material${t}`)),n.materials.length||n.materials.push(new ro({...no},0,`default`));let r=e.geometries.map((e,t)=>({id:t+1,key:e.key||`external:${t}`,kind:e.mesh.kind,lods:1,doubleSided:!1,bounds:e.mesh.bounds,meshes:[e.mesh]})).map(e=>n.geometryIndex(e)),i=n.materials.length-1,a=new Float64Array(16);for(let e=0;e<t.count;e++){for(let n=0;n<16;n++)a[n]=t.matrices[e*16+n];n.setInstance(e,r[t.geom[e]],Math.min(t.mat[e],i),a,0,-1,0)}return n.count=t.count,n.bounds.min[0]<=n.bounds.max[0]||(n.bounds={min:[-1,-1,-1],max:[1,1,1]}),n.version++,{scene:n,meshOf:e=>e.meshes[0]}}function yu(e,t){if(!Number.isFinite(e))return`0`;let n=e.toFixed(t);if(n.indexOf(`.`)>=0){let e=n.length;for(;n.charCodeAt(e-1)===48;)e--;n.charCodeAt(e-1)===46&&e--,n=n.slice(0,e)}return n===`-0`?`0`:n}var bu=5126,xu=5120,Su=5122,Cu=5123,wu=5125,Tu=34962,Eu=34963,Du=e=>Math.abs(e)<1e-12?0:Number(e.toPrecision(7)),Ou=class{constructor(){this.chunks=[],this.length=0,this.views=[],this.accessors=[]}add(e,t,n=0){let r=(4-this.length%4)%4;r&&(this.chunks.push(new Uint8Array(r)),this.length+=r);let i=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),a={buffer:0,byteOffset:this.length,byteLength:i.byteLength};return n&&(a.byteStride=n),t&&(a.target=t),this.chunks.push(i.slice()),this.length+=i.byteLength,this.views.push(a),this.views.length-1}accessor(e,t,n,r,i,a=null,{byteStride:o=0,normalized:s=!1}={}){let c={bufferView:this.add(e,i,o),componentType:t,count:r,type:n};return s&&(c.normalized=!0),a&&(c.min=a.min,c.max=a.max),this.accessors.push(c),this.accessors.length-1}bytes(){let e=new Uint8Array(Math.ceil(this.length/4)*4),t=0;for(let n of this.chunks)e.set(n,t),t+=n.byteLength;return e}};function ku(e){let t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let r=0;r<e.length;r+=3)for(let i=0;i<3;i++)e[r+i]<t[i]&&(t[i]=e[r+i]),e[r+i]>n[i]&&(n[i]=e[r+i]);return e.length?{min:t.map(e=>Math.fround(e)),max:n.map(e=>Math.fround(e))}:{min:[0,0,0],max:[0,0,0]}}function Au(e){let t=e.positions,n=e.normals,r=e.vertexCount,{min:i,max:a}=ku(t),o=[0,1,2].map(e=>(i[e]+a[e])/2),s=[0,1,2].map(e=>Math.max((a[e]-i[e])/2,1e-12)),c=new Int16Array(r*4),l=new Int8Array(r*4),u=[32767,32767,32767],d=[-32767,-32767,-32767];for(let e=0;e<r;e++){let r=n[e*3]*s[0],i=n[e*3+1]*s[1],a=n[e*3+2]*s[2],f=Math.hypot(r,i,a)||1,p=[r/f,i/f,a/f];for(let n=0;n<3;n++){let r=Math.max(-32767,Math.min(32767,Math.round((t[e*3+n]-o[n])/s[n]*32767)));c[e*4+n]=r,r<u[n]&&(u[n]=r),r>d[n]&&(d[n]=r),l[e*4+n]=Math.max(-127,Math.min(127,Math.round(p[n]*127)))}}return{positions:c,normals:l,center:o,half:s,min:u,max:d}}function ju(e,t,{lod:n=0,instancing:r=!1,uvs:i=`auto`,quantize:a=!1}={}){let o=new Ou,s=gu(e.materials),c={asset:{version:`2.0`,generator:`ES3D reference implementation`},scene:0,scenes:[{nodes:[]}],nodes:[],meshes:[],materials:e.materials.map((e,t)=>{let n={name:s[t],pbrMetallicRoughness:{baseColorFactor:[Du(e.baseColor[0]),Du(e.baseColor[1]),Du(e.baseColor[2]),Du(e.opacity)],metallicFactor:Du(e.metallic),roughnessFactor:Du(e.roughness)}};return e.emissive.some(e=>e>0)&&(n.emissiveFactor=e.emissive.map(e=>Du(Math.min(1,e)))),e.alphaMode===`mask`?(n.alphaMode=`MASK`,n.alphaCutoff=e.alphaCutoff??.5):(e.alphaMode===`blend`||e.alphaMode!==`opaque`&&e.opacity<1)&&(n.alphaMode=`BLEND`),e.doubleSided&&(n.doubleSided=!0),n}),accessors:o.accessors,bufferViews:o.views,buffers:[{byteLength:0}]},l=new Map,u=new Map,d=i===`auto`?hu(e):null,f=r=>{let s=l.get(r);if(s)return s;let c=e.geometries[r],u=t(c,Math.min(n,c.lods-1)),f,p=null;if(a&&u.kind===`triangles`&&u.vertexCount){let e=Au(u);f={POSITION:o.accessor(e.positions,Su,`VEC3`,u.vertexCount,Tu,{min:e.min,max:e.max},{byteStride:8,normalized:!0}),NORMAL:o.accessor(e.normals,xu,`VEC3`,u.vertexCount,Tu,null,{byteStride:4,normalized:!0})},p=L(),p[0]=e.half[0],p[5]=e.half[1],p[10]=e.half[2],p[12]=e.center[0],p[13]=e.center[1],p[14]=e.center[2]}else f={POSITION:o.accessor(u.positions,bu,`VEC3`,u.vertexCount,Tu,ku(u.positions))},u.kind===`triangles`&&(f.NORMAL=o.accessor(u.normals,bu,`VEC3`,u.vertexCount,Tu));u.kind===`triangles`&&(i===!0||d&&d.has(r))&&(f.TEXCOORD_0=o.accessor(u.uvs,bu,`VEC2`,u.vertexCount,Tu));let m=u.vertexCount<65536,h=m?Uint16Array.from(u.indices):u.indices,g=o.accessor(h,m?Cu:wu,`SCALAR`,h.length,Eu);return s={attributes:f,indices:g,mode:u.kind===`lines`?1:4,empty:u.vertexCount===0,dequant:p},l.set(r,s),s},p=(e,t)=>{let n=`${e}|${t}`,r=u.get(n);if(r!==void 0)return r;let i=f(e);return r=c.meshes.length,c.meshes.push({primitives:[{attributes:i.attributes,indices:i.indices,material:t,mode:i.mode}]}),u.set(n,r),r},m=mu(e),h=new Float64Array(16),g=t=>{for(let n=0;n<16;n++)h[n]=e.matrices[t*16+n];let n=f(e.geom[t]).dequant;return n&&R(h,h,n),h},_=(e,t)=>{g(e);let n={mesh:t},r=Ot(h);r?(r.translation.some(e=>Math.abs(e)>1e-9)&&(n.translation=r.translation.map(Du)),Math.abs(r.rotation[3]-1)>1e-9&&(n.rotation=r.rotation.map(Du)),r.scale.some(e=>Math.abs(e-1)>1e-9)&&(n.scale=r.scale.map(Du))):n.matrix=Array.from(h,Du),c.nodes.push(n),c.scenes[0].nodes.push(c.nodes.length-1)};if(a&&(c.extensionsUsed=[`KHR_mesh_quantization`],c.extensionsRequired=[`KHR_mesh_quantization`]),r){c.extensionsUsed=[...c.extensionsUsed||[],`EXT_mesh_gpu_instancing`];let t=new Map;for(let n of m){let r=`${e.geom[n]}|${e.mat[n]}`,i=t.get(r);i||t.set(r,i=[]),i.push(n)}for(let[e,n]of t){let[t,r]=e.split(`|`).map(Number);if(f(t).empty)continue;let i=p(t,r),a=[],s=n.length>1;for(let e of n){let t=Ot(g(e));if(!t){s=!1;break}a.push(t)}if(!s){for(let e of n)_(e,i);continue}let l=new Float32Array(n.length*3),u=new Float32Array(n.length*4),d=new Float32Array(n.length*3);a.forEach((e,t)=>{l.set(e.translation,t*3),u.set(e.rotation,t*4),d.set(e.scale,t*3)});let m={TRANSLATION:o.accessor(l,bu,`VEC3`,n.length),ROTATION:o.accessor(u,bu,`VEC4`,n.length),SCALE:o.accessor(d,bu,`VEC3`,n.length)};c.nodes.push({mesh:i,extensions:{EXT_mesh_gpu_instancing:{attributes:m}}}),c.scenes[0].nodes.push(c.nodes.length-1)}}else for(let t of m)f(e.geom[t]).empty||_(t,p(e.geom[t],e.mat[t]));let v=o.bytes();c.buffers[0].byteLength=v.byteLength,c.meshes.length||delete c.meshes;let y=new TextEncoder().encode(JSON.stringify(c)),b=new Uint8Array(Math.ceil(y.length/4)*4).fill(32);b.set(y);let x=20+b.length+(v.length?8+v.length:0),S=new Uint8Array(x),C=new DataView(S.buffer);if(C.setUint32(0,1179937895,!0),C.setUint32(4,2,!0),C.setUint32(8,x,!0),C.setUint32(12,b.length,!0),C.setUint32(16,1313821514,!0),S.set(b,20),v.length){let e=20+b.length;C.setUint32(e,v.length,!0),C.setUint32(e+4,5130562,!0),S.set(v,e+8)}return S}var Mu={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT4:16},Nu={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},Pu={5120:(e,t)=>e.getInt8(t),5121:(e,t)=>e.getUint8(t),5122:(e,t)=>e.getInt16(t,!0),5123:(e,t)=>e.getUint16(t,!0),5125:(e,t)=>e.getUint32(t,!0),5126:(e,t)=>e.getFloat32(t,!0)},Fu={5120:127,5121:255,5122:32767,5123:65535};function Iu(e){return e.length>=12&&e[0]===103&&e[1]===108&&e[2]===84&&e[3]===70}function Lu(e,t){let n=new Map;return(r,i=!1)=>{let a=i?-1-r:r;if(n.has(a))return n.get(a);let o=e.accessors[r];if(!o)throw Error(`glTF accessor ${r} does not exist.`);if(o.sparse)throw Error(`glTF accessor ${r} is sparse; sparse accessors are not supported.`);let s=Nu[o.componentType];if(!s)throw Error(`Unsupported accessor component type ${o.componentType}.`);let c=Mu[o.type],l=c*o.count,u;if(o.bufferView===void 0)u=new s(l);else{let n=e.bufferViews[o.bufferView],i=t[n.buffer];if(!i)throw Error(`glTF buffer ${n.buffer} is missing.`);let a=i.byteOffset+(n.byteOffset||0)+(o.byteOffset||0),d=n.byteStride||0,f=c*s.BYTES_PER_ELEMENT;if(a+(o.count?(d||f)*(o.count-1)+f:0)>i.byteOffset+i.byteLength)throw Error(`glTF accessor ${r} reads past the end of buffer ${n.buffer}.`);if(d&&d!==f){u=new s(l);let e=new DataView(i.buffer),t=Pu[o.componentType];for(let n=0;n<o.count;n++)for(let r=0;r<c;r++)u[n*c+r]=t(e,a+n*d+r*s.BYTES_PER_ELEMENT)}else u=a%s.BYTES_PER_ELEMENT===0?new s(i.buffer,a,l):new s(i.buffer.slice(a,a+l*s.BYTES_PER_ELEMENT))}if(i&&!(u instanceof Float32Array)){let e=new Float32Array(u.length);if(o.normalized){let t=Fu[o.componentType];for(let n=0;n<u.length;n++)e[n]=Math.max(u[n]/t,-1)}else e.set(u);u=e}return n.set(a,u),u}}function Ru(e){if(!Iu(e))throw Error(`Not a GLB file (missing glTF magic).`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint32(4,!0);if(n!==2)throw Error(`Unsupported glTF version ${n}.`);let r=12,i=null,a=null;for(;r+8<=e.byteLength;){let n=t.getUint32(r,!0),o=t.getUint32(r+4,!0),s=e.subarray(r+8,r+8+n);o===1313821514?i=JSON.parse(new TextDecoder().decode(s)):o===5130562&&(a=s),r+=8+n}if(!i)throw Error(`GLB has no JSON chunk.`);let o=(i.buffers||[]).map((e,t)=>t===0&&e.uri===void 0?a:Bu(e,t,null));return{json:i,accessor:Lu(i,o)}}function zu(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function Bu(e,t,n){let r=e.uri;if(r===void 0)throw Error(`glTF buffer ${t} has no data (no uri and no GLB binary chunk).`);if(r.startsWith(`data:`)){let e=r.indexOf(`,`);if(e<0||!/;base64$/i.test(r.slice(0,e)))throw Error(`glTF buffer ${t}: only base64 data: URIs are supported.`);return zu(r.slice(e+1))}let i=decodeURIComponent(r),a=n||{},o=i.split(`/`).pop(),s=[i,o].find(e=>a[e])||Object.keys(a).find(e=>e.toLowerCase()===o.toLowerCase());if(!s)throw Error(`glTF buffer "${i}" is missing: open it together with the .gltf file.`);let c=a[s];if(c.byteLength<(e.byteLength||0))throw Error(`glTF buffer "${i}" is ${c.byteLength} bytes long but should be ${e.byteLength}.`);return c}function Vu(e,t={}){let n=typeof e==`string`?JSON.parse(e):e instanceof Uint8Array?JSON.parse(new TextDecoder().decode(e)):e,r=n&&n.asset&&String(n.asset.version);if(!r)throw Error(`Not a glTF file: the JSON has no "asset" with a "version".`);if(!r.startsWith(`2`))throw Error(`Unsupported glTF version ${r} (only 2.0 is supported).`);return{json:n,accessor:Lu(n,(n.buffers||[]).map((e,n)=>Bu(e,n,t)))}}function Hu(e,t,n,r,i,a,o,s,c,l,u){return yt(e,i,a,o,s),e[0]*=c,e[1]*=c,e[2]*=c,e[4]*=l,e[5]*=l,e[6]*=l,e[8]*=u,e[9]*=u,e[10]*=u,e[12]=t,e[13]=n,e[14]=r,e}function Uu(e,t){if(e.matrix){for(let n=0;n<16;n++)t[n]=e.matrix[n];return t}let n=e.translation,r=e.rotation,i=e.scale;return Hu(t,n?n[0]:0,n?n[1]:0,n?n[2]:0,r?r[0]:0,r?r[1]:0,r?r[2]:0,r?r[3]:1,i?i[0]:1,i?i[1]:1,i?i[2]:1)}function Wu(e){return qu(Ru(e))}function Gu(e,t={}){return qu(Vu(e,t))}function Ku(e,t){let n=e.length;switch(t){case 4:case 1:return e instanceof Uint32Array?e:Uint32Array.from(e);case 5:{let t=new Uint32Array(Math.max(0,n-2)*3);for(let r=0;r+2<n;r++){let n=!(r&1);t[r*3]=e[n?r:r+1],t[r*3+1]=e[n?r+1:r],t[r*3+2]=e[r+2]}return t}case 6:{let t=new Uint32Array(Math.max(0,n-2)*3);for(let r=0;r+2<n;r++)t[r*3]=e[0],t[r*3+1]=e[r+1],t[r*3+2]=e[r+2];return t}case 3:case 2:{let r=t===2?n:n-1,i=new Uint32Array(Math.max(0,r)*2);for(let t=0;t<r;t++)i[t*2]=e[t],i[t*2+1]=e[(t+1)%n];return i}default:return null}}function qu({json:e,accessor:t}){let n={points:0,textures:0},r=(e.materials||[]).map((e,t)=>{let n=e.pbrMetallicRoughness||{},r=n.baseColorFactor||[1,1,1,1],i=e.emissiveFactor||[0,0,0];return{name:e.name||`material${t}`,color:[ke(r[0]),ke(r[1]),ke(r[2]),1],opacity:r[3],metallic:n.metallicFactor??1,roughness:n.roughnessFactor??1,alphaMode:(e.alphaMode||`OPAQUE`).toLowerCase()===`mask`?`mask`:(e.alphaMode||`OPAQUE`).toLowerCase()===`blend`?`blend`:`opaque`,alphaCutoff:e.alphaCutoff??.5,emissive:[ke(i[0]),ke(i[1]),ke(i[2]),1],doubleSided:!!e.doubleSided}}),i=r.length;r.push({name:`default`});let a=[],o=new Map,s=new Map,c=(r,i)=>{let o=e.meshes[r].primitives[i],c=o.attributes,l=[c.POSITION,c.NORMAL,c.TEXCOORD_0,o.indices,o.mode].join(`|`),u=s.get(l);if(u!==void 0)return u;let d=t(o.attributes.POSITION,!0),f=o.attributes.NORMAL===void 0?null:t(o.attributes.NORMAL,!0);if(f&&e.accessors[o.attributes.NORMAL].normalized){f=Float32Array.from(f);for(let e=0;e<f.length;e+=3){let t=Math.hypot(f[e],f[e+1],f[e+2])||1;f[e]/=t,f[e+1]/=t,f[e+2]/=t}}let p=o.attributes.TEXCOORD_0===void 0?null:t(o.attributes.TEXCOORD_0,!0),m=o.mode===void 0?4:o.mode,h=Ku(o.indices===void 0?Uint32Array.from({length:d.length/3},(e,t)=>t):t(o.indices),m);if(!h)return n.points++,s.set(l,-1),-1;let g=new Mi({positions:d,normals:f,uvs:p,indices:h,kind:m>=1&&m<=3?`lines`:`triangles`});return a.push({mesh:g}),s.set(l,a.length-1),a.length-1},l=t=>{let n=o.get(t);return n||(n=e.meshes[t].primitives.map((e,n)=>({geom:e.attributes&&e.attributes.POSITION!==void 0?c(t,n):-1,mat:e.material===void 0?i:e.material})).filter(e=>e.geom>=0),o.set(t,n)),n},u=new _u(Math.max(64,e.nodes?e.nodes.length:0)),d=[],f=L(),p=L(),m=(n,r,i)=>{let a=e.nodes[n],o=R(d[i]||(d[i]=L()),r,Uu(a,f));if(a.mesh!==void 0){let e=l(a.mesh),n=a.extensions&&a.extensions.EXT_mesh_gpu_instancing;if(n){let r=n.attributes,i=r.TRANSLATION===void 0?null:t(r.TRANSLATION,!0),a=r.ROTATION===void 0?null:t(r.ROTATION,!0),s=r.SCALE===void 0?null:t(r.SCALE,!0),c=(i||a||s).length/(i?3:a?4:3);for(let t=0;t<c;t++){Hu(f,i?i[t*3]:0,i?i[t*3+1]:0,i?i[t*3+2]:0,a?a[t*4]:0,a?a[t*4+1]:0,a?a[t*4+2]:0,a?a[t*4+3]:1,s?s[t*3]:1,s?s[t*3+1]:1,s?s[t*3+2]:1),R(p,o,f);for(let t of e)u.push(t.geom,t.mat,p)}}else for(let t of e)u.push(t.geom,t.mat,o)}if(a.children)for(let e of a.children)m(e,o,i+1)},h=e.nodes||[],g=e.scenes&&e.scenes.length?e.scenes[e.scene||0]:{nodes:h.map((e,t)=>t).filter(e=>!h.some(t=>t.children&&t.children.includes(e)))},_=L();for(let e of g.nodes||[])m(e,_,0);return n.textures=(e.materials||[]).filter(e=>e.pbrMetallicRoughness&&e.pbrMetallicRoughness.baseColorTexture||e.normalTexture||e.emissiveTexture).length,{...vu({geometries:a,materials:r,instances:u}),json:e,skipped:n}}function Ju(e,t,{lod:n=0,digits:r=5,name:i=`scene`,uvs:a=`auto`}={}){let o=gu(e.materials),s=[`# ES3D export: ${i}`,`mtllib ${i}.mtl`],c=new Map,l=new Map,u=[],d=[],f=[],p=[],m=0,h=0,g=-1,_=new Float64Array(16);for(let i of mu(e)){let s=e.geometries[e.geom[i]],v=t(s,Math.min(n,s.lods-1));if(!v.vertexCount)continue;for(let t=0;t<16;t++)_[t]=e.matrices[i*16+t];let y=e.mat[i];y!==g&&(p.push(`usemtl ${o[y]}`),g=y);let b=_[5]*_[10]-_[6]*_[9],x=_[6]*_[8]-_[4]*_[10],S=_[4]*_[9]-_[5]*_[8],C=_[9]*_[2]-_[10]*_[1],w=_[10]*_[0]-_[8]*_[2],T=_[8]*_[1]-_[9]*_[0],E=_[1]*_[6]-_[2]*_[5],D=_[2]*_[4]-_[0]*_[6],O=_[0]*_[5]-_[1]*_[4],k=_[0]*b+_[1]*x+_[2]*S,A=k<0?-1:1,j=v.positions,ee=v.normals,M=v.uvs,N=v.vertexCount,te=e.materials[y],ne=a===!0||a===`auto`&&!!(te.map||te.normalMap),re=new Int32Array(N),ie=new Int32Array(N);for(let e=0;e<N;e++){let t=j[e*3],n=j[e*3+1],i=j[e*3+2];if(f.push(`v ${yu(_[0]*t+_[4]*n+_[8]*i+_[12],r)} ${yu(_[1]*t+_[5]*n+_[9]*i+_[13],r)} ${yu(_[2]*t+_[6]*n+_[10]*i+_[14],r)}`),v.kind===`triangles`){let t=ee[e*3],n=ee[e*3+1],r=ee[e*3+2],i=(b*t+C*n+E*r)*A,a=(x*t+w*n+D*r)*A,o=(S*t+T*n+O*r)*A,s=Math.hypot(i,a,o)||1,f=`${yu(i/s,4)} ${yu(a/s,4)} ${yu(o/s,4)}`,p=c.get(f);if(p===void 0&&(p=u.length+1,c.set(f,p),u.push(`vn `+f)),ie[e]=p,!ne)continue;let m=`${yu(M[e*2],4)} ${yu(M[e*2+1],4)}`,h=l.get(m);h===void 0&&(h=d.length+1,l.set(m,h),d.push(`vt `+m)),re[e]=h}}let ae=v.indices;if(v.kind===`lines`)for(let e=0;e<ae.length;e+=2)p.push(`l ${ae[e]+1+m} ${ae[e+1]+1+m}`);else{for(let e=0;e<ae.length;e+=3){let t=ae[e],n=ae[e+1],r=ae[e+2];k<0&&([n,r]=[r,n]),ne?p.push(`f ${t+1+m}/${re[t]}/${ie[t]} ${n+1+m}/${re[n]}/${ie[n]} ${r+1+m}/${re[r]}/${ie[r]}`):p.push(`f ${t+1+m}//${ie[t]} ${n+1+m}//${ie[n]} ${r+1+m}//${ie[r]}`)}h+=ae.length/3}m+=N}let v=[s,f,d,u,p].filter(e=>e.length).map(e=>e.join(`
|
|
381
|
+
`)),y=[];return e.materials.forEach((e,t)=>{let n=e.baseColor.slice(0,3).map(e=>yu(ke(e),4)).join(` `),r=e.emissive.map(e=>yu(Math.min(1,ke(e)),4)).join(` `);y.push(`newmtl ${o[t]}`,`Kd ${n}`,`Ke ${r}`,`d ${yu(e.opacity,4)}`,`Pr ${yu(e.roughness,4)}`,`Pm ${yu(e.metallic,4)}`,``)}),{obj:v.join(`
|
|
382
|
+
`)+`
|
|
383
|
+
`,mtl:y.join(`
|
|
384
|
+
`),vertices:m,triangles:h}}var Yu=Array.from({length:23},(e,t)=>10**t);function Xu(e){let t=new Map,n=null;for(let r of e.split(`
|
|
385
|
+
`)){let e=r.trim();if(!e||e[0]===`#`)continue;let i=e.split(/\s+/),a=i[0];if(a===`newmtl`)n={name:i.slice(1).join(` `),color:[.8,.8,.8,1],metallic:0,roughness:.5,opacity:1,emissive:[0,0,0,1]},t.set(n.name,n);else if(n){let e=i.slice(1).map(Number);a===`Kd`?n.color=[e[0],e[1],e[2],1]:a===`Ke`?n.emissive=[e[0],e[1],e[2],1]:a===`d`?n.opacity=e[0]:a===`Tr`?n.opacity=1-e[0]:a===`Pr`?n.roughness=e[0]:a===`Pm`?n.metallic=e[0]:a===`Ns`&&(n.roughness=Math.sqrt(2/(e[0]+2)))}}return t}function Zu(e,t=``){let n=[],r=[],i=[],a=new Map,o=null,s=[],c=e=>{o=a.get(e),o||(o={material:e,id:s.length,p:[],n:[],t:[],idx:[],lines:[],hasNormals:!0,hasUV:!0},a.set(e,o),s.push(o))};c(`default`);let l=new Int32Array(1024).fill(-1),u=1024,d=new Int32Array(u),f=new Int32Array(u),p=new Int32Array(u),m=new Int32Array(u),h=new Int32Array(u),g=0,_=()=>{u*=2;let e=e=>{let t=new Int32Array(u);return t.set(e),t};d=e(d),f=e(f),p=e(p),m=e(m),h=e(h)},v=(e,t,a)=>{if(e<0&&(e=n.length/3+e+1),t<0&&(t=i.length/2+t+1),a<0&&(a=r.length/3+a+1),e<1||e>n.length/3)throw Error(`OBJ face references vertex ${e}, but only ${n.length/3} are defined.`);if(e>l.length){let t=l.length;for(;t<e;)t*=2;let n=new Int32Array(t).fill(-1);n.set(l),l=n}for(let n=l[e-1];n>=0;n=d[n])if(f[n]===o.id&&p[n]===t&&m[n]===a)return h[n];let s=o.p.length/3;return o.p.push(n[(e-1)*3],n[(e-1)*3+1],n[(e-1)*3+2]),a?o.n.push(r[(a-1)*3],r[(a-1)*3+1],r[(a-1)*3+2]):(o.hasNormals=!1,o.n.push(0,0,0)),t?o.t.push(i[(t-1)*2],i[(t-1)*2+1]):(o.hasUV=!1,o.t.push(0,0)),g===u&&_(),f[g]=o.id,p[g]=t,m[g]=a,h[g]=s,d[g]=l[e-1],l[e-1]=g++,s},y=0,b=e.length,x=(t,n)=>{let r=t,i=!1,a=e.charCodeAt(r);(a===45||a===43)&&(i=a===45,r++);let o=0,s=0,c=!1,l=0;for(;r<n;r++){let i=e.charCodeAt(r);if(i>=48&&i<=57){if(o>9e14)return+e.slice(t,n);o=o*10+(i-48),l++,c&&s++}else if(i===46&&!c)c=!0;else return+e.slice(t,n)}if(!l||s>22)return+e.slice(t,n);let u=s?o/Yu[s]:o;return i?-u:u},S=(t,n,r,i)=>{let a=t;for(let t=0;t<i;t++){for(;a<n&&(e.charCodeAt(a)===32||e.charCodeAt(a)===9);)a++;let t=a;for(;t<n&&e.charCodeAt(t)!==32&&e.charCodeAt(t)!==9;)t++;r.push(a<t?x(a,t):0),a=t}},C=0,w=t=>{let n=1;e.charCodeAt(C)===45&&(n=-1,C++);let r=0,i=0;for(let n=e.charCodeAt(C);C<t&&n>=48&&n<=57;n=e.charCodeAt(++C))r=r*10+(n-48),i++;return i?n*r:0},T=[],E=(t,n)=>{for(T.length=0,C=t;;){for(;C<n&&(e.charCodeAt(C)===32||e.charCodeAt(C)===9);)C++;if(C>=n)break;let r=w(n),i=0,a=0;e.charCodeAt(C)===47&&(C++,i=w(n),e.charCodeAt(C)===47&&(C++,a=w(n)));let o=e.charCodeAt(C);if(C<n&&o!==32&&o!==9)throw Error(`Invalid OBJ vertex reference near "${e.slice(t,Math.min(n,t+40))}".`);T.push(v(r,i,a))}};for(;y<b;){let t=e.indexOf(`
|
|
386
|
+
`,y);t<0&&(t=b);let a=y;for(;a<t&&(e.charCodeAt(a)===32||e.charCodeAt(a)===9);)a++;let s=e.charCodeAt(a),l=e.charCodeAt(a+1),u=t;if(e.charCodeAt(u-1)===13&&u--,s===118)l===32||l===9?S(a+2,u,n,3):l===110?S(a+3,u,r,3):l===116&&S(a+3,u,i,2);else if(s===102&&(l===32||l===9)){E(a+2,u);for(let e=2;e<T.length;e++)o.idx.push(T[0],T[e-1],T[e])}else if(s===108&&(l===32||l===9)){E(a+2,u);for(let e=0;e+1<T.length;e++)o.lines.push(T[e],T[e+1])}else e.startsWith(`usemtl`,a)&&c(e.slice(a+6,u).trim()||`default`);y=t+1}let D=[],O=0;for(let e of a.values()){if(e.idx.length){let t;t=e.hasNormals?new Mi({positions:Float32Array.from(e.p),normals:Float32Array.from(e.n),uvs:Float32Array.from(e.t),indices:Uint32Array.from(e.idx)}):Fi(Float32Array.from(e.p),Uint32Array.from(e.idx),30,e.hasUV?Float32Array.from(e.t):null),D.push({material:e.material,mesh:t}),O+=e.idx.length/3}e.lines.length&&D.push({material:e.material,mesh:new Mi({positions:Float32Array.from(e.p),indices:Uint32Array.from(e.lines),kind:`lines`})})}return{groups:D,materials:t?Xu(t):new Map,stats:{vertices:n.length/3,triangles:O}}}function Qu(e,t=``){let n=Zu(e,t),r=new Map,i=[],a=[],o=new _u,s=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];for(let e of n.groups){let t=r.get(e.material);if(t===void 0){t=i.length,r.set(e.material,t);let a=n.materials.get(e.material);i.push(a?{...a}:{name:e.material})}a.push({mesh:e.mesh}),o.push(a.length-1,t,s)}return{...vu({geometries:a,materials:i,instances:o}),parsed:n}}function $u(e){return e.length<84?!1:84+new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(80,!0)*50===e.length}function ed(e){let t=new TextDecoder().decode(e.subarray(0,Math.min(e.length,1024)));return/^\s*solid\b[^\n]*\n\s*(facet|endsolid)\b/.test(t)}function td(e){if($u(e)){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint32(80,!0),r=new Float32Array(n*9);for(let e=0;e<n;e++){let n=84+e*50+12;for(let i=0;i<9;i++)r[e*9+i]=t.getFloat32(n+i*4,!0)}return{positions:r,triangles:n,name:new TextDecoder().decode(e.subarray(0,80)).replace(/\0[\s\S]*$/,``).trim().replace(/^solid\s*/i,``),format:`binary`}}let t=new TextDecoder().decode(e);if(!/^\s*solid\b/.test(t))throw Error(`Not an STL file: binary STL size does not match its triangle count, and ASCII STL must start with "solid".`);let n=[],r=/\bvertex\s+(\S+)\s+(\S+)\s+(\S+)/g,i;for(;i=r.exec(t);){let e=Number(i[1]),r=Number(i[2]),a=Number(i[3]);if(!Number.isFinite(e)||!Number.isFinite(r)||!Number.isFinite(a)){let e=t.slice(0,i.index).split(`
|
|
387
|
+
`).length;throw Error(`STL line ${e}: vertex coordinates must be numbers ("${i[0]}").`)}n.push(e,r,a)}if(n.length%9!=0)throw Error(`STL: found ${n.length/3} vertices, which is not a multiple of 3 (every facet needs exactly 3).`);let a=(/^\s*solid[ \t]*([^\r\n]*)/.exec(t)||[])[1]||``;return{positions:Float32Array.from(n),triangles:n.length/9,name:a.trim(),format:`ascii`}}function nd(e){let t=Ni(e),n=e.length/3,r=new Int32Array(n).fill(-1),i=new Uint32Array(n),a=0;for(let e=0;e<n;e++){let n=t[e];r[n]<0&&(r[n]=a++),i[e]=r[n]}let o=new Float32Array(a*3);for(let t=0;t<n;t++){let n=i[t]*3;o[n]=e[t*3],o[n+1]=e[t*3+1],o[n+2]=e[t*3+2]}let s=0;for(let e=0;e<i.length;e+=3){let t=i[e],n=i[e+1],r=i[e+2];t!==n&&n!==r&&t!==r&&(i[s++]=t,i[s++]=n,i[s++]=r)}return{positions:o,indices:i.slice(0,s),degenerate:(i.length-s)/3}}var rd=[1,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,1];function id(e,{up:t=`z`,smooth:n=30}={}){let r=td(e);if(!r.triangles)throw Error(`The STL file contains no triangles.`);let{positions:i,indices:a,degenerate:o}=nd(r.positions),s=Fi(i,a,n),c=new _u(1);return c.push(0,0,t===`z`?rd:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),{...vu({geometries:[{mesh:s}],materials:[{name:`stl`,color:[.72,.74,.78,1],roughness:.45,metallic:0}],instances:c}),info:{name:r.name,format:r.format,triangles:r.triangles,vertices:i.length/3,degenerate:o,smooth:n}}}function ad(e,t,{lod:n=0,up:r=`z`,binary:i=!0,name:a=`es3d`,maxTriangles:o=2e7}={}){let s=mu(e),c=0;for(let r of s){let i=t(e.geometries[e.geom[r]],n);i.kind===`triangles`&&(c+=i.primitiveCount)}if(c>o)throw Error(`The scene has ${c.toLocaleString(`en-US`)} triangles; STL output is limited to ${o.toLocaleString(`en-US`)}. Export a coarser level of detail.`);let l=new Float64Array(9),u=new Float64Array(16),d=r===`z`,f=null,p=84,m=[];if(i){let e=new Uint8Array(84+c*50),t=new TextEncoder().encode(`ES3D export: ${a}`.slice(0,79));e.set(t),f=new DataView(e.buffer),f.setUint32(80,c,!0)}else m.push(`solid ${a}`);let h=e=>{if(Math.abs(e)<1e-30)return`0`;let t=Math.fround(e).toPrecision(7);return t.includes(`.`)?t.replace(/0+(?=e|$)/,``).replace(/\.(?=e|$)/,``):t};for(let r of s){let a=t(e.geometries[e.geom[r]],n);if(a.kind!==`triangles`)continue;for(let t=0;t<16;t++)u[t]=e.matrices[r*16+t];let o=u[0]*(u[5]*u[10]-u[6]*u[9])-u[4]*(u[1]*u[10]-u[2]*u[9])+u[8]*(u[1]*u[6]-u[2]*u[5])<0,s=a.positions,c=a.indices;for(let e=0;e<c.length;e+=3){for(let t=0;t<3;t++){let n=c[e+(o&&t?3-t:t)]*3,r=s[n],i=s[n+1],a=s[n+2],f=u[0]*r+u[4]*i+u[8]*a+u[12],p=u[1]*r+u[5]*i+u[9]*a+u[13],m=u[2]*r+u[6]*i+u[10]*a+u[14];l[t*3]=f,l[t*3+1]=d?-m:p,l[t*3+2]=d?p:m}let t=l[3]-l[0],n=l[4]-l[1],r=l[5]-l[2],a=l[6]-l[0],g=l[7]-l[1],_=l[8]-l[2],v=n*_-r*g,y=r*a-t*_,b=t*g-n*a,x=Math.hypot(v,y,b)||1;if(v/=x,y/=x,b/=x,i){f.setFloat32(p,v,!0),f.setFloat32(p+4,y,!0),f.setFloat32(p+8,b,!0);for(let e=0;e<9;e++)f.setFloat32(p+12+e*4,l[e],!0);p+=50}else m.push(` facet normal ${h(v)} ${h(y)} ${h(b)}`,` outer loop`,` vertex ${h(l[0])} ${h(l[1])} ${h(l[2])}`,` vertex ${h(l[3])} ${h(l[4])} ${h(l[5])}`,` vertex ${h(l[6])} ${h(l[7])} ${h(l[8])}`,` endloop`,` endfacet`)}}return i?{data:new Uint8Array(f.buffer),triangles:c}:(m.push(`endsolid ${a}`),{data:m.join(`
|
|
388
|
+
`)+`
|
|
389
|
+
`,triangles:c})}var od=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],sd=new Set([`TRIANGULATED_SURFACE_SET`,`COMPLEX_TRIANGULATED_SURFACE_SET`,`TRIANGULATED_FACE`,`COMPLEX_TRIANGULATED_FACE`]),cd=new Set([`CLOSED_SHELL`,`OPEN_SHELL`,`CONNECTED_FACE_SET`]),ld=new Set([`FACE`,`FACE_SURFACE`,`ADVANCED_FACE`]),ud=`This STEP file is a curved solid (NURBS or an analytic surface other than a cylinder). ES3D imports tessellated STEP, planar faces, circles and cylinders. Re-export the model from the CAD tool as a tessellated STEP or as STL.`,dd=e=>new TextDecoder(`utf-8`).decode(e.subarray(0,Math.min(e.length,1024))).replace(/^\uFEFF/,``);function fd(e){return typeof e==`string`?e.replace(/^\uFEFF/,``):new TextDecoder(`utf-8`).decode(e).replace(/^\uFEFF/,``)}function pd(e){let t=typeof e==`string`?e:dd(e);return/^\uFEFF?\s*(?:\/\*[\s\S]*?\*\/\s*)*ISO-10303-21\b/i.test(t)}function md(e){let t=fd(e);if(!pd(t.slice(0,1024)))throw Error(`Not a STEP file: expected ISO-10303-21.`);let n=xd(t),r=t.slice(0,n),i=Cd(t,n);return{name:Sd(r,`FILE_NAME`),schema:Sd(r,`FILE_SCHEMA`),unit:Md(i),entities:i}}function hd(e,{up:t=`z`,smooth:n=30}={}){let r=md(e),{meshes:i,curved:a}=kf(r.entities,n);if(!i.length)throw Error(a?ud:`The STEP file contains no triangles or supported faces.`);let o=t===`y`?od:rd,s=[],c=[],l=new _u(i.length),u=0,d=0,f=Pd(r.entities)||r.name.replace(/\.[^.]+$/,``)||`step`;return i.forEach((e,t)=>{s.push({mesh:e.mesh,key:`step:${t}:${e.name}`});let n=i.length===1?e.name||f:e.name||`${f} ${t+1}`;c.push({name:n,color:e.color||[.72,.74,.78,1],roughness:.45,metallic:0}),l.push(t,t,o),u+=e.mesh.primitiveCount,d+=e.mesh.vertexCount}),{...vu({geometries:s,materials:c,instances:l}),info:{name:f,schema:r.schema,unit:r.unit,triangles:u,vertices:d,meshes:i.length,curved:a}}}function gd(e,t,{lod:n=0,up:r=`z`,name:i=`es3d`,maxTriangles:a=2e7}={}){let o=mu(e),s=0;for(let r of o){let i=t(e.geometries[e.geom[r]],n);i.kind===`triangles`&&(s+=i.primitiveCount)}if(!s)throw Error(`The scene has no triangles to write as STEP.`);if(s>a)throw Error(`The scene has ${s.toLocaleString(`en-US`)} triangles; STEP output is limited to ${a.toLocaleString(`en-US`)}. Export a coarser level of detail, or glTF, which stores repeated shapes once.`);let c=r===`z`,l=new Map,u=[],d=[],f=new Float64Array(16),p=(e,t,n)=>{let r=`${Math.fround(e)},${Math.fround(t)},${Math.fround(n)}`,i=l.get(r);return i??(i=u.length,u.push([Math.fround(e),Math.fround(t),Math.fround(n)]),l.set(r,i)),i};for(let r of o){let i=t(e.geometries[e.geom[r]],n);if(i.kind!==`triangles`)continue;for(let t=0;t<16;t++)f[t]=e.matrices[r*16+t];let a=f[0]*(f[5]*f[10]-f[6]*f[9])-f[4]*(f[1]*f[10]-f[2]*f[9])+f[8]*(f[1]*f[6]-f[2]*f[5])<0,o=i.positions,s=i.indices;for(let e=0;e<s.length;e+=3){let t=[];for(let n=0;n<3;n++){let r=s[e+(a&&n?3-n:n)]*3,i=o[r],l=o[r+1],u=o[r+2],d=f[0]*i+f[4]*l+f[8]*u+f[12],m=f[1]*i+f[5]*l+f[9]*u+f[13],h=f[2]*i+f[6]*l+f[10]*u+f[14];t.push(p(d,c?-h:m,c?m:h))}d.push(t[0],t[1],t[2])}}return{data:Ff(i,u,d),triangles:d.length/3}}var _d=class{constructor(e,t){this.s=e,this.n=e.length,this.i=t}get c(){return this.i<this.n?this.s.charCodeAt(this.i):-1}skip(){let e=this.s,t=this.n,n=this.i;for(;n<t;){let r=e.charCodeAt(n);if(r===32||r===9||r===10||r===13)n++;else if(r===47&&e.charCodeAt(n+1)===42){for(n+=2;n<t&&(e.charCodeAt(n)!==42||e.charCodeAt(n+1)!==47);)n++;n>=t&&(this.i=n,this.error(`unterminated comment`)),n+=2}else break}this.i=n}error(e){let t=1;for(let e=0;e<this.i&&e<this.n;e++)this.s.charCodeAt(e)===10&&t++;throw Error(`STEP: ${e} (line ${t}).`)}peekKeyword(){let e=this.s,t=this.i;for(;t<this.n;){let n=e.charCodeAt(t);if(!(n>=65&&n<=90||n>=97&&n<=122||n>=48&&n<=57||n===95||n===45))break;t++}return e.slice(this.i,t).toUpperCase()}};function vd(e){return e>=48&&e<=57}function yd(e){return e>=65&&e<=90||e>=97&&e<=122}function bd(e){return yd(e)||vd(e)||e===95}function xd(e){let t=e.length,n=0;for(;n<t;){let r=e.charCodeAt(n);if(r===39)for(n++;n<t;){if(e.charCodeAt(n)===39){if(e.charCodeAt(n+1)===39){n+=2;continue}n++;break}n++}else if(r===47&&e.charCodeAt(n+1)===42){for(n+=2;n<t&&(e.charCodeAt(n)!==42||e.charCodeAt(n+1)!==47);)n++;n+=2}else{if((r===68||r===100)&&/^data/i.test(e.slice(n,n+4))&&!bd(n>0?e.charCodeAt(n-1):0)){let r=n+4;for(;r<t&&(e.charCodeAt(r)===32||e.charCodeAt(r)===9||e.charCodeAt(r)===10||e.charCodeAt(r)===13);)r++;if(e.charCodeAt(r)===59)return r+1}n++}}throw Error(`STEP: the file has no DATA section.`)}function Sd(e,t){let n=RegExp(`\\b${t}\\s*\\(`,`i`).exec(e);if(!n)return``;let r=n.index+n[0].length;for(;r<e.length&&/\s/.test(e[r]);)r++;if(e[r]===`(`)for(r++;r<e.length&&/\s/.test(e[r]);)r++;if(e[r]!==`'`)return``;r++;let i=``;for(;r<e.length;){if(e[r]===`'`){if(e[r+1]===`'`){i+=`'`,r+=2;continue}break}i+=e[r++]}return i}function Cd(e,t){let n=new _d(e,t),r=new Map;for(;n.skip(),!(n.i>=n.n);){if(yd(n.c)){let e=n.peekKeyword();if(e===`ENDSEC`||e===`END-ISO-10303-21`)break;n.error(`expected #id or ENDSEC`)}n.c===38&&n.error(`SCOPE sections are not supported`),n.c!==35&&n.error(`expected an entity id`);let e=Td(n);n.skip(),n.c!==61&&n.error(`expected =`),n.i++,n.skip();let t=[];if(n.c===40&&yd(n.s.charCodeAt(wd(n)))){for(n.i++,n.skip();n.c!==41;){let e=Ed(n);t.push({name:e,args:Dd(n)}),n.skip()}n.i++}else{let e=Ed(n);t.push({name:e,args:Dd(n)})}n.skip(),n.c!==59&&n.error(`expected ;`),n.i++,r.has(e)&&n.error(`entity #${e} is defined twice`),r.set(e,{id:e,parts:t})}return r}function wd(e){let t=e.i+1,n=e.s;for(;t<e.n;){let e=n.charCodeAt(t);if(e===32||e===9||e===10||e===13)t++;else return t}return t}function Td(e){e.c!==35&&e.error(`expected #`),e.i++,vd(e.c)||e.error(`expected an entity id`);let t=e.i;for(;vd(e.c);)e.i++;return Number(e.s.slice(t,e.i))}function Ed(e){yd(e.c)||e.error(`expected a type name`);let t=e.i;for(e.i++;bd(e.c);)e.i++;return e.s.slice(t,e.i).toUpperCase()}function Dd(e){e.skip(),e.c!==40&&e.error(`expected (`),e.i++;let t=[];if(e.skip(),e.c===41)return e.i++,t;for(;;)if(t.push(Od(e)),e.skip(),e.c===44)e.i++;else{if(e.c===41){e.i++;break}e.error(`expected , or )`)}return t}function Od(e){e.skip();let t=e.c;if(t===36)return e.i++,null;if(t===42)return e.i++,`*`;if(t===35)return{ref:Td(e)};if(t===40)return Dd(e);if(t===39)return Ad(e);if(t===46)return vd(e.s.charCodeAt(e.i+1))?jd(e):kd(e);if(t===43||t===45||vd(t))return jd(e);if(yd(t)){let t=Ed(e);return e.skip(),e.c===40?{typed:t,args:Dd(e)}:t}return e.error(`unexpected character`),null}function kd(e){e.c!==46&&e.error(`expected an enumeration`),e.i++;let t=e.i;for(;e.i<e.n&&e.c!==46;)e.i++;e.c!==46&&e.error(`unterminated enumeration`);let n=e.s.slice(t,e.i).toUpperCase();return e.i++,n===`T`||n!==`F`&&{enum:n}}function Ad(e){e.i++;let t=``;for(;e.i<e.n;){if(e.c===39){if(e.s.charCodeAt(e.i+1)===39){t+=`'`,e.i+=2;continue}return e.i++,t}t+=e.s[e.i++]}return e.error(`unterminated string`),t}function jd(e){let t=e.i;(e.c===43||e.c===45)&&e.i++;let n=!1;for(;vd(e.c);)n=!0,e.i++;if(e.c===46)for(e.i++;vd(e.c);)n=!0,e.i++;if(e.c===69||e.c===101){let t=e.i;e.i++,(e.c===43||e.c===45)&&e.i++;let n=!1;for(;vd(e.c);)n=!0,e.i++;n||(e.i=t)}return n||e.error(`expected a number`),Number(e.s.slice(t,e.i))}function Md(e){for(let t of e.values()){let e=t.parts.find(e=>e.name===`SI_UNIT`),n=t.parts.some(e=>e.name===`LENGTH_UNIT`),r=e&&e.args.some(e=>e&&e.enum===`METRE`);if(e&&(n||r)){let t=e.args.find(e=>e&&e.enum&&e.enum!==`METRE`);return Nd(t&&t.enum)}if(n){let e=t.parts.find(e=>e.name===`CONVERSION_BASED_UNIT`),n=e&&e.args.find(e=>typeof e==`string`);if(n)return n.toLowerCase()}}return null}function Nd(e){return e?{MICRO:`micrometres`,MILLI:`millimetres`,CENTI:`centimetres`,DECI:`decimetres`,DECA:`decametres`,HECTO:`hectometres`,KILO:`kilometres`}[e]||`${e.toLowerCase()}metres`:`metres`}function Pd(e){for(let t of e.values()){let e=t.parts.find(e=>e.name===`PRODUCT`);if(!e)continue;let n=e.args.filter(e=>typeof e==`string`&&e);return n[1]||n[0]||``}return``}function Fd(e,t){return e.parts.some(e=>e.name===t)}function G(e,t){return e.parts.find(e=>e.name===t)||null}function Id(e,t,n=0){if(t==null||n>8)return null;if(Array.isArray(t)&&t.length>=2&&typeof t[0]==`number`&&typeof t[1]==`number`)return[t[0],t[1],t.length>2&&typeof t[2]==`number`?t[2]:0];if(!t.ref)return null;let r=e.get(t.ref);if(!r)return null;let i=G(r,`CARTESIAN_POINT`);if(i){let e=i.args.find(e=>Array.isArray(e)&&typeof e[0]==`number`);return e?[e[0],e[1],e.length>2?e[2]:0]:null}let a=G(r,`VERTEX_POINT`);return a?Id(e,[...a.args].reverse().find(e=>e&&e.ref),n+1):null}function Ld(e,t){if(Array.isArray(t)&&t.length&&Array.isArray(t[0])&&typeof t[0][0]==`number`)return t.map(e=>[e[0],e[1],e.length>2?e[2]:0]);if(!t||!t.ref)return null;let n=e.get(t.ref);if(!n)return null;let r=G(n,`CARTESIAN_POINT_LIST_3D`)||G(n,`CARTESIAN_POINT_LIST_2D`);if(!r)return null;let i=r.args.find(e=>Array.isArray(e)&&e.length&&Array.isArray(e[0]));return i?i.map(e=>[e[0],e[1],e.length>2?e[2]:0]):null}function Rd(e){return Array.isArray(e)&&e.length>0&&Array.isArray(e[0])&&e[0].length>=3&&typeof e[0][0]==`number`}function zd(e){return e==null||Array.isArray(e)&&e.length===0?[]:Rd(e)?e:null}function Bd(e,t){if(!Rd(e)||!t)return!1;let n=0;for(let r of e)for(let e of r){if(!Number.isInteger(e)||e<1||e>t)return!1;e>n&&(n=e)}return!(e.length===t&&n<=1)}function Vd(e,t){let n=null;for(let r of e)Array.isArray(r)&&r.length&&!Array.isArray(r[0])&&r.every(e=>Number.isInteger(e)&&e>=1&&e<=t)&&(!n||r.length>n.length)&&(n=r);return n}function Hd(e,t){for(let n of t)if(n&&n.ref){let t=Ld(e,n);if(t&&t.length)return t}let n=t.filter(Rd);for(let e of n){let t=n.filter(t=>t!==e);if(t.some(t=>Bd(t,e.length))&&!t.some(t=>Bd(e,t.length)))return e.map(e=>[e[0],e[1],e[2]||0])}return null}var Ud=class{constructor(){this.pos=[],this.idx=[],this.map=new Map}add(e,t){let n=t??`${e[0]},${e[1]},${e[2]}`,r=this.map.get(n);return r??(r=this.pos.length/3,this.pos.push(e[0],e[1],e[2]),this.map.set(n,r)),r}tri(e,t,n){if(e===t||t===n||e===n)return;let r=this.pos,i=r[e*3],a=r[e*3+1],o=r[e*3+2],s=r[t*3]-i,c=r[t*3+1]-a,l=r[t*3+2]-o,u=r[n*3]-i,d=r[n*3+1]-a,f=r[n*3+2]-o,p=c*f-l*d,m=l*u-s*f,h=s*d-c*u;p*p+m*m+h*h<1e-24||this.idx.push(e,t,n)}finish(e){return this.idx.length<3?null:Fi(Float32Array.from(this.pos),Uint32Array.from(this.idx),e)}};function Wd(e){for(let t of e)for(let e of t)for(let t of e)if(t===0)return 0;return 1}function Gd(e,t,n,r,i,a,o){let s=Wd([n,r,i].filter(e=>e&&e.length)),c=n=>{let r=n;if(a&&s===1&&(r<1||r>a.length||(r=a[r-1],!r)))return-1;let i=s===0?r:r-1;return i<0||i>=t.length?-1:e.add(t[i],`${o}:${i}`)},l=(t,n,r)=>{let i=c(t),a=c(n),o=c(r);i<0||a<0||o<0||e.tri(i,a,o)};for(let e of n)e.length>=3&&l(e[0],e[1],e[2]);for(let e of r)for(let t=0;t+2<e.length;t++){let n=e[t],r=e[t+1],i=e[t+2];t%2==0?l(n,r,i):l(r,n,i)}for(let e of i)for(let t=1;t+1<e.length;t++)l(e[0],e[t],e[t+1])}function Kd(e,t,n){let r=n.parts.flatMap(e=>e.args),i=n.parts.some(e=>e.name.startsWith(`COMPLEX_TRIANGULATED`)),a=Hd(t,r);if(!a)return;let o=[],s=[],c=[],l=!1;if(i&&r.length>=7&&zd(r[5])&&zd(r[6])?(s=zd(r[5]),c=zd(r[6]),l=!0):!i&&r.length>=6&&zd(r[5])&&(o=zd(r[5]),l=!0),!l){let e=r.filter(e=>Rd(e)&&Bd(e,a.length));i?(s=e[0]||[],c=e[1]||[]):o=e[0]||[]}let u=Vd(r,a.length);Gd(e,a,o,s,c,u,n.id)}function qd(e){let t=new Map;for(let n of e.values()){if(!Fd(n,`STYLED_ITEM`))continue;let r=n.parts.flatMap(e=>e.args),i=null;for(let e of r)e&&e.ref&&(i=e.ref);if(i==null)continue;let a=Jd(e,r,0,new Set);a&&!t.has(i)&&t.set(i,a)}return t}function Jd(e,t,n,r){if(t==null||n>24)return null;if(t.ref)return r.has(t.ref)?null:(r.add(t.ref),Jd(e,e.get(t.ref),n+1,r));if(Array.isArray(t)){for(let i of t){let t=Jd(e,i,n,r);if(t)return t}return null}if(t.parts){let i=G(t,`COLOUR_RGB`);if(i){let e=i.args.filter(e=>typeof e==`number`);if(e.length>=3)return Yd(e)}for(let i of t.parts){let t=Jd(e,i.args,n,r);if(t)return t}}return null}function Yd(e){let t=e[0],n=e[1],r=e[2];return(t>1||n>1||r>1)&&(t/=255,n/=255,r/=255),[t,n,r,1]}function Xd(e){let t=e.parts.flatMap(e=>e.args).find(e=>typeof e==`string`&&e.trim());return t?t.trim():``}function Zd(e){return!e||Fd(e,`ORIENTED_FACE`)?!1:e.parts.some(e=>ld.has(e.name))}function Qd(e,t){let n=t&&t.ref?e.get(t.ref):null,r=!1;if(n&&Fd(n,`ORIENTED_FACE`)){let t=G(n,`ORIENTED_FACE`).args;t.filter(e=>typeof e==`boolean`).pop()===!1&&(r=!0);let i=t.filter(e=>e&&e.ref).pop();n=i?e.get(i.ref):null}return{face:n,flip:r,id:t&&t.ref}}function $d(e,t){for(let n of t.parts.flatMap(e=>e.args)){if(!n||!n.ref)continue;let t=e.get(n.ref);if(!t)continue;let r=t.parts.map(e=>e.name);if(!r.some(e=>e===`FACE_BOUND`||e===`FACE_OUTER_BOUND`||e===`POLY_LOOP`||e===`EDGE_LOOP`||e===`PLANE`||e===`CYLINDRICAL_SURFACE`||e===`AXIS2_PLACEMENT_3D`)&&r.some(e=>e.includes(`SURFACE`)||e.includes(`CURVE`)||e===`PCURVE`))return!0}return!1}function ef(e,t){let n=t&&t.ref?e.get(t.ref):null,r=n&&G(n,`DIRECTION`);if(!r)return null;let i=r.args.find(e=>Array.isArray(e)&&typeof e[0]==`number`);if(!i)return null;let a=[i[0],i[1],i.length>2?i[2]:0],o=Math.hypot(a[0],a[1],a[2]);return o<1e-15?null:[a[0]/o,a[1]/o,a[2]/o]}function tf(e,t){let n=t&&t.ref?e.get(t.ref):null,r=n&&G(n,`AXIS2_PLACEMENT_3D`);if(!r)return null;let i=r.args.filter(e=>e&&e.ref),a=Id(e,i[0]);if(!a)return null;let o=ef(e,i[1])||[0,0,1],s=ef(e,i[2])||[1,0,0],c=s[0]-o[0]*(s[0]*o[0]+s[1]*o[1]+s[2]*o[2]),l=s[1]-o[1]*(s[0]*o[0]+s[1]*o[1]+s[2]*o[2]),u=s[2]-o[2]*(s[0]*o[0]+s[1]*o[1]+s[2]*o[2]);if(Math.hypot(c,l,u)<1e-12){let e=Math.abs(o[0])<.9?[1,0,0]:[0,1,0],t=e[0]*o[0]+e[1]*o[1]+e[2]*o[2];c=e[0]-o[0]*t,l=e[1]-o[1]*t,u=e[2]-o[2]*t}let d=Math.hypot(c,l,u);return c/=d,l/=d,u/=d,{origin:a,x:[c,l,u],y:[o[1]*u-o[2]*l,o[2]*c-o[0]*u,o[0]*l-o[1]*c],z:o}}function nf(e,t){let n=t[0]-e.origin[0],r=t[1]-e.origin[1],i=t[2]-e.origin[2],a=n*e.x[0]+r*e.x[1]+i*e.x[2],o=n*e.y[0]+r*e.y[1]+i*e.y[2];return Math.atan2(o,a)}function rf(e,t){return(t[0]-e.origin[0])*e.z[0]+(t[1]-e.origin[1])*e.z[1]+(t[2]-e.origin[2])*e.z[2]}function af(e,t,n){let r=Math.cos(n),i=Math.sin(n);return[e.origin[0]+t*(r*e.x[0]+i*e.y[0]),e.origin[1]+t*(r*e.x[1]+i*e.y[1]),e.origin[2]+t*(r*e.x[2]+i*e.y[2])]}var of=Math.PI/36,sf=128;function cf(e,t,n,r,i){let a=G(t,`CIRCLE`).args,o=a.find(e=>typeof e==`number`),s=a.find(e=>e&&e.ref);if(!(o>0)||!s)return null;let c=tf(e,s);if(!c)return null;let l=nf(c,n),u=nf(c,r),d=n[0]-r[0],f=n[1]-r[1],p=n[2]-r[2];if(d*d+f*f+p*p<1e-16)u=l+(i?Math.PI*2:-Math.PI*2);else if(i)for(;u<l-1e-7;)u+=Math.PI*2;else for(;u>l+1e-7;)u-=Math.PI*2;let m=u-l,h=Math.min(sf,Math.max(1,Math.ceil(Math.abs(m)/of))),g=[n];for(let e=1;e<h;e++)g.push(af(c,o,l+e/h*m));return g}function lf(e,t){let n=t&&t.ref?e.get(t.ref):null;if(!n)return null;let r=!1;if(Fd(n,`ORIENTED_EDGE`)){let t=G(n,`ORIENTED_EDGE`).args;t.filter(e=>typeof e==`boolean`).pop()===!1&&(r=!0);let i=t.filter(e=>e&&e.ref).pop();if(n=i?e.get(i.ref):null,!n)return null}let i=G(n,`EDGE_CURVE`)||G(n,`EDGE`);if(!i)return{curved:!0};let a=i.args.filter(e=>e&&e.ref),o=i.args.filter(e=>typeof e==`boolean`).pop(),s=a[2]?e.get(a[2].ref):null,c=r?a[1]:a[0],l=r?a[0]:a[1],u=Id(e,c);if(!u)return{curved:!0};let d=c&&c.ref;if(!s||Fd(s,`LINE`))return{curved:!1,pts:[u],ids:[d]};if(Fd(s,`CIRCLE`)){let t=Id(e,l);if(!t)return{curved:!0};let n=o!==!1;r&&(n=!n);let i=cf(e,s,u,t,n);return i?{curved:!1,pts:i,ids:i.map((e,t)=>t===0?d:null)}:{curved:!0}}return{curved:!0}}function uf(e,t){if(!t)return null;if(Fd(t,`POLY_LOOP`)){let n=G(t,`POLY_LOOP`).args.find(e=>Array.isArray(e));if(!n)return{pts:[],ids:[],curved:!1};let r=[],i=[];for(let t of n){let n=Id(e,t);if(!n)return{pts:[],ids:[],curved:!1};r.push(n),i.push(t&&t.ref)}return{pts:r,ids:i,curved:!1}}if(Fd(t,`EDGE_LOOP`)){let n=G(t,`EDGE_LOOP`).args.find(e=>Array.isArray(e));if(!n)return{pts:[],ids:[],curved:!1};let r=[],i=[];for(let t of n){let n=lf(e,t);if(!n||n.curved)return{pts:[],ids:[],curved:!0};for(let e=0;e<n.pts.length;e++)r.push(n.pts[e]),i.push(n.ids[e])}return{pts:r,ids:i,curved:!1}}return{pts:[],ids:[],curved:!0}}function df(e,t){let n=[],r=[];for(let i=0;i<e.length;i++){let a=n[n.length-1];a&&a[0]===e[i][0]&&a[1]===e[i][1]&&a[2]===e[i][2]||(n.push(e[i]),r.push(t[i]))}if(n.length>1){let e=n[0],t=n[n.length-1];e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&(n.pop(),r.pop())}return{pts:n,ids:r}}function ff(e){let t=0,n=0,r=0;for(let i=0;i<e.length;i++){let a=e[i],o=e[(i+1)%e.length];t+=(a[1]-o[1])*(a[2]+o[2]),n+=(a[2]-o[2])*(a[0]+o[0]),r+=(a[0]-o[0])*(a[1]+o[1])}return[t,n,r]}function pf(e){let t=Math.abs(e[0]),n=Math.abs(e[1]),r=Math.abs(e[2]),i=t<=n&&t<=r?[1,0,0]:n<=r?[0,1,0]:[0,0,1],a=e[1]*i[2]-e[2]*i[1],o=e[2]*i[0]-e[0]*i[2],s=e[0]*i[1]-e[1]*i[0],c=Math.hypot(a,o,s)||1;a/=c,o/=c,s/=c;let l=Math.hypot(e[0],e[1],e[2])||1,u=e[0]/l,d=e[1]/l,f=e[2]/l;return{u:[a,o,s],v:[d*s-f*o,f*a-u*s,u*o-d*a]}}function mf(e,t,n,r){let i=new Float64Array(e.length*2);for(let a=0;a<e.length;a++){let o=e[a][0]-t[0],s=e[a][1]-t[1],c=e[a][2]-t[2];i[a*2]=o*n[0]+s*n[1]+c*n[2],i[a*2+1]=o*r[0]+s*r[1]+c*r[2]}return i}function hf(e){let t=e.length/2,n=0;for(let r=0;r<t;r++){let i=(r+t-1)%t,a=(r+1)%t,o=(e[r*2]-e[i*2])*(e[a*2+1]-e[r*2+1])-(e[r*2+1]-e[i*2+1])*(e[a*2]-e[r*2]);if(Math.abs(o)<1e-12)continue;let s=o>0?1:-1;if(!n)n=s;else if(s!==n)return!1}return!0}function gf(e,t){let n=0;for(let r=0,i=t-1;r<t;i=r++)n+=(e[i*2]-e[r*2])*(e[r*2+1]+e[i*2+1]);return n}function _f(e,t){let n=ff(e);if(Math.hypot(n[0],n[1],n[2])<1e-18)return[];let{u:r,v:i}=pf(n);if(!t.length&&hf(mf(e,e[0],r,i))){let t=[];for(let n=1;n+1<e.length;n++)t.push(0,n,n+1);return t}let a=mf(e.concat(...t),e[0],r,i),o=[],s=e.length;for(let e of t)e.length>=3&&o.push(s),s+=e.length;let c=[];try{c=Jr(a,o.length?o:null)||[]}catch{c=[]}if(!c.length){let t=[];for(let n=1;n+1<e.length;n++)t.push(0,n,n+1);return t}if(gf(a,e.length)<0)for(let e=0;e<c.length;e+=3){let t=c[e+1];c[e+1]=c[e+2],c[e+2]=t}return c}function vf(e,t){let n=(G(t,`ADVANCED_FACE`)||G(t,`FACE_SURFACE`)||G(t,`FACE`)||t.parts[t.parts.length-1]).args;for(let t=n.length-1;t>=0;t--){let r=n[t];if(!r||!r.ref)continue;let i=e.get(r.ref);if(i&&i.parts.some(e=>e.name.includes(`SURFACE`)||e.name===`PLANE`))return i}return null}function yf(e,t){let n=Array(e.length),r=null,i=1/0,a=-1/0;for(let o=0;o<e.length;o++){let s=nf(t,e[o]);if(r!=null){for(;s-r>Math.PI;)s-=Math.PI*2;for(;r-s>Math.PI;)s+=Math.PI*2}n[o]=[s,rf(t,e[o])],s<i&&(i=s),s>a&&(a=s),r=s}return a>i+1e-8?n:null}function bf(e,t){let n=yf(e,t);if(!n)return null;let r=e.length,i=0,a=0;for(let e=1;e<r;e++)n[e][0]<n[i][0]-1e-9&&(i=e),n[e][0]>n[a][0]+1e-9&&(a=e);if(i===a)return null;let o=e=>{let t=[];for(let n=i,o=0;o<=r;o++){if(t.push(n),n===a)return t;n=(n+e+r)%r}return null},s=e=>{for(let t=1;t<e.length;t++)if(n[e[t]][0]<n[e[t-1]][0]-1e-5)return!1;return!0},c=o(1),l=o(-1);if(!c||!l||c.length<2||l.length<2||!s(c)||!s(l))return null;let u=0;for(let e=0;e<r;e++){let t=n[e],i=n[(e+1)%r];u+=t[0]*i[1]-i[0]*t[1]}let d=u<0?-1:1,f=[],p=0,m=0;for(;p<c.length-1||m<l.length-1;){let e,t,r;if(p>=c.length-1?(e=c[p],t=l[m],r=l[m+1],m++):m>=l.length-1||n[c[p+1]][0]<=n[l[m+1]][0]+1e-12?(e=c[p],t=l[m],r=c[p+1],p++):(e=c[p],t=l[m],r=l[m+1],m++),e===t||t===r||e===r)continue;let i=n[e],a=n[t],o=n[r],s=(a[0]-i[0])*(o[1]-i[1])-(a[1]-i[1])*(o[0]-i[0]);Math.abs(s)<1e-14||((s<0?-1:1)===d?f.push(e,t,r):f.push(e,r,t))}if(f.length<3)return null;let h=ff(e);for(let t=0;t<f.length;t+=3){let n=e[f[t]],r=e[f[t+1]],i=e[f[t+2]],a=r[0]-n[0],o=r[1]-n[1],s=r[2]-n[2],c=i[0]-n[0],l=i[1]-n[1],u=i[2]-n[2],d=(o*u-s*l)*h[0]+(s*c-a*u)*h[1]+(a*l-o*c)*h[2];if(!(Math.abs(d)<1e-12)){if(d<0)for(let e=0;e<f.length;e+=3){let t=f[e+1];f[e+1]=f[e+2],f[e+2]=t}break}}return f}function xf(e,t,n,r){let i=0;for(let a=0;a<r.length;a+=3){let o=r[a],s=r[a+1],c=r[a+2];o!=null&&s!=null&&c!=null&&(e.tri(e.add(t[o],n[o]==null?null:`p${n[o]}`),e.add(t[s],n[s]==null?null:`p${n[s]}`),e.add(t[c],n[c]==null?null:`p${n[c]}`)),i++)}return i}function Sf(e,t,n){if(!t)return null;let r=(G(t,`ADVANCED_FACE`)||G(t,`FACE_SURFACE`)||G(t,`FACE`)||t.parts[t.parts.length-1]).args,i=n,a=null,o=[];for(let t of r){let n=Array.isArray(t)?t.filter(e=>e&&e.ref):t&&t.ref?[t]:[];for(let t of n){let n=e.get(t.ref);if(!n||!Fd(n,`FACE_BOUND`)&&!Fd(n,`FACE_OUTER_BOUND`))continue;let r=(G(n,`FACE_OUTER_BOUND`)||G(n,`FACE_BOUND`)).args,s=r.find(e=>e&&e.ref),c=uf(e,s?e.get(s.ref):null);if(!c)continue;if(c.curved)return{curved:!0};let l=r.find(e=>typeof e==`boolean`)===!1,u=df(c.pts,c.ids);l!==i&&u.pts.length?u={pts:u.pts.slice().reverse(),ids:u.ids.slice().reverse()}:l&&i&&(u=df(c.pts,c.ids)),Fd(n,`FACE_OUTER_BOUND`)?a?o.push(u):a=u:o.push(u)}}if(!a){let e=-1,t=-1;for(let n=0;n<o.length;n++){let r=ff(o[n].pts),i=Math.hypot(r[0],r[1],r[2]);i>e&&(e=i,t=n)}t>=0&&(a=o.splice(t,1)[0])}return{curved:!1,outer:a,holes:o}}function Cf(e,t,n,r){if(!n)return`skip`;if($d(t,n))return`curved`;let i=vf(t,n),a=!!(i&&Fd(i,`CYLINDRICAL_SURFACE`)),o=Sf(t,n,r);if(!o)return`skip`;if(o.curved)return`curved`;let{outer:s,holes:c}=o;if(a){let n=c.filter(e=>e.pts.length>=3);if(!s||s.pts.length<3||n.length)return`curved`;let r=G(i,`CYLINDRICAL_SURFACE`).args.find(e=>e&&e.ref),a=r&&tf(t,r),o=a&&bf(s.pts,a);return!o||!xf(e,s.pts,s.ids,o)?`curved`:`ok`}if(!s||s.pts.length<3)return`skip`;let l=c.filter(e=>e.pts.length>=3),u=_f(s.pts,l.map(e=>e.pts));return xf(e,s.pts.concat(...l.map(e=>e.pts)),s.ids.concat(...l.map(e=>e.ids)),u),`ok`}function wf(e,t){for(let n of e)if(t.has(n))return t.get(n);return null}function Tf(e){let t=new Map,n=(e,n)=>{let r=t.get(e);r||t.set(e,r=[]),r.push(n)};for(let t of e.values())for(let e of t.parts.flatMap(e=>e.args))if(e&&e.ref)n(e.ref,t.id);else if(Array.isArray(e))for(let r of e)r&&r.ref&&n(r.ref,t.id);return t}function Ef(e,t,n){let r=wf(n,e);if(r)return r;let i=n,a=new Set(n);for(let n=0;n<4&&i.length;n++){let n=[];for(let r of i){let i=t.get(r);if(i){for(let t of i)if(!a.has(t)){if(a.add(t),e.has(t))return e.get(t);n.push(t)}}}i=n}return null}function Df(e,t){let n=[],r=new Set;for(let i of t.parts.flatMap(e=>e.args))if(Array.isArray(i))for(let t of i){if(!t||!t.ref)continue;let i=Qd(e,t);i.face&&Zd(i.face)&&!r.has(i.face.id)&&(r.add(i.face.id),n.push(i))}return n}function Of(e,t,n,r,i,a,o){let s=new Ud,c=0,l=[];for(let n of t)l.push(n.face.id),Cf(s,e,n.face,n.flip)===`curved`&&c++;let u=Ef(n,r,l.concat(o)),d=s.finish(i);return d?{mesh:d,curved:c,color:u,name:a}:{mesh:null,curved:c,color:u}}function kf(e,t){let n=qd(e),r=Tf(e),i=Af(e,n,t);return i.length?{meshes:i,curved:0}:jf(e,n,r,t)}function Af(e,t,n){let r=new Set,i=[];for(let a of e.values()){if(!Fd(a,`TESSELLATED_SHELL`))continue;let o=[];for(let t of a.parts.flatMap(e=>e.args))if(Array.isArray(t))for(let n of t){let t=n&&n.ref?e.get(n.ref):null;t&&t.parts.some(e=>sd.has(e.name))&&(r.add(t.id),o.push(t))}let s=new Ud;for(let t of o)Kd(s,e,t);let c=s.finish(n);c&&i.push({mesh:c,name:Xd(a),color:t.get(a.id)||o.map(e=>t.get(e.id)).find(Boolean)||null})}for(let a of e.values()){if(r.has(a.id)||!a.parts.some(e=>sd.has(e.name)))continue;let o=new Ud;Kd(o,e,a);let s=o.finish(n);s&&i.push({mesh:s,name:Xd(a),color:t.get(a.id)||null})}return i}function jf(e,t,n,r){let i=new Set,a=[],o=0;for(let s of e.values()){if(!s.parts.some(e=>cd.has(e.name)))continue;let c=Df(e,s);for(let e of c)i.add(e.id),i.add(e.face.id);let l=Of(e,c,t,n,r,Xd(s),[s.id]);o+=l.curved,l.mesh&&a.push(l)}let s=[];for(let t of e.values())Zd(t)&&!i.has(t.id)&&s.push({face:t,flip:!1,id:t.id});if(s.length){let i=Of(e,s,t,n,r,``,[]);o+=i.curved,i.mesh&&a.push(i)}return{meshes:a,curved:o}}function Mf(e){return`'${String(e).replace(/\\/g,`/`).replace(/'/g,`''`).replace(/[\r\n]+/g,` `)}'`}function Nf(e){if(!Number.isFinite(e)||Object.is(e,-0)||Math.abs(e)<1e-15)return`0.`;let t=Math.abs(e),n=t>=1e7||t<1e-4?e.toExponential(9).replace(`e`,`E`):String(Math.round(e*1e9)/1e9);return n=n.replace(/(\.\d*?)0+E/,`$1E`).replace(/\.E/,`E`),!n.includes(`.`)&&!n.includes(`E`)&&(n+=`.`),n}function Pf(e){let t=[],n=``;for(let r=0;r<e.length;r++){let i=(n?`,`:``)+e[r];n&&n.length+i.length>100?(t.push(`${n},`),n=e[r]):n+=i}return n&&t.push(n),t.join(`
|
|
390
|
+
`)}function Ff(e,t,n){let r=String(e||`es3d`).replace(/[^\w.-]+/g,`_`).slice(0,64)||`es3d`,i=new Date().toISOString().replace(/\.\d{3}Z$/,``),a=Pf(t.map(e=>`(${Nf(e[0])},${Nf(e[1])},${Nf(e[2])})`)),o=[];for(let e=0;e<n.length;e+=3)o.push(`(${n[e]+1},${n[e+1]+1},${n[e+2]+1})`);let s=Pf(o);return`ISO-10303-21;
|
|
391
|
+
HEADER;
|
|
392
|
+
FILE_DESCRIPTION(('ES3D tessellated shape'),'2;1');
|
|
393
|
+
FILE_NAME(${Mf(`${r}.step`)},${Mf(i)},('ES3D'),('ES3D'),'ES3D 0.1','ES3D','');
|
|
394
|
+
FILE_SCHEMA(('AP242_MANAGED_MODEL_BASED_3D_ENGINEERING_MIM_LF { 1 0 10303 442 1 1 4 }'));
|
|
395
|
+
ENDSEC;
|
|
396
|
+
DATA;
|
|
397
|
+
#1=APPLICATION_CONTEXT('managed model based 3d engineering');
|
|
398
|
+
#2=APPLICATION_PROTOCOL_DEFINITION('international standard','ap242_managed_model_based_3d_engineering',2014,#1);
|
|
399
|
+
#3=PRODUCT_CONTEXT('',#1,'mechanical');
|
|
400
|
+
#4=PRODUCT(${Mf(r)},${Mf(r)},'',(#3));
|
|
401
|
+
#5=PRODUCT_DEFINITION_FORMATION('','',#4);
|
|
402
|
+
#6=PRODUCT_DEFINITION_CONTEXT('part definition',#1,'design');
|
|
403
|
+
#7=PRODUCT_DEFINITION('design','',#5,#6);
|
|
404
|
+
#8=PRODUCT_DEFINITION_SHAPE('','',#7);
|
|
405
|
+
#9=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));
|
|
406
|
+
#10=(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.));
|
|
407
|
+
#11=(NAMED_UNIT(*)SOLID_ANGLE_UNIT()SI_UNIT($,.STERADIAN.));
|
|
408
|
+
#12=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-7),#9,'distance_accuracy_value','confusion accuracy');
|
|
409
|
+
#13=(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#12))GLOBAL_UNIT_ASSIGNED_CONTEXT((#9,#10,#11))REPRESENTATION_CONTEXT('','3D'));
|
|
410
|
+
#14=CARTESIAN_POINT_LIST_3D('',(
|
|
411
|
+
${a}
|
|
412
|
+
));
|
|
413
|
+
#15=TRIANGULATED_SURFACE_SET('',#14,0,$,$,(
|
|
414
|
+
${s}
|
|
415
|
+
));
|
|
416
|
+
#16=TESSELLATED_SHAPE_REPRESENTATION('',(#15),#13);
|
|
417
|
+
#17=SHAPE_DEFINITION_REPRESENTATION(#8,#16);
|
|
418
|
+
ENDSEC;
|
|
419
|
+
END-ISO-10303-21;
|
|
420
|
+
`}var If=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],Lf=(e,t)=>[e[0]+t[0],e[1]+t[1],e[2]+t[2]],Rf=(e,t)=>[e[0]*t,e[1]*t,e[2]*t],zf=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],Bf=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],Vf=e=>Math.hypot(e[0],e[1],e[2]),Hf=e=>Rf(e,1/(Vf(e)||1)),Uf=e=>e.filter(e=>e&&e.ref),Wf=e=>e.filter(e=>typeof e==`number`),Gf=e=>e.filter(e=>Array.isArray(e)),Kf=e=>e.filter(e=>typeof e==`boolean`),qf=(e,t)=>t&&t.ref?e.get(t.ref):null;function Jf(e){for(let t of e.values()){let n=G(t,`GLOBAL_UNIT_ASSIGNED_CONTEXT`);if(n)for(let t of Gf(n.args))for(let n of t){let t=qf(e,n);if(!t||!Fd(t,`PLANE_ANGLE_UNIT`))continue;let r=G(t,`CONVERSION_BASED_UNIT`),i=r&&r.args.find(e=>typeof e==`string`);return i&&/deg/i.test(i)?Math.PI/180:1}}return 1}function Yf(e,t,n,r){if(n>=r[e+1])return e;if(n<=r[t])return t;let i=t,a=e+1,o=i+a>>1;for(;n<r[o]||n>=r[o+1];)n<r[o]?a=o:i=o,o=i+a>>1;return o}function Xf(e,t){let{degree:n,points:r,knots:i,weights:a}=e,o=Yf(r.length-1,n,t,i),s=[];for(let e=0;e<=n;e++){let t=o-n+e,i=a?a[t]:1;s.push([r[t][0]*i,r[t][1]*i,r[t][2]*i,i])}for(let e=1;e<=n;e++)for(let r=n;r>=e;r--){let a=o-n+r,c=(t-i[a])/(i[a+n-e+1]-i[a]||1);for(let e=0;e<4;e++)s[r][e]=(1-c)*s[r-1][e]+c*s[r][e]}let c=s[n];return[c[0]/c[3],c[1]/c[3],c[2]/c[3]]}function Zf(e,t){let n,r,i,a,o=null,s=G(t,`B_SPLINE_CURVE_WITH_KNOTS`),c=G(t,`B_SPLINE_CURVE`);if(s&&!c){let e=s.args;n=Wf(e)[0];let t=Gf(e);r=t[0],i=t[1],a=t[2]}else if(c){n=Wf(c.args)[0],r=Gf(c.args)[0];let e=s&&Gf(s.args);if(!e)return null;i=e[0],a=e[1];let l=G(t,`RATIONAL_B_SPLINE_CURVE`);l&&(o=Gf(l.args)[0])}else return null;if(!Number.isInteger(n)||!r||!i||!a)return null;let l=r.map(t=>Id(e,t));if(l.some(e=>!e))return null;let u=[];return i.forEach((e,t)=>{for(let n=0;n<e;n++)u.push(a[t])}),u.length===l.length+n+1?{kind:`bspline`,degree:n,points:l,knots:u,weights:o&&o.length===l.length?o:null}:null}function Qf(e,t,n){let r=If(t,e),i=If(n,e),a=Bf(r,i),o=zf(a,a);if(o<1e-24*zf(r,r)*zf(i,i))return null;let s=Lf(e,Rf(Lf(Rf(Bf(a,r),zf(i,i)),Rf(Bf(i,a),zf(r,r))),1/(2*o)));return{centre:s,normal:Hf(a),radius:Vf(If(e,s))}}function $f(e,t){let n=e.knots[e.degree],r=e.knots[e.knots.length-e.degree-1],i=[],a=Math.max(16,e.points.length*4);for(let t=0;t<=a;t++)i.push(Xf(e,n+(r-n)*t/a));let o=i[0],s=i[a],c=Vf(If(s,o)),l=c>t?Hf(If(s,o)):null;if(l&&i.every(e=>Vf(Bf(If(e,o),l))<=t))return{kind:`line`,point:o,dir:l};let u=Qf(o,i[a>>1],c>t?s:i[a>>2]);if(u&&i.every(e=>Math.abs(Vf(If(e,u.centre))-u.radius)<=t&&Math.abs(zf(If(e,u.centre),u.normal))<=t)){let e=Hf(If(o,u.centre)),t=u.normal;return zf(Bf(e,If(i[1],u.centre)),t)<0&&(t=Rf(t,-1)),{kind:`circle`,frame:{origin:u.centre,x:e,y:Bf(t,e),z:t},radius:u.radius,fromSpline:!0}}return e}function ep(e,t,n=1e-6,r=0){let i=qf(e,t);if(!i||r>6)return{kind:`other`};for(let t of[`SURFACE_CURVE`,`SEAM_CURVE`,`INTERSECTION_CURVE`,`TRIMMED_CURVE`,`BOUNDED_SURFACE_CURVE`]){let a=G(i,t);if(a&&Uf(a.args).length)return{...ep(e,Uf(a.args)[0],n,r+1),seam:t===`SEAM_CURVE`}}let a=G(i,`LINE`);if(a){let[t,n]=Uf(a.args),r=Id(e,t),i=qf(e,n),o=i&&ef(e,Uf(G(i,`VECTOR`)?G(i,`VECTOR`).args:[])[0]);return r&&o?{kind:`line`,point:r,dir:o}:{kind:`other`}}let o=G(i,`CIRCLE`);if(o){let t=tf(e,Uf(o.args)[0]),n=Wf(o.args)[0];return t&&n>0?{kind:`circle`,frame:t,radius:n}:{kind:`other`}}let s=G(i,`ELLIPSE`);if(s){let t=tf(e,Uf(s.args)[0]),[n,r]=Wf(s.args);return t&&n>0&&r>0?{kind:`ellipse`,frame:t,a:n,b:r}:{kind:`other`}}let c=G(i,`POLYLINE`);if(c){let t=(Gf(c.args)[0]||[]).map(t=>Id(e,t));return t.length>=2&&t.every(Boolean)?{kind:`polyline`,points:t}:{kind:`other`}}if(G(i,`B_SPLINE_CURVE_WITH_KNOTS`)||G(i,`B_SPLINE_CURVE`)){let t=Zf(e,i);return t?$f(t,n):{kind:`other`}}return{kind:`other`}}function tp(e,t,n,r){let i=qf(e,t);if(!i)return{kind:`other`};let a=t=>tf(e,Uf(t.args)[0]),o;if(o=G(i,`PLANE`)){let e=a(o);return e?{kind:`plane`,frame:e}:{kind:`other`}}if(o=G(i,`CYLINDRICAL_SURFACE`)){let e=a(o),t=Wf(o.args)[0];return e&&t>0?{kind:`cylinder`,frame:e,radius:t}:{kind:`other`}}if(o=G(i,`CONICAL_SURFACE`)){let e=a(o),[t,r]=Wf(o.args);return e&&t>=0&&r>0?{kind:`cone`,frame:e,radius:t,semiAngle:r*n}:{kind:`other`}}if(o=G(i,`SPHERICAL_SURFACE`)){let e=a(o),t=Wf(o.args)[0];return e&&t>0?{kind:`sphere`,frame:e,radius:t}:{kind:`other`}}if(o=G(i,`TOROIDAL_SURFACE`)){let e=a(o),[t,n]=Wf(o.args);return e&&t>0&&n>0?{kind:`torus`,frame:e,major:t,minor:n}:{kind:`other`}}if(o=G(i,`SURFACE_OF_LINEAR_EXTRUSION`)){let[t,n]=Uf(o.args),i=ep(e,t,r),a=qf(e,n),s=a&&G(a,`VECTOR`),c=s&&ef(e,Uf(s.args)[0]);return c?{kind:`extrusion`,curve:i,dir:c}:{kind:`other`}}if(G(i,`B_SPLINE_SURFACE_WITH_KNOTS`)||G(i,`B_SPLINE_SURFACE`)){let t=rp(e,i);if(t)return t}let s=i.parts.map(e=>e.name);return{kind:`other`,type:s.find(e=>e.includes(`SURFACE`))||s[0]}}function np(e,t){let n=[];return e.forEach((e,r)=>{for(let i=0;i<e;i++)n.push(t[r])}),n}function rp(e,t){let n,r,i,a,o,s,c,l=null,u=G(t,`B_SPLINE_SURFACE_WITH_KNOTS`),d=G(t,`B_SPLINE_SURFACE`);if(u&&!d){[n,r]=Wf(u.args);let e=Gf(u.args);[i,a,o,s,c]=e}else if(d&&u){[n,r]=Wf(d.args),i=Gf(d.args)[0],[a,o,s,c]=Gf(u.args);let e=G(t,`RATIONAL_B_SPLINE_SURFACE`);e&&(l=Gf(e.args)[0])}else return null;if(!i||!a||!o||!s||!c)return null;let f=i.map(t=>t.map(t=>Id(e,t)));if(f.some(e=>e.some(e=>!e)))return null;let p=np(a,s),m=np(o,c);return p.length!==f.length+n+1||m.length!==f[0].length+r+1?null:{kind:`bspline`,du:n,dv:r,points:f,U:p,V:m,weights:l&&l.length===f.length?l:null}}function ip(e,t,n){let r=e.points.map((t,r)=>{let i=e.weights?e.weights[r]:null;return[Xf({degree:e.dv,points:t.map((e,t)=>i?[e[0]*i[t],e[1]*i[t],e[2]*i[t]]:e),knots:e.V,weights:null},n),i?Xf({degree:e.dv,points:i.map(e=>[e,0,0]),knots:e.V,weights:null},n)[0]:1]}),i=Xf({degree:e.du,points:r.map(([e])=>e),knots:e.U,weights:null},t);if(!e.weights)return i;let a=Xf({degree:e.du,points:r.map(([,e])=>[e,0,0]),knots:e.U,weights:null},t)[0];return[i[0]/a,i[1]/a,i[2]/a]}function ap(e,t,n){let r=qf(e,t);if(!r)return null;let i=!0,a=G(r,`ORIENTED_EDGE`);if(a&&(Kf(a.args).pop()===!1&&(i=!1),r=qf(e,Uf(a.args).pop()),!r))return null;let o=G(r,`EDGE_CURVE`);if(!o)return null;let[s,c,l]=Uf(o.args),u=Kf(o.args).pop()!==!1,d=Id(e,s),f=Id(e,c);if(!d||!f)return null;let p=ep(e,l,n);return i?{curve:p,start:d,end:f,forward:u}:{curve:p,start:f,end:d,forward:!u}}function op(e,t,n){let r=G(t,`FACE_OUTER_BOUND`)||G(t,`FACE_BOUND`);if(!r)return null;let i=qf(e,Uf(r.args)[0]),a=Kf(r.args).pop()!==!1;if(!i)return null;let o=!!G(t,`FACE_OUTER_BOUND`);if(G(i,`VERTEX_LOOP`)){let t=Id(e,Uf(G(i,`VERTEX_LOOP`).args)[0]);return t?{outer:o,vertex:t,edges:[]}:null}if(G(i,`POLY_LOOP`)){let t=(Gf(G(i,`POLY_LOOP`).args)[0]||[]).map(t=>Id(e,t));if(t.length<3||t.some(e=>!e))return null;let n=a?t:t.slice().reverse();return{outer:o,edges:n.map((e,t)=>({curve:{kind:`line`,point:e,dir:Hf(If(n[(t+1)%n.length],e))},start:e,end:n[(t+1)%n.length],forward:!0}))}}let s=G(i,`EDGE_LOOP`);if(!s)return null;let c=[];for(let t of Gf(s.args)[0]||[]){let r=ap(e,t,n);if(!r)return null;c.push(r)}if(!a){c.reverse();for(let e of c)[e.start,e.end]=[e.end,e.start],e.forward=!e.forward}return{outer:o,edges:c}}function sp(e,t,n,r){let i=t.face,a=G(i,`ADVANCED_FACE`)||G(i,`FACE_SURFACE`)||G(i,`FACE`),o=(Gf(a.args)[0]||[]).map(t=>qf(e,t)).filter(Boolean),s=Uf(a.args).find(e=>!o.some(t=>t.id===e.ref)),c=s?tp(e,s,n,r):{kind:`unbounded`},l=Kf(a.args).pop()!==!1,u=[];for(let t of o){let n=op(e,t,r);if(!n)return{id:i.id,surface:{kind:`other`},loops:[],sense:!0,broken:!0};u.push(n)}return u.sort((e,t)=>+!!t.outer-!!e.outer),c.kind===`unbounded`?{id:i.id,surface:cp(u)||{kind:`other`},sense:!t.flip,loops:u}:{id:i.id,surface:c,sense:l!==t.flip,loops:u}}function cp(e){let t=null,n=0;for(let r of e){if(!r.edges.length||r.edges.some(e=>e.curve.kind!==`line`))return null;let e=r.edges.map(e=>e.start),i=[0,0,0];for(let t=0;t<e.length;t++){let n=e[t],r=e[(t+1)%e.length];i[0]+=(n[1]-r[1])*(n[2]+r[2]),i[1]+=(n[2]-r[2])*(n[0]+r[0]),i[2]+=(n[0]-r[0])*(n[1]+r[1])}Vf(i)>n&&(n=Vf(i),t={pts:e,n:i})}if(!t||n===0)return null;let r=Hf(t.n),i=If(t.pts[1],t.pts[0]),a=Hf(If(i,Rf(r,zf(i,r))));return{kind:`plane`,frame:{origin:t.pts[0],x:a,y:Bf(r,a),z:r}}}function lp(e){let t=0;for(let n of e.values()){let e=G(n,`CARTESIAN_POINT`);if(!e)continue;let r=Gf(e.args)[0];if(r)for(let e of r)typeof e==`number`&&(t=Math.max(t,Math.abs(e)))}return t||1}function up(e){let t=lp(e)*1e-7,n=Jf(e),r=[],i=new Set;for(let a of e.values()){let o=[`CLOSED_SHELL`,`OPEN_SHELL`,`CONNECTED_FACE_SET`].find(e=>Fd(a,e));if(!o)continue;let s=[];for(let r of Df(e,a))i.add(r.face.id),s.push(sp(e,r,n,t));s.length&&r.push({id:a.id,name:Xd(a),closed:o===`CLOSED_SHELL`,faces:s})}let a=[];for(let r of e.values())Zd(r)&&!i.has(r.id)&&a.push(sp(e,{face:r,flip:!1},n,t));return a.length&&r.push({id:0,name:``,closed:!1,faces:a}),{shells:r,tol:t}}var dp=Math.PI*2,fp=180/Math.PI,K=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],q=(e,t)=>[e[0]+t[0],e[1]+t[1],e[2]+t[2]],J=(e,t)=>[e[0]*t,e[1]*t,e[2]*t],Y=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],pp=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],mp=e=>Math.hypot(e[0],e[1],e[2]),hp=e=>J(e,1/(mp(e)||1)),gp=e=>[-e[0],-e[1],-e[2]],_p=e=>{let t=e-dp*Math.floor(e/dp);return t<=1e-12?dp:t},vp={millimetres:`mm`,centimetres:`cm`,metres:`m`,kilometres:`km`,inch:`in`,inches:`in`,foot:`ft`,feet:`ft`};function yp(e,t,n,r,i){let a=Vt([t[0],t[1],t[2],0,n[0],n[1],n[2],0,r[0],r[1],r[2],0,0,0,0,1]).rotation.map(e=>{let t=Number(H(e,6));return t===-180?180:t===0?0:t}),o=_t(L(),a[0],a[1],a[2]),s={};return e.some(e=>e!==0)&&(s.position=e.map(i).join(`,`)),a.some(e=>e!==0)&&(s.rotation=a.map(e=>H(e)).join(`,`)),{attrs:s,frame:{o:e,x:[o[0],o[1],o[2]],y:[o[4],o[5],o[6]],z:[o[8],o[9],o[10]]}}}var bp=e=>t=>{let n=K(t,e.o);return[Y(n,e.x),Y(n,e.y)]};function xp(e){let t=e.degree,n=e.points.map(e=>e.slice()),r=e.knots.slice(),i=[...new Set(r.slice(t+1,r.length-t-1))];for(let e of i){let i=r.filter(t=>Math.abs(t-e)<1e-14).length;for(;i<t;){let a=r.findIndex(t=>t>e)-1,o=[];for(let i=0;i<n.length+1;i++)if(i<=a-t)o.push(n[i]);else if(i>a)o.push(n[i-1]);else{let a=(e-r[i])/(r[i+t]-r[i]);o.push(q(J(n[i-1],1-a),J(n[i],a)))}n=o,r.splice(a+1,0,e),i++}}let a=[];for(let e=0;e+t<n.length;e+=t)a.push(n.slice(e,e+t+1));return a}var Sp=e=>!e.weights||e.weights.every(t=>Math.abs(t-e.weights[0])<1e-12*Math.abs(e.weights[0]));function Cp(e,t=24){let n=e.curve;if(n.kind===`line`)return[e.start,e.end];if(n.kind===`polyline`)return e.forward?n.points:n.points.slice().reverse();if(n.kind===`circle`||n.kind===`ellipse`){let r=n.kind===`circle`?n.radius:n.a,i=n.kind===`circle`?n.radius:n.b,a=n.frame,o=e=>{let t=K(e,a.origin);return Math.atan2(Y(t,a.y)/i,Y(t,a.x)/r)},s=o(e.start),c=o(e.end),l=mp(K(e.start,e.end))<1e-9*(r+i)?e.forward?dp:-dp:e.forward?_p(c-s):-_p(s-c),u=Math.max(t,Math.ceil(Math.abs(l)/(Math.PI/36))),d=[];for(let e=0;e<=u;e++){let t=s+l*e/u;d.push(q(a.origin,q(J(a.x,r*Math.cos(t)),J(a.y,i*Math.sin(t)))))}return d[0]=e.start,d[u]=e.end,d}if(n.kind===`bspline`){let r=n.knots[n.degree],i=n.knots[n.knots.length-n.degree-1],a=Math.max(t,n.points.length*6),o=[];for(let e=0;e<=a;e++)o.push(Xf(n,r+(i-r)*e/a));return e.forward||o.reverse(),o[0]=e.start,o[a]=e.end,o}return null}function wp(e,t,n,r,i){let a=e.curve,o=e=>`${r(e[0])},${r(e[1])}`,s=n(e.end);if(a.kind===`line`)return{d:`L${o(s)}`,exact:!0};if(a.kind===`polyline`)return{d:(e.forward?a.points.slice(1):a.points.slice(0,-1).reverse()).map(e=>`L${o(n(e))}`).join(``),exact:!0};if((a.kind===`circle`||a.kind===`ellipse`)&&Math.abs(Math.abs(Y(a.frame.z,t.z))-1)<1e-9){let c=a.kind===`circle`?a.radius:a.a,l=a.kind===`circle`?a.radius:a.b,u=a.frame,d=e.forward===Y(u.z,t.z)>0,f=e=>{let t=K(e,u.origin);return Math.atan2(Y(t,u.y)/l,Y(t,u.x)/c)},p=f(e.start),m=a.kind===`circle`?0:Math.atan2(Y(u.x,t.y),Y(u.x,t.x))*fp,h=(e,t)=>`A${r(c)},${r(l)} ${a.kind===`circle`?0:H(m,6)} ${+!!t},${+!!d} ${o(e)}`;if(mp(K(e.start,e.end))<=i){let e=p+Math.PI;return{d:h(n(q(u.origin,q(J(u.x,c*Math.cos(e)),J(u.y,l*Math.sin(e))))),!1)+h(s,!1),exact:!0}}let g=f(e.end);return{d:h(s,(d===Y(u.z,t.z)>0?_p(g-p):_p(p-g))>Math.PI+1e-12),exact:!0}}if(a.kind===`bspline`&&Sp(a)&&a.degree<=3){let t=xp(a);e.forward||(t=t.reverse().map(e=>e.slice().reverse()));let r=a.degree===1?`L`:a.degree===2?`Q`:`C`;return{d:t.map(e=>r+e.slice(1).map(e=>o(n(e))).join(` `)).join(``),exact:!0}}let c=Cp(e);return c?{d:c.slice(1).map(e=>`L${o(n(e))}`).join(``),exact:!1}:null}function Tp(e,t,n){let r=e.surface.frame,i=e.sense?r.z:gp(r.z),{attrs:a,frame:o}=yp(r.origin,r.x,pp(i,r.x),i,t),c=bp(o),l=[],u=!0;for(let r of e.loops){if(!r.edges.length)continue;let e=`M${t(c(r.edges[0].start)[0])},${t(c(r.edges[0].start)[1])}`;for(let i of r.edges){let r=wp(i,o,c,t,n);if(!r)return null;e+=r.d,u&&=r.exact}l.push(`${e}Z`)}return l.length?(a.d=l.join(` `),l.length>1&&(a.fillRule=`evenodd`),{el:s(`path`,a),exact:u}):null}function Ep(e){let t=e.frame;return n=>{let r=K(n,t.origin),i=Y(r,t.z),a=Y(r,t.x),o=Y(r,t.y),s=Math.hypot(a,o),c=Math.atan2(o,a);return e.kind===`sphere`?{u:c,v:Math.atan2(i,s),rho:s,h:i}:e.kind===`torus`?{u:c,v:Math.atan2(i,s-e.major),rho:s,h:i}:{u:c,v:i,rho:s,h:i}}}function Dp(e,t){let n=Cp(e,8);if(!n)return null;let r=t*(n.length-1),i=Math.min(n.length-2,Math.floor(r)),a=r-i;return q(J(n[i],1-a),J(n[i+1],a))}function Op(e,t,n){let r=_p(t-e);return _p(n-e)<r?[e,r]:[t,_p(e-t)]}function kp(e,t){let n=e.surface,r=n.frame,i=Ep(n),a=[],o=[],s=!1,c=!1,l=[],u=new Map;for(let d of e.loops){d.vertex&&l.push(i(d.vertex));for(let e of d.edges){let l=e.curve,d=l.kind===`circle`?`${l.frame.origin.map(e=>e.toFixed(9))}:${l.radius.toFixed(9)}`:null;if(mp(K(e.start,e.end))<=t&&l.kind===`line`)continue;if(l.kind===`circle`&&Math.abs(Math.abs(Y(l.frame.z,r.z))-1)<1e-7&&i(l.frame.origin).rho<=t*10){let n=mp(K(e.start,e.end))<=t,o=e.forward===Y(l.frame.z,r.z)>0,s=i(e.start).u,f=i(e.end).u;a.push({e,v:i(Dp(e,.5)).v,closed:n,interval:n?null:o?[s,_p(f-s)]:[f,_p(s-f)]}),(l.seam||d&&u.has(d)&&n)&&(c=!0),d&&u.set(d,!0);continue}let f=i(e.start),p=i(e.end),m=i(Dp(e,.5)),h=(e,t)=>Math.abs(Math.sin(e.u-t.u))<1e-7&&Math.cos(e.u-t.u)>0,g=e=>e.rho<=t*10,_=l.kind===`line`&&(n.kind===`cylinder`||n.kind===`cone`)&&(h(f,p)||g(f)||g(p))&&(g(m)||h(m,g(f)?p:f)),v=l.kind===`circle`&&(n.kind===`sphere`||n.kind===`torus`)&&Math.abs(Y(l.frame.z,r.z))<1e-7&&(g(f)||g(p)||h(f,p))&&(g(m)||h(m,g(f)?p:f));if(_||v)o.push({e,u:g(f)?p.u:f.u,a:f,b:p,m}),l.seam&&(s=!0);else return null}}for(let e=0;e<o.length;e++)for(let t=e+1;t<o.length;t++)Math.abs(Math.sin(o[e].u-o[t].u))<1e-7&&Math.cos(o[e].u-o[t].u)>0&&(s=!0);let d=0,f=dp;if(!s&&!a.some(e=>e.closed)){let t=a.filter(e=>e.interval);if(t.length)[d,f]=t.reduce((e,t)=>t.interval[1]>e[1]?t.interval:e,t[0].interval);else if(o.length>=2){let t=[...new Set(o.map(e=>Number(e.u.toFixed(9))))];if(t.length!==2)return null;let n=Ap(e,o[0].e,i);if(n===null)return null;[d,f]=Op(t[0],t[1],n.u)}}let p,m;if(n.kind===`torus`){let t=o.filter(e=>!e.e.curve.seam);if(c||!t.length&&a.length<2)[p,m]=[-Math.PI,Math.PI];else if(t.length){let e=t[0],[n,r]=Op(e.a.v,e.b.v,e.m.v);[p,m]=[n,n+r]}else{let t=[...new Set(a.map(e=>Number(e.v.toFixed(9))))];if(t.length!==2)return null;let n=Ap(e,a[0].e,i);if(n===null)return null;let[r,o]=Op(t[0],t[1],n.v);[p,m]=[r,r+o]}}else{let e=[];for(let t of a)e.push(t.v);for(let t of o)e.push(t.a.v,t.b.v);for(let t of l)e.push(t.v);if(n.kind===`sphere`&&!e.length&&e.push(-Math.PI/2,Math.PI/2),n.kind===`sphere`&&l.length===1&&!a.length&&!o.length&&e.push(-l[0].v),e.length<2||(p=Math.min(...e),m=Math.max(...e),m-p<=t))return null}return{u0:d,uSpan:f,v0:p,v1:m}}function Ap(e,t,n){let r=Dp(t,.45),i=Dp(t,.55),a=Dp(t,.5);if(!r||!i||!a)return null;let o=e.surface,s=o.frame,c=K(a,s.origin),l=hp(K(c,J(s.z,Y(c,s.z)))),u;u=o.kind===`cylinder`?l:o.kind===`cone`?hp(K(J(l,Math.cos(o.semiAngle)),J(s.z,Math.sin(o.semiAngle)))):o.kind===`sphere`?hp(c):hp(K(c,J(l,o.major))),e.sense||(u=gp(u));let d=hp(K(i,r));return n(q(a,J(hp(pp(u,d)),Math.max(mp(K(i,r)),1e-9))))}function jp(e,t,n){if(e.kind===`cylinder`)return{kind:`line`,a:[e.radius,t],b:[e.radius,n]};if(e.kind===`cone`){let r=t=>Math.max(0,e.radius+t*Math.tan(e.semiAngle));return{kind:`line`,a:[r(t),t],b:[r(n),n]}}let r=e.kind===`sphere`?[0,0]:[e.major,0],i=e.kind===`sphere`?e.radius:e.minor,a=e=>[r[0]+i*Math.cos(e),r[1]+i*Math.sin(e)];return{kind:`arc`,centre:r,radius:i,a:a(t),b:a(n),span:n-t,v0:t}}function Mp(e,t,n=!0){let r=e=>`${t(Math.max(0,e[0]))},${t(e[1])}`,i=n?`M${r(e.a)}`:``;if(e.kind===`line`)return`${i}L${r(e.b)}`;let a=(n,i)=>`A${t(e.radius)},${t(e.radius)} 0 ${+!!i},1 ${r(n)}`;return e.span>=dp-1e-9?`${i}${a([e.centre[0]+e.radius*Math.cos(e.v0+Math.PI),e.centre[1]+e.radius*Math.sin(e.v0+Math.PI)],!1)}${a(e.b,!1)}`:`${i}${a(e.b,e.span>Math.PI+1e-12)}`}function Np(e,t,n){let r=kp(e,n);if(!r)return null;let i=e.surface,a=i.frame,o=q(J(a.x,Math.cos(r.u0)),J(a.y,Math.sin(r.u0))),{attrs:c}=yp(a.origin,o,a.z,pp(o,a.z),t);return c.d=Mp(jp(i,r.v0,r.v1),t),r.uSpan<dp-1e-9&&(c.angle=H(r.uSpan*fp,6)),{el:s(`revolve`,c),exact:!0}}var Pp=(e,t)=>Math.abs(Math.abs(Y(e,t))-1)<1e-7,Fp=new Set([`cylinder`,`cone`,`sphere`,`torus`]);function Ip(e,t,n){if(e.faces.length!==1)return null;let r=e.faces[0],i=r.surface;if(i.kind!==`sphere`&&i.kind!==`torus`)return null;let a=kp(r,n);if(!a||a.uSpan<dp-1e-9)return null;if(i.kind===`sphere`){if(a.v1-a.v0<Math.PI-1e-7)return null;let e={radius:t(i.radius)};return i.frame.origin.some(e=>e!==0)&&(e.position=i.frame.origin.map(t).join(`,`)),s(`sphere`,e)}if(a.v1-a.v0<dp-1e-7)return null;let{attrs:o}=yp(i.frame.origin,i.frame.x,i.frame.z,pp(i.frame.x,i.frame.z),t);return s(`torus`,{...o,radius:t(i.major),tube:t(i.minor)})}function Lp(e,t,n){let r=e.faces.find(e=>Fp.has(e.surface.kind));if(!r)return null;let i=r.surface.frame.origin,a=r.surface.frame.z;(Math.abs(a[2])>1e-9?a[2]:Math.abs(a[1])>1e-9?a[1]:a[0])<0&&(a=gp(a));let o=e=>mp(pp(K(e,i),a))<=n*10,c=e=>Y(K(e,i),a),l=[];for(let t of e.faces){let e=t.surface;if(Fp.has(e.kind)){if(!Pp(e.frame.z,a)||!o(e.frame.origin))return null;let r=kp(t,n);if(!r||r.uSpan<dp-1e-9)return null;let i=jp(e,r.v0,r.v1),s=Y(e.frame.z,a)<0?-1:1,u=c(e.frame.origin),d=e=>[e[0],u+s*e[1]];i.kind===`line`?l.push({kind:`line`,a:d(i.a),b:d(i.b)}):l.push({kind:`arc`,centre:d(i.centre),radius:i.radius,a:d(i.a),b:d(i.b),ccw:s>0,span:i.span})}else if(e.kind===`plane`){if(!Pp(e.frame.z,a))return null;let n=[];for(let e of t.loops)for(let t of e.edges){if(t.curve.kind!==`circle`||!Pp(t.curve.frame.z,a)||!o(t.curve.frame.origin))return null;n.push(t.curve.radius)}if(!n.length)return null;let r=c(e.frame.origin);l.push({kind:`line`,a:[n.length>1?Math.min(...n):0,r],b:[Math.max(...n),r]})}else return null}let u=(e,t)=>Math.hypot(e[0]-t[0],e[1]-t[1])<=n*10,d=l.slice(),f=d.findIndex(e=>e.a[0]<=n*10||e.b[0]<=n*10),p=[],m=d.splice(f>=0?f:0,1)[0];for(m.b[0]<=n*10&&!(m.a[0]<=n*10)&&(m=Rp(m)),p.push(m);d.length;){let e=p[p.length-1].b,t=d.findIndex(t=>u(t.a,e)||u(t.b,e));if(t<0)return null;let n=d.splice(t,1)[0];u(n.a,e)||(n=Rp(n)),p.push(n)}let h=p[0].a,g=p[p.length-1].b,_=h[0]<=n*10&&g[0]<=n*10;if(!_&&!u(h,g))return null;let v=p.flatMap(e=>[e.a[1],e.b[1]]),y=Math.min(...v),b=q(i,J(a,y)),x=hp(Math.abs(a[0])<.9?pp([0,1,0],a):pp(a,[0,0,1])),S=p.every(e=>e.kind===`line`),C=p.map(e=>[e.a,e.b]).flat();if(S&&_&&p.length===3){let[e,r,i]=p;if(Math.abs(e.a[1]-e.b[1])<=n&&Math.abs(i.a[1]-i.b[1])<=n){let e=r.a[0],i=r.b[0],o=r.a[1]<r.b[1],c=Math.abs(r.b[1]-r.a[1]),{attrs:l}=yp(q(b,J(a,c/2)),x,a,pp(x,a),t),[u,d]=o?[e,i]:[i,e];return Math.abs(u-d)<=n?{el:s(`cylinder`,{...l,radius:t(u),height:t(c)}),kind:`cylinder`}:{el:s(`cylinder`,{...l,radius:t(u),radiusTop:t(d),height:t(c)}),kind:`cylinder`}}}if(S&&_&&p.length===2){let e=p.find(e=>Math.abs(e.a[1]-e.b[1])<=n),r=p.find(t=>t!==e);if(e&&r){let n=Math.abs(r.a[1]-r.b[1]),i=Math.max(r.a[1],r.b[1])>e.a[1],o=q(b,J(a,n/2)),c=i?a:gp(a),{attrs:l}=yp(o,x,c,pp(x,c),t);return{el:s(`cone`,{...l,radius:t(Math.max(...C.map(e=>e[0]))),height:t(n)}),kind:`cone`}}}let{attrs:w}=yp(b,x,a,pp(x,a),t),T=p.map(e=>({...e,a:[e.a[0],e.a[1]-y],b:[e.b[0],e.b[1]-y],centre:e.centre&&[e.centre[0],e.centre[1]-y]})),E=``;return T.forEach((e,n)=>{E+=n===0?`M${t(Math.max(0,e.a[0]))},${t(e.a[1])}`:``,e.kind===`line`?E+=`L${t(Math.max(0,e.b[0]))},${t(e.b[1])}`:E+=`A${t(e.radius)},${t(e.radius)} 0 ${+(Math.abs(e.span)>Math.PI+1e-12)},${+!!e.ccw} ${t(Math.max(0,e.b[0]))},${t(e.b[1])}`}),_||(E+=`Z`),{el:s(`revolve`,{...w,d:E}),kind:`revolve`}}function Rp(e){return e.kind===`line`?{...e,a:e.b,b:e.a}:{...e,a:e.b,b:e.a,ccw:!e.ccw}}function zp(e,t,n){let r=e.faces.filter(e=>e.surface.kind===`plane`);for(let i of r){let a=gp(i.sense?i.surface.frame.z:gp(i.surface.frame.z)),o=r.filter(e=>Pp(e.surface.frame.z,a));if(o.length!==2)continue;let c=o.find(e=>e!==i),l=Y(K(c.surface.frame.origin,i.surface.frame.origin),a);if(l<=n)continue;let u=e=>Y(K(e,i.surface.frame.origin),a),d=!0;for(let t of e.faces){if(t===i||t===c)continue;let e=t.surface;if(!(e.kind===`plane`&&Math.abs(Y(e.frame.z,a))<1e-7||e.kind===`cylinder`&&Pp(e.frame.z,a)||e.kind===`extrusion`&&Pp(e.dir,a))){d=!1;break}for(let e of t.loops)for(let t of e.edges){let e=u(t.start),r=u(t.end),i=t.curve.kind===`line`&&Pp(t.curve.dir,a),o=Math.abs(e)<=n&&Math.abs(r)<=n||Math.abs(e-l)<=n&&Math.abs(r-l)<=n;!i&&!o&&(d=!1)}if(!d)break}if(!d)continue;let f=e=>e.loops.flatMap(e=>e.edges.map(e=>e.start)),p=f(i),m=f(c);if(p.length!==m.length||!m.every(e=>p.some(t=>mp(K(q(t,J(a,l)),e))<=n*10)))continue;let h=i.surface.frame,g=h.x,{attrs:_,frame:v}=yp(h.origin,g,pp(a,g),a,t),y=bp(v),b=i.loops.filter(e=>e.edges.length);if(b.length===1&&b[0].edges.length===4&&b[0].edges.every(e=>e.curve.kind===`line`)&&b[0].edges.every((e,t,n)=>Math.abs(Y(hp(K(e.end,e.start)),hp(K(n[(t+1)%4].end,n[(t+1)%4].start))))<1e-7)){let e=b[0].edges.map(e=>e.start),n=hp(K(e[1],e[0])),r=pp(a,n);return{el:s(`box`,{...yp(q(J(q(e[0],e[2]),.5),J(a,l/2)),n,r,a,t).attrs,size:[mp(K(e[1],e[0])),mp(K(e[3],e[0])),l].map(t).join(`,`)}),kind:`box`}}let x=[],S=!0;for(let e of b){let r=`M${t(y(e.edges[0].start)[0])},${t(y(e.edges[0].start)[1])}`;for(let i of e.edges){let e=wp(i,v,y,t,n);if(!e)return null;r+=e.d,S&&=e.exact}x.push(`${r}Z`)}let C={..._,d:x.join(` `),depth:t(l)};return x.length>1&&(C.fillRule=`evenodd`),{el:s(`extrude`,C),kind:`extrude`,exact:S}}return null}function Bp(e){let t=e.frame;if(e.kind===`plane`)return{uv:e=>[Y(K(e,t.origin),t.x),Y(K(e,t.origin),t.y)],xyz:([e,n])=>q(t.origin,q(J(t.x,e),J(t.y,n))),periodic:[!1,!1]};if(Fp.has(e.kind)){let n=Ep(e);return{uv:e=>{let t=n(e);return[t.u,t.v]},xyz:([n,r])=>{let i=q(J(t.x,Math.cos(n)),J(t.y,Math.sin(n)));return e.kind===`cylinder`?q(t.origin,q(J(t.z,r),J(i,e.radius))):e.kind===`cone`?q(t.origin,q(J(t.z,r),J(i,e.radius+r*Math.tan(e.semiAngle)))):e.kind===`sphere`?q(t.origin,q(J(t.z,e.radius*Math.sin(r)),J(i,e.radius*Math.cos(r)))):q(t.origin,q(J(t.z,e.minor*Math.sin(r)),J(i,e.major+e.minor*Math.cos(r))))},periodic:[!0,e.kind===`torus`]}}if(e.kind===`bspline`){let t=e.U[e.du],n=e.U[e.U.length-e.du-1],r=e.V[e.dv],i=e.V[e.V.length-e.dv-1],a=([a,o])=>ip(e,Math.min(n,Math.max(t,a)),Math.min(i,Math.max(r,o))),o=[];for(let e=0;e<=16;e++)for(let s=0;s<=16;s++){let c=[t+(n-t)*e/16,r+(i-r)*s/16];o.push([c,a(c)])}return{uv:e=>{let s=o[0];for(let t of o)mp(K(t[1],e))<mp(K(s[1],e))&&(s=t);let[c,l]=s[0],u=(n-t)*1e-6,d=(i-r)*1e-6;for(let o=0;o<12;o++){let o=a([c,l]),s=K(e,o),f=J(K(a([c+u,l]),o),1/u),p=J(K(a([c,l+d]),o),1/d),m=Y(f,f),h=Y(f,p),g=Y(p,p),_=m*g-h*h;if(Math.abs(_)<1e-30)break;let v=(g*Y(f,s)-h*Y(p,s))/_,y=(m*Y(p,s)-h*Y(f,s))/_;if(c=Math.min(n,Math.max(t,c+v)),l=Math.min(i,Math.max(r,l+y)),Math.abs(v)<u&&Math.abs(y)<d)break}return[c,l]},xyz:a,periodic:[!1,!1]}}return null}function Vp(e){let t=0;for(let n=0;n<e.length;n++){let r=e[(n+1)%e.length];t+=e[n][0]*r[1]-r[0]*e[n][1]}return t/2}function Hp(e,t){let n=e.slice(),r=t.slice().sort((e,t)=>Math.max(...t.map(e=>e.uv[0]))-Math.max(...e.map(e=>e.uv[0])));for(let e of r){let t=0;for(let n=1;n<e.length;n++)e[n].uv[0]>e[t].uv[0]&&(t=n);let r=e[t].uv,i=-1,a=1/0;for(let t=0;t<n.length;t++){let o=n[t].uv;if(o[0]<r[0])continue;let s=Math.hypot(o[0]-r[0],o[1]-r[1]);s<a&&!Up(r,o,n,e)&&(a=s,i=t)}if(i<0)for(let e=0;e<n.length;e++){let t=n[e].uv,o=Math.hypot(t[0]-r[0],t[1]-r[1]);o<a&&(a=o,i=e)}let o=[...e.slice(t),...e.slice(0,t+1)];n=[...n.slice(0,i+1),...o,...n.slice(i)]}return n}function Up(e,t,n,r){let i=[n,r];for(let n of i)for(let r=0;r<n.length;r++){let i=n[r].uv,a=n[(r+1)%n.length].uv;if(i===e||a===e||i===t||a===t)continue;let o=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0]),s=o(e,t,i),c=o(e,t,a),l=o(i,a,e),u=o(i,a,t);if(s*c<0&&l*u<0)return!0}return!1}function Wp(e){let t=e.length,n=e.map((e,t)=>t);Vp(e.map(e=>e.uv))<0&&n.reverse();let r=[],i=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0]),a=(e,t,n,r)=>i(t,n,e)>0&&i(n,r,e)>0&&i(r,t,e)>0,o=t*t;for(;n.length>3&&o-->0;){let t=-1,o=1/0;for(let r=0;r<n.length;r++){let s=n[(r+n.length-1)%n.length],c=n[r],l=n[(r+1)%n.length];if(i(e[s].uv,e[c].uv,e[l].uv)<=0||n.some(t=>t!==s&&t!==c&&t!==l&&a(e[t].uv,e[s].uv,e[c].uv,e[l].uv)))continue;let u=mp(K(e[s].p,e[l].p));u<o&&(o=u,t=r)}if(t<0)break;let s=n.length;r.push([n[(t+s-1)%s],n[t],n[(t+1)%s]]),n.splice(t,1)}for(let e=1;e+1<n.length;e++)r.push([n[0],n[e],n[e+1]]);return r}function Gp(e,t,n){let r=e=>Math.min(Math.PI/12,2*Math.acos(Math.max(-1,1-n/Math.max(e,n)))),i=t.max[0]-t.min[0],a=t.max[1]-t.min[1],o=(e,t)=>Math.max(1,Math.min(720,Math.ceil(e/t)));return e.kind===`cylinder`?[o(i,r(e.radius)),1]:e.kind===`cone`?[o(i,r(Math.max(Math.abs(e.radius+t.min[1]*Math.tan(e.semiAngle)),Math.abs(e.radius+t.max[1]*Math.tan(e.semiAngle))))),1]:e.kind===`sphere`?[o(i,r(e.radius)),o(a,r(e.radius))]:e.kind===`torus`?[o(i,r(e.major+e.minor)),o(a,r(e.minor))]:e.kind===`bspline`?[Math.max(4,(e.U.length-2*e.du-1)*6),Math.max(4,(e.V.length-2*e.dv-1)*6)]:[1,1]}function Kp(e,t,n,r,i){let a=e,o=[[e=>e[0]>=t,0,t],[e=>e[0]<=n,0,n],[e=>e[1]>=r,1,r],[e=>e[1]<=i,1,i]];for(let[e,t,n]of o){if(!a.length)break;let r=[];for(let i=0;i<a.length;i++){let o=a[i],s=a[(i+1)%a.length],c=e(o),l=e(s);if(c&&r.push(o),c!==l){let e=(n-o[t])/(s[t]-o[t]),i=[o[0]+(s[0]-o[0])*e,o[1]+(s[1]-o[1])*e];i[t]=n,r.push(i)}}a=r}return a}function qp(e,t,n){let r=e=>`${Math.round(e[0]/t)},${Math.round(e[1]/n)}`,i=[],a=[],o=new Map;for(let t of e){let e=r(t);if(o.has(e)){let t=o.get(e),n=a.splice(t+1);for(let e of n)o.delete(r(e));i.push([a[t],...n])}else o.set(e,a.length),a.push(t)}a.length&&i.push(a);let s=t*n*1e3,c=i.filter(e=>e.length>=3&&Math.abs(Vp(e))>s),l=c.filter(e=>Vp(e)>0),u=c.filter(e=>Vp(e)<0),d=(e,t)=>{let n=!1;for(let r=0,i=t.length-1;r<t.length;i=r++){let a=t[r],o=t[i];a[1]>e[1]!=o[1]>e[1]&&e[0]<(o[0]-a[0])*(e[1]-a[1])/(o[1]-a[1])+a[0]&&(n=!n)}return n};return l.map(e=>{let t=u.filter(t=>d(t[0],e)),n=e=>e.map(e=>({uv:e,p:[e[0],e[1],0]}));return t.length?Hp(n(e),t.map(n)):n(e)})}function Jp(e,t){let n=Bp(e.surface);if(!n)return null;let r=[];for(let t of e.loops){if(!t.edges.length)continue;let e=[],i=null;for(let r of t.edges){let t=Cp(r,16);if(!t)return null;for(let r=0;r<t.length-1;r++){let a=n.uv(t[r]);if(i){for(let e=0;e<2;e++)if(n.periodic[e]){for(;a[e]-i[e]>Math.PI;)a[e]-=dp;for(;a[e]-i[e]<-Math.PI;)a[e]+=dp}}e.push({uv:a,p:t[r]}),i=a}}e.length>=3&&r.push(e)}if(!r.length)return null;r.sort((e,t)=>Math.abs(Vp(t.map(e=>e.uv)))-Math.abs(Vp(e.map(e=>e.uv))));let i=r[0];Vp(i.map(e=>e.uv))<0&&i.reverse();let a=r.slice(1).map(e=>Vp(e.map(e=>e.uv))>0?e.slice().reverse():e);for(let e=0;e<2;e++){if(!n.periodic[e])continue;let t=Math.min(...i.map(t=>t.uv[e])),r=Math.max(...i.map(t=>t.uv[e]));for(let n of a){let i=n.reduce((t,n)=>t+n.uv[e],0)/n.length,a=i<t?Math.ceil((t-i)/dp)*dp:i>r?-Math.ceil((i-r)/dp)*dp:0;if(a)for(let t of n)t.uv=e===0?[t.uv[0]+a,t.uv[1]]:[t.uv[0],t.uv[1]+a]}}let o=(a.length?Hp(i,a):i).map(e=>e.uv),s={min:[1/0,1/0],max:[-1/0,-1/0]};for(let e of o)for(let t=0;t<2;t++)s.min[t]=Math.min(s.min[t],e[t]),s.max[t]=Math.max(s.max[t],e[t]);let[c,l]=Gp(e.surface,s,t),u=[],d=[],f=new Map,p=(s.max[0]-s.min[0])*1e-9||1e-12,m=(s.max[1]-s.min[1])*1e-9||1e-12,h=[],g=e=>{let t=`${Math.round(e[0]/p)},${Math.round(e[1]/m)}`;return f.has(t)||(h.push(e),f.set(t,u.push(n.xyz(e))-1)),f.get(t)};for(let t=0;t<c;t++){let r=s.min[0]+(s.max[0]-s.min[0])*t/c,i=s.min[0]+(s.max[0]-s.min[0])*(t+1)/c;for(let t=0;t<l;t++){let a=Kp(o,r,i,s.min[1]+(s.max[1]-s.min[1])*t/l,s.min[1]+(s.max[1]-s.min[1])*(t+1)/l);if(!(a.length<3||Math.abs(Vp(a))<=p*m))for(let t of qp(a,p,m)){for(let e of t)e.p=n.xyz(e.uv);for(let[n,r,i]of Wp(t)){let a=[g(t[n].uv),g(t[r].uv),g(t[i].uv)];a[0]!==a[1]&&a[1]!==a[2]&&a[0]!==a[2]&&(e.sense?d.push(a[0],a[1],a[2]):d.push(a[0],a[2],a[1]))}}}}return d.length?{positions:u,indices:Yp(d,h,u,n,p,m)}:null}function Yp(e,t,n,r,i,a){let o=[1/0,1/0],s=[-1/0,-1/0];for(let e of t)o=[Math.min(o[0],e[0]),Math.min(o[1],e[1])],s=[Math.max(s[0],e[0]),Math.max(s[1],e[1])];let c=(s[0]-o[0])/64||1,l=(s[1]-o[1])/64||1,u=new Map;t.forEach((e,t)=>{let n=`${Math.floor((e[0]-o[0])/c)},${Math.floor((e[1]-o[1])/l)}`;u.has(n)||u.set(n,[]),u.get(n).push(t)});let d=Math.hypot(i,a)*1e3,f=(e,n)=>{let r=t[e],i=t[n],a=[i[0]-r[0],i[1]-r[1]],s=a[0]*a[0]+a[1]*a[1],f=[],[p,m]=[Math.floor((Math.min(r[0],i[0])-o[0])/c),Math.floor((Math.max(r[0],i[0])-o[0])/c)],[h,g]=[Math.floor((Math.min(r[1],i[1])-o[1])/l),Math.floor((Math.max(r[1],i[1])-o[1])/l)];for(let i=p;i<=m;i++)for(let o=h;o<=g;o++)for(let c of u.get(`${i},${o}`)||[]){if(c===e||c===n)continue;let i=t[c],o=((i[0]-r[0])*a[0]+(i[1]-r[1])*a[1])/s;o<=1e-9||o>=1-1e-9||Math.abs((i[0]-r[0])*a[1]-(i[1]-r[1])*a[0])/Math.sqrt(s)>d||f.push([o,c])}return f.sort((e,t)=>e[0]-t[0]).map(([,e])=>e)},p=[];for(let o=0;o<e.length;o+=3){let s=[e[o],e[o+1],e[o+2]],[c,l,u]=s.map(e=>t[e]),d=(l[0]-c[0])*(u[1]-c[1])-(l[1]-c[1])*(u[0]-c[0]);if(Math.abs(d)<=i*a)continue;let m=[];for(let e=0;e<3;e++)for(let t of[s[e],...f(s[e],s[(e+1)%3])])m.includes(t)||m.push(t);if(m.length===3){p.push(...s);continue}let h=[(c[0]+l[0]+u[0])/3,(c[1]+l[1]+u[1])/3];t.push(h);let g=n.push(r.xyz(h))-1;for(let e=0;e<m.length;e++)p.push(g,m[e],m[(e+1)%m.length])}return p}function Xp(e){return Math.min(12,Math.max(0,Math.ceil(-Math.log10(Math.max(e,1e-9)*1e-7))))}function Zp(e,{up:n=`z`,name:i=``}={}){let a=md(e),{shells:o,tol:c}=up(a.entities);if(!o.length||o.every(e=>!e.faces.length))return null;let l=0;for(let e of o)for(let t of e.faces)for(let e of t.loops)for(let t of e.edges)for(let e of[t.start,t.end])l=Math.max(l,mp(e));let u=Xp(Math.max(l*2,1e-6)),d=e=>H(e,u),f=qd(a.entities),p=Tf(a.entities),m=new Map,h=e=>{let t=je(e||[.78,.8,.82,1]);return m.has(t)||m.set(t,`c${t.slice(1,7)}`),m.get(t)},g={shells:o.length,faces:0,exact:0,tessellated:0,approximate:0,skipped:0,shapes:{}},_=e=>g.shapes[e]=(g.shapes[e]||0)+1,v=[];for(let e of o){let t=s(`group`,{material:h(Ef(f,p,[e.id]))});e.name&&t.setAttr(`name`,e.name),g.faces+=e.faces.length;let n=Ip(e,d,c),r=n?{el:n,kind:n.name}:e.closed?Lp(e,d,c)||zp(e,d,c):null;if(r){t.appendChild(r.el),_(r.kind),r.exact===!1?g.approximate+=e.faces.length:g.exact+=e.faces.length,v.push(t);continue}let i={positions:[],indices:[]};for(let n of e.faces){let e=f.get(n.id),r=n.surface.kind,a=null;if(r===`plane`?a=Tp(n,d,c):Fp.has(r)&&(a=Np(n,d,c)),a){e&&a.el.setAttr(`material`,h(e)),t.appendChild(a.el),_(a.el.name),a.exact?g.exact++:g.approximate++;continue}let o=Jp(n,l*5e-4);if(!o){g.skipped++;continue}let s=i.positions.length;for(let e of o.positions)i.positions.push(e);for(let e of o.indices)i.indices.push(s+e);g.tessellated++}i.indices.length&&(t.appendChild(s(`mesh`,{positions:i.positions.map(e=>e.map(d).join(` `)).join(` `),indices:i.indices.join(` `),smooth:`30`})),_(`mesh`)),v.push(t)}if(g.skipped===g.faces)return null;let y=Pd(a.entities),b=(y&&!/^(compound|solid|shell|body|part|unnamed)\s*\d*$/i.test(y.trim())?y:``)||String(i).replace(/\.(step|stp|p21)$/i,``)||y||`step`,x={version:`1`};vp[a.unit]&&(x.unit=vp[a.unit]);let S=s(`es3d`,x,s(`title`,{},b));for(let[e,t]of m)S.appendChild(s(`material`,{id:t,color:e}));let C=n===`z`?S.appendChild(s(`group`,{name:`z-up`,rotation:`-90,0,0`})):S;for(let e of v)C.appendChild(e);let w={box:[`box`,`boxes`],extrude:[`extrusion`,`extrusions`],revolve:[`revolve`,`revolves`],path:[`flat face`,`flat faces`],mesh:[`mesh`,`meshes`],torus:[`torus`,`tori`]},T=Object.entries(g.shapes).map(([e,t])=>`${t} ${(w[e]||[e,`${e}s`])[t===1?0:1]}`).join(`, `),E=g.tessellated?`${g.exact+g.approximate} of ${g.faces} faces are ES3D shapes; ${g.tessellated} face${g.tessellated===1?` is a free-form or cross-cut surface ES3D cannot describe, so it is`:`s are free-form or cross-cut surfaces ES3D cannot describe, so they are`} tessellated from the exact surface into a mesh.`:`All ${g.faces} faces are ES3D shapes${g.approximate?` (${g.approximate} with edges sampled: rational splines)`:``}; nothing is a mesh.`;return{text:Pr(new r({root:S,syntax:`xml`,leading:[new t(` Converted from STEP: ${T}. `)]}),{pretty:!0,comments:!0}),note:`STEP B-rep: ${T}. ${E}${g.skipped?` ${g.skipped} face${g.skipped===1?` has`:`s have`} no surface or bounds that can be read and ${g.skipped===1?`was`:`were`} left out.`:``}${a.unit?` Coordinates are in ${a.unit} and were not rescaled.`:` The file does not name a length unit; coordinates were used as written.`}${n===`z`?` Turned from Z-up to Y-up by the outer group.`:``}`,stats:g}}var Qp=[1,0,0,1,0,0];function $p(e,t){return[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]]}var em=(e,t,n)=>[e[0]*t+e[2]*n+e[4],e[1]*t+e[3]*n+e[5]],tm=e=>e[0]*e[3]-e[1]*e[2];function nm(e){let[t,n,r,i]=e,a=t*i-n*r;if(!(Math.abs(a)>1e-300))return null;let o=Math.sqrt(Math.abs(a)),s=1e-9*o;return(a>0?Math.abs(t-i)<=s&&Math.abs(n+r)<=s:Math.abs(t+i)<=s&&Math.abs(n-r)<=s)?{scale:o,angle:Math.atan2(n,t)*180/Math.PI,flip:a<0}:null}var rm=/[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/g,im=e=>(String(e).match(rm)||[]).map(Number);function am(e){let t=Qp,n=/\s*(matrix|translate|scale|rotate|skewX|skewY)\s*\(([^)]*)\)\s*,?/gy,r,i=0;for(;r=n.exec(e);){i=n.lastIndex;let e=im(r[2]),a=e=>e*Math.PI/180,o;switch(r[1]){case`matrix`:if(e.length!==6)return null;o=e;break;case`translate`:if(e.length<1||e.length>2)return null;o=[1,0,0,1,e[0],e[1]||0];break;case`scale`:if(e.length<1||e.length>2)return null;o=[e[0],0,0,e.length>1?e[1]:e[0],0,0];break;case`rotate`:{if(e.length!==1&&e.length!==3)return null;let t=Math.cos(a(e[0])),n=Math.sin(a(e[0]));o=[t,n,-n,t,0,0],e.length===3&&(o=$p($p([1,0,0,1,e[1],e[2]],o),[1,0,0,1,-e[1],-e[2]]));break}case`skewX`:if(e.length!==1)return null;o=[1,0,Math.tan(a(e[0])),1,0,0];break;case`skewY`:if(e.length!==1)return null;o=[1,Math.tan(a(e[0])),0,1,0,0]}t=$p(t,o)}return e.slice(i).trim()===``?t:null}function om(e){let t=Wr(e.x0,e.y0,e.rx,e.ry,e.rot,e.large,e.sweep,e.x,e.y);if(!t)return[{c:`L`,x:e.x,y:e.y}];let n=e.rot*Math.PI/180,r=Math.cos(n),i=Math.sin(n),a=Math.max(1,Math.ceil(Math.abs(t.dtheta)/(Math.PI/2)-1e-9)),o=t.dtheta/a,s=4/3*Math.tan(o/4),c=e=>[-t.rx*r*Math.sin(e)-t.ry*i*Math.cos(e),-t.rx*i*Math.sin(e)+t.ry*r*Math.cos(e)],l=[],u=t.theta1,d=e.x0,f=e.y0;for(let n=0;n<a;n++){let r=u+o,[i,p]=n===a-1?[e.x,e.y]:t.pointAt(r),m=c(u),h=c(r);l.push({c:`C`,x1:d+s*m[0],y1:f+s*m[1],x2:i-s*h[0],y2:p-s*h[1],x:i,y:p}),d=i,f=p,u=r}return l}function sm(e,t){let n=nm(t),r=[];for(let i of e)switch(i.c){case`M`:case`L`:{let[e,n]=em(t,i.x,i.y);r.push({c:i.c,x:e,y:n,implicit:i.implicit});break}case`C`:{let[e,n]=em(t,i.x1,i.y1),[a,o]=em(t,i.x2,i.y2),[s,c]=em(t,i.x,i.y);r.push({c:`C`,x1:e,y1:n,x2:a,y2:o,x:s,y:c});break}case`Q`:{let[e,n]=em(t,i.x1,i.y1),[a,o]=em(t,i.x,i.y);r.push({c:`Q`,x1:e,y1:n,x:a,y:o});break}case`A`:if(n){let[e,a]=em(t,i.x0,i.y0),[o,s]=em(t,i.x,i.y),c=n.flip?n.angle-i.rot:n.angle+i.rot;c=(c%360+360)%360,r.push({c:`A`,rx:i.rx*n.scale,ry:i.ry*n.scale,rot:c,large:i.large,sweep:n.flip?1-i.sweep:i.sweep,x0:e,y0:a,x:o,y:s})}else for(let e of om(i))r.push(...sm([e],t));break;case`Z`:r.push({c:`Z`})}return r}function cm(e){let t=[],n=null;for(let r of e)if(r.c===`M`)n=[r.x,r.y],t.push(n);else if(r.c===`Z`)n=null;else{n||(n=[],t.push(n));let e=r.c===`A`?om(r):[r];for(let t of e)t.c===`C`?n.push(t.x1,t.y1,t.x2,t.y2,t.x,t.y):t.c===`Q`?n.push(t.x1,t.y1,t.x,t.y):n.push(t.x,t.y)}return t}function lm(e){let t=0;for(let n=0,r=e.length/2;n<r;n++){let i=(n+1)%r;t+=e[n*2]*e[i*2+1]-e[i*2]*e[n*2+1]}return t/2}var um=[`fill`,`fill-opacity`,`fill-rule`,`stroke`,`stroke-opacity`,`stroke-width`,`stroke-dasharray`,`visibility`,`color`],dm=new Set([...um,`opacity`,`display`,`transform`]),fm={fill:`black`,"fill-opacity":`1`,"fill-rule":`nonzero`,stroke:`none`,"stroke-opacity":`1`,"stroke-width":`1`,"stroke-dasharray":`none`,visibility:`visible`,color:`black`};function pm(e){let t={};for(let n of String(e).split(`;`)){let e=n.indexOf(`:`);if(e<0)continue;let r=n.slice(0,e).trim().toLowerCase(),i=n.slice(e+1).replace(/!important/i,``).trim();r&&i&&(t[r]=i)}return t}var mm=/^(\*|[A-Za-z][\w-]*)?((?:[.#][\w-]+)*)$/;function hm(e){let t=[],n=0,r=String(e).replace(/\/\*[\s\S]*?\*\//g,``).replace(/@[\w-]+[^{;]*;/g,``),i=0;for(;i<r.length;){let e=r.indexOf(`{`,i);if(e<0)break;let a=r.slice(i,e).trim(),o=1,s=e+1;for(;s<r.length&&o;)r[s]===`{`?o++:r[s]===`}`&&o--,s++;let c=r.slice(e+1,s-1);if(i=s,a.startsWith(`@`)){let e=hm(c);t.push(...e.rules),n+=e.unsupported;continue}let l=pm(c);for(let e of a.split(`,`)){let r=e.trim(),i=mm.exec(r);if(!r||!i){r&&n++;continue}let a=i[1]&&i[1]!==`*`?i[1].toLowerCase():null,o=[],s=[];for(let e of i[2].match(/[.#][\w-]+/g)||[])(e[0]===`.`?o:s).push(e.slice(1));t.push({tag:a,classes:o,ids:s,specificity:s.length*100+o.length*10+ +!!a,decls:l})}}return t.forEach((e,t)=>e.order=t),{rules:t,unsupported:n}}function gm(e,t,n){let r=t=>(t+e/30)%12,i=t*Math.min(n,1-n),a=e=>n-i*Math.max(-1,Math.min(r(e)-3,9-r(e),1));return[a(0),a(8),a(4)]}function _m(e){let t=String(e).trim(),n=De(t);if(n)return n;let r=/^hsla?\(\s*([^)]*)\)$/i.exec(t);if(r){let e=r[1].split(/\s*[,/]\s*|\s+/).filter(Boolean);if(e.length<3)return null;let t=parseFloat(e[0]),n=parseFloat(e[1])/100,i=parseFloat(e[2])/100,a=e[3]===void 0?1:e[3].endsWith(`%`)?parseFloat(e[3])/100:parseFloat(e[3]);return[t,n,i,a].every(Number.isFinite)?(a=Math.max(0,Math.min(1,a)),[...gm((t%360+360)%360,Math.max(0,Math.min(1,n)),Math.max(0,Math.min(1,i))),a]):null}return null}var vm={px:1,pt:4/3,pc:16,mm:96/25.4,cm:96/2.54,in:96,em:16,ex:8,q:96/101.6};function ym(e,t=0){if(e==null)return null;let n=/^\s*([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?)\s*([a-zA-Z%]*)\s*$/.exec(String(e));if(!n)return null;let r=Number(n[1]),i=n[2].toLowerCase();return i?i===`%`?r/100*t:vm[i]===void 0?null:r*vm[i]:r}var bm={text:`text (convert text to paths in your drawing program first)`,image:`embedded images`,foreignObject:`foreign objects`,video:`video`,audio:`audio`,canvas:`canvas`,iframe:`iframes`},xm=new Set([`g`,`svg`,`a`,`switch`]),Sm=new Set([`defs`,`symbol`,`clipPath`,`mask`,`pattern`,`marker`,`linearGradient`,`radialGradient`,`filter`,`style`,`script`,`title`,`desc`,`metadata`,`font`,`font-face`,`cursor`,`view`]),Cm=e=>{let t=e.indexOf(`:`);return t>=0?e.slice(t+1):e};function wm(e,t){let n=String(e).replace(/^\uFEFF/,``),r=new Map,i=!1;n=n.replace(/<!DOCTYPE[^[>]*(\[[\s\S]*?\])?\s*>/i,(e,n)=>{if(n)for(let e of n.matchAll(/<!ENTITY\s+([\w.-]+)\s+(?:"([^"]*)"|'([^']*)')\s*>/g)){if(r.size>=32){t(`This SVG declares more than 32 entities. The extras were ignored.`);break}let n=e[2]??e[3];n.length>4096?t(`Entity &${e[1]}; is too long to expand, so it was left out.`):r.set(e[1],n)}return``});let a=new Set([`lt`,`gt`,`amp`,`quot`,`apos`]),o=new Set,s=0;return n=n.replace(/&([A-Za-z_][\w.-]*);/g,(e,n)=>{if(a.has(n))return e;if(r.has(n)){if(i)return``;let e=r.get(n);return s+=e.length,s>2e5?(i=!0,t(`Entity expansion was stopped because it grew past 200 kB.`),``):e.replace(/&(?!(lt|gt|amp|quot|apos|#\d+|#x[0-9a-fA-F]+);)/g,`&`)}return n===`nbsp`?` `:(o.add(n),``)}),o.size&&t(`Unknown entities were removed: ${[...o].map(e=>`&${e};`).join(` `)}.`),n}function Tm(e,n={}){let{name:i=`drawing.svg`,size:a=10,depth:o=.04,bevel:c=0,strokes:l=!0,base:u=!1}=n,f=[],p=new Map,m=e=>f.push(e),h=(e,t)=>{p.set(e,(p.get(e)||0)+1),p.get(e)===1&&f.push(t)},g;try{g=ee(wm(e,m))}catch(e){if(e instanceof d){let t=e.diagnostics[0];throw Error(`The SVG file is not well-formed XML (line ${t.line}, column ${t.column}): ${t.message}`)}throw e}let _=g.root;if(Cm(_.name)!==`svg`)throw Error(`Not an SVG file: the root element is <${_.name}>, expected <svg>.`);let v=new Map,y=[],b=e=>{let t=e.attr(`id`);t&&!v.has(t)&&v.set(t,e),Cm(e.name)===`style`&&e.text&&y.push(e.text);for(let t of e.children)t.type===`element`&&b(t)};b(_);let x=hm(y.join(`
|
|
421
|
+
`));x.unsupported&&m(`${x.unsupported} CSS selector${x.unsupported>1?`s`:``} more complex than tag, .class or #id ${x.unsupported>1?`were`:`was`} ignored.`);let S=im(_.attr(`viewBox`)||``),C=ym(_.attr(`width`)),w=ym(_.attr(`height`)),T=null;S.length===4&&S[2]>0&&S[3]>0?T={x:S[0],y:S[1],w:S[2],h:S[3]}:C>0&&w>0&&(T={x:0,y:0,w:C,h:w});let E=T?T.w:100,D=T?T.h:100,O=Math.hypot(E,D)/Math.SQRT2,k=_.children.find(e=>e.type===`element`&&Cm(e.name)===`title`),A=k&&k.text&&k.text.trim()||i.replace(/\.svgz?$/i,``),j=(e,t)=>{let n=Cm(e.name),r={};for(let e of um)r[e]=t[e];r.opacity=t.opacity,r.display=`inline`;let i={};for(let t of e.attrs){let e=Cm(t.name);dm.has(e)&&e!==`transform`&&(i[e]=t.value)}let a=(e.attr(`class`)||``).split(/\s+/).filter(Boolean),o=e.attr(`id`),s=x.rules.filter(e=>(!e.tag||e.tag===n)&&e.classes.every(e=>a.includes(e))&&e.ids.every(e=>e===o));s.sort((e,t)=>e.specificity-t.specificity||e.order-t.order);for(let e of s)Object.assign(i,e.decls);e.attr(`style`)&&Object.assign(i,pm(e.attr(`style`)));for(let[e,n]of Object.entries(i))n!==`inherit`&&(e===`opacity`?r.opacity=t.opacity*Math.max(0,Math.min(1,parseFloat(n))):(e in r||um.includes(e))&&(r[e]=n));return i.display&&(r.display=i.display),r},M=(e,t)=>{let n=String(e).trim();if(n===`none`||n===`transparent`)return null;/^currentcolor$/i.test(n)&&(n=t.color);let r=/^url\(\s*['"]?#([^'")\s]+)['"]?\s*\)\s*(.*)$/.exec(n);if(r){let e=v.get(r[1]),n=e&&Cm(e.name);if(n===`linearGradient`||n===`radialGradient`){let t=N(e);if(t.length){h(`gradient`,`Gradients were replaced by their average color.`);let e=t.length,n=t.reduce((t,n)=>t.map((t,r)=>t+n[r]/e),[0,0,0,0]);return{color:n.slice(0,3),opacity:n[3]}}return null}return r[2]?M(r[2],t):(h(`pattern`,`Patterns and other unsupported paint servers were replaced by gray.`),{color:[.5,.5,.5],opacity:1})}let i=_m(n);return i?{color:i.slice(0,3),opacity:i[3]}:(h(`color:${n}`,`Unrecognized color "${n}" was treated as none.`),null)},N=(e,t=new Set)=>{if(t.has(e))return[];t.add(e);let n=[];for(let t of e.children){if(t.type!==`element`||Cm(t.name)!==`stop`)continue;let e={...Object.fromEntries(t.attrs.map(e=>[Cm(e.name),e.value])),...pm(t.attr(`style`)||``)},r=_m(e[`stop-color`]||`black`);if(!r)continue;let i=e[`stop-opacity`]===void 0?1:parseFloat(e[`stop-opacity`]);n.push([r[0],r[1],r[2],r[3]*(Number.isFinite(i)?i:1)])}if(n.length)return n;let r=e.attr(`href`)||e.attr(`xlink:href`),i=r&&r.startsWith(`#`)?v.get(r.slice(1)):null;return i?N(i,t):[]},te=(e,t)=>{let n=(t,n=O)=>{let r=ym(e.attr(t),n);return r===null?0:r};switch(t){case`path`:{let t=e.attr(`d`);if(!t||!t.trim())return null;try{return Be(t).segments}catch(e){return h(`pathdata`,`A path with invalid path data was skipped (${e.message}).`),null}}case`rect`:{let t=n(`x`,E),r=n(`y`,D),i=n(`width`,E),a=n(`height`,D);if(!(i>0&&a>0))return null;let o=ym(e.attr(`rx`),E),s=ym(e.attr(`ry`),D);if((o===null||o<0)&&(o=s!==null&&s>0?s:0),(s===null||s<0)&&(s=o),o=Math.min(o,i/2),s=Math.min(s,a/2),!(o>0&&s>0))return[{c:`M`,x:t,y:r},{c:`L`,x:t+i,y:r},{c:`L`,x:t+i,y:r+a},{c:`L`,x:t,y:r+a},{c:`Z`}];let c=(e,t,n,r)=>({c:`A`,rx:o,ry:s,rot:0,large:0,sweep:1,x0:e,y0:t,x:n,y:r});return[{c:`M`,x:t+o,y:r},{c:`L`,x:t+i-o,y:r},c(t+i-o,r,t+i,r+s),{c:`L`,x:t+i,y:r+a-s},c(t+i,r+a-s,t+i-o,r+a),{c:`L`,x:t+o,y:r+a},c(t+o,r+a,t,r+a-s),{c:`L`,x:t,y:r+s},c(t,r+s,t+o,r),{c:`Z`}]}case`circle`:case`ellipse`:{let e=n(`cx`,E),r=n(`cy`,D),i=t===`circle`?n(`r`):n(`rx`,E),a=t===`circle`?i:n(`ry`,D);return i>0&&a>0?[{c:`M`,x:e+i,y:r},{c:`A`,rx:i,ry:a,rot:0,large:1,sweep:1,x0:e+i,y0:r,x:e-i,y:r},{c:`A`,rx:i,ry:a,rot:0,large:1,sweep:1,x0:e-i,y0:r,x:e+i,y:r},{c:`Z`}]:null}case`line`:return[{c:`M`,x:n(`x1`,E),y:n(`y1`,D)},{c:`L`,x:n(`x2`,E),y:n(`y2`,D)}];case`polyline`:case`polygon`:{let n=im(e.attr(`points`)||``);if(n.length%2&&h(`points`,`A points list with an odd number of coordinates was truncated.`),n.length<4)return null;let r=[{c:`M`,x:n[0],y:n[1]}];for(let e=2;e+1<n.length;e+=2)r.push({c:`L`,x:n[e],y:n[e+1]});return t===`polygon`&&r.push({c:`Z`}),r}default:return null}},ne=[],re=0,ie={...fm,opacity:1},ae=(e,t,n,r,i)=>{let a=Cm(e.name);if(Sm.has(a))return;if(bm[a]){re++,h(`skip:${a}`,`Skipped ${bm[a]}.`);return}let o=j(e,n);if(o.display===`none`)return;let s=t,c=e.attr(`transform`);if(c){let e=am(c);e?s=$p(s,e):h(`transform`,`An invalid transform "${c}" was ignored.`)}for(let t of[`clip-path`,`mask`,`filter`])(e.attr(t)||(e.attr(`style`)||``).includes(`${t}:`))&&h(t,`${t===`filter`?`Filters`:t===`mask`?`Masks`:`Clip paths`} were ignored.`);if(a===`use`){let t=e.attr(`href`)||e.attr(`xlink:href`)||``,n=t.startsWith(`#`)?v.get(t.slice(1)):null;if(!n){h(`use`,`A <use> pointing to "${t}" was skipped (only references within the file are supported).`);return}if(i.includes(n)||i.length>16){h(`usecycle`,`A <use> that refers to itself was skipped.`);return}if(s=$p(s,[1,0,0,1,ym(e.attr(`x`),E)||0,ym(e.attr(`y`),D)||0]),Cm(n.name)===`symbol`){let t=s,a=im(n.attr(`viewBox`)||``),c=ym(e.attr(`width`),E),l=ym(e.attr(`height`),D);if(a.length===4&&a[2]>0&&a[3]>0&&c>0&&l>0){let e=Math.min(c/a[2],l/a[3]);t=$p(s,[e,0,0,e,(c-a[2]*e)/2-a[0]*e,(l-a[3]*e)/2-a[1]*e])}let u=j(n,o);for(let e of n.children)e.type===`element`&&ae(e,t,u,r+1,[...i,n])}else ae(n,s,o,r+1,[...i,n]);return}if(xm.has(a)){if(a===`svg`&&e!==_&&(s=$p(s,[1,0,0,1,ym(e.attr(`x`),E)||0,ym(e.attr(`y`),D)||0])),a===`switch`){let t=e.children.find(e=>e.type===`element`);t&&ae(t,s,o,r+1,i);return}for(let t of e.children)t.type===`element`&&ae(t,s,o,r+1,i);return}let u=te(e,a);if(!u){[`path`,`rect`,`circle`,`ellipse`,`line`,`polyline`,`polygon`].includes(a)||h(`unknown:${a}`,`Unknown element <${e.name}> was skipped.`);return}if(o.visibility===`hidden`||o.visibility===`collapse`)return;let d=o.opacity,f=M(o.fill,o),p=M(o.stroke,o),m=parseFloat(o[`fill-opacity`]),g=parseFloat(o[`stroke-opacity`]),y=ym(o[`stroke-width`],O);o[`stroke-dasharray`]&&o[`stroke-dasharray`]!==`none`&&p&&h(`dash`,`Dashed strokes were drawn solid.`),ne.push({segs:u,ctm:s,id:e.attr(`id`)||null,fill:f&&a!==`line`?{...f,opacity:f.opacity*(Number.isFinite(m)?m:1)*d}:null,stroke:l&&p&&y>0?{...p,opacity:p.opacity*(Number.isFinite(g)?g:1)*d,width:y}:null,fillRule:o[`fill-rule`]===`evenodd`?`evenodd`:`nonzero`})};ae(_,Qp,ie,0,[]),!l&&ne.some(e=>!e.fill)&&m(`Strokes were not converted (the strokes option is off).`);let oe=1/0,se=1/0,ce=-1/0,le=-1/0;for(let e of ne){let t=e.stroke?e.stroke.width/2*Math.sqrt(Math.abs(tm(e.ctm))):0;for(let n of cm(sm(e.segs,e.ctm)))for(let e=0;e<n.length;e+=2)oe=Math.min(oe,n[e]-t),ce=Math.max(ce,n[e]+t),se=Math.min(se,n[e+1]-t),le=Math.max(le,n[e+1]+t)}let ue=T||(oe<=ce?{x:oe,y:se,w:ce-oe,h:le-se}:{x:0,y:0,w:1,h:1}),de=a/(Math.max(ue.w,ue.h)||1),P=ue.x+ue.w/2,fe=ue.y+ue.h/2,pe=[de,0,0,-de,-P*de,fe*de],me=n.precision??Math.max(0,Math.min(8,Math.ceil(-Math.log10(a*1e-4)))),he=e=>H(e,me),ge=Math.max(0,o*a),_e=ge>0?Math.min(Math.max(0,c*a),ge/2):0,ve=new Map,ye=e=>{let t=je([e.color[0],e.color[1],e.color[2],1]),n=Math.round(Math.max(0,Math.min(1,e.opacity))*100)/100,r=`${t}:${n}`,i=ve.get(r);if(!i){let e=`c${t.slice(1)}${n<1?`-${Math.round(n*100)}`:``}`,a={id:e,color:t,roughness:`0.55`};n<1&&(a.opacity=H(n,2)),i={id:e,el:s(`material`,a)},ve.set(r,i)}return i.id},be=[],xe=0,Se=0,Ce=0,F=ne.filter(e=>e.fill&&e.fill.opacity>0||e.stroke&&e.stroke.opacity>0),we=ge>0?Math.min(ge*.1,ge*2/Math.max(1,F.length)):a*Math.min(.002,.2/Math.max(1,F.length));F.forEach((e,t)=>{let n=$p(pe,e.ctm),r=sm(e.segs,n),i=hr(r,{precision:me,minify:!0}),o=t*we,c=e.id?{name:e.id}:{};if(e.fill&&e.fill.opacity>0){if(cm(r).reduce((e,t)=>e+Math.abs(lm(t)),0)>(a*1e-6)**2){let t={...c,d:i};e.fillRule===`evenodd`&&(t.fillRule=`evenodd`),ge>0&&(t.depth=he(ge),_e>0&&(t.bevel=he(_e))),o&&(t.position=`0,0,${he(o)}`),t.material=ye(e.fill),be.push(s(ge>0?`extrude`:`path`,t)),xe++}else Ce++}if(e.stroke&&e.stroke.opacity>0){let t=e.stroke.width/2*Math.sqrt(Math.abs(tm(e.ctm)))*de;if(t>0){let n={...e.fill?{}:c,d:i,radius:H(t,me+1)};n.position=`0,0,${he(o+ge)}`,n.material=ye(e.stroke),be.push(s(`polyline`,n)),Se++}}}),Ce&&m(`${Ce} filled shape${Ce>1?`s have`:` has`} no area and ${Ce>1?`were`:`was`} skipped.`),be.length||m(`The drawing contains no shapes that could be converted.`);let I=Math.tan(17.5*Math.PI/180),Te=Math.max(ue.h*de/2/I,ue.w*de/2/(I*1.5))*1.1+ge,Ee=[.17,.13,1],De=Math.hypot(...Ee),Oe=s(`es3d`,{version:`1`},s(`title`,{},A),s(`environment`,{background:`#dfe3e8`,sky:`#ffffff`,ground:`#8a8f99`,intensity:`0.65`}),s(`camera`,{position:`${he(Ee[0]/De*Te)},${he(Ee[1]/De*Te)},${he(Ee[2]/De*Te+ge/2)}`,target:`0,0,${he(ge/2)}`,fov:`35`}),s(`light`,{type:`directional`,direction:`-0.35,-0.45,-1`,intensity:`1.3`})),ke=s(`defs`);u&&ke.appendChild(s(`material`,{id:`plate`,color:`#f4f4f4`,roughness:`0.8`}));for(let e of ve.values())ke.appendChild(e.el);if(ke.children.length&&Oe.appendChild(ke),u){let e=Math.max(ge*.5,a*.01);Oe.appendChild(s(`box`,{size:`${he(ue.w*de)},${he(ue.h*de)},${he(e)}`,position:`0,0,${he(-e/2)}`,material:`plate`}))}let Ae=s(`group`,{name:A});for(let e of be)Ae.appendChild(e);return Oe.appendChild(Ae),{text:Pr(new r({root:Oe,syntax:`xml`,leading:[new t(` Converted from ${i.replace(/--/g,`- -`)} by the ES3D converter: ${xe} filled shape${xe===1?``:`s`}, ${Se} stroke${Se===1?``:`s`}. `)]}),{pretty:!0,comments:!0}),warnings:f,stats:{shapes:ne.length,fills:xe,strokes:Se,materials:ve.size,skipped:re}}}function Em(e,t){let n=Math.max(e.max[0]-e.min[0],e.max[1]-e.min[1],e.max[2]-e.min[2]);return!(n>0)||!Number.isFinite(n)?5:Math.max(0,Math.min(9,Math.ceil(-Math.log10(n*t))))}function Dm(e){let t=Ni(e.positions),n=e.vertexCount,r=new Int32Array(n).fill(-1),i=0;for(let e=0;e<n;e++)r[t[e]]<0&&(r[t[e]]=i++);if(i===n)return{positions:e.positions,indices:e.indices};let a=new Float32Array(i*3);for(let i=0;i<n;i++){let n=r[t[i]]*3;a[n]=e.positions[i*3],a[n+1]=e.positions[i*3+1],a[n+2]=e.positions[i*3+2]}let o=new Uint32Array(e.indices.length);for(let n=0;n<o.length;n++)o[n]=r[t[e.indices[n]]];return{positions:a,indices:o}}function Om(e,t,n=`Imported mesh`,{digits:i=`auto`,normals:a=!0,uvs:o=`auto`,smooth:c=30,relative:l=1e-5}={}){let u=i===`auto`?Em(e.bounds,l):i,d=u===null?e=>cr(e):e=>H(e,u),f=gu(e.materials),p=s(`defs`);e.materials.forEach((e,t)=>{let n={id:f[t],color:je([ke(e.baseColor[0]),ke(e.baseColor[1]),ke(e.baseColor[2]),1])};e.metallic&&(n.metallic=H(e.metallic,3)),e.roughness!==.5&&(n.roughness=H(e.roughness,3)),e.opacity<1&&(n.opacity=H(e.opacity,3)),e.alphaMode===`mask`?(n.alphaMode=`mask`,e.alphaCutoff!==.5&&(n.alphaCutoff=H(e.alphaCutoff,3))):e.alphaMode===`blend`&&(n.alphaMode=`blend`);let r=Math.max(...e.emissive);if(r>0){let t=r>1?1/r:1;n.emissive=je([ke(e.emissive[0]*t),ke(e.emissive[1]*t),ke(e.emissive[2]*t),1]),r>1&&(n.emissiveIntensity=H(r,3))}e.doubleSided&&(n.doubleSided=`true`),p.appendChild(s(`material`,n))});let m=new Map;e.geometries.forEach((e,n)=>{let r=t(e,0);if(r.kind!==`triangles`||!r.vertexCount)return;let i=`mesh${n}`;m.set(n,i);let l=o===!0||o===`auto`&&r.uvs.some(e=>e!==0),u=!a&&!l?Dm(r):r,f={id:i,positions:Array.from(u.positions,d).join(` `)};a&&(f.normals=Array.from(r.normals,e=>H(e,2)).join(` `)),l&&(f.uvs=Array.from(r.uvs,e=>H(e,4)).join(` `)),f.indices=Array.from(u.indices).join(` `),!a&&c!==30&&(f.smooth=H(c,2)),p.appendChild(s(`mesh`,f))});let h=s(`es3d`,{version:`1`},s(`title`,{},String(n)),p),g=new Float64Array(16);for(let t=0;t<e.count;t++){let n=m.get(e.geom[t]);if(!n)continue;for(let n=0;n<16;n++)g[n]=e.matrices[t*16+n];let r={ref:n,material:f[e.mat[t]]},i=Bt(g,e=>H(e,6));i&&(r.transform=i),h.appendChild(s(`use`,r))}return Pr(new r({root:h,syntax:`xml`}),{pretty:!0})}var km=new Set([`C`,`S`,`Q`,`T`,`A`]);function Am(e,t,n,r){return e.values.segments||W(t,r,1,n)}function jm(e){if(e.values.d)return{path:e.values.d,fillRule:F(e,`fillRule`)};let t=e.pathTarget;if(t&&t.values&&t.values.d){let n=e.values.fillRule===void 0?F(t,`fillRule`):e.values.fillRule;return{path:t.values.d,fillRule:n}}return null}function Mm(e,t){let n=Ve(e);return ra(Math.hypot(n.maxX-n.minX,n.maxY-n.minY)||1,t)}function Nm(e){return e.some(e=>km.has(e.c))}function Pm(e){return Array.from(e)}function Fm(e){let t=2166136261,n=e=>{t^=Math.round(e*1e6)|0,t=Math.imul(t,16777619)};for(let t of e){for(let e of t.outer)n(e);n(1);for(let e of t.holes){for(let t of e)n(t);n(2)}}return(t>>>0).toString(36)}function Im(e,t){let n=Array(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]*t;return n}function Lm(e,t,n){Nm(e.path.segments)&&n.count++;let r=Ai(Ur(e.path.segments,{tolerance:Mm(e.path.segments,t)}),e.fillRule);return r.regions.length?r.regions.map(e=>({outer:Pm(e.outer.points),holes:e.holes.map(e=>Pm(e.points))})):null}function Rm(e,t,n){let r=e.name;if(r===`box`){if(F(e,`radius`)>0)return null;let t=F(e,`size`);return{solid:{kind:`box`,size:t.slice(),key:`box:${t.join(`x`)}`}}}if(r===`sphere`){let n=F(e,`radius`),r=Am(e,48,8,t);return{solid:{kind:`sphere`,radius:n,segments:r,key:`sphere:${n}:${r}`}}}if(r===`cylinder`||r===`cone`){let n=F(e,`radius`),i=F(e,`height`),a=r===`cone`?0:e.values.radiusTop===void 0?n:e.values.radiusTop,o=F(e,`caps`),s=Am(e,48,8,t);return!(n>0)||!(i>0)?null:a===0?{solid:{kind:`cone`,radius:n,height:i,caps:o,segments:s,key:`cone:${n}:${i}:${o}:${s}`}}:Math.abs(a-n)<1e-12?{solid:{kind:`cylinder`,radius:n,height:i,caps:o,segments:s,key:`cyl:${n}:${i}:${o}:${s}`}}:{solid:{kind:`frustum`,radius:n,radiusTop:a,height:i,caps:o,segments:s,key:`frustum:${n}:${a}:${i}:${o}:${s}`}}}if(r===`capsule`){let n=F(e,`radius`),r=F(e,`height`),i=Am(e,32,8,t);return{solid:{kind:`capsule`,radius:n,height:r,segments:i,key:`capsule:${n}:${r}:${i}`}}}if(r===`plane`){let t=F(e,`size`);return{solid:{kind:`plane`,width:t[0],depth:t[1],key:`plane:${t[0]}x${t[1]}`}}}if(r===`torus`){if(F(e,`arc`)<360-1e-6)return null;let n=F(e,`radius`),r=F(e,`tube`),i=e.values.segments||W(64,t,1,8),a=e.values.tubeSegments||W(24,t,1,6);return{solid:{kind:`torus`,radius:n,tube:r,segments:i,tubeSegments:a,key:`torus:${n}:${r}:${i}:${a}`}}}if(r===`line`&&F(e,`radius`)>0){let n=Am(e,48,8,t);return{solid:{kind:`cylinder`,radius:1,height:1,caps:!0,segments:n,key:`tube:${n}`},unit:!0}}if(r===`extrude`){if(F(e,`bevel`)>0)return null;let r=jm(e);if(!r)return null;let i=Lm(r,t,n);if(!i)return null;let a=F(e,`depth`),o=F(e,`center`);return{solid:{kind:`extrude`,depth:a,center:o,regions:i,key:`extrude:${a}:${o}:${Fm(i)}`}}}if(r===`polygon`){let t=e.values.points;if(!t||t.length<6)return null;let n=[{outer:Pm(t),holes:[]}];return{solid:{kind:`surface`,regions:n,key:`poly:${Fm(n)}`}}}if(r===`path`){let r=jm(e);if(!r)return null;let i=Lm(r,t,n);return i?{solid:{kind:`surface`,regions:i,key:`path:${Fm(i)}`}}:null}if(r===`revolve`){let r=jm(e);if(!r)return null;Nm(r.path.segments)&&n.count++;let i=Ur(r.path.segments,{tolerance:Mm(r.path.segments,t)});if(i.length!==1)return null;let a=i[0].points;for(let e=0;e<a.length;e+=2)if(a[e]<-1e-6)return null;let o=[];for(let e=0;e<a.length;e+=2)o.push(Math.max(0,a[e]),a[e+1]);let s=!!i[0].closed,c=F(e,`angle`),l=e.values.segments||Math.max(3,Math.round(W(48,t,1,8)*Math.min(1,c/360)+ +(c<360)));return{solid:{kind:`revolve`,points:o,closed:s,angle:c,segments:l,doubleSided:c<360-1e-6||!s,key:`revolve:${c}:${l}:${s}:${Fm([{outer:o,holes:[]}])}`}}}if(r===`gear`){if(F(e,`bevel`)>0)return null;let n=F(e,`teeth`),r=F(e,`module`),i=F(e,`pressureAngle`),a=F(e,`depth`),o=F(e,`bore`),s=F(e,`center`),c=[{outer:Im(Pa(n,i,W(8,t,1,2),W(4,t,1,2)).outline.points,r),holes:[]}];if(o>0){let e=Gr(o/r,W(48,t,1,8)),n=e.points.length/2,i=Array(n*2);for(let t=0;t<n;t++){let a=n-1-t;i[t*2]=e.points[a*2]*r,i[t*2+1]=e.points[a*2+1]*r}c[0].holes.push(i)}return{solid:{kind:`extrude`,depth:a,center:s,regions:c,key:`gear:${n}:${r}:${i}:${a}:${o}:${s}:${Fm(c)}`}}}return null}function zm(e,t,n){let r=e.geometry,i=t(r,Math.min(n,r.lods-1));return{solid:{kind:i.kind===`lines`?`lines`:`mesh`,key:`g${r.id}`,positions:i.positions,normals:i.normals,indices:i.indices},unit:!0}}function Bm(e,t){if(!t&&!e)return null;if(!t)return dt(e,1e-12)?null:new Float64Array(e);if(!e||dt(e,1e-12))return dt(t,1e-12)?null:new Float64Array(t);let n=L();return R(n,e,t),dt(n,1e-12)?null:n}function Vm(e,t,n){if(!t.length)return null;let r=n||qm,i=r.material!=null||r.color!=null,a=e&&!dt(e,1e-12)?new Float64Array(e):null;return!a&&t.length===1&&!i?t[0]:{kind:`group`,matrix:a,children:t,own:r}}var Hm={box:`rounded box`,extrude:`bevelled extrusion`,sweep:`sweep`,torus:`partial torus`,polyline:`tube along a path`,revolve:`revolve`,gear:`bevelled gear`,mesh:`authored mesh`,line:`line`,polygon:`polygon`,path:`filled path`};function Um(e,t,{lod:n=0,structure:r=`keep`}={}){let i=Math.max(0,Math.min(3,n|0)),{graph:a,scene:o,doc:s}=e,c=a.materials,l=[],u=new Map,d=(e,t=1)=>u.set(e,(u.get(e)||0)+t),f={count:0},p=0,m=e=>{e.kind===`mesh`?p+=e.indices.length/3:e.kind===`lines`&&(p+=e.indices.length/2)},h=null;if(r===`flatten`){let e=new Map,n=[];for(let r of mu(o)){let a=o.geom[r],s=e.get(a);if(!s){let n=o.geometries[a],r=t(n,Math.min(i,n.lods-1));s={kind:r.kind===`lines`?`lines`:`mesh`,key:`g${n.id}`,positions:r.positions,normals:r.normals,indices:r.indices,doubleSided:!!n.doubleSided},e.set(a,s),m(s)}let l=o.mat[r],u=new Float64Array(16),d=o.matrices,f=r*16;for(let e=0;e<16;e++)u[e]=d[f+e];let p=c.list[l];n.push({kind:`shape`,matrix:dt(u,1e-7)?null:u,solid:s,material:l,inherits:!1,doubleSided:!!(s.doubleSided||p&&p.doubleSided)})}h=n.length===1?n[0]:{kind:`group`,matrix:null,children:n},l.push(`Flattened to the triangles of the glTF and OBJ export at this level of detail, one mesh per geometry.`)}else{let e=new Map,n=(r,a,o)=>{if(!r||r.visible===!1)return r&&r.visible===!1&&d(`hidden`),null;if(r.anims&&r.anims.length&&d(`animated`),r.kind===`light`||r.kind===`camera`)return null;let s=r.scriptLocal||r.local||null,l=a,u=o;r.material!==null&&r.material!==void 0&&(l=r.material,u=null),r.color!==null&&r.color!==void 0&&(u=r.color);let p=(r.material===null||r.material===void 0)&&(r.color===null||r.color===void 0),h=Jm(r);if(r.kind===`lod`){r.children.length>1&&d(`lod`,r.children.length-1);let e=r.children[0]?n(r.children[0],l,u):null;return Vm(s,e?[e]:[],h)}if(r.kind===`repeat`){let e=r.children.map(e=>n(e,l,u)).filter(Boolean);return!e.length||!r.count?null:Vm(s,[{kind:`repeat`,count:r.count,step:new Float64Array(r.step),children:e,own:qm}],h)}if(r.kind===`scatter`){let e=r.children.map(e=>n(e,l,u)).filter(Boolean);if(!e.length||!r.params||!r.params.count)return null;if(r.params.randomMaterial)for(let e of r.params.randomMaterial)c.resolve(e,null);return Vm(s,[{kind:`scatter`,params:r.params,children:e,own:qm}],h)}if(r.kind===`use`){let e=[];if(r.target){let t=n(r.target,l,u);t&&e.push(t)}for(let t of r.children){let r=n(t,l,u);r&&e.push(r)}return Vm(s,e,h)}if(r.kind===`shape`){if(!r.geometry)return null;let n=Rm(r.el,i,f);if(!n){let a=Hm[r.el.name]||r.el.name;e.set(a,(e.get(a)||0)+1),n=zm(r,t,i),m(n.solid)}let a=c.resolve(l,u),o=c.list[a];o&&(o.map||o.normalMap||o.emissiveMap||o.metallicRoughnessMap||o.occlusionMap)&&d(`texture`);let g=n.solid.kind===`plane`||n.solid.kind===`surface`||n.solid.kind===`lines`||n.solid.doubleSided||(n.solid.kind===`cylinder`||n.solid.kind===`cone`||n.solid.kind===`frustum`)&&n.solid.caps===!1;return{kind:`shape`,matrix:n.unit?Bm(s,r.unit):Bm(s,null),meshMatrix:Bm(s,r.unit),entry:r.geometry,solid:n.solid,material:a,own:h,inherits:p,doubleSided:!!(g||r.geometry.doubleSided||o&&o.doubleSided)}}let g=[];for(let e of r.children){let t=n(e,l,u);t&&g.push(t)}return Vm(s,g,h)};h=n(a.root,null,null)||{kind:`group`,matrix:null,children:[]};for(let[t,n]of e)l.push(`${n.toLocaleString(`en-US`)} ${t}${n===1?``:`s`} tessellated: the target has no primitive for ${n===1?`it`:`them`}.`);f.count&&l.push(`${f.count.toLocaleString(`en-US`)} curved outline${f.count===1?``:`s`} flattened to polygons at this level of detail.`)}u.get(`lod`)&&l.push(`${u.get(`lod`).toLocaleString(`en-US`)} level-of-detail alternative${u.get(`lod`)===1?``:`s`} omitted; the most detailed child is written.`),u.get(`animated`)&&l.push(`${u.get(`animated`).toLocaleString(`en-US`)} animated transform${u.get(`animated`)===1?``:`s`} written at the rest pose.`),u.get(`hidden`)&&l.push(`${u.get(`hidden`).toLocaleString(`en-US`)} hidden element${u.get(`hidden`)===1?``:`s`} omitted.`),u.get(`texture`)&&l.push(`${u.get(`texture`).toLocaleString(`en-US`)} material${u.get(`texture`)===1?``:`s`} lost texture maps; the base colour is kept.`);let g=s&&s.root&&F(s.root,`unit`)||`m`,_=new Map;return{structure:r===`flatten`?`flatten`:`keep`,lod:i,unit:g,root:h,materials:c.list,resolve:(e,t)=>c.resolve(e,t),bakedMesh(e){if(!e)return null;let n=_.get(e);if(n)return n;let r=t(e,Math.min(i,e.lods-1));return n={kind:r.kind===`lines`?`lines`:`mesh`,key:`g${e.id}`,positions:r.positions,normals:r.normals,indices:r.indices},_.set(e,n),n},lights:o.lights||[],cameras:o.cameras||[],environment:a.environment,notes:l,meshTriangles:p}}function Wm(e){let t=[],n=L(),r=L();for(let i=0;i<e.count;i++)t.push(new Float64Array(n)),R(r,n,e.step),n.set(r);return t}function Gm(e){let t=e.params,n=So(t.seed),r=(e,t)=>e[0]+(e[1]-e[0])*t,i=t.grid?t.grid[0]:0,a=t.grid?t.grid[1]:0,o=[0,0,0],s=[0,0,0],c=[1,1,1],l=[];for(let e=0;e<t.count;e++){let u=n(),d=n(),f=n(),p=n(),m=n(),h=n(),g=n(),_=n(),v=n();if(o[1]=0,s[0]=s[1]=s[2]=0,c[0]=c[1]=c[2]=1,t.grid){let n=e%i,r=Math.floor(e/i);o[0]=(n-(i-1)/2)*t.spacing[0]+(u-.5)*t.jitter*t.spacing[0],o[2]=(r-(a-1)/2)*t.spacing[1]+(d-.5)*t.jitter*t.spacing[1]}else if(t.radius){let e=t.radius*Math.sqrt(u),n=d*Math.PI*2;o[0]=e*st(n),o[2]=e*ot(n)}else o[0]=(u-.5)*t.area[0],o[2]=(d-.5)*t.area[1];if(t.randomRotation){let e=t.randomRotation.ranges;s[0]=r(e[0],f),s[1]=r(e[1],p),s[2]=r(e[2],m)}if(t.randomScale){let e=t.randomScale.ranges;t.randomScale.uniform?c[0]=c[1]=c[2]=r(e[0],h):(c[0]=r(e[0],h),c[1]=r(e[1],g),c[2]=r(e[2],_))}let y=L();bt(y,o,s,c);let b=null;t.randomMaterial&&t.randomMaterial.length&&(b=t.randomMaterial[Math.min(t.randomMaterial.length-1,Math.floor(v*t.randomMaterial.length))]),l.push({matrix:y,material:b})}return l}function Km(e,t,n,r){let i=t,a=n,o=e.own||qm;return o.material!=null&&(i=o.material,a=null),o.color!=null&&(a=o.color),e.kind===`shape`?{...e,material:r(i,a)}:e.children?{...e,children:e.children.map(e=>Km(e,i,a,r))}:e}var qm={material:null,color:null};function Jm(e){return{material:e.material==null?null:e.material,color:e.color==null?null:e.color}}function Ym(e){let t=[],n=[],r=[];for(let i of e){let e=ji({outer:{points:Float64Array.from(i.outer),smooth:new Uint8Array(i.outer.length/2)},holes:i.holes.map(e=>({points:Float64Array.from(e),smooth:new Uint8Array(e.length/2)}))});if(!e||!e.indices)continue;let a=t.length/3,o=e.positions;for(let e=0;e<o.length;e+=2)t.push(o[e],o[e+1],0),n.push(0,0,1);for(let t=0;t<e.indices.length;t++)r.push(a+e.indices[t])}return{positions:Float32Array.from(t),normals:Float32Array.from(n),indices:Uint32Array.from(r)}}var Xm=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function X(e){return yu(Number.isFinite(e)?e:0,6)}function Zm(e,t=12){let n=[];for(let r=0;r<e.length;r++)r&&n.push(r%t===0?`
|
|
422
|
+
`:` `),n.push(X(e[r]));return n.join(``)}function Qm(e){if(!e||dt(e,1e-9))return{translation:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1],identity:!0,plain:!0,scaleOnly:!0};let t=Ot(e,1e-6);if(!t)return null;let n=t.translation,r=t.rotation,i=t.scale,a=Math.hypot(r[0],r[1],r[2])<1e-8&&i.every(e=>Math.abs(e-1)<1e-8),o=Math.hypot(r[0],r[1],r[2])<1e-8,s=i.every(e=>Math.abs(e-1)<1e-8),c=n.every(e=>Math.abs(e)<1e-8);return{translation:n,rotation:r,scale:i,identity:a&&c,plain:a,scaleOnly:o,rotationOnly:c&&s,noRot:o,noScale:s,noTrans:c}}function $m(e){let t=e[0],n=e[1],r=e[2],i=e[3];i<0&&(t=-t,n=-n,r=-r,i=-i);let a=2*Math.acos(Math.min(1,Math.max(-1,i))),o=Math.sin(a/2);return Math.abs(o)<1e-8||a<1e-8?{axis:[0,1,0],angle:0}:{axis:[t/o,n/o,r/o],angle:a}}function eh(e){let t=e||Xm,n=[];for(let e=0;e<4;e++)n.push([t[e],t[e+4],t[e+8],t[e+12]]);return n}function th(e){let t=e||Xm,n=[];for(let e=0;e<4;e++)n.push([t[e*4],t[e*4+1],t[e*4+2],t[e*4+3]]);return n}var nh={m:1,cm:.01,mm:.001,km:1e3,in:.0254,ft:.3048};function rh(e){return nh[e]??1}var ih={material:null,color:null},ah={cm:`Centimeters`,mm:`Millimeters`,km:`Kilometers`,in:`Inches`,ft:`Feet`};function oh(e){return e?`TRUE`:`FALSE`}function sh(e,t,n){return t===n?``:` ${e} ${t}`}function ch(e){return`${X(e[0])} ${X(e[1])} ${X(e[2])}`}function lh(e,t,n,r){let i=e.length/3,a=t=>[e[t*3],e[t*3+1],e[t*3+2]],o=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],s=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],c=e=>{let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]},l=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],u=i-1,d=r===u?0:r,f=c(d===0?o(a(1),a(u-1)):o(a(d+1),a(d-1))),p;if(p=d===0?s(o(a(1),a(0)),o(a(u-1),a(0))):s(o(a(d+1),a(d)),o(a(d-1),a(d))),p=c(p),d>0){let t=lh._z(e,d-1);l(p,t)<0&&(p=[-p[0],-p[1],-p[2]])}lh._cache=lh._cache||new Map;let m=c(s(f,p)),h=a(d);return[h[0]+t*m[0]+n*p[0],h[1]+t*m[1]+n*p[1],h[2]+t*m[2]+n*p[2]]}lh._z=function e(t,n){let r=t.length/3,i=e=>[t[e*3],t[e*3+1],t[e*3+2]],a=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],o=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],s=e=>{let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]},c=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],l=r-1,u=n===l?0:n,d=u===0?o(a(i(1),i(0)),a(i(l-1),i(0))):o(a(i(u+1),i(u)),a(i(u-1),i(u)));return d=s(d),u>0&&c(d,e(t,u-1))<0&&(d=[-d[0],-d[1],-d[2]]),d};function uh(e,t){let n=Math.max(3,t|0),r=[];for(let t=0;t<=n;t++){let i=t%n/n*Math.PI*2;r.push(e*Math.cos(i),0,-e*Math.sin(i))}return r}function dh(e,t){let n=Math.max(3,t|0),r=[];for(let t=0;t<=n;t++){let i=t%n/n*Math.PI*2;r.push(e*Math.cos(i),e*Math.sin(i))}return r}function fh(e){let t=e.slice();return t.length>=2&&(t[0]!==t[t.length-2]||t[1]!==t[t.length-1])&&t.push(t[0],t[1]),t}function ph(e,t){let n=t,r=L();if(!xt(r,n))return e;let i=e.positions,a=e.normals,o=new Float32Array(i.length),s=a?new Float32Array(a.length):null;for(let e=0;e<i.length;e+=3){let t=i[e],c=i[e+1],l=i[e+2];if(o[e]=n[0]*t+n[4]*c+n[8]*l+n[12],o[e+1]=n[1]*t+n[5]*c+n[9]*l+n[13],o[e+2]=n[2]*t+n[6]*c+n[10]*l+n[14],s){let t=a[e],n=a[e+1],i=a[e+2],o=r[0]*t+r[1]*n+r[2]*i,c=r[4]*t+r[5]*n+r[6]*i,l=r[8]*t+r[9]*n+r[10]*i,u=Math.hypot(o,c,l)||1;s[e]=o/u,s[e+1]=c/u,s[e+2]=l/u}}return{kind:e.kind,key:`${e.key}:baked`,positions:o,normals:s,indices:e.indices}}function mh(e){let t=e.notes.slice(),n=new Map,r=(e,t=1)=>n.set(e,(n.get(e)||0)+t),i=new Map,a=new Map,o=0,s=e=>`${e}${o++}`,c=0,l=t=>{let n=a.get(t);if(n)return`USE ${n}`;let r=s(`A`);a.set(t,r);let i=e.materials[t],o=i.baseColor;if(i.unlit)return`DEF ${r} Appearance { material UnlitMaterial { emissiveColor ${ch(o.map(e=>Math.min(1,Math.max(0,e))))} } }`;let l=i.emissive.map(e=>((e>1||e<0)&&c++,Math.min(1,Math.max(0,e)))),u=[`baseColor ${ch(o)}`,`metallic ${X(i.metallic)}`,`roughness ${X(i.roughness)}`];return i.opacity<.999&&u.push(`transparency ${X(1-i.opacity)}`),l.some(e=>e>1e-6)&&u.push(`emissiveColor ${ch(l)}`),`DEF ${r} Appearance { material PhysicalMaterial { ${u.join(` `)} } }`},u=(e,t)=>{let n=i.get(e);if(n)return`USE ${n}`;let r=s(`G`);return i.set(e,r),`DEF ${r} ${t}`},d=(e,t)=>{let n=!t;if(e.kind===`lines`){let t=[];for(let n=0;n<e.indices.length;n+=2)t.push(e.indices[n],e.indices[n+1],-1);return`IndexedLineSet { coord Coordinate { point [ ${Zm(e.positions)} ] } coordIndex [ ${Zm(t,16)} ] }`}let r=[];for(let t=0;t<e.indices.length;t+=3)r.push(e.indices[t],e.indices[t+1],e.indices[t+2],-1);let i=e.normals?` normal Normal { vector [ ${Zm(e.normals)} ] }`:``;return`IndexedFaceSet {${sh(`solid`,oh(n),`TRUE`)} coord Coordinate { point [ ${Zm(e.positions)} ] }${i} coordIndex [ ${Zm(r,16)} ] }`},f=(e,t)=>{let n=`${e.key}:${+!!t}`;if(e.kind===`box`){let r=e.size;return u(n,`Box {${sh(`size`,`${X(r[0])} ${X(r[1])} ${X(r[2])}`,`2 2 2`)}${sh(`solid`,oh(!t),`TRUE`)} }`)}if(e.kind===`sphere`)return u(n,`Sphere {${sh(`radius`,X(e.radius),`1`)}${sh(`solid`,oh(!t),`TRUE`)} }`);if(e.kind===`cylinder`){let r=e.caps!==!1;return u(n,`Cylinder {${sh(`radius`,X(e.radius),`1`)}${sh(`height`,X(e.height),`2`)}${sh(`top`,oh(r),`TRUE`)}${sh(`bottom`,oh(r),`TRUE`)}${sh(`solid`,oh(r&&!t),`TRUE`)} }`)}if(e.kind===`cone`){let r=e.caps!==!1;return u(n,`Cone {${sh(`bottomRadius`,X(e.radius),`1`)}${sh(`height`,X(e.height),`2`)}${sh(`bottom`,oh(r),`TRUE`)}${sh(`solid`,oh(r&&!t),`TRUE`)} }`)}let i=e=>{let t=e.scale?` scale [ ${e.scale} ]`:``;return`Extrusion {${sh(`solid`,oh(e.solid),`TRUE`)} creaseAngle 0.8${sh(`beginCap`,oh(e.begin),`TRUE`)}${sh(`endCap`,oh(e.end),`TRUE`)} crossSection [ ${Zm(e.cross)} ] spine [ ${Zm(e.spine,9)} ]${t} }`};if(e.kind===`frustum`){let r=dh(1,e.segments),a=e.height,o=e.caps!==!1;return u(n,i({solid:o&&!t,begin:o,end:o,cross:r,spine:[0,-a/2,0,0,a/2,0],scale:`${X(e.radius)} ${X(e.radius)} ${X(e.radiusTop)} ${X(e.radiusTop)}`}))}if(e.kind===`torus`)return r(`torus`),u(n,i({solid:!0,begin:!1,end:!1,cross:dh(e.tube,e.tubeSegments),spine:uh(e.radius,e.segments)}));if(e.kind===`revolve`){r(`revolve`);let a=[];for(let t=0;t<e.points.length;t+=2)a.push(e.points[t]-1,e.points[t+1]);let o=e.closed?fh(a):a,s=e.angle>=360-1e-6,c=Math.max(3,e.segments|0),l=[];for(let t=0;t<=c;t++){let n=Math.min(e.angle,360)*Math.PI/180*(s?t%c/c:t/c);l.push(Math.cos(n),0,-Math.sin(n))}let d=!s&&e.closed;return u(n,i({solid:!t,begin:d,end:d,cross:o,spine:l}))}if(e.kind===`extrude`){if(e.regions.length!==1||e.regions[0].holes.length>0)return null;r(`extrude`);let t=e.regions[0].outer,a=[];for(let e=0;e<t.length;e+=2)a.push(t[e],-t[e+1]);return u(n,i({solid:!0,begin:!0,end:!0,cross:fh(a),spine:[0,0,0,0,e.depth,0]}))}if(e.kind===`plane`){r(`plane`);let t=e.width,i=e.depth,a={kind:`mesh`,positions:[-t/2,0,i/2,t/2,0,i/2,t/2,0,-i/2,-t/2,0,-i/2],normals:[0,1,0,0,1,0,0,1,0,0,1,0],indices:[0,1,2,0,2,3]};return u(n,d(a,!0))}return null},p=(e,t)=>u(`${e.key}:${+!!t}`,d(e,t)),m=e=>{if(!e)return``;let t=Qm(e);if(!t||t.identity)return t?``:null;let n=[];if(t.noTrans||n.push(`translation ${X(t.translation[0])} ${X(t.translation[1])} ${X(t.translation[2])}`),!t.noRot){let e=$m(t.rotation);n.push(`rotation ${X(e.axis[0])} ${X(e.axis[1])} ${X(e.axis[2])} ${X(e.angle)}`)}return t.noScale||n.push(`scale ${X(t.scale[0])} ${X(t.scale[1])} ${X(t.scale[2])}`),n.join(` `)},h=[],g=(t,n)=>{if(!t)return;let i=` `.repeat(n);if(t.kind===`repeat`){r(`repeat`,t.count);for(let e of Wm(t))g({kind:`group`,matrix:e,children:t.children,own:t.own},n)}else if(t.kind===`scatter`){r(`scatter`,t.params.count);for(let r of Gm(t)){let i=r.material?t.children.map(t=>Km(t,r.material,null,e.resolve)):t.children;g({kind:`group`,matrix:r.matrix,children:i,own:t.own},n)}}else if(t.kind===`group`){let e=m(t.matrix);if(e===null){r(`shear`);for(let e of t.children)g(_(e,t.matrix),n);return}let a=h.length;for(let e of t.children)g(e,n+1);let o=h.splice(a);if(!o.length)return;if(!e){h.push(...o.map(e=>e.startsWith(` `)?e.slice(2):e));return}h.push(`${i}Transform { ${e} children [`),h.push(...o),h.push(`${i}] }`)}else v(t,n)},_=(t,n)=>{let r=t.matrix||null,i=L();if(r?R(i,n,r):i.set(n),t.kind===`shape`){let i=L(),a=t.solid.kind===`mesh`||t.solid.kind===`lines`?r:t.meshMatrix||r;a?R(i,n,a):i.set(n);let o=t.solid.kind===`mesh`||t.solid.kind===`lines`?t.solid:e.bakedMesh(t.entry);return{...t,matrix:null,meshMatrix:null,solid:ph(o,i)}}return t.kind===`repeat`?{kind:`group`,matrix:null,children:Wm(t).map(e=>{let n=L();return R(n,i,e),{kind:`group`,matrix:null,children:t.children.map(e=>_(e,n)),own:ih}}),own:t.own}:t.kind===`scatter`?{kind:`group`,matrix:null,children:Gm(t).map(n=>{let r=L();return R(r,i,n.matrix),{kind:`group`,matrix:null,children:(n.material?t.children.map(t=>Km(t,n.material,null,e.resolve)):t.children).map(e=>_(e,r)),own:ih}}),own:t.own}:{kind:`group`,matrix:null,children:(t.children||[]).map(e=>_(e,i)),own:t.own}},v=(t,n)=>{let i=` `.repeat(n),a=t,o=m(a.matrix);if(o===null){r(`shear`);let t=ph(a.solid.kind===`mesh`||a.solid.kind===`lines`?a.solid:e.bakedMesh(a.entry),a.solid.kind===`mesh`||a.solid.kind===`lines`?a.matrix:a.meshMatrix);a={...a,matrix:null,solid:t},o=``}let s=l(a.material),c=f(a.solid,a.doubleSided),u=a.matrix;if(a.solid.kind===`capsule`)r(`capsule`),c=b(a,s);else if(a.solid.kind===`extrude`&&c){if(u=y(u,a.solid),o=m(u),o===null&&u){r(`shear`);let t=ph(e.bakedMesh(a.entry),a.meshMatrix||u);c=p(t,a.doubleSided),o=``}}else if(!c){let t=a.solid.kind===`mesh`||a.solid.kind===`lines`?a.solid:e.bakedMesh(a.entry);if(c=p(t,a.doubleSided),a.solid.kind!==`mesh`&&a.solid.kind!==`lines`&&(u=a.meshMatrix),o=m(u),o===null&&u){let e=ph(t,u);c=p(e,a.doubleSided),o=``}}else if(o=m(u),o===null&&u){r(`shear`);let t=ph(e.bakedMesh(a.entry),a.meshMatrix||u);c=p(t,a.doubleSided),o=``}let d=a.solid.kind===`capsule`?c:`Shape { geometry ${c} appearance ${s} }`;o?h.push(`${i}Transform { ${o} children [ ${d} ] }`):h.push(`${i}${d}`)};function y(e,t){let n=L();if(_t(n,90,0,0),t.center){let e=L();e[14]=-t.depth/2;let r=L();R(r,e,n),n.set(r)}if(!e)return n;let r=L();return R(r,e,n),r}let b=(e,t)=>{let n=e.solid.radius,r=e.solid.height,i=r-2*n;if(i<=1e-6)return`Shape { geometry ${u(`sphere:${n}`,`Sphere { radius ${X(n)} }`)} appearance ${t} }`;let a=r/2-n,o=u(`capcyl:${n}:${i}`,`Cylinder { radius ${X(n)} height ${X(i)} top FALSE bottom FALSE solid FALSE }`),s=u(`sphere:${n}`,`Sphere { radius ${X(n)} }`);return`Group { children [
|
|
423
|
+
Shape { geometry ${o} appearance ${t} }
|
|
424
|
+
Transform { translation 0 ${X(a)} 0 children [ Shape { geometry ${s} appearance ${t} } ] }
|
|
425
|
+
Transform { translation 0 ${X(-a)} 0 children [ Shape { geometry ${s} appearance ${t} } ] }
|
|
426
|
+
] }`};g(e.root,1);for(let t of e.lights){let e=hh(t,r);e&&h.push(` ${e}`)}for(let t of e.cameras)h.push(` `+gh(t,r));if(e.environment&&e.environment.explicit){let t=e.environment.sky||e.environment.background;h.push(` Background { skyColor [ ${ch(t)} ] }`)}c&&t.push(`${c.toLocaleString(`en-US`)} emissive colour${c===1?``:`s`} clamped to 0..1 (X3D emissiveColor).`);let x=(e,r)=>{n.get(e)&&t.push(r(n.get(e)))};x(`capsule`,e=>`${e.toLocaleString(`en-US`)} capsule${e===1?``:`s`} written as an open cylinder and two spheres (X3D has no capsule).`),x(`torus`,e=>`${e.toLocaleString(`en-US`)} torus${e===1?``:`es`} written as Extrusion (X3D has no torus).`),x(`revolve`,e=>`${e.toLocaleString(`en-US`)} revolve${e===1?``:`s`} written as Extrusion along a circular spine.`),x(`extrude`,e=>`${e.toLocaleString(`en-US`)} extrusion${e===1?``:`s`} written as Extrusion; a +90° rotation about X turns the spine from Y onto Z.`),x(`plane`,e=>`${e.toLocaleString(`en-US`)} plane${e===1?``:`s`} written as two triangles (X3D has no plane primitive).`),x(`repeat`,e=>`${e.toLocaleString(`en-US`)} repeated copies expanded into transforms (X3D has no repeat node); the geometry is shared.`),x(`scatter`,e=>`${e.toLocaleString(`en-US`)} scattered copies expanded into transforms (X3D has no scatter node); the geometry is shared.`),x(`shear`,e=>`${e.toLocaleString(`en-US`)} sheared transform${e===1?``:`s`} baked into vertices (an X3D Transform is translation, rotation and scale).`),x(`ambient`,e=>`${e.toLocaleString(`en-US`)} ambient or hemisphere light${e===1?``:`s`} omitted (X3D has no such light).`),x(`range`,e=>`${e.toLocaleString(`en-US`)} unlimited point or spot light${e===1?``:`s`} given a radius of 1000000 (X3D lights cut off at their radius).`);let S=[`#X3D V4.0 utf8`,`PROFILE Immersive`,`COMPONENT Shape:2`];e.unit!==`m`&&S.push(`UNIT length ${ah[e.unit]||`Unit`} ${X(rh(e.unit))}`);let C=h.join(`
|
|
427
|
+
`);return{text:`${S.join(`
|
|
428
|
+
`)}\nGroup {\n children [\n${C}\n ]\n}\n`,notes:t}}function hh(e,t){let n=Math.max(e.color[0],e.color[1],e.color[2],1e-8),r=e.color.map(e=>e/n),i=X(n),a=ch(r);if(e.type===`ambient`||e.type===`hemisphere`)return t(`ambient`),``;if(e.type===`directional`){let t=e.direction;return`DirectionalLight { direction ${X(t[0])} ${X(t[1])} ${X(t[2])} color ${a} intensity ${i} global TRUE }`}let o=e.position,s=e.range;if(s>0||(s=1e6,t(`range`)),e.type===`spot`){let t=e.direction,n=Math.acos(Math.min(1,Math.max(-1,e.outer))),r=Math.acos(Math.min(1,Math.max(-1,e.inner)));return`SpotLight { location ${X(o[0])} ${X(o[1])} ${X(o[2])} direction ${X(t[0])} ${X(t[1])} ${X(t[2])} cutOffAngle ${X(n)} beamWidth ${X(r)} radius ${X(s)} color ${a} intensity ${i} }`}return`PointLight { location ${X(o[0])} ${X(o[1])} ${X(o[2])} radius ${X(s)} color ${a} intensity ${i} }`}function gh(e,t){let n=e.position,r=$m(_h(n,e.target,e.up)),i=`${X(r.axis[0])} ${X(r.axis[1])} ${X(r.axis[2])} ${X(r.angle)}`,a=`${X(n[0])} ${X(n[1])} ${X(n[2])}`;if(e.type===`orthographic`){let t=e.height/2,n=t*(e.aspect||1);return`OrthoViewpoint { position ${a} orientation ${i} fieldOfView [ ${X(-n)} ${X(-t)} ${X(n)} ${X(t)} ] }`}return e.aspect&&Math.abs(e.aspect-1)>1e-6&&t(`aspect`),`Viewpoint { position ${a} orientation ${i} fieldOfView ${X((e.fov||45)*Math.PI/180)} }`}function _h(e,t,n){let r=[t[0]-e[0],t[1]-e[1],t[2]-e[2]],i=Math.hypot(...r)||1;r[0]/=i,r[1]/=i,r[2]/=i;let a=[-r[0],-r[1],-r[2]],o=[n[1]*a[2]-n[2]*a[1],n[2]*a[0]-n[0]*a[2],n[0]*a[1]-n[1]*a[0]],s=Math.hypot(...o);s<1e-8?o=[1,0,0]:(o[0]/=s,o[1]/=s,o[2]/=s);let c=[a[1]*o[2]-a[2]*o[1],a[2]*o[0]-a[0]*o[2],a[0]*o[1]-a[1]*o[0]],l=L();return l.set([o[0],o[1],o[2],0,c[0],c[1],c[2],0,a[0],a[1],a[2],0,0,0,0,1]),kt(l)}var vh=/^\s*#X3D[^\n]*\n?/;function yh(e){let t=[],n=String(e).replace(/^\uFEFF/,``);if(/^\s*<\?xml|^\s*<X3D[\s>]/i.test(n))return Gh(n,t);let r=bh(n.replace(vh,``)),i=new Map,a=0,o=[];for(;a<r.length;){if(r[a].t===`word`&&(r[a].v===`PROFILE`||r[a].v===`COMPONENT`||r[a].v===`UNIT`||r[a].v===`META`)){a=xh(r,a);continue}if(r[a].t===`word`&&r[a].v===`ROUTE`){t.push(`A ROUTE was ignored.`),a=xh(r,a);continue}let e=Sh(r,a,i);if(!e)break;o.push(e.node),a=e.i}Nh.materials=[];let s=o.map(e=>Dh(e,t,i)).filter(Boolean),c=Nh.materials;return Nh.materials=[],{text:`<es3d version="1">\n${c.join(`
|
|
429
|
+
`)}${c.length?`
|
|
430
|
+
`:``}${s.join(`
|
|
431
|
+
`)}\n</es3d>\n`,notes:t}}function bh(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(r===`#`){for(;n<e.length&&e[n]!==`
|
|
432
|
+
`;)n++;continue}if(r===` `||r===`
|
|
433
|
+
`||r===`\r`||r===` `||r===`,`){n++;continue}if(r===`{`||r===`}`||r===`[`||r===`]`){t.push({t:r,v:r}),n++;continue}if(r===`"`){let r=n+1,i=``;for(;r<e.length&&e[r]!==`"`;)e[r]===`\\`?(i+=e[r+1]||``,r+=2):i+=e[r++];t.push({t:`string`,v:i}),n=r+1;continue}let i=n;for(;i<e.length&&!/[\s,{}[\]"#]/.test(e[i]);)i++;let a=e.slice(n,i);/^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/.test(a)?t.push({t:`num`,v:Number(a)}):t.push({t:`word`,v:a}),n=i}return t}function xh(e,t){let n=e[t]&&e[t].v;if(t++,n===`PROFILE`||n===`COMPONENT`||n===`META`||n===`UNIT`||n===`ROUTE`)for(;t<e.length;){let n=e[t],r=e[t+1];if(n.t===`word`&&(n.v===`PROFILE`||n.v===`COMPONENT`||n.v===`UNIT`||n.v===`META`||n.v===`DEF`||n.v===`ROUTE`||r&&r.t===`{`))break;t++}return t}function Sh(e,t,n){if(t>=e.length||e[t].t!==`word`)return null;let r=null;if(e[t].v===`DEF`)r=e[t+1]&&e[t+1].v,t+=2;else if(e[t].v===`USE`)return{node:{use:e[t+1]&&e[t+1].v},i:t+2};if(!e[t]||e[t].t!==`word`)return null;let i=e[t].v;if(t++,!e[t]||e[t].t!==`{`)return{node:{name:i,fields:{},def:r},i:t};t++;let a={};for(;t<e.length&&e[t].t!==`}`;){if(e[t].t!==`word`){t++;continue}let r=e[t++].v;if(wh[r]&&e[t]&&e[t].t===`num`){let n=Th(e,t,wh[r]||void 0);a[r]=wh[r]===1?n.list[0]:n.list,t=n.i;continue}let i=Ch(e,t,n);a[r]=i.v,t=i.i}e[t]&&e[t].t===`}`&&t++;let o={name:i,fields:a,def:r};return r&&n.set(r,o),{node:o,i:t}}function Ch(e,t,n){let r=e[t];if(!r||r.t===`{`)return{v:null,i:t};if(r.t===`[`){t++;let r=[];for(;t<e.length&&e[t].t!==`]`;)if(e[t].t===`word`&&e[t+1]&&e[t+1].t===`{`){let i=Sh(e,t,n);if(!i)break;r.push(i.node),t=i.i}else if(e[t].t===`word`&&(e[t].v===`DEF`||e[t].v===`USE`)){let i=Sh(e,t,n);if(!i)break;r.push(i.node),t=i.i}else e[t].t===`num`||e[t].t===`word`||e[t].t===`string`?r.push(e[t++].v):t++;return e[t]&&e[t].t===`]`&&t++,{v:r,i:t}}if(r.t===`word`&&(r.v===`DEF`||r.v===`USE`||e[t+1]&&e[t+1].t===`{`)){let r=Sh(e,t,n);return{v:r?r.node:null,i:r?r.i:t+1}}return r.t===`num`||r.t===`word`||r.t===`string`?{v:r.v,i:t+1}:{v:null,i:t+1}}var wh={translation:3,rotation:4,scale:3,size:3,center:3,point:0,baseColor:3,emissiveColor:3,diffuseColor:3,color:3,location:3,direction:3,position:3};function Th(e,t,n){let r=[],i=n||1e9;for(;r.length<i&&e[t]&&e[t].t===`num`;)r.push(e[t++].v);return{list:r,i:t}}function Eh(e,t){return typeof e==`number`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`number`).slice(0,t):null}function Dh(e,t,n){if(!e)return``;if(e.use)return`<use ref="${Wh(e.use)}"/>`;let r=e.fields||{},i=e.def?` id="${Wh(e.def)}"`:``,a=Oh(r.children);if(e.name===`Transform`||e.name===`Group`||e.name===`Anchor`||e.name===`Collision`||e.name===`Switch`||e.name===`Billboard`)return e.name!==`Transform`&&e.name!==`Group`&&t.push(`<${e.name}> was written as a group.`),`<group${i}${jh(r)}>\n${a.map(e=>Dh(e,t,n)).filter(Boolean).join(`
|
|
434
|
+
`)}\n</group>`;if(e.name===`Shape`){let e=r.geometry&&r.geometry.use&&n?n.get(r.geometry.use):null,a=r.geometry&&r.geometry.name?r.geometry:e&&e.name?e:null,o=Nh(r.appearance,t);return a?Ph(a,i,o,t):``}return kh(e.name)?Ph(e,i,``,t):e.name===`DirectionalLight`||e.name===`PointLight`||e.name===`SpotLight`?Hh(e,i):e.name===`Viewpoint`||e.name===`OrthoViewpoint`?Uh(e,i,t):(e.name===`WorldInfo`||e.name===`Background`||e.name===`NavigationInfo`||t.push(`${e.name} was omitted.`),``)}function Oh(e){return e?Array.isArray(e)?e.filter(e=>e&&e.name):e.name?[e]:[]:[]}function kh(e){return e===`Box`||e===`Sphere`||e===`Cylinder`||e===`Cone`||e===`Extrusion`||e===`IndexedFaceSet`||e===`IndexedLineSet`}function Ah(e){let t=(e,t)=>{let n=Eh(Array.isArray(e)?e:null,t);return n&&n.length>=t?n:null},n=t(e.translation,3),r=t(e.scale,3),i=t(e.rotation,4);if(!n&&!r&&!i)return null;let a=L(),o=r||[1,1,1];a[0]=o[0],a[5]=o[1],a[10]=o[2];let s=L();if(i){let e=Mh(i[0],i[1],i[2],i[3]);yt(s,e[0],e[1],e[2],e[3])}let c=L(),l=n||[0,0,0];c[12]=l[0],c[13]=l[1],c[14]=l[2];let u=L();R(u,s,a);let d=L();return R(d,c,u),d}function jh(e){let t=Ah(e);if(!t)return``;let n=Bt(t,e=>X(e));return n?` transform="${n}"`:``}function Mh(e,t,n,r){let i=Math.hypot(e,t,n)||1,a=r/2,o=Math.sin(a);return[e/i*o,t/i*o,n/i*o,Math.cos(a)]}function Nh(e,t){if(!e||!e.fields)return``;let n=e.fields.material;if(!n||!n.fields)return``;let r=n.fields;n.name===`Material`&&t.push(`A Phong Material was read as a colour (X3D Material is not the glTF model).`);let i=n.name===`PhysicalMaterial`,a=Eh(r.baseColor||r.diffuseColor||r.emissiveColor,3);if(!a){if(!i&&n.name!==`UnlitMaterial`)return``;a=[1,1,1]}let o=`color="${Me(a.slice(0,3).map(e=>ke(e)))}"`,s=typeof r.metallic==`number`?r.metallic:+!!i,c=typeof r.roughness==`number`?r.roughness:i?1:.5,l=typeof r.transparency==`number`?1-r.transparency:1;if(Math.abs(s)<1e-6&&Math.abs(c-.5)<1e-6&&l>.999)return` ${o}`;let u=`m${Nh.materials.length}`,d=[o];return Math.abs(s)>=1e-6&&d.push(`metallic="${X(s)}"`),Math.abs(c-.5)>=1e-6&&d.push(`roughness="${X(c)}"`),l<=.999&&d.push(`opacity="${X(l)}"`),Nh.materials.push(`<material id="${u}" ${d.join(` `)}/>`),` material="${u}"`}Nh.materials=[];function Ph(e,t,n,r){let i=e.fields||{};if(e.name===`Box`){let e=Eh(i.size,3)||[2,2,2];return`<box${t}${n} size="${X(e[0])} ${X(e[1])} ${X(e[2])}"/>`}if(e.name===`Sphere`)return`<sphere${t}${n} radius="${X(typeof i.radius==`number`?i.radius:1)}"/>`;if(e.name===`Cylinder`){let e=typeof i.radius==`number`?i.radius:1,r=typeof i.height==`number`?i.height:2,a=i.top!==`FALSE`&&i.bottom!==`FALSE`;return`<cylinder${t}${n} radius="${X(e)}" height="${X(r)}"${a?``:` caps="false"`}/>`}if(e.name===`Cone`){let e=typeof i.bottomRadius==`number`?i.bottomRadius:1,r=typeof i.height==`number`?i.height:2,a=i.bottom!==`FALSE`;return`<cone${t}${n} radius="${X(e)}" height="${X(r)}"${a?``:` caps="false"`}/>`}return e.name===`Extrusion`?Fh(e,t,n,r):e.name===`IndexedFaceSet`||e.name===`IndexedLineSet`?Bh(e,t,n,r):(r.push(`${e.name} was omitted.`),``)}function Fh(e,t,n,r){let i=e.fields||{},a=Eh(i.crossSection,1e9)||[],o=Eh(i.spine,1e9)||[];if(a.length<4||o.length<6)return r.push(`An Extrusion had no cross section to import.`),``;let s=Ih(a,o,Eh(i.scale,1e9),i.beginCap!==`FALSE`,i.endCap!==`FALSE`);return r.push(`An Extrusion was imported as a mesh.`),`<mesh${t}${n} positions="${s.positions.map(e=>X(e)).join(` `)}" indices="${s.indices.join(` `)}"/>`}function Ih(e,t,n,r,i){let a=[];for(let t=0;t+1<e.length;t+=2)a.push([e[t],e[t+1]]);a.length>1&&Math.hypot(a[0][0]-a[a.length-1][0],a[0][1]-a[a.length-1][1])<1e-8&&a.pop();let o=[];for(let e=0;e+2<t.length;e+=3)o.push([t[e],t[e+1],t[e+2]]);let s=o.length>2&&Math.hypot(o[0][0]-o[o.length-1][0],o[0][1]-o[o.length-1][1],o[0][2]-o[o.length-1][2])<1e-6,c=o.every(e=>Math.abs(e[0])<1e-6&&Math.abs(e[2])<1e-6),l=s?o.length-1:o.length,u=e=>!n||n.length<2?[1,1]:n.length>=o.length*2?[n[e*2],n[e*2+1]]:[n[0],n[1]],d=(e,n,r)=>{let i=u(e),a=n*i[0],l=r*i[1],d=o[e];return c?[d[0]+a,d[1],d[2]+l]:s?lh(t,a,l,e):Lh(o,a,l,e)},f=[],p=[];for(let e=0;e<l;e++){let t=[];for(let[n,r]of a){let i=d(e,n,r);t.push(f.length/3),f.push(i[0],i[1],i[2])}p.push(t)}let m=0;for(let e=0;e<a.length;e++){let t=a[e],n=a[(e+1)%a.length];m+=t[0]*n[1]-n[0]*t[1]}let h=m>0,g=[],_=s?p.length:p.length-1;for(let e=0;e<_;e++){let t=p[e],n=p[s?(e+1)%p.length:e+1];for(let e=0;e<t.length;e++){let r=(e+1)%t.length;h?g.push(t[e],n[e],n[r],t[e],n[r],t[r]):g.push(t[e],t[r],n[r],t[e],n[r],n[e])}}let v=(e,t)=>{for(let n=1;n<e.length-1;n++)g.push(e[0],...t?[e[n+1],e[n]]:[e[n],e[n+1]])};return!s&&r&&v(p[0],!h),!s&&i&&v(p[p.length-1],h),{positions:f,indices:g}}function Lh(e,t,n,r){let i=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],a=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],o=e=>{let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]},s=r<=0?o(i(e[1],e[0])):r>=e.length-1?o(i(e[e.length-1],e[e.length-2])):o(i(e[r+1],e[r-1])),c=o(a(s,Math.abs(s[1])<.9?[0,1,0]:[1,0,0])),l=o(a(c,s)),u=e[r];return[u[0]+t*c[0]+n*l[0],u[1]+t*c[1]+n*l[1],u[2]+t*c[2]+n*l[2]]}function Rh(e,t){let n=[],r=[],i=()=>{if(r.length>=3)for(let e=1;e<r.length-1;e++)t?n.push(r[0],r[e],r[e+1]):n.push(r[0],r[e+1],r[e]);r=[]};for(let t of e)t<0?i():r.push(t);return r.length&&i(),n}function zh(e,t){let n=[],r=[],i=()=>{if(r.length>=2){let t=[];for(let n of r){let r=n*3;r+2<e.length&&t.push(e[r],e[r+1],e[r+2])}t.length>=6&&n.push(t)}r=[]};for(let e of t)e<0?i():r.push(e);return r.length&&i(),n}function Bh(e,t,n,r){let i=e.fields||{},a=i.coord&&i.coord.fields?Eh(i.coord.fields.point,1e9):Eh(i.point,1e9),o=Eh(i.coordIndex,1e9)||[];return Vh(e.name,a,o,i.ccw!==`FALSE`,t,n,r)}function Vh(e,t,n,r,i,a,o){if(!t||t.length<3)return o.push(`An ${e} had no coordinates.`),``;if(e===`IndexedLineSet`){let e=zh(t,n);if(!e.length)return o.push(`An IndexedLineSet had no lines.`),``;o.push(`An IndexedLineSet was imported as polylines.`);let r=(e,t)=>`<polyline${t?i:``}${a} points="${e.map(e=>X(e)).join(` `)}"/>`;return e.length===1?r(e[0],!0):`<group${i}>\n${e.map(e=>r(e,!1)).join(`
|
|
435
|
+
`)}\n</group>`}let s=Rh(n,r);return o.push(`An IndexedFaceSet was imported as a mesh.`),`<mesh${i}${a} positions="${t.map(e=>X(e)).join(` `)}" indices="${s.join(` `)}"/>`}function Hh(e,t){let n=e.fields||{},r=e.name===`DirectionalLight`?`directional`:e.name===`SpotLight`?`spot`:`point`,i=Eh(n.color,3),a=Eh(n.location,3),o=Eh(n.direction,3),s=[`type="${r}"`];return i&&s.push(`color="${Me(i.slice(0,3).map(e=>ke(e)))}"`),typeof n.intensity==`number`&&n.intensity!==1&&s.push(`intensity="${X(n.intensity)}"`),a&&s.push(`position="${a.map(X).join(` `)}"`),o&&s.push(`direction="${o.map(X).join(` `)}"`),`<light${t} ${s.join(` `)}/>`}function Uh(e,t,n){let r=Eh((e.fields||{}).position,3)||[0,0,10];return n.push(`A viewpoint was imported as a camera looking along its orientation.`),`<camera${t} position="${r.map(X).join(` `)}"/>`}function Wh(e){return String(e).replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`)}function Gh(e,t){t.push(`XML X3D was read with the same node subset as Classic VRML.`);let n=Kh(e),r=n.find(e=>e.name.toLowerCase()===`x3d`)||{name:`X3D`,children:n};return{text:`<es3d version="1">\n${(((r.children||[]).find(e=>e.name.toLowerCase()===`scene`)||r).children||[]).map(e=>Yh(e,t)).filter(Boolean).join(`
|
|
436
|
+
`)}\n</es3d>\n`,notes:t}}function Kh(e){let t=[],n=[{children:t}],r=/<!--[\s\S]*?-->|<(\/?)([A-Za-z0-9:_-]+)([^>]*?)(\/?)>/g,i;for(;i=r.exec(e);){if(i[0].startsWith(`<!--`))continue;let e=i[1]===`/`,t=i[2],r=i[4]===`/`;if(e){n.length>1&&n.pop();continue}let a={name:t,attrs:qh(i[3]),children:[]};n[n.length-1].children.push(a),r||n.push(a)}return t}function qh(e){let t={},n=/([A-Za-z0-9:_-]+)\s*=\s*"([^"]*)"|([A-Za-z0-9:_-]+)\s*=\s*'([^']*)'/g,r;for(;r=n.exec(e);)t[r[1]||r[3]]=r[2]===void 0?r[4]:r[2];return t}function Jh(e){return e?e.trim().split(/[\s,]+/).filter(Boolean).map(Number).filter(e=>Number.isFinite(e)):[]}function Yh(e,t){let n=e.name,r=e.attrs||{},i=r.DEF?` id="${Wh(r.DEF)}"`:``;if(r.USE)return`<use ref="${Wh(r.USE)}"/>`;if(n===`Transform`||n===`Group`)return`<group${i}${jh({translation:Jh(r.translation),rotation:Jh(r.rotation),scale:Jh(r.scale)})}>\n${(e.children||[]).map(e=>Yh(e,t)).filter(Boolean).join(`
|
|
437
|
+
`)}\n</group>`;if(n===`Shape`){let n=(e.children||[]).find(e=>e.name===`Box`||e.name===`Sphere`||e.name===`Cylinder`||e.name===`Cone`||e.name!==`Appearance`&&kh(e.name)),r=(e.children||[]).find(e=>e.name===`Appearance`),a=r?Xh(r,t):``;return n?Yh({...n,attrs:{...n.attrs,__style:a,__id:i}},t):(e.children||[]).map(e=>Yh(e,t)).filter(Boolean).join(`
|
|
438
|
+
`)}let a=r.__style||``,o=r.__id||i;if(n===`Box`){let e=Jh(r.size);return`<box${o}${a} size="${(e.length>=3?e:[2,2,2]).slice(0,3).map(X).join(` `)}"/>`}if(n===`Sphere`)return`<sphere${o}${a} radius="${X(r.radius===void 0?1:Number(r.radius))}"/>`;if(n===`Cylinder`){let e=r.top!==`false`&&r.bottom!==`false`;return`<cylinder${o}${a} radius="${X(r.radius===void 0?1:Number(r.radius))}" height="${X(r.height===void 0?2:Number(r.height))}"${e?``:` caps="false"`}/>`}if(n===`Cone`){let e=r.bottom!==`false`;return`<cone${o}${a} radius="${X(r.bottomRadius===void 0?1:Number(r.bottomRadius))}" height="${X(r.height===void 0?2:Number(r.height))}"${e?``:` caps="false"`}/>`}if(n===`Extrusion`){let e=Jh(r.crossSection),n=Jh(r.spine);if(e.length<4||n.length<6)return t.push(`An Extrusion had no cross section to import.`),``;let i=e=>e!==`false`&&e!==`FALSE`,s=Ih(e,n,Jh(r.scale),i(r.beginCap),i(r.endCap));return t.push(`An Extrusion was imported as a mesh.`),`<mesh${o}${a} positions="${s.positions.map(e=>X(e)).join(` `)}" indices="${s.indices.join(` `)}"/>`}if(n===`IndexedFaceSet`||n===`IndexedLineSet`){let i=(e.children||[]).find(e=>e.name===`Coordinate`),s=Jh(i&&i.attrs&&i.attrs.point||r.point),c=r.ccw!==`false`&&r.ccw!==`FALSE`;return Vh(n,s,Jh(r.coordIndex),c,o,a,t)}if(n===`DirectionalLight`||n===`PointLight`||n===`SpotLight`){let e={},t=Jh(r.color),i=Jh(r.location),a=Jh(r.direction);return t.length>=3&&(e.color=t),i.length>=3&&(e.location=i),a.length>=3&&(e.direction=a),r.intensity!==void 0&&r.intensity!==``&&(e.intensity=Number(r.intensity)),Hh({name:n,fields:e},o)}if(n===`Viewpoint`||n===`OrthoViewpoint`){let e=Jh(r.position);return Uh({fields:{position:e.length>=3?e:void 0}},o,t)}return n===`Scene`||n===`X3D`?(e.children||[]).map(e=>Yh(e,t)).filter(Boolean).join(`
|
|
439
|
+
`):``}function Xh(e,t){let n=(e.children||[]).find(e=>e.name===`PhysicalMaterial`||e.name===`Material`||e.name===`UnlitMaterial`);if(!n)return``;n.name===`Material`&&t.push(`A Phong Material was read as a colour (X3D Material is not the glTF model).`);let r=n.attrs||{},i=Jh(r.baseColor||r.diffuseColor||r.emissiveColor);return i.length<3?``:` color="${Me(i.slice(0,3).map(e=>ke(e)))}"`}function Zh(e){return`(${X(e[0])}, ${X(e[1])}, ${X(e[2])})`}function Qh(e,t){return`[${Zh(e)}, ${Zh(t)}]`}function $h(e){let t=[];for(let n=0;n<e.length;n+=3)t.push(Zh([e[n],e[n+1],e[n+2]]));return t.join(`, `)}function eg(e){return`(${th(e).map(e=>`(${e.map(X).join(`, `)})`).join(`, `)})`}function tg(e,t){if(!e)return``;let n=Qm(e);if(!n)return`${t}matrix4d xformOp:transform = ${eg(e)}\n${t}uniform token[] xformOpOrder = ["xformOp:transform"]\n`;if(n.identity)return``;let r=[],i=``;return n.noTrans||(r.push(`"xformOp:translate"`),i+=`${t}double3 xformOp:translate = ${Zh(n.translation)}\n`),n.noRot?(n.noScale||(r.push(`"xformOp:scale"`),i+=`${t}float3 xformOp:scale = ${Zh(n.scale)}\n`),r.length?`${i}${t}uniform token[] xformOpOrder = [${r.join(`, `)}]\n`:``):`${t}matrix4d xformOp:transform = ${eg(e)}\n${t}uniform token[] xformOpOrder = ["xformOp:transform"]\n`}function ng(e){let t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let r=0;r<e.length;r+=3)for(let i=0;i<3;i++){let a=e[r+i];a<t[i]&&(t[i]=a),a>n[i]&&(n[i]=a)}return Qh(t,n)}function rg(e){let t=e.notes.slice(),n=new Map,r=(e,t=1)=>n.set(e,(n.get(e)||0)+t),i=new Map,a=e=>{if(e){e.kind===`shape`&&i.set(e.solid.key,(i.get(e.solid.key)||0)+1);for(let t of e.children||[])a(t)}};a(e.root);let o=[],s=new Map,c=0,l=e=>`${e}${c++}`,u=new Map,d=[],f=0,p=t=>{if(u.has(t))return u.get(t);let n=l(`M`);u.set(t,n);let r=e.materials[t];r.unlit&&f++;let i=r.baseColor,a=r.emissive,o=a.some(e=>e>1e-6)?`\n color3f inputs:emissiveColor = ${Zh(a)}`:``;return d.push(` def Material "${n}" {
|
|
440
|
+
token outputs:surface.connect = </World/Materials/${n}/Surface.outputs:surface>
|
|
441
|
+
def Shader "Surface" {
|
|
442
|
+
uniform token info:id = "UsdPreviewSurface"
|
|
443
|
+
color3f inputs:diffuseColor = ${Zh(i)}
|
|
444
|
+
float inputs:metallic = ${X(r.metallic)}
|
|
445
|
+
float inputs:roughness = ${X(r.roughness)}
|
|
446
|
+
float inputs:opacity = ${X(r.opacity)}${o}
|
|
447
|
+
token outputs:surface
|
|
448
|
+
}
|
|
449
|
+
}`),n},m=t=>{let n=t.solid;if(n.kind===`box`){let e=n.size;if(Math.abs(e[0]-e[1])<1e-9&&Math.abs(e[1]-e[2])<1e-9){let t=e[0]/2;return{type:`Cube`,body:`double size = ${X(e[0])}\nfloat3[] extent = ${Qh([-t,-t,-t],[t,t,t])}\n`,local:null}}return{type:`Cube`,body:`double size = 1\nfloat3[] extent = ${Qh([-.5,-.5,-.5],[.5,.5,.5])}\n`,local:ig(e)}}if(n.kind===`sphere`){let e=n.radius;return{type:`Sphere`,body:`double radius = ${X(e)}\nfloat3[] extent = ${Qh([-e,-e,-e],[e,e,e])}\n`,local:null}}if(n.kind===`cylinder`){let e=n.radius,t=n.height;return{type:`Cylinder`,body:`uniform token axis = "Y"\ndouble radius = ${X(e)}\ndouble height = ${X(t)}\nfloat3[] extent = ${Qh([-e,-t/2,-e],[e,t/2,e])}\n`,local:null}}if(n.kind===`cone`){let e=n.radius,t=n.height;return{type:`Cone`,body:`uniform token axis = "Y"\ndouble radius = ${X(e)}\ndouble height = ${X(t)}\nfloat3[] extent = ${Qh([-e,-t/2,-e],[e,t/2,e])}\n`,local:null}}if(n.kind===`capsule`){let e=n.radius,t=n.height,r=t-2*e;return r<=1e-6?{type:`Sphere`,body:`double radius = ${X(e)}\nfloat3[] extent = ${Qh([-e,-e,-e],[e,e,e])}\n`,local:null}:{type:`Capsule`,body:`uniform token axis = "Y"\ndouble radius = ${X(e)}\ndouble height = ${X(r)}\nfloat3[] extent = ${Qh([-e,-t/2,-e],[e,t/2,e])}\n`,local:null,note:`capsule`}}if(n.kind===`plane`){let e=n.width,t=n.depth;return{type:`Plane`,body:`uniform token axis = "Y"\ndouble width = ${X(e)}\ndouble length = ${X(t)}\nfloat3[] extent = ${Qh([-e/2,0,-t/2],[e/2,0,t/2])}\n`,local:null}}return n.kind===`frustum`||n.kind===`torus`||n.kind===`extrude`||n.kind===`revolve`||n.kind===`surface`?{type:`Mesh`,body:sg(e.bakedMesh(t.entry),t.doubleSided),local:null,matrix:t.meshMatrix,note:n.kind}:n.kind===`mesh`||n.kind===`lines`?{type:n.kind===`lines`?`BasisCurves`:`Mesh`,body:sg(n,t.doubleSided),local:null,matrix:null,note:null}:{type:`Mesh`,body:sg(e.bakedMesh(t.entry),t.doubleSided),local:null,matrix:t.meshMatrix,note:n.kind}},h=e=>{let t=e.solid.key;if(s.has(t))return s.get(t);let n=l(`G`);s.set(t,n);let r=m(e),i=r.local;return o.push(` def ${r.type} "${n}" {\n${og(r.body,12)}${i?og(tg(i,``),12):``} }`),n},g=(e,t,n)=>{let a=t.solid.key,o=m(t);o.note&&r(o.note);let s=`rel material:binding = </World/Materials/${p(t.material)}>\n`,c=o.matrix||n;if((i.get(a)||0)>1)return` def "${e}" (\n prepend references = </World/Prototypes/${h(t)}>\n ) {\n token visibility = "inherited"\n${og(tg(c,``),12)}${og(s,12)} }`;let l=o.matrix?c:ag(n,o.local);return` def ${o.type} "${e}" {\n${og(o.body,12)}${og(tg(l,``),12)}${og(s,12)} }`},_=[],v=e=>{if(e){if(e.kind===`group`){let t=l(`X`),n=_.length;for(let t of e.children)v(t);let r=_.splice(n);if(!r.length&&!e.matrix)return;_.push(` def Xform "${t}" {\n${og(tg(e.matrix,``),12)}${r.map(e=>og(e,4)).join(`
|
|
450
|
+
`)}\n }`)}else e.kind===`repeat`||e.kind===`scatter`?_.push(y(e)):_.push(g(l(`S`),e,e.matrix))}},y=n=>{let i=n.kind===`repeat`?Wm(n).map(e=>({matrix:e,material:null})):Gm(n);r(n.kind,i.length);let a=[],s=[],c=[],u=[],d=[],f=0,p=[];i.forEach(e=>{if(Qm(e.matrix))d.push(e);else{f++;let t=cg(n);t&&p.push(g(l(`S`),t,e.matrix))}});let m=new Map;d.forEach((e,t)=>{let n=e.material||``;m.has(n)||m.set(n,[]),m.get(n).push(t)});let h=[];for(let[t,r]of m){let i=t?n.children.map(n=>Km(n,t,null,e.resolve)):n.children,a=l(`P`),s=_.length;for(let e of i)v(e);let c=_.splice(s);o.push(` def Xform "${a}" {\n${c.map(e=>og(e,4)).join(`
|
|
451
|
+
`)}\n }`),h.push({pid:a,groupIndices:r})}let y=Array(d.length),b=0;for(let e of h){for(let t of e.groupIndices)y[t]=b;b++}return d.forEach((e,t)=>{let n=Qm(e.matrix);a.push(Zh(n.translation));let r=n.rotation;s.push(`(${X(r[3])}, ${X(r[0])}, ${X(r[1])}, ${X(r[2])})`),c.push(Zh(n.scale)),u.push(y[t])}),f&&t.push(`${f.toLocaleString(`en-US`)} instanced cop${f===1?`y was`:`ies were`} written as its own prim because the transform shears.`),` def PointInstancer "${l(`I`)}" {\n rel prototypes = [${h.map(e=>`</World/Prototypes/${e.pid}>`).join(`, `)}]\n int[] protoIndices = [${u.join(`, `)}]\n point3f[] positions = [${a.join(`, `)}]\n quatf[] orientations = [${s.join(`, `)}]\n float3[] scales = [${c.join(`, `)}]\n${tg(n.matrix,` `)} }${p.length?`
|
|
452
|
+
`+p.join(`
|
|
453
|
+
`):``}`};v(e.root),f&&t.push(`${f.toLocaleString(`en-US`)} unlit material${f===1?``:`s`} written as a diffuse colour (UsdPreviewSurface has no unlit shader).`);let b=(e,r)=>{n.get(e)&&t.push(r(n.get(e)))};b(`frustum`,e=>`${e.toLocaleString(`en-US`)} frustum${e===1?``:`s`} written as a mesh (USD Cylinder has one radius).`),b(`torus`,e=>`${e.toLocaleString(`en-US`)} torus${e===1?``:`es`} written as a mesh (USD has no torus).`),b(`extrude`,e=>`${e.toLocaleString(`en-US`)} extrusion${e===1?``:`s`} written as a mesh (USD has no extrusion).`),b(`revolve`,e=>`${e.toLocaleString(`en-US`)} revolve${e===1?``:`s`} written as a mesh (USD has no lathe).`),b(`surface`,e=>`${e.toLocaleString(`en-US`)} flat surface${e===1?``:`s`} written as a mesh.`),b(`capsule`,e=>`${e.toLocaleString(`en-US`)} capsule${e===1?``:`s`} written with height excluding the hemispheres, which is the USD convention.`),b(`repeat`,e=>`${e.toLocaleString(`en-US`)} repeated copies written as a PointInstancer.`),b(`scatter`,e=>`${e.toLocaleString(`en-US`)} scattered copies written as a PointInstancer.`),e.lights.length&&t.push(`${e.lights.length.toLocaleString(`en-US`)} light${e.lights.length===1?``:`s`} omitted (this USDA file does not write UsdLux lights).`),e.cameras.length&&t.push(`${e.cameras.length.toLocaleString(`en-US`)} camera${e.cameras.length===1?``:`s`} omitted.`);let x=o.length?` def Xform "Prototypes" {\n token visibility = "invisible"\n${o.join(`
|
|
454
|
+
`)}\n }\n`:``,S=d.length?` def Scope "Materials" {\n${d.join(`
|
|
455
|
+
`)}\n }\n`:``;return{text:`#usda 1.0
|
|
456
|
+
(
|
|
457
|
+
defaultPrim = "World"
|
|
458
|
+
upAxis = "Y"
|
|
459
|
+
metersPerUnit = ${X(rh(e.unit))}
|
|
460
|
+
)
|
|
461
|
+
|
|
462
|
+
def Xform "World" {
|
|
463
|
+
${x}${S}${_.join(`
|
|
464
|
+
`)}
|
|
465
|
+
}
|
|
466
|
+
`,notes:t}}function ig(e){let t=L();return t[0]=e[0],t[5]=e[1],t[10]=e[2],t}function ag(e,t){if(!e)return t||null;if(!t)return e;let n=L();return R(n,e,t),n}function og(e,t){let n=` `.repeat(t);return e.split(`
|
|
467
|
+
`).map(e=>e&&n+e).join(`
|
|
468
|
+
`)}function sg(e,t){if(!e)return`uniform token subdivisionScheme = "none"
|
|
469
|
+
`;if(e.kind===`lines`){let t=[],n=[];for(let r=0;r<e.indices.length;r+=2)t.push(2),n.push(e.indices[r],e.indices[r+1]);return`int[] curveVertexCounts = [${t.join(`, `)}]\npoint3f[] points = [${$h(e.positions)}]\nuniform token type = "linear"\nfloat3[] extent = ${ng(e.positions)}\n`}let n=Array(e.indices.length/3).fill(3),r=e.normals?`normal3f[] normals = [${$h(e.normals)}]\nuniform token normals:interpolation = "vertex"\n`:``,i=t?`uniform bool doubleSided = 1
|
|
470
|
+
`:``;return`int[] faceVertexCounts = [${n.join(`, `)}]\nint[] faceVertexIndices = [${Array.from(e.indices).join(`, `)}]\npoint3f[] points = [${$h(e.positions)}]\n${r}${i}uniform token subdivisionScheme = "none"\nuniform token orientation = "rightHanded"\nfloat3[] extent = ${ng(e.positions)}\n`}function cg(e){if(!e)return null;if(e.kind===`shape`)return e;for(let t of e.children||[]){let e=cg(t);if(e)return e}return null}function lg(e){let t=[],n=String(e).replace(/^\uFEFF/,``);/^\s*#usda\b/.test(n)||t.push(`The file does not start with #usda; it was read as USDA anyway.`);let r=/metersPerUnit\s*=\s*([0-9.eE+-]+)/.exec(n),i=Ag(r?Number(r[1]):1);r||t.push(`metersPerUnit was missing; USD defaults to centimetres, and this file was read as metres.`);let a=fg(n,`Xform`,`World`)||n,o=new Map,s=new Map,c=[],l=[],u=Og(l);for(let e of mg(a))if(e.type===`Xform`&&e.name===`Prototypes`)for(let t of mg(e.body))o.set(t.name,t);else if(e.type===`Scope`&&e.name===`Materials`)for(let t of mg(e.body))t.type===`Material`&&s.set(t.name,Dg(t.body));else c.push(...hg(e,o,s,u,t,null));return{text:`<es3d version="1" unit="${i}">\n${[...l,...c].filter(Boolean).join(`
|
|
471
|
+
`)}\n</es3d>\n`,notes:t}}function ug(e,t){let n=0;for(let r=t;r<e.length;r++)if(e[r]===`{`)n++;else if(e[r]===`}`&&(n--,n===0))return e.slice(t+1,r);return``}var dg=new Set([`Cube`,`Sphere`,`Cylinder`,`Cone`,`Capsule`,`Plane`,`Mesh`]);function fg(e,t,n){let r=RegExp(`def\\s+${t}\\s+"${n}"\\s*(?:\\([^)]*\\))?\\s*\\{`).exec(e);return r?ug(e,e.indexOf(`{`,r.index)):null}function pg(e){let t=``,n=0;for(;n<e.length;){let r=e.indexOf(`def `,n);if(r<0){t+=e.slice(n);break}t+=e.slice(n,r);let i=e.indexOf(`{`,r);if(i<0)break;let a=0,o=i;for(;o<e.length;o++)if(e[o]===`{`)a++;else if(e[o]===`}`&&--a===0)break;n=o+1}return t}function mg(e){let t=[],n=0;for(;n<e.length;){let r=e.indexOf(`def `,n);if(r<0)break;let i=e.slice(n,r);if((i.match(/\{/g)||[]).length!==(i.match(/\}/g)||[]).length){n=r+4;continue}let a=/^def\s+(?:([A-Za-z0-9_]+)\s+)?"([^"]+)"\s*(\([^)]*\))?/.exec(e.slice(r));if(!a){n=r+4;continue}let o=e.indexOf(`{`,r+a[0].length-1);if(o<0)break;let s=ug(e,o);t.push({type:a[1]||``,name:a[2],meta:a[3]||``,body:s}),n=o+s.length+2}return t}function hg(e,t,n,r,i,a,o){let s=pg(e.body),c=ag(a,yg(s)),l=r(s,n)||o||``;if(e.type===`Xform`||e.type===``){let a=/references\s*=\s*<([^>]+)>/.exec(e.meta),o=a?t.get(a[1].split(`/`).pop()):null;if(o)return hg(o,t,n,r,i,c,l);let s=[];for(let a of mg(e.body))s.push(...hg(a,t,n,r,i,c,l));return s}if(e.type===`PointInstancer`)return gg(e,t,n,r,i,c);if(!dg.has(e.type))return e.type!==`Shader`&&e.type!==`Material`&&e.type!==`Scope`&&i.push(`${e.type} ${e.name} was omitted.`),[];let u=_g(e,i,c,l);return u?[u]:[]}function gg(e,t,n,r,i,a){let o=[...e.body.matchAll(/<([^>]+)>/g)].map(e=>e[1].split(`/`).pop()),s=/prototypes\s*=\s*\[([^\]]*)\]/.exec(e.body),c=s?[...s[1].matchAll(/<([^>]+)>/g)].map(e=>e[1].split(`/`).pop()):o,l=Eg(e.body,`protoIndices`),u=Tg(e.body,`positions`),d=Tg(e.body,`orientations`),f=Tg(e.body,`scales`),p=Math.max(l.length,u.length);if(!p||!c.length)return i.push(`PointInstancer ${e.name} had no instances.`),[];let m=[];for(let e=0;e<p;e++){let o=t.get(c[l[e]||0]);if(!o)continue;let s=Sg(u[e]||[0,0,0],d[e]||[1,0,0,0],f[e]||[1,1,1]);m.push(...hg(o,t,n,r,i,ag(a,s)))}return m.length||i.push(`PointInstancer ${e.name} did not resolve its prototypes.`),m}function _g(e,t,n,r){let i=(t,n)=>{let r=RegExp(`(?:double|float)\\s+${t}\\s*=\\s*([0-9.eE+-]+)`).exec(e.body);return r?Number(r[1]):n},a=(/axis\s*=\s*"([XYZ])"/.exec(e.body)||[])[1]||(e.type===`Cylinder`||e.type===`Cone`||e.type===`Capsule`||e.type===`Plane`?`Z`:`Y`),o=e.type===`Cube`?n:ag(n,bg(a));if(e.type===`Cube`){let e=i(`size`,2),t=o?Qm(o):null;return t&&t.scale.every(e=>e>0)?`<box${Cg(xg(t))}${r} size="${X(e*t.scale[0])} ${X(e*t.scale[1])} ${X(e*t.scale[2])}"/>`:`<box${Cg(o)}${r} size="${X(e)} ${X(e)} ${X(e)}"/>`}if(e.type===`Sphere`)return`<sphere${Cg(o)}${r} radius="${X(i(`radius`,1))}"/>`;if(e.type===`Cylinder`)return`<cylinder${Cg(o)}${r} radius="${X(i(`radius`,1))}" height="${X(i(`height`,2))}"/>`;if(e.type===`Cone`)return`<cone${Cg(o)}${r} radius="${X(i(`radius`,1))}" height="${X(i(`height`,2))}"/>`;if(e.type===`Capsule`){let e=i(`radius`,.5),t=i(`height`,1);return`<capsule${Cg(o)}${r} radius="${X(e)}" height="${X(t+2*e)}"/>`}return e.type===`Plane`?`<plane${Cg(o)}${r} size="${X(i(`width`,2))} ${X(i(`length`,2))}"/>`:e.type===`Mesh`?vg(e,t,o,r):``}function vg(e,t,n,r){let i=Tg(e.body,`points`),a=Eg(e.body,`faceVertexCounts`),o=Eg(e.body,`faceVertexIndices`);if(!i.length||!o.length)return t.push(`Mesh ${e.name} had no points.`),``;let s=/orientation\s*=\s*"leftHanded"/.test(e.body),c=[],l=0,u=a.length?a:Array(o.length/3).fill(3);for(let e of u){let t=o.slice(l,l+e);l+=e,s&&t.reverse();for(let e=1;e<t.length-1;e++)c.push(t[0],t[e],t[e+1])}u.some(e=>e!==3)&&t.push(`Mesh ${e.name} had a face that was fanned into triangles.`);let d=i.flatMap(e=>e.slice(0,3).map(e=>X(e))).join(` `);return`<mesh${Cg(n)}${r} positions="${d}" indices="${c.join(` `)}"/>`}function yg(e){let t=e.indexOf(`xformOp:transform`);if(t>=0){let n=e.slice(t).match(/[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?/g);if(n&&n.length>=16){let e=L();for(let t=0;t<16;t++)e[t]=Number(n[t]);return e}}let n=wg(e,`xformOp:translate`),r=wg(e,`xformOp:scale`);if(!n&&!r)return null;let i=L();n&&(i[12]=n[0],i[13]=n[1],i[14]=n[2]);let a=L();return r&&(a[0]=r[0],a[5]=r[1],a[10]=r[2]),ag(n?i:null,r?a:null)}function bg(e){if(e===`Y`)return null;let t=L();return e===`X`?_t(t,0,0,-90):_t(t,90,0,0),t}function xg(e){let t=L();yt(t,e.rotation[0],e.rotation[1],e.rotation[2],e.rotation[3]);let n=L();return n[12]=e.translation[0],n[13]=e.translation[1],n[14]=e.translation[2],ag(n,t)}function Sg(e,t,n){let r=L();r[12]=e[0],r[13]=e[1],r[14]=e[2];let i=L();yt(i,t[1],t[2],t[3],t[0]);let a=L();return a[0]=n[0],a[5]=n[1],a[10]=n[2],ag(r,ag(i,a))}function Cg(e){if(!e)return``;let t=Bt(e,e=>X(e));return t?` transform="${t}"`:``}function wg(e,t){let n=RegExp(`${t}\\s*=\\s*\\(([^)]*)\\)`).exec(e);if(!n)return null;let r=n[1].split(`,`).map(e=>Number(e.trim()));return r.length<3||r.some(e=>!Number.isFinite(e))?null:r}function Tg(e,t){let n=RegExp(`${t}\\s*=\\s*\\[([\\s\\S]*?)\\]`).exec(e);if(!n)return[];let r=[],i=/\(([^)]*)\)/g,a;for(;a=i.exec(n[1]);){let e=a[1].split(`,`).map(e=>Number(e.trim()));e.length&&e.every(e=>Number.isFinite(e))&&r.push(e)}return r}function Eg(e,t){let n=RegExp(`${t}\\s*=\\s*\\[([^\\]]*)\\]`).exec(e);return n?n[1].split(/[\s,]+/).filter(Boolean).map(Number).filter(e=>Number.isFinite(e)):[]}function Dg(e){let t=wg(e,`inputs:diffuseColor`)||[.8,.8,.8],n=(t,n)=>{let r=RegExp(`inputs:${t}\\s*=\\s*([0-9.eE+-]+)`).exec(e);return r?Number(r[1]):n};return{color:t,metallic:n(`metallic`,0),roughness:n(`roughness`,.5),opacity:n(`opacity`,1)}}function Og(e){let t=0;return(n,r)=>{let i=/material:binding\s*=\s*<([^>]+)>/.exec(n);if(!i)return``;let a=r.get(i[1].split(`/`).pop());if(!a)return``;let o=Me(a.color.map(kg));if(a.metallic<1e-6&&Math.abs(a.roughness-.5)<1e-6&&a.opacity>.999)return` color="${o}"`;let s=`m${t++}`,c=[`color="${o}"`];return a.metallic>=1e-6&&c.push(`metallic="${X(a.metallic)}"`),Math.abs(a.roughness-.5)>=1e-6&&c.push(`roughness="${X(a.roughness)}"`),a.opacity<=.999&&c.push(`opacity="${X(a.opacity)}"`),e.push(`<material id="${s}" ${c.join(` `)}/>`),` material="${s}"`}}function kg(e){let t=Math.min(1,Math.max(0,e));return t<=.0031308?12.92*t:1.055*t**(1/2.4)-.055}function Ag(e){for(let[t,n]of[[`m`,1],[`cm`,.01],[`mm`,.001],[`km`,1e3],[`in`,.0254],[`ft`,.3048]])if(Math.abs(e-n)<1e-8)return t;return`m`}function jg(e,t=2){let n=` `.repeat(t);return e.split(`
|
|
472
|
+
`).map(e=>e&&n+e).join(`
|
|
473
|
+
`)}function Mg(e){return`[${e.map(X).join(`, `)}]`}function Ng(e){let t=e.notes.slice(),n=new Map,r=(e,t=1)=>n.set(e,(n.get(e)||0)+t),i=[],a=new Map,o=0,s=(e,t)=>{let n=`${e.key}:${+!!t}`;if(a.has(n))return a.get(n);let r=`g${o++}`;return a.set(n,r),i.push(`module ${r}() {\n${jg(c(e,t))}\n}`),r},c=(e,t)=>{if(e.kind===`box`){let t=e.size;return`cube([${X(t[0])}, ${X(t[1])}, ${X(t[2])}], center=true);`}if(e.kind===`sphere`)return`sphere(r=${X(e.radius)}, $fn=${e.segments});`;if(e.kind===`cylinder`||e.kind===`cone`||e.kind===`frustum`){e.caps===!1&&r(`caps`);let t=(e.kind,e.radius),n=e.kind===`cone`?0:e.radiusTop===void 0?e.radius:e.radiusTop;return`rotate([-90, 0, 0]) cylinder(h=${X(e.height)}, r1=${X(t)}, r2=${X(n)}, center=true, $fn=${e.segments});`}if(e.kind===`capsule`){r(`capsule`);let t=e.radius,n=e.height,i=Math.max(0,n-2*t),a=n/2-t;return`rotate([-90, 0, 0]) {\n cylinder(h=${X(i)}, r=${X(t)}, center=true, $fn=${e.segments});\n translate([0, 0, ${X(a)}]) sphere(r=${X(t)}, $fn=${e.segments});\n translate([0, 0, ${X(-a)}]) sphere(r=${X(t)}, $fn=${e.segments});\n}`}if(e.kind===`plane`)return r(`plane`),`rotate([-90, 0, 0]) square([${X(e.width)}, ${X(e.depth)}], center=true);`;if(e.kind===`torus`)return`rotate([-90, 0, 0]) rotate_extrude($fn=${e.segments}) translate([${X(e.radius)}, 0]) circle(r=${X(e.tube)}, $fn=${e.tubeSegments});`;if(e.kind===`extrude`)return`linear_extrude(height=${X(e.depth)}, center=${e.center?`true`:`false`})\n${jg(Ig(e.regions))}`;if(e.kind===`revolve`){r(`revolve`);let t=[];for(let n=0;n<e.points.length;n+=2)t.push(`[${X(e.points[n])}, ${X(e.points[n+1])}]`);return`rotate([-90, 0, 0]) rotate_extrude(angle=${X(Math.min(e.angle,360))}, $fn=${e.segments}) polygon([${t.join(`, `)}]);`}return e.kind===`surface`?(r(`surface`),Lg(Ym(e.regions))):`// ${e.kind}`},l=t=>{if(!t)return``;if(t.kind===`group`){let e=t.children.map(l).filter(Boolean);return Fg(t.matrix,Pg(e))}if(t.kind===`repeat`)return d(t);if(t.kind===`scatter`)return f(t);let n=t.solid.kind===`mesh`||t.solid.kind===`lines`?u(t.solid):s(t.solid,t.doubleSided),r=e.materials[t.material],i=r.baseColorSrgb,a=`color([${X(i[0])}, ${X(i[1])}, ${X(i[2])}, ${X(r.opacity)}]) ${n}();`;return Fg(t.matrix,a)},u=e=>{let t=e.key;if(a.has(t))return a.get(t);let n=`g${o++}`;return a.set(t,n),e.kind===`lines`?(r(`lines`),i.push(`module ${n}() { /* hairline omitted */ }`),n):(i.push(`module ${n}() {\n${jg(Lg(e))}\n}`),n)},d=e=>{let t=Qm(e.step),n=Pg(e.children.map(l).filter(Boolean));if(t&&t.noRot&&t.noScale){r(`loop`);let i=`for (i = [0:${e.count-1}])\n${jg(`translate(${Mg(t.translation)} * i)\n${jg(n)}`)}`;return Fg(e.matrix,i)}if(t&&t.rotationOnly&&t.noTrans){let i=$m(t.rotation);if(i.angle>1e-8){r(`loop`);let t=`for (i = [0:${e.count-1}])\n${jg(`rotate(a=${X(i.angle*180/Math.PI)} * i, v=${Mg(i.axis)})\n${jg(n)}`)}`;return Fg(e.matrix,t)}}if(t&&t.noRot&&t.noTrans&&t.scale.every(e=>e>0)){r(`loop`);let i=`for (i = [0:${e.count-1}])\n${jg(`scale([pow(${X(t.scale[0])}, i), pow(${X(t.scale[1])}, i), pow(${X(t.scale[2])}, i)])\n${jg(n)}`)}`;return Fg(e.matrix,i)}r(`baked`,e.count);let i=Wm(e).map(e=>Fg(e,n));return Fg(e.matrix,Pg(i))},f=t=>{let n=t.params,i=n.grid&&!(n.jitter>0)&&!n.randomScale&&!n.randomRotation&&!n.randomMaterial,a=Pg(t.children.map(l).filter(Boolean));if(i){r(`grid`);let e=n.grid[0],i=n.grid[1],o=`for (ix = [0:${e-1}], iz = [0:${i-1}])\n${jg(`translate([(${X(n.spacing[0])}) * (ix - ${X((e-1)/2)}), 0, (${X(n.spacing[1])}) * (iz - ${X((i-1)/2)})])\n${jg(a)}`)}`;return Fg(t.matrix,o)}r(`scatter`,n.count);let o=Gm(t).map(n=>{let r=n.material?t.children.map(t=>Km(t,n.material,null,e.resolve)):t.children;return Fg(n.matrix,Pg(r.map(l).filter(Boolean)))});return Fg(t.matrix,Pg(o))},p=l(e.root)||`cube(0);`;return n.get(`caps`)&&t.push(`${n.get(`caps`).toLocaleString(`en-US`)} open cylinder${n.get(`caps`)===1?``:`s`} written closed (OpenSCAD solids have caps).`),n.get(`capsule`)&&t.push(`${n.get(`capsule`).toLocaleString(`en-US`)} capsule${n.get(`capsule`)===1?``:`s`} written as a cylinder and two spheres.`),n.get(`plane`)&&t.push(`${n.get(`plane`).toLocaleString(`en-US`)} plane${n.get(`plane`)===1?``:`s`} written as a 2D square (OpenSCAD has no zero-thickness solid).`),n.get(`surface`)&&t.push(`${n.get(`surface`).toLocaleString(`en-US`)} flat surface${n.get(`surface`)===1?``:`s`} written as a polyhedron.`),n.get(`revolve`)&&t.push(`${n.get(`revolve`).toLocaleString(`en-US`)} revolve${n.get(`revolve`)===1?``:`s`} written with rotate_extrude.`),n.get(`loop`)&&t.push(`${n.get(`loop`).toLocaleString(`en-US`)} repeat${n.get(`loop`)===1?``:`s`} written as a for-loop.`),n.get(`baked`)&&t.push(`${n.get(`baked`).toLocaleString(`en-US`)} repeated copies baked (the step is not a pure translation, rotation or scale).`),n.get(`grid`)&&t.push(`${n.get(`grid`).toLocaleString(`en-US`)} plain grid${n.get(`grid`)===1?``:`s`} written as a for-loop.`),n.get(`scatter`)&&t.push(`${n.get(`scatter`).toLocaleString(`en-US`)} scattered copies baked (OpenSCAD cannot run the mulberry32 placement).`),n.get(`lines`)&&t.push(`${n.get(`lines`).toLocaleString(`en-US`)} hairline${n.get(`lines`)===1?``:`s`} omitted (OpenSCAD has no line primitive).`),e.lights.length&&t.push(`${e.lights.length.toLocaleString(`en-US`)} light${e.lights.length===1?``:`s`} omitted (OpenSCAD describes solids).`),e.cameras.length&&t.push(`${e.cameras.length.toLocaleString(`en-US`)} camera${e.cameras.length===1?``:`s`} omitted.`),{text:`// ES3D scene, OpenSCAD 2021.01 primitives.
|
|
474
|
+
// OpenSCAD is Z-up. rotate([90, 0, 0]) maps ES3D Y-up onto Z-up.
|
|
475
|
+
${i.join(`
|
|
476
|
+
|
|
477
|
+
`)}
|
|
478
|
+
rotate([90, 0, 0])
|
|
479
|
+
${p}
|
|
480
|
+
`,notes:t}}function Pg(e){let t=e.filter(Boolean);return t.length?t.length===1?t[0]:`union() {\n${t.map(e=>jg(e)).join(`
|
|
481
|
+
`)}\n}`:`cube(0);`}function Fg(e,t){if(!e||!t)return t||``;let n=Qm(e);if(!n)return`multmatrix([${eh(e).map(e=>`[${e.map(X).join(`, `)}]`).join(`, `)}])\n${jg(t)}`;if(n.identity)return t;let r=t;if(n.noScale||(r=`scale(${Mg(n.scale)})\n${jg(r)}`),!n.noRot){let e=$m(n.rotation);r=`rotate(a=${X(e.angle*180/Math.PI)}, v=${Mg(e.axis)})\n${jg(r)}`}return n.noTrans||(r=`translate(${Mg(n.translation)})\n${jg(r)}`),r}function Ig(e){let t=[],n=[],r=e=>{let r=[],i=e.length/2;for(let n=0;n<i;n++)r.push(t.length),t.push(`[${X(e[n*2])}, ${X(e[n*2+1])}]`);n.push(`[${r.join(`, `)}]`)};for(let t of e){r(t.outer);for(let e of t.holes)r(e)}return`polygon(points=[${t.join(`, `)}], paths=[${n.join(`, `)}]);`}function Lg(e){let t=[];for(let n=0;n<e.positions.length;n+=3)t.push(`[${X(e.positions[n])}, ${X(e.positions[n+1])}, ${X(e.positions[n+2])}]`);let n=[];for(let t=0;t<e.indices.length;t+=3)n.push(`[${e.indices[t]}, ${e.indices[t+2]}, ${e.indices[t+1]}]`);return`polyhedron(points=[${t.join(`, `)}], faces=[${n.join(`, `)}], convexity=8);`}var Z=Symbol(`undef`),Rg=(()=>{let e=L();return _t(e,90,0,0),e})(),zg=(()=>{let e=L();return _t(e,-90,0,0),e})();function Bg(e,{files:t=[]}={}){let n=new Map,r=(e,t=1)=>n.set(e,(n.get(e)||0)+t),i=new Set,a=new Set,o=new Map;for(let e of t)o.set(Vg(e.name),e);let s=tv(e),c=S_(null);c.vars.set(`$fn`,0),c.vars.set(`$fa`,12),c.vars.set(`$fs`,2),c.vars.set(`PI`,Math.PI);let l=[],u={add:r,missing:i,unknown:a,lib:o,stack:[],only:[],onlySeen:!1};Jg(s.body,c,l,u);let d=u.onlySeen?u.only:l,f=d.filter(e=>e.dim===2).length;f&&r(`flat`,f);let p=[],m=(e,t,r)=>{let i=n.get(e);i&&p.push(`${i.toLocaleString(`en-US`)} ${i===1?t:r}`)};return m(`difference`,`difference was not subtracted; its solids are all in the scene.`,`differences were not subtracted; their solids are all in the scene.`),m(`intersection`,`intersection was not clipped; its solids are all in the scene.`,`intersections were not clipped; their solids are all in the scene.`),m(`hull`,`hull was not computed; the children are in the scene instead.`,`hulls were not computed; the children are in the scene instead.`),m(`minkowski`,`minkowski sum was not computed; the children are in the scene instead.`,`minkowski sums were not computed; the children are in the scene instead.`),m(`offset`,`offset was not applied.`,`offsets were not applied.`),m(`resize`,`resize was not applied.`,`resizes were not applied.`),m(`projection`,`projection was left as the original solid.`,`projections were left as the original solids.`),m(`flat-diff`,`flat difference was written as holes in the first outline, without clipping overlaps.`,`flat differences were written as holes in the first outline, without clipping overlaps.`),m(`twist`,`extrusion dropped a twist or taper.`,`extrusions dropped a twist or taper.`),m(`direction`,`extrusion did not run along +Z; it was given that length along Z.`,`extrusions did not run along +Z; they were given that length along Z.`),m(`sweep`,`rotate_extrude with a negative angle was swept the other way.`,`rotate_extrude calls with a negative angle were swept the other way.`),m(`flat`,`flat shape was imported as a surface.`,`flat shapes were imported as surfaces.`),m(`disabled`,`object was disabled with * or %.`,`objects were disabled with * or %.`),m(`only`,`show-only subtree was kept and the rest of the file was left out.`,`show-only subtrees were kept and the rest of the file was left out.`),m(`text`,`text() was omitted (there is no font).`,`text() calls were omitted (there is no font).`),m(`import-skip`,`import() was omitted (only STL companions are read).`,`import() calls were omitted (only STL companions are read).`),i.size&&p.push(`Missing included file${i.size===1?``:`s`}: ${[...i].join(`, `)}.`),a.size&&p.push(`Unknown module${a.size===1?``:`s`}: ${[...a].join(`, `)}.`),{text:Hg(d.filter(e=>e.dim===3||e.dim===2)),notes:p}}function Vg(e){return String(e).replace(/\\/g,`/`).split(`/`).pop()}function Hg(e){let t=[];for(let n of e){let e=n.dim===2?Ug(n):n;if(!e)continue;let r=Wg(e);t.push({solid:e,matrix:r,color:n.color})}let n=new Map;for(let e of t){let t=JSON.stringify(e.solid.shape);n.set(t,(n.get(t)||0)+1)}let r=new Map,i=0,a=[],o=[];for(let e of t){let t=JSON.stringify(e.solid.shape),s={};e.color&&(s.color=e.color);let c=Bt(e.matrix,e=>X(e));if(c&&(s.transform=c),n.get(t)>1){if(!r.has(t)){let n=`s${i++}`;r.set(t,n),o.push(Gg(e.solid.shape,{id:n}))}s.ref=r.get(t),a.push(Gg(null,s,`use`))}else a.push(Gg(e.solid.shape,s))}let s=[];return o.length&&s.push(`<defs>\n${o.map(e=>` `+e).join(`
|
|
482
|
+
`)}\n</defs>`),s.push(...a),`<es3d version="1">\n${s.map(e=>` `+e).join(`
|
|
483
|
+
`)}\n</es3d>\n`}function Ug(e){if(e.kind===`square`)return{dim:3,matrix:e.matrix,shape:{kind:`plane`,width:e.w,depth:e.h},color:e.color,axis:`y`};let t=g_([e],e.matrix);return t?{dim:3,matrix:e.matrix,shape:{kind:`path`,d:t.d,fillRule:t.evenodd?`evenodd`:``},color:e.color,axis:`z`}:null}function Wg(e){let t=e.axis===`y`?Rg:L();return L_(L_(zg,e.matrix),t)}function Gg(e,t,n){let r={...t};e&&Object.assign(r,Kg(e));let i=Object.entries(r).filter(([,e])=>e!==``&&e!=null).map(([e,t])=>`${e}="${qg(t)}"`).join(` `);return`<${n||e.kind}${i?` `+i:``}/>`}function Kg(e){let t=e=>e?String(e):``;if(e.kind===`box`)return{size:e.size.map(e=>X(e)).join(` `)};if(e.kind===`sphere`)return{radius:X(e.radius),segments:t(e.segments)};if(e.kind===`cylinder`){let n={radius:X(e.radius),height:X(e.height),segments:t(e.segments)};return Math.abs(e.radiusTop-e.radius)>1e-9&&(n.radiusTop=X(e.radiusTop)),n}return e.kind===`cone`?{radius:X(e.radius),height:X(e.height),segments:t(e.segments)}:e.kind===`plane`?{size:`${X(e.width)} ${X(e.depth)}`}:e.kind===`torus`?{radius:X(e.radius),tube:X(e.tube),arc:e.arc<360-1e-6?X(e.arc):``,segments:t(e.segments),tubeSegments:t(e.tubeSegments)}:e.kind===`extrude`?{d:e.d,depth:X(e.depth),center:e.center?`true`:``,fillRule:e.fillRule||``}:e.kind===`revolve`?{d:e.d,angle:e.angle<360-1e-6?X(e.angle):``,segments:t(e.segments),fillRule:e.fillRule||``}:e.kind===`path`?{d:e.d,fillRule:e.fillRule||``}:e.kind===`polygon`?{points:e.points.map(e=>X(e)).join(` `)}:e.kind===`mesh`?{positions:e.positions.map(e=>X(e)).join(` `),indices:e.indices.join(` `)}:{}}function qg(e){return String(e).replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`)}function Jg(e,t,n,r){for(let n of e)n.t===`module`?t.modules.set(n.name,n):n.t===`function`&&t.functions.set(n.name,n);for(let i of e)i.t!==`module`&&i.t!==`function`&&Yg(i,t,n,r)}function Yg(e,t,n,r){e&&(e.t===`block`?Jg(e.body,t,n,r):e.t===`assign`?t.vars.set(e.name,$(e.expr,t,r)):e.t===`module`?t.modules.set(e.name,e):e.t===`function`?t.functions.set(e.name,e):e.t===`include`?p_(e,t,n,r,e.kind===`use`):e.t===`for`?Xg(e,t,n,r):e.t===`let`?Zg(e,t,n,r):e.t===`if`?V_($(e.cond,t,r))?Yg(e.then,t,n,r):e.else&&Yg(e.else,t,n,r):e.t===`call`&&Qg(e,t,n,r))}function Xg(e,t,n,r){let i=e.bindings.map(e=>H_($(e.expr,t,r)));if(i.reduce((e,t)=>e*t.length,1)>1e5)throw Error(`An OpenSCAD for-loop expands past 100000 copies.`);let a=o=>{if(o===i.length){Yg(e.body,t,n,r);return}let s=e.bindings[o].name;for(let e of i[o])t.vars.set(s,e),a(o+1)};a(0)}function Zg(e,t,n,r){let i=C_(t);for(let t of e.bindings)i.vars.set(t.name,$(t.expr,i,r));Yg(e.body,i,n,r)}function Qg(e,t,n,r){if(e.mod===`*`||e.mod===`%`){r.add(`disabled`);return}let i=w_(e.args,t,r),a=T_(e.name,i,t),o=C_(t);for(let[e,t]of Object.entries(a))e.startsWith(`$`)&&o.vars.set(e,t);o.children=m_(e.child);let s=e.mod===`!`?[]:n;$g(e.name,a,e.child,o,s,r),e.mod===`!`&&(r.onlySeen=!0,r.only.push(...s),r.add(`only`))}function $g(e,t,n,r,i,a){let o=e=>{let t=C_(r);return t.matrix=e,t};if(e===`union`||e===`group`||e===`render`){Yg(n,r,i,a);return}if(e===`difference`||e===`intersection`){let t=[];if(Yg(n,r,t,a),e===`difference`&&t.length&&t.every(e=>e.dim===2)){a.add(`flat-diff`);let e=g_(t,r.matrix);e&&i.push({dim:2,kind:`poly`,matrix:r.matrix,loops:e.loops||[],d:e.d,evenodd:!0,color:r.color});return}a.add(e),i.push(...t);return}if(e===`hull`||e===`minkowski`||e===`offset`||e===`resize`||e===`projection`){a.add(e),Yg(n,r,i,a);return}if(e===`translate`){Yg(n,o(L_(r.matrix,I_(...B_(E_(t,`v`,[0,0,0]))))),i,a);return}if(e===`rotate`){Yg(n,o(L_(r.matrix,j_(t))),i,a);return}if(e===`scale`){Yg(n,o(L_(r.matrix,N_(E_(t,`v`,1)))),i,a);return}if(e===`mirror`){Yg(n,o(L_(r.matrix,P_(B_(E_(t,`v`,[0,0,1]))))),i,a);return}if(e===`multmatrix`){Yg(n,o(L_(r.matrix,F_(E_(t,`m`,null)))),i,a);return}if(e===`color`){let e=C_(r);e.color=A_(t)||r.color,Yg(n,e,i,a);return}if(e===`linear_extrude`){c_(t,n,r,i,a);return}if(e===`rotate_extrude`){u_(t,n,r,i,a);return}if(e===`cube`){t_(t,r,i);return}if(e===`sphere`){n_(t,r,i);return}if(e===`cylinder`){r_(t,r,i);return}if(e===`square`){i_(t,r,i);return}if(e===`circle`){a_(t,r,i);return}if(e===`polygon`){o_(t,r,i);return}if(e===`polyhedron`){s_(t,r,i);return}if(e===`text`){a.add(`text`);return}if(e===`import`){d_(t,r,i,a);return}if(e===`echo`||e===`assert`){n&&Yg(n,r,i,a);return}if(e===`children`){f_(t,r,i,a);return}let s=h_(r,e);if(!s){e_.has(e)||a.unknown.add(e);return}if(a.stack.length>64)throw Error(`OpenSCAD module ${e} recurses more than 64 deep.`);a.stack.push(e);let c=C_(r);for(let e of s.params){let n=t[e.name]===void 0?e.def?$(e.def,r,a):Z:t[e.name];c.vars.set(e.name,n)}c.children=m_(n),Yg(s.body,c,i,a),a.stack.pop()}var e_=new Set(`cube.sphere.cylinder.square.circle.polygon.polyhedron.union.difference.intersection.translate.rotate.scale.mirror.multmatrix.color.linear_extrude.rotate_extrude.children.group.render.hull.minkowski.offset.resize.projection.text.import.echo.assert`.split(`.`));function t_(e,t,n){let r=E_(e,`size`,[1,1,1]);if(typeof r==`number`&&(r=[r,r,r]),r=B_(r),r.some(e=>!(e>0)))return;let i=V_(e.center)?t.matrix:L_(t.matrix,I_(r[0]/2,r[1]/2,r[2]/2));n.push({dim:3,matrix:i,shape:{kind:`box`,size:r},color:t.color,axis:`z`})}function n_(e,t,n){let r=D_(e,`d`,`r`),i=r===void 0?1:r;if(!(i>0))return;let a=k_(i,t);n.push({dim:3,matrix:t.matrix,shape:{kind:`sphere`,radius:i,segments:O_(t)?a:0},color:t.color,axis:`z`})}function r_(e,t,n){let r=typeof e.h==`number`&&Number.isFinite(e.h)?e.h:1,i=D_(e,`d`,`r`),a=D_(e,`d1`,`r1`),o=D_(e,`d2`,`r2`),s=1,c=1;if(i!==void 0&&(s=i,c=i),a!==void 0&&(s=a),o!==void 0&&(c=o),!(r>0)||s<0||c<0||s===0&&c===0)return;let l=V_(e.center)?t.matrix:L_(t.matrix,I_(0,0,r/2)),u=O_(t)?k_(Math.max(s,c),t):0;s===0?n.push({dim:3,matrix:L_(l,M_(180,0,0)),shape:{kind:`cone`,radius:c,height:r,segments:u},color:t.color,axis:`y`}):c===0?n.push({dim:3,matrix:l,shape:{kind:`cone`,radius:s,height:r,segments:u},color:t.color,axis:`y`}):n.push({dim:3,matrix:l,shape:{kind:`cylinder`,radius:s,radiusTop:c,height:r,segments:u},color:t.color,axis:`y`})}function i_(e,t,n){let r=E_(e,`size`,[1,1]);typeof r==`number`&&(r=[r,r]);let i=Q(r[0],1),a=Q(r[1],i);if(!(i>0)||!(a>0))return;let o=V_(e.center)?t.matrix:L_(t.matrix,I_(i/2,a/2,0));n.push({dim:2,kind:`square`,w:i,h:a,matrix:o,color:t.color})}function a_(e,t,n){let r=D_(e,`d`,`r`),i=r===void 0?1:r;i>0&&n.push({dim:2,kind:`circle`,r:i,fn:k_(i,t),matrix:t.matrix,color:t.color})}function o_(e,t,n){let r=W_(E_(e,`points`,[])),i=e.paths===void 0?null:W_(e.paths).map(W_),a=[],o=i||[r.map((e,t)=>t)];for(let e of o){let t=[];for(let n of e){let e=r[n|0];Array.isArray(e)&&t.push(Q(e[0],0),Q(e[1],0))}t.length>=6&&a.push(t)}a.length&&n.push({dim:2,kind:`poly`,loops:a,matrix:t.matrix,color:t.color,evenodd:a.length>1})}function s_(e,t,n){let r=W_(E_(e,`points`,[])),i=W_(e.faces===void 0?e.triangles||[]:e.faces),a=[];for(let e of r)a.push(Q(e[0],0),Q(e[1],0),Q(e[2],0));let o=[];for(let e of i){let t=W_(e).map(e=>e|0);if(t.length<3)continue;let n=t.slice().reverse();for(let e=1;e<n.length-1;e++)o.push(n[0],n[e],n[e+1])}o.length<3||n.push({dim:3,matrix:t.matrix,shape:{kind:`mesh`,positions:a,indices:o},color:t.color,axis:`z`})}function c_(e,t,n,r,i){let a=l_(e,i),o=V_(e.center),s=Q(e.twist,0),c=e.scale===void 0||e.scale===Z?1:e.scale,l=typeof c==`number`?Math.abs(c-1)<1e-9:Array.isArray(c)&&c.every(e=>Math.abs(Q(e,1)-1)<1e-9);(Math.abs(s)>1e-9||!l)&&i.add(`twist`);let u=[];Yg(t,n,u,i);let d=u.filter(e=>e.dim===2);if(!d.length||!(a>0))return;if(d.length===1&&d[0].kind===`circle`){let e=__(d[0],n.matrix);if(e){let t=L_(n.matrix,I_(e.x,e.y,o?0:a/2));r.push({dim:3,matrix:t,shape:{kind:`cylinder`,radius:e.r,radiusTop:e.r,height:a,segments:O_(n)?d[0].fn:0},color:n.color,axis:`y`});return}}if(d.length===1&&d[0].kind===`square`){let e=d[0],t=R_(n.matrix,e.matrix);if(b_(t)){let i=z_(t,0,0,0),s=L_(n.matrix,I_(i[0],i[1],o?0:a/2));r.push({dim:3,matrix:s,shape:{kind:`box`,size:[e.w,e.h,a]},color:n.color,axis:`z`});return}}let f=g_(d,n.matrix);f&&r.push({dim:3,matrix:n.matrix,shape:{kind:`extrude`,d:f.d,depth:a,center:o,fillRule:f.evenodd?`evenodd`:``},color:n.color,axis:`z`})}function l_(e,t){let n=Array.isArray(e.v),r=typeof e.height==`number`&&Number.isFinite(e.height),i=n?[Q(e.v[0],0),Q(e.v[1],0),Q(e.v[2],0)]:[0,0,1],a=n?1:100;if(r){a=e.height;let t=Math.hypot(i[0],i[1],i[2]);t>1e-12&&(i=i.map(e=>e/t))}let o=i.map(e=>e*a);return o[2]<0&&(o[2]=0),(Math.abs(o[0])>1e-8||Math.abs(o[1])>1e-8)&&t.add(`direction`),Math.hypot(o[0],o[1],o[2])}function u_(e,t,n,r,i){let a=360,o=180;if(typeof e.angle==`number`&&Number.isFinite(e.angle)&&(a=e.angle,o=0,(a<=-360||a>360)&&(a=360)),typeof e.start==`number`&&Number.isFinite(e.start)&&(o=e.start),a<0&&a>-360&&i.add(`sweep`),a=Math.min(360,Math.abs(a)),a<1e-9)return;let s=a<360-1e-6&&Math.abs(o)>1e-9?L_(n.matrix,M_(0,0,o)):n.matrix,c=[];Yg(t,n,c,i);let l=c.filter(e=>e.dim===2);if(l.length===1&&l[0].kind===`circle`&&a>=360-1e-6){let e=__(l[0],n.matrix);if(e&&Math.abs(e.y)<1e-6&&e.x>e.r){r.push({dim:3,matrix:s,shape:{kind:`torus`,radius:e.x,tube:e.r,arc:360,segments:O_(n)?k_(e.x,n):0,tubeSegments:O_(n)?l[0].fn:0},color:n.color,axis:`y`});return}}let u=g_(l,n.matrix);u&&r.push({dim:3,matrix:s,shape:{kind:`revolve`,d:u.d,angle:a,segments:O_(n)?k_(1,n):0,fillRule:u.evenodd?`evenodd`:``},color:n.color,axis:`y`})}function d_(e,t,n,r){let i=String(E_(e,`file`,``)),a=r.lib.get(Vg(i));if(!a||!/\.stl$/i.test(a.name)){r.add(`import-skip`);return}let o=nd(td(a.bytes).positions);n.push({dim:3,matrix:t.matrix,shape:{kind:`mesh`,positions:Array.from(o.positions),indices:Array.from(o.indices)},color:t.color,axis:`z`})}function f_(e,t,n,r){let i=t.children||[],a=e.index===void 0?e[0]:e.index,o=a===void 0?i.map((e,t)=>t):H_(a);for(let e of o)i[e]&&Yg(i[e],t,n,r)}function p_(e,t,n,r,i){let a=r.lib.get(Vg(e.file));if(!a){r.missing.add(e.file);return}if(r.stack.includes(e.file))return;r.stack.push(e.file);let o=tv(new TextDecoder(`utf-8`).decode(a.bytes));Jg(i?o.body.filter(e=>e.t===`module`||e.t===`function`):o.body,t,n,r),r.stack.pop()}function m_(e){return e?e.t===`block`?e.body:[e]:[]}function h_(e,t){let n=e;for(;n;){if(n.modules.has(t))return n.modules.get(t);n=n.parent}return null}function g_(e,t){let n=[],r=!1;for(let i of e)if(i.evenodd&&(r=!0),i.kind===`circle`){let e=__(i,t);if(!e)continue;n.push(v_(e.x,e.y,e.r))}else if(i.kind===`square`){let e=R_(t,i.matrix),r=i.w/2,a=i.h/2,o=[[-r,-a],[r,-a],[r,a],[-r,a]].map(([t,n])=>z_(e,t,n,0));n.push(y_(o.map(e=>[e[0],e[1]])))}else if(i.kind===`poly`){if(i.d&&x_(i.matrix,t))n.push(i.d);else{let e=R_(t,i.matrix);for(let t of i.loops||[]){let r=[];for(let n=0;n<t.length;n+=2){let i=z_(e,t[n],t[n+1],0);r.push([i[0],i[1]])}n.push(y_(r))}i.evenodd&&(r=!0)}}return n.length?{d:n.join(` `),evenodd:r||n.length>1&&e.length>1,loops:null}:null}function __(e,t){let n=R_(t,e.matrix);if(!b_(n))return null;let r=z_(n,0,0,0),i=z_(n,e.r,0,0),a=z_(n,0,e.r,0),o=Math.hypot(i[0]-r[0],i[1]-r[1]),s=Math.hypot(a[0]-r[0],a[1]-r[1]);return!(o>1e-9)||Math.abs(o-s)>1e-4*o?null:{x:r[0],y:r[1],r:o}}function v_(e,t,n){return`M ${X(e+n)} ${X(t)} A ${X(n)} ${X(n)} 0 1 1 ${X(e-n)} ${X(t)} A ${X(n)} ${X(n)} 0 1 1 ${X(e+n)} ${X(t)} Z`}function y_(e){if(e.length<3)return``;let t=`M ${X(e[0][0])} ${X(e[0][1])}`;for(let n=1;n<e.length;n++)t+=` L ${X(e[n][0])} ${X(e[n][1])}`;return t+` Z`}function b_(e){let t=z_(e,0,0,1),n=z_(e,0,0,0);return Math.abs(t[0]-n[0])<1e-6&&Math.abs(t[1]-n[1])<1e-6&&Math.abs(n[2])<1e-6&&Math.abs(t[2]-n[2]-1)<1e-4||Math.abs(t[2]-n[2])>.5&&Math.abs(n[2])<1e-6&&Math.abs(t[0]-n[0])<1e-6&&Math.abs(t[1]-n[1])<1e-6}function x_(e,t){for(let n=0;n<16;n++)if(Math.abs(e[n]-t[n])>1e-8)return!1;return!0}function S_(e){return{parent:e,vars:new Map,modules:new Map,functions:new Map,matrix:L(),color:null,children:[]}}function C_(e){let t=S_(e);return t.matrix=e.matrix,t.color=e.color,t.children=e.children,t}function w_(e,t,n){let r={},i=[];for(let a of e){let e=$(a.expr,t,n);a.name?r[a.name]=e:i.push(e)}r[`#n`]=i.length;for(let e=0;e<i.length;e++)r[`#`+e]=i[e];return r}function T_(e,t,n){let r={};for(let[e,n]of Object.entries(t))e.startsWith(`#`)||(r[e]=n);let i=iv[e]||(h_(n,e)?h_(n,e).params.map(e=>e.name):null),a=t[`#n`]||0;if(i){let e=0;for(let n=0;n<a;n++){for(;e<i.length&&r[i[e]]!==void 0;)e++;e<i.length&&(r[i[e++]]=t[`#`+n])}}return e===`linear_extrude`&&r.height===void 0&&r.h!==void 0&&(r.height=r.h),e===`rotate_extrude`&&r.angle===void 0&&r.a!==void 0&&(r.angle=r.a),r}function E_(e,t,n){return e[t]!==void 0&&e[t]!==Z?e[t]:n}function D_(e,t,n){if(typeof e[t]==`number`&&Number.isFinite(e[t]))return e[t]/2;if(typeof e[n]==`number`&&Number.isFinite(e[n]))return e[n]}function O_(e){let t=G_(e,`$fn`);return typeof t==`number`&&t>0}function k_(e,t){let n=Q(G_(t,`$fn`),0);if(n>0)return Math.max(3,Math.min(512,Math.round(n)));let r=Q(G_(t,`$fa`),12)||12,i=Q(G_(t,`$fs`),2)||2;return Math.max(5,Math.min(512,Math.ceil(Math.max(Math.min(360/r,Math.abs(e)*2*Math.PI/i),5))))}function A_(e){let t=e.c===void 0?e[`#0`]:e.c,n=e.alpha===void 0?null:Q(e.alpha,1),r=null;return typeof t==`string`?r=De(t):Array.isArray(t)&&(r=[Q(t[0],0),Q(t[1],0),Q(t[2],0),t.length>3?Q(t[3],1):1]),r?(n!=null&&(r[3]=n),Me(r)):null}function j_(e){let t=e.a===void 0?e[`#0`]:e.a,n=e.v;if(Array.isArray(t))return M_(Q(t[0],0),Q(t[1],0),Q(t[2],0));let r=Q(t,0),i=n?B_(n):[0,0,1],a=L(),o=r*Math.PI/180,s=Math.hypot(i[0],i[1],i[2])||1,c=i[0]/s,l=i[1]/s,u=i[2]/s,d=Math.sin(o),f=Math.cos(o),p=1-f;return a[0]=p*c*c+f,a[4]=p*c*l-d*u,a[8]=p*c*u+d*l,a[1]=p*c*l+d*u,a[5]=p*l*l+f,a[9]=p*l*u-d*c,a[2]=p*c*u-d*l,a[6]=p*l*u+d*c,a[10]=p*u*u+f,a}function M_(e,t,n){let r=L();return _t(r,e,t,n),r}function N_(e){let t=typeof e==`number`?[e,e,e]:B_(e,1),n=L();return n[0]=t[0],n[5]=t[1],n[10]=t[2],n}function P_(e){let t=Math.hypot(e[0],e[1],e[2])||1,n=e[0]/t,r=e[1]/t,i=e[2]/t,a=L();return a[0]=1-2*n*n,a[4]=-2*n*r,a[8]=-2*n*i,a[1]=-2*r*n,a[5]=1-2*r*r,a[9]=-2*r*i,a[2]=-2*i*n,a[6]=-2*i*r,a[10]=1-2*i*i,a}function F_(e){let t=W_(e),n=L();for(let e=0;e<4;e++){let r=W_(t[e]||[0,0,0,+(e===3)]);for(let t=0;t<4;t++)n[t*4+e]=Q(r[t],+(e===t))}return n}function I_(e,t,n){let r=L();return r[12]=e,r[13]=t,r[14]=n,r}function L_(e,t){let n=L();return R(n,e,t),n}function R_(e,t){let n=L();return xt(n,e),L_(n,t)}function z_(e,t,n,r){return[e[0]*t+e[4]*n+e[8]*r+e[12],e[1]*t+e[5]*n+e[9]*r+e[13],e[2]*t+e[6]*n+e[10]*r+e[14]]}function B_(e,t=0){return typeof e==`number`?[e,e,e]:Array.isArray(e)?[Q(e[0],t),Q(e[1],t),Q(e[2],t)]:[t,t,t]}function Q(e,t){return typeof e==`number`&&Number.isFinite(e)?e:t}function V_(e){return e===Z||e==null||e===!1?!1:typeof e==`number`?e!==0:Array.isArray(e)||typeof e==`string`?e.length>0:!!e}function H_(e){return e&&e.range?U_(e.start,e.step,e.end):Array.isArray(e)?e:typeof e==`number`?[e]:[]}function U_(e,t,n){if(!Number.isFinite(e)||!Number.isFinite(t)||!Number.isFinite(n)||t===0)return[];let r=Math.floor((n-e)/t+1e-9);if(r<0||r>1e5)return r>1e5?(()=>{throw Error(`An OpenSCAD range is longer than 100000.`)})():[];let i=[];for(let n=0;n<=r;n++)i.push(e+n*t);return i}function W_(e){return e&&e.range?U_(e.start,e.step,e.end):Array.isArray(e)?e:[]}function G_(e,t){let n=e;for(;n;){if(n.vars.has(t))return n.vars.get(t);n=n.parent}return Z}function K_(e,t){let n=e;for(;n;){if(n.functions.has(t))return n.functions.get(t);n=n.parent}return null}var q_={"||":1,"&&":2,"==":3,"!=":3,"<":4,">":4,"<=":4,">=":4,"+":5,"-":5,"*":6,"/":6,"%":6};function $(e,t,n){if(!e)return Z;if(e.t===`num`||e.t===`str`)return e.v;if(e.t===`undef`)return Z;if(e.t===`bool`)return e.v;if(e.t===`id`)return G_(t,e.v);if(e.t===`list`)return e.items.map(e=>$(e,t,n));if(e.t===`range`)return{range:!0,start:Q($(e.start,t,n),0),step:e.step?Q($(e.step,t,n),1):1,end:Q($(e.end,t,n),0)};if(e.t===`unary`){let r=$(e.v,t,n);return e.op===`!`?!V_(r):e.op===`-`?typeof r==`number`?-r:Array.isArray(r)?r.map(e=>-Q(e,0)):Z:r}if(e.t===`ternary`)return V_($(e.cond,t,n))?$(e.then,t,n):$(e.else,t,n);if(e.t===`index`){let r=$(e.v,t,n),i=$(e.i,t,n);return Array.isArray(r)&&typeof i==`number`?r[i]===void 0?Z:r[i]:Z}if(e.t===`dot`){let r=$(e.v,t,n),i={x:0,y:1,z:2};return Array.isArray(r)&&i[e.name]!==void 0?r[i[e.name]]===void 0?Z:r[i[e.name]]:Z}return e.t===`call`?Z_(e.name,e.args.map(e=>$(e,t,n)),t,n):e.t===`bin`?J_(e.op,$(e.l,t,n),$(e.r,t,n)):e.t===`comp`?ev(e,t,n):Z}function J_(e,t,n){return(e===`*`||e===`/`||e===`%`||e===`+`||e===`-`)&&(Array.isArray(t)||Array.isArray(n))?Y_(e,t,n):t===Z||n===Z?e===`==`||e===`!=`?!1:Z:e===`+`?Q(t,0)+Q(n,0):e===`-`?Q(t,0)-Q(n,0):e===`*`?Q(t,0)*Q(n,0):e===`/`?Q(n,0)===0?Z:Q(t,0)/Q(n,0):e===`%`?Q(n,0)===0?Z:Q(t,0)%Q(n,0):e===`==`?X_(t,n):e===`!=`?!X_(t,n):e===`<`?Q(t,0)<Q(n,0):e===`>`?Q(t,0)>Q(n,0):e===`<=`?Q(t,0)<=Q(n,0):e===`>=`?Q(t,0)>=Q(n,0):e===`&&`?V_(t)&&V_(n):e===`||`?V_(t)||V_(n):Z}function Y_(e,t,n){let r=Array.isArray(t)?t:null,i=Array.isArray(n)?n:null;if(e===`*`&&r&&typeof n==`number`)return r.map(e=>Q(e,0)*n);if(e===`*`&&i&&typeof t==`number`)return i.map(e=>Q(e,0)*t);if(e===`/`&&r&&typeof n==`number`&&n!==0)return r.map(e=>Q(e,0)/n);if((e===`+`||e===`-`||e===`*`)&&r&&i){let t=Math.max(r.length,i.length),n=[];for(let a=0;a<t;a++){let t=Q(r[a],0),o=Q(i[a],0);n.push(e===`+`?t+o:e===`-`?t-o:t*o)}return n}return Z}function X_(e,t){return e===Z||t===Z?!1:Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((e,n)=>X_(e,t[n])):e===t}function Z_(e,t,n,r){let i=e=>e*180/Math.PI;if(e===`sin`)return Math.sin(Q(t[0],0)*Math.PI/180);if(e===`cos`)return Math.cos(Q(t[0],0)*Math.PI/180);if(e===`tan`)return Math.tan(Q(t[0],0)*Math.PI/180);if(e===`asin`)return i(Math.asin(Q_(t[0])));if(e===`acos`)return i(Math.acos(Q_(t[0])));if(e===`atan`)return i(Math.atan(Q(t[0],0)));if(e===`atan2`)return i(Math.atan2(Q(t[0],0),Q(t[1],0)));if(e===`abs`)return Math.abs(Q(t[0],0));if(e===`ceil`)return Math.ceil(Q(t[0],0));if(e===`floor`)return Math.floor(Q(t[0],0));if(e===`round`)return Math.round(Q(t[0],0));if(e===`sqrt`)return Math.sqrt(Math.max(0,Q(t[0],0)));if(e===`pow`)return Q(t[0],0)**+Q(t[1],0);if(e===`ln`)return Math.log(Q(t[0],1));if(e===`log`)return Math.log(Q(t[0],1))/Math.LN10;if(e===`exp`)return Math.exp(Q(t[0],0));if(e===`sign`)return Math.sign(Q(t[0],0));if(e===`min`)return Math.min(...$_(t));if(e===`max`)return Math.max(...$_(t));if(e===`len`)return Array.isArray(t[0])?t[0].length:t[0]&&t[0].range?U_(t[0].start,t[0].step,t[0].end).length:0;if(e===`norm`)return Math.hypot(...Array.isArray(t[0])?t[0].map(e=>Q(e,0)):[0]);if(e===`cross`){let e=B_(t[0]),n=B_(t[1]);return[e[1]*n[2]-e[2]*n[1],e[2]*n[0]-e[0]*n[2],e[0]*n[1]-e[1]*n[0]]}if(e===`concat`)return t.flatMap(e=>Array.isArray(e)?e:[e]);if(e===`str`)return t.map(e=>e===Z?`undef`:String(e)).join(``);let a=K_(n,e);if(!a)return Z;let o=C_(n);return a.params.forEach((e,i)=>o.vars.set(e.name,t[i]===void 0?e.def?$(e.def,n,r):Z:t[i])),$(a.expr,o,r)}function Q_(e){return Math.max(-1,Math.min(1,Q(e,0)))}function $_(e){let t=[];for(let n of e)Array.isArray(n)?t.push(...n.map(e=>Q(e,0))):t.push(Q(n,0));return t.length?t:[0]}function ev(e,t,n){let r=[],i=a=>{if(a===e.gens.length){r.push($(e.expr,t,n));return}let o=e.gens[a];if(o.t===`for`){let e=o.bindings.map(e=>H_($(e.expr,t,n))),r=n=>{if(n===e.length)i(a+1);else for(let i of e[n])t.vars.set(o.bindings[n].name,i),r(n+1)};r(0)}else if(o.t===`if`)V_($(o.cond,t,n))&&i(a+1);else if(o.t===`let`){for(let e of o.bindings)t.vars.set(e.name,$(e.expr,t,n));i(a+1)}};return i(0),r}function tv(e){let t=new nv(rv(e)),n=[];for(;!t.end();)n.push(t.stmt());return{body:n}}var nv=class{constructor(e){this.toks=e,this.i=0}cur(){return this.toks[this.i]}end(){return this.cur().t===`eof`}eat(e,t){let n=this.cur();return(n.t!==e||t!==void 0&&n.v!==t)&&this.fail(`expected ${t||e}`),this.i++,n}is(e,t){let n=this.cur();return n.t===e&&(t===void 0||n.v===t)}fail(e){throw Error(`OpenSCAD line ${this.cur().line}: ${e}`)}stmt(){if(this.is(`punct`,`{`))return this.block();let e=null;if((this.is(`punct`,`*`)||this.is(`punct`,`!`)||this.is(`punct`,`#`)||this.is(`punct`,`%`))&&(e=this.eat(`punct`).v),this.is(`id`,`include`)||this.is(`id`,`use`))return this.include();if(this.is(`id`,`module`))return this.module();if(this.is(`id`,`function`))return this.fn();if(this.is(`id`,`for`)||this.is(`id`,`intersection_for`))return this.forStmt();if(this.is(`id`,`if`))return this.ifStmt();if(this.is(`id`,`let`)||this.is(`id`,`assign`))return this.letStmt();if(this.is(`id`)){let t=this.eat(`id`).v;if(this.is(`punct`,`=`)){this.eat(`punct`,`=`);let e=this.expr();return this.is(`punct`,`;`)&&this.eat(`punct`,`;`),{t:`assign`,name:t,expr:e}}let n=this.is(`punct`,`(`)?this.args():[],r=null;this.startsStmt()?r=this.stmt():this.is(`punct`,`;`)&&this.eat(`punct`,`;`);let i={t:`call`,name:t,args:n,child:r};return e&&(i.mod=e),i}this.fail(`unexpected ${this.cur().v||this.cur().t}`)}startsStmt(){return this.is(`punct`,`{`)||this.is(`punct`,`*`)||this.is(`punct`,`!`)||this.is(`punct`,`#`)||this.is(`punct`,`%`)?!0:this.is(`id`)&&!this.is(`id`,`else`)}block(){this.eat(`punct`,`{`);let e=[];for(;!this.is(`punct`,`}`)&&!this.end();)e.push(this.stmt());return this.eat(`punct`,`}`),{t:`block`,body:e}}include(){let e=this.eat(`id`).v;this.eat(`punct`,`<`);let t=``;for(;!this.is(`punct`,`>`)&&!this.end();){let e=this.cur();t+=e.t===`str`?e.v:String(e.v),this.i++}return this.eat(`punct`,`>`),this.is(`punct`,`;`)&&this.eat(`punct`,`;`),{t:`include`,kind:e,file:t}}module(){return this.eat(`id`,`module`),{t:`module`,name:this.eat(`id`).v,params:this.is(`punct`,`(`)?this.params():[],body:this.stmt()}}fn(){this.eat(`id`,`function`);let e=this.eat(`id`).v,t=this.params();this.eat(`punct`,`=`);let n=this.expr();return this.is(`punct`,`;`)&&this.eat(`punct`,`;`),{t:`function`,name:e,params:t,expr:n}}forStmt(){let e=this.eat(`id`).v;this.eat(`punct`,`(`);let t=this.bindings();return this.eat(`punct`,`)`),{t:`for`,name:e,bindings:t,body:this.stmt()}}ifStmt(){this.eat(`id`,`if`),this.eat(`punct`,`(`);let e=this.expr();this.eat(`punct`,`)`);let t=this.stmt(),n=null;return this.is(`id`,`else`)&&(this.eat(`id`,`else`),n=this.stmt()),{t:`if`,cond:e,then:t,else:n}}letStmt(){this.eat(`id`),this.eat(`punct`,`(`);let e=this.bindings();return this.eat(`punct`,`)`),{t:`let`,bindings:e,body:this.stmt()}}bindings(){let e=[];if(this.is(`punct`,`)`))return e;do{let t=this.eat(`id`).v;this.eat(`punct`,`=`),e.push({name:t,expr:this.expr()})}while(this.is(`punct`,`,`)&&this.eat(`punct`,`,`));return e}params(){this.eat(`punct`,`(`);let e=[];if(!this.is(`punct`,`)`))do{let t=this.eat(`id`).v,n=null;this.is(`punct`,`=`)&&(this.eat(`punct`,`=`),n=this.expr()),e.push({name:t,def:n})}while(this.is(`punct`,`,`)&&this.eat(`punct`,`,`));return this.eat(`punct`,`)`),e}args(){this.eat(`punct`,`(`);let e=[];if(!this.is(`punct`,`)`))do{if(this.is(`punct`,`)`))break;if(this.is(`id`)&&this.toks[this.i+1]&&this.toks[this.i+1].t===`punct`&&this.toks[this.i+1].v===`=`){let t=this.eat(`id`).v;this.eat(`punct`,`=`),e.push({name:t,expr:this.expr()})}else e.push({name:null,expr:this.expr()})}while(this.is(`punct`,`,`)&&this.eat(`punct`,`,`));return this.eat(`punct`,`)`),e}expr(e=0){let t=this.unary();for(;this.is(`punct`,`?`)&&e<=1;){this.eat(`punct`,`?`);let e=this.expr(0);this.eat(`punct`,`:`);let n=this.expr(1);t={t:`ternary`,cond:t,then:e,else:n}}for(;this.is(`punct`)&&q_[this.cur().v]>=e&&this.cur().v!==`?`;){let e=this.eat(`punct`).v,n=this.expr(q_[e]+1);t={t:`bin`,op:e,l:t,r:n}}return t}unary(){return this.is(`punct`,`!`)||this.is(`punct`,`+`)||this.is(`punct`,`-`)?{t:`unary`,op:this.eat(`punct`).v,v:this.unary()}:this.postfix(this.primary())}postfix(e){for(;this.is(`punct`,`[`)||this.is(`punct`,`.`);)if(this.is(`punct`,`.`))this.eat(`punct`,`.`),e={t:`dot`,v:e,name:this.eat(`id`).v};else{this.eat(`punct`,`[`);let t=this.expr();this.eat(`punct`,`]`),e={t:`index`,v:e,i:t}}return e}primary(){if(this.is(`num`))return{t:`num`,v:this.eat(`num`).v};if(this.is(`str`))return{t:`str`,v:this.eat(`str`).v};if(this.is(`id`,`undef`))return this.eat(`id`),{t:`undef`};if(this.is(`id`,`true`))return this.eat(`id`),{t:`bool`,v:!0};if(this.is(`id`,`false`))return this.eat(`id`),{t:`bool`,v:!1};if(this.is(`id`)){let e=this.eat(`id`).v;return this.is(`punct`,`(`)?{t:`call`,name:e,args:this.args().map(e=>e.expr)}:{t:`id`,v:e}}if(this.is(`punct`,`(`)){this.eat(`punct`,`(`);let e=this.expr();return this.eat(`punct`,`)`),e}if(this.is(`punct`,`[`))return this.list();this.fail(`unexpected ${this.cur().v||this.cur().t}`)}list(){if(this.eat(`punct`,`[`),this.is(`id`,`for`)||this.is(`id`,`if`)||this.is(`id`,`let`)){let e=[];for(;this.is(`id`,`for`)||this.is(`id`,`if`)||this.is(`id`,`let`);){let t=this.eat(`id`).v;this.eat(`punct`,`(`),t===`if`?e.push({t:`if`,cond:this.expr()}):e.push({t,bindings:this.bindings()}),this.eat(`punct`,`)`)}let t=this.expr();return this.eat(`punct`,`]`),{t:`comp`,gens:e,expr:t}}if(this.is(`punct`,`]`))return this.eat(`punct`,`]`),{t:`list`,items:[]};let e=this.expr();if(this.is(`punct`,`:`)){this.eat(`punct`,`:`);let t=this.expr();if(this.is(`punct`,`:`)){this.eat(`punct`,`:`);let n=this.expr();return this.eat(`punct`,`]`),{t:`range`,start:e,step:t,end:n}}return this.eat(`punct`,`]`),{t:`range`,start:e,step:null,end:t}}let t=[e];for(;this.is(`punct`,`,`)&&this.eat(`punct`,`,`)&&!this.is(`punct`,`]`);)t.push(this.expr());return this.eat(`punct`,`]`),{t:`list`,items:t}}};function rv(e){let t=[],n=0,r=1,i=(e,n)=>t.push({t:e,v:n,line:r});for(;n<e.length;){let t=e[n];if(t===`
|
|
484
|
+
`){r++,n++;continue}if(t===` `||t===` `||t===`\r`){n++;continue}if(t===`/`&&e[n+1]===`/`){for(;n<e.length&&e[n]!==`
|
|
485
|
+
`;)n++;continue}if(t===`/`&&e[n+1]===`*`){for(n+=2;n<e.length&&(e[n]!==`*`||e[n+1]!==`/`);)e[n]===`
|
|
486
|
+
`&&r++,n++;n+=2;continue}if(t===`"`){let t=``;for(n++;n<e.length&&e[n]!==`"`;)if(e[n]===`\\`){let r=e[++n];t+=r===`n`?`
|
|
487
|
+
`:r===`t`?` `:r,n++}else e[n]===`
|
|
488
|
+
`&&r++,t+=e[n++];n++,i(`str`,t);continue}if(t===`.`&&e[n+1]>=`0`&&e[n+1]<=`9`||t>=`0`&&t<=`9`){let t=n;for(e[t]===`.`&&t++;t<e.length&&e[t]>=`0`&&e[t]<=`9`;)t++;if(e[t]===`.`&&e[n]!==`.`)for(t++;t<e.length&&e[t]>=`0`&&e[t]<=`9`;)t++;if(e[t]===`e`||e[t]===`E`)for(t++,(e[t]===`+`||e[t]===`-`)&&t++;t<e.length&&e[t]>=`0`&&e[t]<=`9`;)t++;i(`num`,Number(e.slice(n,t))),n=t;continue}if(t===`$`||t===`_`||t>=`A`&&t<=`Z`||t>=`a`&&t<=`z`){let t=n+1;for(;t<e.length&&/[A-Za-z0-9_$]/.test(e[t]);)t++;i(`id`,e.slice(n,t)),n=t;continue}let a=e.slice(n,n+2);[`==`,`!=`,`<=`,`>=`,`&&`,`||`].includes(a)?(i(`punct`,a),n+=2):(i(`punct`,t),n++)}return i(`eof`,``),t}var iv={cube:[`size`,`center`],sphere:[`r`,`d`],cylinder:[`h`,`r1`,`r2`,`center`,`r`,`d`,`d1`,`d2`],square:[`size`,`center`],circle:[`r`,`d`],polygon:[`points`,`paths`,`convexity`],polyhedron:[`points`,`faces`,`convexity`],translate:[`v`],rotate:[`a`,`v`],scale:[`v`],mirror:[`v`],multmatrix:[`m`],color:[`c`,`alpha`],linear_extrude:[`height`,`v`,`scale`,`center`,`twist`,`slices`,`segments`,`convexity`,`h`],rotate_extrude:[`angle`,`start`,`convexity`,`a`],import:[`file`,`layer`,`convexity`,`origin`,`scale`],children:[`index`],text:[`text`,`size`,`font`],offset:[`r`],projection:[`cut`],resize:[`newsize`,`auto`,`convexity`],surface:[`file`,`center`,`convexity`]},av=new Float64Array([1,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,1]);function ov(e){return Array.from(e,e=>X(e)).join(`, `)}function sv(e){let t=e.notes.slice(),n=new Map,r=(e,t=1)=>n.set(e,(n.get(e)||0)+t),i=[],a=[],o=new Map,s=new Map,c=new Map,l=0,u=e=>`${e}${l++}`,d=!1,f=(t,n=!1)=>{let r=`${t}:${+!!n}`;if(c.has(r))return c.get(r);let i=u(`m`);c.set(r,i);let o=e.materials[t],s=o.baseColorSrgb,l=o.doubleSided||n?`, side: THREE.DoubleSide`:``;return o.unlit?(a.push(` const ${i} = new THREE.MeshBasicMaterial({ color: new THREE.Color(${X(s[0])}, ${X(s[1])}, ${X(s[2])}), transparent: ${o.opacity<.999}, opacity: ${X(o.opacity)}${l} });`),i):(a.push(` const ${i} = new THREE.MeshStandardMaterial({ color: new THREE.Color(${X(s[0])}, ${X(s[1])}, ${X(s[2])}), metalness: ${X(o.metallic)}, roughness: ${X(o.roughness)}, transparent: ${o.opacity<.999}, opacity: ${X(o.opacity)}${l} });`),i)},p=e=>{let t=e.key;if(o.has(t))return o.get(t);let n=u(`g`);return o.set(t,n),a.push(` const ${n} = ${m(e)};`),n},m=e=>{if(e.kind===`box`){let t=e.size;return`new THREE.BoxGeometry(${X(t[0])}, ${X(t[1])}, ${X(t[2])})`}if(e.kind===`sphere`)return`new THREE.SphereGeometry(${X(e.radius)}, ${e.segments}, ${Math.max(3,Math.round(e.segments/2))})`;if(e.kind===`cylinder`||e.kind===`cone`||e.kind===`frustum`){let t=e.kind===`cone`?0:e.radiusTop===void 0?e.radius:e.radiusTop,n=e.radius;return`new THREE.CylinderGeometry(${X(t)}, ${X(n)}, ${X(e.height)}, ${e.segments}, 1, ${e.caps===!1})`}if(e.kind===`capsule`){let t=e.height-2*e.radius;if(t<=1e-6)return`new THREE.SphereGeometry(${X(e.radius)}, ${e.segments}, ${Math.max(3,Math.round(e.segments/2))})`;let n=Math.max(1,Math.round(e.segments/4));return`new THREE.CapsuleGeometry(${X(e.radius)}, ${X(t)}, ${n}, ${e.segments})`}return e.kind===`plane`?`new THREE.PlaneGeometry(${X(e.width)}, ${X(e.depth)})`:e.kind===`torus`?`new THREE.TorusGeometry(${X(e.radius)}, ${X(e.tube)}, ${e.tubeSegments}, ${e.segments})`:e.kind===`extrude`?fv(e):e.kind===`revolve`?pv(e):e.kind===`surface`&&e.regions.length===1?dv(e.regions[0],`ShapeGeometry`):null},h=e=>{if(e.solid.kind===`mesh`||e.solid.kind===`lines`||m(e.solid)===null)return g(e);let t=p(e.solid),n=f(e.material,e.doubleSided);e.solid.kind===`plane`&&r(`plane`);let a=u(`o`);return i.push(` const ${a} = new THREE.Mesh(${t}, ${n});`),_(a,mv(e)),a},g=t=>{let n=t.solid.kind===`mesh`||t.solid.kind===`lines`?t.solid:e.bakedMesh(t.entry);r(t.solid.kind===`mesh`||t.solid.kind===`lines`?`mesh`:t.solid.kind);let o=n.key||n,c=s.get(o);if(!c){c=u(`g`),s.set(o,c);let e=`new Float32Array([${ov(n.positions)}])`;a.push(` const ${c} = new THREE.BufferGeometry();`),a.push(` ${c}.setAttribute('position', new THREE.BufferAttribute(${e}, 3));`),n.normals&&a.push(` ${c}.setAttribute('normal', new THREE.BufferAttribute(new Float32Array([${ov(n.normals)}]), 3));`),a.push(` ${c}.setIndex([${Array.from(n.indices).join(`, `)}]);`)}let l=f(t.material,t.doubleSided),d=u(`o`),p=n.kind===`lines`?`LineSegments`:`Mesh`;i.push(` const ${d} = new THREE.${p}(${c}, ${l});`);let m=t.solid.kind===`mesh`||t.solid.kind===`lines`?t.matrix:t.meshMatrix;return _(d,m),d},_=(e,t)=>{if(!t)return;let n=Qm(t);n&&n.plain?i.push(` ${e}.position.set(${X(n.translation[0])}, ${X(n.translation[1])}, ${X(n.translation[2])});`):(i.push(` ${e}.matrix.fromArray([${ov(t)}]);`),i.push(` ${e}.matrixAutoUpdate = false;`))},v=(e,t)=>{if(!e)return;if(e.kind===`shape`){let n=h(e);i.push(` ${t}.add(${n});`);return}if(e.kind===`repeat`&&e.children.length===1&&e.children[0].kind===`shape`&&m(e.children[0].solid)){y(e,t);return}if(e.kind===`repeat`||e.kind===`scatter`){b(e,t);return}let n=u(`o`);i.push(` const ${n} = new THREE.Group();`),_(n,e.matrix),i.push(` ${t}.add(${n});`);for(let t of e.children)v(t,n)},y=(e,t)=>{r(`instanced`);let n=e.children[0];n.solid.kind===`plane`&&r(`plane`,e.count);let a=p(n.solid),o=f(n.material,n.doubleSided),s=u(`o`);i.push(` const ${s} = new THREE.InstancedMesh(${a}, ${o}, ${e.count});`);let c=e.step;i.push(` const step_${s} = new THREE.Matrix4().fromArray([${ov(c)}]);`),i.push(` const acc_${s} = new THREE.Matrix4();`),i.push(` const local_${s} = new THREE.Matrix4().fromArray([${ov(mv(n)||L())}]);`),i.push(` const tmp_${s} = new THREE.Matrix4();`),i.push(` for (let i = 0; i < ${e.count}; i++) {`),i.push(` tmp_${s}.multiplyMatrices(acc_${s}, local_${s});`),i.push(` ${s}.setMatrixAt(i, tmp_${s});`),i.push(` acc_${s}.multiply(step_${s});`),i.push(` }`),_(s,e.matrix),i.push(` ${t}.add(${s});`)},b=(t,n)=>{t.kind===`scatter`?(d=!!(t.params.radius||t.params.randomRotation),r(`scatter`,t.params.count)):r(`repeat`,t.count);let a=u(`o`);i.push(` const ${a} = new THREE.Group();`),_(a,t.matrix),i.push(` ${n}.add(${a});`);let o=(t.kind===`scatter`&&t.params.randomMaterial&&t.params.randomMaterial.length?t.params.randomMaterial:[null]).map(n=>{let r=n?t.children.map(t=>Km(t,n,null,e.resolve)):t.children,a=u(`make`);i.push(` const ${a} = () => {`),i.push(` const copy = new THREE.Group();`);for(let e of r)v(e,`copy`);return i.push(` return copy;`),i.push(` };`),a}),s=o.length===1?`const copy = ${o[0]}();`:`const choices = [${o.join(`, `)}]; const mi = Math.min(choices.length - 1, Math.floor(u[8] * choices.length)); const copy = choices[mi]();`;if(t.kind===`repeat`)i.push(` {`),i.push(` const step = new THREE.Matrix4().fromArray([${ov(t.step)}]);`),i.push(` const acc = new THREE.Matrix4();`),i.push(` for (let i = 0; i < ${t.count}; i++) {`),i.push(` ${s}`),i.push(` copy.matrix.multiplyMatrices(acc, copy.matrix);`),i.push(` copy.matrixAutoUpdate = false;`),i.push(` ${a}.add(copy);`),i.push(` acc.multiply(step);`),i.push(` }`),i.push(` }`);else{d=!0;let e=t.params;if(i.push(` {`),i.push(` const rand = mulberry32(${e.seed>>>0});`),i.push(` const lerp = (r, t) => r[0] + (r[1] - r[0]) * t;`),i.push(` for (let i = 0; i < ${e.count}; i++) {`),i.push(` const u = [rand(), rand(), rand(), rand(), rand(), rand(), rand(), rand(), rand()];`),i.push(` const pos = [0, 0, 0], rot = [0, 0, 0], scl = [1, 1, 1];`),e.grid?(i.push(` const ix = i % ${e.grid[0]}, iz = Math.floor(i / ${e.grid[0]});`),i.push(` pos[0] = (ix - ${X((e.grid[0]-1)/2)}) * ${X(e.spacing[0])} + (u[0] - 0.5) * ${X(e.jitter)} * ${X(e.spacing[0])};`),i.push(` pos[2] = (iz - ${X((e.grid[1]-1)/2)}) * ${X(e.spacing[1])} + (u[1] - 0.5) * ${X(e.jitter)} * ${X(e.spacing[1])};`)):e.radius?(i.push(` const r = ${X(e.radius)} * Math.sqrt(u[0]);`),i.push(` const a = u[1] * Math.PI * 2;`),i.push(` pos[0] = r * es3dCos(a);`),i.push(` pos[2] = r * es3dSin(a);`)):(i.push(` pos[0] = (u[0] - 0.5) * ${X(e.area[0])};`),i.push(` pos[2] = (u[1] - 0.5) * ${X(e.area[1])};`)),e.randomRotation){let t=e.randomRotation.ranges;i.push(` rot[0] = lerp([${X(t[0][0])}, ${X(t[0][1])}], u[2]);`),i.push(` rot[1] = lerp([${X(t[1][0])}, ${X(t[1][1])}], u[3]);`),i.push(` rot[2] = lerp([${X(t[2][0])}, ${X(t[2][1])}], u[4]);`)}if(e.randomScale){let t=e.randomScale.ranges;e.randomScale.uniform?i.push(` scl[0] = scl[1] = scl[2] = lerp([${X(t[0][0])}, ${X(t[0][1])}], u[5]);`):(i.push(` scl[0] = lerp([${X(t[0][0])}, ${X(t[0][1])}], u[5]);`),i.push(` scl[1] = lerp([${X(t[1][0])}, ${X(t[1][1])}], u[6]);`),i.push(` scl[2] = lerp([${X(t[2][0])}, ${X(t[2][1])}], u[7]);`))}i.push(` const x = rot[0] * Math.PI / 180, y = rot[1] * Math.PI / 180, z = rot[2] * Math.PI / 180;`),i.push(` const cx = es3dCos(x), sx = es3dSin(x), cy = es3dCos(y), sy = es3dSin(y), cz = es3dCos(z), sz = es3dSin(z);`),i.push(` const e = [cz * cy, sz * cy, -sy, 0, cz * sy * sx - sz * cx, sz * sy * sx + cz * cx, cy * sx, 0, cz * sy * cx + sz * sx, sz * sy * cx - cz * sx, cy * cx, 0, pos[0], pos[1], pos[2], 1];`),i.push(` e[0] *= scl[0]; e[1] *= scl[0]; e[2] *= scl[0]; e[4] *= scl[1]; e[5] *= scl[1]; e[6] *= scl[1]; e[8] *= scl[2]; e[9] *= scl[2]; e[10] *= scl[2];`),i.push(` const placed = new THREE.Matrix4().fromArray(e);`),i.push(` ${s}`),i.push(` copy.matrix.multiplyMatrices(placed, copy.matrix);`),i.push(` copy.matrixAutoUpdate = false;`),i.push(` ${a}.add(copy);`),i.push(` }`),i.push(` }`)}};v(e.root,`root`);for(let t of e.lights)i.push(cv(t,r));for(let t of e.cameras)i.push(lv(t));n.get(`plane`)&&t.push(`${n.get(`plane`).toLocaleString(`en-US`)} plane${n.get(`plane`)===1?``:`s`} rotated from XY into XZ.`),n.get(`instanced`)&&t.push(`${n.get(`instanced`).toLocaleString(`en-US`)} repeat${n.get(`instanced`)===1?``:`s`} written as an InstancedMesh.`),n.get(`scatter`)&&t.push(`${n.get(`scatter`).toLocaleString(`en-US`)} scattered copies placed with the same mulberry32 sequence as ES3D.`);let x=[`extrude`,`revolve`,`surface`,`torus`,`frustum`].filter(e=>n.get(e));return x.length&&t.push(`Some shapes were written as triangle buffers (${x.join(`, `)}).`),{text:`import * as THREE from 'three';
|
|
489
|
+
${d?hv:``}
|
|
490
|
+
export function createScene() {
|
|
491
|
+
const root = new THREE.Group();
|
|
492
|
+
${a.join(`
|
|
493
|
+
`)}
|
|
494
|
+
${i.join(`
|
|
495
|
+
`)}
|
|
496
|
+
return root;
|
|
497
|
+
}
|
|
498
|
+
`,notes:t}}function cv(e){let t=e.color,n=`new THREE.Color().setRGB(${X(t[0])}, ${X(t[1])}, ${X(t[2])}, THREE.LinearSRGBColorSpace)`;if(e.type===`ambient`)return` root.add(new THREE.AmbientLight(${n}));`;if(e.type===`hemisphere`)return` root.add(new THREE.HemisphereLight(${n}, new THREE.Color().setRGB(${X(e.ground[0])}, ${X(e.ground[1])}, ${X(e.ground[2])}, THREE.LinearSRGBColorSpace)));`;let r=e.position,i=e.direction;if(e.type===`directional`)return` { const L = new THREE.DirectionalLight(${n}); L.position.set(${X(r[0]-i[0])}, ${X(r[1]-i[1])}, ${X(r[2]-i[2])}); L.target.position.set(${X(r[0])}, ${X(r[1])}, ${X(r[2])}); root.add(L); root.add(L.target); }`;if(e.type===`spot`){let t=Math.acos(Math.min(1,Math.max(-1,e.outer)));return` { const L = new THREE.SpotLight(${n}); L.position.set(${X(r[0])}, ${X(r[1])}, ${X(r[2])}); L.target.position.set(${X(r[0]+i[0])}, ${X(r[1]+i[1])}, ${X(r[2]+i[2])}); L.angle = ${X(t)}; root.add(L); root.add(L.target); }`}return` { const L = new THREE.PointLight(${n}); L.position.set(${X(r[0])}, ${X(r[1])}, ${X(r[2])}); root.add(L); }`}function lv(e){let t=e.position,n=e.target;if(e.type===`orthographic`){let r=e.height/2,i=r*(e.aspect||1);return` { const C = new THREE.OrthographicCamera(${X(-i)}, ${X(i)}, ${X(r)}, ${X(-r)}); C.position.set(${X(t[0])}, ${X(t[1])}, ${X(t[2])}); C.lookAt(${X(n[0])}, ${X(n[1])}, ${X(n[2])}); root.add(C); }`}return` { const C = new THREE.PerspectiveCamera(${X(e.fov||45)}, ${X(e.aspect||1)}); C.position.set(${X(t[0])}, ${X(t[1])}, ${X(t[2])}); C.lookAt(${X(n[0])}, ${X(n[1])}, ${X(n[2])}); root.add(C); }`}function uv(e){let t=``;for(let n=0;n<e.length;n+=2)t+=`.${n===0?`moveTo`:`lineTo`}(${X(e[n])}, ${X(e[n+1])})`;return t+`.closePath()`}function dv(e,t){let n=(e.holes||[]).map((e,t)=>` const h${t} = new THREE.Path()${uv(e)}; s.holes.push(h${t});`).join(``);return`(() => { const s = new THREE.Shape()${uv(e.outer)};${n} return new THREE.${t}(s); })()`}function fv(e){let t=e.regions.map((e,t)=>{let n=(e.holes||[]).map((e,n)=>` const h${t}${n} = new THREE.Path()${uv(e)}; s${t}.holes.push(h${t}${n});`).join(``);return`const s${t} = new THREE.Shape()${uv(e.outer)};${n}`}).join(` `),n=e.regions.map((e,t)=>`s${t}`).join(`, `),r=e.center?`.translate(0, 0, ${X(-e.depth/2)})`:``;return`(() => { ${t} return new THREE.ExtrudeGeometry([${n}], { depth: ${X(e.depth)}, bevelEnabled: false })${r}; })()`}function pv(e){let t=[];for(let n=0;n<e.points.length;n+=2)t.push(`new THREE.Vector2(${X(e.points[n])}, ${X(e.points[n+1])})`);let n=e.angle<360-1e-6?`, ${X(Math.PI/2)}, ${X(e.angle*Math.PI/180)}`:``;return`new THREE.LatheGeometry([${t.join(`, `)}], ${e.segments}${n})`}function mv(e){if(!e.solid||e.solid.kind!==`plane`&&e.solid.kind!==`torus`)return e.matrix;if(!e.matrix)return av;let t=L();return R(t,e.matrix,av),t}var hv=`function mulberry32(seed) {
|
|
499
|
+
let a = seed >>> 0;
|
|
500
|
+
return function next() {
|
|
501
|
+
a = (a + 0x6d2b79f5) >>> 0;
|
|
502
|
+
let t = a;
|
|
503
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
504
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
505
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
const PI = Math.PI, TWO_PI = PI * 2, HALF_PI = PI * 0.5, QUARTER_PI = PI * 0.25;
|
|
509
|
+
const S1 = -1.66666666666666324348e-1, S2 = 8.33333333332248946124e-3, S3 = -1.98412698298579493134e-4;
|
|
510
|
+
const S4 = 2.75573137070700676789e-6, S5 = -2.50507602534068634195e-8, S6 = 1.58969099521155010221e-10;
|
|
511
|
+
const C1 = 4.16666666666666019037e-2, C2 = -1.38888888888741095749e-3, C3 = 2.48015872894767294178e-5;
|
|
512
|
+
const C4 = -2.75573143513906633035e-7, C5 = 2.0875723212981748279e-9, C6 = -1.13596475577881948265e-11;
|
|
513
|
+
function kernelSin(x) {
|
|
514
|
+
const z = x * x, v = z * x, r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6)));
|
|
515
|
+
return x + v * (S1 + z * r);
|
|
516
|
+
}
|
|
517
|
+
function kernelCos(x) {
|
|
518
|
+
const z = x * x, r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * C6)))));
|
|
519
|
+
return 1 - 0.5 * z + z * r;
|
|
520
|
+
}
|
|
521
|
+
function es3dSin(x) {
|
|
522
|
+
if (!Number.isFinite(x)) return x;
|
|
523
|
+
let y = x - TWO_PI * Math.round(x / TWO_PI);
|
|
524
|
+
let sign = 1;
|
|
525
|
+
if (y < 0) { sign = -1; y = -y; }
|
|
526
|
+
if (y > HALF_PI) y = PI - y;
|
|
527
|
+
if (y < 0) y = 0;
|
|
528
|
+
const s = y > QUARTER_PI ? kernelCos(HALF_PI - y) : kernelSin(y);
|
|
529
|
+
return sign < 0 ? -s : s;
|
|
530
|
+
}
|
|
531
|
+
function es3dCos(x) { return es3dSin(x + HALF_PI); }
|
|
532
|
+
`,gv=4e6,_v={es3d:`ES3D text`,svg:`SVG drawing`,obj:`Wavefront OBJ`,stl:`STL`,gltf:`glTF (JSON)`,glb:`glTF binary (GLB)`,step:`STEP`,x3dv:`X3D Classic`,x3d:`X3D XML`,usda:`USD ASCII`,usdc:`USD crate`,usdz:`USDZ`,scad:`OpenSCAD`},vv={es3d:{label:`ES3D markup (.es3d)`,ext:`.es3d`,mime:`model/vnd.es3d`,text:!0},"es3d-min":{label:`ES3D markup, minified (.es3d)`,ext:`.es3d`,mime:`model/vnd.es3d`,text:!0},"es3d-compact":{label:`ES3D compact syntax (.es3d)`,ext:`.es3d`,mime:`model/vnd.es3d`,text:!0},glb:{label:`glTF binary (.glb)`,ext:`.glb`,mime:`model/gltf-binary`},obj:{label:`Wavefront OBJ + MTL (.obj)`,ext:`.obj`,mime:`model/obj`,text:!0},stl:{label:`STL for 3D printing (.stl)`,ext:`.stl`,mime:`model/stl`},step:{label:`STEP, tessellated (.step)`,ext:`.step`,mime:`model/step`,text:!0},x3dv:{label:`X3D Classic (.x3dv)`,ext:`.x3dv`,mime:`model/x3d+vrml`,text:!0},usda:{label:`USD ASCII (.usda)`,ext:`.usda`,mime:`model/vnd.usda`,text:!0},scad:{label:`OpenSCAD (.scad)`,ext:`.scad`,mime:`text/x-openscad`,text:!0},js:{label:`three.js module (.js)`,ext:`.js`,mime:`text/javascript`,text:!0}},yv=/\.(mtl|bin|png|jpe?g|webp|gif|ktx2|dds|tga|bmp)$/i,bv=e=>new TextDecoder(`utf-8`).decode(e).replace(/^/,``);function xv(e,t){if(Iu(t))return`glb`;let n=((/\.([a-z0-9]+)$/i.exec(e)||[])[1]||``).toLowerCase(),r=bv(t.subarray(0,4096));if(pd(r))return`step`;if($u(t)&&![`es3d`,`svg`,`obj`,`gltf`].includes(n))return`stl`;let i=/^\s*(<\?xml[^>]*\?>\s*)?(<!--[\s\S]*?-->\s*)*<es3d[\s>/]/.test(r)||/^\s*((\/\/[^\n]*|\/\*[\s\S]*?\*\/)\s*)*es3d\b/.test(r);return n===`es3d`||i?`es3d`:n===`svg`||/<svg[\s>/]/.test(r)?`svg`:n===`stl`||ed(t)?`stl`:n===`gltf`||/^\s*\{[\s\S]*"asset"\s*:/.test(r)?`gltf`:n===`obj`||/^\s*(#[^\n]*\n\s*)*(mtllib|o|g|v|vt|vn|f|usemtl|s)\s/.test(r)?`obj`:n===`x3dv`||/^#X3D\b/.test(r)?`x3dv`:n===`x3d`||/<X3D[\s>]/i.test(r)?`x3d`:n===`usda`||/^#usda\b/.test(r)?`usda`:n===`usdc`||n===`usdz`?n:n===`scad`?`scad`:n===`step`||n===`stp`||n===`p21`?`step`:null}async function Sv(e){return Promise.all(Array.from(e||[],async e=>{if(e&&e.bytes&&typeof e.bytes==`object`)return e;if(e&&typeof e.arrayBuffer==`function`)return{name:e.name||`file`,bytes:new Uint8Array(await e.arrayBuffer())};throw TypeError(`importFiles takes {name, bytes} objects or File objects.`)}))}var Cv={svg:{size:10,depth:.04,bevel:0,strokes:!0,base:!1},mesh:{precision:`auto`,normals:`auto`,uvs:!0,smooth:30},stl:{up:`z`}};async function wv(e,t={}){if(e=await Sv(e),!e.length)throw Error(`No file was given.`);let n=[];for(let t of e){let e=t.bytes instanceof Uint8Array?t.bytes:new Uint8Array(t.bytes),r=t.name||`untitled`;pu(e)&&(e=await fu(e),r=r.replace(/\.svgz$/i,`.svg`).replace(/\.gz$/i,``)),n.push({name:r,bytes:e})}let r=n.find(e=>!yv.test(e.name))||n[0],i=n.filter(e=>e!==r),a=xv(r.name,r.bytes);if(!a)throw Error(`${r.name}: unknown file type. The converter reads SVG, OBJ, STL, STEP (.step, .stp), glTF (.gltf, .glb), X3D (.x3d, .x3dv), USDA, OpenSCAD (.scad) and ES3D (.es3d) files.`);let o=r.name.replace(/\.[^.]+$/,``)||`untitled`,s={...Cv.svg,...t.svg||{}},c={...Cv.mesh,...t.mesh||{}},l={...Cv.stl,...t.stl||{}},u=[],d=[],f=(e,t)=>{let n=c.normals===`auto`?t:!!c.normals,r=c.precision===`exact`?null:c.precision;return n||d.push(`Normals are not stored; viewers compute them with a ${c.smooth}° crease angle.`),Om(e.scene,e.meshOf,o,{digits:r,normals:n,uvs:c.uvs?`auto`:!1,smooth:c.smooth})},p;switch(a){case`es3d`:p=bv(r.bytes);break;case`svg`:{let e=Tm(bv(r.bytes),{name:r.name,...s});p=e.text,u.push(...e.warnings),d.push(`${e.stats.fills} filled shape${e.stats.fills===1?``:`s`} extruded, ${e.stats.strokes} stroke${e.stats.strokes===1?``:`s`} turned into tubes, ${e.stats.materials} material${e.stats.materials===1?``:`s`}.`);break}case`obj`:{let e=bv(r.bytes),t=(/^mtllib\s+(.+?)\s*$/m.exec(e)||[])[1],n=i.find(e=>/\.mtl$/i.test(e.name)&&(!t||e.name.toLowerCase()===t.split(/[\\/]/).pop().toLowerCase()))||i.find(e=>/\.mtl$/i.test(e.name));t&&!n&&u.push(`The material library ${t} was not given; default colors are used. Select the .obj and .mtl files together to keep the materials.`),(i.some(e=>/\.(png|jpe?g|webp|gif|tga|bmp)$/i.test(e.name))||/^\s*map_/m.test(n?bv(n.bytes):``))&&u.push(`Textures are not converted; the materials keep their base colors.`),p=f(Qu(e,n?bv(n.bytes):``),/^vn\s/m.test(e));break}case`stl`:{let e=id(r.bytes,{up:l.up,smooth:c.smooth});e.info.degenerate&&u.push(`${e.info.degenerate} degenerate triangle${e.info.degenerate===1?``:`s`} (with two identical corners) ${e.info.degenerate===1?`was`:`were`} dropped.`),d.push(`${e.info.format===`binary`?`Binary`:`ASCII`} STL with ${e.info.triangles.toLocaleString(`en-US`)} triangles, welded to ${e.info.vertices.toLocaleString(`en-US`)} vertices${l.up===`z`?`; turned from Z-up to Y-up`:``}.`),p=f(e,!1);break}case`step`:{let e=Zp(r.bytes,{up:l.up,name:o});if(e){d.push(e.note),p=e.text;break}let t=hd(r.bytes,{up:l.up,smooth:c.smooth});t.info.curved&&u.push(`${t.info.curved} curved face${t.info.curved===1?``:`s`} skipped. ES3D tessellates planar faces, circles and cylinders; re-export other curved solids as tessellated STEP or STL to keep them.`);let n=t.info.unit?` Coordinates are in ${t.info.unit} and were not rescaled.`:` The file does not name a length unit; coordinates were used as written.`;d.push(`STEP with ${t.info.triangles.toLocaleString(`en-US`)} triangles in ${t.info.meshes} mesh${t.info.meshes===1?``:`es`}${l.up===`z`?`; turned from Z-up to Y-up`:``}.${n}`),p=f(t,!1);break}case`gltf`:case`glb`:{let e=Object.fromEntries(i.map(e=>[e.name,e.bytes])),t=a===`glb`?Wu(r.bytes):Gu(bv(r.bytes),e);t.skipped.textures&&u.push(`Textures are not converted (${t.skipped.textures} textured material${t.skipped.textures===1?``:`s`}); the materials keep their base colors.`),t.skipped.points&&u.push(`${t.skipped.points} point cloud primitive${t.skipped.points===1?` was`:`s were`} skipped.`);let n=t.scene.geometries.filter(e=>e.kind===`lines`).length;n&&u.push(`${n} line primitive${n===1?` was`:`s were`} skipped (ES3D meshes hold triangles).`),((t.json.skins||[]).length||(t.json.animations||[]).length)&&u.push(`Skins and animations are not converted; the model is shown in its rest pose.`),t.json.extensionsRequired&&t.json.extensionsRequired.length&&u.push(`The file requires extensions that are not supported: ${t.json.extensionsRequired.join(`, `)}.`),p=f(t,(t.json.meshes||[]).some(e=>e.primitives.some(e=>e.attributes&&e.attributes.NORMAL!==void 0)));break}case`x3dv`:case`x3d`:case`usda`:{let e=a===`usda`?lg(bv(r.bytes)):yh(bv(r.bytes));p=e.text,d.push(...e.notes);break}case`usdc`:case`usdz`:throw Error(`USDC and USDZ are not read here. This tool reads and writes USDA text; convert a crate with usdcat if you have the USD tools.`);case`scad`:{let e=Bg(bv(r.bytes),{files:i});p=e.text,d.push(...e.notes);break}}return{kind:a,name:r.name,title:o,text:p,warnings:u,notes:d}}function Tv(e){let t=ir(e);if(!t.ok)throw Error(Ev(t.diagnostics,t.lineIndex));return t}function Ev(e,t){let n=e.filter(e=>e.severity===`error`),r=n.slice(0,3).map(e=>e.format(t)).join(`
|
|
533
|
+
|
|
534
|
+
`);return`The ES3D document has ${n.length} error${n.length===1?``:`s`}:\n\n${r}${n.length>3?`\n\n… and ${n.length-3} more`:``}`}function Dv(e,t,{baseName:n=`scene`,lod:r=0,compiled:i=null,instancing:a=!0,structure:o=`keep`}={}){let s=vv[t];if(!s)throw Error(`Unknown output format ${t}.`);let c=n+s.ext,l=e=>({files:[{name:c,data:e,mime:s.mime}]});switch(t){case`es3d`:return l(Pr(Tv(e),{syntax:`xml`,pretty:!0,comments:!0}));case`es3d-min`:return l(Pr(Tv(e),{syntax:`xml`,pretty:!1}));case`es3d-compact`:return l(Pr(Tv(e),{syntax:`compact`,pretty:!0,comments:!0}));default:{let u=i||ms(e);if(!u.ok)throw Error(Ev(u.diagnostics,u.doc&&u.doc.lineIndex));let d=(e,t)=>u.cache.mesh(e,Math.min(t,e.lods-1));if(t===`x3dv`||t===`usda`||t===`scad`||t===`js`){let e=Um(u,d,{lod:r,structure:o===`flatten`?`flatten`:`keep`});if(e.meshTriangles>gv)throw Error(`At this level of detail the scene has ${e.meshTriangles.toLocaleString(`en-US`)} triangles, too many for this file (limit ${gv.toLocaleString(`en-US`)}). Choose a coarser detail.`);let n=t===`x3dv`?mh(e):t===`usda`?rg(e):t===`scad`?Ng(e):sv(e);return{...l(n.text),notes:n.notes}}if(t===`glb`)return l(ju(u.scene,d,{lod:r,instancing:a}));if(t===`obj`){let e=0;for(let t of mu(u.scene)){let n=d(u.scene.geometries[u.scene.geom[t]],r);n.kind===`triangles`&&(e+=n.primitiveCount)}if(e>gv)throw Error(`At this level of detail the scene has ${e.toLocaleString(`en-US`)} triangles, too many for an OBJ file (limit ${gv.toLocaleString(`en-US`)}). Choose a coarser detail, or glTF, which stores repeated shapes once.`)}if(t===`stl`){let e=ad(u.scene,d,{lod:r,name:n,maxTriangles:gv});return{...l(e.data),triangles:e.triangles}}if(t===`step`){let e=gd(u.scene,d,{lod:r,name:n,maxTriangles:gv});return{...l(e.data),triangles:e.triangles}}let f=Ju(u.scene,d,{lod:r,name:n});return{files:[{name:c,data:f.obj,mime:s.mime},{name:`${n}.mtl`,data:f.mtl,mime:`text/plain`}],triangles:f.triangles}}}}var Ov=[`transform`,`position`,`rotation`,`scale`],kv=e=>H(e,6);function Av(e,t,n=1e-12){if(e===t)return!0;if(typeof e==`number`&&typeof t==`number`)return Math.abs(e-t)<=n;if(e&&t&&typeof e==`object`&&typeof t==`object`&&e.length!==void 0&&t.length!==void 0){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!Av(e[r],t[r],n))return!1;return!0}return!1}function jv(r){let i=new n(r.name);i.orig=r,i.values=r.values,i.attrIndex=null;for(let t of r.attrs)i.attrs.push(new e(t.name,t.value));i.text=r.text;for(let e of r.children)e.type===`element`?i.appendChild(jv(e)):i.appendChild(new t(e.text));return i.selfClosing=i.children.length===0,i}function Mv(e,t){let n=Se(e.name);if(!n||n.attrs[t.name])return t.name;for(let[e,r]of Object.entries(n.attrs))if(r.alias===t.name)return e;return t.name}function Nv(e){return e.children.filter(e=>e.type===`element`)}function Pv(e,t,n=null){t(e,n);for(let n of Nv(e))Pv(n,t,e)}function Fv(e,t){let n=[e.name],r=[];for(let n of e.attrs){let i=Mv(e,n);i!==`id`&&i!==`name`&&(t&&Ov.includes(i)||r.push(`${i}=${n.value.trim()}`))}r.sort(),n.push(r.join(`&`)),e.text&&n.push(`"`+e.text.trim());let i=Nv(e).map(e=>Fv(e,!1));return`${n.join(`|`)}(${i.join(`,`)})`}function Iv(e){let t=t=>{let n=e.attrs.find(n=>Mv(e,n)===t);return n?n.value:void 0},n=(e,t,n)=>{if(e===void 0)return n;let r=e.split(/[\s,]+/).filter(Boolean).map(Number);return r.length===1&&t===3?[r[0],r[0],r[0]]:r},r=bt(L(),n(t(`position`),3,[0,0,0]),n(t(`rotation`),3,[0,0,0]),n(t(`scale`),3,[1,1,1])),i=t(`transform`);if(i!==void 0){let e=ir(`<es3d version="1"><group transform="${i.replace(/"/g,`"`)}"/></es3d>`).root.children.find(e=>e.type===`element`);e&&e.values&&e.values.transform&&R(r,e.values.transform.matrix,r)}return r}function Lv(t,n){t.attrs=t.attrs.filter(e=>!Ov.includes(Mv(t,e)));let r=Vt(n);if(!r)t.attrs.push(new e(`transform`,`matrix(${Array.from(n,kv).join(`,`)})`));else if(r.translation.some(e=>Math.abs(e)>1e-9)&&t.attrs.push(new e(`position`,r.translation.map(kv).join(`,`))),r.rotation.some(e=>Math.abs(e)>1e-9)&&t.attrs.push(new e(`rotation`,r.rotation.map(kv).join(`,`))),r.scale.some(e=>Math.abs(e-1)>1e-9)){let[n,i,a]=r.scale;t.attrs.push(new e(`scale`,Math.abs(n-i)<1e-9&&Math.abs(i-a)<1e-9?kv(n):r.scale.map(kv).join(`,`)))}}function Rv(e){let t=Vt(e);if(!t)return`matrix(${Array.from(e,kv).join(`,`)})`;let n=[];if(t.translation.some(e=>Math.abs(e)>1e-9)&&n.push(`translate(${t.translation.map(kv).join(`,`)})`),t.rotation.some(e=>Math.abs(e)>1e-9)&&n.push(`rotate(${t.rotation.map(kv).join(`,`)})`),t.scale.some(e=>Math.abs(e-1)>1e-9)){let[e,r,i]=t.scale;n.push(Math.abs(e-r)<1e-9&&Math.abs(r-i)<1e-9?`scale(${kv(e)})`:`scale(${t.scale.map(kv).join(`,`)})`)}return n.join(` `)||`translate(0,0,0)`}function zv(e,t){let n=0;Pv(e,e=>{let t=Se(e.name);t&&e.values&&(e.attrs=e.attrs.filter(r=>{let i=Mv(e,r),a=t.attrs[i];if(!a||a.default===void 0||a.required)return!0;let o=e.values[i];return o===void 0||!Av(o,a.default)||(n++,!1)}))}),n&&t.push({pass:`stripDefaults`,detail:`removed ${n} attribute${n===1?``:`s`} equal to the default`})}function Bv(e){return e.replace(/^#/,``)}function Vv(e,t){return e.replace(/[^\s,]+/g,e=>{let n=Bv(e);return t.has(n)?(e.startsWith(`#`)?`#`:``)+t.get(n):e})}function Hv(e,t,n){Pv(e,e=>{for(let r of e.attrs){let i=Mv(e,r),a=Ce(e.name,i);if(a&&a.type===`ref`&&n.includes(a.ref)){let e=Bv(r.value.trim());t.has(e)&&(r.value=t.get(e))}else a&&a.type===`idlist`&&n.includes(a.ref)?r.value=r.value.split(/[\s,]+/).filter(Boolean).map(e=>t.get(Bv(e))||e).join(`,`):!a&&e.name.startsWith(`x-`)&&(r.value=Vv(r.value,t))}})}function Uv(e){let t=e.parent,n=t.children.indexOf(e);n>=0&&t.children.splice(n,1)}function Wv(e,t){let n=new Map,r=new Map,i=[];if(Pv(e,e=>{if(e.name!==`material`||!e.values||e.values.id===void 0)return;let t=io(ao(e.orig||e)),a=n.get(t);a?(r.set(e.values.id,a),i.push(e)):n.set(t,e.values.id)}),r.size){Hv(e,r,[`material`]);for(let e of i)Uv(e);t.push({pass:`dedupeMaterials`,detail:`merged ${r.size} duplicate material${r.size===1?``:`s`}`})}}function Gv(e){let t=new Set,n=Xv(e);return Pv(e,e=>{for(let r of e.attrs){let i=Ce(e.name,Mv(e,r));if(i){if(i.type===`ref`)t.add(Bv(r.value.trim()));else if(i.type===`idlist`)for(let e of r.value.split(/[\s,]+/))e&&t.add(Bv(e))}else if(e.name.startsWith(`x-`))for(let e of r.value.split(/[\s,]+/)){let r=Bv(e);r&&n.has(r)&&t.add(r)}}}),t}function Kv(e,t){let n=0;for(;;){let t=Gv(e),r=[];if(Pv(e,(e,n)=>{if(!n)return;let i=e.attrs.find(t=>Mv(e,t)===`id`);n.name!==`defs`&&e.name!==`material`||i&&t.has(i.value.trim())||r.push(e)}),!r.length)break;for(let e of r)Uv(e);n+=r.length}for(let t of Nv(e).filter(e=>e.name===`defs`&&!Nv(e).length))Uv(t);n&&t.push({pass:`removeUnused`,detail:`removed ${n} unreferenced definition${n===1?``:`s`}`})}function qv(e,t){let n=0,r=e=>{for(let t of Nv(e))r(t);if(e.name!==`group`||!e.parent)return;let t=Nv(e),i=e.attrs.filter(t=>Mv(e,t)!==`name`);if(!t.length&&!i.length)Uv(e),n++;else if(t.length===1&&!i.length&&!e.children.some(e=>e.type===`comment`)){let r=e.parent,i=r.children.indexOf(e);t[0].parent=r,r.children.splice(i,1,t[0]),n++}};r(e),n&&t.push({pass:`collapseGroups`,detail:`collapsed ${n} redundant group${n===1?``:`s`}`})}function Jv(e){let t=[e];return Pv(e,n=>{n!==e&&[`scene`,`group`,`repeat`,`scatter`,`lod`].includes(n.name)&&t.push(n)}),t.filter(e=>{for(let t=e;t;t=t.parent)if(t.name===`defs`)return!1;return!0})}function Yv(e){let t=Nv(e).find(e=>e.name===`defs`);if(!t){t=s(`defs`),t.parent=e;let n=0;for(;n<e.children.length&&e.children[n].type===`element`&&[`title`,`desc`].includes(e.children[n].name);)n++;e.children.splice(n,0,t),e.selfClosing=!1}return t}function Xv(e){let t=new Set;return Pv(e,e=>{let n=e.attrs.find(t=>Mv(e,t)===`id`);n&&t.add(n.value.trim())}),t}function Zv(e,t){let n=1;for(;e.has(`${t}${n}`);)n++;let r=`${t}${n}`;return e.add(r),r}function Qv(t,i){let a=new Map;for(let e of Jv(t))for(let t of Nv(e)){if(![`group`,`box`,`sphere`,`cylinder`,`cone`,`capsule`,`torus`,`extrude`,`revolve`,`sweep`,`gear`,`mesh`,`path`,`polygon`].includes(t.name)||t.attrs.some(e=>Mv(t,e)===`id`))continue;let e=Fv(t,!0),n=a.get(e);n||a.set(e,n=[]),n.push(t)}let o=Xv(t),s=0,c=0;for(let[,i]of a){if(i.length<2)continue;let a=i[0],l=jv(a.orig||a);l.attrs=l.attrs.filter(e=>!Ov.includes(Mv(l,e))&&Mv(l,e)!==`name`);let u=Pr(new r({root:l,syntax:`xml`}),{pretty:!1}).length;if((i.length-1)*u<=i.length*18)continue;let d=Zv(o,a.name===`group`?`part`:a.name);l.attrs.unshift(new e(`id`,d)),Yv(t).appendChild(l);for(let t of i){let r=new n(`use`);r.attrs.push(new e(`ref`,d));for(let n of t.attrs){let i=Mv(t,n);(Ov.includes(i)||i===`name`)&&r.attrs.push(new e(i,n.value))}let i=t.parent,a=i.children.indexOf(t);r.parent=i,i.children.splice(a,1,r),c++}s++}s&&i.push({pass:`extractRepeated`,detail:`moved ${s} repeated subtree${s===1?``:`s`} into <defs> (${c} <use> elements)`})}function $v(t,r){let i=0,a=0;for(let r of Jv(t)){let t=r.children,o=0;for(;o<t.length;){let s=t[o];if(s.type!==`element`||s.name===`animate`||s.attrs.some(e=>Mv(s,e)===`id`)){o++;continue}let c=Fv(s,!0),l=o+1;for(;l<t.length&&t[l].type===`element`&&!t[l].attrs.some(e=>Mv(t[l],e)===`id`)&&Fv(t[l],!0)===c;)l++;let u=t.slice(o,l);if(u.length>=3){let s=u.map(Iv),c=xt(L(),s[0]),l=c?R(L(),s[1],c):null,d=!!l,f=L();for(let e=2;d&&e<s.length;e++)R(f,l,s[e-1]),At(f,s[e],1e-6)||(d=!1);if(d&&!dt(l,1e-12)){let s=new n(`repeat`);s.attrs.push(new e(`count`,String(u.length)),new e(`step`,Rv(l)));let c=u[0];s.appendChild(c),s.parent=r,t.splice(o,u.length,s),i++,a+=u.length,o++;continue}}o=l}}i&&r.push({pass:`detectPatterns`,detail:`replaced ${a} elements by ${i} <repeat> pattern${i===1?``:`s`}`})}function ey(t,n){let r=0;Pv(t,t=>{if(t.name!==`mesh`||!t.values||!t.values.positions)return;let n=t.values;if(n.normals||n.uvs)return;let i=n.positions,a=i.length/3,o=n.indices||Uint32Array.from({length:a},(e,t)=>t),s=new Map,c=new Uint32Array(a),l=[];for(let e=0;e<a;e++){let t=`${i[e*3]},${i[e*3+1]},${i[e*3+2]}`,n=s.get(t);n===void 0&&(n=l.length/3,s.set(t,n),l.push(i[e*3],i[e*3+1],i[e*3+2])),c[e]=n}if(l.length===i.length&&n.indices)return;r+=a-l.length/3;let u=(n,r)=>{let i=t.attrs.find(e=>Mv(t,e)===n);i?i.value=r:t.attrs.push(new e(n,r))};u(`positions`,dr(l,{sep:` `})),u(`indices`,Array.from(o,e=>c[e]).join(` `))}),r&&n.push({pass:`weldMeshes`,detail:`welded ${r} duplicate mesh vertices`})}function ty(e,t){let n=0;Pv(e,e=>{for(let t of e.attrs){let r=Mv(e,t),i=Ce(e.name,r);if(!i||i.type!==`path2d`||!e.values||!e.values[r])continue;let a=hr(e.values[r].segments,{minify:!0});a.length<t.value.length&&(t.value=a,n++)}}),n&&t.push({pass:`minifyPaths`,detail:`rewrote ${n} path${n===1?``:`s`} with shorter commands`})}var ny={stripDefaults:!0,dedupeMaterials:!0,extractRepeated:!0,detectPatterns:!0,collapseGroups:!0,weldMeshes:!0,minifyPaths:!0,removeUnused:!0};function ry(e,t={}){if(!e.ok)throw Error(`Cannot optimize a document with errors.`);let n={...ny,...t},i=[],a=jv(e.root);n.stripDefaults&&zv(a,i),n.minifyPaths&&ty(a,i),n.weldMeshes&&ey(a,i),n.dedupeMaterials&&Wv(a,i),n.detectPatterns&&$v(a,i),n.extractRepeated&&Qv(a,i),n.collapseGroups&&qv(a,i),n.removeUnused&&Kv(a,i);let o=Pr(new r({root:a,syntax:e.syntax,leading:e.leading,trailing:e.trailing}),{syntax:e.syntax===`compact`?`compact`:`xml`,pretty:!0}),s=ir(o);if(!s.ok)throw Error(`Optimizer produced an invalid document: ${s.errors[0].message}`);return{doc:s,report:i,text:o}}function iy(t){let i=jv(t.root),a=t=>{for(let e of Nv(t))a(e);if(t.name!==`repeat`&&t.name!==`scatter`)return;for(let e=t.parent;e;e=e.parent)if(e.name===`defs`)return;let r=t.orig||t,i=new n(`group`);for(let n of t.attrs){let r=Mv(t,n);(Ov.includes(r)||r===`material`||r===`color`||r===`visible`)&&i.attrs.push(new e(r,n.value))}let s=Nv(t).filter(e=>e.name!==`animate`),c=Nv(t).filter(e=>e.name===`animate`),l=(t,r)=>{for(let a of s){let s=o(a),c=a.attrs.some(e=>Ov.includes(Mv(a,e))),l=a.attrs.some(e=>[`material`,`color`].includes(Mv(a,e))),u=s;(c||r&&l)&&(u=new n(`group`),u.appendChild(s)),Lv(u,t),r&&u.attrs.push(new e(`material`,r)),i.appendChild(u)}};if(t.name===`repeat`){let e=F(r,`count`),t=r.values.step?r.values.step.matrix:Ft([]),n=L();for(let r=0;r<e;r++)l(n,null),R(n,n,t)}else{let e=r.values,t=e.grid||null,n=t?t[0]*t[1]:e.count||0,i=F(r,`spacing`),a=F(r,`jitter`),o=So(F(r,`seed`)),s=(e,t)=>e[0]+(e[1]-e[0])*t,c=new Float64Array(9);for(let r=0;r<n;r++){for(let e=0;e<9;e++)c[e]=o();let n=[0,0,0];if(t){let e=r%t[0],o=Math.floor(r/t[0]);n[0]=(e-(t[0]-1)/2)*i[0]+(c[0]-.5)*a*i[0],n[2]=(o-(t[1]-1)/2)*i[1]+(c[1]-.5)*a*i[1]}else if(e.radius){let t=e.radius*Math.sqrt(c[0]),r=c[1]*Math.PI*2;n[0]=t*st(r),n[2]=t*ot(r)}else n[0]=(c[0]-.5)*e.area[0],n[2]=(c[1]-.5)*e.area[1];let u=[0,0,0];if(e.randomRotation)for(let t=0;t<3;t++)u[t]=s(e.randomRotation.ranges[t],c[2+t]);let d=[1,1,1];if(e.randomScale){let t=e.randomScale.ranges;d=e.randomScale.uniform?[s(t[0],c[5]),s(t[0],c[5]),s(t[0],c[5])]:[s(t[0],c[5]),s(t[1],c[6]),s(t[2],c[7])]}let f=null;e.randomMaterial&&(f=e.randomMaterial[Math.min(e.randomMaterial.length-1,Math.floor(c[8]*e.randomMaterial.length))]),l(bt(L(),n,u,d),f)}}for(let e of c)i.appendChild(e);let u=t.parent,d=u.children.indexOf(t);i.parent=u,u.children.splice(d,1,i)};return a(i),Pr(new r({root:i,syntax:`xml`}),{pretty:!0})}export{e as Attr,yl as Camera,t as Comment,u as Diagnostic,r as Document,ve as ELEMENTS,d as ES3DError,n as Element,wo as FLAG_MIRRORED,To as FLAG_NO_COLLIDE,Os as GEOMETRY_REVISION,us as GeometryCache,_v as INPUT_KINDS,vv as OUTPUT_FORMATS,bl as OrbitControls,Eo as RenderScene,_l as Renderer,Ir as SERIALIZE_PRESETS,Sl as ScrollTimeline,nc as ancestorNames,ac as applyLimits,is as applyLocalMatrices,as as applyLocalMatrix,Ce as attrSpec,ms as compile,cc as constrainCamera,vl as createRenderer,lu as createStage,xv as detectKind,nr as detectSyntax,Se as elementSpec,st as es3dCos,ot as es3dSin,iy as expandProcedural,Dv as exportFormat,ju as exportGLB,Ju as exportOBJ,Ng as exportOpenSCAD,gd as exportSTEP,ad as exportSTL,sv as exportThree,rg as exportUSD,mh as exportX3D,sr as formatDiagnostics,hs as generateGeometry,Fs as geometryKey,Wu as glbToScene,Gu as gltfToScene,s as h,wv as importFiles,Bg as importOpenSCAD,lg as importUSD,yh as importX3D,qs as indexedDBStore,Iu as isGLB,pd as isSTEP,Ws as memoryStore,So as mulberry32,Qu as objToScene,Js as openGeometryStore,ry as optimize,ir as parse,Ru as parseGLB,Vu as parseGLTF,Zu as parseOBJ,md as parseSTEP,td as parseSTL,ar as parseStrict,Hs as persistGeometry,tc as pick,$s as raycast,Rs as restoreGeometry,Vs as saveGeometry,Om as sceneToMeshDocument,Pr as serialize,hd as stepToScene,id as stlToScene,Tm as svgToES3D,sc as sweepCamera,os as updateDynamic,i as walk};
|